This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 437306409e8a553ad82a08e6e8cafa382ee77c15
Author: Jukka Laitinen <[email protected]>
AuthorDate: Thu Oct 1 09:23:51 2026 +0300

    arch/arm/imxrt: Add support for ARMV8M_DCACHE_LINESIZE in imxrt_usbdev.c
    
    Select the cache line size from either ARMV7M_DCACHE_LINESIZE or
    ARMV8M_DCACHE_LINESIZE, so the driver can also be used with D-cache
    enabled on the i.MX RT1180 Cortex-M33.
    
    Also fix the imxrt1180-evk USB DMA allocator alignment. Pad the header
    to the 32-byte DMA alignment, so that the buffer remains aligned.
    
    Signed-off-by: Jukka Laitinen <[email protected]>
---
 arch/arm/src/imxrt/imxrt_usbdev.c                    | 16 +++++++++++-----
 boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c |  6 ++++--
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/arch/arm/src/imxrt/imxrt_usbdev.c 
b/arch/arm/src/imxrt/imxrt_usbdev.c
index 8036239077c..ee5148ae3bd 100644
--- a/arch/arm/src/imxrt/imxrt_usbdev.c
+++ b/arch/arm/src/imxrt/imxrt_usbdev.c
@@ -207,12 +207,18 @@ const struct trace_msg_t g_usb_trace_strings_intdecode[] =
 #endif
 
 #if defined(CONFIG_ARMV7M_DCACHE)
+#  define USB_DCACHE_LINESIZE ARMV7M_DCACHE_LINESIZE
+#elif defined(CONFIG_ARMV8M_DCACHE)
+#  define USB_DCACHE_LINESIZE ARMV8M_DCACHE_LINESIZE
+#endif
+
+#if defined(CONFIG_ARMV7M_DCACHE) || defined(CONFIG_ARMV8M_DCACHE)
 #  define cache_aligned_alloc(s) \
-     kmm_memalign(ARMV7M_DCACHE_LINESIZE, \
-                  (((s) + ARMV7M_DCACHE_LINESIZE - 1) & \
-                   ~(ARMV7M_DCACHE_LINESIZE - 1)))
-#  define CACHE_ALIGNED_DATA     aligned_data(ARMV7M_DCACHE_LINESIZE)
-#  define DCACHE_LINEMASK        (ARMV7M_DCACHE_LINESIZE - 1)
+     kmm_memalign(USB_DCACHE_LINESIZE, \
+                  (((s) + USB_DCACHE_LINESIZE - 1) & \
+                   ~(USB_DCACHE_LINESIZE - 1)))
+#  define CACHE_ALIGNED_DATA     aligned_data(USB_DCACHE_LINESIZE)
+#  define DCACHE_LINEMASK        (USB_DCACHE_LINESIZE - 1)
 #  define DCACHE_ALIGN_UP(a)     (((a) + DCACHE_LINEMASK) & ~DCACHE_LINEMASK)
 #  define IS_CACHE_ALIGNED(x,y) \
      (((uintptr_t)(x) & DCACHE_LINEMASK) == 0 && \
diff --git a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c 
b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c
index 0b6218201f3..63f6a0e2ec5 100644
--- a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c
+++ b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c
@@ -61,6 +61,7 @@
  * overhead and other endpoints.
  */
 
+#define IMXRT_DMA_ALIGNMENT   32
 #define IMXRT_DMA_POOL_SIZE   (6 * 1024)
 
 /****************************************************************************
@@ -105,14 +106,15 @@ int imxrt_dma_alloc_init(void)
  *
  *   gran_free() needs to know the size of the allocation being freed, but
  *   usbdev_dma_free() is not given a size (see include/nuttx/usb/usbdev.h).
- *   We work around this by prepending a small header that records the
- *   total granule allocation size.
+ *   Reserve one alignment unit before the returned buffer and record the
+ *   total allocation size there.  This keeps the buffer cache-line aligned.
  *
  ****************************************************************************/
 
 struct usbdma_header_s
 {
   size_t allocsize;
+  uint8_t padding[IMXRT_DMA_ALIGNMENT - sizeof(size_t)];
 };
 
 void *usbdev_dma_alloc(size_t size)

Reply via email to