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

MIPS: IP32: use generic dma noncoherent ops

Provide phys_to_dma/dma_to_phys helpers, everything else is generic.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Patchwork: https://patchwork.linux-mips.org/patch/19546/
Signed-off-by: Paul Burton <paul.burton@mips.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: David Daney <david.daney@cavium.com>
Cc: Kevin Cernekee <cernekee@gmail.com>
Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
Cc: Tom Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Huacai Chen <chenhc@lemote.com>
Cc: iommu@lists.linux-foundation.org
Cc: linux-mips@linux-mips.org

authored by

Christoph Hellwig and committed by
Paul Burton
03df8229 e905086e

+39 -94
+1 -1
arch/mips/Kconfig
··· 726 726 727 727 config SGI_IP32 728 728 bool "SGI IP32 (O2)" 729 + select ARCH_HAS_PHYS_TO_DMA 729 730 select FW_ARC 730 731 select FW_ARC32 731 732 select BOOT_ELF32 ··· 735 734 select DMA_NONCOHERENT 736 735 select HW_HAS_PCI 737 736 select IRQ_MIPS_CPU 738 - select MIPS_DMA_DEFAULT 739 737 select R5000_CPU_SCACHE 740 738 select RM7000_CPU_SCACHE 741 739 select SYS_HAS_CPU_R5000
-92
arch/mips/include/asm/mach-ip32/dma-coherence.h
··· 1 - /* 2 - * This file is subject to the terms and conditions of the GNU General Public 3 - * License. See the file "COPYING" in the main directory of this archive 4 - * for more details. 5 - * 6 - * Copyright (C) 2006 Ralf Baechle <ralf@linux-mips.org> 7 - * 8 - */ 9 - #ifndef __ASM_MACH_IP32_DMA_COHERENCE_H 10 - #define __ASM_MACH_IP32_DMA_COHERENCE_H 11 - 12 - #include <asm/ip32/crime.h> 13 - 14 - struct device; 15 - 16 - /* 17 - * Few notes. 18 - * 1. CPU sees memory as two chunks: 0-256M@0x0, and the rest @0x40000000+256M 19 - * 2. PCI sees memory as one big chunk @0x0 (or we could use 0x40000000 for 20 - * native-endian) 21 - * 3. All other devices see memory as one big chunk at 0x40000000 22 - * 4. Non-PCI devices will pass NULL as struct device* 23 - * 24 - * Thus we translate differently, depending on device. 25 - */ 26 - 27 - #define RAM_OFFSET_MASK 0x3fffffffUL 28 - 29 - static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, 30 - size_t size) 31 - { 32 - dma_addr_t pa = virt_to_phys(addr) & RAM_OFFSET_MASK; 33 - 34 - if (dev == NULL) 35 - pa += CRIME_HI_MEM_BASE; 36 - 37 - return pa; 38 - } 39 - 40 - static inline dma_addr_t plat_map_dma_mem_page(struct device *dev, 41 - struct page *page) 42 - { 43 - dma_addr_t pa; 44 - 45 - pa = page_to_phys(page) & RAM_OFFSET_MASK; 46 - 47 - if (dev == NULL) 48 - pa += CRIME_HI_MEM_BASE; 49 - 50 - return pa; 51 - } 52 - 53 - /* This is almost certainly wrong but it's what dma-ip32.c used to use */ 54 - static inline unsigned long plat_dma_addr_to_phys(struct device *dev, 55 - dma_addr_t dma_addr) 56 - { 57 - unsigned long addr = dma_addr & RAM_OFFSET_MASK; 58 - 59 - if (dma_addr >= 256*1024*1024) 60 - addr += CRIME_HI_MEM_BASE; 61 - 62 - return addr; 63 - } 64 - 65 - static inline void plat_unmap_dma_mem(struct device *dev, dma_addr_t dma_addr, 66 - size_t size, enum dma_data_direction direction) 67 - { 68 - } 69 - 70 - static inline int plat_dma_supported(struct device *dev, u64 mask) 71 - { 72 - /* 73 - * we fall back to GFP_DMA when the mask isn't all 1s, 74 - * so we can't guarantee allocations that must be 75 - * within a tighter range than GFP_DMA.. 76 - */ 77 - if (mask < DMA_BIT_MASK(24)) 78 - return 0; 79 - 80 - return 1; 81 - } 82 - 83 - static inline void plat_post_dma_flush(struct device *dev) 84 - { 85 - } 86 - 87 - static inline int plat_device_is_coherent(struct device *dev) 88 - { 89 - return 0; /* IP32 is non-coherent */ 90 - } 91 - 92 - #endif /* __ASM_MACH_IP32_DMA_COHERENCE_H */
+1 -1
arch/mips/sgi-ip32/Makefile
··· 4 4 # 5 5 6 6 obj-y += ip32-berr.o ip32-irq.o ip32-platform.o ip32-setup.o ip32-reset.o \ 7 - crime.o ip32-memory.o 7 + crime.o ip32-memory.o ip32-dma.o
+37
arch/mips/sgi-ip32/ip32-dma.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2006 Ralf Baechle <ralf@linux-mips.org> 4 + */ 5 + #include <linux/dma-direct.h> 6 + #include <asm/ip32/crime.h> 7 + 8 + /* 9 + * Few notes. 10 + * 1. CPU sees memory as two chunks: 0-256M@0x0, and the rest @0x40000000+256M 11 + * 2. PCI sees memory as one big chunk @0x0 (or we could use 0x40000000 for 12 + * native-endian) 13 + * 3. All other devices see memory as one big chunk at 0x40000000 14 + * 4. Non-PCI devices will pass NULL as struct device* 15 + * 16 + * Thus we translate differently, depending on device. 17 + */ 18 + 19 + #define RAM_OFFSET_MASK 0x3fffffffUL 20 + 21 + dma_addr_t __phys_to_dma(struct device *dev, phys_addr_t paddr) 22 + { 23 + dma_addr_t dma_addr = paddr & RAM_OFFSET_MASK; 24 + 25 + if (!dev) 26 + dma_addr += CRIME_HI_MEM_BASE; 27 + return dma_addr; 28 + } 29 + 30 + phys_addr_t __dma_to_phys(struct device *dev, dma_addr_t dma_addr) 31 + { 32 + phys_addr_t paddr = dma_addr & RAM_OFFSET_MASK; 33 + 34 + if (dma_addr >= 256*1024*1024) 35 + paddr += CRIME_HI_MEM_BASE; 36 + return paddr; 37 + }