diff options
author | Leo Liu <leo.liu@amd.com> | 2019-04-16 11:32:22 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-07-18 15:18:05 -0400 |
commit | e87d5a7a23c7020cf0770726ae34e50ac66f7ced (patch) | |
tree | 89f68dbd9a2d4f614dda069f9b45bbe10692a46d | |
parent | a4767886e5cb687ca04f5f1aaf8cbf42b3f88404 (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.c | 104 |
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 | */ | ||
540 | static 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 | */ | ||
607 | static 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 | |||
533 | static int vcn_v2_5_start(struct amdgpu_device *adev) | 631 | static 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) |