diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 216 |
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 | ||
1328 | static u32 gfx_v6_0_get_rb_disabled(struct amdgpu_device *adev, | 1328 | static 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 | ||
1345 | static void gfx_v6_0_raster_config(struct amdgpu_device *adev, u32 *rconf) | 1343 | static 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 | ||
1471 | static void gfx_v6_0_setup_rb(struct amdgpu_device *adev, | 1469 | static 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 | ||
1543 | 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) | ||
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; | 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; | ||
1556 | } | 1551 | } |
1557 | 1552 | ||
1558 | 1553 | ||
1559 | static void gfx_v6_0_setup_spi(struct amdgpu_device *adev, | 1554 | static 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 | ||
2944 | static 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 | |||
2971 | static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev) | 2936 | static 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 | ||
3001 | static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev, | 2948 | static 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 | } |