diff options
author | Flora Cui <Flora.Cui@amd.com> | 2017-02-07 02:18:27 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-02-08 17:23:52 -0500 |
commit | 375d6f7057a9cbcc2867e2d3ccb40008dea55598 (patch) | |
tree | b2e8def575193fb24efca0c65f3608a0c2f2527e /drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | |
parent | 69dd3d2c618d6127efca47d1ffdecce453ff0c80 (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.c | 100 |
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 | ||
1528 | static u32 gfx_v6_0_get_cu_enabled(struct amdgpu_device *adev, u32 cu_per_sh) | 1528 | static 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; | 1542 | static 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 | ||
2927 | static 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 | |||
2954 | static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev) | 2937 | static 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 | ||
2984 | static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev, | 2949 | static 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 | } |