diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-07-08 16:26:59 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-07-12 06:08:12 -0400 |
| commit | 022ae537b23cb14a391565e9ad9e9945f4b17138 (patch) | |
| tree | e167c03036fcc09d7131fa364efa70c9e3d5b92a | |
| parent | 3973c337759cd201773a0ecc7b6f39f1ea2a6287 (diff) | |
ARM: dma: replace ISA_DMA_THRESHOLD with a variable
ISA_DMA_THRESHOLD has been unused by non-arch code, so lets now get
rid of it from ARM by replacing it with arm_dma_zone_mask. Move
dma_supported() and dma_set_mask() out of line, and have
dma_supported() check this new variable instead.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/include/asm/dma-mapping.h | 29 | ||||
| -rw-r--r-- | arch/arm/include/asm/memory.h | 12 | ||||
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 35 | ||||
| -rw-r--r-- | arch/arm/mm/init.c | 10 | ||||
| -rw-r--r-- | arch/arm/mm/mm.h | 6 |
5 files changed, 50 insertions, 42 deletions
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 94662f4c9ea7..7a21d0bf7134 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
| @@ -115,33 +115,8 @@ static inline void __dma_page_dev_to_cpu(struct page *page, unsigned long off, | |||
| 115 | ___dma_page_dev_to_cpu(page, off, size, dir); | 115 | ___dma_page_dev_to_cpu(page, off, size, dir); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | /* | 118 | extern int dma_supported(struct device *, u64); |
| 119 | * Return whether the given device DMA address mask can be supported | 119 | extern int dma_set_mask(struct device *, u64); |
| 120 | * properly. For example, if your device can only drive the low 24-bits | ||
| 121 | * during bus mastering, then you would pass 0x00ffffff as the mask | ||
| 122 | * to this function. | ||
| 123 | * | ||
| 124 | * FIXME: This should really be a platform specific issue - we should | ||
| 125 | * return false if GFP_DMA allocations may not satisfy the supplied 'mask'. | ||
| 126 | */ | ||
| 127 | static inline int dma_supported(struct device *dev, u64 mask) | ||
| 128 | { | ||
| 129 | if (mask < ISA_DMA_THRESHOLD) | ||
| 130 | return 0; | ||
| 131 | return 1; | ||
| 132 | } | ||
| 133 | |||
| 134 | static inline int dma_set_mask(struct device *dev, u64 dma_mask) | ||
| 135 | { | ||
| 136 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) | ||
| 137 | return -EIO; | ||
| 138 | |||
| 139 | #ifndef CONFIG_DMABOUNCE | ||
| 140 | *dev->dma_mask = dma_mask; | ||
| 141 | #endif | ||
| 142 | |||
| 143 | return 0; | ||
| 144 | } | ||
| 145 | 120 | ||
| 146 | /* | 121 | /* |
| 147 | * DMA errors are defined by all-bits-set in the DMA address. | 122 | * DMA errors are defined by all-bits-set in the DMA address. |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index af44a8fb3480..b8de516e600e 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -204,18 +204,6 @@ static inline unsigned long __phys_to_virt(unsigned long x) | |||
| 204 | #endif | 204 | #endif |
| 205 | 205 | ||
| 206 | /* | 206 | /* |
| 207 | * The DMA mask corresponding to the maximum bus address allocatable | ||
| 208 | * using GFP_DMA. The default here places no restriction on DMA | ||
| 209 | * allocations. This must be the smallest DMA mask in the system, | ||
| 210 | * so a successful GFP_DMA allocation will always satisfy this. | ||
| 211 | */ | ||
| 212 | #ifndef ARM_DMA_ZONE_SIZE | ||
| 213 | #define ISA_DMA_THRESHOLD (0xffffffffULL) | ||
| 214 | #else | ||
| 215 | #define ISA_DMA_THRESHOLD (PHYS_OFFSET + ARM_DMA_ZONE_SIZE - 1) | ||
| 216 | #endif | ||
| 217 | |||
| 218 | /* | ||
| 219 | * PFNs are used to describe any physical page; this means | 207 | * PFNs are used to describe any physical page; this means |
| 220 | * PFN 0 == physical address 0. | 208 | * PFN 0 == physical address 0. |
| 221 | * | 209 | * |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 82a093cee09a..0a0a1e7c20d2 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -25,9 +25,11 @@ | |||
| 25 | #include <asm/tlbflush.h> | 25 | #include <asm/tlbflush.h> |
| 26 | #include <asm/sizes.h> | 26 | #include <asm/sizes.h> |
| 27 | 27 | ||
| 28 | #include "mm.h" | ||
| 29 | |||
| 28 | static u64 get_coherent_dma_mask(struct device *dev) | 30 | static u64 get_coherent_dma_mask(struct device *dev) |
| 29 | { | 31 | { |
| 30 | u64 mask = ISA_DMA_THRESHOLD; | 32 | u64 mask = (u64)arm_dma_limit; |
| 31 | 33 | ||
| 32 | if (dev) { | 34 | if (dev) { |
| 33 | mask = dev->coherent_dma_mask; | 35 | mask = dev->coherent_dma_mask; |
| @@ -41,10 +43,10 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
| 41 | return 0; | 43 | return 0; |
| 42 | } | 44 | } |
| 43 | 45 | ||
| 44 | if ((~mask) & ISA_DMA_THRESHOLD) { | 46 | if ((~mask) & (u64)arm_dma_limit) { |
| 45 | dev_warn(dev, "coherent DMA mask %#llx is smaller " | 47 | dev_warn(dev, "coherent DMA mask %#llx is smaller " |
| 46 | "than system GFP_DMA mask %#llx\n", | 48 | "than system GFP_DMA mask %#llx\n", |
| 47 | mask, (unsigned long long)ISA_DMA_THRESHOLD); | 49 | mask, (u64)arm_dma_limit); |
| 48 | return 0; | 50 | return 0; |
| 49 | } | 51 | } |
| 50 | } | 52 | } |
| @@ -657,6 +659,33 @@ void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | |||
| 657 | } | 659 | } |
| 658 | EXPORT_SYMBOL(dma_sync_sg_for_device); | 660 | EXPORT_SYMBOL(dma_sync_sg_for_device); |
| 659 | 661 | ||
| 662 | /* | ||
| 663 | * Return whether the given device DMA address mask can be supported | ||
| 664 | * properly. For example, if your device can only drive the low 24-bits | ||
| 665 | * during bus mastering, then you would pass 0x00ffffff as the mask | ||
| 666 | * to this function. | ||
| 667 | */ | ||
| 668 | int dma_supported(struct device *dev, u64 mask) | ||
| 669 | { | ||
| 670 | if (mask < (u64)arm_dma_limit) | ||
| 671 | return 0; | ||
| 672 | return 1; | ||
| 673 | } | ||
| 674 | EXPORT_SYMBOL(dma_supported); | ||
| 675 | |||
| 676 | int dma_set_mask(struct device *dev, u64 dma_mask) | ||
| 677 | { | ||
| 678 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) | ||
| 679 | return -EIO; | ||
| 680 | |||
| 681 | #ifndef CONFIG_DMABOUNCE | ||
| 682 | *dev->dma_mask = dma_mask; | ||
| 683 | #endif | ||
| 684 | |||
| 685 | return 0; | ||
| 686 | } | ||
| 687 | EXPORT_SYMBOL(dma_set_mask); | ||
| 688 | |||
| 660 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 | 689 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 |
| 661 | 690 | ||
| 662 | static int __init dma_debug_do_init(void) | 691 | static int __init dma_debug_do_init(void) |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index c19571c40a21..17d6cd0c57ed 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
| @@ -212,6 +212,14 @@ static void __init arm_bootmem_init(unsigned long start_pfn, | |||
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | #ifdef CONFIG_ZONE_DMA | 214 | #ifdef CONFIG_ZONE_DMA |
| 215 | /* | ||
| 216 | * The DMA mask corresponding to the maximum bus address allocatable | ||
| 217 | * using GFP_DMA. The default here places no restriction on DMA | ||
| 218 | * allocations. This must be the smallest DMA mask in the system, | ||
| 219 | * so a successful GFP_DMA allocation will always satisfy this. | ||
| 220 | */ | ||
| 221 | u32 arm_dma_limit; | ||
| 222 | |||
| 215 | static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole, | 223 | static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole, |
| 216 | unsigned long dma_size) | 224 | unsigned long dma_size) |
| 217 | { | 225 | { |
| @@ -278,6 +286,8 @@ static void __init arm_bootmem_free(unsigned long min, unsigned long max_low, | |||
| 278 | */ | 286 | */ |
| 279 | arm_adjust_dma_zone(zone_size, zhole_size, | 287 | arm_adjust_dma_zone(zone_size, zhole_size, |
| 280 | ARM_DMA_ZONE_SIZE >> PAGE_SHIFT); | 288 | ARM_DMA_ZONE_SIZE >> PAGE_SHIFT); |
| 289 | |||
| 290 | arm_dma_limit = PHYS_OFFSET + ARM_DMA_ZONE_SIZE - 1; | ||
| 281 | #endif | 291 | #endif |
| 282 | 292 | ||
| 283 | free_area_init_node(0, zone_size, min, zhole_size); | 293 | free_area_init_node(0, zone_size, min, zhole_size); |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index 5b3d7d543659..010566799c80 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
| @@ -23,5 +23,11 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page | |||
| 23 | 23 | ||
| 24 | #endif | 24 | #endif |
| 25 | 25 | ||
| 26 | #ifdef CONFIG_ZONE_DMA | ||
| 27 | extern u32 arm_dma_limit; | ||
| 28 | #else | ||
| 29 | #define arm_dma_limit ((u32)~0) | ||
| 30 | #endif | ||
| 31 | |||
| 26 | void __init bootmem_init(void); | 32 | void __init bootmem_init(void); |
| 27 | void arm_mm_memblock_reserve(void); | 33 | void arm_mm_memblock_reserve(void); |
