Loading arch/arm/mm/dma-mapping.c +15 −8 Original line number Original line Diff line number Diff line Loading @@ -219,7 +219,8 @@ static u64 get_coherent_dma_mask(struct device *dev) return mask; return mask; } } static void __dma_clear_buffer(struct page *page, size_t size) static void __dma_clear_buffer(struct page *page, size_t size, struct dma_attrs *attrs) { { /* /* * Ensure that the allocated pages are zeroed, and that any data * Ensure that the allocated pages are zeroed, and that any data Loading @@ -230,6 +231,7 @@ static void __dma_clear_buffer(struct page *page, size_t size) phys_addr_t end = base + size; phys_addr_t end = base + size; while (size > 0) { while (size > 0) { void *ptr = kmap_atomic(page); void *ptr = kmap_atomic(page); if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) memset(ptr, 0, PAGE_SIZE); memset(ptr, 0, PAGE_SIZE); dmac_flush_range(ptr, ptr + PAGE_SIZE); dmac_flush_range(ptr, ptr + PAGE_SIZE); kunmap_atomic(ptr); kunmap_atomic(ptr); Loading @@ -239,6 +241,7 @@ static void __dma_clear_buffer(struct page *page, size_t size) outer_flush_range(base, end); outer_flush_range(base, end); } else { } else { void *ptr = page_address(page); void *ptr = page_address(page); if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) memset(ptr, 0, size); memset(ptr, 0, size); dmac_flush_range(ptr, ptr + size); dmac_flush_range(ptr, ptr + size); outer_flush_range(__pa(ptr), __pa(ptr) + size); outer_flush_range(__pa(ptr), __pa(ptr) + size); Loading @@ -265,7 +268,7 @@ static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gf for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) __free_page(p); __free_page(p); __dma_clear_buffer(page, size); __dma_clear_buffer(page, size, NULL); return page; return page; } } Loading Loading @@ -627,8 +630,12 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size, page = pfn_to_page(pfn); page = pfn_to_page(pfn); if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) /* __dma_clear_buffer(page, size); * skip completely if we neither need to zero nor sync. */ if (!(dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs) && dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs))) __dma_clear_buffer(page, size, attrs); if (PageHighMem(page)) { if (PageHighMem(page)) { if (no_kernel_mapping) { if (no_kernel_mapping) { Loading Loading @@ -1170,7 +1177,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, pfn = pfn_to_page(pfn); pfn = pfn_to_page(pfn); __dma_clear_buffer(page, size); __dma_clear_buffer(page, size, NULL); for (i = 0; i < count; i++) for (i = 0; i < count; i++) pages[i] = page + i; pages[i] = page + i; Loading Loading @@ -1199,7 +1206,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, pages[i + j] = pages[i] + j; pages[i + j] = pages[i] + j; } } __dma_clear_buffer(pages[i], PAGE_SIZE << order); __dma_clear_buffer(pages[i], PAGE_SIZE << order, NULL); i += 1 << order; i += 1 << order; count -= 1 << order; count -= 1 << order; } } Loading Loading
arch/arm/mm/dma-mapping.c +15 −8 Original line number Original line Diff line number Diff line Loading @@ -219,7 +219,8 @@ static u64 get_coherent_dma_mask(struct device *dev) return mask; return mask; } } static void __dma_clear_buffer(struct page *page, size_t size) static void __dma_clear_buffer(struct page *page, size_t size, struct dma_attrs *attrs) { { /* /* * Ensure that the allocated pages are zeroed, and that any data * Ensure that the allocated pages are zeroed, and that any data Loading @@ -230,6 +231,7 @@ static void __dma_clear_buffer(struct page *page, size_t size) phys_addr_t end = base + size; phys_addr_t end = base + size; while (size > 0) { while (size > 0) { void *ptr = kmap_atomic(page); void *ptr = kmap_atomic(page); if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) memset(ptr, 0, PAGE_SIZE); memset(ptr, 0, PAGE_SIZE); dmac_flush_range(ptr, ptr + PAGE_SIZE); dmac_flush_range(ptr, ptr + PAGE_SIZE); kunmap_atomic(ptr); kunmap_atomic(ptr); Loading @@ -239,6 +241,7 @@ static void __dma_clear_buffer(struct page *page, size_t size) outer_flush_range(base, end); outer_flush_range(base, end); } else { } else { void *ptr = page_address(page); void *ptr = page_address(page); if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) memset(ptr, 0, size); memset(ptr, 0, size); dmac_flush_range(ptr, ptr + size); dmac_flush_range(ptr, ptr + size); outer_flush_range(__pa(ptr), __pa(ptr) + size); outer_flush_range(__pa(ptr), __pa(ptr) + size); Loading @@ -265,7 +268,7 @@ static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gf for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) __free_page(p); __free_page(p); __dma_clear_buffer(page, size); __dma_clear_buffer(page, size, NULL); return page; return page; } } Loading Loading @@ -627,8 +630,12 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size, page = pfn_to_page(pfn); page = pfn_to_page(pfn); if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) /* __dma_clear_buffer(page, size); * skip completely if we neither need to zero nor sync. */ if (!(dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs) && dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs))) __dma_clear_buffer(page, size, attrs); if (PageHighMem(page)) { if (PageHighMem(page)) { if (no_kernel_mapping) { if (no_kernel_mapping) { Loading Loading @@ -1170,7 +1177,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, pfn = pfn_to_page(pfn); pfn = pfn_to_page(pfn); __dma_clear_buffer(page, size); __dma_clear_buffer(page, size, NULL); for (i = 0; i < count; i++) for (i = 0; i < count; i++) pages[i] = page + i; pages[i] = page + i; Loading Loading @@ -1199,7 +1206,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, pages[i + j] = pages[i] + j; pages[i + j] = pages[i] + j; } } __dma_clear_buffer(pages[i], PAGE_SIZE << order); __dma_clear_buffer(pages[i], PAGE_SIZE << order, NULL); i += 1 << order; i += 1 << order; count -= 1 << order; count -= 1 << order; } } Loading