[PATCH v2 1/7] drm/amdgpu: Per-instance init func for JPEG4_0_3
Christian König
christian.koenig at amd.com
Mon Feb 10 19:22:05 UTC 2025
Am 10.02.25 um 15:25 schrieb Sathishkumar S:
> Add helper functions to handle per-instance and per-core
> initialization and deinitialization in JPEG4_0_3.
>
> Signed-off-by: Sathishkumar S <sathishkumar.sundararaju at amd.com>
> ---
> 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..be0b3b4c8690 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);
Please double check the coding style with checkpatch.pl this here
doesn't looks so well.
Regards,
Christian.
> +
> + /* 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) {
> - 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;
> }
More information about the amd-gfx
mailing list