From: Marin Mitov <mitov@issp.bas.bg>
To: linux-kernel@vger.kernel.org
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>,
FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Subject: [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API
Date: Thu, 19 Aug 2010 18:18:35 +0300 [thread overview]
Message-ID: <201008191818.36068.mitov@issp.bas.bg> (raw)
Hi all,
struct device contains a member: struct dma_coherent_mem *dma_mem;
to hold information for a piece of memory declared dma-coherent.
Alternatively the same member could also be used to hold preallocated
dma-coherent memory for latter per-device use.
This tric is already used in drivers/staging/dt3155v4l.c
dt3155_alloc_coherent()/dt3155_free_coherent()
Here proposed for general use by popular demand from video4linux folks.
Helps for videobuf-dma-contig framework.
Signed-off-by: Marin Mitov <mitov@issp.bas.bg>
======================================================================
--- a/drivers/base/dma-coherent.c 2010-08-19 15:50:42.000000000 +0300
+++ b/drivers/base/dma-coherent.c 2010-08-19 17:27:56.000000000 +0300
@@ -93,6 +93,83 @@ void *dma_mark_declared_memory_occupied(
EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
/**
+ * dma_reserve_coherent_memory() - reserve coherent memory for per-device use
+ *
+ * @dev: device from which we allocate memory
+ * @size: size of requested memory area in bytes
+ * @flags: same as in dma_declare_coherent_memory()
+ *
+ * This function reserves coherent memory allocating it early (during probe())
+ * to support latter allocations from per-device coherent memory pools.
+ * For a given device one could use either dma_declare_coherent_memory() or
+ * dma_reserve_coherent_memory(), but not both, becase the result of these
+ * functions is stored in a single struct device member - dma_mem
+ *
+ * Returns DMA_MEMORY_MAP on success, or 0 if failed.
+ * (same as dma_declare_coherent_memory()
+ */
+int dma_reserve_coherent_memory(struct device *dev, size_t size, int flags)
+{
+ struct dma_coherent_mem *mem;
+ dma_addr_t dev_base;
+ int pages = size >> PAGE_SHIFT;
+ int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);
+
+ if ((flags & DMA_MEMORY_MAP) == 0)
+ goto out;
+ if (!size)
+ goto out;
+ if (dev->dma_mem)
+ goto out;
+
+ mem = kzalloc(sizeof(*mem), GFP_KERNEL);
+ if (!mem)
+ goto out;
+ mem->virt_base = dma_alloc_coherent(dev, size, &dev_base,
+ DT3155_COH_FLAGS);
+ if (!mem->virt_base)
+ goto err_alloc_coherent;
+ mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
+ if (!mem->bitmap)
+ goto err_bitmap;
+
+ mem->device_base = dev_base;
+ mem->size = pages;
+ mem->flags = flags;
+ dev->dma_mem = mem;
+ return DMA_MEMORY_MAP;
+
+err_bitmap:
+ dma_free_coherent(dev, size, mem->virt_base, dev_base);
+err_alloc_coherent:
+ kfree(mem);
+out:
+ return 0;
+}
+EXPORT_SYMBOL(dma_reserve_coherent_memory);
+
+/**
+ * dma_free_reserved_memory() - free the reserved dma-coherent memoty
+ *
+ * @dev: device for which we free the dma-coherent memory
+ *
+ * same as dma_release_declared_memory()
+ */
+void dma_free_reserved_memory(struct device *dev)
+{
+ struct dma_coherent_mem *mem = dev->dma_mem;
+
+ if (!mem)
+ return;
+ dev->dma_mem = NULL;
+ dma_free_coherent(dev, mem->size << PAGE_SHIFT,
+ mem->virt_base, mem->device_base);
+ kfree(mem->bitmap);
+ kfree(mem);
+}
+EXPORT_SYMBOL(dma_free_reserved_memory);
+
+/**
* dma_alloc_from_coherent() - try to allocate memory from the per-device coherent area
*
* @dev: device from which we allocate memory
next reply other threads:[~2010-08-19 15:20 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-19 15:18 Marin Mitov [this message]
2010-08-20 7:17 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-20 8:13 ` Marin Mitov
2010-08-20 8:35 ` FUJITA Tomonori
2010-08-20 11:50 ` Marin Mitov
2010-08-26 5:40 ` FUJITA Tomonori
2010-08-26 6:04 ` Marin Mitov
2010-08-26 6:24 ` FUJITA Tomonori
2010-08-26 7:01 ` Marin Mitov
2010-08-26 9:43 ` FUJITA Tomonori
2010-08-26 10:14 ` Marin Mitov
2010-08-26 9:06 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() Guennadi Liakhovetski
2010-08-26 9:06 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Guennadi Liakhovetski
2010-08-26 9:06 ` Guennadi Liakhovetski
2010-08-26 9:17 ` [RFC][PATCH] add
2010-08-26 9:17 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Uwe Kleine-König
2010-08-26 9:17 ` Uwe Kleine-König
2010-08-26 10:18 ` Marin Mitov
2010-08-26 10:18 ` Marin Mitov
2010-08-26 10:18 ` Marin Mitov
2010-08-26 9:30 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-26 9:30 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-26 9:30 ` FUJITA Tomonori
2010-08-26 9:45 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() Guennadi Liakhovetski
2010-08-26 9:45 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Guennadi Liakhovetski
2010-08-26 9:45 ` Guennadi Liakhovetski
2010-08-26 9:51 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-26 9:51 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-26 9:51 ` FUJITA Tomonori
2010-08-26 17:49 ` [RFC][PATCH] add Russell King - ARM Linux
2010-08-26 17:49 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Russell King - ARM Linux
2010-08-26 17:49 ` Russell King - ARM Linux
2010-08-26 18:32 ` Marin Mitov
2010-08-26 18:32 ` Marin Mitov
2010-08-26 18:32 ` Marin Mitov
2010-08-26 9:53 ` [RFC][PATCH] add
2010-08-26 9:53 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Uwe Kleine-König
2010-08-26 9:53 ` Uwe Kleine-König
2010-08-26 10:00 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-26 10:00 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-26 10:00 ` FUJITA Tomonori
2010-08-26 17:54 ` [RFC][PATCH] add Russell King - ARM Linux
2010-08-26 17:54 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Russell King - ARM Linux
2010-08-26 17:54 ` Russell King - ARM Linux
2010-08-27 0:26 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-27 0:26 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-27 0:26 ` FUJITA Tomonori
2010-08-27 4:41 ` [RFC][PATCH] add
2010-08-27 4:41 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Uwe Kleine-König
2010-08-27 4:41 ` Uwe Kleine-König
2010-08-27 5:00 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-27 5:00 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-27 5:00 ` FUJITA Tomonori
2010-08-27 5:19 ` [RFC][PATCH] add
2010-08-27 5:19 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Uwe Kleine-König
2010-08-27 5:19 ` Uwe Kleine-König
2010-08-27 5:57 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-27 5:57 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-27 5:57 ` FUJITA Tomonori
2010-08-27 6:13 ` [RFC][PATCH] add
2010-08-27 6:13 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Uwe Kleine-König
2010-08-27 6:13 ` Uwe Kleine-König
2010-08-27 6:23 ` Marin Mitov
2010-08-27 6:23 ` Marin Mitov
2010-08-27 6:23 ` Marin Mitov
2010-08-27 6:32 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-27 6:32 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-27 6:32 ` FUJITA Tomonori
2010-08-27 6:38 ` [RFC][PATCH] add
2010-08-27 6:38 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Uwe Kleine-König
2010-08-27 6:38 ` Uwe Kleine-König
2010-08-27 7:02 ` Marin Mitov
2010-08-27 7:02 ` Marin Mitov
2010-08-27 7:02 ` Marin Mitov
2010-08-28 6:14 ` Marin Mitov
2010-08-28 6:14 ` Marin Mitov
2010-08-28 6:14 ` Marin Mitov
2010-08-28 7:10 ` [RFC][PATCH] add FUJITA Tomonori
2010-08-28 7:10 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API FUJITA Tomonori
2010-08-28 7:10 ` FUJITA Tomonori
2010-08-28 7:19 ` Marin Mitov
2010-08-28 7:19 ` Marin Mitov
2010-08-28 7:19 ` Marin Mitov
2010-10-10 14:08 ` FUJITA Tomonori
2010-10-10 14:36 ` Marin Mitov
2010-10-10 18:21 ` Guennadi Liakhovetski
2010-10-10 18:48 ` Marin Mitov
2010-10-13 8:04 ` KAMEZAWA Hiroyuki
2010-10-13 16:42 ` Marin Mitov
2010-10-14 7:16 ` FUJITA Tomonori
2010-08-20 20:05 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() Guennadi Liakhovetski
2010-08-20 20:05 ` [RFC][PATCH] add dma_reserve_coherent_memory()/dma_free_reserved_memory() API Guennadi Liakhovetski
2010-08-20 20:05 ` Guennadi Liakhovetski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201008191818.36068.mitov@issp.bas.bg \
--to=mitov@issp.bas.bg \
--cc=fujita.tomonori@lab.ntt.co.jp \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.