aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2016-02-12 00:39:13 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-02-12 15:47:18 -0500
commit8f8e00c17e63c8893890c9440ad30dbef77ffe58 (patch)
tree28d02cec68c086a13c9a8745ff510e3ed57077d2 /drivers/gpu/drm/amd
parenta750b47e49f85041d894ef3a5e77bce64a60c6a0 (diff)
drm/amdgpu/gfx: clean up harvest configuration (v2)
Read back harvest configuration from registers and simplify calculations. No need to program the raster config registers. These are programmed as golden registers and the user mode drivers program them as well. v2: rebase on Tom's patches Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c127
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c131
4 files changed, 82 insertions, 180 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 37ac1b2bbadc..588e86c7c5cc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1133,6 +1133,7 @@ struct amdgpu_gca_config {
1133 unsigned multi_gpu_tile_size; 1133 unsigned multi_gpu_tile_size;
1134 unsigned mc_arb_ramcfg; 1134 unsigned mc_arb_ramcfg;
1135 unsigned gb_addr_config; 1135 unsigned gb_addr_config;
1136 unsigned num_rbs;
1136 1137
1137 uint32_t tile_mode_array[32]; 1138 uint32_t tile_mode_array[32];
1138 uint32_t macrotile_mode_array[16]; 1139 uint32_t macrotile_mode_array[16];
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 56f771e6dfa5..7805a8706af7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -447,8 +447,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
447 dev_info.max_memory_clock = adev->pm.default_mclk * 10; 447 dev_info.max_memory_clock = adev->pm.default_mclk * 10;
448 } 448 }
449 dev_info.enabled_rb_pipes_mask = adev->gfx.config.backend_enable_mask; 449 dev_info.enabled_rb_pipes_mask = adev->gfx.config.backend_enable_mask;
450 dev_info.num_rb_pipes = adev->gfx.config.max_backends_per_se * 450 dev_info.num_rb_pipes = adev->gfx.config.num_rbs;
451 adev->gfx.config.max_shader_engines;
452 dev_info.num_hw_gfx_contexts = adev->gfx.config.max_hw_contexts; 451 dev_info.num_hw_gfx_contexts = adev->gfx.config.max_hw_contexts;
453 dev_info._pad = 0; 452 dev_info._pad = 0;
454 dev_info.ids_flags = 0; 453 dev_info.ids_flags = 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 8809616bc750..0358830bd5ac 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -1598,39 +1598,31 @@ void gfx_v7_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num)
1598 */ 1598 */
1599static u32 gfx_v7_0_create_bitmask(u32 bit_width) 1599static u32 gfx_v7_0_create_bitmask(u32 bit_width)
1600{ 1600{
1601 return (u32)((1ULL<<bit_width)-1); 1601 return (u32)((1ULL << bit_width) - 1);
1602} 1602}
1603 1603
1604/** 1604/**
1605 * gfx_v7_0_get_rb_disabled - computes the mask of disabled RBs 1605 * gfx_v7_0_get_rb_active_bitmap - computes the mask of enabled RBs
1606 * 1606 *
1607 * @adev: amdgpu_device pointer 1607 * @adev: amdgpu_device pointer
1608 * @max_rb_num: max RBs (render backends) for the asic
1609 * @se_num: number of SEs (shader engines) for the asic
1610 * @sh_per_se: number of SH blocks per SE for the asic
1611 * 1608 *
1612 * Calculates the bitmask of disabled RBs (CIK). 1609 * Calculates the bitmask of enabled RBs (CIK).
1613 * Returns the disabled RB bitmask. 1610 * Returns the enabled RB bitmask.
1614 */ 1611 */
1615static u32 gfx_v7_0_get_rb_disabled(struct amdgpu_device *adev, 1612static u32 gfx_v7_0_get_rb_active_bitmap(struct amdgpu_device *adev)
1616 u32 max_rb_num_per_se,
1617 u32 sh_per_se)
1618{ 1613{
1619 u32 data, mask; 1614 u32 data, mask;
1620 1615
1621 data = RREG32(mmCC_RB_BACKEND_DISABLE); 1616 data = RREG32(mmCC_RB_BACKEND_DISABLE);
1622 if (data & 1)
1623 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
1624 else
1625 data = 0;
1626
1627 data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); 1617 data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE);
1628 1618
1619 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
1629 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT; 1620 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT;
1630 1621
1631 mask = gfx_v7_0_create_bitmask(max_rb_num_per_se / sh_per_se); 1622 mask = gfx_v7_0_create_bitmask(adev->gfx.config.max_backends_per_se /
1623 adev->gfx.config.max_sh_per_se);
1632 1624
1633 return data & mask; 1625 return (~data) & mask;
1634} 1626}
1635 1627
1636/** 1628/**
@@ -1639,68 +1631,36 @@ static u32 gfx_v7_0_get_rb_disabled(struct amdgpu_device *adev,
1639 * @adev: amdgpu_device pointer 1631 * @adev: amdgpu_device pointer
1640 * @se_num: number of SEs (shader engines) for the asic 1632 * @se_num: number of SEs (shader engines) for the asic
1641 * @sh_per_se: number of SH blocks per SE for the asic 1633 * @sh_per_se: number of SH blocks per SE for the asic
1642 * @max_rb_num: max RBs (render backends) for the asic
1643 * 1634 *
1644 * Configures per-SE/SH RB registers (CIK). 1635 * Configures per-SE/SH RB registers (CIK).
1645 */ 1636 */
1646static void gfx_v7_0_setup_rb(struct amdgpu_device *adev, 1637static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)
1647 u32 se_num, u32 sh_per_se,
1648 u32 max_rb_num_per_se)
1649{ 1638{
1650 int i, j; 1639 int i, j;
1651 u32 data; 1640 u32 data, tmp, num_rbs = 0;
1652 u32 disabled_rbs = 0; 1641 u32 active_rbs = 0;
1653 u32 enabled_rbs = 0;
1654 1642
1655 mutex_lock(&adev->grbm_idx_mutex); 1643 mutex_lock(&adev->grbm_idx_mutex);
1656 for (i = 0; i < se_num; i++) { 1644 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1657 for (j = 0; j < sh_per_se; j++) { 1645 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
1658 gfx_v7_0_select_se_sh(adev, i, j); 1646 gfx_v7_0_select_se_sh(adev, i, j);
1659 data = gfx_v7_0_get_rb_disabled(adev, max_rb_num_per_se, sh_per_se); 1647 data = gfx_v7_0_get_rb_active_bitmap(adev);
1660 if (adev->asic_type == CHIP_HAWAII) 1648 if (adev->asic_type == CHIP_HAWAII)
1661 disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH); 1649 active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
1650 HAWAII_RB_BITMAP_WIDTH_PER_SH);
1662 else 1651 else
1663 disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH); 1652 active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
1653 CIK_RB_BITMAP_WIDTH_PER_SH);
1664 } 1654 }
1665 } 1655 }
1666 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff); 1656 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
1667 mutex_unlock(&adev->grbm_idx_mutex); 1657 mutex_unlock(&adev->grbm_idx_mutex);
1668 1658
1669 enabled_rbs = (~disabled_rbs) & ((1UL<<(max_rb_num_per_se*se_num))-1); 1659 adev->gfx.config.backend_enable_mask = active_rbs;
1670 1660 tmp = active_rbs;
1671 adev->gfx.config.backend_enable_mask = enabled_rbs; 1661 while (tmp >>= 1)
1672 1662 num_rbs++;
1673 mutex_lock(&adev->grbm_idx_mutex); 1663 adev->gfx.config.num_rbs = num_rbs;
1674 for (i = 0; i < se_num; i++) {
1675 gfx_v7_0_select_se_sh(adev, i, 0xffffffff);
1676 data = 0;
1677 for (j = 0; j < sh_per_se; j++) {
1678 switch (enabled_rbs & 3) {
1679 case 0:
1680 if (j == 0)
1681 data |= (RASTER_CONFIG_RB_MAP_3 <<
1682 PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT);
1683 else
1684 data |= (RASTER_CONFIG_RB_MAP_0 <<
1685 PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT);
1686 break;
1687 case 1:
1688 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
1689 break;
1690 case 2:
1691 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
1692 break;
1693 case 3:
1694 default:
1695 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
1696 break;
1697 }
1698 enabled_rbs >>= 2;
1699 }
1700 WREG32(mmPA_SC_RASTER_CONFIG, data);
1701 }
1702 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
1703 mutex_unlock(&adev->grbm_idx_mutex);
1704} 1664}
1705 1665
1706/** 1666/**
@@ -1931,9 +1891,7 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
1931 1891
1932 gfx_v7_0_tiling_mode_table_init(adev); 1892 gfx_v7_0_tiling_mode_table_init(adev);
1933 1893
1934 gfx_v7_0_setup_rb(adev, adev->gfx.config.max_shader_engines, 1894 gfx_v7_0_setup_rb(adev);
1935 adev->gfx.config.max_sh_per_se,
1936 adev->gfx.config.max_backends_per_se);
1937 1895
1938 /* set HW defaults for 3D engine */ 1896 /* set HW defaults for 3D engine */
1939 WREG32(mmCP_MEQ_THRESHOLDS, 1897 WREG32(mmCP_MEQ_THRESHOLDS,
@@ -4026,28 +3984,20 @@ static void gfx_v7_0_enable_gfx_cgpg(struct amdgpu_device *adev,
4026 } 3984 }
4027} 3985}
4028 3986
4029static u32 gfx_v7_0_get_cu_active_bitmap(struct amdgpu_device *adev, 3987static u32 gfx_v7_0_get_cu_active_bitmap(struct amdgpu_device *adev)
4030 u32 se, u32 sh)
4031{ 3988{
4032 u32 mask = 0, tmp, tmp1; 3989 u32 data, mask;
4033 int i;
4034
4035 gfx_v7_0_select_se_sh(adev, se, sh);
4036 tmp = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
4037 tmp1 = RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
4038 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
4039 3990
4040 tmp &= 0xffff0000; 3991 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
3992 data |= RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
4041 3993
4042 tmp |= tmp1; 3994 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
4043 tmp >>= 16; 3995 data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
4044 3996
4045 for (i = 0; i < adev->gfx.config.max_cu_per_sh; i ++) { 3997 mask = gfx_v7_0_create_bitmask(adev->gfx.config.max_backends_per_se /
4046 mask <<= 1; 3998 adev->gfx.config.max_sh_per_se);
4047 mask |= 1;
4048 }
4049 3999
4050 return (~tmp) & mask; 4000 return (~data) & mask;
4051} 4001}
4052 4002
4053static void gfx_v7_0_init_ao_cu_mask(struct amdgpu_device *adev) 4003static void gfx_v7_0_init_ao_cu_mask(struct amdgpu_device *adev)
@@ -5304,10 +5254,11 @@ int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
5304 mask = 1; 5254 mask = 1;
5305 ao_bitmap = 0; 5255 ao_bitmap = 0;
5306 counter = 0; 5256 counter = 0;
5307 bitmap = gfx_v7_0_get_cu_active_bitmap(adev, i, j); 5257 gfx_v7_0_select_se_sh(adev, i, j);
5258 bitmap = gfx_v7_0_get_cu_active_bitmap(adev);
5308 cu_info->bitmap[i][j] = bitmap; 5259 cu_info->bitmap[i][j] = bitmap;
5309 5260
5310 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) { 5261 for (k = 0; k < 16; k ++) {
5311 if (bitmap & mask) { 5262 if (bitmap & mask) {
5312 if (counter < 2) 5263 if (counter < 2)
5313 ao_bitmap |= mask; 5264 ao_bitmap |= mask;
@@ -5319,9 +5270,11 @@ int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
5319 ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8)); 5270 ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
5320 } 5271 }
5321 } 5272 }
5273 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
5274 mutex_unlock(&adev->grbm_idx_mutex);
5322 5275
5323 cu_info->number = active_cu_number; 5276 cu_info->number = active_cu_number;
5324 cu_info->ao_cu_mask = ao_cu_mask; 5277 cu_info->ao_cu_mask = ao_cu_mask;
5325 mutex_unlock(&adev->grbm_idx_mutex); 5278
5326 return 0; 5279 return 0;
5327} 5280}
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 415da6e100cd..ea137bfe4b72 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -2572,11 +2572,6 @@ static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev)
2572 } 2572 }
2573} 2573}
2574 2574
2575static u32 gfx_v8_0_create_bitmask(u32 bit_width)
2576{
2577 return (u32)((1ULL << bit_width) - 1);
2578}
2579
2580void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num) 2575void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num)
2581{ 2576{
2582 u32 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1); 2577 u32 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1);
@@ -2597,89 +2592,50 @@ void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num)
2597 WREG32(mmGRBM_GFX_INDEX, data); 2592 WREG32(mmGRBM_GFX_INDEX, data);
2598} 2593}
2599 2594
2600static u32 gfx_v8_0_get_rb_disabled(struct amdgpu_device *adev, 2595static u32 gfx_v8_0_create_bitmask(u32 bit_width)
2601 u32 max_rb_num_per_se, 2596{
2602 u32 sh_per_se) 2597 return (u32)((1ULL << bit_width) - 1);
2598}
2599
2600static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
2603{ 2601{
2604 u32 data, mask; 2602 u32 data, mask;
2605 2603
2606 data = RREG32(mmCC_RB_BACKEND_DISABLE); 2604 data = RREG32(mmCC_RB_BACKEND_DISABLE);
2607 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
2608
2609 data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); 2605 data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE);
2610 2606
2607 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
2611 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT; 2608 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT;
2612 2609
2613 mask = gfx_v8_0_create_bitmask(max_rb_num_per_se / sh_per_se); 2610 mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_backends_per_se /
2611 adev->gfx.config.max_sh_per_se);
2614 2612
2615 return data & mask; 2613 return (~data) & mask;
2616} 2614}
2617 2615
2618static void gfx_v8_0_setup_rb(struct amdgpu_device *adev, 2616static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)
2619 u32 se_num, u32 sh_per_se,
2620 u32 max_rb_num_per_se)
2621{ 2617{
2622 int i, j; 2618 int i, j;
2623 u32 data, mask; 2619 u32 data, tmp, num_rbs = 0;
2624 u32 disabled_rbs = 0; 2620 u32 active_rbs = 0;
2625 u32 enabled_rbs = 0;
2626 2621
2627 mutex_lock(&adev->grbm_idx_mutex); 2622 mutex_lock(&adev->grbm_idx_mutex);
2628 for (i = 0; i < se_num; i++) { 2623 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
2629 for (j = 0; j < sh_per_se; j++) { 2624 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
2630 gfx_v8_0_select_se_sh(adev, i, j); 2625 gfx_v8_0_select_se_sh(adev, i, j);
2631 data = gfx_v8_0_get_rb_disabled(adev, 2626 data = gfx_v8_0_get_rb_active_bitmap(adev);
2632 max_rb_num_per_se, sh_per_se); 2627 active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
2633 disabled_rbs |= data << ((i * sh_per_se + j) * 2628 RB_BITMAP_WIDTH_PER_SH);
2634 RB_BITMAP_WIDTH_PER_SH);
2635 } 2629 }
2636 } 2630 }
2637 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff); 2631 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
2638 mutex_unlock(&adev->grbm_idx_mutex); 2632 mutex_unlock(&adev->grbm_idx_mutex);
2639 2633
2640 mask = 1; 2634 adev->gfx.config.backend_enable_mask = active_rbs;
2641 for (i = 0; i < max_rb_num_per_se * se_num; i++) { 2635 tmp = active_rbs;
2642 if (!(disabled_rbs & mask)) 2636 while (tmp >>= 1)
2643 enabled_rbs |= mask; 2637 num_rbs++;
2644 mask <<= 1; 2638 adev->gfx.config.num_rbs = num_rbs;
2645 }
2646
2647 adev->gfx.config.backend_enable_mask = enabled_rbs;
2648
2649 mutex_lock(&adev->grbm_idx_mutex);
2650 for (i = 0; i < se_num; i++) {
2651 gfx_v8_0_select_se_sh(adev, i, 0xffffffff);
2652 data = RREG32(mmPA_SC_RASTER_CONFIG);
2653 for (j = 0; j < sh_per_se; j++) {
2654 switch (enabled_rbs & 3) {
2655 case 0:
2656 if (j == 0)
2657 data |= (RASTER_CONFIG_RB_MAP_3 <<
2658 PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT);
2659 else
2660 data |= (RASTER_CONFIG_RB_MAP_0 <<
2661 PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT);
2662 break;
2663 case 1:
2664 data |= (RASTER_CONFIG_RB_MAP_0 <<
2665 (i * sh_per_se + j) * 2);
2666 break;
2667 case 2:
2668 data |= (RASTER_CONFIG_RB_MAP_3 <<
2669 (i * sh_per_se + j) * 2);
2670 break;
2671 case 3:
2672 default:
2673 data |= (RASTER_CONFIG_RB_MAP_2 <<
2674 (i * sh_per_se + j) * 2);
2675 break;
2676 }
2677 enabled_rbs >>= 2;
2678 }
2679 WREG32(mmPA_SC_RASTER_CONFIG, data);
2680 }
2681 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
2682 mutex_unlock(&adev->grbm_idx_mutex);
2683} 2639}
2684 2640
2685/** 2641/**
@@ -2749,9 +2705,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
2749 2705
2750 gfx_v8_0_tiling_mode_table_init(adev); 2706 gfx_v8_0_tiling_mode_table_init(adev);
2751 2707
2752 gfx_v8_0_setup_rb(adev, adev->gfx.config.max_shader_engines, 2708 gfx_v8_0_setup_rb(adev);
2753 adev->gfx.config.max_sh_per_se,
2754 adev->gfx.config.max_backends_per_se);
2755 2709
2756 /* XXX SH_MEM regs */ 2710 /* XXX SH_MEM regs */
2757 /* where to put LDS, scratch, GPUVM in FSA64 space */ 2711 /* where to put LDS, scratch, GPUVM in FSA64 space */
@@ -5187,32 +5141,24 @@ static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev)
5187 } 5141 }
5188} 5142}
5189 5143
5190static u32 gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device *adev, 5144static u32 gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device *adev)
5191 u32 se, u32 sh)
5192{ 5145{
5193 u32 mask = 0, tmp, tmp1; 5146 u32 data, mask;
5194 int i;
5195 5147
5196 gfx_v8_0_select_se_sh(adev, se, sh); 5148 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
5197 tmp = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG); 5149 data |= RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
5198 tmp1 = RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
5199 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
5200 5150
5201 tmp &= 0xffff0000; 5151 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
5152 data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
5202 5153
5203 tmp |= tmp1; 5154 mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_backends_per_se /
5204 tmp >>= 16; 5155 adev->gfx.config.max_sh_per_se);
5205 5156
5206 for (i = 0; i < adev->gfx.config.max_cu_per_sh; i ++) { 5157 return (~data) & mask;
5207 mask <<= 1;
5208 mask |= 1;
5209 }
5210
5211 return (~tmp) & mask;
5212} 5158}
5213 5159
5214int gfx_v8_0_get_cu_info(struct amdgpu_device *adev, 5160int gfx_v8_0_get_cu_info(struct amdgpu_device *adev,
5215 struct amdgpu_cu_info *cu_info) 5161 struct amdgpu_cu_info *cu_info)
5216{ 5162{
5217 int i, j, k, counter, active_cu_number = 0; 5163 int i, j, k, counter, active_cu_number = 0;
5218 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0; 5164 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
@@ -5226,10 +5172,11 @@ int gfx_v8_0_get_cu_info(struct amdgpu_device *adev,
5226 mask = 1; 5172 mask = 1;
5227 ao_bitmap = 0; 5173 ao_bitmap = 0;
5228 counter = 0; 5174 counter = 0;
5229 bitmap = gfx_v8_0_get_cu_active_bitmap(adev, i, j); 5175 gfx_v8_0_select_se_sh(adev, i, j);
5176 bitmap = gfx_v8_0_get_cu_active_bitmap(adev);
5230 cu_info->bitmap[i][j] = bitmap; 5177 cu_info->bitmap[i][j] = bitmap;
5231 5178
5232 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) { 5179 for (k = 0; k < 16; k ++) {
5233 if (bitmap & mask) { 5180 if (bitmap & mask) {
5234 if (counter < 2) 5181 if (counter < 2)
5235 ao_bitmap |= mask; 5182 ao_bitmap |= mask;
@@ -5241,9 +5188,11 @@ int gfx_v8_0_get_cu_info(struct amdgpu_device *adev,
5241 ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8)); 5188 ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
5242 } 5189 }
5243 } 5190 }
5191 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
5192 mutex_unlock(&adev->grbm_idx_mutex);
5244 5193
5245 cu_info->number = active_cu_number; 5194 cu_info->number = active_cu_number;
5246 cu_info->ao_cu_mask = ao_cu_mask; 5195 cu_info->ao_cu_mask = ao_cu_mask;
5247 mutex_unlock(&adev->grbm_idx_mutex); 5196
5248 return 0; 5197 return 0;
5249} 5198}