diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/ati_pcigart.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r420.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r520.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 48 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_audio.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gem.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs400.c | 28 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs690.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 24 |
17 files changed, 114 insertions, 61 deletions
diff --git a/drivers/gpu/drm/ati_pcigart.c b/drivers/gpu/drm/ati_pcigart.c index a1fce68e3bbe..17be051b7aa3 100644 --- a/drivers/gpu/drm/ati_pcigart.c +++ b/drivers/gpu/drm/ati_pcigart.c | |||
| @@ -113,7 +113,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga | |||
| 113 | 113 | ||
| 114 | if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) { | 114 | if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) { |
| 115 | DRM_ERROR("fail to set dma mask to 0x%Lx\n", | 115 | DRM_ERROR("fail to set dma mask to 0x%Lx\n", |
| 116 | gart_info->table_mask); | 116 | (unsigned long long)gart_info->table_mask); |
| 117 | ret = 1; | 117 | ret = 1; |
| 118 | goto done; | 118 | goto done; |
| 119 | } | 119 | } |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 11c9a3fe6810..c0d4650cdb79 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -354,11 +354,17 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | |||
| 354 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | 354 | return RREG32(RADEON_CRTC2_CRNT_FRAME); |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | /* Who ever call radeon_fence_emit should call ring_lock and ask | ||
| 358 | * for enough space (today caller are ib schedule and buffer move) */ | ||
| 357 | void r100_fence_ring_emit(struct radeon_device *rdev, | 359 | void r100_fence_ring_emit(struct radeon_device *rdev, |
| 358 | struct radeon_fence *fence) | 360 | struct radeon_fence *fence) |
| 359 | { | 361 | { |
| 360 | /* Who ever call radeon_fence_emit should call ring_lock and ask | 362 | /* We have to make sure that caches are flushed before |
| 361 | * for enough space (today caller are ib schedule and buffer move) */ | 363 | * CPU might read something from VRAM. */ |
| 364 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 365 | radeon_ring_write(rdev, RADEON_RB3D_DC_FLUSH_ALL); | ||
| 366 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); | ||
| 367 | radeon_ring_write(rdev, RADEON_RB3D_ZC_FLUSH_ALL); | ||
| 362 | /* Wait until IDLE & CLEAN */ | 368 | /* Wait until IDLE & CLEAN */ |
| 363 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 369 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
| 364 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); | 370 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); |
| @@ -3369,7 +3375,6 @@ int r100_suspend(struct radeon_device *rdev) | |||
| 3369 | 3375 | ||
| 3370 | void r100_fini(struct radeon_device *rdev) | 3376 | void r100_fini(struct radeon_device *rdev) |
| 3371 | { | 3377 | { |
| 3372 | r100_suspend(rdev); | ||
| 3373 | r100_cp_fini(rdev); | 3378 | r100_cp_fini(rdev); |
| 3374 | r100_wb_fini(rdev); | 3379 | r100_wb_fini(rdev); |
| 3375 | r100_ib_fini(rdev); | 3380 | r100_ib_fini(rdev); |
| @@ -3481,13 +3486,12 @@ int r100_init(struct radeon_device *rdev) | |||
| 3481 | if (r) { | 3486 | if (r) { |
| 3482 | /* Somethings want wront with the accel init stop accel */ | 3487 | /* Somethings want wront with the accel init stop accel */ |
| 3483 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 3488 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 3484 | r100_suspend(rdev); | ||
| 3485 | r100_cp_fini(rdev); | 3489 | r100_cp_fini(rdev); |
| 3486 | r100_wb_fini(rdev); | 3490 | r100_wb_fini(rdev); |
| 3487 | r100_ib_fini(rdev); | 3491 | r100_ib_fini(rdev); |
| 3492 | radeon_irq_kms_fini(rdev); | ||
| 3488 | if (rdev->flags & RADEON_IS_PCI) | 3493 | if (rdev->flags & RADEON_IS_PCI) |
| 3489 | r100_pci_gart_fini(rdev); | 3494 | r100_pci_gart_fini(rdev); |
| 3490 | radeon_irq_kms_fini(rdev); | ||
| 3491 | rdev->accel_working = false; | 3495 | rdev->accel_working = false; |
| 3492 | } | 3496 | } |
| 3493 | return 0; | 3497 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 0051d11b907c..43b55a030b4d 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -506,11 +506,14 @@ void r300_vram_info(struct radeon_device *rdev) | |||
| 506 | 506 | ||
| 507 | /* DDR for all card after R300 & IGP */ | 507 | /* DDR for all card after R300 & IGP */ |
| 508 | rdev->mc.vram_is_ddr = true; | 508 | rdev->mc.vram_is_ddr = true; |
| 509 | |||
| 509 | tmp = RREG32(RADEON_MEM_CNTL); | 510 | tmp = RREG32(RADEON_MEM_CNTL); |
| 510 | if (tmp & R300_MEM_NUM_CHANNELS_MASK) { | 511 | tmp &= R300_MEM_NUM_CHANNELS_MASK; |
| 511 | rdev->mc.vram_width = 128; | 512 | switch (tmp) { |
| 512 | } else { | 513 | case 0: rdev->mc.vram_width = 64; break; |
| 513 | rdev->mc.vram_width = 64; | 514 | case 1: rdev->mc.vram_width = 128; break; |
| 515 | case 2: rdev->mc.vram_width = 256; break; | ||
| 516 | default: rdev->mc.vram_width = 128; break; | ||
| 514 | } | 517 | } |
| 515 | 518 | ||
| 516 | r100_vram_init_sizes(rdev); | 519 | r100_vram_init_sizes(rdev); |
| @@ -1327,7 +1330,6 @@ int r300_suspend(struct radeon_device *rdev) | |||
| 1327 | 1330 | ||
| 1328 | void r300_fini(struct radeon_device *rdev) | 1331 | void r300_fini(struct radeon_device *rdev) |
| 1329 | { | 1332 | { |
| 1330 | r300_suspend(rdev); | ||
| 1331 | r100_cp_fini(rdev); | 1333 | r100_cp_fini(rdev); |
| 1332 | r100_wb_fini(rdev); | 1334 | r100_wb_fini(rdev); |
| 1333 | r100_ib_fini(rdev); | 1335 | r100_ib_fini(rdev); |
| @@ -1418,15 +1420,15 @@ int r300_init(struct radeon_device *rdev) | |||
| 1418 | if (r) { | 1420 | if (r) { |
| 1419 | /* Somethings want wront with the accel init stop accel */ | 1421 | /* Somethings want wront with the accel init stop accel */ |
| 1420 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 1422 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 1421 | r300_suspend(rdev); | ||
| 1422 | r100_cp_fini(rdev); | 1423 | r100_cp_fini(rdev); |
| 1423 | r100_wb_fini(rdev); | 1424 | r100_wb_fini(rdev); |
| 1424 | r100_ib_fini(rdev); | 1425 | r100_ib_fini(rdev); |
| 1426 | radeon_irq_kms_fini(rdev); | ||
| 1425 | if (rdev->flags & RADEON_IS_PCIE) | 1427 | if (rdev->flags & RADEON_IS_PCIE) |
| 1426 | rv370_pcie_gart_fini(rdev); | 1428 | rv370_pcie_gart_fini(rdev); |
| 1427 | if (rdev->flags & RADEON_IS_PCI) | 1429 | if (rdev->flags & RADEON_IS_PCI) |
| 1428 | r100_pci_gart_fini(rdev); | 1430 | r100_pci_gart_fini(rdev); |
| 1429 | radeon_irq_kms_fini(rdev); | 1431 | radeon_agp_fini(rdev); |
| 1430 | rdev->accel_working = false; | 1432 | rdev->accel_working = false; |
| 1431 | } | 1433 | } |
| 1432 | return 0; | 1434 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 4526faaacca8..d9373246c97f 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -389,16 +389,15 @@ int r420_init(struct radeon_device *rdev) | |||
| 389 | if (r) { | 389 | if (r) { |
| 390 | /* Somethings want wront with the accel init stop accel */ | 390 | /* Somethings want wront with the accel init stop accel */ |
| 391 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 391 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 392 | r420_suspend(rdev); | ||
| 393 | r100_cp_fini(rdev); | 392 | r100_cp_fini(rdev); |
| 394 | r100_wb_fini(rdev); | 393 | r100_wb_fini(rdev); |
| 395 | r100_ib_fini(rdev); | 394 | r100_ib_fini(rdev); |
| 395 | radeon_irq_kms_fini(rdev); | ||
| 396 | if (rdev->flags & RADEON_IS_PCIE) | 396 | if (rdev->flags & RADEON_IS_PCIE) |
| 397 | rv370_pcie_gart_fini(rdev); | 397 | rv370_pcie_gart_fini(rdev); |
| 398 | if (rdev->flags & RADEON_IS_PCI) | 398 | if (rdev->flags & RADEON_IS_PCI) |
| 399 | r100_pci_gart_fini(rdev); | 399 | r100_pci_gart_fini(rdev); |
| 400 | radeon_agp_fini(rdev); | 400 | radeon_agp_fini(rdev); |
| 401 | radeon_irq_kms_fini(rdev); | ||
| 402 | rdev->accel_working = false; | 401 | rdev->accel_working = false; |
| 403 | } | 402 | } |
| 404 | return 0; | 403 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 9a189072f2b9..ddf5731eba0d 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -294,13 +294,12 @@ int r520_init(struct radeon_device *rdev) | |||
| 294 | if (r) { | 294 | if (r) { |
| 295 | /* Somethings want wront with the accel init stop accel */ | 295 | /* Somethings want wront with the accel init stop accel */ |
| 296 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 296 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 297 | rv515_suspend(rdev); | ||
| 298 | r100_cp_fini(rdev); | 297 | r100_cp_fini(rdev); |
| 299 | r100_wb_fini(rdev); | 298 | r100_wb_fini(rdev); |
| 300 | r100_ib_fini(rdev); | 299 | r100_ib_fini(rdev); |
| 300 | radeon_irq_kms_fini(rdev); | ||
| 301 | rv370_pcie_gart_fini(rdev); | 301 | rv370_pcie_gart_fini(rdev); |
| 302 | radeon_agp_fini(rdev); | 302 | radeon_agp_fini(rdev); |
| 303 | radeon_irq_kms_fini(rdev); | ||
| 304 | rdev->accel_working = false; | 303 | rdev->accel_working = false; |
| 305 | } | 304 | } |
| 306 | return 0; | 305 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1b6d0001b20e..a1198d99cdf9 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1654,6 +1654,12 @@ void r600_ring_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 1654 | rdev->cp.align_mask = 16 - 1; | 1654 | rdev->cp.align_mask = 16 - 1; |
| 1655 | } | 1655 | } |
| 1656 | 1656 | ||
| 1657 | void r600_cp_fini(struct radeon_device *rdev) | ||
| 1658 | { | ||
| 1659 | r600_cp_stop(rdev); | ||
| 1660 | radeon_ring_fini(rdev); | ||
| 1661 | } | ||
| 1662 | |||
| 1657 | 1663 | ||
| 1658 | /* | 1664 | /* |
| 1659 | * GPU scratch registers helpers function. | 1665 | * GPU scratch registers helpers function. |
| @@ -1861,6 +1867,12 @@ int r600_startup(struct radeon_device *rdev) | |||
| 1861 | return r; | 1867 | return r; |
| 1862 | } | 1868 | } |
| 1863 | r600_gpu_init(rdev); | 1869 | r600_gpu_init(rdev); |
| 1870 | r = r600_blit_init(rdev); | ||
| 1871 | if (r) { | ||
| 1872 | r600_blit_fini(rdev); | ||
| 1873 | rdev->asic->copy = NULL; | ||
| 1874 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 1875 | } | ||
| 1864 | /* pin copy shader into vram */ | 1876 | /* pin copy shader into vram */ |
| 1865 | if (rdev->r600_blit.shader_obj) { | 1877 | if (rdev->r600_blit.shader_obj) { |
| 1866 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 1878 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| @@ -2045,19 +2057,15 @@ int r600_init(struct radeon_device *rdev) | |||
| 2045 | r = r600_pcie_gart_init(rdev); | 2057 | r = r600_pcie_gart_init(rdev); |
| 2046 | if (r) | 2058 | if (r) |
| 2047 | return r; | 2059 | return r; |
| 2048 | r = r600_blit_init(rdev); | ||
| 2049 | if (r) { | ||
| 2050 | r600_blit_fini(rdev); | ||
| 2051 | rdev->asic->copy = NULL; | ||
| 2052 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 2053 | } | ||
| 2054 | 2060 | ||
| 2055 | rdev->accel_working = true; | 2061 | rdev->accel_working = true; |
| 2056 | r = r600_startup(rdev); | 2062 | r = r600_startup(rdev); |
| 2057 | if (r) { | 2063 | if (r) { |
| 2058 | r600_suspend(rdev); | 2064 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
| 2065 | r600_cp_fini(rdev); | ||
| 2059 | r600_wb_fini(rdev); | 2066 | r600_wb_fini(rdev); |
| 2060 | radeon_ring_fini(rdev); | 2067 | r600_irq_fini(rdev); |
| 2068 | radeon_irq_kms_fini(rdev); | ||
| 2061 | r600_pcie_gart_fini(rdev); | 2069 | r600_pcie_gart_fini(rdev); |
| 2062 | rdev->accel_working = false; | 2070 | rdev->accel_working = false; |
| 2063 | } | 2071 | } |
| @@ -2083,20 +2091,17 @@ int r600_init(struct radeon_device *rdev) | |||
| 2083 | 2091 | ||
| 2084 | void r600_fini(struct radeon_device *rdev) | 2092 | void r600_fini(struct radeon_device *rdev) |
| 2085 | { | 2093 | { |
| 2086 | /* Suspend operations */ | ||
| 2087 | r600_suspend(rdev); | ||
| 2088 | |||
| 2089 | r600_audio_fini(rdev); | 2094 | r600_audio_fini(rdev); |
| 2090 | r600_blit_fini(rdev); | 2095 | r600_blit_fini(rdev); |
| 2096 | r600_cp_fini(rdev); | ||
| 2097 | r600_wb_fini(rdev); | ||
| 2091 | r600_irq_fini(rdev); | 2098 | r600_irq_fini(rdev); |
| 2092 | radeon_irq_kms_fini(rdev); | 2099 | radeon_irq_kms_fini(rdev); |
| 2093 | radeon_ring_fini(rdev); | ||
| 2094 | r600_wb_fini(rdev); | ||
| 2095 | r600_pcie_gart_fini(rdev); | 2100 | r600_pcie_gart_fini(rdev); |
| 2101 | radeon_agp_fini(rdev); | ||
| 2096 | radeon_gem_fini(rdev); | 2102 | radeon_gem_fini(rdev); |
| 2097 | radeon_fence_driver_fini(rdev); | 2103 | radeon_fence_driver_fini(rdev); |
| 2098 | radeon_clocks_fini(rdev); | 2104 | radeon_clocks_fini(rdev); |
| 2099 | radeon_agp_fini(rdev); | ||
| 2100 | radeon_bo_fini(rdev); | 2105 | radeon_bo_fini(rdev); |
| 2101 | radeon_atombios_fini(rdev); | 2106 | radeon_atombios_fini(rdev); |
| 2102 | kfree(rdev->bios); | 2107 | kfree(rdev->bios); |
| @@ -2900,3 +2905,18 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev) | |||
| 2900 | return 0; | 2905 | return 0; |
| 2901 | #endif | 2906 | #endif |
| 2902 | } | 2907 | } |
| 2908 | |||
| 2909 | /** | ||
| 2910 | * r600_ioctl_wait_idle - flush host path cache on wait idle ioctl | ||
| 2911 | * rdev: radeon device structure | ||
| 2912 | * bo: buffer object struct which userspace is waiting for idle | ||
| 2913 | * | ||
| 2914 | * Some R6XX/R7XX doesn't seems to take into account HDP flush performed | ||
| 2915 | * through ring buffer, this leads to corruption in rendering, see | ||
| 2916 | * http://bugzilla.kernel.org/show_bug.cgi?id=15186 to avoid this we | ||
| 2917 | * directly perform HDP flush by writing register through MMIO. | ||
| 2918 | */ | ||
| 2919 | void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) | ||
| 2920 | { | ||
| 2921 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
| 2922 | } | ||
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 99e2c3891a7d..b1c1d3433454 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | */ | 35 | */ |
| 36 | static int r600_audio_chipset_supported(struct radeon_device *rdev) | 36 | static int r600_audio_chipset_supported(struct radeon_device *rdev) |
| 37 | { | 37 | { |
| 38 | return rdev->family >= CHIP_R600 | 38 | return (rdev->family >= CHIP_R600 && rdev->family < CHIP_RV710) |
| 39 | || rdev->family == CHIP_RS600 | 39 | || rdev->family == CHIP_RS600 |
| 40 | || rdev->family == CHIP_RS690 | 40 | || rdev->family == CHIP_RS690 |
| 41 | || rdev->family == CHIP_RS740; | 41 | || rdev->family == CHIP_RS740; |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 2d5f2bfa7201..f57480ba1355 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -661,6 +661,13 @@ struct radeon_asic { | |||
| 661 | void (*hpd_fini)(struct radeon_device *rdev); | 661 | void (*hpd_fini)(struct radeon_device *rdev); |
| 662 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 662 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 663 | void (*hpd_set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 663 | void (*hpd_set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 664 | /* ioctl hw specific callback. Some hw might want to perform special | ||
| 665 | * operation on specific ioctl. For instance on wait idle some hw | ||
| 666 | * might want to perform and HDP flush through MMIO as it seems that | ||
| 667 | * some R6XX/R7XX hw doesn't take HDP flush into account if programmed | ||
| 668 | * through ring. | ||
| 669 | */ | ||
| 670 | void (*ioctl_wait_idle)(struct radeon_device *rdev, struct radeon_bo *bo); | ||
| 664 | }; | 671 | }; |
| 665 | 672 | ||
| 666 | /* | 673 | /* |
| @@ -1143,6 +1150,7 @@ extern bool r600_card_posted(struct radeon_device *rdev); | |||
| 1143 | extern void r600_cp_stop(struct radeon_device *rdev); | 1150 | extern void r600_cp_stop(struct radeon_device *rdev); |
| 1144 | extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); | 1151 | extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); |
| 1145 | extern int r600_cp_resume(struct radeon_device *rdev); | 1152 | extern int r600_cp_resume(struct radeon_device *rdev); |
| 1153 | extern void r600_cp_fini(struct radeon_device *rdev); | ||
| 1146 | extern int r600_count_pipe_bits(uint32_t val); | 1154 | extern int r600_count_pipe_bits(uint32_t val); |
| 1147 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); | 1155 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); |
| 1148 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); | 1156 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index f2fbd2e4e9df..05ee1aeac3fd 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -117,6 +117,7 @@ static struct radeon_asic r100_asic = { | |||
| 117 | .hpd_fini = &r100_hpd_fini, | 117 | .hpd_fini = &r100_hpd_fini, |
| 118 | .hpd_sense = &r100_hpd_sense, | 118 | .hpd_sense = &r100_hpd_sense, |
| 119 | .hpd_set_polarity = &r100_hpd_set_polarity, | 119 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 120 | .ioctl_wait_idle = NULL, | ||
| 120 | }; | 121 | }; |
| 121 | 122 | ||
| 122 | 123 | ||
| @@ -176,6 +177,7 @@ static struct radeon_asic r300_asic = { | |||
| 176 | .hpd_fini = &r100_hpd_fini, | 177 | .hpd_fini = &r100_hpd_fini, |
| 177 | .hpd_sense = &r100_hpd_sense, | 178 | .hpd_sense = &r100_hpd_sense, |
| 178 | .hpd_set_polarity = &r100_hpd_set_polarity, | 179 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 180 | .ioctl_wait_idle = NULL, | ||
| 179 | }; | 181 | }; |
| 180 | 182 | ||
| 181 | /* | 183 | /* |
| @@ -219,6 +221,7 @@ static struct radeon_asic r420_asic = { | |||
| 219 | .hpd_fini = &r100_hpd_fini, | 221 | .hpd_fini = &r100_hpd_fini, |
| 220 | .hpd_sense = &r100_hpd_sense, | 222 | .hpd_sense = &r100_hpd_sense, |
| 221 | .hpd_set_polarity = &r100_hpd_set_polarity, | 223 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 224 | .ioctl_wait_idle = NULL, | ||
| 222 | }; | 225 | }; |
| 223 | 226 | ||
| 224 | 227 | ||
| @@ -267,6 +270,7 @@ static struct radeon_asic rs400_asic = { | |||
| 267 | .hpd_fini = &r100_hpd_fini, | 270 | .hpd_fini = &r100_hpd_fini, |
| 268 | .hpd_sense = &r100_hpd_sense, | 271 | .hpd_sense = &r100_hpd_sense, |
| 269 | .hpd_set_polarity = &r100_hpd_set_polarity, | 272 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 273 | .ioctl_wait_idle = NULL, | ||
| 270 | }; | 274 | }; |
| 271 | 275 | ||
| 272 | 276 | ||
| @@ -323,6 +327,7 @@ static struct radeon_asic rs600_asic = { | |||
| 323 | .hpd_fini = &rs600_hpd_fini, | 327 | .hpd_fini = &rs600_hpd_fini, |
| 324 | .hpd_sense = &rs600_hpd_sense, | 328 | .hpd_sense = &rs600_hpd_sense, |
| 325 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 329 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 330 | .ioctl_wait_idle = NULL, | ||
| 326 | }; | 331 | }; |
| 327 | 332 | ||
| 328 | 333 | ||
| @@ -370,6 +375,7 @@ static struct radeon_asic rs690_asic = { | |||
| 370 | .hpd_fini = &rs600_hpd_fini, | 375 | .hpd_fini = &rs600_hpd_fini, |
| 371 | .hpd_sense = &rs600_hpd_sense, | 376 | .hpd_sense = &rs600_hpd_sense, |
| 372 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 377 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 378 | .ioctl_wait_idle = NULL, | ||
| 373 | }; | 379 | }; |
| 374 | 380 | ||
| 375 | 381 | ||
| @@ -421,6 +427,7 @@ static struct radeon_asic rv515_asic = { | |||
| 421 | .hpd_fini = &rs600_hpd_fini, | 427 | .hpd_fini = &rs600_hpd_fini, |
| 422 | .hpd_sense = &rs600_hpd_sense, | 428 | .hpd_sense = &rs600_hpd_sense, |
| 423 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 429 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 430 | .ioctl_wait_idle = NULL, | ||
| 424 | }; | 431 | }; |
| 425 | 432 | ||
| 426 | 433 | ||
| @@ -463,6 +470,7 @@ static struct radeon_asic r520_asic = { | |||
| 463 | .hpd_fini = &rs600_hpd_fini, | 470 | .hpd_fini = &rs600_hpd_fini, |
| 464 | .hpd_sense = &rs600_hpd_sense, | 471 | .hpd_sense = &rs600_hpd_sense, |
| 465 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 472 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 473 | .ioctl_wait_idle = NULL, | ||
| 466 | }; | 474 | }; |
| 467 | 475 | ||
| 468 | /* | 476 | /* |
| @@ -504,6 +512,7 @@ void r600_hpd_fini(struct radeon_device *rdev); | |||
| 504 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 512 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 505 | void r600_hpd_set_polarity(struct radeon_device *rdev, | 513 | void r600_hpd_set_polarity(struct radeon_device *rdev, |
| 506 | enum radeon_hpd_id hpd); | 514 | enum radeon_hpd_id hpd); |
| 515 | extern void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo); | ||
| 507 | 516 | ||
| 508 | static struct radeon_asic r600_asic = { | 517 | static struct radeon_asic r600_asic = { |
| 509 | .init = &r600_init, | 518 | .init = &r600_init, |
| @@ -538,6 +547,7 @@ static struct radeon_asic r600_asic = { | |||
| 538 | .hpd_fini = &r600_hpd_fini, | 547 | .hpd_fini = &r600_hpd_fini, |
| 539 | .hpd_sense = &r600_hpd_sense, | 548 | .hpd_sense = &r600_hpd_sense, |
| 540 | .hpd_set_polarity = &r600_hpd_set_polarity, | 549 | .hpd_set_polarity = &r600_hpd_set_polarity, |
| 550 | .ioctl_wait_idle = r600_ioctl_wait_idle, | ||
| 541 | }; | 551 | }; |
| 542 | 552 | ||
| 543 | /* | 553 | /* |
| @@ -582,6 +592,7 @@ static struct radeon_asic rv770_asic = { | |||
| 582 | .hpd_fini = &r600_hpd_fini, | 592 | .hpd_fini = &r600_hpd_fini, |
| 583 | .hpd_sense = &r600_hpd_sense, | 593 | .hpd_sense = &r600_hpd_sense, |
| 584 | .hpd_set_polarity = &r600_hpd_set_polarity, | 594 | .hpd_set_polarity = &r600_hpd_set_polarity, |
| 595 | .ioctl_wait_idle = r600_ioctl_wait_idle, | ||
| 585 | }; | 596 | }; |
| 586 | 597 | ||
| 587 | #endif | 598 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 579c8920e081..e7b19440102e 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -971,8 +971,7 @@ struct radeon_encoder_lvds *radeon_combios_get_lvds_info(struct radeon_encoder | |||
| 971 | lvds->native_mode.vdisplay); | 971 | lvds->native_mode.vdisplay); |
| 972 | 972 | ||
| 973 | lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); | 973 | lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); |
| 974 | if (lvds->panel_vcc_delay > 2000 || lvds->panel_vcc_delay < 0) | 974 | lvds->panel_vcc_delay = min_t(u16, lvds->panel_vcc_delay, 2000); |
| 975 | lvds->panel_vcc_delay = 2000; | ||
| 976 | 975 | ||
| 977 | lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); | 976 | lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); |
| 978 | lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; | 977 | lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 55266416fa47..2d8e5a70f284 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -1343,7 +1343,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
| 1343 | radeon_connector->dac_load_detect = false; | 1343 | radeon_connector->dac_load_detect = false; |
| 1344 | drm_connector_attach_property(&radeon_connector->base, | 1344 | drm_connector_attach_property(&radeon_connector->base, |
| 1345 | rdev->mode_info.load_detect_property, | 1345 | rdev->mode_info.load_detect_property, |
| 1346 | 1); | 1346 | radeon_connector->dac_load_detect); |
| 1347 | drm_connector_attach_property(&radeon_connector->base, | 1347 | drm_connector_attach_property(&radeon_connector->base, |
| 1348 | rdev->mode_info.tv_std_property, | 1348 | rdev->mode_info.tv_std_property, |
| 1349 | radeon_combios_get_tv_info(rdev)); | 1349 | radeon_combios_get_tv_info(rdev)); |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 0e1325e18534..db8e9a355a01 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -308,6 +308,9 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | |||
| 308 | } | 308 | } |
| 309 | robj = gobj->driver_private; | 309 | robj = gobj->driver_private; |
| 310 | r = radeon_bo_wait(robj, NULL, false); | 310 | r = radeon_bo_wait(robj, NULL, false); |
| 311 | /* callback hw specific functions if any */ | ||
| 312 | if (robj->rdev->asic->ioctl_wait_idle) | ||
| 313 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); | ||
| 311 | mutex_lock(&dev->struct_mutex); | 314 | mutex_lock(&dev->struct_mutex); |
| 312 | drm_gem_object_unreference(gobj); | 315 | drm_gem_object_unreference(gobj); |
| 313 | mutex_unlock(&dev->struct_mutex); | 316 | mutex_unlock(&dev->struct_mutex); |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 9f5418983e2a..287fcebfb4e6 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -223,15 +223,31 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 223 | return 0; | 223 | return 0; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | ||
| 227 | { | ||
| 228 | unsigned i; | ||
| 229 | uint32_t tmp; | ||
| 230 | |||
| 231 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
| 232 | /* read MC_STATUS */ | ||
| 233 | tmp = RREG32(0x0150); | ||
| 234 | if (tmp & (1 << 2)) { | ||
| 235 | return 0; | ||
| 236 | } | ||
| 237 | DRM_UDELAY(1); | ||
| 238 | } | ||
| 239 | return -1; | ||
| 240 | } | ||
| 241 | |||
| 226 | void rs400_gpu_init(struct radeon_device *rdev) | 242 | void rs400_gpu_init(struct radeon_device *rdev) |
| 227 | { | 243 | { |
| 228 | /* FIXME: HDP same place on rs400 ? */ | 244 | /* FIXME: HDP same place on rs400 ? */ |
| 229 | r100_hdp_reset(rdev); | 245 | r100_hdp_reset(rdev); |
| 230 | /* FIXME: is this correct ? */ | 246 | /* FIXME: is this correct ? */ |
| 231 | r420_pipes_init(rdev); | 247 | r420_pipes_init(rdev); |
| 232 | if (r300_mc_wait_for_idle(rdev)) { | 248 | if (rs400_mc_wait_for_idle(rdev)) { |
| 233 | printk(KERN_WARNING "Failed to wait MC idle while " | 249 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " |
| 234 | "programming pipes. Bad things might happen.\n"); | 250 | "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); |
| 235 | } | 251 | } |
| 236 | } | 252 | } |
| 237 | 253 | ||
| @@ -370,8 +386,8 @@ void rs400_mc_program(struct radeon_device *rdev) | |||
| 370 | r100_mc_stop(rdev, &save); | 386 | r100_mc_stop(rdev, &save); |
| 371 | 387 | ||
| 372 | /* Wait for mc idle */ | 388 | /* Wait for mc idle */ |
| 373 | if (r300_mc_wait_for_idle(rdev)) | 389 | if (rs400_mc_wait_for_idle(rdev)) |
| 374 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | 390 | dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n"); |
| 375 | WREG32(R_000148_MC_FB_LOCATION, | 391 | WREG32(R_000148_MC_FB_LOCATION, |
| 376 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | 392 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
| 377 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 393 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
| @@ -448,7 +464,6 @@ int rs400_suspend(struct radeon_device *rdev) | |||
| 448 | 464 | ||
| 449 | void rs400_fini(struct radeon_device *rdev) | 465 | void rs400_fini(struct radeon_device *rdev) |
| 450 | { | 466 | { |
| 451 | rs400_suspend(rdev); | ||
| 452 | r100_cp_fini(rdev); | 467 | r100_cp_fini(rdev); |
| 453 | r100_wb_fini(rdev); | 468 | r100_wb_fini(rdev); |
| 454 | r100_ib_fini(rdev); | 469 | r100_ib_fini(rdev); |
| @@ -527,7 +542,6 @@ int rs400_init(struct radeon_device *rdev) | |||
| 527 | if (r) { | 542 | if (r) { |
| 528 | /* Somethings want wront with the accel init stop accel */ | 543 | /* Somethings want wront with the accel init stop accel */ |
| 529 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 544 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 530 | rs400_suspend(rdev); | ||
| 531 | r100_cp_fini(rdev); | 545 | r100_cp_fini(rdev); |
| 532 | r100_wb_fini(rdev); | 546 | r100_wb_fini(rdev); |
| 533 | r100_ib_fini(rdev); | 547 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index d5255751e7b3..c3818562a13e 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -610,7 +610,6 @@ int rs600_suspend(struct radeon_device *rdev) | |||
| 610 | 610 | ||
| 611 | void rs600_fini(struct radeon_device *rdev) | 611 | void rs600_fini(struct radeon_device *rdev) |
| 612 | { | 612 | { |
| 613 | rs600_suspend(rdev); | ||
| 614 | r100_cp_fini(rdev); | 613 | r100_cp_fini(rdev); |
| 615 | r100_wb_fini(rdev); | 614 | r100_wb_fini(rdev); |
| 616 | r100_ib_fini(rdev); | 615 | r100_ib_fini(rdev); |
| @@ -689,7 +688,6 @@ int rs600_init(struct radeon_device *rdev) | |||
| 689 | if (r) { | 688 | if (r) { |
| 690 | /* Somethings want wront with the accel init stop accel */ | 689 | /* Somethings want wront with the accel init stop accel */ |
| 691 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 690 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 692 | rs600_suspend(rdev); | ||
| 693 | r100_cp_fini(rdev); | 691 | r100_cp_fini(rdev); |
| 694 | r100_wb_fini(rdev); | 692 | r100_wb_fini(rdev); |
| 695 | r100_ib_fini(rdev); | 693 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index cd31da913771..06e2771aee5a 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -676,7 +676,6 @@ int rs690_suspend(struct radeon_device *rdev) | |||
| 676 | 676 | ||
| 677 | void rs690_fini(struct radeon_device *rdev) | 677 | void rs690_fini(struct radeon_device *rdev) |
| 678 | { | 678 | { |
| 679 | rs690_suspend(rdev); | ||
| 680 | r100_cp_fini(rdev); | 679 | r100_cp_fini(rdev); |
| 681 | r100_wb_fini(rdev); | 680 | r100_wb_fini(rdev); |
| 682 | r100_ib_fini(rdev); | 681 | r100_ib_fini(rdev); |
| @@ -756,7 +755,6 @@ int rs690_init(struct radeon_device *rdev) | |||
| 756 | if (r) { | 755 | if (r) { |
| 757 | /* Somethings want wront with the accel init stop accel */ | 756 | /* Somethings want wront with the accel init stop accel */ |
| 758 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 757 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 759 | rs690_suspend(rdev); | ||
| 760 | r100_cp_fini(rdev); | 758 | r100_cp_fini(rdev); |
| 761 | r100_wb_fini(rdev); | 759 | r100_wb_fini(rdev); |
| 762 | r100_ib_fini(rdev); | 760 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 62756717b044..0e1e6b8632b8 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -537,7 +537,6 @@ void rv515_set_safe_registers(struct radeon_device *rdev) | |||
| 537 | 537 | ||
| 538 | void rv515_fini(struct radeon_device *rdev) | 538 | void rv515_fini(struct radeon_device *rdev) |
| 539 | { | 539 | { |
| 540 | rv515_suspend(rdev); | ||
| 541 | r100_cp_fini(rdev); | 540 | r100_cp_fini(rdev); |
| 542 | r100_wb_fini(rdev); | 541 | r100_wb_fini(rdev); |
| 543 | r100_ib_fini(rdev); | 542 | r100_ib_fini(rdev); |
| @@ -615,13 +614,12 @@ int rv515_init(struct radeon_device *rdev) | |||
| 615 | if (r) { | 614 | if (r) { |
| 616 | /* Somethings want wront with the accel init stop accel */ | 615 | /* Somethings want wront with the accel init stop accel */ |
| 617 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 616 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 618 | rv515_suspend(rdev); | ||
| 619 | r100_cp_fini(rdev); | 617 | r100_cp_fini(rdev); |
| 620 | r100_wb_fini(rdev); | 618 | r100_wb_fini(rdev); |
| 621 | r100_ib_fini(rdev); | 619 | r100_ib_fini(rdev); |
| 620 | radeon_irq_kms_fini(rdev); | ||
| 622 | rv370_pcie_gart_fini(rdev); | 621 | rv370_pcie_gart_fini(rdev); |
| 623 | radeon_agp_fini(rdev); | 622 | radeon_agp_fini(rdev); |
| 624 | radeon_irq_kms_fini(rdev); | ||
| 625 | rdev->accel_working = false; | 623 | rdev->accel_working = false; |
| 626 | } | 624 | } |
| 627 | return 0; | 625 | return 0; |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index afd9e8213c29..5943d561fd1e 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -887,6 +887,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 887 | return r; | 887 | return r; |
| 888 | } | 888 | } |
| 889 | rv770_gpu_init(rdev); | 889 | rv770_gpu_init(rdev); |
| 890 | r = r600_blit_init(rdev); | ||
| 891 | if (r) { | ||
| 892 | r600_blit_fini(rdev); | ||
| 893 | rdev->asic->copy = NULL; | ||
| 894 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 895 | } | ||
| 890 | /* pin copy shader into vram */ | 896 | /* pin copy shader into vram */ |
| 891 | if (rdev->r600_blit.shader_obj) { | 897 | if (rdev->r600_blit.shader_obj) { |
| 892 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 898 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| @@ -1055,19 +1061,15 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1055 | r = r600_pcie_gart_init(rdev); | 1061 | r = r600_pcie_gart_init(rdev); |
| 1056 | if (r) | 1062 | if (r) |
| 1057 | return r; | 1063 | return r; |
| 1058 | r = r600_blit_init(rdev); | ||
| 1059 | if (r) { | ||
| 1060 | r600_blit_fini(rdev); | ||
| 1061 | rdev->asic->copy = NULL; | ||
| 1062 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 1063 | } | ||
| 1064 | 1064 | ||
| 1065 | rdev->accel_working = true; | 1065 | rdev->accel_working = true; |
| 1066 | r = rv770_startup(rdev); | 1066 | r = rv770_startup(rdev); |
| 1067 | if (r) { | 1067 | if (r) { |
| 1068 | rv770_suspend(rdev); | 1068 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
| 1069 | r600_cp_fini(rdev); | ||
| 1069 | r600_wb_fini(rdev); | 1070 | r600_wb_fini(rdev); |
| 1070 | radeon_ring_fini(rdev); | 1071 | r600_irq_fini(rdev); |
| 1072 | radeon_irq_kms_fini(rdev); | ||
| 1071 | rv770_pcie_gart_fini(rdev); | 1073 | rv770_pcie_gart_fini(rdev); |
| 1072 | rdev->accel_working = false; | 1074 | rdev->accel_working = false; |
| 1073 | } | 1075 | } |
| @@ -1089,13 +1091,11 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1089 | 1091 | ||
| 1090 | void rv770_fini(struct radeon_device *rdev) | 1092 | void rv770_fini(struct radeon_device *rdev) |
| 1091 | { | 1093 | { |
| 1092 | rv770_suspend(rdev); | ||
| 1093 | |||
| 1094 | r600_blit_fini(rdev); | 1094 | r600_blit_fini(rdev); |
| 1095 | r600_cp_fini(rdev); | ||
| 1096 | r600_wb_fini(rdev); | ||
| 1095 | r600_irq_fini(rdev); | 1097 | r600_irq_fini(rdev); |
| 1096 | radeon_irq_kms_fini(rdev); | 1098 | radeon_irq_kms_fini(rdev); |
| 1097 | radeon_ring_fini(rdev); | ||
| 1098 | r600_wb_fini(rdev); | ||
| 1099 | rv770_pcie_gart_fini(rdev); | 1099 | rv770_pcie_gart_fini(rdev); |
| 1100 | radeon_gem_fini(rdev); | 1100 | radeon_gem_fini(rdev); |
| 1101 | radeon_fence_driver_fini(rdev); | 1101 | radeon_fence_driver_fini(rdev); |
