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

MIPS: DMA: Fix computation of DMA flags from device's coherent_dma_mask.

This only matters for ISA devices with a 24-bit DMA limit or for devices
with a 32-bit DMA limit on systems with ZONE_DMA32 enabled. The latter
currently only affects 32-bit PCI cards on Sibyte-based systems with more
than 1GB RAM installed.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

+20 -8
+20 -8
arch/mips/mm/dma-default.c
··· 44 44 45 45 static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp) 46 46 { 47 + gfp_t dma_flag; 48 + 47 49 /* ignore region specifiers */ 48 50 gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM); 49 51 50 - #ifdef CONFIG_ZONE_DMA 52 + #ifdef CONFIG_ISA 51 53 if (dev == NULL) 52 - gfp |= __GFP_DMA; 53 - else if (dev->coherent_dma_mask < DMA_BIT_MASK(24)) 54 - gfp |= __GFP_DMA; 54 + dma_flag = __GFP_DMA; 55 55 else 56 56 #endif 57 - #ifdef CONFIG_ZONE_DMA32 57 + #if defined(CONFIG_ZONE_DMA32) && defined(CONFIG_ZONE_DMA) 58 58 if (dev->coherent_dma_mask < DMA_BIT_MASK(32)) 59 - gfp |= __GFP_DMA32; 59 + dma_flag = __GFP_DMA; 60 + else if (dev->coherent_dma_mask < DMA_BIT_MASK(64)) 61 + dma_flag = __GFP_DMA32; 60 62 else 61 63 #endif 62 - ; 64 + #if defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_ZONE_DMA) 65 + if (dev->coherent_dma_mask < DMA_BIT_MASK(64)) 66 + dma_flag = __GFP_DMA32; 67 + else 68 + #endif 69 + #if defined(CONFIG_ZONE_DMA) && !defined(CONFIG_ZONE_DMA32) 70 + if (dev->coherent_dma_mask < DMA_BIT_MASK(64)) 71 + dma_flag = __GFP_DMA; 72 + else 73 + #endif 74 + dma_flag = 0; 63 75 64 76 /* Don't invoke OOM killer */ 65 77 gfp |= __GFP_NORETRY; 66 78 67 - return gfp; 79 + return gfp | dma_flag; 68 80 } 69 81 70 82 void *dma_alloc_noncoherent(struct device *dev, size_t size,