Commit 37259498 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'dma-mapping-5.16' of git://git.infradead.org/users/hch/dma-mapping

Pull dma-mapping updates from Christoph Hellwig:
 "Just a small set of changes this time. The request dma_direct_alloc
  cleanups are still under review and haven't made the cut.

  Summary:

   - convert sparc32 to the generic dma-direct code

   - use bitmap_zalloc (Christophe JAILLET)"

* tag 'dma-mapping-5.16' of git://git.infradead.org/users/hch/dma-mapping:
  dma-mapping: use 'bitmap_zalloc()' when applicable
  sparc32: use DMA_DIRECT_REMAP
  sparc32: remove dma_make_coherent
  sparc32: remove the call to dma_make_coherent in arch_dma_free
parents 1bdd629e 9fbd8dc1
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -53,8 +53,9 @@ config SPARC32
	def_bool !64BIT
	select ARCH_32BIT_OFF_T
	select ARCH_HAS_SYNC_DMA_FOR_CPU
	select GENERIC_ATOMIC64
	select CLZ_TAB
	select DMA_DIRECT_REMAP
	select GENERIC_ATOMIC64
	select HAVE_UID16
	select OLD_SIGACTION
	select ZONE_DMA
+8 −68
Original line number Diff line number Diff line
@@ -52,17 +52,6 @@
#include <asm/io-unit.h>
#include <asm/leon.h>

/* This function must make sure that caches and memory are coherent after DMA
 * On LEON systems without cache snooping it flushes the entire D-CACHE.
 */
static inline void dma_make_coherent(unsigned long pa, unsigned long len)
{
	if (sparc_cpu_model == sparc_leon) {
		if (!sparc_leon3_snooping_enabled())
			leon_flush_dcache_all();
	}
}

static void __iomem *_sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz);
static void __iomem *_sparc_alloc_io(unsigned int busno, unsigned long phys,
    unsigned long size, char *name);
@@ -311,68 +300,19 @@ arch_initcall(sparc_register_ioport);

#endif /* CONFIG_SBUS */


/* Allocate and map kernel buffer using consistent mode DMA for a device.
 * hwdev should be valid struct pci_dev pointer for PCI devices.
 */
void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
		gfp_t gfp, unsigned long attrs)
{
	unsigned long addr;
	void *va;

	if (!size || size > 256 * 1024)	/* __get_free_pages() limit */
		return NULL;

	size = PAGE_ALIGN(size);
	va = (void *) __get_free_pages(gfp | __GFP_ZERO, get_order(size));
	if (!va) {
		printk("%s: no %zd pages\n", __func__, size >> PAGE_SHIFT);
		return NULL;
	}

	addr = sparc_dma_alloc_resource(dev, size);
	if (!addr)
		goto err_nomem;

	srmmu_mapiorange(0, virt_to_phys(va), addr, size);

	*dma_handle = virt_to_phys(va);
	return (void *)addr;

err_nomem:
	free_pages((unsigned long)va, get_order(size));
	return NULL;
}

/* Free and unmap a consistent DMA buffer.
 * cpu_addr is what was returned arch_dma_alloc, size must be the same as what
 * was passed into arch_dma_alloc, and likewise dma_addr must be the same as
 * what *dma_ndler was set to.
/*
 * IIep is write-through, not flushing on cpu to device transfer.
 *
 * References to the memory and mappings associated with cpu_addr/dma_addr
 * past this call are illegal.
 * On LEON systems without cache snooping, the entire D-CACHE must be flushed to
 * make DMA to cacheable memory coherent.
 */
void arch_dma_free(struct device *dev, size_t size, void *cpu_addr,
		dma_addr_t dma_addr, unsigned long attrs)
{
	size = PAGE_ALIGN(size);

	if (!sparc_dma_free_resource(cpu_addr, size))
		return;

	dma_make_coherent(dma_addr, size);
	srmmu_unmapiorange((unsigned long)cpu_addr, size);
	free_pages((unsigned long)phys_to_virt(dma_addr), get_order(size));
}

/* IIep is write-through, not flushing on cpu to device transfer. */

void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
		enum dma_data_direction dir)
{
	if (dir != PCI_DMA_TODEVICE)
		dma_make_coherent(paddr, PAGE_ALIGN(size));
	if (dir != PCI_DMA_TODEVICE &&
	    sparc_cpu_model == sparc_leon &&
	    !sparc_leon3_snooping_enabled())
		leon_flush_dcache_all();
}

#ifdef CONFIG_PROC_FS
+2 −3
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ static struct dma_coherent_mem *dma_init_coherent_memory(phys_addr_t phys_addr,
{
	struct dma_coherent_mem *dma_mem;
	int pages = size >> PAGE_SHIFT;
	int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);
	void *mem_base;

	if (!size)
@@ -53,7 +52,7 @@ static struct dma_coherent_mem *dma_init_coherent_memory(phys_addr_t phys_addr,
	dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
	if (!dma_mem)
		goto out_unmap_membase;
	dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
	dma_mem->bitmap = bitmap_zalloc(pages, GFP_KERNEL);
	if (!dma_mem->bitmap)
		goto out_free_dma_mem;

@@ -81,7 +80,7 @@ static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
		return;

	memunmap(mem->virt_base);
	kfree(mem->bitmap);
	bitmap_free(mem->bitmap);
	kfree(mem);
}