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

sparc: Use physical address DMA mapping

Convert sparc architecture DMA code to use .map_phys callback.

Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20251015-remove-map-page-v5-11-3bbfe3a25cdf@kernel.org

authored by

Leon Romanovsky and committed by
Marek Szyprowski
38c0d0eb a10d648d

+82 -63
+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 };