Skip to content

Commit cb493ae

Browse files
pldrcalexdeucher
authored andcommitted
drm/amdgpu: Per-instance init func for JPEG2_5_0
Add helper functions to handle per-instance initialization and deinitialization in JPEG2_5_0. Signed-off-by: Sathishkumar S <sathishkumar.sundararaju@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Leo Liu <leo.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 03399d0 commit cb493ae

File tree

1 file changed

+55
-47
lines changed

1 file changed

+55
-47
lines changed

drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
340378
static 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

Comments
 (0)