aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/1148-refine-pg-code-for-gfx_v8.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/1148-refine-pg-code-for-gfx_v8.patch')
-rw-r--r--common/recipes-kernel/linux/files/1148-refine-pg-code-for-gfx_v8.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/1148-refine-pg-code-for-gfx_v8.patch b/common/recipes-kernel/linux/files/1148-refine-pg-code-for-gfx_v8.patch
new file mode 100644
index 00000000..4416497c
--- /dev/null
+++ b/common/recipes-kernel/linux/files/1148-refine-pg-code-for-gfx_v8.patch
@@ -0,0 +1,204 @@
+From c5ef870413c64c25cfe2a646c395b0c0d293a4f5 Mon Sep 17 00:00:00 2001
+From: Ravi Patlegar <ravi.patlegar@amd.com>
+Date: Tue, 13 Dec 2016 16:28:54 +0530
+Subject: [PATCH 10/10] refine pg code for gfx_v8.
+
+1. bit CP_PG_DISABLE was reversed.
+2. load RLC_SRM_INDEX_CNTL_ADDR/DATA_x pairs
+ with valid addr/data.
+3. always init gfx pg.
+4. delete repeated check for pg mask.
+
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+Signed-off-by: Ravi Patlegar <ravi.patlegar@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +
+ drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 118 ++++++++++++----------------------
+ 2 files changed, 44 insertions(+), 76 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 40497c2..af04d3b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -2211,6 +2211,8 @@ bool amdgpu_device_has_dal_support(struct amdgpu_device *adev);
+ #define REG_GET_FIELD(value, reg, field) \
+ (((value) & REG_FIELD_MASK(reg, field)) >> REG_FIELD_SHIFT(reg, field))
+
++#define WREG32_FIELD(reg, field, val) \
++ WREG32(mm##reg, (RREG32(mm##reg) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
+ /*
+ * BIOS helpers.
+ */
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+index d1cb4db..b4c41f9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+@@ -3934,8 +3934,10 @@ static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
+ temp = mmRLC_SRM_INDEX_CNTL_ADDR_0;
+ data = mmRLC_SRM_INDEX_CNTL_DATA_0;
+ for (i = 0; i < sizeof(unique_indices) / sizeof(int); i++) {
+- amdgpu_mm_wreg(adev, temp + i, unique_indices[i] & 0x3FFFF, false);
+- amdgpu_mm_wreg(adev, data + i, unique_indices[i] >> 20, false);
++ if (unique_indices[i] != 0) {
++ amdgpu_mm_wreg(adev, temp + i, unique_indices[i] & 0x3FFFF, false);
++ amdgpu_mm_wreg(adev, data + i, unique_indices[i] >> 20, false);
++ }
+ }
+ kfree(register_list_format);
+
+@@ -3955,32 +3957,17 @@ static void gfx_v8_0_init_power_gating(struct amdgpu_device *adev)
+ {
+ uint32_t data;
+
+- if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG |
+- AMDGPU_PG_SUPPORT_GFX_SMG |
+- AMDGPU_PG_SUPPORT_GFX_DMG)) {
+- data = RREG32(mmCP_RB_WPTR_POLL_CNTL);
+- data &= ~CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT_MASK;
+- data |= (0x60 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
+- WREG32(mmCP_RB_WPTR_POLL_CNTL, data);
+-
+- data = 0;
+- data |= (0x10 << RLC_PG_DELAY__POWER_UP_DELAY__SHIFT);
+- data |= (0x10 << RLC_PG_DELAY__POWER_DOWN_DELAY__SHIFT);
+- data |= (0x10 << RLC_PG_DELAY__CMD_PROPAGATE_DELAY__SHIFT);
+- data |= (0x10 << RLC_PG_DELAY__MEM_SLEEP_DELAY__SHIFT);
+- WREG32(mmRLC_PG_DELAY, data);
+-
+- data = RREG32(mmRLC_PG_DELAY_2);
+- data &= ~RLC_PG_DELAY_2__SERDES_CMD_DELAY_MASK;
+- data |= (0x3 << RLC_PG_DELAY_2__SERDES_CMD_DELAY__SHIFT);
+- WREG32(mmRLC_PG_DELAY_2, data);
+-
+- data = RREG32(mmRLC_AUTO_PG_CTRL);
+- data &= ~RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD_MASK;
+- data |= (0x55f0 << RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD__SHIFT);
+- WREG32(mmRLC_AUTO_PG_CTRL, data);
+- }
+- }
++ WREG32_FIELD(CP_RB_WPTR_POLL_CNTL, IDLE_POLL_COUNT, 0x60);
++
++ data = REG_SET_FIELD(0, RLC_PG_DELAY, POWER_UP_DELAY, 0x10);
++ data = REG_SET_FIELD(data, RLC_PG_DELAY, POWER_DOWN_DELAY, 0x10);
++ data = REG_SET_FIELD(data, RLC_PG_DELAY, CMD_PROPAGATE_DELAY, 0x10);
++ data = REG_SET_FIELD(data, RLC_PG_DELAY, MEM_SLEEP_DELAY, 0x10);
++ WREG32(mmRLC_PG_DELAY, data);
++
++ WREG32_FIELD(RLC_PG_DELAY_2, SERDES_CMD_DELAY, 0x3);
++ WREG32_FIELD(RLC_AUTO_PG_CTRL, GRBM_REG_SAVE_GFX_IDLE_THRESHOLD, 0x55f0);
++}
+
+ static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev,
+ bool enable)
+@@ -4016,18 +4003,8 @@ static void cz_enable_sck_slow_down_on_power_down(struct amdgpu_device *adev,
+
+ static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable)
+ {
+- u32 data, orig;
+-
+- orig = data = RREG32(mmRLC_PG_CNTL);
+-
+- if (enable)
+- data &= ~RLC_PG_CNTL__CP_PG_DISABLE_MASK;
+- else
+- data |= RLC_PG_CNTL__CP_PG_DISABLE_MASK;
+-
+- if (orig != data)
+- WREG32(mmRLC_PG_CNTL, data);
+- }
++ WREG32_FIELD(RLC_PG_CNTL, CP_PG_DISABLE, enable ? 0 : 1);
++}
+
+ static void polaris11_init_power_gating(struct amdgpu_device *adev)
+ {
+@@ -4062,39 +4039,30 @@ static void polaris11_init_power_gating(struct amdgpu_device *adev)
+
+ static void gfx_v8_0_init_pg(struct amdgpu_device *adev)
+ {
+- if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
+- AMD_PG_SUPPORT_GFX_SMG |
+- AMD_PG_SUPPORT_GFX_DMG |
+- AMD_PG_SUPPORT_CP |
+- AMD_PG_SUPPORT_GDS |
+- AMD_PG_SUPPORT_RLC_SMU_HS)) {
+- gfx_v8_0_init_csb(adev);
+- gfx_v8_0_init_save_restore_list(adev);
+- gfx_v8_0_enable_save_restore_machine(adev);
++ gfx_v8_0_init_csb(adev);
++ gfx_v8_0_init_save_restore_list(adev);
++ gfx_v8_0_enable_save_restore_machine(adev);
+
+- if ((adev->asic_type == CHIP_CARRIZO) ||
+- (adev->asic_type == CHIP_STONEY)) {
+- struct amdgpu_cu_info cu_info;
+-
+- gfx_v8_0_get_cu_info(adev, &cu_info);
+-
+- WREG32(mmRLC_JUMP_TABLE_RESTORE, adev->gfx.rlc.cp_table_gpu_addr >> 8);
+- gfx_v8_0_init_power_gating(adev);
+- WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, cu_info.ao_cu_mask);
+- if (adev->pg_flags & AMDGPU_PG_SUPPORT_RLC_SMU_HS) {
+- cz_enable_sck_slow_down_on_power_up(adev, true);
+- cz_enable_sck_slow_down_on_power_down(adev, true);
+- } else {
+- cz_enable_sck_slow_down_on_power_up(adev, false);
+- cz_enable_sck_slow_down_on_power_down(adev, false);
+- }
+- if (adev->pg_flags & AMDGPU_PG_SUPPORT_CP)
+- cz_enable_cp_power_gating(adev, true);
+- else
+- cz_enable_cp_power_gating(adev, false);
+- } else if (adev->asic_type == CHIP_POLARIS11) {
+- polaris11_init_power_gating(adev);
++ if ((adev->asic_type == CHIP_CARRIZO) ||
++ (adev->asic_type == CHIP_STONEY)) {
++ struct amdgpu_cu_info cu_info;
++ gfx_v8_0_get_cu_info(adev, &cu_info);
++ WREG32(mmRLC_JUMP_TABLE_RESTORE, adev->gfx.rlc.cp_table_gpu_addr >> 8);
++ gfx_v8_0_init_power_gating(adev);
++ WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, cu_info.ao_cu_mask);
++ if (adev->pg_flags & AMDGPU_PG_SUPPORT_RLC_SMU_HS) {
++ cz_enable_sck_slow_down_on_power_up(adev, true);
++ cz_enable_sck_slow_down_on_power_down(adev, true);
++ } else {
++ cz_enable_sck_slow_down_on_power_up(adev, false);
++ cz_enable_sck_slow_down_on_power_down(adev, false);
+ }
++ if (adev->pg_flags & AMDGPU_PG_SUPPORT_CP)
++ cz_enable_cp_power_gating(adev, true);
++ else
++ cz_enable_cp_power_gating(adev, false);
++ } else if (adev->asic_type == CHIP_POLARIS11) {
++ polaris11_init_power_gating(adev);
+ }
+ }
+
+@@ -5513,7 +5481,7 @@ static void cz_update_gfx_cg_power_gating(struct amdgpu_device *adev,
+ if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PIPELINE)
+ cz_enable_gfx_pipeline_power_gating(adev, true);
+ } else {
+- cz_enable_gfx_cg_power_gating(adev, false);
++ cz_enable_gfx_cg_power_gating(adev, true);
+ cz_enable_gfx_pipeline_power_gating(adev, false);
+ }
+ }
+@@ -5524,14 +5492,12 @@ static int gfx_v8_0_set_powergating_state(void *handle,
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ bool enable = (state == AMD_PG_STATE_GATE) ? true : false;
+
+- if (!(adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG))
+- return 0;
+
+ switch (adev->asic_type) {
+ case CHIP_CARRIZO:
+ case CHIP_STONEY:
+- if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG)
+- cz_update_gfx_cg_power_gating(adev, enable);
++
++ cz_update_gfx_cg_power_gating(adev, enable);
+
+ if ((adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_SMG) && enable)
+ gfx_v8_0_enable_gfx_static_mg_power_gating(adev, true);
+--
+2.7.4
+