aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-06-02 16:13:21 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-06-09 22:06:55 -0400
commit65fcf668ee7f2de2fbd580e1297336045f1ef6f4 (patch)
tree17064a99c2cf9b0e6d4baab83e654758edef4617 /drivers
parent478b6e72721807953bc3513fc5895d5f007614e3 (diff)
drm/radeon: add query for number of active CUs
Query to find out how many compute units on a GPU. Useful for OpenCL usermode drivers. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/cik.c12
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c12
-rw-r--r--drivers/gpu/drm/radeon/ni.c12
-rw-r--r--drivers/gpu/drm/radeon/r600.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon.h6
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c16
-rw-r--r--drivers/gpu/drm/radeon/rv770.c3
-rw-r--r--drivers/gpu/drm/radeon/si.c11
9 files changed, 75 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index e4b2f2b51bb8..dcd4518a9b08 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -80,6 +80,7 @@ extern int sumo_rlc_init(struct radeon_device *rdev);
80extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 80extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
81extern void si_rlc_reset(struct radeon_device *rdev); 81extern void si_rlc_reset(struct radeon_device *rdev);
82extern void si_init_uvd_internal_cg(struct radeon_device *rdev); 82extern void si_init_uvd_internal_cg(struct radeon_device *rdev);
83static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
83extern int cik_sdma_resume(struct radeon_device *rdev); 84extern int cik_sdma_resume(struct radeon_device *rdev);
84extern void cik_sdma_enable(struct radeon_device *rdev, bool enable); 85extern void cik_sdma_enable(struct radeon_device *rdev, bool enable);
85extern void cik_sdma_fini(struct radeon_device *rdev); 86extern void cik_sdma_fini(struct radeon_device *rdev);
@@ -3257,7 +3258,7 @@ static void cik_gpu_init(struct radeon_device *rdev)
3257 u32 mc_shared_chmap, mc_arb_ramcfg; 3258 u32 mc_shared_chmap, mc_arb_ramcfg;
3258 u32 hdp_host_path_cntl; 3259 u32 hdp_host_path_cntl;
3259 u32 tmp; 3260 u32 tmp;
3260 int i, j; 3261 int i, j, k;
3261 3262
3262 switch (rdev->family) { 3263 switch (rdev->family) {
3263 case CHIP_BONAIRE: 3264 case CHIP_BONAIRE:
@@ -3446,6 +3447,15 @@ static void cik_gpu_init(struct radeon_device *rdev)
3446 rdev->config.cik.max_sh_per_se, 3447 rdev->config.cik.max_sh_per_se,
3447 rdev->config.cik.max_backends_per_se); 3448 rdev->config.cik.max_backends_per_se);
3448 3449
3450 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
3451 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
3452 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k++) {
3453 rdev->config.cik.active_cus +=
3454 hweight32(cik_get_cu_active_bitmap(rdev, i, j));
3455 }
3456 }
3457 }
3458
3449 /* set HW defaults for 3D engine */ 3459 /* set HW defaults for 3D engine */
3450 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60)); 3460 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3451 3461
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 653eff814504..e2f605224e8c 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -3337,6 +3337,18 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
3337 disabled_rb_mask &= ~(1 << i); 3337 disabled_rb_mask &= ~(1 << i);
3338 } 3338 }
3339 3339
3340 for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
3341 u32 simd_disable_bitmap;
3342
3343 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3344 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3345 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
3346 simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
3347 tmp <<= 16;
3348 tmp |= simd_disable_bitmap;
3349 }
3350 rdev->config.evergreen.active_simds = hweight32(~tmp);
3351
3340 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 3352 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3341 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 3353 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3342 3354
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index c0fd8f647cf0..5a33ca681867 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1057,6 +1057,18 @@ static void cayman_gpu_init(struct radeon_device *rdev)
1057 disabled_rb_mask &= ~(1 << i); 1057 disabled_rb_mask &= ~(1 << i);
1058 } 1058 }
1059 1059
1060 for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
1061 u32 simd_disable_bitmap;
1062
1063 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1064 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1065 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
1066 simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
1067 tmp <<= 16;
1068 tmp |= simd_disable_bitmap;
1069 }
1070 rdev->config.cayman.active_simds = hweight32(~tmp);
1071
1060 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1072 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1061 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1073 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1062 1074
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index c2ff17cebd91..c66952d4b00c 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1958,6 +1958,9 @@ static void r600_gpu_init(struct radeon_device *rdev)
1958 if (tmp < rdev->config.r600.max_simds) { 1958 if (tmp < rdev->config.r600.max_simds) {
1959 rdev->config.r600.max_simds = tmp; 1959 rdev->config.r600.max_simds = tmp;
1960 } 1960 }
1961 tmp = rdev->config.r600.max_simds -
1962 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK);
1963 rdev->config.r600.active_simds = tmp;
1961 1964
1962 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; 1965 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK;
1963 tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 1966 tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index dd77111096bd..4b0bbf88d5c0 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1932,6 +1932,7 @@ struct r600_asic {
1932 unsigned tiling_group_size; 1932 unsigned tiling_group_size;
1933 unsigned tile_config; 1933 unsigned tile_config;
1934 unsigned backend_map; 1934 unsigned backend_map;
1935 unsigned active_simds;
1935}; 1936};
1936 1937
1937struct rv770_asic { 1938struct rv770_asic {
@@ -1957,6 +1958,7 @@ struct rv770_asic {
1957 unsigned tiling_group_size; 1958 unsigned tiling_group_size;
1958 unsigned tile_config; 1959 unsigned tile_config;
1959 unsigned backend_map; 1960 unsigned backend_map;
1961 unsigned active_simds;
1960}; 1962};
1961 1963
1962struct evergreen_asic { 1964struct evergreen_asic {
@@ -1983,6 +1985,7 @@ struct evergreen_asic {
1983 unsigned tiling_group_size; 1985 unsigned tiling_group_size;
1984 unsigned tile_config; 1986 unsigned tile_config;
1985 unsigned backend_map; 1987 unsigned backend_map;
1988 unsigned active_simds;
1986}; 1989};
1987 1990
1988struct cayman_asic { 1991struct cayman_asic {
@@ -2021,6 +2024,7 @@ struct cayman_asic {
2021 unsigned multi_gpu_tile_size; 2024 unsigned multi_gpu_tile_size;
2022 2025
2023 unsigned tile_config; 2026 unsigned tile_config;
2027 unsigned active_simds;
2024}; 2028};
2025 2029
2026struct si_asic { 2030struct si_asic {
@@ -2051,6 +2055,7 @@ struct si_asic {
2051 2055
2052 unsigned tile_config; 2056 unsigned tile_config;
2053 uint32_t tile_mode_array[32]; 2057 uint32_t tile_mode_array[32];
2058 uint32_t active_cus;
2054}; 2059};
2055 2060
2056struct cik_asic { 2061struct cik_asic {
@@ -2082,6 +2087,7 @@ struct cik_asic {
2082 unsigned tile_config; 2087 unsigned tile_config;
2083 uint32_t tile_mode_array[32]; 2088 uint32_t tile_mode_array[32];
2084 uint32_t macrotile_mode_array[16]; 2089 uint32_t macrotile_mode_array[16];
2090 uint32_t active_cus;
2085}; 2091};
2086 2092
2087union radeon_asic_config { 2093union radeon_asic_config {
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index b7a2ec2d1598..6e3017413386 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -81,9 +81,10 @@
81 * 2.37.0 - allow GS ring setup on r6xx/r7xx 81 * 2.37.0 - allow GS ring setup on r6xx/r7xx
82 * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN), 82 * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN),
83 * CIK: 1D and linear tiling modes contain valid PIPE_CONFIG 83 * CIK: 1D and linear tiling modes contain valid PIPE_CONFIG
84 * 2.39.0 - Add INFO query for number of active CUs
84 */ 85 */
85#define KMS_DRIVER_MAJOR 2 86#define KMS_DRIVER_MAJOR 2
86#define KMS_DRIVER_MINOR 38 87#define KMS_DRIVER_MINOR 39
87#define KMS_DRIVER_PATCHLEVEL 0 88#define KMS_DRIVER_PATCHLEVEL 0
88int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); 89int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
89int radeon_driver_unload_kms(struct drm_device *dev); 90int radeon_driver_unload_kms(struct drm_device *dev);
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index eaaedba04675..5cd70f9e7311 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -513,6 +513,22 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file
513 value_size = sizeof(uint64_t); 513 value_size = sizeof(uint64_t);
514 value64 = atomic64_read(&rdev->gtt_usage); 514 value64 = atomic64_read(&rdev->gtt_usage);
515 break; 515 break;
516 case RADEON_INFO_ACTIVE_CU_COUNT:
517 if (rdev->family >= CHIP_BONAIRE)
518 *value = rdev->config.cik.active_cus;
519 else if (rdev->family >= CHIP_TAHITI)
520 *value = rdev->config.si.active_cus;
521 else if (rdev->family >= CHIP_CAYMAN)
522 *value = rdev->config.cayman.active_simds;
523 else if (rdev->family >= CHIP_CEDAR)
524 *value = rdev->config.evergreen.active_simds;
525 else if (rdev->family >= CHIP_RV770)
526 *value = rdev->config.rv770.active_simds;
527 else if (rdev->family >= CHIP_R600)
528 *value = rdev->config.r600.active_simds;
529 else
530 *value = 1;
531 break;
516 default: 532 default:
517 DRM_DEBUG_KMS("Invalid request %d\n", info->request); 533 DRM_DEBUG_KMS("Invalid request %d\n", info->request);
518 return -EINVAL; 534 return -EINVAL;
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 97b776666b75..da8703d8d455 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -1327,6 +1327,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)
1327 if (tmp < rdev->config.rv770.max_simds) { 1327 if (tmp < rdev->config.rv770.max_simds) {
1328 rdev->config.rv770.max_simds = tmp; 1328 rdev->config.rv770.max_simds = tmp;
1329 } 1329 }
1330 tmp = rdev->config.rv770.max_simds -
1331 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1332 rdev->config.rv770.active_simds = tmp;
1330 1333
1331 switch (rdev->config.rv770.max_tile_pipes) { 1334 switch (rdev->config.rv770.max_tile_pipes) {
1332 case 1: 1335 case 1:
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index ec13e8df4c30..730cee2c34cf 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -71,6 +71,7 @@ MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
71MODULE_FIRMWARE("radeon/HAINAN_rlc.bin"); 71MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
72MODULE_FIRMWARE("radeon/HAINAN_smc.bin"); 72MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
73 73
74static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
74static void si_pcie_gen3_enable(struct radeon_device *rdev); 75static void si_pcie_gen3_enable(struct radeon_device *rdev);
75static void si_program_aspm(struct radeon_device *rdev); 76static void si_program_aspm(struct radeon_device *rdev);
76extern void sumo_rlc_fini(struct radeon_device *rdev); 77extern void sumo_rlc_fini(struct radeon_device *rdev);
@@ -2900,7 +2901,7 @@ static void si_gpu_init(struct radeon_device *rdev)
2900 u32 sx_debug_1; 2901 u32 sx_debug_1;
2901 u32 hdp_host_path_cntl; 2902 u32 hdp_host_path_cntl;
2902 u32 tmp; 2903 u32 tmp;
2903 int i, j; 2904 int i, j, k;
2904 2905
2905 switch (rdev->family) { 2906 switch (rdev->family) {
2906 case CHIP_TAHITI: 2907 case CHIP_TAHITI:
@@ -3098,6 +3099,14 @@ static void si_gpu_init(struct radeon_device *rdev)
3098 rdev->config.si.max_sh_per_se, 3099 rdev->config.si.max_sh_per_se,
3099 rdev->config.si.max_cu_per_sh); 3100 rdev->config.si.max_cu_per_sh);
3100 3101
3102 for (i = 0; i < rdev->config.si.max_shader_engines; i++) {
3103 for (j = 0; j < rdev->config.si.max_sh_per_se; j++) {
3104 for (k = 0; k < rdev->config.si.max_cu_per_sh; k++) {
3105 rdev->config.si.active_cus +=
3106 hweight32(si_get_cu_active_bitmap(rdev, i, j));
3107 }
3108 }
3109 }
3101 3110
3102 /* set HW defaults for 3D engine */ 3111 /* set HW defaults for 3D engine */
3103 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | 3112 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |