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

nds32: use generic dma_noncoherent_ops

Switch to the generic noncoherent direct mapping implementation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Greentime Hu <greentime@andestech.com>
Tested-by: Greentime Hu <greentime@andestech.com>

+15 -116
+3
arch/nds32/Kconfig
··· 5 5 6 6 config NDS32 7 7 def_bool y 8 + select ARCH_HAS_SYNC_DMA_FOR_CPU 9 + select ARCH_HAS_SYNC_DMA_FOR_DEVICE 8 10 select ARCH_WANT_FRAME_POINTERS if FTRACE 9 11 select CLKSRC_MMIO 10 12 select CLONE_BACKWARDS 11 13 select COMMON_CLK 14 + select DMA_NONCOHERENT_OPS 12 15 select GENERIC_ATOMIC64 13 16 select GENERIC_CPU_DEVICES 14 17 select GENERIC_CLOCKEVENTS
+1
arch/nds32/include/asm/Kbuild
··· 13 13 generic-y += device.h 14 14 generic-y += div64.h 15 15 generic-y += dma.h 16 + generic-y += dma-mapping.h 16 17 generic-y += emergency-restart.h 17 18 generic-y += errno.h 18 19 generic-y += exec.h
-14
arch/nds32/include/asm/dma-mapping.h
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (C) 2005-2017 Andes Technology Corporation 3 - 4 - #ifndef ASMNDS32_DMA_MAPPING_H 5 - #define ASMNDS32_DMA_MAPPING_H 6 - 7 - extern struct dma_map_ops nds32_dma_ops; 8 - 9 - static inline struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus) 10 - { 11 - return &nds32_dma_ops; 12 - } 13 - 14 - #endif
+11 -102
arch/nds32/kernel/dma.c
··· 3 3 4 4 #include <linux/types.h> 5 5 #include <linux/mm.h> 6 - #include <linux/export.h> 7 6 #include <linux/string.h> 8 - #include <linux/scatterlist.h> 9 - #include <linux/dma-mapping.h> 7 + #include <linux/dma-noncoherent.h> 10 8 #include <linux/io.h> 11 9 #include <linux/cache.h> 12 10 #include <linux/highmem.h> 13 11 #include <linux/slab.h> 14 12 #include <asm/cacheflush.h> 15 13 #include <asm/tlbflush.h> 16 - #include <asm/dma-mapping.h> 17 14 #include <asm/proc-fns.h> 18 15 19 16 /* ··· 116 119 return c; 117 120 } 118 121 119 - /* FIXME: attrs is not used. */ 120 - static void *nds32_dma_alloc_coherent(struct device *dev, size_t size, 121 - dma_addr_t * handle, gfp_t gfp, 122 - unsigned long attrs) 122 + void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, 123 + gfp_t gfp, unsigned long attrs) 123 124 { 124 125 struct page *page; 125 126 struct arch_vm_region *c; ··· 222 227 return NULL; 223 228 } 224 229 225 - static void nds32_dma_free(struct device *dev, size_t size, void *cpu_addr, 226 - dma_addr_t handle, unsigned long attrs) 230 + void arch_dma_free(struct device *dev, size_t size, void *cpu_addr, 231 + dma_addr_t handle, unsigned long attrs) 227 232 { 228 233 struct arch_vm_region *c; 229 234 unsigned long flags, addr; ··· 360 365 } while (left); 361 366 } 362 367 363 - static void 364 - nds32_dma_sync_single_for_device(struct device *dev, dma_addr_t handle, 365 - size_t size, enum dma_data_direction dir) 368 + void arch_sync_dma_for_device(struct device *dev, phys_addr_t paddr, 369 + size_t size, enum dma_data_direction dir) 366 370 { 367 371 switch (dir) { 368 372 case DMA_FROM_DEVICE: 369 373 break; 370 374 case DMA_TO_DEVICE: 371 375 case DMA_BIDIRECTIONAL: 372 - cache_op(handle, size, cpu_dma_wb_range); 376 + cache_op(paddr, size, cpu_dma_wb_range); 373 377 break; 374 378 default: 375 379 BUG(); 376 380 } 377 381 } 378 382 379 - static void 380 - nds32_dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, 381 - size_t size, enum dma_data_direction dir) 383 + void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr, 384 + size_t size, enum dma_data_direction dir) 382 385 { 383 386 switch (dir) { 384 387 case DMA_TO_DEVICE: 385 388 break; 386 389 case DMA_FROM_DEVICE: 387 390 case DMA_BIDIRECTIONAL: 388 - cache_op(handle, size, cpu_dma_inval_range); 391 + cache_op(paddr, size, cpu_dma_inval_range); 389 392 break; 390 393 default: 391 394 BUG(); 392 395 } 393 396 } 394 - 395 - static dma_addr_t nds32_dma_map_page(struct device *dev, struct page *page, 396 - unsigned long offset, size_t size, 397 - enum dma_data_direction dir, 398 - unsigned long attrs) 399 - { 400 - dma_addr_t dma_addr = page_to_phys(page) + offset; 401 - 402 - if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) 403 - nds32_dma_sync_single_for_device(dev, handle, size, dir); 404 - return dma_addr; 405 - } 406 - 407 - static void nds32_dma_unmap_page(struct device *dev, dma_addr_t handle, 408 - size_t size, enum dma_data_direction dir, 409 - unsigned long attrs) 410 - { 411 - if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) 412 - nds32_dma_sync_single_for_cpu(dev, handle, size, dir); 413 - } 414 - 415 - static void 416 - nds32_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, 417 - int nents, enum dma_data_direction dir) 418 - { 419 - int i; 420 - 421 - for (i = 0; i < nents; i++, sg++) { 422 - nds32_dma_sync_single_for_device(dev, sg_dma_address(sg), 423 - sg->length, dir); 424 - } 425 - } 426 - 427 - static void 428 - nds32_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, 429 - enum dma_data_direction dir) 430 - { 431 - int i; 432 - 433 - for (i = 0; i < nents; i++, sg++) { 434 - nds32_dma_sync_single_for_cpu(dev, sg_dma_address(sg), 435 - sg->length, dir); 436 - } 437 - } 438 - 439 - static int nds32_dma_map_sg(struct device *dev, struct scatterlist *sg, 440 - int nents, enum dma_data_direction dir, 441 - unsigned long attrs) 442 - { 443 - int i; 444 - 445 - for (i = 0; i < nents; i++, sg++) { 446 - nds32_dma_sync_single_for_device(dev, sg_dma_address(sg), 447 - sg->length, dir); 448 - } 449 - return nents; 450 - } 451 - 452 - static void nds32_dma_unmap_sg(struct device *dev, struct scatterlist *sg, 453 - int nhwentries, enum dma_data_direction dir, 454 - unsigned long attrs) 455 - { 456 - int i; 457 - 458 - for (i = 0; i < nhwentries; i++, sg++) { 459 - nds32_dma_sync_single_for_cpu(dev, sg_dma_address(sg), 460 - sg->length, dir); 461 - } 462 - } 463 - 464 - struct dma_map_ops nds32_dma_ops = { 465 - .alloc = nds32_dma_alloc_coherent, 466 - .free = nds32_dma_free, 467 - .map_page = nds32_dma_map_page, 468 - .unmap_page = nds32_dma_unmap_page, 469 - .map_sg = nds32_dma_map_sg, 470 - .unmap_sg = nds32_dma_unmap_sg, 471 - .sync_single_for_device = nds32_dma_sync_single_for_device, 472 - .sync_single_for_cpu = nds32_dma_sync_single_for_cpu, 473 - .sync_sg_for_cpu = nds32_dma_sync_sg_for_cpu, 474 - .sync_sg_for_device = nds32_dma_sync_sg_for_device, 475 - }; 476 - 477 - EXPORT_SYMBOL(nds32_dma_ops);