* [PATCH 1/6] drm/amdgpu: skip CG for VCN when late_init/fini
@ 2018-05-16 12:52 Rex Zhu
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
0 siblings, 1 reply; 12+ messages in thread
From: Rex Zhu @ 2018-05-16 12:52 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index fcd4bb2..25bee46 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1718,6 +1718,7 @@ static int amdgpu_device_ip_late_set_cg_state(struct amdgpu_device *adev)
/* skip CG for VCE/UVD, it's handled specially */
if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
+ adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
adev->ip_blocks[i].version->funcs->set_clockgating_state) {
/* enable clockgating to save power */
r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
@@ -1817,6 +1818,7 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
+ adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
adev->ip_blocks[i].version->funcs->set_clockgating_state) {
/* ungate blocks before hw fini so that we can shutdown the blocks safely */
r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/6] drm/amd/pp: Add smu support for vcn cg/pg on RV
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
@ 2018-05-16 12:52 ` Rex Zhu
[not found] ` <1526475182-32156-2-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:52 ` [PATCH 3/6] drm/amdgpu: Add CG/PG flags for VCN Rex Zhu
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Rex Zhu @ 2018-05-16 12:52 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c | 25 ++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
index 32b1524..436326b 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
@@ -1146,6 +1146,29 @@ static int smu10_set_mmhub_powergating_by_smu(struct pp_hwmgr *hwmgr)
return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PowerGateMmHub);
}
+static void smu10_powergate_vcn(struct pp_hwmgr *hwmgr, bool bgate)
+{
+ if (bgate) {
+ amdgpu_device_ip_set_powergating_state(hwmgr->adev,
+ AMD_IP_BLOCK_TYPE_VCN,
+ AMD_PG_STATE_GATE);
+ amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
+ AMD_IP_BLOCK_TYPE_VCN,
+ AMD_CG_STATE_GATE);
+ smum_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_PowerDownVcn, 0);
+ } else {
+ smum_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_PowerUpVcn, 0);
+ amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
+ AMD_IP_BLOCK_TYPE_VCN,
+ AMD_CG_STATE_UNGATE);
+ amdgpu_device_ip_set_powergating_state(hwmgr->adev,
+ AMD_IP_BLOCK_TYPE_VCN,
+ AMD_PG_STATE_UNGATE);
+ }
+}
+
static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
.backend_init = smu10_hwmgr_backend_init,
.backend_fini = smu10_hwmgr_backend_fini,
@@ -1154,7 +1177,7 @@ static int smu10_set_mmhub_powergating_by_smu(struct pp_hwmgr *hwmgr)
.force_dpm_level = smu10_dpm_force_dpm_level,
.get_power_state_size = smu10_get_power_state_size,
.powerdown_uvd = NULL,
- .powergate_uvd = NULL,
+ .powergate_uvd = smu10_powergate_vcn,
.powergate_vce = NULL,
.get_mclk = smu10_dpm_get_mclk,
.get_sclk = smu10_dpm_get_sclk,
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/6] drm/amdgpu: Add CG/PG flags for VCN
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:52 ` [PATCH 2/6] drm/amd/pp: Add smu support for vcn cg/pg on RV Rex Zhu
@ 2018-05-16 12:52 ` Rex Zhu
[not found] ` <1526475182-32156-3-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:53 ` [PATCH 4/6] drm/amdgpu: Add runtime vcn cg/pg enablement Rex Zhu
` (3 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Rex Zhu @ 2018-05-16 12:52 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/include/amd_shared.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
index 33de330..b178176 100644
--- a/drivers/gpu/drm/amd/include/amd_shared.h
+++ b/drivers/gpu/drm/amd/include/amd_shared.h
@@ -92,7 +92,7 @@ enum amd_powergating_state {
#define AMD_CG_SUPPORT_GFX_3D_CGLS (1 << 21)
#define AMD_CG_SUPPORT_DRM_MGCG (1 << 22)
#define AMD_CG_SUPPORT_DF_MGCG (1 << 23)
-
+#define AMD_CG_SUPPORT_VCN_MGCG (1 << 24)
/* PG flags */
#define AMD_PG_SUPPORT_GFX_PG (1 << 0)
#define AMD_PG_SUPPORT_GFX_SMG (1 << 1)
@@ -108,6 +108,7 @@ enum amd_powergating_state {
#define AMD_PG_SUPPORT_GFX_QUICK_MG (1 << 11)
#define AMD_PG_SUPPORT_GFX_PIPELINE (1 << 12)
#define AMD_PG_SUPPORT_MMHUB (1 << 13)
+#define AMD_PG_SUPPORT_VCN (1 << 14)
enum PP_FEATURE_MASK {
PP_SCLK_DPM_MASK = 0x1,
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/6] drm/amdgpu: Add runtime vcn cg/pg enablement
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:52 ` [PATCH 2/6] drm/amd/pp: Add smu support for vcn cg/pg on RV Rex Zhu
2018-05-16 12:52 ` [PATCH 3/6] drm/amdgpu: Add CG/PG flags for VCN Rex Zhu
@ 2018-05-16 12:53 ` Rex Zhu
[not found] ` <1526475182-32156-4-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:53 ` [PATCH 5/6] drm/amdgpu: Enable static cg for vcn on RV Rex Zhu
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Rex Zhu @ 2018-05-16 12:53 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 58e4953..8b0d491 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -208,9 +208,13 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
if (fences == 0) {
if (adev->pm.dpm_enabled) {
- /* might be used when with pg/cg
amdgpu_dpm_enable_uvd(adev, false);
- */
+ } else {
+ /* shutdown the UVD block */
+ amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
+ AMD_PG_STATE_GATE);
+ amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
+ AMD_CG_STATE_GATE);
}
} else {
schedule_delayed_work(&adev->vcn.idle_work, VCN_IDLE_TIMEOUT);
@@ -223,9 +227,14 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
bool set_clocks = !cancel_delayed_work_sync(&adev->vcn.idle_work);
if (set_clocks && adev->pm.dpm_enabled) {
- /* might be used when with pg/cg
- amdgpu_dpm_enable_uvd(adev, true);
- */
+ if (adev->pm.dpm_enabled) {
+ amdgpu_dpm_enable_uvd(adev, true);
+ } else {
+ amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
+ AMD_CG_STATE_UNGATE);
+ amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
+ AMD_PG_STATE_UNGATE);
+ }
}
}
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/6] drm/amdgpu: Enable static cg for vcn on RV
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
` (2 preceding siblings ...)
2018-05-16 12:53 ` [PATCH 4/6] drm/amdgpu: Add runtime vcn cg/pg enablement Rex Zhu
@ 2018-05-16 12:53 ` Rex Zhu
[not found] ` <1526475182-32156-5-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:53 ` [PATCH 6/6] drm/amdgpu: Enable static pg feature " Rex Zhu
2018-05-16 15:54 ` [PATCH 1/6] drm/amdgpu: skip CG for VCN when late_init/fini Alex Deucher
5 siblings, 1 reply; 12+ messages in thread
From: Rex Zhu @ 2018-05-16 12:53 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/soc15.c | 3 ++-
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 16 ++++++++--------
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
index 8ccbcf9..485cb43 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
@@ -711,7 +711,8 @@ static int soc15_common_early_init(void *handle)
AMD_CG_SUPPORT_MC_MGCG |
AMD_CG_SUPPORT_MC_LS |
AMD_CG_SUPPORT_SDMA_MGCG |
- AMD_CG_SUPPORT_SDMA_LS;
+ AMD_CG_SUPPORT_SDMA_LS |
+ AMD_CG_SUPPORT_VCN_MGCG;
adev->pg_flags = AMD_PG_SUPPORT_SDMA;
if (adev->powerplay.pp_feature & PP_GFXOFF_MASK)
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 0501746b..9e0a2b1 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -288,14 +288,14 @@ static void vcn_v1_0_mc_resume(struct amdgpu_device *adev)
*
* Disable clock gating for VCN block
*/
-static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev, bool sw)
+static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev)
{
uint32_t data;
/* JPEG disable CGC */
data = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
- if (sw)
+ if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
else
data &= ~JPEG_CGC_CTRL__DYN_CLOCK_MODE_MASK;
@@ -310,7 +310,7 @@ static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev, bool sw)
/* UVD disable CGC */
data = RREG32_SOC15(VCN, 0, mmUVD_CGC_CTRL);
- if (sw)
+ if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
else
data &= ~ UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
@@ -415,13 +415,13 @@ static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev, bool sw)
*
* Enable clock gating for VCN block
*/
-static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev, bool sw)
+static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev)
{
uint32_t data = 0;
/* enable JPEG CGC */
data = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
- if (sw)
+ if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
else
data |= 0 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
@@ -435,7 +435,7 @@ static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev, bool sw)
/* enable UVD CGC */
data = RREG32_SOC15(VCN, 0, mmUVD_CGC_CTRL);
- if (sw)
+ if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
else
data |= 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
@@ -500,7 +500,7 @@ static int vcn_v1_0_start(struct amdgpu_device *adev)
vcn_v1_0_mc_resume(adev);
/* disable clock gating */
- vcn_v1_0_disable_clock_gating(adev, true);
+ vcn_v1_0_disable_clock_gating(adev);
/* disable interupt */
WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), 0,
@@ -681,7 +681,7 @@ static int vcn_v1_0_stop(struct amdgpu_device *adev)
~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
/* enable clock gating */
- vcn_v1_0_enable_clock_gating(adev, true);
+ vcn_v1_0_enable_clock_gating(adev);
return 0;
}
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/6] drm/amdgpu: Enable static pg feature on RV
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
` (3 preceding siblings ...)
2018-05-16 12:53 ` [PATCH 5/6] drm/amdgpu: Enable static cg for vcn on RV Rex Zhu
@ 2018-05-16 12:53 ` Rex Zhu
[not found] ` <1526475182-32156-6-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 15:54 ` [PATCH 1/6] drm/amdgpu: skip CG for VCN when late_init/fini Alex Deucher
5 siblings, 1 reply; 12+ messages in thread
From: Rex Zhu @ 2018-05-16 12:53 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 11 ++
drivers/gpu/drm/amd/amdgpu/soc15.c | 3 +-
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 183 ++++++++++++++++++++++++++++++--
3 files changed, 187 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 2fd7db8..181e6af 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -45,6 +45,17 @@
#define VCN_ENC_CMD_REG_WRITE 0x0000000b
#define VCN_ENC_CMD_REG_WAIT 0x0000000c
+enum engine_status_constants {
+ UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON = 0x2AAAA0,
+ UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON = 0x00000002,
+ UVD_STATUS__UVD_BUSY = 0x00000004,
+ GB_ADDR_CONFIG_DEFAULT = 0x26010011,
+ UVD_STATUS__IDLE = 0x2,
+ UVD_STATUS__BUSY = 0x5,
+ UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF = 0x1,
+ UVD_STATUS__RBC_BUSY = 0x1,
+};
+
struct amdgpu_vcn {
struct amdgpu_bo *vcpu_bo;
void *cpu_addr;
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
index 485cb43..9a7a85d 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
@@ -713,7 +713,8 @@ static int soc15_common_early_init(void *handle)
AMD_CG_SUPPORT_SDMA_MGCG |
AMD_CG_SUPPORT_SDMA_LS |
AMD_CG_SUPPORT_VCN_MGCG;
- adev->pg_flags = AMD_PG_SUPPORT_SDMA;
+
+ adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN;
if (adev->powerplay.pp_feature & PP_GFXOFF_MASK)
adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 9e0a2b1..89a9477 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -146,10 +146,6 @@ static int vcn_v1_0_hw_init(void *handle)
struct amdgpu_ring *ring = &adev->vcn.ring_dec;
int i, r;
- r = vcn_v1_0_start(adev);
- if (r)
- goto done;
-
ring->ready = true;
r = amdgpu_ring_test_ring(ring);
if (r) {
@@ -480,6 +476,117 @@ static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev)
WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data);
}
+static int vcn_wait_on_reg_read(struct amdgpu_device *adev, uint32_t segment_index,
+ uint32_t reg, uint32_t expected_value,
+ uint32_t mask)
+{
+ uint32_t loop, data;
+
+ data = RREG32(adev->reg_offset[VCN_HWIP][0][segment_index] + reg);
+
+ loop = 1000;
+
+ while ((data & mask) != expected_value) {
+ udelay(10);
+ data = RREG32(adev->reg_offset[VCN_HWIP][0][segment_index] + reg);
+ loop--;
+ if (!loop)
+ return -ETIMEDOUT;
+ }
+
+ return 0;
+}
+
+static void vcn_1_0_disable_static_power_gating(struct amdgpu_device *adev)
+{
+ uint32_t data = 0;
+
+ if (adev->pg_flags & AMD_PG_SUPPORT_VCN) {
+ data = (1 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT);
+
+ WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data);
+ vcn_wait_on_reg_read(adev, mmUVD_PGFSM_STATUS_BASE_IDX, mmUVD_PGFSM_STATUS,
+ UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON, 0xFFFFFF);
+ } else {
+ data = (1 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT
+ | 1 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT);
+ WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data);
+ vcn_wait_on_reg_read(adev, mmUVD_PGFSM_STATUS_BASE_IDX, mmUVD_PGFSM_STATUS,
+ 0, 0xFFFFFFFF);
+ }
+
+ /* polling UVD_PGFSM_STATUS to confirm UVDM_PWR_STATUS , UVDU_PWR_STATUS are 0 (power on) */
+
+ data = RREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS);
+ data &= ~0x103;
+ if (adev->pg_flags & AMD_PG_SUPPORT_VCN)
+ data |= UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON | UVD_POWER_STATUS__UVD_PG_EN_MASK;
+
+ WREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS, data);
+}
+
+static void vcn_1_0_enable_static_power_gating(struct amdgpu_device *adev)
+{
+ uint32_t data = 0;
+
+ if (adev->pg_flags & AMD_PG_SUPPORT_VCN) {
+ /* Before power off, this indicator has to be turned on */
+ data = RREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS);
+ data &= ~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK;
+ data |= UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF;
+ WREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS, data);
+
+
+ data = (2 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT
+ | 2 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT);
+
+ WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data);
+
+
+ data = (2 << UVD_PGFSM_STATUS__UVDM_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDU_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDF_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDC_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDB_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDIL_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDIR_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDTD_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDTE_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDE_PWR_STATUS__SHIFT
+ | 2 << UVD_PGFSM_STATUS__UVDW_PWR_STATUS__SHIFT);
+ vcn_wait_on_reg_read(adev, mmUVD_PGFSM_STATUS_BASE_IDX,
+ mmUVD_PGFSM_STATUS, data, 0xFFFFFFFF);
+ }
+}
+
/**
* vcn_v1_0_start - start VCN block
*
@@ -499,6 +606,7 @@ static int vcn_v1_0_start(struct amdgpu_device *adev)
vcn_v1_0_mc_resume(adev);
+ vcn_1_0_disable_static_power_gating(adev);
/* disable clock gating */
vcn_v1_0_disable_clock_gating(adev);
@@ -681,15 +789,46 @@ static int vcn_v1_0_stop(struct amdgpu_device *adev)
~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
/* enable clock gating */
- vcn_v1_0_enable_clock_gating(adev);
+ vcn_v1_0_enable_clock_gating(adev);
+ vcn_1_0_enable_static_power_gating(adev);
return 0;
}
+
+bool vcn_v1_0_is_idle(void *handle)
+{
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == 0x2);
+}
+
+int vcn_v1_0_wait_for_idle(void *handle)
+{
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ vcn_wait_on_reg_read(adev, mmUVD_STATUS_BASE_IDX, mmUVD_STATUS,
+ 0x2, 0x2);
+ return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == 0x2);
+}
+
static int vcn_v1_0_set_clockgating_state(void *handle,
enum amd_clockgating_state state)
{
- /* needed for driver unload*/
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
+
+ if (enable) {
+ /* wait for STATUS to clear */
+ if (vcn_v1_0_is_idle(handle))
+ return -EBUSY;
+ vcn_v1_0_enable_clock_gating(adev);
+ /* enable HW gates because UVD is idle */
+/* uvd_v6_0_set_hw_clock_gating(adev); */
+ } else {
+ /* disable HW gating and enable Sw gating */
+ vcn_v1_0_disable_clock_gating(adev);
+ }
return 0;
}
@@ -1058,6 +1197,32 @@ static void vcn_v1_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
}
+static int vcn_v1_0_set_powergating_state(void *handle,
+ enum amd_powergating_state state)
+{
+ /* This doesn't actually powergate the VCN block.
+ * That's done in the dpm code via the SMC. This
+ * just re-inits the block as necessary. The actual
+ * gating still happens in the dpm code. We should
+ * revisit this when there is a cleaner line between
+ * the smc and the hw blocks
+ */
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ int ret = 0;
+
+ //WREG32(mmUVD_POWER_STATUS, UVD_POWER_STATUS__UVD_PG_EN_MASK);
+
+ if (state == AMD_PG_STATE_GATE) {
+ vcn_v1_0_stop(adev);
+ } else {
+ ret = vcn_v1_0_start(adev);
+ if (ret)
+ goto out;
+ }
+
+out:
+ return ret;
+}
static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
.name = "vcn_v1_0",
@@ -1069,14 +1234,14 @@ static void vcn_v1_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
.hw_fini = vcn_v1_0_hw_fini,
.suspend = vcn_v1_0_suspend,
.resume = vcn_v1_0_resume,
- .is_idle = NULL /* vcn_v1_0_is_idle */,
- .wait_for_idle = NULL /* vcn_v1_0_wait_for_idle */,
+ .is_idle = vcn_v1_0_is_idle,
+ .wait_for_idle = vcn_v1_0_wait_for_idle,
.check_soft_reset = NULL /* vcn_v1_0_check_soft_reset */,
.pre_soft_reset = NULL /* vcn_v1_0_pre_soft_reset */,
.soft_reset = NULL /* vcn_v1_0_soft_reset */,
.post_soft_reset = NULL /* vcn_v1_0_post_soft_reset */,
.set_clockgating_state = vcn_v1_0_set_clockgating_state,
- .set_powergating_state = NULL /* vcn_v1_0_set_powergating_state */,
+ .set_powergating_state = vcn_v1_0_set_powergating_state,
};
static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 5/6] drm/amdgpu: Enable static cg for vcn on RV
[not found] ` <1526475182-32156-5-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
@ 2018-05-16 15:45 ` Alex Deucher
0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2018-05-16 15:45 UTC (permalink / raw)
To: Rex Zhu; +Cc: amd-gfx list
On Wed, May 16, 2018 at 8:53 AM, Rex Zhu <Rex.Zhu@amd.com> wrote:
> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/soc15.c | 3 ++-
> drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 16 ++++++++--------
> 2 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
> index 8ccbcf9..485cb43 100644
> --- a/drivers/gpu/drm/amd/amdgpu/soc15.c
> +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
> @@ -711,7 +711,8 @@ static int soc15_common_early_init(void *handle)
> AMD_CG_SUPPORT_MC_MGCG |
> AMD_CG_SUPPORT_MC_LS |
> AMD_CG_SUPPORT_SDMA_MGCG |
> - AMD_CG_SUPPORT_SDMA_LS;
> + AMD_CG_SUPPORT_SDMA_LS |
> + AMD_CG_SUPPORT_VCN_MGCG;
Split out the setting of the flag to enable this from the
implementation. With that fixed:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> adev->pg_flags = AMD_PG_SUPPORT_SDMA;
>
> if (adev->powerplay.pp_feature & PP_GFXOFF_MASK)
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> index 0501746b..9e0a2b1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> @@ -288,14 +288,14 @@ static void vcn_v1_0_mc_resume(struct amdgpu_device *adev)
> *
> * Disable clock gating for VCN block
> */
> -static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev, bool sw)
> +static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev)
> {
> uint32_t data;
>
> /* JPEG disable CGC */
> data = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
>
> - if (sw)
> + if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
> data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
> else
> data &= ~JPEG_CGC_CTRL__DYN_CLOCK_MODE_MASK;
> @@ -310,7 +310,7 @@ static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev, bool sw)
>
> /* UVD disable CGC */
> data = RREG32_SOC15(VCN, 0, mmUVD_CGC_CTRL);
> - if (sw)
> + if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
> data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
> else
> data &= ~ UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
> @@ -415,13 +415,13 @@ static void vcn_v1_0_disable_clock_gating(struct amdgpu_device *adev, bool sw)
> *
> * Enable clock gating for VCN block
> */
> -static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev, bool sw)
> +static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev)
> {
> uint32_t data = 0;
>
> /* enable JPEG CGC */
> data = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
> - if (sw)
> + if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
> data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
> else
> data |= 0 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
> @@ -435,7 +435,7 @@ static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev, bool sw)
>
> /* enable UVD CGC */
> data = RREG32_SOC15(VCN, 0, mmUVD_CGC_CTRL);
> - if (sw)
> + if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
> data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
> else
> data |= 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
> @@ -500,7 +500,7 @@ static int vcn_v1_0_start(struct amdgpu_device *adev)
> vcn_v1_0_mc_resume(adev);
>
> /* disable clock gating */
> - vcn_v1_0_disable_clock_gating(adev, true);
> + vcn_v1_0_disable_clock_gating(adev);
>
> /* disable interupt */
> WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), 0,
> @@ -681,7 +681,7 @@ static int vcn_v1_0_stop(struct amdgpu_device *adev)
> ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
>
> /* enable clock gating */
> - vcn_v1_0_enable_clock_gating(adev, true);
> + vcn_v1_0_enable_clock_gating(adev);
>
> return 0;
> }
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 6/6] drm/amdgpu: Enable static pg feature on RV
[not found] ` <1526475182-32156-6-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
@ 2018-05-16 15:51 ` Alex Deucher
0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2018-05-16 15:51 UTC (permalink / raw)
To: Rex Zhu; +Cc: amd-gfx list
On Wed, May 16, 2018 at 8:53 AM, Rex Zhu <Rex.Zhu@amd.com> wrote:
> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 11 ++
> drivers/gpu/drm/amd/amdgpu/soc15.c | 3 +-
> drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 183 ++++++++++++++++++++++++++++++--
> 3 files changed, 187 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> index 2fd7db8..181e6af 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> @@ -45,6 +45,17 @@
> #define VCN_ENC_CMD_REG_WRITE 0x0000000b
> #define VCN_ENC_CMD_REG_WAIT 0x0000000c
>
> +enum engine_status_constants {
> + UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON = 0x2AAAA0,
> + UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON = 0x00000002,
> + UVD_STATUS__UVD_BUSY = 0x00000004,
> + GB_ADDR_CONFIG_DEFAULT = 0x26010011,
> + UVD_STATUS__IDLE = 0x2,
> + UVD_STATUS__BUSY = 0x5,
> + UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF = 0x1,
> + UVD_STATUS__RBC_BUSY = 0x1,
> +};
> +
> struct amdgpu_vcn {
> struct amdgpu_bo *vcpu_bo;
> void *cpu_addr;
> diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
> index 485cb43..9a7a85d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/soc15.c
> +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
> @@ -713,7 +713,8 @@ static int soc15_common_early_init(void *handle)
> AMD_CG_SUPPORT_SDMA_MGCG |
> AMD_CG_SUPPORT_SDMA_LS |
> AMD_CG_SUPPORT_VCN_MGCG;
> - adev->pg_flags = AMD_PG_SUPPORT_SDMA;
> +
> + adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN;
>
Make this a separate patch. Split out the setting of the flag to
enable this from the implementation.
> if (adev->powerplay.pp_feature & PP_GFXOFF_MASK)
> adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> index 9e0a2b1..89a9477 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
> @@ -146,10 +146,6 @@ static int vcn_v1_0_hw_init(void *handle)
> struct amdgpu_ring *ring = &adev->vcn.ring_dec;
> int i, r;
>
> - r = vcn_v1_0_start(adev);
> - if (r)
> - goto done;
> -
> ring->ready = true;
> r = amdgpu_ring_test_ring(ring);
> if (r) {
> @@ -480,6 +476,117 @@ static void vcn_v1_0_enable_clock_gating(struct amdgpu_device *adev)
> WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data);
> }
>
> +static int vcn_wait_on_reg_read(struct amdgpu_device *adev, uint32_t segment_index,
> + uint32_t reg, uint32_t expected_value,
> + uint32_t mask)
> +{
> + uint32_t loop, data;
> +
> + data = RREG32(adev->reg_offset[VCN_HWIP][0][segment_index] + reg);
> +
> + loop = 1000;
> +
> + while ((data & mask) != expected_value) {
> + udelay(10);
> + data = RREG32(adev->reg_offset[VCN_HWIP][0][segment_index] + reg);
> + loop--;
> + if (!loop)
> + return -ETIMEDOUT;
> + }
> +
> + return 0;
> +}
Might be nice to wrap this with a macro so we can do something like:
WAIT_REG_SOC15((reg), (val), (mask))
rather than having to pass the segment_index directly. No big deal either way.
> +
> +static void vcn_1_0_disable_static_power_gating(struct amdgpu_device *adev)
> +{
> + uint32_t data = 0;
> +
> + if (adev->pg_flags & AMD_PG_SUPPORT_VCN) {
> + data = (1 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT);
> +
> + WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data);
> + vcn_wait_on_reg_read(adev, mmUVD_PGFSM_STATUS_BASE_IDX, mmUVD_PGFSM_STATUS,
> + UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON, 0xFFFFFF);
> + } else {
> + data = (1 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT
> + | 1 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT);
> + WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data);
> + vcn_wait_on_reg_read(adev, mmUVD_PGFSM_STATUS_BASE_IDX, mmUVD_PGFSM_STATUS,
> + 0, 0xFFFFFFFF);
> + }
> +
> + /* polling UVD_PGFSM_STATUS to confirm UVDM_PWR_STATUS , UVDU_PWR_STATUS are 0 (power on) */
> +
> + data = RREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS);
> + data &= ~0x103;
> + if (adev->pg_flags & AMD_PG_SUPPORT_VCN)
> + data |= UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON | UVD_POWER_STATUS__UVD_PG_EN_MASK;
> +
> + WREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS, data);
> +}
> +
> +static void vcn_1_0_enable_static_power_gating(struct amdgpu_device *adev)
> +{
> + uint32_t data = 0;
> +
> + if (adev->pg_flags & AMD_PG_SUPPORT_VCN) {
> + /* Before power off, this indicator has to be turned on */
> + data = RREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS);
> + data &= ~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK;
> + data |= UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF;
> + WREG32_SOC15(VCN, 0, mmUVD_POWER_STATUS, data);
> +
> +
> + data = (2 << UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDU_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDC_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDIL_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDIR_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT
> + | 2 << UVD_PGFSM_CONFIG__UVDW_PWR_CONFIG__SHIFT);
> +
> + WREG32_SOC15(VCN, 0, mmUVD_PGFSM_CONFIG, data);
> +
> +
> + data = (2 << UVD_PGFSM_STATUS__UVDM_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDU_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDF_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDC_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDB_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDIL_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDIR_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDTD_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDTE_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDE_PWR_STATUS__SHIFT
> + | 2 << UVD_PGFSM_STATUS__UVDW_PWR_STATUS__SHIFT);
> + vcn_wait_on_reg_read(adev, mmUVD_PGFSM_STATUS_BASE_IDX,
> + mmUVD_PGFSM_STATUS, data, 0xFFFFFFFF);
> + }
> +}
> +
> /**
> * vcn_v1_0_start - start VCN block
> *
> @@ -499,6 +606,7 @@ static int vcn_v1_0_start(struct amdgpu_device *adev)
>
> vcn_v1_0_mc_resume(adev);
>
> + vcn_1_0_disable_static_power_gating(adev);
> /* disable clock gating */
> vcn_v1_0_disable_clock_gating(adev);
>
> @@ -681,15 +789,46 @@ static int vcn_v1_0_stop(struct amdgpu_device *adev)
> ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
>
> /* enable clock gating */
> - vcn_v1_0_enable_clock_gating(adev);
>
> + vcn_v1_0_enable_clock_gating(adev);
> + vcn_1_0_enable_static_power_gating(adev);
> return 0;
> }
>
> +
> +bool vcn_v1_0_is_idle(void *handle)
> +{
> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> +
> + return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == 0x2);
> +}
> +
> +int vcn_v1_0_wait_for_idle(void *handle)
> +{
> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> +
> + vcn_wait_on_reg_read(adev, mmUVD_STATUS_BASE_IDX, mmUVD_STATUS,
> + 0x2, 0x2);
> + return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == 0x2);
> +}
> +
> static int vcn_v1_0_set_clockgating_state(void *handle,
> enum amd_clockgating_state state)
> {
> - /* needed for driver unload*/
> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> + bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
> +
> + if (enable) {
> + /* wait for STATUS to clear */
> + if (vcn_v1_0_is_idle(handle))
> + return -EBUSY;
> + vcn_v1_0_enable_clock_gating(adev);
> + /* enable HW gates because UVD is idle */
> +/* uvd_v6_0_set_hw_clock_gating(adev); */
> + } else {
> + /* disable HW gating and enable Sw gating */
> + vcn_v1_0_disable_clock_gating(adev);
> + }
> return 0;
> }
>
> @@ -1058,6 +1197,32 @@ static void vcn_v1_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
>
> }
>
> +static int vcn_v1_0_set_powergating_state(void *handle,
> + enum amd_powergating_state state)
> +{
> + /* This doesn't actually powergate the VCN block.
> + * That's done in the dpm code via the SMC. This
> + * just re-inits the block as necessary. The actual
> + * gating still happens in the dpm code. We should
> + * revisit this when there is a cleaner line between
> + * the smc and the hw blocks
> + */
> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> + int ret = 0;
> +
> + //WREG32(mmUVD_POWER_STATUS, UVD_POWER_STATUS__UVD_PG_EN_MASK);
> +
drop this debugging leftover?
> + if (state == AMD_PG_STATE_GATE) {
> + vcn_v1_0_stop(adev);
> + } else {
> + ret = vcn_v1_0_start(adev);
> + if (ret)
> + goto out;
> + }
> +
> +out:
> + return ret;
> +}
>
> static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
> .name = "vcn_v1_0",
> @@ -1069,14 +1234,14 @@ static void vcn_v1_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
> .hw_fini = vcn_v1_0_hw_fini,
> .suspend = vcn_v1_0_suspend,
> .resume = vcn_v1_0_resume,
> - .is_idle = NULL /* vcn_v1_0_is_idle */,
> - .wait_for_idle = NULL /* vcn_v1_0_wait_for_idle */,
> + .is_idle = vcn_v1_0_is_idle,
> + .wait_for_idle = vcn_v1_0_wait_for_idle,
> .check_soft_reset = NULL /* vcn_v1_0_check_soft_reset */,
> .pre_soft_reset = NULL /* vcn_v1_0_pre_soft_reset */,
> .soft_reset = NULL /* vcn_v1_0_soft_reset */,
> .post_soft_reset = NULL /* vcn_v1_0_post_soft_reset */,
> .set_clockgating_state = vcn_v1_0_set_clockgating_state,
> - .set_powergating_state = NULL /* vcn_v1_0_set_powergating_state */,
> + .set_powergating_state = vcn_v1_0_set_powergating_state,
> };
>
> static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 4/6] drm/amdgpu: Add runtime vcn cg/pg enablement
[not found] ` <1526475182-32156-4-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
@ 2018-05-16 15:53 ` Alex Deucher
0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2018-05-16 15:53 UTC (permalink / raw)
To: Rex Zhu; +Cc: amd-gfx list
On Wed, May 16, 2018 at 8:53 AM, Rex Zhu <Rex.Zhu@amd.com> wrote:
> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Please add a better patch description. E.g.,
drm/amdgpu: Add runtime vcn cg/pg enablement
Enable support for dynamically powering up/down VCN on demand.
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
With that fixed:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> index 58e4953..8b0d491 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -208,9 +208,13 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
>
> if (fences == 0) {
> if (adev->pm.dpm_enabled) {
> - /* might be used when with pg/cg
> amdgpu_dpm_enable_uvd(adev, false);
> - */
> + } else {
> + /* shutdown the UVD block */
> + amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
> + AMD_PG_STATE_GATE);
> + amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
> + AMD_CG_STATE_GATE);
> }
> } else {
> schedule_delayed_work(&adev->vcn.idle_work, VCN_IDLE_TIMEOUT);
> @@ -223,9 +227,14 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
> bool set_clocks = !cancel_delayed_work_sync(&adev->vcn.idle_work);
>
> if (set_clocks && adev->pm.dpm_enabled) {
> - /* might be used when with pg/cg
> - amdgpu_dpm_enable_uvd(adev, true);
> - */
> + if (adev->pm.dpm_enabled) {
> + amdgpu_dpm_enable_uvd(adev, true);
> + } else {
> + amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
> + AMD_CG_STATE_UNGATE);
> + amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
> + AMD_PG_STATE_UNGATE);
> + }
> }
> }
>
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/6] drm/amdgpu: skip CG for VCN when late_init/fini
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
` (4 preceding siblings ...)
2018-05-16 12:53 ` [PATCH 6/6] drm/amdgpu: Enable static pg feature " Rex Zhu
@ 2018-05-16 15:54 ` Alex Deucher
5 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2018-05-16 15:54 UTC (permalink / raw)
To: Rex Zhu; +Cc: amd-gfx list
On Wed, May 16, 2018 at 8:52 AM, Rex Zhu <Rex.Zhu@amd.com> wrote:
> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Please add a patch description. E.g., something like:
VCN clockgating is handled manually like VCE and UVD.
With that fixed:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index fcd4bb2..25bee46 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1718,6 +1718,7 @@ static int amdgpu_device_ip_late_set_cg_state(struct amdgpu_device *adev)
> /* skip CG for VCE/UVD, it's handled specially */
> if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
> adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
> + adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
> adev->ip_blocks[i].version->funcs->set_clockgating_state) {
> /* enable clockgating to save power */
> r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
> @@ -1817,6 +1818,7 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
>
> if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
> adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE &&
> + adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN &&
> adev->ip_blocks[i].version->funcs->set_clockgating_state) {
> /* ungate blocks before hw fini so that we can shutdown the blocks safely */
> r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev,
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/6] drm/amd/pp: Add smu support for vcn cg/pg on RV
[not found] ` <1526475182-32156-2-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
@ 2018-05-16 15:55 ` Alex Deucher
0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2018-05-16 15:55 UTC (permalink / raw)
To: Rex Zhu; +Cc: amd-gfx list
On Wed, May 16, 2018 at 8:52 AM, Rex Zhu <Rex.Zhu@amd.com> wrote:
> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c | 25 ++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> index 32b1524..436326b 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> @@ -1146,6 +1146,29 @@ static int smu10_set_mmhub_powergating_by_smu(struct pp_hwmgr *hwmgr)
> return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PowerGateMmHub);
> }
>
> +static void smu10_powergate_vcn(struct pp_hwmgr *hwmgr, bool bgate)
> +{
> + if (bgate) {
> + amdgpu_device_ip_set_powergating_state(hwmgr->adev,
> + AMD_IP_BLOCK_TYPE_VCN,
> + AMD_PG_STATE_GATE);
> + amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
> + AMD_IP_BLOCK_TYPE_VCN,
> + AMD_CG_STATE_GATE);
> + smum_send_msg_to_smc_with_parameter(hwmgr,
> + PPSMC_MSG_PowerDownVcn, 0);
> + } else {
> + smum_send_msg_to_smc_with_parameter(hwmgr,
> + PPSMC_MSG_PowerUpVcn, 0);
> + amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
> + AMD_IP_BLOCK_TYPE_VCN,
> + AMD_CG_STATE_UNGATE);
> + amdgpu_device_ip_set_powergating_state(hwmgr->adev,
> + AMD_IP_BLOCK_TYPE_VCN,
> + AMD_PG_STATE_UNGATE);
> + }
> +}
> +
> static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
> .backend_init = smu10_hwmgr_backend_init,
> .backend_fini = smu10_hwmgr_backend_fini,
> @@ -1154,7 +1177,7 @@ static int smu10_set_mmhub_powergating_by_smu(struct pp_hwmgr *hwmgr)
> .force_dpm_level = smu10_dpm_force_dpm_level,
> .get_power_state_size = smu10_get_power_state_size,
> .powerdown_uvd = NULL,
> - .powergate_uvd = NULL,
> + .powergate_uvd = smu10_powergate_vcn,
> .powergate_vce = NULL,
> .get_mclk = smu10_dpm_get_mclk,
> .get_sclk = smu10_dpm_get_sclk,
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/6] drm/amdgpu: Add CG/PG flags for VCN
[not found] ` <1526475182-32156-3-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
@ 2018-05-16 15:55 ` Alex Deucher
0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2018-05-16 15:55 UTC (permalink / raw)
To: Rex Zhu; +Cc: amd-gfx list
On Wed, May 16, 2018 at 8:52 AM, Rex Zhu <Rex.Zhu@amd.com> wrote:
> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/include/amd_shared.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
> index 33de330..b178176 100644
> --- a/drivers/gpu/drm/amd/include/amd_shared.h
> +++ b/drivers/gpu/drm/amd/include/amd_shared.h
> @@ -92,7 +92,7 @@ enum amd_powergating_state {
> #define AMD_CG_SUPPORT_GFX_3D_CGLS (1 << 21)
> #define AMD_CG_SUPPORT_DRM_MGCG (1 << 22)
> #define AMD_CG_SUPPORT_DF_MGCG (1 << 23)
> -
> +#define AMD_CG_SUPPORT_VCN_MGCG (1 << 24)
> /* PG flags */
> #define AMD_PG_SUPPORT_GFX_PG (1 << 0)
> #define AMD_PG_SUPPORT_GFX_SMG (1 << 1)
> @@ -108,6 +108,7 @@ enum amd_powergating_state {
> #define AMD_PG_SUPPORT_GFX_QUICK_MG (1 << 11)
> #define AMD_PG_SUPPORT_GFX_PIPELINE (1 << 12)
> #define AMD_PG_SUPPORT_MMHUB (1 << 13)
> +#define AMD_PG_SUPPORT_VCN (1 << 14)
>
> enum PP_FEATURE_MASK {
> PP_SCLK_DPM_MASK = 0x1,
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2018-05-16 15:55 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-16 12:52 [PATCH 1/6] drm/amdgpu: skip CG for VCN when late_init/fini Rex Zhu
[not found] ` <1526475182-32156-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 12:52 ` [PATCH 2/6] drm/amd/pp: Add smu support for vcn cg/pg on RV Rex Zhu
[not found] ` <1526475182-32156-2-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 15:55 ` Alex Deucher
2018-05-16 12:52 ` [PATCH 3/6] drm/amdgpu: Add CG/PG flags for VCN Rex Zhu
[not found] ` <1526475182-32156-3-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 15:55 ` Alex Deucher
2018-05-16 12:53 ` [PATCH 4/6] drm/amdgpu: Add runtime vcn cg/pg enablement Rex Zhu
[not found] ` <1526475182-32156-4-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 15:53 ` Alex Deucher
2018-05-16 12:53 ` [PATCH 5/6] drm/amdgpu: Enable static cg for vcn on RV Rex Zhu
[not found] ` <1526475182-32156-5-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 15:45 ` Alex Deucher
2018-05-16 12:53 ` [PATCH 6/6] drm/amdgpu: Enable static pg feature " Rex Zhu
[not found] ` <1526475182-32156-6-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-05-16 15:51 ` Alex Deucher
2018-05-16 15:54 ` [PATCH 1/6] drm/amdgpu: skip CG for VCN when late_init/fini Alex Deucher
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.