Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: handle broken disabled rb mask gracefully (6xx/7xx) (v2)

This is a port of cedb655a3a7764c3fd946077944383c9e0e68dd4
to older asics. Fixes a possible divide by 0 if the harvest
register is invalid.

v2: drop some additional harvest munging.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org

+16 -33
+8 -18
drivers/gpu/drm/radeon/r600.c
··· 1812 1812 { 1813 1813 u32 tiling_config; 1814 1814 u32 ramcfg; 1815 - u32 cc_rb_backend_disable; 1816 1815 u32 cc_gc_shader_pipe_config; 1817 1816 u32 tmp; 1818 1817 int i, j; ··· 1938 1939 } 1939 1940 tiling_config |= BANK_SWAPS(1); 1940 1941 1941 - cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; 1942 - tmp = R6XX_MAX_BACKENDS - 1943 - r600_count_pipe_bits((cc_rb_backend_disable >> 16) & R6XX_MAX_BACKENDS_MASK); 1944 - if (tmp < rdev->config.r600.max_backends) { 1945 - rdev->config.r600.max_backends = tmp; 1946 - } 1947 - 1948 1942 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0x00ffff00; 1949 - tmp = R6XX_MAX_PIPES - 1950 - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R6XX_MAX_PIPES_MASK); 1951 - if (tmp < rdev->config.r600.max_pipes) { 1952 - rdev->config.r600.max_pipes = tmp; 1953 - } 1954 - tmp = R6XX_MAX_SIMDS - 1955 - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); 1956 - if (tmp < rdev->config.r600.max_simds) { 1957 - rdev->config.r600.max_simds = tmp; 1958 - } 1959 1943 tmp = rdev->config.r600.max_simds - 1960 1944 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); 1961 1945 rdev->config.r600.active_simds = tmp; 1962 1946 1963 1947 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; 1948 + tmp = 0; 1949 + for (i = 0; i < rdev->config.r600.max_backends; i++) 1950 + tmp |= (1 << i); 1951 + /* if all the backends are disabled, fix it up here */ 1952 + if ((disabled_rb_mask & tmp) == tmp) { 1953 + for (i = 0; i < rdev->config.r600.max_backends; i++) 1954 + disabled_rb_mask &= ~(1 << i); 1955 + } 1964 1956 tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 1965 1957 tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.r600.max_backends, 1966 1958 R6XX_MAX_BACKENDS, disabled_rb_mask);
+8 -15
drivers/gpu/drm/radeon/rv770.c
··· 1177 1177 u32 hdp_host_path_cntl; 1178 1178 u32 sq_dyn_gpr_size_simd_ab_0; 1179 1179 u32 gb_tiling_config = 0; 1180 - u32 cc_rb_backend_disable = 0; 1181 1180 u32 cc_gc_shader_pipe_config = 0; 1182 1181 u32 mc_arb_ramcfg; 1183 1182 u32 db_debug4, tmp; ··· 1310 1311 WREG32(SPI_CONFIG_CNTL, 0); 1311 1312 } 1312 1313 1313 - cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; 1314 - tmp = R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_rb_backend_disable >> 16); 1315 - if (tmp < rdev->config.rv770.max_backends) { 1316 - rdev->config.rv770.max_backends = tmp; 1317 - } 1318 - 1319 1314 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; 1320 - tmp = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R7XX_MAX_PIPES_MASK); 1321 - if (tmp < rdev->config.rv770.max_pipes) { 1322 - rdev->config.rv770.max_pipes = tmp; 1323 - } 1324 - tmp = R7XX_MAX_SIMDS - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); 1325 - if (tmp < rdev->config.rv770.max_simds) { 1326 - rdev->config.rv770.max_simds = tmp; 1327 - } 1328 1315 tmp = rdev->config.rv770.max_simds - 1329 1316 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); 1330 1317 rdev->config.rv770.active_simds = tmp; ··· 1333 1348 rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; 1334 1349 1335 1350 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK; 1351 + tmp = 0; 1352 + for (i = 0; i < rdev->config.rv770.max_backends; i++) 1353 + tmp |= (1 << i); 1354 + /* if all the backends are disabled, fix it up here */ 1355 + if ((disabled_rb_mask & tmp) == tmp) { 1356 + for (i = 0; i < rdev->config.rv770.max_backends; i++) 1357 + disabled_rb_mask &= ~(1 << i); 1358 + } 1336 1359 tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 1337 1360 tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends, 1338 1361 R7XX_MAX_BACKENDS, disabled_rb_mask);