From: Anton Staaf <robotboy@chromium.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 1/6] cache: add ALLOC_CACHE_ALIGN_BUFFER macro
Date: Wed, 12 Oct 2011 16:55:59 -0700 [thread overview]
Message-ID: <1318463764-28244-2-git-send-email-robotboy@chromium.org> (raw)
In-Reply-To: <1318463764-28244-1-git-send-email-robotboy@chromium.org>
This macro is used to allocate cache line size aligned stack
buffers for use with DMA hardware.
Signed-off-by: Anton Staaf <robotboy@chromium.org>
Cc: Lukasz Majewski <l.majewski@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Aneesh V <aneesh@ti.com>
Cc: Albert ARIBAUD <albert.u.boot@aribaud.net>
Cc: Wolfgang Denk <wd@denx.de>
---
doc/README.arm-caches | 2 +
include/common.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/doc/README.arm-caches b/doc/README.arm-caches
index cd2b458..f6a52e3 100644
--- a/doc/README.arm-caches
+++ b/doc/README.arm-caches
@@ -40,6 +40,8 @@ Buffer Requirements:
- If the buffer is not cache-line aligned invalidation will be restricted
to the aligned part. That is, one cache-line at the respective boundary
may be left out while doing invalidation.
+- A suitable buffer can be alloced on the stack using the
+ ALLOC_CACHE_ALIGN_BUFFER macro.
Cleanup Before Linux:
- cleanup_before_linux() should flush the D-cache, invalidate I-cache, and
diff --git a/include/common.h b/include/common.h
index 74e41d4..038d34d 100644
--- a/include/common.h
+++ b/include/common.h
@@ -822,6 +822,64 @@ int cpu_release(int nr, int argc, char * const argv[]);
#include <asm/cache.h>
#endif
+/*
+ * The ALLOC_CACHE_ALIGN_BUFFER macro is used to allocate a buffer on the
+ * stack that meets the minimum architecture alignment requirements for DMA.
+ * Such a buffer is useful for DMA operations where flushing and invalidating
+ * the cache before and after a read and/or write operation is required for
+ * correct operations.
+ *
+ * When called the macro creates an array on the stack that is sized such
+ * that:
+ *
+ * 1) The beginning of the array can be advanced enough to be aligned.
+ *
+ * 2) The size of the aligned portion of the array is a multiple of the minimum
+ * architecture alignment required for DMA.
+ *
+ * 3) The aligned portion contains enough space for the original number of
+ * elements requested.
+ *
+ * The macro then creates a pointer to the aligned portion of this array and
+ * assigns to the pointer the address of the first element in the aligned
+ * portion of the array.
+ *
+ * Calling the macro as:
+ *
+ * ALLOC_CACHE_ALIGN_BUFFER(uint32_t, buffer, 1024);
+ *
+ * Will result in something similar to saying:
+ *
+ * uint32_t buffer[1024];
+ *
+ * The following differences exist:
+ *
+ * 1) The resulting buffer is guaranteed to be aligned to the value of
+ * ARCH_DMA_MINALIGN.
+ *
+ * 2) The buffer variable created by the macro is a pointer to the specified
+ * type, and NOT an array of the specified type. This can be very important
+ * if you want the address of the buffer, which you probably do, to pass it
+ * to the DMA hardware. The value of &buffer is different in the two cases.
+ * In the macro case it will be the address of the pointer, not the address
+ * of the space reserved for the buffer. However, in the second case it
+ * would be the address of the buffer. So if you are replacing hard coded
+ * stack buffers with this macro you need to make sure you remove the & from
+ * the locations where you are taking the address of the buffer.
+ *
+ * Note that the size parameter is the number of array elements to allocate,
+ * not the number of bytes.
+ *
+ * This macro can not be used outside of function scope, or for the creation
+ * of a function scoped static buffer. It can not be used to create a cache
+ * line aligned global buffer.
+ */
+#define ALLOC_CACHE_ALIGN_BUFFER(type, name, size) \
+ char __##name[ROUND(size * sizeof(type), ARCH_DMA_MINALIGN) + \
+ ARCH_DMA_MINALIGN - 1]; \
+ \
+ type *name = (type *) ALIGN((uintptr_t)__##name, ARCH_DMA_MINALIGN)
+
/* Pull in stuff for the build system */
#ifdef DO_DEPS_ONLY
# include <environment.h>
--
1.7.3.1
next prev parent reply other threads:[~2011-10-12 23:55 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-12 23:55 [U-Boot] [PATCH v3 0/6] Add cache line alignment support Anton Staaf
2011-10-12 23:55 ` Anton Staaf [this message]
2011-10-13 0:55 ` [U-Boot] [PATCH v3 1/6] cache: add ALLOC_CACHE_ALIGN_BUFFER macro Mike Frysinger
2011-10-13 18:06 ` Anton Staaf
2011-10-13 18:15 ` Mike Frysinger
2011-10-13 18:20 ` Anton Staaf
2011-10-25 7:23 ` Wolfgang Denk
2011-10-12 23:56 ` [U-Boot] [PATCH v3 2/6] tegra: define CONFIG_SYS_CACHELINE_SIZE for tegra Anton Staaf
2011-10-25 7:23 ` Wolfgang Denk
2011-10-12 23:56 ` [U-Boot] [PATCH v3 3/6] mmc: dcache: allocate cache aligned buffer for scr and switch_status Anton Staaf
2011-10-13 0:55 ` Mike Frysinger
2011-10-25 7:25 ` Wolfgang Denk
2011-10-12 23:56 ` [U-Boot] [PATCH v3 4/6] ext2: Cache line aligned partial sector bounce buffer Anton Staaf
2011-10-25 7:25 ` Wolfgang Denk
2011-10-12 23:56 ` [U-Boot] [PATCH v3 5/6] mmc: dcache: allocate cache aligned buffers for ext_csd Anton Staaf
2011-10-13 0:56 ` Mike Frysinger
2011-10-25 7:26 ` Wolfgang Denk
2011-10-12 23:56 ` [U-Boot] [PATCH v3 6/6] part_efi: dcache: allocate cacheline aligned buffers Anton Staaf
2011-10-13 0:56 ` Mike Frysinger
2011-10-25 7:26 ` Wolfgang Denk
2011-10-24 22:08 ` [U-Boot] [PATCH v3 0/6] Add cache line alignment support Anton Staaf
2011-10-25 7:27 ` Wolfgang Denk
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=1318463764-28244-2-git-send-email-robotboy@chromium.org \
--to=robotboy@chromium.org \
--cc=u-boot@lists.denx.de \
/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.