dma-mapping updates for Linux 5.16
- convert sparc32 to the generic dma-direct code - use bitmap_zalloc (Christophe JAILLET) -----BEGIN PGP SIGNATURE----- iQI/BAABCgApFiEEgdbnc3r/njty3Iq9D55TZVIEUYMFAmGKfNYLHGhjaEBsc3Qu ZGUACgkQD55TZVIEUYMEIRAAhOocEFpeaSg8iLMd7QLzm5vvzAuR43iykkKCvdvV Q4P+g8H9Jr65ThsGS90AuuDKuyKh3tmbL7loHlyDygmRHhHALOO4127um4RAnOAL 1y2qCRwgHEZTu1uiu65cB+RRrlJP6T4sHV7+U3uZ3P5nfQoVVIoHKMceSTLIa3dx WPyJXP33TWK50ZvGYuzMhO5hQPA8sKSePiaN3gz3anF0lMnqlUNh1Iso6nasUW40 XifOFM2Bg/SO7HpBGssrku6Zc5x9TpyuQtLP0u+LpjrbUYUZvz/OteyVu5cTZdbP QG7MG6jcvDuU41sjKYNjaNpGZlvmXrEs4pXiwbOhzHTG8TFIEiR/LRsrvBGS7DJ8 y0NKNryIKR3+9fMKDH0PWHC7NszJbAQR0J7OT7+GP8cx9M62x5MuV8d2uOXp6TPY v3VO0SJQrBZLKpY7vixZ6TOYMz15kmULMRrkGzf95+z5MpM2RjJ4lY8Kqlm2PBRR Q3k53Ii8ya9U61SvgcCH39gR1fGT+WO8E5UFttCfhUhn49KJc7DqbEUiOC8Ta7QC OONXxhGLdXAkti5NLFAexk8zdLBVRMnzfG44tBnP/JWDbQu3lMNuQfUXzsJK9yDb zWr/832qwTIzT01NGZDFWdKUPNpafyuDQ1lP9rZZ2ZLo+f/EXNsHvczXvkwP08xS cyY= =DvuN -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
372594985c
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user