diff options
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 79f8b39801a8..f6b6bfa88ecf 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | * | 9 | * |
| 10 | * DMA uncached mapping support. | 10 | * DMA uncached mapping support. |
| 11 | */ | 11 | */ |
| 12 | #include <linux/bootmem.h> | ||
| 12 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 13 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
| 14 | #include <linux/gfp.h> | 15 | #include <linux/gfp.h> |
| @@ -162,6 +163,8 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
| 162 | u64 mask = (u64)DMA_BIT_MASK(32); | 163 | u64 mask = (u64)DMA_BIT_MASK(32); |
| 163 | 164 | ||
| 164 | if (dev) { | 165 | if (dev) { |
| 166 | unsigned long max_dma_pfn; | ||
| 167 | |||
| 165 | mask = dev->coherent_dma_mask; | 168 | mask = dev->coherent_dma_mask; |
| 166 | 169 | ||
| 167 | /* | 170 | /* |
| @@ -173,6 +176,8 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
| 173 | return 0; | 176 | return 0; |
| 174 | } | 177 | } |
| 175 | 178 | ||
| 179 | max_dma_pfn = min(max_pfn, arm_dma_pfn_limit); | ||
| 180 | |||
| 176 | /* | 181 | /* |
| 177 | * If the mask allows for more memory than we can address, | 182 | * If the mask allows for more memory than we can address, |
| 178 | * and we actually have that much memory, then fail the | 183 | * and we actually have that much memory, then fail the |
| @@ -180,7 +185,7 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
| 180 | */ | 185 | */ |
| 181 | if (sizeof(mask) != sizeof(dma_addr_t) && | 186 | if (sizeof(mask) != sizeof(dma_addr_t) && |
| 182 | mask > (dma_addr_t)~0 && | 187 | mask > (dma_addr_t)~0 && |
| 183 | dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) { | 188 | dma_to_pfn(dev, ~0) > max_dma_pfn) { |
| 184 | dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n", | 189 | dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n", |
| 185 | mask); | 190 | mask); |
| 186 | dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n"); | 191 | dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n"); |
| @@ -192,7 +197,7 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
| 192 | * fits within the allowable addresses which we can | 197 | * fits within the allowable addresses which we can |
| 193 | * allocate. | 198 | * allocate. |
| 194 | */ | 199 | */ |
| 195 | if (dma_to_pfn(dev, mask) < arm_dma_pfn_limit) { | 200 | if (dma_to_pfn(dev, mask) < max_dma_pfn) { |
| 196 | dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n", | 201 | dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n", |
| 197 | mask, | 202 | mask, |
| 198 | dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1, | 203 | dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1, |
