Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2436bdcd authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

dma-coherent: remove the DMA_MEMORY_MAP and DMA_MEMORY_IO flags



DMA_MEMORY_IO was never used in the tree, so remove it.  That means there is
no need for the DMA_MEMORY_MAP flag either now, so remove it as well and
change dma_declare_coherent_memory to return a normal errno value.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
 Reviewed-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
parent b32dbc1e
Loading
Loading
Loading
Loading
+1 −20
Original line number Diff line number Diff line
@@ -592,30 +592,11 @@ size is the size of the area (must be multiples of PAGE_SIZE).

flags can be ORed together and are:

- DMA_MEMORY_MAP - request that the memory returned from
  dma_alloc_coherent() be directly writable.

- DMA_MEMORY_IO - request that the memory returned from
  dma_alloc_coherent() be addressable using read()/write()/memcpy_toio() etc.

One or both of these flags must be present.

- DMA_MEMORY_EXCLUSIVE - only allocate memory from the declared regions.
  Do not allow dma_alloc_coherent() to fall back to system memory when
  it's out of memory in the declared region.

The return value will be either DMA_MEMORY_MAP or DMA_MEMORY_IO and
must correspond to a passed in flag (i.e. no returning DMA_MEMORY_IO
if only DMA_MEMORY_MAP were passed in) for success or zero for
failure.

Note, for DMA_MEMORY_IO returns, all subsequent memory returned by
dma_alloc_coherent() may no longer be accessed directly, but instead
must be accessed using the correct bus functions.  If your driver
isn't prepared to handle this contingency, it should not specify
DMA_MEMORY_IO in the input flags.

As a simplification for the platforms, only **one** such region of
As a simplification for the platforms, only *one* such region of
memory may be declared per device.

