diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0431-drm-amdgpu-added-vega20-LBPW-support.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0431-drm-amdgpu-added-vega20-LBPW-support.patch | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0431-drm-amdgpu-added-vega20-LBPW-support.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0431-drm-amdgpu-added-vega20-LBPW-support.patch new file mode 100644 index 00000000..43968564 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0431-drm-amdgpu-added-vega20-LBPW-support.patch @@ -0,0 +1,154 @@ +From b93d1f02ade9fde49f3312d70710815861b964a5 Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Fri, 24 Aug 2018 16:40:03 +0800 +Subject: [PATCH 0431/2940] drm/amdgpu: added vega20 LBPW support + +Enable LBPW support on vega20. + +Change-Id: I9fe3458207f958cb500ca34b8d807a7b96d3df74 +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 103 +++++++++++++++++++++++++- + 1 file changed, 102 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +index 39b11c8ad93c..5789bb23276b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +@@ -908,6 +908,50 @@ static void gfx_v9_0_get_csb_buffer(struct amdgpu_device *adev, + buffer[count++] = cpu_to_le32(0); + } + ++static void gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device *adev) ++{ ++ struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info; ++ uint32_t pg_always_on_cu_num = 2; ++ uint32_t always_on_cu_num; ++ uint32_t i, j, k; ++ uint32_t mask, cu_bitmap, counter; ++ ++ if (adev->flags & AMD_IS_APU) ++ always_on_cu_num = 4; ++ else if (adev->asic_type == CHIP_VEGA12) ++ always_on_cu_num = 8; ++ else ++ always_on_cu_num = 12; ++ ++ mutex_lock(&adev->grbm_idx_mutex); ++ for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { ++ for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { ++ mask = 1; ++ cu_bitmap = 0; ++ counter = 0; ++ gfx_v9_0_select_se_sh(adev, i, j, 0xffffffff); ++ ++ for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) { ++ if (cu_info->bitmap[i][j] & mask) { ++ if (counter == pg_always_on_cu_num) ++ WREG32_SOC15(GC, 0, mmRLC_PG_ALWAYS_ON_CU_MASK, cu_bitmap); ++ if (counter < always_on_cu_num) ++ cu_bitmap |= mask; ++ else ++ break; ++ counter++; ++ } ++ mask <<= 1; ++ } ++ ++ WREG32_SOC15(GC, 0, mmRLC_LB_ALWAYS_ACTIVE_CU_MASK, cu_bitmap); ++ cu_info->ao_cu_bitmap[i][j] = cu_bitmap; ++ } ++ } ++ gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); ++ mutex_unlock(&adev->grbm_idx_mutex); ++} ++ + static void gfx_v9_0_init_lbpw(struct amdgpu_device *adev) + { + uint32_t data; +@@ -953,6 +997,55 @@ static void gfx_v9_0_init_lbpw(struct amdgpu_device *adev) + mutex_unlock(&adev->grbm_idx_mutex); + } + ++static void gfx_v9_4_init_lbpw(struct amdgpu_device *adev) ++{ ++ uint32_t data; ++ ++ /* set mmRLC_LB_THR_CONFIG_1/2/3/4 */ ++ WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_1, 0x0000007F); ++ WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_2, 0x033388F8); ++ WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_3, 0x00000077); ++ WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_4, (0x10 | 0x27 << 8 | 0x02FA << 16)); ++ ++ /* set mmRLC_LB_CNTR_INIT = 0x0000_0000 */ ++ WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_INIT, 0x00000000); ++ ++ /* set mmRLC_LB_CNTR_MAX = 0x0000_0500 */ ++ WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_MAX, 0x00000800); ++ ++ mutex_lock(&adev->grbm_idx_mutex); ++ /* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/ ++ gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); ++ WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff); ++ ++ /* set mmRLC_LB_PARAMS = 0x003F_1006 */ ++ data = REG_SET_FIELD(0, RLC_LB_PARAMS, FIFO_SAMPLES, 0x0003); ++ data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLES, 0x0010); ++ data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLE_INTERVAL, 0x033F); ++ WREG32_SOC15(GC, 0, mmRLC_LB_PARAMS, data); ++ ++ /* set mmRLC_GPM_GENERAL_7[31-16] = 0x00C0 */ ++ data = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7); ++ data &= 0x0000FFFF; ++ data |= 0x00C00000; ++ WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7, data); ++ ++ /* ++ * RLC_LB_ALWAYS_ACTIVE_CU_MASK = 0xFFF (12 CUs AON), ++ * programmed in gfx_v9_0_init_always_on_cu_mask() ++ */ ++ ++ /* set RLC_LB_CNTL = 0x8000_0095, 31 bit is reserved, ++ * but used for RLC_LB_CNTL configuration */ ++ data = RLC_LB_CNTL__LB_CNT_SPIM_ACTIVE_MASK; ++ data |= REG_SET_FIELD(data, RLC_LB_CNTL, CU_MASK_USED_OFF_HYST, 0x09); ++ data |= REG_SET_FIELD(data, RLC_LB_CNTL, RESERVED, 0x80000); ++ WREG32_SOC15(GC, 0, mmRLC_LB_CNTL, data); ++ mutex_unlock(&adev->grbm_idx_mutex); ++ ++ gfx_v9_0_init_always_on_cu_mask(adev); ++} ++ + static void gfx_v9_0_enable_lbpw(struct amdgpu_device *adev, bool enable) + { + WREG32_FIELD15(GC, 0, RLC_LB_CNTL, LOAD_BALANCE_ENABLE, enable ? 1 : 0); +@@ -1084,8 +1177,15 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev) + rv_init_cp_jump_table(adev); + amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj); + amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj); ++ } + ++ switch (adev->asic_type) { ++ case CHIP_RAVEN: + gfx_v9_0_init_lbpw(adev); ++ break; ++ case CHIP_VEGA20: ++ gfx_v9_4_init_lbpw(adev); ++ break; + } + + return 0; +@@ -2407,7 +2507,8 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev) + return r; + } + +- if (adev->asic_type == CHIP_RAVEN) { ++ if (adev->asic_type == CHIP_RAVEN || ++ adev->asic_type == CHIP_VEGA20) { + if (amdgpu_lbpw != 0) + gfx_v9_0_enable_lbpw(adev, true); + else +-- +2.17.1 + |