Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'dma-mapping-6.19-2025-12-05' of git://git.kernel.org/pub/scm/linux/kernel/git/mszyprowski/linux

Pull dma-mapping updates from Marek Szyprowski:

- More DMA mapping API refactoring to physical addresses as the primary
interface instead of page+offset parameters.

This time dma_map_ops callbacks are converted to physical addresses,
what in turn results also in some simplification of architecture
specific code (Leon Romanovsky and Jason Gunthorpe)

- Clarify that dma_map_benchmark is not a kernel self-test, but
standalone tool (Qinxin Xia)

* tag 'dma-mapping-6.19-2025-12-05' of git://git.kernel.org/pub/scm/linux/kernel/git/mszyprowski/linux:
dma-mapping: remove unused map_page callback
xen: swiotlb: Convert mapping routine to rely on physical address
x86: Use physical address for DMA mapping
sparc: Use physical address DMA mapping
powerpc: Convert to physical address DMA mapping
parisc: Convert DMA map_page to map_phys interface
MIPS/jazzdma: Provide physical address directly
alpha: Convert mapping routine to rely on physical address
dma-mapping: remove unused mapping resource callbacks
xen: swiotlb: Switch to physical address mapping callbacks
ARM: dma-mapping: Switch to physical address mapping callbacks
ARM: dma-mapping: Reduce struct page exposure in arch_sync_dma*()
dma-mapping: convert dummy ops to physical address mapping
dma-mapping: prepare dma_map_ops to conversion to physical address
tools/dma: move dma_map_benchmark from selftests to tools/dma

