On 2/13/2025 8:24 AM, Sathishkumar S wrote: > Add helper functions to handle per-instance and per-core > initialization and deinitialization in JPEG4_0_3. > > Signed-off-by: Sathishkumar S <sathishkumar.sundararaju@xxxxxxx> > Acked-by: Christian König <christian.koenig@xxxxxxx> > Reviewed-by: Leo Liu <leo.liu@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 190 ++++++++++++----------- > 1 file changed, 98 insertions(+), 92 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c > index 2a97302a22d3..e355febd9b82 100644 > --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c > +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c > @@ -525,6 +525,75 @@ static void jpeg_v4_0_3_enable_clock_gating(struct amdgpu_device *adev, int inst > WREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_GATE, data); > } > > +static void jpeg_v4_0_3_start_inst(struct amdgpu_device *adev, int inst) > +{ > + int jpeg_inst = GET_INST(JPEG, inst); > + > + WREG32_SOC15(JPEG, jpeg_inst, regUVD_PGFSM_CONFIG, > + 1 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT); > + SOC15_WAIT_ON_RREG(JPEG, jpeg_inst, regUVD_PGFSM_STATUS, > + UVD_PGFSM_STATUS__UVDJ_PWR_ON << > + UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT, > + UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK); > + > + /* disable anti hang mechanism */ > + WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JPEG_POWER_STATUS), > + 0, ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); > + > + /* JPEG disable CGC */ > + jpeg_v4_0_3_disable_clock_gating(adev, inst); > + > + /* MJPEG global tiling registers */ > + WREG32_SOC15(JPEG, jpeg_inst, regJPEG_DEC_GFX8_ADDR_CONFIG, > + adev->gfx.config.gb_addr_config); > + WREG32_SOC15(JPEG, jpeg_inst, regJPEG_DEC_GFX10_ADDR_CONFIG, > + adev->gfx.config.gb_addr_config); > + > + /* enable JMI channel */ > + WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL), 0, > + ~UVD_JMI_CNTL__SOFT_RESET_MASK); > +} > + > +static void jpeg_v4_0_3_start_jrbc(struct amdgpu_ring *ring) > +{ > + struct amdgpu_device *adev = ring->adev; > + int jpeg_inst = GET_INST(JPEG, ring->me); > + int reg_offset = jpeg_v4_0_3_core_reg_offset(ring->pipe); > + > + /* enable System Interrupt for JRBC */ > + WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regJPEG_SYS_INT_EN), > + JPEG_SYS_INT_EN__DJRBC0_MASK << ring->pipe, > + ~(JPEG_SYS_INT_EN__DJRBC0_MASK << ring->pipe)); > + > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JMI0_UVD_LMI_JRBC_RB_VMID, > + reg_offset, 0); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JRBC0_UVD_JRBC_RB_CNTL, > + reg_offset, > + (0x00000001L | 0x00000002L)); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW, > + reg_offset, lower_32_bits(ring->gpu_addr)); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH, > + reg_offset, upper_32_bits(ring->gpu_addr)); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JRBC0_UVD_JRBC_RB_RPTR, > + reg_offset, 0); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JRBC0_UVD_JRBC_RB_WPTR, > + reg_offset, 0); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JRBC0_UVD_JRBC_RB_CNTL, > + reg_offset, 0x00000002L); > + WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > + regUVD_JRBC0_UVD_JRBC_RB_SIZE, > + reg_offset, ring->ring_size / 4); > + ring->wptr = RREG32_SOC15_OFFSET(JPEG, jpeg_inst, regUVD_JRBC0_UVD_JRBC_RB_WPTR, > + reg_offset); > +} > + > /** > * jpeg_v4_0_3_start - start JPEG block > * > @@ -535,84 +604,42 @@ static void jpeg_v4_0_3_enable_clock_gating(struct amdgpu_device *adev, int inst > static int jpeg_v4_0_3_start(struct amdgpu_device *adev) > { > struct amdgpu_ring *ring; > - int i, j, jpeg_inst; > + int i, j; > > for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { > - jpeg_inst = GET_INST(JPEG, i); > - > - WREG32_SOC15(JPEG, jpeg_inst, regUVD_PGFSM_CONFIG, > - 1 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT); > - SOC15_WAIT_ON_RREG( > - JPEG, jpeg_inst, regUVD_PGFSM_STATUS, > - UVD_PGFSM_STATUS__UVDJ_PWR_ON > - << UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT, > - UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK); > - > - /* disable anti hang mechanism */ > - WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, > - regUVD_JPEG_POWER_STATUS), > - 0, ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); > - > - /* JPEG disable CGC */ > - jpeg_v4_0_3_disable_clock_gating(adev, i); > - > - /* MJPEG global tiling registers */ > - WREG32_SOC15(JPEG, jpeg_inst, regJPEG_DEC_GFX8_ADDR_CONFIG, > - adev->gfx.config.gb_addr_config); > - WREG32_SOC15(JPEG, jpeg_inst, regJPEG_DEC_GFX10_ADDR_CONFIG, > - adev->gfx.config.gb_addr_config); > - > - /* enable JMI channel */ > - WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL), 0, > - ~UVD_JMI_CNTL__SOFT_RESET_MASK); > - > + jpeg_v4_0_3_start_inst(adev, i); > for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { It's better to move this inside the instance function. Instance takes care of all cores within the instance. Thanks, Lijo > - int reg_offset = jpeg_v4_0_3_core_reg_offset(j); > - > ring = &adev->jpeg.inst[i].ring_dec[j]; > - > - /* enable System Interrupt for JRBC */ > - WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, > - regJPEG_SYS_INT_EN), > - JPEG_SYS_INT_EN__DJRBC0_MASK << j, > - ~(JPEG_SYS_INT_EN__DJRBC0_MASK << j)); > - > - WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > - regUVD_JMI0_UVD_LMI_JRBC_RB_VMID, > - reg_offset, 0); > - WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > - regUVD_JRBC0_UVD_JRBC_RB_CNTL, > - reg_offset, > - (0x00000001L | 0x00000002L)); > - WREG32_SOC15_OFFSET( > - JPEG, jpeg_inst, > - regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW, > - reg_offset, lower_32_bits(ring->gpu_addr)); > - WREG32_SOC15_OFFSET( > - JPEG, jpeg_inst, > - regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH, > - reg_offset, upper_32_bits(ring->gpu_addr)); > - WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > - regUVD_JRBC0_UVD_JRBC_RB_RPTR, > - reg_offset, 0); > - WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > - regUVD_JRBC0_UVD_JRBC_RB_WPTR, > - reg_offset, 0); > - WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > - regUVD_JRBC0_UVD_JRBC_RB_CNTL, > - reg_offset, 0x00000002L); > - WREG32_SOC15_OFFSET(JPEG, jpeg_inst, > - regUVD_JRBC0_UVD_JRBC_RB_SIZE, > - reg_offset, ring->ring_size / 4); > - ring->wptr = RREG32_SOC15_OFFSET( > - JPEG, jpeg_inst, regUVD_JRBC0_UVD_JRBC_RB_WPTR, > - reg_offset); > + jpeg_v4_0_3_start_jrbc(ring); > } > } > > return 0; > } > > +static void jpeg_v4_0_3_stop_inst(struct amdgpu_device *adev, int inst) > +{ > + int jpeg_inst = GET_INST(JPEG, inst); > + /* reset JMI */ > + WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL), > + UVD_JMI_CNTL__SOFT_RESET_MASK, > + ~UVD_JMI_CNTL__SOFT_RESET_MASK); > + > + jpeg_v4_0_3_enable_clock_gating(adev, inst); > + > + /* enable anti hang mechanism */ > + WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JPEG_POWER_STATUS), > + UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK, > + ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); > + > + WREG32_SOC15(JPEG, jpeg_inst, regUVD_PGFSM_CONFIG, > + 2 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT); > + SOC15_WAIT_ON_RREG > + (JPEG, jpeg_inst, regUVD_PGFSM_STATUS, > + UVD_PGFSM_STATUS__UVDJ_PWR_OFF << UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT, > + UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK); > +} > + > /** > * jpeg_v4_0_3_stop - stop JPEG block > * > @@ -622,31 +649,10 @@ static int jpeg_v4_0_3_start(struct amdgpu_device *adev) > */ > static int jpeg_v4_0_3_stop(struct amdgpu_device *adev) > { > - int i, jpeg_inst; > + int i; > > - for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { > - jpeg_inst = GET_INST(JPEG, i); > - /* reset JMI */ > - WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL), > - UVD_JMI_CNTL__SOFT_RESET_MASK, > - ~UVD_JMI_CNTL__SOFT_RESET_MASK); > - > - jpeg_v4_0_3_enable_clock_gating(adev, i); > - > - /* enable anti hang mechanism */ > - WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, > - regUVD_JPEG_POWER_STATUS), > - UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK, > - ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); > - > - WREG32_SOC15(JPEG, jpeg_inst, regUVD_PGFSM_CONFIG, > - 2 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT); > - SOC15_WAIT_ON_RREG( > - JPEG, jpeg_inst, regUVD_PGFSM_STATUS, > - UVD_PGFSM_STATUS__UVDJ_PWR_OFF > - << UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT, > - UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK); > - } > + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) > + jpeg_v4_0_3_stop_inst(adev, i); > > return 0; > }