| .. | .. |
|---|
| 25 | 25 | * Alex Deucher |
|---|
| 26 | 26 | * Jerome Glisse |
|---|
| 27 | 27 | */ |
|---|
| 28 | + |
|---|
| 28 | 29 | #include <linux/console.h> |
|---|
| 29 | | -#include <linux/slab.h> |
|---|
| 30 | | -#include <drm/drmP.h> |
|---|
| 31 | | -#include <drm/drm_crtc_helper.h> |
|---|
| 32 | | -#include <drm/drm_cache.h> |
|---|
| 33 | | -#include <drm/radeon_drm.h> |
|---|
| 34 | | -#include <linux/pm_runtime.h> |
|---|
| 35 | | -#include <linux/vgaarb.h> |
|---|
| 36 | | -#include <linux/vga_switcheroo.h> |
|---|
| 37 | 30 | #include <linux/efi.h> |
|---|
| 31 | +#include <linux/pci.h> |
|---|
| 32 | +#include <linux/pm_runtime.h> |
|---|
| 33 | +#include <linux/slab.h> |
|---|
| 34 | +#include <linux/vga_switcheroo.h> |
|---|
| 35 | +#include <linux/vgaarb.h> |
|---|
| 36 | + |
|---|
| 37 | +#include <drm/drm_cache.h> |
|---|
| 38 | +#include <drm/drm_crtc_helper.h> |
|---|
| 39 | +#include <drm/drm_debugfs.h> |
|---|
| 40 | +#include <drm/drm_device.h> |
|---|
| 41 | +#include <drm/drm_file.h> |
|---|
| 42 | +#include <drm/drm_probe_helper.h> |
|---|
| 43 | +#include <drm/radeon_drm.h> |
|---|
| 44 | + |
|---|
| 38 | 45 | #include "radeon_reg.h" |
|---|
| 39 | 46 | #include "radeon.h" |
|---|
| 40 | 47 | #include "atom.h" |
|---|
| .. | .. |
|---|
| 1256 | 1263 | * locking inversion with the driver load path. And the access here is |
|---|
| 1257 | 1264 | * completely racy anyway. So don't bother with locking for now. |
|---|
| 1258 | 1265 | */ |
|---|
| 1259 | | - return dev->open_count == 0; |
|---|
| 1266 | + return atomic_read(&dev->open_count) == 0; |
|---|
| 1260 | 1267 | } |
|---|
| 1261 | 1268 | |
|---|
| 1262 | 1269 | static const struct vga_switcheroo_client_ops radeon_switcheroo_ops = { |
|---|
| .. | .. |
|---|
| 1318 | 1325 | init_rwsem(&rdev->pm.mclk_lock); |
|---|
| 1319 | 1326 | init_rwsem(&rdev->exclusive_lock); |
|---|
| 1320 | 1327 | init_waitqueue_head(&rdev->irq.vblank_queue); |
|---|
| 1321 | | - mutex_init(&rdev->mn_lock); |
|---|
| 1322 | | - hash_init(rdev->mn_hash); |
|---|
| 1323 | 1328 | r = radeon_gem_init(rdev); |
|---|
| 1324 | 1329 | if (r) |
|---|
| 1325 | 1330 | return r; |
|---|
| .. | .. |
|---|
| 1358 | 1363 | else |
|---|
| 1359 | 1364 | rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */ |
|---|
| 1360 | 1365 | |
|---|
| 1361 | | - /* set DMA mask + need_dma32 flags. |
|---|
| 1366 | + /* set DMA mask. |
|---|
| 1362 | 1367 | * PCIE - can handle 40-bits. |
|---|
| 1363 | 1368 | * IGP - can handle 40-bits |
|---|
| 1364 | 1369 | * AGP - generally dma32 is safest |
|---|
| 1365 | 1370 | * PCI - dma32 for legacy pci gart, 40 bits on newer asics |
|---|
| 1366 | 1371 | */ |
|---|
| 1367 | | - rdev->need_dma32 = false; |
|---|
| 1372 | + dma_bits = 40; |
|---|
| 1368 | 1373 | if (rdev->flags & RADEON_IS_AGP) |
|---|
| 1369 | | - rdev->need_dma32 = true; |
|---|
| 1374 | + dma_bits = 32; |
|---|
| 1370 | 1375 | if ((rdev->flags & RADEON_IS_PCI) && |
|---|
| 1371 | 1376 | (rdev->family <= CHIP_RS740)) |
|---|
| 1372 | | - rdev->need_dma32 = true; |
|---|
| 1377 | + dma_bits = 32; |
|---|
| 1373 | 1378 | #ifdef CONFIG_PPC64 |
|---|
| 1374 | 1379 | if (rdev->family == CHIP_CEDAR) |
|---|
| 1375 | | - rdev->need_dma32 = true; |
|---|
| 1380 | + dma_bits = 32; |
|---|
| 1376 | 1381 | #endif |
|---|
| 1377 | 1382 | |
|---|
| 1378 | | - dma_bits = rdev->need_dma32 ? 32 : 40; |
|---|
| 1379 | | - r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
|---|
| 1383 | + r = dma_set_mask_and_coherent(&rdev->pdev->dev, DMA_BIT_MASK(dma_bits)); |
|---|
| 1380 | 1384 | if (r) { |
|---|
| 1381 | | - rdev->need_dma32 = true; |
|---|
| 1382 | | - dma_bits = 32; |
|---|
| 1383 | 1385 | pr_warn("radeon: No suitable DMA available\n"); |
|---|
| 1386 | + return r; |
|---|
| 1384 | 1387 | } |
|---|
| 1385 | | - r = pci_set_consistent_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
|---|
| 1386 | | - if (r) { |
|---|
| 1387 | | - pci_set_consistent_dma_mask(rdev->pdev, DMA_BIT_MASK(32)); |
|---|
| 1388 | | - pr_warn("radeon: No coherent DMA available\n"); |
|---|
| 1389 | | - } |
|---|
| 1390 | | - rdev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits); |
|---|
| 1388 | + rdev->need_swiotlb = drm_need_swiotlb(dma_bits); |
|---|
| 1391 | 1389 | |
|---|
| 1392 | 1390 | /* Registers mapping */ |
|---|
| 1393 | 1391 | /* TODO: block userspace mapping of io register */ |
|---|
| .. | .. |
|---|
| 1625 | 1623 | if (r) { |
|---|
| 1626 | 1624 | /* delay GPU reset to resume */ |
|---|
| 1627 | 1625 | radeon_fence_driver_force_completion(rdev, i); |
|---|
| 1626 | + } else { |
|---|
| 1627 | + /* finish executing delayed work */ |
|---|
| 1628 | + flush_delayed_work(&rdev->fence_drv[i].lockup_work); |
|---|
| 1628 | 1629 | } |
|---|
| 1629 | 1630 | } |
|---|
| 1630 | 1631 | |
|---|