drm/radeon: handle broken disabled rb mask gracefully
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 9 Apr 2013 14:13:22 +0000 (10:13 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 11 Apr 2013 13:22:04 +0000 (09:22 -0400)
If the disabled rb mask register is not properly initialized
program a sane default based on the number of RBs for the
asic.  This avoids a potential divide by 0 when calculating
the backend mask.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/ni.c

index cd7951060afdcb90129bb7d1e30d8beac2b6f3c7..b114252e7810a86bfc5ade00e7d572e272cf30a9 100644 (file)
@@ -2261,6 +2261,14 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
        }
        /* enabled rb are just the one not disabled :) */
        disabled_rb_mask = tmp;
+       tmp = 0;
+       for (i = 0; i < rdev->config.evergreen.max_backends; i++)
+               tmp |= (1 << i);
+       /* if all the backends are disabled, fix it up here */
+       if ((disabled_rb_mask & tmp) == tmp) {
+               for (i = 0; i < rdev->config.evergreen.max_backends; i++)
+                       disabled_rb_mask &= ~(1 << i);
+       }
 
        WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
        WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
index a23503e16083c982dd737b9602e8ed3d153e03c3..78aead0ada7b13ab5befc758aac285b6599c5503 100644 (file)
@@ -615,6 +615,14 @@ static void cayman_gpu_init(struct radeon_device *rdev)
        }
        /* enabled rb are just the one not disabled :) */
        disabled_rb_mask = tmp;
+       tmp = 0;
+       for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
+               tmp |= (1 << i);
+       /* if all the backends are disabled, fix it up here */
+       if ((disabled_rb_mask & tmp) == tmp) {
+               for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
+                       disabled_rb_mask &= ~(1 << i);
+       }
 
        WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
        WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);