aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2018-05-17 04:07:02 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-05-24 11:07:51 -0400
commitd58c5d9a42050c93f17ba82aaff0f34a30761ac7 (patch)
treed7c2f96fa41b1dbc1ddf5ce0066fef53c658c08a /drivers/gpu/drm/amd/amdgpu
parent79953a60e4476be90fa1767fbf49a76b6a8b01ef (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.h11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c92
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
48enum 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
48struct amdgpu_vcn { 59struct 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
483static 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
529static 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