aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2012-01-05 12:42:17 -0500
committerDave Airlie <airlied@redhat.com>2012-01-06 04:40:00 -0500
commit3df96909b75835d487a9178761622b0cbd7310d4 (patch)
tree5dab156e43a91bde13166621b26346c1efb5fc02 /drivers/gpu
parentdea7e0ac45fd28f90bbc38ff226d36a9f788efbf (diff)
radeon: Fix disabling PCI bus mastering on big endian hosts.
It would previously write basically random bits to PCI configuration space... Not very surprising that the GPU tended to stop responding completely. The resulting MCE even froze the whole machine sometimes. Now resetting the GPU after a lockup has at least a fighting chance of succeeding. Cc: stable@vger.kernel.org Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/r100.c5
-rw-r--r--drivers/gpu/drm/radeon/rs600.c4
2 files changed, 5 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 947ba22c4d86..3ec81c3d5108 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -2186,6 +2186,7 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2186void r100_bm_disable(struct radeon_device *rdev) 2186void r100_bm_disable(struct radeon_device *rdev)
2187{ 2187{
2188 u32 tmp; 2188 u32 tmp;
2189 u16 tmp16;
2189 2190
2190 /* disable bus mastering */ 2191 /* disable bus mastering */
2191 tmp = RREG32(R_000030_BUS_CNTL); 2192 tmp = RREG32(R_000030_BUS_CNTL);
@@ -2196,8 +2197,8 @@ void r100_bm_disable(struct radeon_device *rdev)
2196 WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000040); 2197 WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000040);
2197 tmp = RREG32(RADEON_BUS_CNTL); 2198 tmp = RREG32(RADEON_BUS_CNTL);
2198 mdelay(1); 2199 mdelay(1);
2199 pci_read_config_word(rdev->pdev, 0x4, (u16*)&tmp); 2200 pci_read_config_word(rdev->pdev, 0x4, &tmp16);
2200 pci_write_config_word(rdev->pdev, 0x4, tmp & 0xFFFB); 2201 pci_write_config_word(rdev->pdev, 0x4, tmp16 & 0xFFFB);
2201 mdelay(1); 2202 mdelay(1);
2202} 2203}
2203 2204
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index ca6d5b6eaaac..803e0d3c1773 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -324,10 +324,10 @@ void rs600_hpd_fini(struct radeon_device *rdev)
324 324
325void rs600_bm_disable(struct radeon_device *rdev) 325void rs600_bm_disable(struct radeon_device *rdev)
326{ 326{
327 u32 tmp; 327 u16 tmp;
328 328
329 /* disable bus mastering */ 329 /* disable bus mastering */
330 pci_read_config_word(rdev->pdev, 0x4, (u16*)&tmp); 330 pci_read_config_word(rdev->pdev, 0x4, &tmp);
331 pci_write_config_word(rdev->pdev, 0x4, tmp & 0xFFFB); 331 pci_write_config_word(rdev->pdev, 0x4, tmp & 0xFFFB);
332 mdelay(1); 332 mdelay(1);
333} 333}