aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeo Liu <leo.liu@amd.com>2019-04-16 11:32:22 -0400
committerAlex Deucher <alexander.deucher@amd.com>2019-07-18 15:18:05 -0400
commite87d5a7a23c7020cf0770726ae34e50ac66f7ced (patch)
tree89f68dbd9a2d4f614dda069f9b45bbe10692a46d
parenta4767886e5cb687ca04f5f1aaf8cbf42b3f88404 (diff)
drm/amdgpu: add JPEG2.5 HW start and stop
JPEG engine initialization and suspend sequences Signed-off-by: Leo Liu <leo.liu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
index b42f6769ae06..82c9c40e9ae4 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -530,6 +530,104 @@ static void vcn_v2_5_enable_clock_gating(struct amdgpu_device *adev)
530 WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data); 530 WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data);
531} 531}
532 532
533/**
534 * jpeg_v2_5_start - start JPEG block
535 *
536 * @adev: amdgpu_device pointer
537 *
538 * Setup and start the JPEG block
539 */
540static int jpeg_v2_5_start(struct amdgpu_device *adev)
541{
542 struct amdgpu_ring *ring = &adev->vcn.ring_jpeg;
543 uint32_t tmp;
544
545 /* disable anti hang mechanism */
546 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_POWER_STATUS), 0,
547 ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK);
548
549 /* JPEG disable CGC */
550 tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
551 tmp |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
552 tmp |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
553 tmp |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
554 WREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL, tmp);
555
556 tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE);
557 tmp &= ~(JPEG_CGC_GATE__JPEG_DEC_MASK
558 | JPEG_CGC_GATE__JPEG2_DEC_MASK
559 | JPEG_CGC_GATE__JMCIF_MASK
560 | JPEG_CGC_GATE__JRBBM_MASK);
561 WREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE, tmp);
562
563 tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
564 tmp &= ~(JPEG_CGC_CTRL__JPEG_DEC_MODE_MASK
565 | JPEG_CGC_CTRL__JPEG2_DEC_MODE_MASK
566 | JPEG_CGC_CTRL__JMCIF_MODE_MASK
567 | JPEG_CGC_CTRL__JRBBM_MODE_MASK);
568 WREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL, tmp);
569
570 /* MJPEG global tiling registers */
571 WREG32_SOC15(UVD, 0, mmJPEG_DEC_GFX8_ADDR_CONFIG,
572 adev->gfx.config.gb_addr_config);
573 WREG32_SOC15(UVD, 0, mmJPEG_DEC_GFX10_ADDR_CONFIG,
574 adev->gfx.config.gb_addr_config);
575
576 /* enable JMI channel */
577 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_JMI_CNTL), 0,
578 ~UVD_JMI_CNTL__SOFT_RESET_MASK);
579
580 /* enable System Interrupt for JRBC */
581 WREG32_P(SOC15_REG_OFFSET(VCN, 0, mmJPEG_SYS_INT_EN),
582 JPEG_SYS_INT_EN__DJRBC_MASK,
583 ~JPEG_SYS_INT_EN__DJRBC_MASK);
584
585 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0);
586 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, (0x00000001L | 0x00000002L));
587 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW,
588 lower_32_bits(ring->gpu_addr));
589 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH,
590 upper_32_bits(ring->gpu_addr));
591 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR, 0);
592 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, 0);
593 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, 0x00000002L);
594 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_SIZE, ring->ring_size / 4);
595 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
596
597 return 0;
598}
599
600/**
601 * jpeg_v2_5_stop - stop JPEG block
602 *
603 * @adev: amdgpu_device pointer
604 *
605 * stop the JPEG block
606 */
607static int jpeg_v2_5_stop(struct amdgpu_device *adev)
608{
609 uint32_t tmp;
610
611 /* reset JMI */
612 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_JMI_CNTL),
613 UVD_JMI_CNTL__SOFT_RESET_MASK,
614 ~UVD_JMI_CNTL__SOFT_RESET_MASK);
615
616 tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE);
617 tmp |= (JPEG_CGC_GATE__JPEG_DEC_MASK
618 |JPEG_CGC_GATE__JPEG2_DEC_MASK
619 |JPEG_CGC_GATE__JMCIF_MASK
620 |JPEG_CGC_GATE__JRBBM_MASK);
621 WREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE, tmp);
622
623 /* enable anti hang mechanism */
624 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_POWER_STATUS),
625 UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK,
626 ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK);
627
628 return 0;
629}
630
533static int vcn_v2_5_start(struct amdgpu_device *adev) 631static int vcn_v2_5_start(struct amdgpu_device *adev)
534{ 632{
535 struct amdgpu_ring *ring = &adev->vcn.ring_dec; 633 struct amdgpu_ring *ring = &adev->vcn.ring_dec;
@@ -688,6 +786,8 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
688 WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 786 WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
689 WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4); 787 WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4);
690 788
789 r = jpeg_v2_5_start(adev);
790
691 return r; 791 return r;
692} 792}
693 793
@@ -696,6 +796,10 @@ static int vcn_v2_5_stop(struct amdgpu_device *adev)
696 uint32_t tmp; 796 uint32_t tmp;
697 int r; 797 int r;
698 798
799 r = jpeg_v2_5_stop(adev);
800 if (r)
801 return r;
802
699 /* wait for vcn idle */ 803 /* wait for vcn idle */
700 SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_STATUS, UVD_STATUS__IDLE, 0x7, r); 804 SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_STATUS, UVD_STATUS__IDLE, 0x7, r);
701 if (r) 805 if (r)