mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
DMA mapping updates for 5.2
- remove the already broken support for NULL dev arguments to the DMA API calls - Kconfig tidyups -----BEGIN PGP SIGNATURE----- iQI/BAABCgApFiEEgdbnc3r/njty3Iq9D55TZVIEUYMFAlzT00YLHGhjaEBsc3Qu ZGUACgkQD55TZVIEUYO66hAAx2kCUIh+K2gFB5uxHqZiG62UmRjkPzolxcR5/Jx9 4Rz6NRAE+rp8v2fbBr2bveDx7cF5bm1L+pRyRsFMfwkm3a8dCHQ51ldIm5VFoI3e NiX6Zoxk02BCXP/Qk//aHeNW9dBmuiemiXzdPEhOvWvVzqTO5JZrECQpkHEkG+8A R/IWU15sr5xzw9Td/HVN9CRJri/qiTAuB9nSoP6BGjZeHkQjREJKNMGKDTvSzH4L tlyD1G7yEymQvLBqGGO64ztuav00l8sqjI3tn1mmwpw4VTajabeRHPnWh+7g9Od+ sH1pRvIOTvEMc456fizufYIOedB5Ze344kgfrxhngRbBVXmMfShr8ZLzdIUGhGjY 1cdGqIUOEKywiDf13KrHVkNU+lJtvjMCMxvV93mAYRLOIQg0Jf4T2kklgKyEhqrG rqFdbbtSBzmLjPyqc1FS0heDWmA+yJsKAumGcH4blJXCpsD1rHWGe0AJ34x+OHPT tw5l+P4zAH1eO1qHCtmxN9s0lXZv1VLcFkOrJH91LPvAhZsUCrdqDjyJpTUYaIao yzkiLbDwFO7SVoqzaVNlVZIJ/9LX0qfAnl2Atty+sAQomrQMoviNSzGbLSLQqhHN FbTIEBMxrxS49+3lfzHOS/lYPpJp6B31yotNM+6YpXmbRQZN5gjGNYBqhKD+7Rgn L0Y= =IdsP -----END PGP SIGNATURE----- Merge tag 'dma-mapping-5.2' of git://git.infradead.org/users/hch/dma-mapping Pull DMA mapping updates from Christoph Hellwig: - remove the already broken support for NULL dev arguments to the DMA API calls - Kconfig tidyups * tag 'dma-mapping-5.2' of git://git.infradead.org/users/hch/dma-mapping: dma-mapping: add a Kconfig symbol to indicate arch_dma_prep_coherent presence dma-mapping: remove an unnecessary NULL check x86/dma: Remove the x86_dma_fallback_dev hack dma-mapping: remove leftover NULL device support arm: use a dummy struct device for ISA DMA use of the DMA API pxa3xx-gcu: pass struct device to dma_mmap_coherent gbefb: switch to managed version of the DMA allocator da8xx-fb: pass struct device to DMA API functions parport_ip32: pass struct device to DMA API functions dma: select GENERIC_ALLOCATOR for DMA_REMAP
This commit is contained in:
commit
ddab5337b2
@ -365,13 +365,12 @@ __get_free_pages() (but takes size instead of a page order). If your
|
||||
driver needs regions sized smaller than a page, you may prefer using
|
||||
the dma_pool interface, described below.
|
||||
|
||||
The consistent DMA mapping interfaces, for non-NULL dev, will by
|
||||
default return a DMA address which is 32-bit addressable. Even if the
|
||||
device indicates (via DMA mask) that it may address the upper 32-bits,
|
||||
consistent allocation will only return > 32-bit addresses for DMA if
|
||||
the consistent DMA mask has been explicitly changed via
|
||||
dma_set_coherent_mask(). This is true of the dma_pool interface as
|
||||
well.
|
||||
The consistent DMA mapping interfaces, will by default return a DMA address
|
||||
which is 32-bit addressable. Even if the device indicates (via the DMA mask)
|
||||
that it may address the upper 32-bits, consistent allocation will only
|
||||
return > 32-bit addresses for DMA if the consistent DMA mask has been
|
||||
explicitly changed via dma_set_coherent_mask(). This is true of the
|
||||
dma_pool interface as well.
|
||||
|
||||
dma_alloc_coherent() returns two values: the virtual address which you
|
||||
can use to access it from the CPU and dma_handle which you pass to the
|
||||
|
@ -55,6 +55,12 @@ static int isa_get_dma_residue(unsigned int chan, dma_t *dma)
|
||||
return chan < 4 ? count : (count << 1);
|
||||
}
|
||||
|
||||
static struct device isa_dma_dev = {
|
||||
.init_name = "fallback device",
|
||||
.coherent_dma_mask = ~(dma_addr_t)0,
|
||||
.dma_mask = &isa_dma_dev.coherent_dma_mask,
|
||||
};
|
||||
|
||||
static void isa_enable_dma(unsigned int chan, dma_t *dma)
|
||||
{
|
||||
if (dma->invalid) {
|
||||
@ -89,7 +95,7 @@ static void isa_enable_dma(unsigned int chan, dma_t *dma)
|
||||
dma->sg = &dma->buf;
|
||||
dma->sgcount = 1;
|
||||
dma->buf.length = dma->count;
|
||||
dma->buf.dma_address = dma_map_single(NULL,
|
||||
dma->buf.dma_address = dma_map_single(&isa_dma_dev,
|
||||
dma->addr, dma->count,
|
||||
direction);
|
||||
}
|
||||
|
@ -151,6 +151,12 @@ static void iomd_free_dma(unsigned int chan, dma_t *dma)
|
||||
free_irq(idma->irq, idma);
|
||||
}
|
||||
|
||||
static struct device isa_dma_dev = {
|
||||
.init_name = "fallback device",
|
||||
.coherent_dma_mask = ~(dma_addr_t)0,
|
||||
.dma_mask = &isa_dma_dev.coherent_dma_mask,
|
||||
};
|
||||
|
||||
static void iomd_enable_dma(unsigned int chan, dma_t *dma)
|
||||
{
|
||||
struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma);
|
||||
@ -168,7 +174,7 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma)
|
||||
idma->dma.sg = &idma->dma.buf;
|
||||
idma->dma.sgcount = 1;
|
||||
idma->dma.buf.length = idma->dma.count;
|
||||
idma->dma.buf.dma_address = dma_map_single(NULL,
|
||||
idma->dma.buf.dma_address = dma_map_single(&isa_dma_dev,
|
||||
idma->dma.addr, idma->dma.count,
|
||||
idma->dma.dma_mode == DMA_MODE_READ ?
|
||||
DMA_FROM_DEVICE : DMA_TO_DEVICE);
|
||||
|
@ -13,6 +13,7 @@ config ARM64
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_DMA_COHERENT_TO_PFN
|
||||
select ARCH_HAS_DMA_MMAP_PGPROT
|
||||
select ARCH_HAS_DMA_PREP_COHERENT
|
||||
select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_FAST_MULTIPLIER
|
||||
|
@ -1,6 +1,7 @@
|
||||
config CSKY
|
||||
def_bool y
|
||||
select ARCH_32BIT_OFF_T
|
||||
select ARCH_HAS_DMA_PREP_COHERENT
|
||||
select ARCH_HAS_SYNC_DMA_FOR_CPU
|
||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
||||
select ARCH_USE_BUILTIN_BSWAP
|
||||
|
@ -13,14 +13,7 @@
|
||||
#include <asm/swiotlb.h>
|
||||
#include <linux/dma-contiguous.h>
|
||||
|
||||
#ifdef CONFIG_ISA
|
||||
# define ISA_DMA_BIT_MASK DMA_BIT_MASK(24)
|
||||
#else
|
||||
# define ISA_DMA_BIT_MASK DMA_BIT_MASK(32)
|
||||
#endif
|
||||
|
||||
extern int iommu_merge;
|
||||
extern struct device x86_dma_fallback_dev;
|
||||
extern int panic_on_overflow;
|
||||
|
||||
extern const struct dma_map_ops *dma_ops;
|
||||
@ -30,7 +23,4 @@ static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
|
||||
return dma_ops;
|
||||
}
|
||||
|
||||
bool arch_dma_alloc_attrs(struct device **dev);
|
||||
#define arch_dma_alloc_attrs arch_dma_alloc_attrs
|
||||
|
||||
#endif
|
||||
|
@ -233,9 +233,6 @@ static dma_addr_t gart_map_page(struct device *dev, struct page *page,
|
||||
unsigned long bus;
|
||||
phys_addr_t paddr = page_to_phys(page) + offset;
|
||||
|
||||
if (!dev)
|
||||
dev = &x86_dma_fallback_dev;
|
||||
|
||||
if (!need_iommu(dev, paddr, size))
|
||||
return paddr;
|
||||
|
||||
@ -392,9 +389,6 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
if (nents == 0)
|
||||
return 0;
|
||||
|
||||
if (!dev)
|
||||
dev = &x86_dma_fallback_dev;
|
||||
|
||||
out = 0;
|
||||
start = 0;
|
||||
start_sg = sg;
|
||||
|
@ -51,14 +51,6 @@ int iommu_pass_through __read_mostly;
|
||||
|
||||
extern struct iommu_table_entry __iommu_table[], __iommu_table_end[];
|
||||
|
||||
/* Dummy device used for NULL arguments (normally ISA). */
|
||||
struct device x86_dma_fallback_dev = {
|
||||
.init_name = "fallback device",
|
||||
.coherent_dma_mask = ISA_DMA_BIT_MASK,
|
||||
.dma_mask = &x86_dma_fallback_dev.coherent_dma_mask,
|
||||
};
|
||||
EXPORT_SYMBOL(x86_dma_fallback_dev);
|
||||
|
||||
void __init pci_iommu_alloc(void)
|
||||
{
|
||||
struct iommu_table_entry *p;
|
||||
@ -77,18 +69,6 @@ void __init pci_iommu_alloc(void)
|
||||
}
|
||||
}
|
||||
|
||||
bool arch_dma_alloc_attrs(struct device **dev)
|
||||
{
|
||||
if (!*dev)
|
||||
*dev = &x86_dma_fallback_dev;
|
||||
|
||||
if (!is_device_dma_capable(*dev))
|
||||
return false;
|
||||
return true;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(arch_dma_alloc_attrs);
|
||||
|
||||
/*
|
||||
* See <Documentation/x86/x86_64/boot-options.txt> for the iommu kernel
|
||||
* parameter documentation.
|
||||
|
@ -568,6 +568,7 @@ static irqreturn_t parport_ip32_merr_interrupt(int irq, void *dev_id)
|
||||
|
||||
/**
|
||||
* parport_ip32_dma_start - begins a DMA transfer
|
||||
* @p: partport to work on
|
||||
* @dir: DMA direction: DMA_TO_DEVICE or DMA_FROM_DEVICE
|
||||
* @addr: pointer to data buffer
|
||||
* @count: buffer size
|
||||
@ -575,8 +576,8 @@ static irqreturn_t parport_ip32_merr_interrupt(int irq, void *dev_id)
|
||||
* Calls to parport_ip32_dma_start() and parport_ip32_dma_stop() must be
|
||||
* correctly balanced.
|
||||
*/
|
||||
static int parport_ip32_dma_start(enum dma_data_direction dir,
|
||||
void *addr, size_t count)
|
||||
static int parport_ip32_dma_start(struct parport *p,
|
||||
enum dma_data_direction dir, void *addr, size_t count)
|
||||
{
|
||||
unsigned int limit;
|
||||
u64 ctrl;
|
||||
@ -601,7 +602,7 @@ static int parport_ip32_dma_start(enum dma_data_direction dir,
|
||||
|
||||
/* Prepare DMA pointers */
|
||||
parport_ip32_dma.dir = dir;
|
||||
parport_ip32_dma.buf = dma_map_single(NULL, addr, count, dir);
|
||||
parport_ip32_dma.buf = dma_map_single(&p->bus_dev, addr, count, dir);
|
||||
parport_ip32_dma.len = count;
|
||||
parport_ip32_dma.next = parport_ip32_dma.buf;
|
||||
parport_ip32_dma.left = parport_ip32_dma.len;
|
||||
@ -625,11 +626,12 @@ static int parport_ip32_dma_start(enum dma_data_direction dir,
|
||||
|
||||
/**
|
||||
* parport_ip32_dma_stop - ends a running DMA transfer
|
||||
* @p: partport to work on
|
||||
*
|
||||
* Calls to parport_ip32_dma_start() and parport_ip32_dma_stop() must be
|
||||
* correctly balanced.
|
||||
*/
|
||||
static void parport_ip32_dma_stop(void)
|
||||
static void parport_ip32_dma_stop(struct parport *p)
|
||||
{
|
||||
u64 ctx_a;
|
||||
u64 ctx_b;
|
||||
@ -685,8 +687,8 @@ static void parport_ip32_dma_stop(void)
|
||||
enable_irq(MACEISA_PAR_CTXB_IRQ);
|
||||
parport_ip32_dma.irq_on = 1;
|
||||
|
||||
dma_unmap_single(NULL, parport_ip32_dma.buf, parport_ip32_dma.len,
|
||||
parport_ip32_dma.dir);
|
||||
dma_unmap_single(&p->bus_dev, parport_ip32_dma.buf,
|
||||
parport_ip32_dma.len, parport_ip32_dma.dir);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1445,7 +1447,7 @@ static size_t parport_ip32_fifo_write_block_dma(struct parport *p,
|
||||
|
||||
priv->irq_mode = PARPORT_IP32_IRQ_HERE;
|
||||
|
||||
parport_ip32_dma_start(DMA_TO_DEVICE, (void *)buf, len);
|
||||
parport_ip32_dma_start(p, DMA_TO_DEVICE, (void *)buf, len);
|
||||
reinit_completion(&priv->irq_complete);
|
||||
parport_ip32_frob_econtrol(p, ECR_DMAEN | ECR_SERVINTR, ECR_DMAEN);
|
||||
|
||||
@ -1461,7 +1463,7 @@ static size_t parport_ip32_fifo_write_block_dma(struct parport *p,
|
||||
if (ecr & ECR_SERVINTR)
|
||||
break; /* DMA transfer just finished */
|
||||
}
|
||||
parport_ip32_dma_stop();
|
||||
parport_ip32_dma_stop(p);
|
||||
written = len - parport_ip32_dma_get_residue();
|
||||
|
||||
priv->irq_mode = PARPORT_IP32_IRQ_FWD;
|
||||
|
@ -1097,9 +1097,9 @@ static int fb_remove(struct platform_device *dev)
|
||||
|
||||
unregister_framebuffer(info);
|
||||
fb_dealloc_cmap(&info->cmap);
|
||||
dma_free_coherent(NULL, PALETTE_SIZE, par->v_palette_base,
|
||||
dma_free_coherent(par->dev, PALETTE_SIZE, par->v_palette_base,
|
||||
par->p_palette_base);
|
||||
dma_free_coherent(NULL, par->vram_size, par->vram_virt,
|
||||
dma_free_coherent(par->dev, par->vram_size, par->vram_virt,
|
||||
par->vram_phys);
|
||||
pm_runtime_put_sync(&dev->dev);
|
||||
pm_runtime_disable(&dev->dev);
|
||||
@ -1425,7 +1425,7 @@ static int fb_probe(struct platform_device *device)
|
||||
par->vram_size = roundup(par->vram_size/8, ulcm);
|
||||
par->vram_size = par->vram_size * LCD_NUM_BUFFERS;
|
||||
|
||||
par->vram_virt = dma_alloc_coherent(NULL,
|
||||
par->vram_virt = dma_alloc_coherent(par->dev,
|
||||
par->vram_size,
|
||||
&par->vram_phys,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
@ -1446,7 +1446,7 @@ static int fb_probe(struct platform_device *device)
|
||||
da8xx_fb_fix.line_length - 1;
|
||||
|
||||
/* allocate palette buffer */
|
||||
par->v_palette_base = dma_alloc_coherent(NULL, PALETTE_SIZE,
|
||||
par->v_palette_base = dma_alloc_coherent(par->dev, PALETTE_SIZE,
|
||||
&par->p_palette_base,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (!par->v_palette_base) {
|
||||
@ -1532,11 +1532,12 @@ err_dealloc_cmap:
|
||||
fb_dealloc_cmap(&da8xx_fb_info->cmap);
|
||||
|
||||
err_release_pl_mem:
|
||||
dma_free_coherent(NULL, PALETTE_SIZE, par->v_palette_base,
|
||||
dma_free_coherent(par->dev, PALETTE_SIZE, par->v_palette_base,
|
||||
par->p_palette_base);
|
||||
|
||||
err_release_fb_mem:
|
||||
dma_free_coherent(NULL, par->vram_size, par->vram_virt, par->vram_phys);
|
||||
dma_free_coherent(par->dev, par->vram_size, par->vram_virt,
|
||||
par->vram_phys);
|
||||
|
||||
err_release_fb:
|
||||
framebuffer_release(da8xx_fb_info);
|
||||
|
@ -1162,9 +1162,9 @@ static int gbefb_probe(struct platform_device *p_dev)
|
||||
}
|
||||
gbe_revision = gbe->ctrlstat & 15;
|
||||
|
||||
gbe_tiles.cpu =
|
||||
dma_alloc_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t),
|
||||
&gbe_tiles.dma, GFP_KERNEL);
|
||||
gbe_tiles.cpu = dmam_alloc_coherent(&p_dev->dev,
|
||||
GBE_TLB_SIZE * sizeof(uint16_t),
|
||||
&gbe_tiles.dma, GFP_KERNEL);
|
||||
if (!gbe_tiles.cpu) {
|
||||
printk(KERN_ERR "gbefb: couldn't allocate tiles table\n");
|
||||
ret = -ENOMEM;
|
||||
@ -1178,19 +1178,20 @@ static int gbefb_probe(struct platform_device *p_dev)
|
||||
if (!gbe_mem) {
|
||||
printk(KERN_ERR "gbefb: couldn't map framebuffer\n");
|
||||
ret = -ENOMEM;
|
||||
goto out_tiles_free;
|
||||
goto out_release_mem_region;
|
||||
}
|
||||
|
||||
gbe_dma_addr = 0;
|
||||
} else {
|
||||
/* try to allocate memory with the classical allocator
|
||||
* this has high chance to fail on low memory machines */
|
||||
gbe_mem = dma_alloc_wc(NULL, gbe_mem_size, &gbe_dma_addr,
|
||||
GFP_KERNEL);
|
||||
gbe_mem = dmam_alloc_attrs(&p_dev->dev, gbe_mem_size,
|
||||
&gbe_dma_addr, GFP_KERNEL,
|
||||
DMA_ATTR_WRITE_COMBINE);
|
||||
if (!gbe_mem) {
|
||||
printk(KERN_ERR "gbefb: couldn't allocate framebuffer memory\n");
|
||||
ret = -ENOMEM;
|
||||
goto out_tiles_free;
|
||||
goto out_release_mem_region;
|
||||
}
|
||||
|
||||
gbe_mem_phys = (unsigned long) gbe_dma_addr;
|
||||
@ -1237,11 +1238,6 @@ static int gbefb_probe(struct platform_device *p_dev)
|
||||
|
||||
out_gbe_unmap:
|
||||
arch_phys_wc_del(par->wc_cookie);
|
||||
if (gbe_dma_addr)
|
||||
dma_free_wc(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys);
|
||||
out_tiles_free:
|
||||
dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t),
|
||||
(void *)gbe_tiles.cpu, gbe_tiles.dma);
|
||||
out_release_mem_region:
|
||||
release_mem_region(GBE_BASE, sizeof(struct sgi_gbe));
|
||||
out_release_framebuffer:
|
||||
@ -1258,10 +1254,6 @@ static int gbefb_remove(struct platform_device* p_dev)
|
||||
unregister_framebuffer(info);
|
||||
gbe_turn_off();
|
||||
arch_phys_wc_del(par->wc_cookie);
|
||||
if (gbe_dma_addr)
|
||||
dma_free_wc(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys);
|
||||
dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t),
|
||||
(void *)gbe_tiles.cpu, gbe_tiles.dma);
|
||||
release_mem_region(GBE_BASE, sizeof(struct sgi_gbe));
|
||||
gbefb_remove_sysfs(&p_dev->dev);
|
||||
framebuffer_release(info);
|
||||
|
@ -96,6 +96,7 @@ struct pxa3xx_gcu_batch {
|
||||
};
|
||||
|
||||
struct pxa3xx_gcu_priv {
|
||||
struct device *dev;
|
||||
void __iomem *mmio_base;
|
||||
struct clk *clk;
|
||||
struct pxa3xx_gcu_shared *shared;
|
||||
@ -493,7 +494,7 @@ pxa3xx_gcu_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
if (size != SHARED_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
return dma_mmap_coherent(NULL, vma,
|
||||
return dma_mmap_coherent(priv->dev, vma,
|
||||
priv->shared, priv->shared_phys, size);
|
||||
|
||||
case SHARED_SIZE >> PAGE_SHIFT:
|
||||
@ -670,6 +671,7 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
priv->resource_mem = r;
|
||||
priv->dev = dev;
|
||||
pxa3xx_gcu_reset(priv);
|
||||
pxa3xx_gcu_init_debug_timer(priv);
|
||||
|
||||
|
@ -267,9 +267,9 @@ size_t dma_direct_max_mapping_size(struct device *dev);
|
||||
|
||||
static inline const struct dma_map_ops *get_dma_ops(struct device *dev)
|
||||
{
|
||||
if (dev && dev->dma_ops)
|
||||
if (dev->dma_ops)
|
||||
return dev->dma_ops;
|
||||
return get_arch_dma_ops(dev ? dev->bus : NULL);
|
||||
return get_arch_dma_ops(dev->bus);
|
||||
}
|
||||
|
||||
static inline void set_dma_ops(struct device *dev,
|
||||
@ -650,7 +650,7 @@ static inline void dma_free_coherent(struct device *dev, size_t size,
|
||||
|
||||
static inline u64 dma_get_mask(struct device *dev)
|
||||
{
|
||||
if (dev && dev->dma_mask && *dev->dma_mask)
|
||||
if (dev->dma_mask && *dev->dma_mask)
|
||||
return *dev->dma_mask;
|
||||
return DMA_BIT_MASK(32);
|
||||
}
|
||||
|
@ -72,6 +72,12 @@ static inline void arch_sync_dma_for_cpu_all(struct device *dev)
|
||||
}
|
||||
#endif /* CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL */
|
||||
|
||||
#ifdef CONFIG_ARCH_HAS_DMA_PREP_COHERENT
|
||||
void arch_dma_prep_coherent(struct page *page, size_t size);
|
||||
#else
|
||||
static inline void arch_dma_prep_coherent(struct page *page, size_t size)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_ARCH_HAS_DMA_PREP_COHERENT */
|
||||
|
||||
#endif /* _LINUX_DMA_NONCOHERENT_H */
|
||||
|
@ -38,6 +38,9 @@ config ARCH_HAS_SYNC_DMA_FOR_CPU
|
||||
config ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
|
||||
bool
|
||||
|
||||
config ARCH_HAS_DMA_PREP_COHERENT
|
||||
bool
|
||||
|
||||
config ARCH_HAS_DMA_COHERENT_TO_PFN
|
||||
bool
|
||||
|
||||
@ -57,6 +60,7 @@ config SWIOTLB
|
||||
|
||||
config DMA_REMAP
|
||||
depends on MMU
|
||||
select GENERIC_ALLOCATOR
|
||||
bool
|
||||
|
||||
config DMA_DIRECT_REMAP
|
||||
|
@ -311,7 +311,7 @@ static inline bool dma_direct_possible(struct device *dev, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
return swiotlb_force != SWIOTLB_FORCE &&
|
||||
(!dev || dma_capable(dev, dma_addr, size));
|
||||
dma_capable(dev, dma_addr, size);
|
||||
}
|
||||
|
||||
dma_addr_t dma_direct_map_page(struct device *dev, struct page *page,
|
||||
|
@ -238,17 +238,13 @@ u64 dma_get_required_mask(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_get_required_mask);
|
||||
|
||||
#ifndef arch_dma_alloc_attrs
|
||||
#define arch_dma_alloc_attrs(dev) (true)
|
||||
#endif
|
||||
|
||||
void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||
gfp_t flag, unsigned long attrs)
|
||||
{
|
||||
const struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
void *cpu_addr;
|
||||
|
||||
WARN_ON_ONCE(dev && !dev->coherent_dma_mask);
|
||||
WARN_ON_ONCE(!dev->coherent_dma_mask);
|
||||
|
||||
if (dma_alloc_from_dev_coherent(dev, size, dma_handle, &cpu_addr))
|
||||
return cpu_addr;
|
||||
@ -256,9 +252,6 @@ void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||
/* let the implementation decide on the zone to allocate from: */
|
||||
flag &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
|
||||
|
||||
if (!arch_dma_alloc_attrs(&dev))
|
||||
return NULL;
|
||||
|
||||
if (dma_is_direct(ops))
|
||||
cpu_addr = dma_direct_alloc(dev, size, dma_handle, flag, attrs);
|
||||
else if (ops->alloc)
|
||||
|
Loading…
Reference in New Issue
Block a user