diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2018-05-17 04:07:02 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-05-24 11:07:51 -0400 |
commit | d58c5d9a42050c93f17ba82aaff0f34a30761ac7 (patch) | |
tree | d7c2f96fa41b1dbc1ddf5ce0066fef53c658c08a /drivers/gpu/drm/amd/amdgpu | |
parent | 79953a60e4476be90fa1767fbf49a76b6a8b01ef (diff) |
drm/amdgpu: Add VCN static PG support on RV
Implement static powergating suport on VCN.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 92 |
2 files changed, 102 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h index 2fd7db891689..181e6afa9847 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | |||
@@ -45,6 +45,17 @@ | |||
45 | #define VCN_ENC_CMD_REG_WRITE 0x0000000b | 45 | #define VCN_ENC_CMD_REG_WRITE 0x0000000b |
46 | #define VCN_ENC_CMD_REG_WAIT 0x0000000c | 46 | #define VCN_ENC_CMD_REG_WAIT 0x0000000c |
47 | 47 | ||
48 | enum engine_status_constants { | ||
49 | UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON = 0x2AAAA0, | ||
50 | UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON = 0x00000002, | ||
51 | UVD_STATUS__UVD_BUSY = 0x00000004, | ||
52 | GB_ADDR_CONFIG_DEFAULT = 0x26010011, | ||
53 | UVD_STATUS__IDLE = 0x2, | ||
54 | UVD_STATUS__BUSY = 0x5, | ||
55 | UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF = 0x1, | ||
56 | UVD_STATUS__RBC_BUSY = 0x1, | ||
57 | }; | ||
58 | |||
48 | struct amdgpu_vcn { | 59 | struct amdgpu_vcn { |
49 | struct amdgpu_bo *vcpu_bo; | 60 | struct amdgpu_bo *vcpu_bo; |
50 | void *cpu_addr; | 61 | void *cpu_addr; |
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 7a366418d5f4..dcb60ee0d9e2 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |||
@@ -480,6 +480,94 @@ static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev) | |||
480 | WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data); | 480 | WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data); |
481 | } | 481 | } |
482 | 482 | ||
483 | static void vcn_1_0_disable_static_power_gating(struct amdgpu_device *adev) | ||
484 | { | ||
485 | uint32_t data = 0; | ||
486 | int ret; | ||
487 | |||
488 | if (adev->pg_flags & AMD_PG_SUPPORT_VCN) { | ||
489 | data = (1 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT | ||
490 | | 1 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT | ||
491 | | 2 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT | ||
492 | | 2 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT | ||
493 | | 2 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT | ||
494 | | 2 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT | ||
495 | | 2 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT | ||
496 | | 2 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT | ||
497 | | 2 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT | ||
498 | | 2 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT | ||
499 | | 2 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT); | ||
500 | |||
501 | WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data); | ||
502 | SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_PGFSM_STATUS, UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON, 0xFFFFFF, ret); | ||
503 | } else { | ||
504 | data = (1 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT | ||
505 | | 1 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT | ||
506 | | 1 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT | ||
507 | | 1 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT | ||
508 | | 1 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT | ||
509 | | 1 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT | ||
510 | | 1 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT | ||
511 | | 1 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT | ||
512 | | 1 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT | ||
513 | | 1 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT | ||
514 | | 1 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT); | ||
515 | WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data); | ||
516 | SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_PGFSM_STATUS, 0, 0xFFFFFFFF, ret); | ||
517 | } | ||
518 | |||
519 | /* polling UVD_PGFSM_STATUS to confirm UVDM_PWR_STATUS , UVDU_PWR_STATUS are 0 (power on) */ | ||
520 | |||
521 | data = RREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS); | ||
522 | data &= ~0x103; | ||
523 | if (adev->pg_flags & AMD_PG_SUPPORT_VCN) | ||
524 | data |= UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON | UVD_POWER_STATUS__UVD_PG_EN_MASK; | ||
525 | |||
526 | WREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS, data); | ||
527 | } | ||
528 | |||
529 | static void vcn_1_0_enable_static_power_gating(struct amdgpu_device *adev) | ||
530 | { | ||
531 | uint32_t data = 0; | ||
532 | int ret; | ||
533 | |||
534 | if (adev->pg_flags & AMD_PG_SUPPORT_VCN) { | ||
535 | /* Before power off, this indicator has to be turned on */ | ||
536 | data = RREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS); | ||
537 | data &= ~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK; | ||
538 | data |= UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF; | ||
539 | WREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS, data); | ||
540 | |||
541 | |||
542 | data = (2 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT | ||
543 | | 2 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT | ||
544 | | 2 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT | ||
545 | | 2 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT | ||
546 | | 2 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT | ||
547 | | 2 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT | ||
548 | | 2 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT | ||
549 | | 2 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT | ||
550 | | 2 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT | ||
551 | | 2 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT | ||
552 | | 2 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT); | ||
553 | |||
554 | WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data); | ||
555 | |||
556 | data = (2 << UVD_PGFSM_STATUS__UVDM_PWR_STATUS__SHIFT | ||
557 | | 2 << UVD_PGFSM_STATUS__UVDU_PWR_STATUS__SHIFT | ||
558 | | 2 << UVD_PGFSM_STATUS__UVDF_PWR_STATUS__SHIFT | ||
559 | | 2 << UVD_PGFSM_STATUS__UVDC_PWR_STATUS__SHIFT | ||
560 | | 2 << UVD_PGFSM_STATUS__UVDB_PWR_STATUS__SHIFT | ||
561 | | 2 << UVD_PGFSM_STATUS__UVDIL_PWR_STATUS__SHIFT | ||
562 | | 2 << UVD_PGFSM_STATUS__UVDIR_PWR_STATUS__SHIFT | ||
563 | | 2 << UVD_PGFSM_STATUS__UVDTD_PWR_STATUS__SHIFT | ||
564 | | 2 << UVD_PGFSM_STATUS__UVDTE_PWR_STATUS__SHIFT | ||
565 | | 2 << UVD_PGFSM_STATUS__UVDE_PWR_STATUS__SHIFT | ||
566 | | 2 << UVD_PGFSM_STATUS__UVDW_PWR_STATUS__SHIFT); | ||
567 | SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_PGFSM_STATUS, data, 0xFFFFFFFF, ret); | ||
568 | } | ||
569 | } | ||
570 | |||
483 | /** | 571 | /** |
484 | * vcn_v1_0_start - start VCN block | 572 | * vcn_v1_0_start - start VCN block |
485 | * | 573 | * |
@@ -499,6 +587,7 @@ static int vcn_v1_0_start(struct amdgpu_device *adev) | |||
499 | 587 | ||
500 | vcn_v1_0_mc_resume(adev); | 588 | vcn_v1_0_mc_resume(adev); |
501 | 589 | ||
590 | vcn_1_0_disable_static_power_gating(adev); | ||
502 | /* disable clock gating */ | 591 | /* disable clock gating */ |
503 | vcn_v1_0_disable_clock_gating(adev); | 592 | vcn_v1_0_disable_clock_gating(adev); |
504 | 593 | ||
@@ -681,8 +770,9 @@ static int vcn_v1_0_stop(struct amdgpu_device *adev) | |||
681 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); | 770 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); |
682 | 771 | ||
683 | /* enable clock gating */ | 772 | /* enable clock gating */ |
684 | vcn_v1_0_enable_clock_gating(adev); | ||
685 | 773 | ||
774 | vcn_v1_0_enable_clock_gating(adev); | ||
775 | vcn_1_0_enable_static_power_gating(adev); | ||
686 | return 0; | 776 | return 0; |
687 | } | 777 | } |
688 | 778 | ||