+435 -450
+21 -27
arch/alpha/kernel/pci_iommu.c
··· 224 224 until either pci_unmap_single or pci_dma_sync_single is performed. */ 225 225 226 226 static dma_addr_t 227 - pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size, 227 + pci_map_single_1(struct pci_dev *pdev, phys_addr_t paddr, size_t size, 228 228 int dac_allowed) 229 229 { 230 230 struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose; 231 231 dma_addr_t max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK; 232 + unsigned long offset = offset_in_page(paddr); 232 233 struct pci_iommu_arena *arena; 233 234 long npages, dma_ofs, i; 234 - unsigned long paddr; 235 235 dma_addr_t ret; 236 236 unsigned int align = 0; 237 237 struct device *dev = pdev ? &pdev->dev : NULL; 238 - 239 - paddr = __pa(cpu_addr); 240 238 241 239 #if !DEBUG_NODIRECT 242 240 /* First check to see if we can use the direct map window. */ ··· 242 244 && paddr + size <= __direct_map_size) { 243 245 ret = paddr + __direct_map_base; 244 246 245 - DBGA2("pci_map_single: [%p,%zx] -> direct %llx from %ps\n", 246 - cpu_addr, size, ret, __builtin_return_address(0)); 247 + DBGA2("pci_map_single: [%pa,%zx] -> direct %llx from %ps\n", 248 + &paddr, size, ret, __builtin_return_address(0)); 247 249 248 250 return ret; 249 251 } ··· 253 255 if (dac_allowed) { 254 256 ret = paddr + alpha_mv.pci_dac_offset; 255 257 256 - DBGA2("pci_map_single: [%p,%zx] -> DAC %llx from %ps\n", 257 - cpu_addr, size, ret, __builtin_return_address(0)); 258 + DBGA2("pci_map_single: [%pa,%zx] -> DAC %llx from %ps\n", 259 + &paddr, size, ret, __builtin_return_address(0)); 258 260 259 261 return ret; 260 262 } ··· 288 290 arena->ptes[i + dma_ofs] = mk_iommu_pte(paddr); 289 291 290 292 ret = arena->dma_base + dma_ofs * PAGE_SIZE; 291 - ret += (unsigned long)cpu_addr & ~PAGE_MASK; 293 + ret += offset; 292 294 293 - DBGA2("pci_map_single: [%p,%zx] np %ld -> sg %llx from %ps\n", 294 - cpu_addr, size, npages, ret, __builtin_return_address(0)); 295 + DBGA2("pci_map_single: [%pa,%zx] np %ld -> sg %llx from %ps\n", 296 + &paddr, size, npages, ret, __builtin_return_address(0)); 295 297 296 298 return ret; 297 299 } ··· 320 322 return NULL; 321 323 } 322 324 323 - static dma_addr_t alpha_pci_map_page(struct device *dev, struct page *page, 324 - unsigned long offset, size_t size, 325 - enum dma_data_direction dir, 325 + static dma_addr_t alpha_pci_map_phys(struct device *dev, phys_addr_t phys, 326 + size_t size, enum dma_data_direction dir, 326 327 unsigned long attrs) 327 328 { 328 329 struct pci_dev *pdev = alpha_gendev_to_pci(dev); 329 330 int dac_allowed; 330 331 331 - BUG_ON(dir == DMA_NONE); 332 + if (unlikely(attrs & DMA_ATTR_MMIO)) 333 + return DMA_MAPPING_ERROR; 332 334 333 - dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0; 334 - return pci_map_single_1(pdev, (char *)page_address(page) + offset, 335 - size, dac_allowed); 335 + dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0; 336 + return pci_map_single_1(pdev, phys, size, dac_allowed); 336 337 } 337 338 338 339 /* Unmap a single streaming mode DMA translation. The DMA_ADDR and ··· 340 343 the cpu to the buffer are guaranteed to see whatever the device 341 344 wrote there. */ 342 345 343 - static void alpha_pci_unmap_page(struct device *dev, dma_addr_t dma_addr, 346 + static void alpha_pci_unmap_phys(struct device *dev, dma_addr_t dma_addr, 344 347 size_t size, enum dma_data_direction dir, 345 348 unsigned long attrs) 346 349 { ··· 349 352 struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose; 350 353 struct pci_iommu_arena *arena; 351 354 long dma_ofs, npages; 352 - 353 - BUG_ON(dir == DMA_NONE); 354 355 355 356 if (dma_addr >= __direct_map_base 356 357 && dma_addr < __direct_map_base + __direct_map_size) { ··· 424 429 } 425 430 memset(cpu_addr, 0, size); 426 431 427 - *dma_addrp = pci_map_single_1(pdev, cpu_addr, size, 0); 432 + *dma_addrp = pci_map_single_1(pdev, virt_to_phys(cpu_addr), size, 0); 428 433 if (*dma_addrp == DMA_MAPPING_ERROR) { 429 434 free_pages((unsigned long)cpu_addr, order); 430 435 if (alpha_mv.mv_pci_tbi || (gfp & GFP_DMA)) ··· 638 643 /* Fast path single entry scatterlists. */ 639 644 if (nents == 1) { 640 645 sg->dma_length = sg->length; 641 - sg->dma_address 642 - = pci_map_single_1(pdev, SG_ENT_VIRT_ADDRESS(sg), 643 - sg->length, dac_allowed); 646 + sg->dma_address = pci_map_single_1(pdev, sg_phys(sg), 647 + sg->length, dac_allowed); 644 648 if (sg->dma_address == DMA_MAPPING_ERROR) 645 649 return -EIO; 646 650 return 1; ··· 911 917 const struct dma_map_ops alpha_pci_ops = { 912 918 .alloc = alpha_pci_alloc_coherent, 913 919 .free = alpha_pci_free_coherent, 914 - .map_page = alpha_pci_map_page, 915 - .unmap_page = alpha_pci_unmap_page, 920 + .map_phys = alpha_pci_map_phys, 921 + .unmap_phys = alpha_pci_unmap_phys, 916 922 .map_sg = alpha_pci_map_sg, 917 923 .unmap_sg = alpha_pci_unmap_sg, 918 924 .dma_supported = alpha_pci_supported,
+53 -127
arch/arm/mm/dma-mapping.c
··· 624 624 kfree(buf); 625 625 } 626 626 627 - static void dma_cache_maint_page(struct page *page, unsigned long offset, 628 - size_t size, enum dma_data_direction dir, 627 + static void dma_cache_maint_page(phys_addr_t phys, size_t size, 628 + enum dma_data_direction dir, 629 629 void (*op)(const void *, size_t, int)) 630 630 { 631 - unsigned long pfn; 631 + unsigned long offset = offset_in_page(phys); 632 + unsigned long pfn = __phys_to_pfn(phys); 632 633 size_t left = size; 633 - 634 - pfn = page_to_pfn(page) + offset / PAGE_SIZE; 635 - offset %= PAGE_SIZE; 636 634 637 635 /* 638 636 * A single sg entry may refer to multiple physically contiguous ··· 642 644 size_t len = left; 643 645 void *vaddr; 644 646 645 - page = pfn_to_page(pfn); 646 - 647 - if (PageHighMem(page)) { 647 + phys = __pfn_to_phys(pfn); 648 + if (PhysHighMem(phys)) { 648 649 if (len + offset > PAGE_SIZE) 649 650 len = PAGE_SIZE - offset; 650 651 651 652 if (cache_is_vipt_nonaliasing()) { 652 - vaddr = kmap_atomic(page); 653 + vaddr = kmap_atomic_pfn(pfn); 653 654 op(vaddr + offset, len, dir); 654 655 kunmap_atomic(vaddr); 655 656 } else { 657 + struct page *page = phys_to_page(phys); 658 + 656 659 vaddr = kmap_high_get(page); 657 660 if (vaddr) { 658 661 op(vaddr + offset, len, dir); ··· 661 662 } 662 663 } 663 664 } else { 664 - vaddr = page_address(page) + offset; 665 + phys += offset; 666 + vaddr = phys_to_virt(phys); 665 667 op(vaddr, len, dir); 666 668 } 667 669 offset = 0; ··· 676 676 * Note: Drivers should NOT use this function directly. 677 677 * Use the driver DMA support - see dma-mapping.h (dma_sync_*) 678 678 */ 679 - static void __dma_page_cpu_to_dev(struct page *page, unsigned long off, 680 - size_t size, enum dma_data_direction dir) 679 + void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, 680 + enum dma_data_direction dir) 681 681 { 682 - phys_addr_t paddr; 682 + dma_cache_maint_page(paddr, size, dir, dmac_map_area); 683 683 684 - dma_cache_maint_page(page, off, size, dir, dmac_map_area); 685 - 686 - paddr = page_to_phys(page) + off; 687 684 if (dir == DMA_FROM_DEVICE) { 688 685 outer_inv_range(paddr, paddr + size); 689 686 } else { ··· 689 692 /* FIXME: non-speculating: flush on bidirectional mappings? */ 690 693 } 691 694 692 - static void __dma_page_dev_to_cpu(struct page *page, unsigned long off, 693 - size_t size, enum dma_data_direction dir) 695 + void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, 696 + enum dma_data_direction dir) 694 697 { 695 - phys_addr_t paddr = page_to_phys(page) + off; 696 - 697 698 /* FIXME: non-speculating: not required */ 698 699 /* in any case, don't bother invalidating if DMA to device */ 699 700 if (dir != DMA_TO_DEVICE) { 700 701 outer_inv_range(paddr, paddr + size); 701 702 702 - dma_cache_maint_page(page, off, size, dir, dmac_unmap_area); 703 + dma_cache_maint_page(paddr, size, dir, dmac_unmap_area); 703 704 } 704 705 705 706 /* ··· 731 736 732 737 if (attrs & DMA_ATTR_PRIVILEGED) 733 738 prot |= IOMMU_PRIV; 739 + 740 + if (attrs & DMA_ATTR_MMIO) 741 + prot |= IOMMU_MMIO; 734 742 735 743 switch (dir) { 736 744 case DMA_BIDIRECTIONAL: ··· 1203 1205 unsigned int len = PAGE_ALIGN(s->offset + s->length); 1204 1206 1205 1207 if (!dev->dma_coherent && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) 1206 - __dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir); 1208 + arch_sync_dma_for_device(sg_phys(s), s->length, dir); 1207 1209 1208 1210 prot = __dma_info_to_prot(dir, attrs); 1209 1211 ··· 1305 1307 __iommu_remove_mapping(dev, sg_dma_address(s), 1306 1308 sg_dma_len(s)); 1307 1309 if (!dev->dma_coherent && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) 1308 - __dma_page_dev_to_cpu(sg_page(s), s->offset, 1309 - s->length, dir); 1310 + arch_sync_dma_for_cpu(sg_phys(s), s->length, dir); 1310 1311 } 1311 1312 } 1312 1313 ··· 1327 1330 return; 1328 1331 1329 1332 for_each_sg(sg, s, nents, i) 1330 - __dma_page_dev_to_cpu(sg_page(s), s->offset, s->length, dir); 1333 + arch_sync_dma_for_cpu(sg_phys(s), s->length, dir); 1331 1334 1332 1335 } 1333 1336 ··· 1349 1352 return; 1350 1353 1351 1354 for_each_sg(sg, s, nents, i) 1352 - __dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir); 1355 + arch_sync_dma_for_device(sg_phys(s), s->length, dir); 1353 1356 } 1354 1357 1355 1358 /** 1356 - * arm_iommu_map_page 1359 + * arm_iommu_map_phys 1357 1360 * @dev: valid struct device pointer 1358 - * @page: page that buffer resides in 1359 - * @offset: offset into page for start of buffer 1361 + * @phys: physical address that buffer resides in 1360 1362 * @size: size of buffer to map 1361 1363 * @dir: DMA transfer direction 1364 + * @attrs: DMA mapping attributes 1362 1365 * 1363 1366 * IOMMU aware version of arm_dma_map_page() 1364 1367 */ 1365 - static dma_addr_t arm_iommu_map_page(struct device *dev, struct page *page, 1366 - unsigned long offset, size_t size, enum dma_data_direction dir, 1367 - unsigned long attrs) 1368 + static dma_addr_t arm_iommu_map_phys(struct device *dev, phys_addr_t phys, 1369 + size_t size, enum dma_data_direction dir, unsigned long attrs) 1368 1370 { 1369 1371 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); 1372 + int len = PAGE_ALIGN(size + offset_in_page(phys)); 1373 + phys_addr_t addr = phys & PAGE_MASK; 1370 1374 dma_addr_t dma_addr; 1371 - int ret, prot, len = PAGE_ALIGN(size + offset); 1375 + int ret, prot; 1372 1376 1373 - if (!dev->dma_coherent && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) 1374 - __dma_page_cpu_to_dev(page, offset, size, dir); 1377 + if (!dev->dma_coherent && 1378 + !(attrs & (DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_MMIO))) 1379 + arch_sync_dma_for_device(phys, size, dir); 1375 1380 1376 1381 dma_addr = __alloc_iova(mapping, len); 1377 1382 if (dma_addr == DMA_MAPPING_ERROR) ··· 1381 1382 1382 1383 prot = __dma_info_to_prot(dir, attrs); 1383 1384 1384 - ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len, 1385 - prot, GFP_KERNEL); 1385 + ret = iommu_map(mapping->domain, dma_addr, addr, len, prot, GFP_KERNEL); 1386 1386 if (ret < 0) 1387 1387 goto fail; 1388 1388 1389 - return dma_addr + offset; 1389 + return dma_addr + offset_in_page(phys); 1390 1390 fail: 1391 1391 __free_iova(mapping, dma_addr, len); 1392 1392 return DMA_MAPPING_ERROR; ··· 1397 1399 * @handle: DMA address of buffer 1398 1400 * @size: size of buffer (same as passed to dma_map_page) 1399 1401 * @dir: DMA transfer direction (same as passed to dma_map_page) 1402 + * @attrs: DMA mapping attributes 1400 1403 * 1401 - * IOMMU aware version of arm_dma_unmap_page() 1404 + * IOMMU aware version of arm_dma_unmap_phys() 1402 1405 */ 1403 - static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle, 1406 + static void arm_iommu_unmap_phys(struct device *dev, dma_addr_t handle, 1404 1407 size_t size, enum dma_data_direction dir, unsigned long attrs) 1405 1408 { 1406 1409 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); 1407 1410 dma_addr_t iova = handle & PAGE_MASK; 1408 - struct page *page; 1409 1411 int offset = handle & ~PAGE_MASK; 1410 1412 int len = PAGE_ALIGN(size + offset); 1411 1413 1412 1414 if (!iova) 1413 1415 return; 1414 1416 1415 - if (!dev->dma_coherent && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) { 1416 - page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); 1417 - __dma_page_dev_to_cpu(page, offset, size, dir); 1417 + if (!dev->dma_coherent && 1418 + !(attrs & (DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_MMIO))) { 1419 + phys_addr_t phys = iommu_iova_to_phys(mapping->domain, iova); 1420 + 1421 + arch_sync_dma_for_cpu(phys + offset, size, dir); 1418 1422 } 1419 - 1420 - iommu_unmap(mapping->domain, iova, len); 1421 - __free_iova(mapping, iova, len); 1422 - } 1423 - 1424 - /** 1425 - * arm_iommu_map_resource - map a device resource for DMA 1426 - * @dev: valid struct device pointer 1427 - * @phys_addr: physical address of resource 1428 - * @size: size of resource to map 1429 - * @dir: DMA transfer direction 1430 - */ 1431 - static dma_addr_t arm_iommu_map_resource(struct device *dev, 1432 - phys_addr_t phys_addr, size_t size, 1433 - enum dma_data_direction dir, unsigned long attrs) 1434 - { 1435 - struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); 1436 - dma_addr_t dma_addr; 1437 - int ret, prot; 1438 - phys_addr_t addr = phys_addr & PAGE_MASK; 1439 - unsigned int offset = phys_addr & ~PAGE_MASK; 1440 - size_t len = PAGE_ALIGN(size + offset); 1441 - 1442 - dma_addr = __alloc_iova(mapping, len); 1443 - if (dma_addr == DMA_MAPPING_ERROR) 1444 - return dma_addr; 1445 - 1446 - prot = __dma_info_to_prot(dir, attrs) | IOMMU_MMIO; 1447 - 1448 - ret = iommu_map(mapping->domain, dma_addr, addr, len, prot, GFP_KERNEL); 1449 - if (ret < 0) 1450 - goto fail; 1451 - 1452 - return dma_addr + offset; 1453 - fail: 1454 - __free_iova(mapping, dma_addr, len); 1455 - return DMA_MAPPING_ERROR; 1456 - } 1457 - 1458 - /** 1459 - * arm_iommu_unmap_resource - unmap a device DMA resource 1460 - * @dev: valid struct device pointer 1461 - * @dma_handle: DMA address to resource 1462 - * @size: size of resource to map 1463 - * @dir: DMA transfer direction 1464 - */ 1465 - static void arm_iommu_unmap_resource(struct device *dev, dma_addr_t dma_handle, 1466 - size_t size, enum dma_data_direction dir, 1467 - unsigned long attrs) 1468 - { 1469 - struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); 1470 - dma_addr_t iova = dma_handle & PAGE_MASK; 1471 - unsigned int offset = dma_handle & ~PAGE_MASK; 1472 - size_t len = PAGE_ALIGN(size + offset); 1473 - 1474 - if (!iova) 1475 - return; 1476 1423 1477 1424 iommu_unmap(mapping->domain, iova, len); 1478 1425 __free_iova(mapping, iova, len); ··· 1428 1485 { 1429 1486 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); 1430 1487 dma_addr_t iova = handle & PAGE_MASK; 1431 - struct page *page; 1432 1488 unsigned int offset = handle & ~PAGE_MASK; 1489 + phys_addr_t phys; 1433 1490 1434 1491 if (dev->dma_coherent || !iova) 1435 1492 return; 1436 1493 1437 - page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); 1438 - __dma_page_dev_to_cpu(page, offset, size, dir); 1494 + phys = iommu_iova_to_phys(mapping->domain, iova); 1495 + arch_sync_dma_for_cpu(phys + offset, size, dir); 1439 1496 } 1440 1497 1441 1498 static void arm_iommu_sync_single_for_device(struct device *dev, ··· 1443 1500 { 1444 1501 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); 1445 1502 dma_addr_t iova = handle & PAGE_MASK; 1446 - struct page *page; 1447 1503 unsigned int offset = handle & ~PAGE_MASK; 1504 + phys_addr_t phys; 1448 1505 1449 1506 if (dev->dma_coherent || !iova) 1450 1507 return; 1451 1508 1452 - page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); 1453 - __dma_page_cpu_to_dev(page, offset, size, dir); 1509 + phys = iommu_iova_to_phys(mapping->domain, iova); 1510 + arch_sync_dma_for_device(phys + offset, size, dir); 1454 1511 } 1455 1512 1456 1513 static const struct dma_map_ops iommu_ops = { ··· 1459 1516 .mmap = arm_iommu_mmap_attrs, 1460 1517 .get_sgtable = arm_iommu_get_sgtable, 1461 1518 1462 - .map_page = arm_iommu_map_page, 1463 - .unmap_page = arm_iommu_unmap_page, 1519 + .map_phys = arm_iommu_map_phys, 1520 + .unmap_phys = arm_iommu_unmap_phys, 1464 1521 .sync_single_for_cpu = arm_iommu_sync_single_for_cpu, 1465 1522 .sync_single_for_device = arm_iommu_sync_single_for_device, 1466 1523 ··· 1468 1525 .unmap_sg = arm_iommu_unmap_sg, 1469 1526 .sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu, 1470 1527 .sync_sg_for_device = arm_iommu_sync_sg_for_device, 1471 - 1472 - .map_resource = arm_iommu_map_resource, 1473 - .unmap_resource = arm_iommu_unmap_resource, 1474 1528 }; 1475 1529 1476 1530 /** ··· 1732 1792 arm_teardown_iommu_dma_ops(dev); 1733 1793 /* Let arch_setup_dma_ops() start again from scratch upon re-probe */ 1734 1794 set_dma_ops(dev, NULL); 1735 - } 1736 - 1737 - void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, 1738 - enum dma_data_direction dir) 1739 - { 1740 - __dma_page_cpu_to_dev(phys_to_page(paddr), paddr & (PAGE_SIZE - 1), 1741 - size, dir); 1742 - } 1743 - 1744 - void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, 1745 - enum dma_data_direction dir) 1746 - { 1747 - __dma_page_dev_to_cpu(phys_to_page(paddr), paddr & (PAGE_SIZE - 1), 1748 - size, dir); 1749 1795 } 1750 1796 1751 1797 void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
+13 -7
arch/mips/jazz/jazzdma.c
··· 521 521 __free_pages(virt_to_page(vaddr), get_order(size)); 522 522 } 523 523 524 - static dma_addr_t jazz_dma_map_page(struct device *dev, struct page *page, 525 - unsigned long offset, size_t size, enum dma_data_direction dir, 526 - unsigned long attrs) 524 + static dma_addr_t jazz_dma_map_phys(struct device *dev, phys_addr_t phys, 525 + size_t size, enum dma_data_direction dir, unsigned long attrs) 527 526 { 528 - phys_addr_t phys = page_to_phys(page) + offset; 527 + if (unlikely(attrs & DMA_ATTR_MMIO)) 528 + /* 529 + * This check is included because older versions of the code lacked 530 + * MMIO path support, and my ability to test this path is limited. 531 + * However, from a software technical standpoint, there is no restriction, 532 + * as the following code operates solely on physical addresses. 533 + */ 534 + return DMA_MAPPING_ERROR; 529 535 530 536 if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) 531 537 arch_sync_dma_for_device(phys, size, dir); 532 538 return vdma_alloc(phys, size); 533 539 } 534 540 535 - static void jazz_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, 541 + static void jazz_dma_unmap_phys(struct device *dev, dma_addr_t dma_addr, 536 542 size_t size, enum dma_data_direction dir, unsigned long attrs) 537 543 { 538 544 if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) ··· 613 607 const struct dma_map_ops jazz_dma_ops = { 614 608 .alloc = jazz_dma_alloc, 615 609 .free = jazz_dma_free, 616 - .map_page = jazz_dma_map_page, 617 - .unmap_page = jazz_dma_unmap_page, 610 + .map_phys = jazz_dma_map_phys, 611 + .unmap_phys = jazz_dma_unmap_phys, 618 612 .map_sg = jazz_dma_map_sg, 619 613 .unmap_sg = jazz_dma_unmap_sg, 620 614 .sync_single_for_cpu = jazz_dma_sync_single_for_cpu,
+4 -4
arch/powerpc/include/asm/iommu.h
··· 274 274 unsigned long mask, gfp_t flag, int node); 275 275 extern void iommu_free_coherent(struct iommu_table *tbl, size_t size, 276 276 void *vaddr, dma_addr_t dma_handle); 277 - extern dma_addr_t iommu_map_page(struct device *dev, struct iommu_table *tbl, 278 - struct page *page, unsigned long offset, 279 - size_t size, unsigned long mask, 277 + extern dma_addr_t iommu_map_phys(struct device *dev, struct iommu_table *tbl, 278 + phys_addr_t phys, size_t size, 279 + unsigned long mask, 280 280 enum dma_data_direction direction, 281 281 unsigned long attrs); 282 - extern void iommu_unmap_page(struct iommu_table *tbl, dma_addr_t dma_handle, 282 + extern void iommu_unmap_phys(struct iommu_table *tbl, dma_addr_t dma_handle, 283 283 size_t size, enum dma_data_direction direction, 284 284 unsigned long attrs); 285 285
+10 -12
arch/powerpc/kernel/dma-iommu.c
··· 93 93 94 94 /* Creates TCEs for a user provided buffer. The user buffer must be 95 95 * contiguous real kernel storage (not vmalloc). The address passed here 96 - * comprises a page address and offset into that page. The dma_addr_t 97 - * returned will point to the same byte within the page as was passed in. 96 + * is a physical address to that page. The dma_addr_t returned will point 97 + * to the same byte within the page as was passed in. 98 98 */ 99 - static dma_addr_t dma_iommu_map_page(struct device *dev, struct page *page, 100 - unsigned long offset, size_t size, 99 + static dma_addr_t dma_iommu_map_phys(struct device *dev, phys_addr_t phys, 100 + size_t size, 101 101 enum dma_data_direction direction, 102 102 unsigned long attrs) 103 103 { 104 - return iommu_map_page(dev, get_iommu_table_base(dev), page, offset, 105 - size, dma_get_mask(dev), direction, attrs); 104 + return iommu_map_phys(dev, get_iommu_table_base(dev), phys, size, 105 + dma_get_mask(dev), direction, attrs); 106 106 } 107 107 108 - 109 - static void dma_iommu_unmap_page(struct device *dev, dma_addr_t dma_handle, 108 + static void dma_iommu_unmap_phys(struct device *dev, dma_addr_t dma_handle, 110 109 size_t size, enum dma_data_direction direction, 111 110 unsigned long attrs) 112 111 { 113 - iommu_unmap_page(get_iommu_table_base(dev), dma_handle, size, direction, 112 + iommu_unmap_phys(get_iommu_table_base(dev), dma_handle, size, direction, 114 113 attrs); 115 114 } 116 - 117 115 118 116 static int dma_iommu_map_sg(struct device *dev, struct scatterlist *sglist, 119 117 int nelems, enum dma_data_direction direction, ··· 209 211 .map_sg = dma_iommu_map_sg, 210 212 .unmap_sg = dma_iommu_unmap_sg, 211 213 .dma_supported = dma_iommu_dma_supported, 212 - .map_page = dma_iommu_map_page, 213 - .unmap_page = dma_iommu_unmap_page, 214 + .map_phys = dma_iommu_map_phys, 215 + .unmap_phys = dma_iommu_unmap_phys, 214 216 .get_required_mask = dma_iommu_get_required_mask, 215 217 .mmap = dma_common_mmap, 216 218 .get_sgtable = dma_common_get_sgtable,
+7 -7
arch/powerpc/kernel/iommu.c
··· 848 848 849 849 /* Creates TCEs for a user provided buffer. The user buffer must be 850 850 * contiguous real kernel storage (not vmalloc). The address passed here 851 - * comprises a page address and offset into that page. The dma_addr_t 852 - * returned will point to the same byte within the page as was passed in. 851 + * is physical address into that page. The dma_addr_t returned will point 852 + * to the same byte within the page as was passed in. 853 853 */ 854 - dma_addr_t iommu_map_page(struct device *dev, struct iommu_table *tbl, 855 - struct page *page, unsigned long offset, size_t size, 856 - unsigned long mask, enum dma_data_direction direction, 854 + dma_addr_t iommu_map_phys(struct device *dev, struct iommu_table *tbl, 855 + phys_addr_t phys, size_t size, unsigned long mask, 856 + enum dma_data_direction direction, 857 857 unsigned long attrs) 858 858 { 859 859 dma_addr_t dma_handle = DMA_MAPPING_ERROR; ··· 863 863 864 864 BUG_ON(direction == DMA_NONE); 865 865 866 - vaddr = page_address(page) + offset; 866 + vaddr = phys_to_virt(phys); 867 867 uaddr = (unsigned long)vaddr; 868 868 869 869 if (tbl) { ··· 890 890 return dma_handle; 891 891 } 892 892 893 - void iommu_unmap_page(struct iommu_table *tbl, dma_addr_t dma_handle, 893 + void iommu_unmap_phys(struct iommu_table *tbl, dma_addr_t dma_handle, 894 894 size_t size, enum dma_data_direction direction, 895 895 unsigned long attrs) 896 896 {
+19 -14
arch/powerpc/platforms/ps3/system-bus.c
··· 551 551 552 552 /* Creates TCEs for a user provided buffer. The user buffer must be 553 553 * contiguous real kernel storage (not vmalloc). The address passed here 554 - * comprises a page address and offset into that page. The dma_addr_t 555 - * returned will point to the same byte within the page as was passed in. 554 + * is physical address to that hat page. The dma_addr_t returned will point 555 + * to the same byte within the page as was passed in. 556 556 */ 557 557 558 - static dma_addr_t ps3_sb_map_page(struct device *_dev, struct page *page, 559 - unsigned long offset, size_t size, enum dma_data_direction direction, 560 - unsigned long attrs) 558 + static dma_addr_t ps3_sb_map_phys(struct device *_dev, phys_addr_t phys, 559 + size_t size, enum dma_data_direction direction, unsigned long attrs) 561 560 { 562 561 struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); 563 562 int result; 564 563 dma_addr_t bus_addr; 565 - void *ptr = page_address(page) + offset; 564 + void *ptr = phys_to_virt(phys); 565 + 566 + if (unlikely(attrs & DMA_ATTR_MMIO)) 567 + return DMA_MAPPING_ERROR; 566 568 567 569 result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size, 568 570 &bus_addr, ··· 579 577 return bus_addr; 580 578 } 581 579 582 - static dma_addr_t ps3_ioc0_map_page(struct device *_dev, struct page *page, 583 - unsigned long offset, size_t size, 580 + static dma_addr_t ps3_ioc0_map_phys(struct device *_dev, phys_addr_t phys, 581 + size_t size, 584 582 enum dma_data_direction direction, 585 583 unsigned long attrs) 586 584 { ··· 588 586 int result; 589 587 dma_addr_t bus_addr; 590 588 u64 iopte_flag; 591 - void *ptr = page_address(page) + offset; 589 + void *ptr = phys_to_virt(phys); 590 + 591 + if (unlikely(attrs & DMA_ATTR_MMIO)) 592 + return DMA_MAPPING_ERROR; 592 593 593 594 iopte_flag = CBE_IOPTE_M; 594 595 switch (direction) { ··· 618 613 return bus_addr; 619 614 } 620 615 621 - static void ps3_unmap_page(struct device *_dev, dma_addr_t dma_addr, 616 + static void ps3_unmap_phys(struct device *_dev, dma_addr_t dma_addr, 622 617 size_t size, enum dma_data_direction direction, unsigned long attrs) 623 618 { 624 619 struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); ··· 695 690 .map_sg = ps3_sb_map_sg, 696 691 .unmap_sg = ps3_sb_unmap_sg, 697 692 .dma_supported = ps3_dma_supported, 698 - .map_page = ps3_sb_map_page, 699 - .unmap_page = ps3_unmap_page, 693 + .map_phys = ps3_sb_map_phys, 694 + .unmap_phys = ps3_unmap_phys, 700 695 .mmap = dma_common_mmap, 701 696 .get_sgtable = dma_common_get_sgtable, 702 697 .alloc_pages_op = dma_common_alloc_pages, ··· 709 704 .map_sg = ps3_ioc0_map_sg, 710 705 .unmap_sg = ps3_ioc0_unmap_sg, 711 706 .dma_supported = ps3_dma_supported, 712 - .map_page = ps3_ioc0_map_page, 713 - .unmap_page = ps3_unmap_page, 707 + .map_phys = ps3_ioc0_map_phys, 708 + .unmap_phys = ps3_unmap_phys, 714 709 .mmap = dma_common_mmap, 715 710 .get_sgtable = dma_common_get_sgtable, 716 711 .alloc_pages_op = dma_common_alloc_pages,
+8 -7
arch/powerpc/platforms/pseries/ibmebus.c
··· 86 86 kfree(vaddr); 87 87 } 88 88 89 - static dma_addr_t ibmebus_map_page(struct device *dev, 90 - struct page *page, 91 - unsigned long offset, 89 + static dma_addr_t ibmebus_map_phys(struct device *dev, phys_addr_t phys, 92 90 size_t size, 93 91 enum dma_data_direction direction, 94 92 unsigned long attrs) 95 93 { 96 - return (dma_addr_t)(page_address(page) + offset); 94 + if (attrs & DMA_ATTR_MMIO) 95 + return DMA_MAPPING_ERROR; 96 + 97 + return (dma_addr_t)(phys_to_virt(phys)); 97 98 } 98 99 99 - static void ibmebus_unmap_page(struct device *dev, 100 + static void ibmebus_unmap_phys(struct device *dev, 100 101 dma_addr_t dma_addr, 101 102 size_t size, 102 103 enum dma_data_direction direction, ··· 147 146 .unmap_sg = ibmebus_unmap_sg, 148 147 .dma_supported = ibmebus_dma_supported, 149 148 .get_required_mask = ibmebus_dma_get_required_mask, 150 - .map_page = ibmebus_map_page, 151 - .unmap_page = ibmebus_unmap_page, 149 + .map_phys = ibmebus_map_phys, 150 + .unmap_phys = ibmebus_unmap_phys, 152 151 }; 153 152 154 153 static int ibmebus_match_path(struct device *dev, const void *data)
+12 -9
arch/powerpc/platforms/pseries/vio.c
··· 512 512 vio_cmo_dealloc(viodev, roundup(size, PAGE_SIZE)); 513 513 } 514 514 515 - static dma_addr_t vio_dma_iommu_map_page(struct device *dev, struct page *page, 516 - unsigned long offset, size_t size, 517 - enum dma_data_direction direction, 518 - unsigned long attrs) 515 + static dma_addr_t vio_dma_iommu_map_phys(struct device *dev, phys_addr_t phys, 516 + size_t size, 517 + enum dma_data_direction direction, 518 + unsigned long attrs) 519 519 { 520 520 struct vio_dev *viodev = to_vio_dev(dev); 521 521 struct iommu_table *tbl = get_iommu_table_base(dev); 522 522 dma_addr_t ret = DMA_MAPPING_ERROR; 523 523 524 + if (unlikely(attrs & DMA_ATTR_MMIO)) 525 + return ret; 526 + 524 527 if (vio_cmo_alloc(viodev, roundup(size, IOMMU_PAGE_SIZE(tbl)))) 525 528 goto out_fail; 526 - ret = iommu_map_page(dev, tbl, page, offset, size, dma_get_mask(dev), 529 + ret = iommu_map_phys(dev, tbl, phys, size, dma_get_mask(dev), 527 530 direction, attrs); 528 531 if (unlikely(ret == DMA_MAPPING_ERROR)) 529 532 goto out_deallocate; ··· 539 536 return DMA_MAPPING_ERROR; 540 537 } 541 538 542 - static void vio_dma_iommu_unmap_page(struct device *dev, dma_addr_t dma_handle, 539 + static void vio_dma_iommu_unmap_phys(struct device *dev, dma_addr_t dma_handle, 543 540 size_t size, 544 541 enum dma_data_direction direction, 545 542 unsigned long attrs) ··· 547 544 struct vio_dev *viodev = to_vio_dev(dev); 548 545 struct iommu_table *tbl = get_iommu_table_base(dev); 549 546 550 - iommu_unmap_page(tbl, dma_handle, size, direction, attrs); 547 + iommu_unmap_phys(tbl, dma_handle, size, direction, attrs); 551 548 vio_cmo_dealloc(viodev, roundup(size, IOMMU_PAGE_SIZE(tbl))); 552 549 } 553 550 ··· 608 605 .free = vio_dma_iommu_free_coherent, 609 606 .map_sg = vio_dma_iommu_map_sg, 610 607 .unmap_sg = vio_dma_iommu_unmap_sg, 611 - .map_page = vio_dma_iommu_map_page, 612 - .unmap_page = vio_dma_iommu_unmap_page, 608 + .map_phys = vio_dma_iommu_map_phys, 609 + .unmap_phys = vio_dma_iommu_unmap_phys, 613 610 .dma_supported = dma_iommu_dma_supported, 614 611 .get_required_mask = dma_iommu_get_required_mask, 615 612 .mmap = dma_common_mmap,
+19 -11
arch/sparc/kernel/iommu.c
··· 260 260 free_pages((unsigned long)cpu, order); 261 261 } 262 262 263 - static dma_addr_t dma_4u_map_page(struct device *dev, struct page *page, 264 - unsigned long offset, size_t sz, 265 - enum dma_data_direction direction, 263 + static dma_addr_t dma_4u_map_phys(struct device *dev, phys_addr_t phys, 264 + size_t sz, enum dma_data_direction direction, 266 265 unsigned long attrs) 267 266 { 268 267 struct iommu *iommu; 269 268 struct strbuf *strbuf; 270 269 iopte_t *base; 271 270 unsigned long flags, npages, oaddr; 272 - unsigned long i, base_paddr, ctx; 271 + unsigned long i, ctx; 273 272 u32 bus_addr, ret; 274 273 unsigned long iopte_protection; 274 + 275 + if (unlikely(attrs & DMA_ATTR_MMIO)) 276 + /* 277 + * This check is included because older versions of the code 278 + * lacked MMIO path support, and my ability to test this path 279 + * is limited. However, from a software technical standpoint, 280 + * there is no restriction, as the following code operates 281 + * solely on physical addresses. 282 + */ 283 + goto bad_no_ctx; 275 284 276 285 iommu = dev->archdata.iommu; 277 286 strbuf = dev->archdata.stc; ··· 288 279 if (unlikely(direction == DMA_NONE)) 289 280 goto bad_no_ctx; 290 281 291 - oaddr = (unsigned long)(page_address(page) + offset); 282 + oaddr = (unsigned long)(phys_to_virt(phys)); 292 283 npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); 293 284 npages >>= IO_PAGE_SHIFT; 294 285 ··· 305 296 bus_addr = (iommu->tbl.table_map_base + 306 297 ((base - iommu->page_table) << IO_PAGE_SHIFT)); 307 298 ret = bus_addr | (oaddr & ~IO_PAGE_MASK); 308 - base_paddr = __pa(oaddr & IO_PAGE_MASK); 309 299 if (strbuf->strbuf_enabled) 310 300 iopte_protection = IOPTE_STREAMING(ctx); 311 301 else ··· 312 304 if (direction != DMA_TO_DEVICE) 313 305 iopte_protection |= IOPTE_WRITE; 314 306 315 - for (i = 0; i < npages; i++, base++, base_paddr += IO_PAGE_SIZE) 316 - iopte_val(*base) = iopte_protection | base_paddr; 307 + for (i = 0; i < npages; i++, base++, phys += IO_PAGE_SIZE) 308 + iopte_val(*base) = iopte_protection | phys; 317 309 318 310 return ret; 319 311 ··· 391 383 vaddr, ctx, npages); 392 384 } 393 385 394 - static void dma_4u_unmap_page(struct device *dev, dma_addr_t bus_addr, 386 + static void dma_4u_unmap_phys(struct device *dev, dma_addr_t bus_addr, 395 387 size_t sz, enum dma_data_direction direction, 396 388 unsigned long attrs) 397 389 { ··· 761 753 static const struct dma_map_ops sun4u_dma_ops = { 762 754 .alloc = dma_4u_alloc_coherent, 763 755 .free = dma_4u_free_coherent, 764 - .map_page = dma_4u_map_page, 765 - .unmap_page = dma_4u_unmap_page, 756 + .map_phys = dma_4u_map_phys, 757 + .unmap_phys = dma_4u_unmap_phys, 766 758 .map_sg = dma_4u_map_sg, 767 759 .unmap_sg = dma_4u_unmap_sg, 768 760 .sync_single_for_cpu = dma_4u_sync_single_for_cpu,
+19 -12
arch/sparc/kernel/pci_sun4v.c
··· 352 352 free_pages((unsigned long)cpu, order); 353 353 } 354 354 355 - static dma_addr_t dma_4v_map_page(struct device *dev, struct page *page, 356 - unsigned long offset, size_t sz, 357 - enum dma_data_direction direction, 355 + static dma_addr_t dma_4v_map_phys(struct device *dev, phys_addr_t phys, 356 + size_t sz, enum dma_data_direction direction, 358 357 unsigned long attrs) 359 358 { 360 359 struct iommu *iommu; ··· 361 362 struct iommu_map_table *tbl; 362 363 u64 mask; 363 364 unsigned long flags, npages, oaddr; 364 - unsigned long i, base_paddr; 365 - unsigned long prot; 365 + unsigned long i, prot; 366 366 dma_addr_t bus_addr, ret; 367 367 long entry; 368 + 369 + if (unlikely(attrs & DMA_ATTR_MMIO)) 370 + /* 371 + * This check is included because older versions of the code 372 + * lacked MMIO path support, and my ability to test this path 373 + * is limited. However, from a software technical standpoint, 374 + * there is no restriction, as the following code operates 375 + * solely on physical addresses. 376 + */ 377 + goto bad; 368 378 369 379 iommu = dev->archdata.iommu; 370 380 atu = iommu->atu; ··· 381 373 if (unlikely(direction == DMA_NONE)) 382 374 goto bad; 383 375 384 - oaddr = (unsigned long)(page_address(page) + offset); 376 + oaddr = (unsigned long)(phys_to_virt(phys)); 385 377 npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); 386 378 npages >>= IO_PAGE_SHIFT; 387 379 ··· 399 391 400 392 bus_addr = (tbl->table_map_base + (entry << IO_PAGE_SHIFT)); 401 393 ret = bus_addr | (oaddr & ~IO_PAGE_MASK); 402 - base_paddr = __pa(oaddr & IO_PAGE_MASK); 403 394 prot = HV_PCI_MAP_ATTR_READ; 404 395 if (direction != DMA_TO_DEVICE) 405 396 prot |= HV_PCI_MAP_ATTR_WRITE; ··· 410 403 411 404 iommu_batch_start(dev, prot, entry); 412 405 413 - for (i = 0; i < npages; i++, base_paddr += IO_PAGE_SIZE) { 414 - long err = iommu_batch_add(base_paddr, mask); 406 + for (i = 0; i < npages; i++, phys += IO_PAGE_SIZE) { 407 + long err = iommu_batch_add(phys, mask); 415 408 if (unlikely(err < 0L)) 416 409 goto iommu_map_fail; 417 410 } ··· 433 426 return DMA_MAPPING_ERROR; 434 427 } 435 428 436 - static void dma_4v_unmap_page(struct device *dev, dma_addr_t bus_addr, 429 + static void dma_4v_unmap_phys(struct device *dev, dma_addr_t bus_addr, 437 430 size_t sz, enum dma_data_direction direction, 438 431 unsigned long attrs) 439 432 { ··· 693 686 static const struct dma_map_ops sun4v_dma_ops = { 694 687 .alloc = dma_4v_alloc_coherent, 695 688 .free = dma_4v_free_coherent, 696 - .map_page = dma_4v_map_page, 697 - .unmap_page = dma_4v_unmap_page, 689 + .map_phys = dma_4v_map_phys, 690 + .unmap_phys = dma_4v_unmap_phys, 698 691 .map_sg = dma_4v_map_sg, 699 692 .unmap_sg = dma_4v_unmap_sg, 700 693 .dma_supported = dma_4v_supported,
+20 -18
arch/sparc/mm/io-unit.c
··· 94 94 subsys_initcall(iounit_init); 95 95 96 96 /* One has to hold iounit->lock to call this */ 97 - static unsigned long iounit_get_area(struct iounit_struct *iounit, unsigned long vaddr, int size) 97 + static dma_addr_t iounit_get_area(struct iounit_struct *iounit, 98 + phys_addr_t phys, int size) 98 99 { 99 100 int i, j, k, npages; 100 101 unsigned long rotor, scan, limit; 101 102 iopte_t iopte; 102 103 103 - npages = ((vaddr & ~PAGE_MASK) + size + (PAGE_SIZE-1)) >> PAGE_SHIFT; 104 + npages = (offset_in_page(phys) + size + (PAGE_SIZE - 1)) >> PAGE_SHIFT; 104 105 105 106 /* A tiny bit of magic ingredience :) */ 106 107 switch (npages) { ··· 110 109 default: i = 0x0213; break; 111 110 } 112 111 113 - IOD(("iounit_get_area(%08lx,%d[%d])=", vaddr, size, npages)); 112 + IOD(("%s(%pa,%d[%d])=", __func__, &phys, size, npages)); 114 113 115 114 next: j = (i & 15); 116 115 rotor = iounit->rotor[j - 1]; ··· 125 124 } 126 125 i >>= 4; 127 126 if (!(i & 15)) 128 - panic("iounit_get_area: Couldn't find free iopte slots for (%08lx,%d)\n", vaddr, size); 127 + panic("iounit_get_area: Couldn't find free iopte slots for (%pa,%d)\n", 128 + &phys, size); 129 129 goto next; 130 130 } 131 131 for (k = 1, scan++; k < npages; k++) ··· 134 132 goto nexti; 135 133 iounit->rotor[j - 1] = (scan < limit) ? scan : iounit->limit[j - 1]; 136 134 scan -= npages; 137 - iopte = MKIOPTE(__pa(vaddr & PAGE_MASK)); 138 - vaddr = IOUNIT_DMA_BASE + (scan << PAGE_SHIFT) + (vaddr & ~PAGE_MASK); 135 + iopte = MKIOPTE(phys & PAGE_MASK); 136 + phys = IOUNIT_DMA_BASE + (scan << PAGE_SHIFT) + offset_in_page(phys); 139 137 for (k = 0; k < npages; k++, iopte = __iopte(iopte_val(iopte) + 0x100), scan++) { 140 138 set_bit(scan, iounit->bmap); 141 139 sbus_writel(iopte_val(iopte), &iounit->page_table[scan]); 142 140 } 143 - IOD(("%08lx\n", vaddr)); 144 - return vaddr; 141 + IOD(("%pa\n", &phys)); 142 + return phys; 145 143 } 146 144 147 - static dma_addr_t iounit_map_page(struct device *dev, struct page *page, 148 - unsigned long offset, size_t len, enum dma_data_direction dir, 149 - unsigned long attrs) 145 + static dma_addr_t iounit_map_phys(struct device *dev, phys_addr_t phys, 146 + size_t len, enum dma_data_direction dir, unsigned long attrs) 150 147 { 151 - void *vaddr = page_address(page) + offset; 152 148 struct iounit_struct *iounit = dev->archdata.iommu; 153 - unsigned long ret, flags; 149 + unsigned long flags; 150 + dma_addr_t ret; 154 151 155 152 /* XXX So what is maxphys for us and how do drivers know it? */ 156 153 if (!len || len > 256 * 1024) 157 154 return DMA_MAPPING_ERROR; 158 155 159 156 spin_lock_irqsave(&iounit->lock, flags); 160 - ret = iounit_get_area(iounit, (unsigned long)vaddr, len); 157 + ret = iounit_get_area(iounit, phys, len); 161 158 spin_unlock_irqrestore(&iounit->lock, flags); 162 159 return ret; 163 160 } ··· 172 171 /* FIXME: Cache some resolved pages - often several sg entries are to the same page */ 173 172 spin_lock_irqsave(&iounit->lock, flags); 174 173 for_each_sg(sgl, sg, nents, i) { 175 - sg->dma_address = iounit_get_area(iounit, (unsigned long) sg_virt(sg), sg->length); 174 + sg->dma_address = 175 + iounit_get_area(iounit, sg_phys(sg), sg->length); 176 176 sg->dma_length = sg->length; 177 177 } 178 178 spin_unlock_irqrestore(&iounit->lock, flags); 179 179 return nents; 180 180 } 181 181 182 - static void iounit_unmap_page(struct device *dev, dma_addr_t vaddr, size_t len, 182 + static void iounit_unmap_phys(struct device *dev, dma_addr_t vaddr, size_t len, 183 183 enum dma_data_direction dir, unsigned long attrs) 184 184 { 185 185 struct iounit_struct *iounit = dev->archdata.iommu; ··· 281 279 .alloc = iounit_alloc, 282 280 .free = iounit_free, 283 281 #endif 284 - .map_page = iounit_map_page, 285 - .unmap_page = iounit_unmap_page, 282 + .map_phys = iounit_map_phys, 283 + .unmap_phys = iounit_unmap_phys, 286 284 .map_sg = iounit_map_sg, 287 285 .unmap_sg = iounit_unmap_sg, 288 286 };
+24 -22
arch/sparc/mm/iommu.c
··· 181 181 } 182 182 } 183 183 184 - static dma_addr_t __sbus_iommu_map_page(struct device *dev, struct page *page, 185 - unsigned long offset, size_t len, bool per_page_flush) 184 + static dma_addr_t __sbus_iommu_map_phys(struct device *dev, phys_addr_t paddr, 185 + size_t len, bool per_page_flush, unsigned long attrs) 186 186 { 187 187 struct iommu_struct *iommu = dev->archdata.iommu; 188 - phys_addr_t paddr = page_to_phys(page) + offset; 189 - unsigned long off = paddr & ~PAGE_MASK; 188 + unsigned long off = offset_in_page(paddr); 190 189 unsigned long npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT; 191 190 unsigned long pfn = __phys_to_pfn(paddr); 192 191 unsigned int busa, busa0; 193 192 iopte_t *iopte, *iopte0; 194 193 int ioptex, i; 194 + 195 + if (unlikely(attrs & DMA_ATTR_MMIO)) 196 + return DMA_MAPPING_ERROR; 195 197 196 198 /* XXX So what is maxphys for us and how do drivers know it? */ 197 199 if (!len || len > 256 * 1024) ··· 204 202 * XXX Is this a good assumption? 205 203 * XXX What if someone else unmaps it here and races us? 206 204 */ 207 - if (per_page_flush && !PageHighMem(page)) { 205 + if (per_page_flush && !PhysHighMem(paddr)) { 208 206 unsigned long vaddr, p; 209 207 210 - vaddr = (unsigned long)page_address(page) + offset; 208 + vaddr = (unsigned long)phys_to_virt(paddr); 211 209 for (p = vaddr & PAGE_MASK; p < vaddr + len; p += PAGE_SIZE) 212 210 flush_page_for_dma(p); 213 211 } ··· 233 231 return busa0 + off; 234 232 } 235 233 236 - static dma_addr_t sbus_iommu_map_page_gflush(struct device *dev, 237 - struct page *page, unsigned long offset, size_t len, 238 - enum dma_data_direction dir, unsigned long attrs) 234 + static dma_addr_t sbus_iommu_map_phys_gflush(struct device *dev, 235 + phys_addr_t phys, size_t len, enum dma_data_direction dir, 236 + unsigned long attrs) 239 237 { 240 238 flush_page_for_dma(0); 241 - return __sbus_iommu_map_page(dev, page, offset, len, false); 239 + return __sbus_iommu_map_phys(dev, phys, len, false, attrs); 242 240 } 243 241 244 - static dma_addr_t sbus_iommu_map_page_pflush(struct device *dev, 245 - struct page *page, unsigned long offset, size_t len, 246 - enum dma_data_direction dir, unsigned long attrs) 242 + static dma_addr_t sbus_iommu_map_phys_pflush(struct device *dev, 243 + phys_addr_t phys, size_t len, enum dma_data_direction dir, 244 + unsigned long attrs) 247 245 { 248 - return __sbus_iommu_map_page(dev, page, offset, len, true); 246 + return __sbus_iommu_map_phys(dev, phys, len, true, attrs); 249 247 } 250 248 251 249 static int __sbus_iommu_map_sg(struct device *dev, struct scatterlist *sgl, ··· 256 254 int j; 257 255 258 256 for_each_sg(sgl, sg, nents, j) { 259 - sg->dma_address =__sbus_iommu_map_page(dev, sg_page(sg), 260 - sg->offset, sg->length, per_page_flush); 257 + sg->dma_address = __sbus_iommu_map_phys(dev, sg_phys(sg), 258 + sg->length, per_page_flush, attrs); 261 259 if (sg->dma_address == DMA_MAPPING_ERROR) 262 260 return -EIO; 263 261 sg->dma_length = sg->length; ··· 279 277 return __sbus_iommu_map_sg(dev, sgl, nents, dir, attrs, true); 280 278 } 281 279 282 - static void sbus_iommu_unmap_page(struct device *dev, dma_addr_t dma_addr, 280 + static void sbus_iommu_unmap_phys(struct device *dev, dma_addr_t dma_addr, 283 281 size_t len, enum dma_data_direction dir, unsigned long attrs) 284 282 { 285 283 struct iommu_struct *iommu = dev->archdata.iommu; ··· 305 303 int i; 306 304 307 305 for_each_sg(sgl, sg, nents, i) { 308 - sbus_iommu_unmap_page(dev, sg->dma_address, sg->length, dir, 306 + sbus_iommu_unmap_phys(dev, sg->dma_address, sg->length, dir, 309 307 attrs); 310 308 sg->dma_address = 0x21212121; 311 309 } ··· 428 426 .alloc = sbus_iommu_alloc, 429 427 .free = sbus_iommu_free, 430 428 #endif 431 - .map_page = sbus_iommu_map_page_gflush, 432 - .unmap_page = sbus_iommu_unmap_page, 429 + .map_phys = sbus_iommu_map_phys_gflush, 430 + .unmap_phys = sbus_iommu_unmap_phys, 433 431 .map_sg = sbus_iommu_map_sg_gflush, 434 432 .unmap_sg = sbus_iommu_unmap_sg, 435 433 }; ··· 439 437 .alloc = sbus_iommu_alloc, 440 438 .free = sbus_iommu_free, 441 439 #endif 442 - .map_page = sbus_iommu_map_page_pflush, 443 - .unmap_page = sbus_iommu_unmap_page, 440 + .map_phys = sbus_iommu_map_phys_pflush, 441 + .unmap_phys = sbus_iommu_unmap_phys, 444 442 .map_sg = sbus_iommu_map_sg_pflush, 445 443 .unmap_sg = sbus_iommu_unmap_sg, 446 444 };
+10 -9
arch/x86/kernel/amd_gart_64.c
··· 222 222 } 223 223 224 224 /* Map a single area into the IOMMU */ 225 - static dma_addr_t gart_map_page(struct device *dev, struct page *page, 226 - unsigned long offset, size_t size, 227 - enum dma_data_direction dir, 225 + static dma_addr_t gart_map_phys(struct device *dev, phys_addr_t paddr, 226 + size_t size, enum dma_data_direction dir, 228 227 unsigned long attrs) 229 228 { 230 229 unsigned long bus; 231 - phys_addr_t paddr = page_to_phys(page) + offset; 230 + 231 + if (unlikely(attrs & DMA_ATTR_MMIO)) 232 + return DMA_MAPPING_ERROR; 232 233 233 234 if (!need_iommu(dev, paddr, size)) 234 235 return paddr; ··· 243 242 /* 244 243 * Free a DMA mapping. 245 244 */ 246 - static void gart_unmap_page(struct device *dev, dma_addr_t dma_addr, 245 + static void gart_unmap_phys(struct device *dev, dma_addr_t dma_addr, 247 246 size_t size, enum dma_data_direction dir, 248 247 unsigned long attrs) 249 248 { ··· 283 282 for_each_sg(sg, s, nents, i) { 284 283 if (!s->dma_length || !s->length) 285 284 break; 286 - gart_unmap_page(dev, s->dma_address, s->dma_length, dir, 0); 285 + gart_unmap_phys(dev, s->dma_address, s->dma_length, dir, 0); 287 286 } 288 287 } 289 288 ··· 488 487 gart_free_coherent(struct device *dev, size_t size, void *vaddr, 489 488 dma_addr_t dma_addr, unsigned long attrs) 490 489 { 491 - gart_unmap_page(dev, dma_addr, size, DMA_BIDIRECTIONAL, 0); 490 + gart_unmap_phys(dev, dma_addr, size, DMA_BIDIRECTIONAL, 0); 492 491 dma_direct_free(dev, size, vaddr, dma_addr, attrs); 493 492 } 494 493 ··· 673 672 static const struct dma_map_ops gart_dma_ops = { 674 673 .map_sg = gart_map_sg, 675 674 .unmap_sg = gart_unmap_sg, 676 - .map_page = gart_map_page, 677 - .unmap_page = gart_unmap_page, 675 + .map_phys = gart_map_phys, 676 + .unmap_phys = gart_unmap_phys, 678 677 .alloc = gart_alloc_coherent, 679 678 .free = gart_free_coherent, 680 679 .mmap = dma_common_mmap,
+28 -26
drivers/parisc/ccio-dma.c
··· 517 517 * ccio_io_pdir_entry - Initialize an I/O Pdir. 518 518 * @pdir_ptr: A pointer into I/O Pdir. 519 519 * @sid: The Space Identifier. 520 - * @vba: The virtual address. 520 + * @pba: The physical address. 521 521 * @hints: The DMA Hint. 522 522 * 523 - * Given a virtual address (vba, arg2) and space id, (sid, arg1), 523 + * Given a physical address (pba, arg2) and space id, (sid, arg1), 524 524 * load the I/O PDIR entry pointed to by pdir_ptr (arg0). Each IO Pdir 525 525 * entry consists of 8 bytes as shown below (MSB == bit 0): 526 526 * ··· 543 543 * index are bits 12:19 of the value returned by LCI. 544 544 */ 545 545 static void 546 - ccio_io_pdir_entry(__le64 *pdir_ptr, space_t sid, unsigned long vba, 546 + ccio_io_pdir_entry(__le64 *pdir_ptr, space_t sid, phys_addr_t pba, 547 547 unsigned long hints) 548 548 { 549 549 register unsigned long pa; ··· 557 557 ** "hints" parm includes the VALID bit! 558 558 ** "dep" clobbers the physical address offset bits as well. 559 559 */ 560 - pa = lpa(vba); 560 + pa = pba; 561 561 asm volatile("depw %1,31,12,%0" : "+r" (pa) : "r" (hints)); 562 562 ((u32 *)pdir_ptr)[1] = (u32) pa; 563 563 ··· 582 582 ** Grab virtual index [0:11] 583 583 ** Deposit virt_idx bits into I/O PDIR word 584 584 */ 585 - asm volatile ("lci %%r0(%1), %0" : "=r" (ci) : "r" (vba)); 585 + asm volatile ("lci %%r0(%1), %0" : "=r" (ci) : "r" (phys_to_virt(pba))); 586 586 asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci)); 587 587 asm volatile ("depw %1,15,12,%0" : "+r" (pa) : "r" (ci)); 588 588 ··· 704 704 /** 705 705 * ccio_map_single - Map an address range into the IOMMU. 706 706 * @dev: The PCI device. 707 - * @addr: The start address of the DMA region. 707 + * @addr: The physical address of the DMA region. 708 708 * @size: The length of the DMA region. 709 709 * @direction: The direction of the DMA transaction (to/from device). 710 710 * 711 711 * This function implements the pci_map_single function. 712 712 */ 713 713 static dma_addr_t 714 - ccio_map_single(struct device *dev, void *addr, size_t size, 714 + ccio_map_single(struct device *dev, phys_addr_t addr, size_t size, 715 715 enum dma_data_direction direction) 716 716 { 717 717 int idx; ··· 730 730 BUG_ON(size <= 0); 731 731 732 732 /* save offset bits */ 733 - offset = ((unsigned long) addr) & ~IOVP_MASK; 733 + offset = offset_in_page(addr); 734 734 735 735 /* round up to nearest IOVP_SIZE */ 736 736 size = ALIGN(size + offset, IOVP_SIZE); ··· 746 746 747 747 pdir_start = &(ioc->pdir_base[idx]); 748 748 749 - DBG_RUN("%s() %px -> %#lx size: %zu\n", 750 - __func__, addr, (long)(iovp | offset), size); 749 + DBG_RUN("%s() %pa -> %#lx size: %zu\n", 750 + __func__, &addr, (long)(iovp | offset), size); 751 751 752 752 /* If not cacheline aligned, force SAFE_DMA on the whole mess */ 753 - if((size % L1_CACHE_BYTES) || ((unsigned long)addr % L1_CACHE_BYTES)) 753 + if ((size % L1_CACHE_BYTES) || (addr % L1_CACHE_BYTES)) 754 754 hint |= HINT_SAFE_DMA; 755 755 756 756 while(size > 0) { 757 - ccio_io_pdir_entry(pdir_start, KERNEL_SPACE, (unsigned long)addr, hint); 757 + ccio_io_pdir_entry(pdir_start, KERNEL_SPACE, addr, hint); 758 758 759 759 DBG_RUN(" pdir %p %08x%08x\n", 760 760 pdir_start, ··· 773 773 774 774 775 775 static dma_addr_t 776 - ccio_map_page(struct device *dev, struct page *page, unsigned long offset, 777 - size_t size, enum dma_data_direction direction, 778 - unsigned long attrs) 776 + ccio_map_phys(struct device *dev, phys_addr_t phys, size_t size, 777 + enum dma_data_direction direction, unsigned long attrs) 779 778 { 780 - return ccio_map_single(dev, page_address(page) + offset, size, 781 - direction); 779 + if (unlikely(attrs & DMA_ATTR_MMIO)) 780 + return DMA_MAPPING_ERROR; 781 + 782 + return ccio_map_single(dev, phys, size, direction); 782 783 } 783 784 784 785 785 786 /** 786 - * ccio_unmap_page - Unmap an address range from the IOMMU. 787 + * ccio_unmap_phys - Unmap an address range from the IOMMU. 787 788 * @dev: The PCI device. 788 789 * @iova: The start address of the DMA region. 789 790 * @size: The length of the DMA region. ··· 792 791 * @attrs: attributes 793 792 */ 794 793 static void 795 - ccio_unmap_page(struct device *dev, dma_addr_t iova, size_t size, 794 + ccio_unmap_phys(struct device *dev, dma_addr_t iova, size_t size, 796 795 enum dma_data_direction direction, unsigned long attrs) 797 796 { 798 797 struct ioc *ioc; ··· 854 853 855 854 if (ret) { 856 855 memset(ret, 0, size); 857 - *dma_handle = ccio_map_single(dev, ret, size, DMA_BIDIRECTIONAL); 856 + *dma_handle = ccio_map_single(dev, virt_to_phys(ret), size, 857 + DMA_BIDIRECTIONAL); 858 858 } 859 859 860 860 return ret; ··· 875 873 ccio_free(struct device *dev, size_t size, void *cpu_addr, 876 874 dma_addr_t dma_handle, unsigned long attrs) 877 875 { 878 - ccio_unmap_page(dev, dma_handle, size, 0, 0); 876 + ccio_unmap_phys(dev, dma_handle, size, 0, 0); 879 877 free_pages((unsigned long)cpu_addr, get_order(size)); 880 878 } 881 879 ··· 922 920 /* Fast path single entry scatterlists. */ 923 921 if (nents == 1) { 924 922 sg_dma_address(sglist) = ccio_map_single(dev, 925 - sg_virt(sglist), sglist->length, 923 + sg_phys(sglist), sglist->length, 926 924 direction); 927 925 sg_dma_len(sglist) = sglist->length; 928 926 return 1; ··· 1006 1004 #ifdef CCIO_COLLECT_STATS 1007 1005 ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT; 1008 1006 #endif 1009 - ccio_unmap_page(dev, sg_dma_address(sglist), 1007 + ccio_unmap_phys(dev, sg_dma_address(sglist), 1010 1008 sg_dma_len(sglist), direction, 0); 1011 1009 ++sglist; 1012 1010 nents--; ··· 1019 1017 .dma_supported = ccio_dma_supported, 1020 1018 .alloc = ccio_alloc, 1021 1019 .free = ccio_free, 1022 - .map_page = ccio_map_page, 1023 - .unmap_page = ccio_unmap_page, 1020 + .map_phys = ccio_map_phys, 1021 + .unmap_phys = ccio_unmap_phys, 1024 1022 .map_sg = ccio_map_sg, 1025 1023 .unmap_sg = ccio_unmap_sg, 1026 1024 .get_sgtable = dma_common_get_sgtable, ··· 1074 1072 ioc->msingle_calls, ioc->msingle_pages, 1075 1073 (int)((ioc->msingle_pages * 1000)/ioc->msingle_calls)); 1076 1074 1077 - /* KLUGE - unmap_sg calls unmap_page for each mapped page */ 1075 + /* KLUGE - unmap_sg calls unmap_phys for each mapped page */ 1078 1076 min = ioc->usingle_calls - ioc->usg_calls; 1079 1077 max = ioc->usingle_pages - ioc->usg_pages; 1080 1078 seq_printf(m, "pci_unmap_single: %8ld calls %8ld pages (avg %d/1000)\n",
+5 -5
drivers/parisc/iommu-helpers.h
··· 14 14 static inline unsigned int 15 15 iommu_fill_pdir(struct ioc *ioc, struct scatterlist *startsg, int nents, 16 16 unsigned long hint, 17 - void (*iommu_io_pdir_entry)(__le64 *, space_t, unsigned long, 17 + void (*iommu_io_pdir_entry)(__le64 *, space_t, phys_addr_t, 18 18 unsigned long)) 19 19 { 20 20 struct scatterlist *dma_sg = startsg; /* pointer to current DMA */ ··· 28 28 dma_sg--; 29 29 30 30 while (nents-- > 0) { 31 - unsigned long vaddr; 31 + phys_addr_t paddr; 32 32 long size; 33 33 34 34 DBG_RUN_SG(" %d : %08lx %p/%05x\n", nents, ··· 67 67 68 68 BUG_ON(pdirp == NULL); 69 69 70 - vaddr = (unsigned long)sg_virt(startsg); 70 + paddr = sg_phys(startsg); 71 71 sg_dma_len(dma_sg) += startsg->length; 72 72 size = startsg->length + dma_offset; 73 73 dma_offset = 0; ··· 76 76 #endif 77 77 do { 78 78 iommu_io_pdir_entry(pdirp, KERNEL_SPACE, 79 - vaddr, hint); 80 - vaddr += IOVP_SIZE; 79 + paddr, hint); 80 + paddr += IOVP_SIZE; 81 81 size -= IOVP_SIZE; 82 82 pdirp++; 83 83 } while(unlikely(size > 0));
+26 -28
drivers/parisc/sba_iommu.c
··· 532 532 * sba_io_pdir_entry - fill in one IO PDIR entry 533 533 * @pdir_ptr: pointer to IO PDIR entry 534 534 * @sid: process Space ID - currently only support KERNEL_SPACE 535 - * @vba: Virtual CPU address of buffer to map 535 + * @pba: Physical address of buffer to map 536 536 * @hint: DMA hint set to use for this mapping 537 537 * 538 538 * SBA Mapping Routine ··· 569 569 */ 570 570 571 571 static void 572 - sba_io_pdir_entry(__le64 *pdir_ptr, space_t sid, unsigned long vba, 572 + sba_io_pdir_entry(__le64 *pdir_ptr, space_t sid, phys_addr_t pba, 573 573 unsigned long hint) 574 574 { 575 - u64 pa; /* physical address */ 576 575 register unsigned ci; /* coherent index */ 577 576 578 - pa = lpa(vba); 579 - pa &= IOVP_MASK; 577 + asm("lci 0(%1), %0" : "=r" (ci) : "r" (phys_to_virt(pba))); 578 + pba &= IOVP_MASK; 579 + pba |= (ci >> PAGE_SHIFT) & 0xff; /* move CI (8 bits) into lowest byte */ 580 580 581 - asm("lci 0(%1), %0" : "=r" (ci) : "r" (vba)); 582 - pa |= (ci >> PAGE_SHIFT) & 0xff; /* move CI (8 bits) into lowest byte */ 583 - 584 - pa |= SBA_PDIR_VALID_BIT; /* set "valid" bit */ 585 - *pdir_ptr = cpu_to_le64(pa); /* swap and store into I/O Pdir */ 581 + pba |= SBA_PDIR_VALID_BIT; /* set "valid" bit */ 582 + *pdir_ptr = cpu_to_le64(pba); /* swap and store into I/O Pdir */ 586 583 587 584 /* 588 585 * If the PDC_MODEL capabilities has Non-coherent IO-PDIR bit set ··· 704 707 * See Documentation/core-api/dma-api-howto.rst 705 708 */ 706 709 static dma_addr_t 707 - sba_map_single(struct device *dev, void *addr, size_t size, 710 + sba_map_single(struct device *dev, phys_addr_t addr, size_t size, 708 711 enum dma_data_direction direction) 709 712 { 710 713 struct ioc *ioc; ··· 719 722 return DMA_MAPPING_ERROR; 720 723 721 724 /* save offset bits */ 722 - offset = ((dma_addr_t) (long) addr) & ~IOVP_MASK; 725 + offset = offset_in_page(addr); 723 726 724 727 /* round up to nearest IOVP_SIZE */ 725 728 size = (size + offset + ~IOVP_MASK) & IOVP_MASK; ··· 736 739 pide = sba_alloc_range(ioc, dev, size); 737 740 iovp = (dma_addr_t) pide << IOVP_SHIFT; 738 741 739 - DBG_RUN("%s() 0x%p -> 0x%lx\n", 740 - __func__, addr, (long) iovp | offset); 742 + DBG_RUN("%s() 0x%pa -> 0x%lx\n", 743 + __func__, &addr, (long) iovp | offset); 741 744 742 745 pdir_start = &(ioc->pdir_base[pide]); 743 746 744 747 while (size > 0) { 745 - sba_io_pdir_entry(pdir_start, KERNEL_SPACE, (unsigned long) addr, 0); 748 + sba_io_pdir_entry(pdir_start, KERNEL_SPACE, addr, 0); 746 749 747 750 DBG_RUN(" pdir 0x%p %02x%02x%02x%02x%02x%02x%02x%02x\n", 748 751 pdir_start, ··· 775 778 776 779 777 780 static dma_addr_t 778 - sba_map_page(struct device *dev, struct page *page, unsigned long offset, 779 - size_t size, enum dma_data_direction direction, 780 - unsigned long attrs) 781 + sba_map_phys(struct device *dev, phys_addr_t phys, size_t size, 782 + enum dma_data_direction direction, unsigned long attrs) 781 783 { 782 - return sba_map_single(dev, page_address(page) + offset, size, 783 - direction); 784 + if (unlikely(attrs & DMA_ATTR_MMIO)) 785 + return DMA_MAPPING_ERROR; 786 + 787 + return sba_map_single(dev, phys, size, direction); 784 788 } 785 789 786 790 787 791 /** 788 - * sba_unmap_page - unmap one IOVA and free resources 792 + * sba_unmap_phys - unmap one IOVA and free resources 789 793 * @dev: instance of PCI owned by the driver that's asking. 790 794 * @iova: IOVA of driver buffer previously mapped. 791 795 * @size: number of bytes mapped in driver buffer. ··· 796 798 * See Documentation/core-api/dma-api-howto.rst 797 799 */ 798 800 static void 799 - sba_unmap_page(struct device *dev, dma_addr_t iova, size_t size, 801 + sba_unmap_phys(struct device *dev, dma_addr_t iova, size_t size, 800 802 enum dma_data_direction direction, unsigned long attrs) 801 803 { 802 804 struct ioc *ioc; ··· 891 893 892 894 if (ret) { 893 895 memset(ret, 0, size); 894 - *dma_handle = sba_map_single(hwdev, ret, size, 0); 896 + *dma_handle = sba_map_single(hwdev, virt_to_phys(ret), size, 0); 895 897 } 896 898 897 899 return ret; ··· 912 914 sba_free(struct device *hwdev, size_t size, void *vaddr, 913 915 dma_addr_t dma_handle, unsigned long attrs) 914 916 { 915 - sba_unmap_page(hwdev, dma_handle, size, 0, 0); 917 + sba_unmap_phys(hwdev, dma_handle, size, 0, 0); 916 918 free_pages((unsigned long) vaddr, get_order(size)); 917 919 } 918 920 ··· 960 962 961 963 /* Fast path single entry scatterlists. */ 962 964 if (nents == 1) { 963 - sg_dma_address(sglist) = sba_map_single(dev, sg_virt(sglist), 965 + sg_dma_address(sglist) = sba_map_single(dev, sg_phys(sglist), 964 966 sglist->length, direction); 965 967 sg_dma_len(sglist) = sglist->length; 966 968 return 1; ··· 1059 1061 1060 1062 while (nents && sg_dma_len(sglist)) { 1061 1063 1062 - sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist), 1064 + sba_unmap_phys(dev, sg_dma_address(sglist), sg_dma_len(sglist), 1063 1065 direction, 0); 1064 1066 #ifdef SBA_COLLECT_STATS 1065 1067 ioc->usg_pages += ((sg_dma_address(sglist) & ~IOVP_MASK) + sg_dma_len(sglist) + IOVP_SIZE - 1) >> PAGE_SHIFT; ··· 1083 1085 .dma_supported = sba_dma_supported, 1084 1086 .alloc = sba_alloc, 1085 1087 .free = sba_free, 1086 - .map_page = sba_map_page, 1087 - .unmap_page = sba_unmap_page, 1088 + .map_phys = sba_map_phys, 1089 + .unmap_phys = sba_unmap_phys, 1088 1090 .map_sg = sba_map_sg, 1089 1091 .unmap_sg = sba_unmap_sg, 1090 1092 .get_sgtable = dma_common_get_sgtable,
+12 -8
drivers/xen/grant-dma-ops.c
··· 163 163 xen_grant_dma_free(dev, size, page_to_virt(vaddr), dma_handle, 0); 164 164 } 165 165 166 - static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page, 167 - unsigned long offset, size_t size, 166 + static dma_addr_t xen_grant_dma_map_phys(struct device *dev, phys_addr_t phys, 167 + size_t size, 168 168 enum dma_data_direction dir, 169 169 unsigned long attrs) 170 170 { 171 171 struct xen_grant_dma_data *data; 172 + unsigned long offset = offset_in_page(phys); 172 173 unsigned long dma_offset = xen_offset_in_page(offset), 173 174 pfn_offset = XEN_PFN_DOWN(offset); 174 175 unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size); 175 176 grant_ref_t grant; 176 177 dma_addr_t dma_handle; 178 + 179 + if (unlikely(attrs & DMA_ATTR_MMIO)) 180 + return DMA_MAPPING_ERROR; 177 181 178 182 if (WARN_ON(dir == DMA_NONE)) 179 183 return DMA_MAPPING_ERROR; ··· 194 190 195 191 for (i = 0; i < n_pages; i++) { 196 192 gnttab_grant_foreign_access_ref(grant + i, data->backend_domid, 197 - pfn_to_gfn(page_to_xen_pfn(page) + i + pfn_offset), 193 + pfn_to_gfn(page_to_xen_pfn(phys_to_page(phys)) + i + pfn_offset), 198 194 dir == DMA_TO_DEVICE); 199 195 } 200 196 ··· 203 199 return dma_handle; 204 200 } 205 201 206 - static void xen_grant_dma_unmap_page(struct device *dev, dma_addr_t dma_handle, 202 + static void xen_grant_dma_unmap_phys(struct device *dev, dma_addr_t dma_handle, 207 203 size_t size, enum dma_data_direction dir, 208 204 unsigned long attrs) 209 205 { ··· 246 242 return; 247 243 248 244 for_each_sg(sg, s, nents, i) 249 - xen_grant_dma_unmap_page(dev, s->dma_address, sg_dma_len(s), dir, 245 + xen_grant_dma_unmap_phys(dev, s->dma_address, sg_dma_len(s), dir, 250 246 attrs); 251 247 } 252 248 ··· 261 257 return -EINVAL; 262 258 263 259 for_each_sg(sg, s, nents, i) { 264 - s->dma_address = xen_grant_dma_map_page(dev, sg_page(s), s->offset, 260 + s->dma_address = xen_grant_dma_map_phys(dev, sg_phys(s), 265 261 s->length, dir, attrs); 266 262 if (s->dma_address == DMA_MAPPING_ERROR) 267 263 goto out; ··· 290 286 .free_pages = xen_grant_dma_free_pages, 291 287 .mmap = dma_common_mmap, 292 288 .get_sgtable = dma_common_get_sgtable, 293 - .map_page = xen_grant_dma_map_page, 294 - .unmap_page = xen_grant_dma_unmap_page, 289 + .map_phys = xen_grant_dma_map_phys, 290 + .unmap_phys = xen_grant_dma_unmap_phys, 295 291 .map_sg = xen_grant_dma_map_sg, 296 292 .unmap_sg = xen_grant_dma_unmap_sg, 297 293 .dma_supported = xen_grant_dma_supported,
+29 -34
drivers/xen/swiotlb-xen.c
··· 200 200 * physical address to use is returned. 201 201 * 202 202 * Once the device is given the dma address, the device owns this memory until 203 - * either xen_swiotlb_unmap_page or xen_swiotlb_dma_sync_single is performed. 203 + * either xen_swiotlb_unmap_phys or xen_swiotlb_dma_sync_single is performed. 204 204 */ 205 - static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, 206 - unsigned long offset, size_t size, 207 - enum dma_data_direction dir, 205 + static dma_addr_t xen_swiotlb_map_phys(struct device *dev, phys_addr_t phys, 206 + size_t size, enum dma_data_direction dir, 208 207 unsigned long attrs) 209 208 { 210 - phys_addr_t map, phys = page_to_phys(page) + offset; 211 - dma_addr_t dev_addr = xen_phys_to_dma(dev, phys); 209 + dma_addr_t dev_addr; 210 + phys_addr_t map; 212 211 213 212 BUG_ON(dir == DMA_NONE); 213 + 214 + if (attrs & DMA_ATTR_MMIO) { 215 + if (unlikely(!dma_capable(dev, phys, size, false))) { 216 + dev_err_once( 217 + dev, 218 + "DMA addr %pa+%zu overflow (mask %llx, bus limit %llx).\n", 219 + &phys, size, *dev->dma_mask, 220 + dev->bus_dma_limit); 221 + WARN_ON_ONCE(1); 222 + return DMA_MAPPING_ERROR; 223 + } 224 + return phys; 225 + } 226 + 227 + dev_addr = xen_phys_to_dma(dev, phys); 228 + 214 229 /* 215 230 * If the address happens to be in the device's DMA window, 216 231 * we can safely return the device addr and not worry about bounce ··· 272 257 273 258 /* 274 259 * Unmap a single streaming mode DMA translation. The dma_addr and size must 275 - * match what was provided for in a previous xen_swiotlb_map_page call. All 260 + * match what was provided for in a previous xen_swiotlb_map_phys call. All 276 261 * other usages are undefined. 277 262 * 278 263 * After this call, reads by the cpu to the buffer are guaranteed to see 279 264 * whatever the device wrote there. 280 265 */ 281 - static void xen_swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr, 266 + static void xen_swiotlb_unmap_phys(struct device *hwdev, dma_addr_t dev_addr, 282 267 size_t size, enum dma_data_direction dir, unsigned long attrs) 283 268 { 284 269 phys_addr_t paddr = xen_dma_to_phys(hwdev, dev_addr); ··· 340 325 341 326 /* 342 327 * Unmap a set of streaming mode DMA translations. Again, cpu read rules 343 - * concerning calls here are the same as for swiotlb_unmap_page() above. 328 + * concerning calls here are the same as for swiotlb_unmap_phys() above. 344 329 */ 345 330 static void 346 331 xen_swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sgl, int nelems, ··· 352 337 BUG_ON(dir == DMA_NONE); 353 338 354 339 for_each_sg(sgl, sg, nelems, i) 355 - xen_swiotlb_unmap_page(hwdev, sg->dma_address, sg_dma_len(sg), 340 + xen_swiotlb_unmap_phys(hwdev, sg->dma_address, sg_dma_len(sg), 356 341 dir, attrs); 357 342 358 343 } ··· 367 352 BUG_ON(dir == DMA_NONE); 368 353 369 354 for_each_sg(sgl, sg, nelems, i) { 370 - sg->dma_address = xen_swiotlb_map_page(dev, sg_page(sg), 371 - sg->offset, sg->length, dir, attrs); 355 + sg->dma_address = xen_swiotlb_map_phys(dev, sg_phys(sg), 356 + sg->length, dir, attrs); 372 357 if (sg->dma_address == DMA_MAPPING_ERROR) 373 358 goto out_unmap; 374 359 sg_dma_len(sg) = sg->length; ··· 407 392 } 408 393 } 409 394 410 - static dma_addr_t xen_swiotlb_direct_map_resource(struct device *dev, 411 - phys_addr_t paddr, 412 - size_t size, 413 - enum dma_data_direction dir, 414 - unsigned long attrs) 415 - { 416 - dma_addr_t dma_addr = paddr; 417 - 418 - if (unlikely(!dma_capable(dev, dma_addr, size, false))) { 419 - dev_err_once(dev, 420 - "DMA addr %pad+%zu overflow (mask %llx, bus limit %llx).\n", 421 - &dma_addr, size, *dev->dma_mask, dev->bus_dma_limit); 422 - WARN_ON_ONCE(1); 423 - return DMA_MAPPING_ERROR; 424 - } 425 - 426 - return dma_addr; 427 - } 428 - 429 395 /* 430 396 * Return whether the given device DMA address mask can be supported 431 397 * properly. For example, if your device can only drive the low 24-bits ··· 433 437 .sync_sg_for_device = xen_swiotlb_sync_sg_for_device, 434 438 .map_sg = xen_swiotlb_map_sg, 435 439 .unmap_sg = xen_swiotlb_unmap_sg, 436 - .map_page = xen_swiotlb_map_page, 437 - .unmap_page = xen_swiotlb_unmap_page, 440 + .map_phys = xen_swiotlb_map_phys, 441 + .unmap_phys = xen_swiotlb_unmap_phys, 438 442 .dma_supported = xen_swiotlb_dma_supported, 439 443 .mmap = dma_common_mmap, 440 444 .get_sgtable = dma_common_get_sgtable, 441 445 .alloc_pages_op = dma_common_alloc_pages, 442 446 .free_pages = dma_common_free_pages, 443 447 .max_mapping_size = swiotlb_max_mapping_size, 444 - .map_resource = xen_swiotlb_direct_map_resource, 445 448 };
+4 -10
include/linux/dma-map-ops.h
··· 31 31 void *cpu_addr, dma_addr_t dma_addr, size_t size, 32 32 unsigned long attrs); 33 33 34 - dma_addr_t (*map_page)(struct device *dev, struct page *page, 35 - unsigned long offset, size_t size, 36 - enum dma_data_direction dir, unsigned long attrs); 37 - void (*unmap_page)(struct device *dev, dma_addr_t dma_handle, 34 + dma_addr_t (*map_phys)(struct device *dev, phys_addr_t phys, 35 + size_t size, enum dma_data_direction dir, 36 + unsigned long attrs); 37 + void (*unmap_phys)(struct device *dev, dma_addr_t dma_handle, 38 38 size_t size, enum dma_data_direction dir, 39 39 unsigned long attrs); 40 40 /* ··· 46 46 enum dma_data_direction dir, unsigned long attrs); 47 47 void (*unmap_sg)(struct device *dev, struct scatterlist *sg, int nents, 48 48 enum dma_data_direction dir, unsigned long attrs); 49 - dma_addr_t (*map_resource)(struct device *dev, phys_addr_t phys_addr, 50 - size_t size, enum dma_data_direction dir, 51 - unsigned long attrs); 52 - void (*unmap_resource)(struct device *dev, dma_addr_t dma_handle, 53 - size_t size, enum dma_data_direction dir, 54 - unsigned long attrs); 55 49 void (*sync_single_for_cpu)(struct device *dev, dma_addr_t dma_handle, 56 50 size_t size, enum dma_data_direction dir); 57 51 void (*sync_single_for_device)(struct device *dev,
+8 -5
include/linux/map_benchmark.h include/uapi/linux/map_benchmark.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 1 + /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ 2 2 /* 3 - * Copyright (C) 2022 HiSilicon Limited. 3 + * Copyright (C) 2022-2025 HiSilicon Limited. 4 4 */ 5 5 6 - #ifndef _KERNEL_DMA_BENCHMARK_H 7 - #define _KERNEL_DMA_BENCHMARK_H 6 + #ifndef _UAPI_DMA_BENCHMARK_H 7 + #define _UAPI_DMA_BENCHMARK_H 8 + 9 + #include <linux/types.h> 8 10 9 11 #define DMA_MAP_BENCHMARK _IOWR('d', 1, struct map_benchmark) 10 12 #define DMA_MAP_MAX_THREADS 1024 ··· 31 29 __u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */ 32 30 __u8 expansion[76]; /* For future use */ 33 31 }; 34 - #endif /* _KERNEL_DMA_BENCHMARK_H */ 32 + 33 + #endif /* _UAPI_DMA_BENCHMARK_H */
+6 -7
kernel/dma/dummy.c
··· 11 11 return -ENXIO; 12 12 } 13 13 14 - static dma_addr_t dma_dummy_map_page(struct device *dev, struct page *page, 15 - unsigned long offset, size_t size, enum dma_data_direction dir, 16 - unsigned long attrs) 14 + static dma_addr_t dma_dummy_map_phys(struct device *dev, phys_addr_t phys, 15 + size_t size, enum dma_data_direction dir, unsigned long attrs) 17 16 { 18 17 return DMA_MAPPING_ERROR; 19 18 } 20 - static void dma_dummy_unmap_page(struct device *dev, dma_addr_t dma_handle, 19 + static void dma_dummy_unmap_phys(struct device *dev, dma_addr_t dma_handle, 21 20 size_t size, enum dma_data_direction dir, unsigned long attrs) 22 21 { 23 22 /* 24 - * Dummy ops doesn't support map_page, so unmap_page should never be 23 + * Dummy ops doesn't support map_phys, so unmap_page should never be 25 24 * called. 26 25 */ 27 26 WARN_ON_ONCE(true); ··· 50 51 51 52 const struct dma_map_ops dma_dummy_ops = { 52 53 .mmap = dma_dummy_mmap, 53 - .map_page = dma_dummy_map_page, 54 - .unmap_page = dma_dummy_unmap_page, 54 + .map_phys = dma_dummy_map_phys, 55 + .unmap_phys = dma_dummy_unmap_phys, 55 56 .map_sg = dma_dummy_map_sg, 56 57 .unmap_sg = dma_dummy_unmap_sg, 57 58 .dma_supported = dma_dummy_supported,
+1 -1
kernel/dma/map_benchmark.c
··· 11 11 #include <linux/dma-mapping.h> 12 12 #include <linux/kernel.h> 13 13 #include <linux/kthread.h> 14 - #include <linux/map_benchmark.h> 15 14 #include <linux/math64.h> 16 15 #include <linux/module.h> 17 16 #include <linux/pci.h> 18 17 #include <linux/platform_device.h> 19 18 #include <linux/slab.h> 20 19 #include <linux/timekeeping.h> 20 + #include <uapi/linux/map_benchmark.h> 21 21 22 22 struct map_benchmark_data { 23 23 struct map_benchmark bparam;
+5 -21
kernel/dma/mapping.c
··· 157 157 { 158 158 const struct dma_map_ops *ops = get_dma_ops(dev); 159 159 bool is_mmio = attrs & DMA_ATTR_MMIO; 160 - dma_addr_t addr; 160 + dma_addr_t addr = DMA_MAPPING_ERROR; 161 161 162 162 BUG_ON(!valid_dma_direction(dir)); 163 163 ··· 169 169 addr = dma_direct_map_phys(dev, phys, size, dir, attrs); 170 170 else if (use_dma_iommu(dev)) 171 171 addr = iommu_dma_map_phys(dev, phys, size, dir, attrs); 172 - else if (is_mmio) { 173 - if (!ops->map_resource) 174 - return DMA_MAPPING_ERROR; 175 - 176 - addr = ops->map_resource(dev, phys, size, dir, attrs); 177 - } else { 178 - struct page *page = phys_to_page(phys); 179 - size_t offset = offset_in_page(phys); 180 - 181 - /* 182 - * The dma_ops API contract for ops->map_page() requires 183 - * kmappable memory, while ops->map_resource() does not. 184 - */ 185 - addr = ops->map_page(dev, page, offset, size, dir, attrs); 186 - } 172 + else if (ops->map_phys) 173 + addr = ops->map_phys(dev, phys, size, dir, attrs); 187 174 188 175 if (!is_mmio) 189 176 kmsan_handle_dma(phys, size, dir); ··· 210 223 dma_direct_unmap_phys(dev, addr, size, dir, attrs); 211 224 else if (use_dma_iommu(dev)) 212 225 iommu_dma_unmap_phys(dev, addr, size, dir, attrs); 213 - else if (is_mmio) { 214 - if (ops->unmap_resource) 215 - ops->unmap_resource(dev, addr, size, dir, attrs); 216 - } else 217 - ops->unmap_page(dev, addr, size, dir, attrs); 226 + else if (ops->unmap_phys) 227 + ops->unmap_phys(dev, addr, size, dir, attrs); 218 228 trace_dma_unmap_phys(dev, addr, size, dir, attrs); 219 229 debug_dma_unmap_phys(dev, addr, size, dir); 220 230 }
+7 -5
kernel/dma/ops_helpers.c
··· 64 64 { 65 65 const struct dma_map_ops *ops = get_dma_ops(dev); 66 66 struct page *page; 67 + phys_addr_t phys; 67 68 68 69 page = dma_alloc_contiguous(dev, size, gfp); 69 70 if (!page) ··· 72 71 if (!page) 73 72 return NULL; 74 73 74 + phys = page_to_phys(page); 75 75 if (use_dma_iommu(dev)) 76 - *dma_handle = iommu_dma_map_phys(dev, page_to_phys(page), size, 77 - dir, DMA_ATTR_SKIP_CPU_SYNC); 76 + *dma_handle = iommu_dma_map_phys(dev, phys, size, dir, 77 + DMA_ATTR_SKIP_CPU_SYNC); 78 78 else 79 - *dma_handle = ops->map_page(dev, page, 0, size, dir, 79 + *dma_handle = ops->map_phys(dev, phys, size, dir, 80 80 DMA_ATTR_SKIP_CPU_SYNC); 81 81 if (*dma_handle == DMA_MAPPING_ERROR) { 82 82 dma_free_contiguous(dev, page, size); ··· 96 94 if (use_dma_iommu(dev)) 97 95 iommu_dma_unmap_phys(dev, dma_handle, size, dir, 98 96 DMA_ATTR_SKIP_CPU_SYNC); 99 - else if (ops->unmap_page) 100 - ops->unmap_page(dev, dma_handle, size, dir, 97 + else if (ops->unmap_phys) 98 + ops->unmap_phys(dev, dma_handle, size, dir, 101 99 DMA_ATTR_SKIP_CPU_SYNC); 102 100 dma_free_contiguous(dev, page, size); 103 101 }
+7 -6
tools/Makefile
··· 14 14 @echo ' counter - counter tools' 15 15 @echo ' cpupower - a tool for all things x86 CPU power' 16 16 @echo ' debugging - tools for debugging' 17 + @echo ' dma - tools for DMA mapping' 17 18 @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' 18 19 @echo ' firmware - Firmware tools' 19 20 @echo ' freefall - laptop accelerometer program for disk protection' ··· 70 69 cpupower: FORCE 71 70 $(call descend,power/$@) 72 71 73 - counter firewire hv guest bootconfig spi usb virtio mm bpf iio gpio objtool leds wmi firmware debugging tracing: FORCE 72 + counter dma firewire hv guest bootconfig spi usb virtio mm bpf iio gpio objtool leds wmi firmware debugging tracing: FORCE 74 73 $(call descend,$@) 75 74 76 75 bpf/%: FORCE ··· 123 122 ynl: FORCE 124 123 $(call descend,net/ynl) 125 124 126 - all: acpi counter cpupower gpio hv firewire \ 125 + all: acpi counter cpupower dma gpio hv firewire \ 127 126 perf selftests bootconfig spi turbostat usb \ 128 127 virtio mm bpf x86_energy_perf_policy \ 129 128 tmon freefall iio objtool kvm_stat wmi \ ··· 135 134 cpupower_install: 136 135 $(call descend,power/$(@:_install=),install) 137 136 138 - counter_install firewire_install gpio_install hv_install iio_install perf_install bootconfig_install spi_install usb_install virtio_install mm_install bpf_install objtool_install wmi_install debugging_install tracing_install: 137 + counter_install dma_install firewire_install gpio_install hv_install iio_install perf_install bootconfig_install spi_install usb_install virtio_install mm_install bpf_install objtool_install wmi_install debugging_install tracing_install: 139 138 $(call descend,$(@:_install=),install) 140 139 141 140 selftests_install: ··· 165 164 ynl_install: 166 165 $(call descend,net/$(@:_install=),install) 167 166 168 - install: acpi_install counter_install cpupower_install gpio_install \ 167 + install: acpi_install counter_install cpupower_install dma_install gpio_install \ 169 168 hv_install firewire_install iio_install \ 170 169 perf_install selftests_install turbostat_install usb_install \ 171 170 virtio_install mm_install bpf_install x86_energy_perf_policy_install \ ··· 179 178 cpupower_clean: 180 179 $(call descend,power/cpupower,clean) 181 180 182 - counter_clean hv_clean firewire_clean bootconfig_clean spi_clean usb_clean virtio_clean mm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean firmware_clean debugging_clean tracing_clean: 181 + counter_clean dma_clean hv_clean firewire_clean bootconfig_clean spi_clean usb_clean virtio_clean mm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean firmware_clean debugging_clean tracing_clean: 183 182 $(call descend,$(@:_clean=),clean) 184 183 185 184 libapi_clean: ··· 225 224 ynl_clean: 226 225 $(call descend,net/$(@:_clean=),clean) 227 226 228 - clean: acpi_clean counter_clean cpupower_clean hv_clean firewire_clean \ 227 + clean: acpi_clean counter_clean cpupower_clean dma_clean hv_clean firewire_clean \ 229 228 perf_clean selftests_clean turbostat_clean bootconfig_clean spi_clean usb_clean virtio_clean \ 230 229 mm_clean bpf_clean iio_clean x86_energy_perf_policy_clean tmon_clean \ 231 230 freefall_clean build_clean libbpf_clean libsubcmd_clean \
+3
tools/dma/.gitignore
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + dma_map_benchmark 3 + include/linux/map_benchmark.h
+55
tools/dma/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + include ../scripts/Makefile.include 3 + 4 + bindir ?= /usr/bin 5 + 6 + # This will work when dma is built in tools env. where srctree 7 + # isn't set and when invoked from selftests build, where srctree 8 + # is set to ".". building_out_of_srctree is undefined for in srctree 9 + # builds 10 + ifndef building_out_of_srctree 11 + srctree := $(patsubst %/,%,$(dir $(CURDIR))) 12 + srctree := $(patsubst %/,%,$(dir $(srctree))) 13 + endif 14 + 15 + # Do not use make's built-in rules 16 + # (this improves performance and avoids hard-to-debug behaviour); 17 + MAKEFLAGS += -r 18 + 19 + override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include 20 + 21 + ALL_TARGETS := dma_map_benchmark 22 + ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS)) 23 + 24 + all: $(ALL_PROGRAMS) 25 + 26 + export srctree OUTPUT CC LD CFLAGS 27 + include $(srctree)/tools/build/Makefile.include 28 + 29 + # 30 + # We need the following to be outside of kernel tree 31 + # 32 + $(OUTPUT)include/linux/map_benchmark.h: ../../include/uapi/linux/map_benchmark.h 33 + mkdir -p $(OUTPUT)include/linux 2>&1 || true 34 + ln -sf $(CURDIR)/../../include/uapi/linux/map_benchmark.h $@ 35 + 36 + prepare: $(OUTPUT)include/linux/map_benchmark.h 37 + 38 + FORCE: 39 + 40 + DMA_MAP_BENCHMARK = dma_map_benchmark 41 + $(DMA_MAP_BENCHMARK): prepare FORCE 42 + $(CC) $(CFLAGS) $(DMA_MAP_BENCHMARK).c -o $(DMA_MAP_BENCHMARK) 43 + 44 + clean: 45 + rm -f $(ALL_PROGRAMS) 46 + rm -rf $(OUTPUT)include 47 + find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete -o -name '\.*.cmd' -delete 48 + 49 + install: $(ALL_PROGRAMS) 50 + install -d -m 755 $(DESTDIR)$(bindir); \ 51 + for program in $(ALL_PROGRAMS); do \ 52 + install $$program $(DESTDIR)$(bindir); \ 53 + done 54 + 55 + .PHONY: all install clean prepare FORCE
-7
tools/testing/selftests/dma/Makefile
··· 1 - # SPDX-License-Identifier: GPL-2.0 2 - CFLAGS += -I../../../../usr/include/ 3 - CFLAGS += -I../../../../include/ 4 - 5 - TEST_GEN_PROGS := dma_map_benchmark 6 - 7 - include ../lib.mk
tools/testing/selftests/dma/config tools/dma/config
-1
tools/testing/selftests/dma/dma_map_benchmark.c tools/dma/dma_map_benchmark.c
··· 10 10 #include <unistd.h> 11 11 #include <sys/ioctl.h> 12 12 #include <sys/mman.h> 13 - #include <linux/types.h> 14 13 #include <linux/map_benchmark.h> 15 14 16 15 #define NSEC_PER_MSEC 1000000L