aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c216
1 files changed, 87 insertions, 129 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index c998f6aaaf36..2086e7e68de4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -1325,21 +1325,19 @@ static u32 gfx_v6_0_create_bitmask(u32 bit_width)
1325 return (u32)(((u64)1 << bit_width) - 1); 1325 return (u32)(((u64)1 << bit_width) - 1);
1326} 1326}
1327 1327
1328static u32 gfx_v6_0_get_rb_disabled(struct amdgpu_device *adev, 1328static u32 gfx_v6_0_get_rb_active_bitmap(struct amdgpu_device *adev)
1329 u32 max_rb_num_per_se,
1330 u32 sh_per_se)
1331{ 1329{
1332 u32 data, mask; 1330 u32 data, mask;
1333 1331
1334 data = RREG32(mmCC_RB_BACKEND_DISABLE); 1332 data = RREG32(mmCC_RB_BACKEND_DISABLE) |
1335 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; 1333 RREG32(mmGC_USER_RB_BACKEND_DISABLE);
1336 data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE);
1337 1334
1338 data >>= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT; 1335 data = REG_GET_FIELD(data, GC_USER_RB_BACKEND_DISABLE, BACKEND_DISABLE);
1339 1336
1340 mask = gfx_v6_0_create_bitmask(max_rb_num_per_se / sh_per_se); 1337 mask = gfx_v6_0_create_bitmask(adev->gfx.config.max_backends_per_se/
1338 adev->gfx.config.max_sh_per_se);
1341 1339
1342 return data & mask; 1340 return ~data & mask;
1343} 1341}
1344 1342
1345static void gfx_v6_0_raster_config(struct amdgpu_device *adev, u32 *rconf) 1343static void gfx_v6_0_raster_config(struct amdgpu_device *adev, u32 *rconf)
@@ -1468,68 +1466,55 @@ static void gfx_v6_0_write_harvested_raster_configs(struct amdgpu_device *adev,
1468 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1466 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1469} 1467}
1470 1468
1471static void gfx_v6_0_setup_rb(struct amdgpu_device *adev, 1469static void gfx_v6_0_setup_rb(struct amdgpu_device *adev)
1472 u32 se_num, u32 sh_per_se,
1473 u32 max_rb_num_per_se)
1474{ 1470{
1475 int i, j; 1471 int i, j;
1476 u32 data, mask; 1472 u32 data;
1477 u32 disabled_rbs = 0; 1473 u32 raster_config = 0;
1478 u32 enabled_rbs = 0; 1474 u32 active_rbs = 0;
1475 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
1476 adev->gfx.config.max_sh_per_se;
1479 unsigned num_rb_pipes; 1477 unsigned num_rb_pipes;
1480 1478
1481 mutex_lock(&adev->grbm_idx_mutex); 1479 mutex_lock(&adev->grbm_idx_mutex);
1482 for (i = 0; i < se_num; i++) { 1480 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1483 for (j = 0; j < sh_per_se; j++) { 1481 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
1484 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); 1482 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
1485 data = gfx_v6_0_get_rb_disabled(adev, max_rb_num_per_se, sh_per_se); 1483 data = gfx_v6_0_get_rb_active_bitmap(adev);
1486 disabled_rbs |= data << ((i * sh_per_se + j) * 2); 1484 active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
1485 rb_bitmap_width_per_sh);
1487 } 1486 }
1488 } 1487 }
1489 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1488 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1490 mutex_unlock(&adev->grbm_idx_mutex);
1491
1492 mask = 1;
1493 for (i = 0; i < max_rb_num_per_se * se_num; i++) {
1494 if (!(disabled_rbs & mask))
1495 enabled_rbs |= mask;
1496 mask <<= 1;
1497 }
1498 1489
1499 adev->gfx.config.backend_enable_mask = enabled_rbs; 1490 adev->gfx.config.backend_enable_mask = active_rbs;
1500 adev->gfx.config.num_rbs = hweight32(enabled_rbs); 1491 adev->gfx.config.num_rbs = hweight32(active_rbs);
1501 1492
1502 num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se * 1493 num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se *
1503 adev->gfx.config.max_shader_engines, 16); 1494 adev->gfx.config.max_shader_engines, 16);
1504 1495
1505 mutex_lock(&adev->grbm_idx_mutex); 1496 gfx_v6_0_raster_config(adev, &raster_config);
1506 for (i = 0; i < se_num; i++) {
1507 gfx_v6_0_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
1508 data = 0;
1509 for (j = 0; j < sh_per_se; j++) {
1510 switch (enabled_rbs & 3) {
1511 case 1:
1512 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
1513 break;
1514 case 2:
1515 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
1516 break;
1517 case 3:
1518 default:
1519 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
1520 break;
1521 }
1522 enabled_rbs >>= 2;
1523 }
1524 gfx_v6_0_raster_config(adev, &data);
1525 1497
1526 if (!adev->gfx.config.backend_enable_mask || 1498 if (!adev->gfx.config.backend_enable_mask ||
1527 adev->gfx.config.num_rbs >= num_rb_pipes) 1499 adev->gfx.config.num_rbs >= num_rb_pipes) {
1528 WREG32(mmPA_SC_RASTER_CONFIG, data); 1500 WREG32(mmPA_SC_RASTER_CONFIG, raster_config);
1529 else 1501 } else {
1530 gfx_v6_0_write_harvested_raster_configs(adev, data, 1502 gfx_v6_0_write_harvested_raster_configs(adev, raster_config,
1531 adev->gfx.config.backend_enable_mask, 1503 adev->gfx.config.backend_enable_mask,
1532 num_rb_pipes); 1504 num_rb_pipes);
1505 }
1506
1507 /* cache the values for userspace */
1508 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1509 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
1510 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
1511 adev->gfx.config.rb_config[i][j].rb_backend_disable =
1512 RREG32(mmCC_RB_BACKEND_DISABLE);
1513 adev->gfx.config.rb_config[i][j].user_rb_backend_disable =
1514 RREG32(mmGC_USER_RB_BACKEND_DISABLE);
1515 adev->gfx.config.rb_config[i][j].raster_config =
1516 RREG32(mmPA_SC_RASTER_CONFIG);
1517 }
1533 } 1518 }
1534 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1519 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1535 mutex_unlock(&adev->grbm_idx_mutex); 1520 mutex_unlock(&adev->grbm_idx_mutex);
@@ -1540,36 +1525,44 @@ static void gmc_v6_0_init_compute_vmid(struct amdgpu_device *adev)
1540} 1525}
1541*/ 1526*/
1542 1527
1543static 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)
1544{ 1530{
1545 u32 data, mask; 1531 u32 data;
1546 1532
1547 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG); 1533 if (!bitmap)
1548 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; 1534 return;
1549 data |= RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
1550 1535
1551 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;
1552 1538
1553 mask = gfx_v6_0_create_bitmask(cu_per_sh); 1539 WREG32(mmGC_USER_SHADER_ARRAY_CONFIG, data);
1540}
1554 1541
1555 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;
1556} 1551}
1557 1552
1558 1553
1559static void gfx_v6_0_setup_spi(struct amdgpu_device *adev, 1554static void gfx_v6_0_setup_spi(struct amdgpu_device *adev)
1560 u32 se_num, u32 sh_per_se,
1561 u32 cu_per_sh)
1562{ 1555{
1563 int i, j, k; 1556 int i, j, k;
1564 u32 data, mask; 1557 u32 data, mask;
1565 u32 active_cu = 0; 1558 u32 active_cu = 0;
1566 1559
1567 mutex_lock(&adev->grbm_idx_mutex); 1560 mutex_lock(&adev->grbm_idx_mutex);
1568 for (i = 0; i < se_num; i++) { 1561 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1569 for (j = 0; j < sh_per_se; j++) { 1562 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
1570 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); 1563 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
1571 data = RREG32(mmSPI_STATIC_THREAD_MGMT_3); 1564 data = RREG32(mmSPI_STATIC_THREAD_MGMT_3);
1572 active_cu = gfx_v6_0_get_cu_enabled(adev, cu_per_sh); 1565 active_cu = gfx_v6_0_get_cu_enabled(adev);
1573 1566
1574 mask = 1; 1567 mask = 1;
1575 for (k = 0; k < 16; k++) { 1568 for (k = 0; k < 16; k++) {
@@ -1717,6 +1710,9 @@ static void gfx_v6_0_gpu_init(struct amdgpu_device *adev)
1717 gb_addr_config |= 2 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT; 1710 gb_addr_config |= 2 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT;
1718 break; 1711 break;
1719 } 1712 }
1713 gb_addr_config &= ~GB_ADDR_CONFIG__NUM_SHADER_ENGINES_MASK;
1714 if (adev->gfx.config.max_shader_engines == 2)
1715 gb_addr_config |= 1 << GB_ADDR_CONFIG__NUM_SHADER_ENGINES__SHIFT;
1720 adev->gfx.config.gb_addr_config = gb_addr_config; 1716 adev->gfx.config.gb_addr_config = gb_addr_config;
1721 1717
1722 WREG32(mmGB_ADDR_CONFIG, gb_addr_config); 1718 WREG32(mmGB_ADDR_CONFIG, gb_addr_config);
@@ -1735,13 +1731,9 @@ static void gfx_v6_0_gpu_init(struct amdgpu_device *adev)
1735#endif 1731#endif
1736 gfx_v6_0_tiling_mode_table_init(adev); 1732 gfx_v6_0_tiling_mode_table_init(adev);
1737 1733
1738 gfx_v6_0_setup_rb(adev, adev->gfx.config.max_shader_engines, 1734 gfx_v6_0_setup_rb(adev);
1739 adev->gfx.config.max_sh_per_se,
1740 adev->gfx.config.max_backends_per_se);
1741 1735
1742 gfx_v6_0_setup_spi(adev, adev->gfx.config.max_shader_engines, 1736 gfx_v6_0_setup_spi(adev);
1743 adev->gfx.config.max_sh_per_se,
1744 adev->gfx.config.max_cu_per_sh);
1745 1737
1746 gfx_v6_0_get_cu_info(adev); 1738 gfx_v6_0_get_cu_info(adev);
1747 1739
@@ -2941,61 +2933,16 @@ static void gfx_v6_0_enable_gfx_cgpg(struct amdgpu_device *adev,
2941 } 2933 }
2942} 2934}
2943 2935
2944static u32 gfx_v6_0_get_cu_active_bitmap(struct amdgpu_device *adev,
2945 u32 se, u32 sh)
2946{
2947
2948 u32 mask = 0, tmp, tmp1;
2949 int i;
2950
2951 mutex_lock(&adev->grbm_idx_mutex);
2952 gfx_v6_0_select_se_sh(adev, se, sh, 0xffffffff);
2953 tmp = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG);
2954 tmp1 = RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
2955 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2956 mutex_unlock(&adev->grbm_idx_mutex);
2957
2958 tmp &= 0xffff0000;
2959
2960 tmp |= tmp1;
2961 tmp >>= 16;
2962
2963 for (i = 0; i < adev->gfx.config.max_cu_per_sh; i ++) {
2964 mask <<= 1;
2965 mask |= 1;
2966 }
2967
2968 return (~tmp) & mask;
2969}
2970
2971static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev) 2936static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev)
2972{ 2937{
2973 u32 i, j, k, active_cu_number = 0; 2938 u32 tmp;
2974
2975 u32 mask, counter, cu_bitmap;
2976 u32 tmp = 0;
2977
2978 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
2979 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
2980 mask = 1;
2981 cu_bitmap = 0;
2982 counter = 0;
2983 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k++) {
2984 if (gfx_v6_0_get_cu_active_bitmap(adev, i, j) & mask) {
2985 if (counter < 2)
2986 cu_bitmap |= mask;
2987 counter++;
2988 }
2989 mask <<= 1;
2990 }
2991 2939
2992 active_cu_number += counter; 2940 WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, adev->gfx.cu_info.ao_cu_mask);
2993 tmp |= (cu_bitmap << (i * 16 + j * 8));
2994 }
2995 }
2996 2941
2997 WREG32(mmRLC_PG_AO_CU_MASK, tmp); 2942 tmp = RREG32(mmRLC_MAX_PG_CU);
2998 WREG32_FIELD(RLC_MAX_PG_CU, MAX_POWERED_UP_CU, active_cu_number); 2943 tmp &= ~RLC_MAX_PG_CU__MAX_POWERED_UP_CU_MASK;
2944 tmp |= (adev->gfx.cu_info.number << RLC_MAX_PG_CU__MAX_POWERED_UP_CU__SHIFT);
2945 WREG32(mmRLC_MAX_PG_CU, tmp);
2999} 2946}
3000 2947
3001static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev, 2948static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev,
@@ -3770,18 +3717,26 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)
3770 int i, j, k, counter, active_cu_number = 0; 3717 int i, j, k, counter, active_cu_number = 0;
3771 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0; 3718 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
3772 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info; 3719 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
3720 unsigned disable_masks[4 * 2];
3773 3721
3774 memset(cu_info, 0, sizeof(*cu_info)); 3722 memset(cu_info, 0, sizeof(*cu_info));
3775 3723
3724 amdgpu_gfx_parse_disable_cu(disable_masks, 4, 2);
3725
3726 mutex_lock(&adev->grbm_idx_mutex);
3776 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 3727 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
3777 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 3728 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
3778 mask = 1; 3729 mask = 1;
3779 ao_bitmap = 0; 3730 ao_bitmap = 0;
3780 counter = 0; 3731 counter = 0;
3781 bitmap = gfx_v6_0_get_cu_active_bitmap(adev, i, j); 3732 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
3733 if (i < 4 && j < 2)
3734 gfx_v6_0_set_user_cu_inactive_bitmap(
3735 adev, disable_masks[i * 2 + j]);
3736 bitmap = gfx_v6_0_get_cu_enabled(adev);
3782 cu_info->bitmap[i][j] = bitmap; 3737 cu_info->bitmap[i][j] = bitmap;
3783 3738
3784 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) { 3739 for (k = 0; k < 16; k++) {
3785 if (bitmap & mask) { 3740 if (bitmap & mask) {
3786 if (counter < 2) 3741 if (counter < 2)
3787 ao_bitmap |= mask; 3742 ao_bitmap |= mask;
@@ -3794,6 +3749,9 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)
3794 } 3749 }
3795 } 3750 }
3796 3751
3752 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3753 mutex_unlock(&adev->grbm_idx_mutex);
3754
3797 cu_info->number = active_cu_number; 3755 cu_info->number = active_cu_number;
3798 cu_info->ao_cu_mask = ao_cu_mask; 3756 cu_info->ao_cu_mask = ao_cu_mask;
3799} 3757}