.. | .. |
---|
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" |
---|
.. | .. |
---|
1015 | 1022 | { |
---|
1016 | 1023 | if (rdev->mode_info.atom_context) { |
---|
1017 | 1024 | kfree(rdev->mode_info.atom_context->scratch); |
---|
| 1025 | + kfree(rdev->mode_info.atom_context->iio); |
---|
1018 | 1026 | } |
---|
1019 | 1027 | kfree(rdev->mode_info.atom_context); |
---|
1020 | 1028 | rdev->mode_info.atom_context = NULL; |
---|
.. | .. |
---|
1256 | 1264 | * locking inversion with the driver load path. And the access here is |
---|
1257 | 1265 | * completely racy anyway. So don't bother with locking for now. |
---|
1258 | 1266 | */ |
---|
1259 | | - return dev->open_count == 0; |
---|
| 1267 | + return atomic_read(&dev->open_count) == 0; |
---|
1260 | 1268 | } |
---|
1261 | 1269 | |
---|
1262 | 1270 | static const struct vga_switcheroo_client_ops radeon_switcheroo_ops = { |
---|
.. | .. |
---|
1318 | 1326 | init_rwsem(&rdev->pm.mclk_lock); |
---|
1319 | 1327 | init_rwsem(&rdev->exclusive_lock); |
---|
1320 | 1328 | init_waitqueue_head(&rdev->irq.vblank_queue); |
---|
1321 | | - mutex_init(&rdev->mn_lock); |
---|
1322 | | - hash_init(rdev->mn_hash); |
---|
1323 | 1329 | r = radeon_gem_init(rdev); |
---|
1324 | 1330 | if (r) |
---|
1325 | 1331 | return r; |
---|
.. | .. |
---|
1358 | 1364 | else |
---|
1359 | 1365 | rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */ |
---|
1360 | 1366 | |
---|
1361 | | - /* set DMA mask + need_dma32 flags. |
---|
| 1367 | + /* set DMA mask. |
---|
1362 | 1368 | * PCIE - can handle 40-bits. |
---|
1363 | 1369 | * IGP - can handle 40-bits |
---|
1364 | 1370 | * AGP - generally dma32 is safest |
---|
1365 | 1371 | * PCI - dma32 for legacy pci gart, 40 bits on newer asics |
---|
1366 | 1372 | */ |
---|
1367 | | - rdev->need_dma32 = false; |
---|
| 1373 | + dma_bits = 40; |
---|
1368 | 1374 | if (rdev->flags & RADEON_IS_AGP) |
---|
1369 | | - rdev->need_dma32 = true; |
---|
| 1375 | + dma_bits = 32; |
---|
1370 | 1376 | if ((rdev->flags & RADEON_IS_PCI) && |
---|
1371 | 1377 | (rdev->family <= CHIP_RS740)) |
---|
1372 | | - rdev->need_dma32 = true; |
---|
| 1378 | + dma_bits = 32; |
---|
1373 | 1379 | #ifdef CONFIG_PPC64 |
---|
1374 | 1380 | if (rdev->family == CHIP_CEDAR) |
---|
1375 | | - rdev->need_dma32 = true; |
---|
| 1381 | + dma_bits = 32; |
---|
1376 | 1382 | #endif |
---|
1377 | 1383 | |
---|
1378 | | - dma_bits = rdev->need_dma32 ? 32 : 40; |
---|
1379 | | - r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
---|
| 1384 | + r = dma_set_mask_and_coherent(&rdev->pdev->dev, DMA_BIT_MASK(dma_bits)); |
---|
1380 | 1385 | if (r) { |
---|
1381 | | - rdev->need_dma32 = true; |
---|
1382 | | - dma_bits = 32; |
---|
1383 | 1386 | pr_warn("radeon: No suitable DMA available\n"); |
---|
| 1387 | + return r; |
---|
1384 | 1388 | } |
---|
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); |
---|
| 1389 | + rdev->need_swiotlb = drm_need_swiotlb(dma_bits); |
---|
1391 | 1390 | |
---|
1392 | 1391 | /* Registers mapping */ |
---|
1393 | 1392 | /* TODO: block userspace mapping of io register */ |
---|
.. | .. |
---|
1625 | 1624 | if (r) { |
---|
1626 | 1625 | /* delay GPU reset to resume */ |
---|
1627 | 1626 | radeon_fence_driver_force_completion(rdev, i); |
---|
| 1627 | + } else { |
---|
| 1628 | + /* finish executing delayed work */ |
---|
| 1629 | + flush_delayed_work(&rdev->fence_drv[i].lockup_work); |
---|
1628 | 1630 | } |
---|
1629 | 1631 | } |
---|
1630 | 1632 | |
---|