For reasons of efficiency, most platforms choose to track the declared
+17 −27
Original line number Diff line number Diff line
@@ -245,7 +245,6 @@ static phys_addr_t mx2_camera_base __initdata;
static void __init visstrim_analog_camera_init(void)
{
	struct platform_device *pdev;
	int dma;

	gpio_set_value(TVP5150_PWDN, 1);
	ndelay(1);
@@ -258,12 +257,9 @@ static void __init visstrim_analog_camera_init(void)
	if (IS_ERR(pdev))
		return;

	dma = dma_declare_coherent_memory(&pdev->dev,
				mx2_camera_base, mx2_camera_base,
				MX2_CAMERA_BUF_SIZE,
				DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
	if (!(dma & DMA_MEMORY_MAP))
		return;
	dma_declare_coherent_memory(&pdev->dev, mx2_camera_base,
				    mx2_camera_base, MX2_CAMERA_BUF_SIZE,
				    DMA_MEMORY_EXCLUSIVE);
}

static void __init visstrim_reserve(void)
@@ -444,16 +440,13 @@ static const struct imx_ssi_platform_data visstrim_m10_ssi_pdata __initconst = {
static void __init visstrim_coda_init(void)
{
	struct platform_device *pdev;
	int dma;

	pdev = imx27_add_coda();
	dma = dma_declare_coherent_memory(&pdev->dev,
	dma_declare_coherent_memory(&pdev->dev,
				    mx2_camera_base + MX2_CAMERA_BUF_SIZE,
				    mx2_camera_base + MX2_CAMERA_BUF_SIZE,
				    MX2_CAMERA_BUF_SIZE,
					  DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
	if (!(dma & DMA_MEMORY_MAP))
		return;
				    DMA_MEMORY_EXCLUSIVE);
}

/* DMA deinterlace */
@@ -466,24 +459,21 @@ static void __init visstrim_deinterlace_init(void)
{
	int ret = -ENOMEM;
	struct platform_device *pdev = &visstrim_deinterlace;
	int dma;

	ret = platform_device_register(pdev);

	dma = dma_declare_coherent_memory(&pdev->dev,
	dma_declare_coherent_memory(&pdev->dev,
				    mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
				    mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
				    MX2_CAMERA_BUF_SIZE,
					  DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
	if (!(dma & DMA_MEMORY_MAP))
		return;
				    DMA_MEMORY_EXCLUSIVE);
}

/* Emma-PrP for format conversion */
static void __init visstrim_emmaprp_init(void)
{
	struct platform_device *pdev;
	int dma;
	int ret;

	pdev = imx27_add_mx2_emmaprp();
	if (IS_ERR(pdev))
@@ -493,11 +483,11 @@ static void __init visstrim_emmaprp_init(void)
	 * Use the same memory area as the analog camera since both
	 * devices are, by nature, exclusive.
	 */
	dma = dma_declare_coherent_memory(&pdev->dev,
	ret = dma_declare_coherent_memory(&pdev->dev,
				mx2_camera_base, mx2_camera_base,
				MX2_CAMERA_BUF_SIZE,
				DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
	if (!(dma & DMA_MEMORY_MAP))
				DMA_MEMORY_EXCLUSIVE);
	if (ret)
		pr_err("Failed to declare memory for emmaprp\n");
}

+6 −6
Original line number Diff line number Diff line
@@ -475,7 +475,7 @@ static phys_addr_t mx3_camera_base __initdata;

static int __init mx31moboard_init_cam(void)
{
	int dma, ret = -ENOMEM;
	int dma, ret;
	struct platform_device *pdev;

	imx31_add_ipu_core();
@@ -484,11 +484,11 @@ static int __init mx31moboard_init_cam(void)
	if (IS_ERR(pdev))
		return PTR_ERR(pdev);

	dma = dma_declare_coherent_memory(&pdev->dev,
	ret = dma_declare_coherent_memory(&pdev->dev,
					  mx3_camera_base, mx3_camera_base,
					  MX3_CAMERA_BUF_SIZE,
					DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
	if (!(dma & DMA_MEMORY_MAP))
					  DMA_MEMORY_EXCLUSIVE);
	if (ret)
		goto err;

	ret = platform_device_add(pdev);
+1 −2
Original line number Diff line number Diff line
@@ -63,11 +63,10 @@ static void gapspci_fixup_resources(struct pci_dev *dev)
		res.end = GAPSPCI_DMA_BASE + GAPSPCI_DMA_SIZE - 1;
		res.flags = IORESOURCE_MEM;
		pcibios_resource_to_bus(dev->bus, &region, &res);
		BUG_ON(!dma_declare_coherent_memory(&dev->dev,
		BUG_ON(dma_declare_coherent_memory(&dev->dev,
						res.start,
						region.start,
						resource_size(&res),
						DMA_MEMORY_MAP |
						DMA_MEMORY_EXCLUSIVE));
		break;
	default:
+14 −32
Original line number Diff line number Diff line
@@ -46,15 +46,10 @@ static bool dma_init_coherent_memory(
	int pages = size >> PAGE_SHIFT;
	int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);

	if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
		goto out;
	if (!size)
		goto out;

	if (flags & DMA_MEMORY_MAP)
	mem_base = memremap(phys_addr, size, MEMREMAP_WC);
	else
		mem_base = ioremap(phys_addr, size);
	if (!mem_base)
		goto out;

@@ -77,12 +72,8 @@ static bool dma_init_coherent_memory(

out:
	kfree(dma_mem);
	if (mem_base) {
		if (flags & DMA_MEMORY_MAP)
	if (mem_base)
		memunmap(mem_base);
		else
			iounmap(mem_base);
	}
	return false;
}

@@ -91,10 +82,7 @@ static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
	if (!mem)
		return;

	if (mem->flags & DMA_MEMORY_MAP)
	memunmap(mem->virt_base);
	else
		iounmap(mem->virt_base);
	kfree(mem->bitmap);
	kfree(mem);
}
@@ -116,16 +104,16 @@ int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
				dma_addr_t device_addr, size_t size, int flags)
{
	struct dma_coherent_mem *mem;
	int ret;

	if (!dma_init_coherent_memory(phys_addr, device_addr, size, flags,
				      &mem))
		return 0;

	if (dma_assign_coherent_memory(dev, mem) == 0)
		return flags & DMA_MEMORY_MAP ? DMA_MEMORY_MAP : DMA_MEMORY_IO;
	ret = dma_init_coherent_memory(phys_addr, device_addr, size, flags, &mem);
	if (ret)
		return ret;

	ret = dma_assign_coherent_memory(dev, mem);
	if (ret)
		dma_release_coherent_memory(mem);
	return 0;
	return ret;
}
EXPORT_SYMBOL(dma_declare_coherent_memory);

@@ -186,15 +174,9 @@ static void *__dma_alloc_from_coherent(struct dma_coherent_mem *mem,
	 */
	*dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
	ret = mem->virt_base + (pageno << PAGE_SHIFT);
	dma_memory_map = (mem->flags & DMA_MEMORY_MAP);
	spin_unlock_irqrestore(&mem->spinlock, flags);
	if (dma_memory_map)
	memset(ret, 0, size);
	else
		memset_io(ret, 0, size);

	return ret;

err:
	spin_unlock_irqrestore(&mem->spinlock, flags);
	return NULL;
@@ -360,7 +342,7 @@ static int rmem_dma_device_init(struct reserved_mem *rmem, struct device *dev)

	if (!mem &&
	    !dma_init_coherent_memory(rmem->base, rmem->base, rmem->size,
				      DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE,
				      DMA_MEMORY_EXCLUSIVE,
				      &mem)) {
		pr_err("Reserved memory: failed to init DMA memory pool at %pa, size %ld MiB\n",
			&rmem->base, (unsigned long)rmem->size / SZ_1M);
Loading