aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
diff options
context:
space:
mode:
authorFlora Cui <Flora.Cui@amd.com>2017-02-07 02:18:27 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-02-08 17:23:52 -0500
commit375d6f7057a9cbcc2867e2d3ccb40008dea55598 (patch)
treeb2e8def575193fb24efca0c65f3608a0c2f2527e /drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
parent69dd3d2c618d6127efca47d1ffdecce453ff0c80 (diff)
drm/amdgpu/gfx6: clean up cu configuration
Signed-off-by: Flora Cui <Flora.Cui@amd.com> Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c100
1 files changed, 38 insertions, 62 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index f1344658abf3..9b169c60a4a0 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -1525,19 +1525,29 @@ static void gmc_v6_0_init_compute_vmid(struct amdgpu_device *adev)
1525} 1525}
1526*/ 1526*/
1527 1527
1528static u32 gfx_v6_0_get_cu_enabled(struct amdgpu_device *adev, u32 cu_per_sh) 1528static void gfx_v6_0_set_user_cu_inactive_bitmap(struct amdgpu_device *adev,
1529 u32 bitmap)
1529{ 1530{
1530 u32 data, mask; 1531 u32 data;
1531 1532
1532 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG); 1533 if (!bitmap)
1533 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; 1534 return;
1534 data |= RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
1535 1535
1536 data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; 1536 data = bitmap << GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
1537 data &= GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
1537 1538
1538 mask = gfx_v6_0_create_bitmask(cu_per_sh); 1539 WREG32(mmGC_USER_SHADER_ARRAY_CONFIG, data);
1540}
1539 1541
1540 return ~data & mask; 1542static u32 gfx_v6_0_get_cu_enabled(struct amdgpu_device *adev)
1543{
1544 u32 data, mask;
1545
1546 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG) |
1547 RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
1548
1549 mask = gfx_v6_0_create_bitmask(adev->gfx.config.max_cu_per_sh);
1550 return ~REG_GET_FIELD(data, CC_GC_SHADER_ARRAY_CONFIG, INACTIVE_CUS) & mask;
1541} 1551}
1542 1552
1543 1553
@@ -1554,7 +1564,7 @@ static void gfx_v6_0_setup_spi(struct amdgpu_device *adev,
1554 for (j = 0; j < sh_per_se; j++) { 1564 for (j = 0; j < sh_per_se; j++) {
1555 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); 1565 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
1556 data = RREG32(mmSPI_STATIC_THREAD_MGMT_3); 1566 data = RREG32(mmSPI_STATIC_THREAD_MGMT_3);
1557 active_cu = gfx_v6_0_get_cu_enabled(adev, cu_per_sh); 1567 active_cu = gfx_v6_0_get_cu_enabled(adev);
1558 1568
1559 mask = 1; 1569 mask = 1;
1560 for (k = 0; k < 16; k++) { 1570 for (k = 0; k < 16; k++) {
@@ -2924,61 +2934,16 @@ static void gfx_v6_0_enable_gfx_cgpg(struct amdgpu_device *adev,
2924 } 2934 }
2925} 2935}
2926 2936
2927static u32 gfx_v6_0_get_cu_active_bitmap(struct amdgpu_device *adev,
2928 u32 se, u32 sh)
2929{
2930
2931 u32 mask = 0, tmp, tmp1;
2932 int i;
2933
2934 mutex_lock(&adev->grbm_idx_mutex);
2935 gfx_v6_0_select_se_sh(adev, se, sh, 0xffffffff);
2936 tmp = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
2937 tmp1 = RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
2938 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2939 mutex_unlock(&adev->grbm_idx_mutex);
2940
2941 tmp &= 0xffff0000;
2942
2943 tmp |= tmp1;
2944 tmp >>= 16;
2945
2946 for (i = 0; i < adev->gfx.config.max_cu_per_sh; i ++) {
2947 mask <<= 1;
2948 mask |= 1;
2949 }
2950
2951 return (~tmp) & mask;
2952}
2953
2954static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev) 2937static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev)
2955{ 2938{
2956 u32 i, j, k, active_cu_number = 0; 2939 u32 tmp;
2957 2940
2958 u32 mask, counter, cu_bitmap; 2941 WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, adev->gfx.cu_info.ao_cu_mask);
2959 u32 tmp = 0;
2960 2942
2961 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 2943 tmp = RREG32(mmRLC_MAX_PG_CU);
2962 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 2944 tmp &= ~RLC_MAX_PG_CU__MAX_POWERED_UP_CU_MASK;
2963 mask = 1; 2945 tmp |= (adev->gfx.cu_info.number << RLC_MAX_PG_CU__MAX_POWERED_UP_CU__SHIFT);
2964 cu_bitmap = 0; 2946 WREG32(mmRLC_MAX_PG_CU, tmp);
2965 counter = 0;
2966 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k++) {
2967 if (gfx_v6_0_get_cu_active_bitmap(adev, i, j) & mask) {
2968 if (counter < 2)
2969 cu_bitmap |= mask;
2970 counter++;
2971 }
2972 mask <<= 1;
2973 }
2974
2975 active_cu_number += counter;
2976 tmp |= (cu_bitmap << (i * 16 + j * 8));
2977 }
2978 }
2979
2980 WREG32(mmRLC_PG_AO_CU_MASK, tmp);
2981 WREG32_FIELD(RLC_MAX_PG_CU, MAX_POWERED_UP_CU, active_cu_number);
2982} 2947}
2983 2948
2984static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev, 2949static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev,
@@ -3753,18 +3718,26 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)
3753 int i, j, k, counter, active_cu_number = 0; 3718 int i, j, k, counter, active_cu_number = 0;
3754 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0; 3719 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
3755 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info; 3720 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
3721 unsigned disable_masks[4 * 2];
3756 3722
3757 memset(cu_info, 0, sizeof(*cu_info)); 3723 memset(cu_info, 0, sizeof(*cu_info));
3758 3724
3725 amdgpu_gfx_parse_disable_cu(disable_masks, 4, 2);
3726
3727 mutex_lock(&adev->grbm_idx_mutex);
3759 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 3728 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
3760 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 3729 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
3761 mask = 1; 3730 mask = 1;
3762 ao_bitmap = 0; 3731 ao_bitmap = 0;
3763 counter = 0; 3732 counter = 0;
3764 bitmap = gfx_v6_0_get_cu_active_bitmap(adev, i, j); 3733 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
3734 if (i < 4 && j < 2)
3735 gfx_v6_0_set_user_cu_inactive_bitmap(
3736 adev, disable_masks[i * 2 + j]);
3737 bitmap = gfx_v6_0_get_cu_enabled(adev);
3765 cu_info->bitmap[i][j] = bitmap; 3738 cu_info->bitmap[i][j] = bitmap;
3766 3739
3767 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) { 3740 for (k = 0; k < 16; k++) {
3768 if (bitmap & mask) { 3741 if (bitmap & mask) {
3769 if (counter < 2) 3742 if (counter < 2)
3770 ao_bitmap |= mask; 3743 ao_bitmap |= mask;
@@ -3777,6 +3750,9 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)
3777 } 3750 }
3778 } 3751 }
3779 3752
3753 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3754 mutex_unlock(&adev->grbm_idx_mutex);
3755
3780 cu_info->number = active_cu_number; 3756 cu_info->number = active_cu_number;
3781 cu_info->ao_cu_mask = ao_cu_mask; 3757 cu_info->ao_cu_mask = ao_cu_mask;
3782} 3758}