diff options
Diffstat (limited to 'arch/arm64/mm/dma-mapping.c')
| -rw-r--r-- | arch/arm64/mm/dma-mapping.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 58e0c2bdde04..ef7d112f5ce0 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c | |||
| @@ -51,7 +51,7 @@ static int __init early_coherent_pool(char *p) | |||
| 51 | } | 51 | } |
| 52 | early_param("coherent_pool", early_coherent_pool); | 52 | early_param("coherent_pool", early_coherent_pool); |
| 53 | 53 | ||
| 54 | static void *__alloc_from_pool(size_t size, struct page **ret_page) | 54 | static void *__alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags) |
| 55 | { | 55 | { |
| 56 | unsigned long val; | 56 | unsigned long val; |
| 57 | void *ptr = NULL; | 57 | void *ptr = NULL; |
| @@ -67,6 +67,8 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page) | |||
| 67 | 67 | ||
| 68 | *ret_page = phys_to_page(phys); | 68 | *ret_page = phys_to_page(phys); |
| 69 | ptr = (void *)val; | 69 | ptr = (void *)val; |
| 70 | if (flags & __GFP_ZERO) | ||
| 71 | memset(ptr, 0, size); | ||
| 70 | } | 72 | } |
| 71 | 73 | ||
| 72 | return ptr; | 74 | return ptr; |
| @@ -101,6 +103,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, | |||
| 101 | flags |= GFP_DMA; | 103 | flags |= GFP_DMA; |
| 102 | if (IS_ENABLED(CONFIG_DMA_CMA) && (flags & __GFP_WAIT)) { | 104 | if (IS_ENABLED(CONFIG_DMA_CMA) && (flags & __GFP_WAIT)) { |
| 103 | struct page *page; | 105 | struct page *page; |
| 106 | void *addr; | ||
| 104 | 107 | ||
| 105 | size = PAGE_ALIGN(size); | 108 | size = PAGE_ALIGN(size); |
| 106 | page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, | 109 | page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, |
| @@ -109,7 +112,10 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, | |||
| 109 | return NULL; | 112 | return NULL; |
| 110 | 113 | ||
| 111 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); | 114 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); |
| 112 | return page_address(page); | 115 | addr = page_address(page); |
| 116 | if (flags & __GFP_ZERO) | ||
| 117 | memset(addr, 0, size); | ||
| 118 | return addr; | ||
| 113 | } else { | 119 | } else { |
| 114 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); | 120 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); |
| 115 | } | 121 | } |
| @@ -146,7 +152,7 @@ static void *__dma_alloc(struct device *dev, size_t size, | |||
| 146 | 152 | ||
| 147 | if (!coherent && !(flags & __GFP_WAIT)) { | 153 | if (!coherent && !(flags & __GFP_WAIT)) { |
| 148 | struct page *page = NULL; | 154 | struct page *page = NULL; |
| 149 | void *addr = __alloc_from_pool(size, &page); | 155 | void *addr = __alloc_from_pool(size, &page, flags); |
| 150 | 156 | ||
| 151 | if (addr) | 157 | if (addr) |
| 152 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); | 158 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); |
