@@ -330,6 +330,44 @@ static void jpeg_v2_5_enable_clock_gating(struct amdgpu_device *adev, int inst)
330330 WREG32_SOC15 (JPEG , inst , mmJPEG_CGC_GATE , data );
331331}
332332
333+ static void jpeg_v2_5_start_inst (struct amdgpu_device * adev , int i )
334+ {
335+ struct amdgpu_ring * ring = adev -> jpeg .inst [i ].ring_dec ;
336+ /* disable anti hang mechanism */
337+ WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JPEG_POWER_STATUS ), 0 ,
338+ ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK );
339+
340+ /* JPEG disable CGC */
341+ jpeg_v2_5_disable_clock_gating (adev , i );
342+
343+ /* MJPEG global tiling registers */
344+ WREG32_SOC15 (JPEG , i , mmJPEG_DEC_GFX8_ADDR_CONFIG ,
345+ adev -> gfx .config .gb_addr_config );
346+ WREG32_SOC15 (JPEG , i , mmJPEG_DEC_GFX10_ADDR_CONFIG ,
347+ adev -> gfx .config .gb_addr_config );
348+
349+ /* enable JMI channel */
350+ WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JMI_CNTL ), 0 ,
351+ ~UVD_JMI_CNTL__SOFT_RESET_MASK );
352+
353+ /* enable System Interrupt for JRBC */
354+ WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmJPEG_SYS_INT_EN ),
355+ JPEG_SYS_INT_EN__DJRBC_MASK ,
356+ ~JPEG_SYS_INT_EN__DJRBC_MASK );
357+
358+ WREG32_SOC15 (JPEG , i , mmUVD_LMI_JRBC_RB_VMID , 0 );
359+ WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_CNTL , (0x00000001L | 0x00000002L ));
360+ WREG32_SOC15 (JPEG , i , mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW ,
361+ lower_32_bits (ring -> gpu_addr ));
362+ WREG32_SOC15 (JPEG , i , mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH ,
363+ upper_32_bits (ring -> gpu_addr ));
364+ WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_RPTR , 0 );
365+ WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_WPTR , 0 );
366+ WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_CNTL , 0x00000002L );
367+ WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_SIZE , ring -> ring_size / 4 );
368+ ring -> wptr = RREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_WPTR );
369+ }
370+
333371/**
334372 * jpeg_v2_5_start - start JPEG block
335373 *
@@ -339,52 +377,33 @@ static void jpeg_v2_5_enable_clock_gating(struct amdgpu_device *adev, int inst)
339377 */
340378static int jpeg_v2_5_start (struct amdgpu_device * adev )
341379{
342- struct amdgpu_ring * ring ;
343380 int i ;
344381
345382 for (i = 0 ; i < adev -> jpeg .num_jpeg_inst ; ++ i ) {
346383 if (adev -> jpeg .harvest_config & (1 << i ))
347384 continue ;
385+ jpeg_v2_5_start_inst (adev , i );
348386
349- ring = adev -> jpeg .inst [i ].ring_dec ;
350- /* disable anti hang mechanism */
351- WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JPEG_POWER_STATUS ), 0 ,
352- ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK );
353-
354- /* JPEG disable CGC */
355- jpeg_v2_5_disable_clock_gating (adev , i );
356-
357- /* MJPEG global tiling registers */
358- WREG32_SOC15 (JPEG , i , mmJPEG_DEC_GFX8_ADDR_CONFIG ,
359- adev -> gfx .config .gb_addr_config );
360- WREG32_SOC15 (JPEG , i , mmJPEG_DEC_GFX10_ADDR_CONFIG ,
361- adev -> gfx .config .gb_addr_config );
362-
363- /* enable JMI channel */
364- WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JMI_CNTL ), 0 ,
365- ~UVD_JMI_CNTL__SOFT_RESET_MASK );
366-
367- /* enable System Interrupt for JRBC */
368- WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmJPEG_SYS_INT_EN ),
369- JPEG_SYS_INT_EN__DJRBC_MASK ,
370- ~JPEG_SYS_INT_EN__DJRBC_MASK );
371-
372- WREG32_SOC15 (JPEG , i , mmUVD_LMI_JRBC_RB_VMID , 0 );
373- WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_CNTL , (0x00000001L | 0x00000002L ));
374- WREG32_SOC15 (JPEG , i , mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW ,
375- lower_32_bits (ring -> gpu_addr ));
376- WREG32_SOC15 (JPEG , i , mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH ,
377- upper_32_bits (ring -> gpu_addr ));
378- WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_RPTR , 0 );
379- WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_WPTR , 0 );
380- WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_CNTL , 0x00000002L );
381- WREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_SIZE , ring -> ring_size / 4 );
382- ring -> wptr = RREG32_SOC15 (JPEG , i , mmUVD_JRBC_RB_WPTR );
383387 }
384388
385389 return 0 ;
386390}
387391
392+ static void jpeg_v2_5_stop_inst (struct amdgpu_device * adev , int i )
393+ {
394+ /* reset JMI */
395+ WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JMI_CNTL ),
396+ UVD_JMI_CNTL__SOFT_RESET_MASK ,
397+ ~UVD_JMI_CNTL__SOFT_RESET_MASK );
398+
399+ jpeg_v2_5_enable_clock_gating (adev , i );
400+
401+ /* enable anti hang mechanism */
402+ WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JPEG_POWER_STATUS ),
403+ UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK ,
404+ ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK );
405+ }
406+
388407/**
389408 * jpeg_v2_5_stop - stop JPEG block
390409 *
@@ -399,18 +418,7 @@ static int jpeg_v2_5_stop(struct amdgpu_device *adev)
399418 for (i = 0 ; i < adev -> jpeg .num_jpeg_inst ; ++ i ) {
400419 if (adev -> jpeg .harvest_config & (1 << i ))
401420 continue ;
402-
403- /* reset JMI */
404- WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JMI_CNTL ),
405- UVD_JMI_CNTL__SOFT_RESET_MASK ,
406- ~UVD_JMI_CNTL__SOFT_RESET_MASK );
407-
408- jpeg_v2_5_enable_clock_gating (adev , i );
409-
410- /* enable anti hang mechanism */
411- WREG32_P (SOC15_REG_OFFSET (JPEG , i , mmUVD_JPEG_POWER_STATUS ),
412- UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK ,
413- ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK );
421+ jpeg_v2_5_stop_inst (adev , i );
414422 }
415423
416424 return 0 ;
0 commit comments