]> git.karo-electronics.de Git - karo-tx-redboot.git/blobdiff - packages/hal/arm/arm9/var/v2_0/include/hal_cache.h
TX51 pre-release
[karo-tx-redboot.git] / packages / hal / arm / arm9 / var / v2_0 / include / hal_cache.h
index f5cd7381f3f056b27926400cd404f1621c938747..7d0a34dafc0ff8e349be75323cc5a24d59f94c78 100644 (file)
@@ -54,7 +54,7 @@
 // Usage:
 //              #include <cyg/hal/hal_cache.h>
 //              ...
-//              
+//
 //
 //####DESCRIPTIONEND####
 //
 // Cache dimensions
 
 #if defined(CYGPKG_HAL_ARM_ARM9_ARM920T)
-# define HAL_ICACHE_SIZE                 0x4000
-# define HAL_ICACHE_LINE_SIZE            32
-# define HAL_ICACHE_WAYS                 64
+# define HAL_ICACHE_SIZE                                0x4000
+# define HAL_ICACHE_LINE_SIZE                   32
+# define HAL_ICACHE_WAYS                                64
 # define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
-# define HAL_DCACHE_SIZE                 0x4000
-# define HAL_DCACHE_LINE_SIZE            32
-# define HAL_DCACHE_WAYS                 64
+# define HAL_DCACHE_SIZE                                0x4000
+# define HAL_DCACHE_LINE_SIZE                   32
+# define HAL_DCACHE_WAYS                                64
 # define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
 
-# define HAL_WRITE_BUFFER                64
+# define HAL_WRITE_BUFFER                               64
 
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_STEP  0x20
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_LIMIT 0x100
 
 #elif defined(CYGPKG_HAL_ARM_ARM9_ARM922T)
-# define HAL_ICACHE_SIZE                 0x2000
-# define HAL_ICACHE_LINE_SIZE            32
-# define HAL_ICACHE_WAYS                 64
+# define HAL_ICACHE_SIZE                                0x2000
+# define HAL_ICACHE_LINE_SIZE                   32
+# define HAL_ICACHE_WAYS                                64
 # define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
-# define HAL_DCACHE_SIZE                 0x2000
-# define HAL_DCACHE_LINE_SIZE            32
-# define HAL_DCACHE_WAYS                 64
+# define HAL_DCACHE_SIZE                                0x2000
+# define HAL_DCACHE_LINE_SIZE                   32
+# define HAL_DCACHE_WAYS                                64
 # define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
 
-# define HAL_WRITE_BUFFER                64
+# define HAL_WRITE_BUFFER                               64
 
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_STEP  0x20
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_LIMIT 0x80
 
 #elif defined(CYGPKG_HAL_ARM_ARM9_ARM925T)
-# define HAL_ICACHE_SIZE                 0x4000
-# define HAL_ICACHE_LINE_SIZE            16
-# define HAL_ICACHE_WAYS                 2
+# define HAL_ICACHE_SIZE                                0x4000
+# define HAL_ICACHE_LINE_SIZE                   16
+# define HAL_ICACHE_WAYS                                2
 # define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
-# define HAL_DCACHE_SIZE                 0x2000
-# define HAL_DCACHE_LINE_SIZE            16
-# define HAL_DCACHE_WAYS                 2
+# define HAL_DCACHE_SIZE                                0x2000
+# define HAL_DCACHE_LINE_SIZE                   16
+# define HAL_DCACHE_WAYS                                2
 # define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
 
-# define HAL_WRITE_BUFFER                64
+# define HAL_WRITE_BUFFER                               64
 // must flush everything manually
-# define CYGHWR_HAL_ARM_ARM9_ALT_CLEAN_DCACHE 
+# define CYGHWR_HAL_ARM_ARM9_ALT_CLEAN_DCACHE
 
 #elif defined(CYGPKG_HAL_ARM_ARM9_ARM926EJ)
-# define HAL_ICACHE_SIZE                 0x4000
-# define HAL_ICACHE_LINE_SIZE            32
-# define HAL_ICACHE_WAYS                 4
+# define HAL_ICACHE_SIZE                                0x4000
+# define HAL_ICACHE_LINE_SIZE                   32
+# define HAL_ICACHE_WAYS                                4
 # define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
-# define HAL_DCACHE_SIZE                 0x2000
-# define HAL_DCACHE_LINE_SIZE            32
-# define HAL_DCACHE_WAYS                 4
+# define HAL_DCACHE_SIZE                                0x2000
+# define HAL_DCACHE_LINE_SIZE                   32
+# define HAL_DCACHE_WAYS                                4
 # define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
 
-# define HAL_WRITE_BUFFER                64
+# define HAL_WRITE_BUFFER                               64
 
 #define CYGHWR_HAL_ARM_ARM926EJ_CLEAN_DCACHE //has instruction to clean D-cache
 
 #elif defined(CYGPKG_HAL_ARM_ARM9_ARM940T)
-# define HAL_ICACHE_SIZE                 0x1000
-# define HAL_ICACHE_LINE_SIZE            16
-# define HAL_ICACHE_WAYS                 4
+# define HAL_ICACHE_SIZE                                0x1000
+# define HAL_ICACHE_LINE_SIZE                   16
+# define HAL_ICACHE_WAYS                                4
 # define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
-# define HAL_DCACHE_SIZE                 0x1000
-# define HAL_DCACHE_LINE_SIZE            16
-# define HAL_DCACHE_WAYS                 4
+# define HAL_DCACHE_SIZE                                0x1000
+# define HAL_DCACHE_LINE_SIZE                   16
+# define HAL_DCACHE_WAYS                                4
 # define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
 
-# define HAL_WRITE_BUFFER                32
+# define HAL_WRITE_BUFFER                               32
 
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_STEP  0x10
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_LIMIT 0x40
 
 #elif defined(CYGPKG_HAL_ARM_ARM9_ARM966E)
-# define HAL_ICACHE_SIZE                 0
-# define HAL_ICACHE_LINE_SIZE            0
-# define HAL_ICACHE_WAYS                 0
+# define HAL_ICACHE_SIZE                                0
+# define HAL_ICACHE_LINE_SIZE                   0
+# define HAL_ICACHE_WAYS                                0
 # define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
-# define HAL_DCACHE_SIZE                 0
-# define HAL_DCACHE_LINE_SIZE            0
-# define HAL_DCACHE_WAYS                 0
+# define HAL_DCACHE_SIZE                                0
+# define HAL_DCACHE_LINE_SIZE                   0
+# define HAL_DCACHE_WAYS                                0
 # define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
 
-# define HAL_WRITE_BUFFER                32
+# define HAL_WRITE_BUFFER                               32
 
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX
 # define CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_STEP  0
 // FIXME: disable/enable instruction streaming?
 
 // Enable the instruction cache
-#define HAL_ICACHE_ENABLE()                                             \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
-        "mrc  p15,0,r1,c1,c0,0;"                                        \
-        "orr  r1,r1,#0x1000;"                                           \
-        "orr  r1,r1,#0x0003;" /* enable ICache (also ensures   */       \
-                              /* that MMU and alignment faults */       \
-                              /* are enabled)                  */       \
-        "mcr  p15,0,r1,c1,c0,0"                                         \
-        :                                                               \
-        :                                                               \
-        : "r1" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_ICACHE_ENABLE()                                                                                            \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
+               "mrc  p15,0,r1,c1,c0,0;"                                                                                \
+               "orr  r1,r1,#0x1000;"                                                                                   \
+               "orr  r1,r1,#0x0003;" /* enable ICache (also ensures   */               \
+                                                         /* that MMU and alignment faults */           \
+                                                         /* are enabled)                                  */           \
+               "mcr  p15,0,r1,c1,c0,0"                                                                                 \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r1" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 
 // Disable the instruction cache (and invalidate it, required semanitcs)
-#define HAL_ICACHE_DISABLE()                                            \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
-        "mrc    p15,0,r1,c1,c0,0;"                                      \
-        "bic    r1,r1,#0x1000;" /* disable ICache (but not MMU, etc) */ \
-        "mcr    p15,0,r1,c1,c0,0;"                                      \
-        "mov    r1,#0;"                                                 \
-        "mcr    p15,0,r1,c7,c5,0;"  /* flush ICache */                  \
-        "nop;" /* next few instructions may be via cache    */          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        "nop"                                                           \
-        :                                                               \
-        :                                                               \
-        : "r1" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_ICACHE_DISABLE()                                                                                   \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
+               "mrc    p15,0,r1,c1,c0,0;"                                                                              \
+               "bic    r1,r1,#0x1000;" /* disable ICache (but not MMU, etc) */ \
+               "mcr    p15,0,r1,c1,c0,0;"                                                                              \
+               "mov    r1,#0;"                                                                                                 \
+               "mcr    p15,0,r1,c7,c5,0;"      /* flush ICache */                                      \
+               "nop;" /* next few instructions may be via cache        */                      \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               "nop"                                                                                                                   \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r1" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 
 // Query the state of the instruction cache
-#define HAL_ICACHE_IS_ENABLED(_state_)                                   \
-CYG_MACRO_START                                                          \
-    register cyg_uint32 reg;                                             \
-    asm volatile ("mrc  p15,0,%0,c1,c0,0"                                \
-                  : "=r"(reg)                                            \
-                  :                                                      \
-        );                                                               \
-    (_state_) = (0 != (0x1000 & reg)); /* Bit 12 is ICache enable */     \
+#define HAL_ICACHE_IS_ENABLED(_state_)                                                                  \
+CYG_MACRO_START                                                                                                                         \
+       register cyg_uint32 reg;                                                                                         \
+       asm volatile ("mrc      p15,0,%0,c1,c0,0"                                                                \
+                                 : "=r"(reg)                                                                                    \
+                                 :                                                                                                              \
+               );                                                                                                                               \
+       (_state_) = (0 != (0x1000 & reg)); /* Bit 12 is ICache enable */         \
 CYG_MACRO_END
 
 // Invalidate the entire cache
-#define HAL_ICACHE_INVALIDATE_ALL()                                     \
-CYG_MACRO_START                                                         \
-    /* this macro can discard dirty cache lines (N/A for ICache) */     \
-    asm volatile (                                                      \
-        "mov    r1,#0;"                                                 \
-        "mcr    p15,0,r1,c7,c5,0;"  /* flush ICache */                  \
-        "mcr    p15,0,r1,c8,c5,0;"  /* flush ITLB only */               \
-        "nop;" /* next few instructions may be via cache    */          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        "nop;"                                                          \
-        :                                                               \
-        :                                                               \
-        : "r1" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_ICACHE_INVALIDATE_ALL()                                                                            \
+CYG_MACRO_START                                                                                                                        \
+       /* this macro can discard dirty cache lines (N/A for ICache) */         \
+       asm volatile (                                                                                                          \
+               "mov    r1,#0;"                                                                                                 \
+               "mcr    p15,0,r1,c7,c5,0;"      /* flush ICache */                                      \
+               "mcr    p15,0,r1,c8,c5,0;"      /* flush ITLB only */                           \
+               "nop;" /* next few instructions may be via cache        */                      \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               "nop;"                                                                                                                  \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r1" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 
 // Synchronize the contents of the cache with memory.
 // (which includes flushing out pending writes)
-#define HAL_ICACHE_SYNC()                                       \
-CYG_MACRO_START                                                 \
-    HAL_DCACHE_SYNC(); /* ensure data gets to RAM */            \
-    HAL_ICACHE_INVALIDATE_ALL(); /* forget all we know */       \
+#define HAL_ICACHE_SYNC()                                                                              \
+CYG_MACRO_START                                                                                                        \
+       HAL_DCACHE_SYNC(); /* ensure data gets to RAM */                        \
+       HAL_ICACHE_INVALIDATE_ALL(); /* forget all we know */           \
 CYG_MACRO_END
 
 #else
@@ -290,134 +290,134 @@ CYG_MACRO_END
 #if HAL_DCACHE_SIZE != 0
 
 // Enable the data cache
-#define HAL_DCACHE_ENABLE()                                             \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
-        "mrc  p15,0,r1,c1,c0,0;"                                        \
-        "orr  r1,r1,#0x000F;" /* enable DCache (also ensures    */      \
-                              /* the MMU, alignment faults, and */      \
-                              /* write buffer are enabled)      */      \
-        "mcr  p15,0,r1,c1,c0,0"                                         \
-        :                                                               \
-        :                                                               \
-        : "r1" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_DCACHE_ENABLE()                                                                                            \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
+               "mrc  p15,0,r1,c1,c0,0;"                                                                                \
+               "orr  r1,r1,#0x000F;" /* enable DCache (also ensures    */              \
+                                                         /* the MMU, alignment faults, and */          \
+                                                         /* write buffer are enabled)          */              \
+               "mcr  p15,0,r1,c1,c0,0"                                                                                 \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r1" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 
 // Disable the data cache (and invalidate it, required semanitcs)
-#define HAL_DCACHE_DISABLE()                                            \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
-        "mrc  p15,0,r1,c1,c0,0;"                                        \
-        "bic  r1,r1,#0x000C;" /* disable DCache AND write buffer  */    \
-                              /* but not MMU and alignment faults */    \
-        "mcr  p15,0,r1,c1,c0,0;"                                        \
-        "mov    r1,#0;"                                                 \
-        "mcr  p15,0,r1,c7,c6,0" /* clear data cache */                  \
-        :                                                               \
-        :                                                               \
-        : "r1" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_DCACHE_DISABLE()                                                                                   \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
+               "mrc  p15,0,r1,c1,c0,0;"                                                                                \
+               "bic  r1,r1,#0x000C;" /* disable DCache AND write buffer  */    \
+                                                         /* but not MMU and alignment faults */        \
+               "mcr  p15,0,r1,c1,c0,0;"                                                                                \
+               "mov    r1,#0;"                                                                                                 \
+               "mcr  p15,0,r1,c7,c6,0" /* clear data cache */                                  \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r1" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 
 // Query the state of the data cache
-#define HAL_DCACHE_IS_ENABLED(_state_)                                   \
-CYG_MACRO_START                                                          \
-    register int reg;                                                    \
-    asm volatile ("mrc  p15,0,%0,c1,c0,0;"                               \
-                  : "=r"(reg)                                            \
-                  :                                                      \
-        );                                                               \
-    (_state_) = (0 != (4 & reg)); /* Bit 2 is DCache enable */           \
+#define HAL_DCACHE_IS_ENABLED(_state_)                                                                  \
+CYG_MACRO_START                                                                                                                         \
+       register int reg;                                                                                                        \
+       asm volatile ("mrc      p15,0,%0,c1,c0,0;"                                                               \
+                                 : "=r"(reg)                                                                                    \
+                                 :                                                                                                              \
+               );                                                                                                                               \
+       (_state_) = (0 != (4 & reg)); /* Bit 2 is DCache enable */                       \
 CYG_MACRO_END
 
 // Flush the entire dcache (and then both TLBs, just in case)
-#define HAL_DCACHE_INVALIDATE_ALL()                                     \
-CYG_MACRO_START  /* this macro can discard dirty cache lines. */        \
-    asm volatile (                                                      \
-       "mov    r0,#0;"                                                 \
-        "mcr    p15,0,r0,c7,c6,0;" /* flush d-cache */                  \
-        "mcr    p15,0,r0,c8,c7,0;" /* flush i+d-TLBs */                 \
-        :                                                               \
-        :                                                               \
-        : "r0","memory" /* clobber list */);                            \
+#define HAL_DCACHE_INVALIDATE_ALL()                                                                            \
+CYG_MACRO_START         /* this macro can discard dirty cache lines. */                \
+       asm volatile (                                                                                                          \
+       "mov    r0,#0;"                                                                                                 \
+               "mcr    p15,0,r0,c7,c6,0;" /* flush d-cache */                                  \
+               "mcr    p15,0,r0,c8,c7,0;" /* flush i+d-TLBs */                                 \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r0","memory" /* clobber list */);                                                    \
 CYG_MACRO_END
 
 // Synchronize the contents of the cache with memory.
 #ifdef CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE
-#define HAL_DCACHE_SYNC()                                               \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
-        "mov    r0, #0;"                                                \
-        "mcr    p15,0,r0,c7,c10,0;"  /* clean DCache */                 \
-        "1: mrc p15,0,r0,c15,c4,0;"  /* wait for dirty flag to clear */ \
-        "ands   r0,r0,#0x80000000;"                                     \
-        "bne    1b;"                                                    \
-        "mov    r0,#0;"                                                 \
-        "mcr    p15,0,r0,c7,c6,0;"  /* flush DCache */                  \
-        "mcr    p15,0,r0,c7,c10,4;" /* and drain the write buffer */    \
-        :                                                               \
-        :                                                               \
-        : "r0" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_DCACHE_SYNC()                                                                                              \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
+               "mov    r0, #0;"                                                                                                \
+               "mcr    p15,0,r0,c7,c10,0;"      /* clean DCache */                                     \
+               "1: mrc p15,0,r0,c15,c4,0;"      /* wait for dirty flag to clear */ \
+               "ands   r0,r0,#0x80000000;"                                                                             \
+               "bne    1b;"                                                                                                    \
+               "mov    r0,#0;"                                                                                                 \
+               "mcr    p15,0,r0,c7,c6,0;"      /* flush DCache */                                      \
+               "mcr    p15,0,r0,c7,c10,4;" /* and drain the write buffer */    \
+               :                                                                                                                               \
+               :                                                                                                                               \
+               : "r0" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 #elif defined(CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX)
-#define HAL_DCACHE_SYNC()                                               \
-CYG_MACRO_START                                                         \
-    cyg_uint32 _tmp1, _tmp2;                                            \
-    asm volatile (                                                      \
-        "mov    %0, #0;"                                                \
-        "1: "                                                           \
-        "mov    %1, #0;"                                                \
-        "2: "                                                           \
-        "orr    r0,%0,%1;"                                              \
-        "mcr    p15,0,r0,c7,c14,2;"  /* clean index in DCache */        \
-        "add    %1,%1,%2;"                                              \
-        "cmp    %1,%3;"                                                 \
-        "bne    2b;"                                                    \
-        "add    %0,%0,#0x04000000;"  /* get to next index */            \
-        "cmp    %0,#0;"                                                 \
-        "bne    1b;"                                                    \
-        "mcr    p15,0,r0,c7,c10,4;" /* drain the write buffer */        \
-        : "=r" (_tmp1), "=r" (_tmp2)                                    \
-        : "I" (CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_STEP),            \
-          "I" (CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_LIMIT)            \
-        : "r0" /* Clobber list */                                       \
-        );                                                              \
+#define HAL_DCACHE_SYNC()                                                                                              \
+CYG_MACRO_START                                                                                                                        \
+       cyg_uint32 _tmp1, _tmp2;                                                                                        \
+       asm volatile (                                                                                                          \
+               "mov    %0, #0;"                                                                                                \
+               "1: "                                                                                                                   \
+               "mov    %1, #0;"                                                                                                \
+               "2: "                                                                                                                   \
+               "orr    r0,%0,%1;"                                                                                              \
+               "mcr    p15,0,r0,c7,c14,2;"      /* clean index in DCache */            \
+               "add    %1,%1,%2;"                                                                                              \
+               "cmp    %1,%3;"                                                                                                 \
+               "bne    2b;"                                                                                                    \
+               "add    %0,%0,#0x04000000;"      /* get to next index */                        \
+               "cmp    %0,#0;"                                                                                                 \
+               "bne    1b;"                                                                                                    \
+               "mcr    p15,0,r0,c7,c10,4;" /* drain the write buffer */                \
+               : "=r" (_tmp1), "=r" (_tmp2)                                                                    \
+               : "I" (CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_STEP),                    \
+                 "I" (CYGHWR_HAL_ARM_ARM9_CLEAN_DCACHE_INDEX_LIMIT)                    \
+               : "r0" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 #elif defined(CYGHWR_HAL_ARM_ARM9_ALT_CLEAN_DCACHE)
 /*
  * 'Clean & Invalidate whole DCache'
   */
-#define HAL_DCACHE_SYNC()                                               \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
+#define HAL_DCACHE_SYNC()                                                                                              \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
        "mov    r0, #255 << 4;" /* 256 entries/set */ \
-        "2: "                    \
+               "2: "                                    \
        "mcr    p15, 0, r0, c7, c14, 2;" \
        "subs   r0, r0, #1 << 4;" \
        "bcs    2b;"            /* entries 255 to 0 */ \
-        "mcr    p15,0,r0,c7,c10,4;" /* drain the write buffer */        \
-        : \
-        : \
-        : "r0" /* Clobber list */                                       \
-        );                                                              \
+               "mcr    p15,0,r0,c7,c10,4;" /* drain the write buffer */                \
+               : \
+               : \
+               : "r0" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 #elif defined(CYGHWR_HAL_ARM_ARM926EJ_CLEAN_DCACHE)
 /*
  * 'Clean & Invalidate whole DCache'
  */
-#define HAL_DCACHE_SYNC()                                               \
-CYG_MACRO_START                                                         \
-    asm volatile (                                                      \
-        "1: "                   /* clean & invalidate D index */ \
+#define HAL_DCACHE_SYNC()                                                                                              \
+CYG_MACRO_START                                                                                                                        \
+       asm volatile (                                                                                                          \
+               "1: "                                   /* clean & invalidate D index */ \
        "mrc    p15, 0, r15, c7, c14, 3;" \
-       "bne    1b;" \
-        "mcr    p15,0,r0,c7,c10,4;" /* drain the write buffer */        \
-        : \
-        : \
-        : "r0" /* Clobber list */                                       \
-        );                                                              \
+       "bne    1b;" \
+               "mcr    p15,0,r0,c7,c10,4;" /* drain the write buffer */                \
+               : \
+               : \
+               : "r0" /* Clobber list */                                                                               \
+               );                                                                                                                              \
 CYG_MACRO_END
 #else
 # error "Don't know how to sync Dcache"
@@ -440,12 +440,12 @@ CYG_MACRO_END
 // Set the data cache write mode
 //#define HAL_DCACHE_WRITE_MODE( _mode_ )
 
-#define HAL_DCACHE_WRITETHRU_MODE       0
-#define HAL_DCACHE_WRITEBACK_MODE       1
+#define HAL_DCACHE_WRITETHRU_MODE              0
+#define HAL_DCACHE_WRITEBACK_MODE              1
 
 // Get the current writeback mode - or only writeback mode if fixed
-#define HAL_DCACHE_QUERY_WRITE_MODE( _mode_ ) CYG_MACRO_START           \
-    _mode_ = HAL_DCACHE_WRITEBACK_MODE;                                 \
+#define HAL_DCACHE_QUERY_WRITE_MODE( _mode_ ) CYG_MACRO_START                  \
+       _mode_ = HAL_DCACHE_WRITEBACK_MODE;                                                                     \
 CYG_MACRO_END
 
 // Load the contents of the given address range into the data cache
@@ -470,45 +470,45 @@ CYG_MACRO_END
 // ---- this seems not to work despite the documentation ---
 //#define HAL_DCACHE_FLUSH( _base_ , _size_ )
 //CYG_MACRO_START
-//    HAL_DCACHE_STORE( _base_ , _size_ );
-//    HAL_DCACHE_INVALIDATE( _base_ , _size_ );
+//       HAL_DCACHE_STORE( _base_ , _size_ );
+//       HAL_DCACHE_INVALIDATE( _base_ , _size_ );
 //CYG_MACRO_END
 
 // Invalidate cache lines in the given range without writing to memory.
 // ---- this seems not to work despite the documentation ---
 //#define HAL_DCACHE_INVALIDATE( _base_ , _size_ )
 //CYG_MACRO_START
-//    register int addr, enda;
-//    for ( addr = (~(HAL_DCACHE_LINE_SIZE - 1)) & (int)(_base_),
-//              enda = (int)(_base_) + (_size_);
-//          addr < enda ;
-//          addr += HAL_DCACHE_LINE_SIZE )
-//    {
-//        asm volatile (
-//                      "mcr  p15,0,%0,c7,c6,1;" /* flush entry away */
-//                      :
-//                      : "r"(addr)
-//                      : "memory"
-//            );
-//    }
+//       register int addr, enda;
+//       for ( addr = (~(HAL_DCACHE_LINE_SIZE - 1)) & (int)(_base_),
+//                             enda = (int)(_base_) + (_size_);
+//                     addr < enda ;
+//                     addr += HAL_DCACHE_LINE_SIZE )
+//       {
+//               asm volatile (
+//                                             "mcr  p15,0,%0,c7,c6,1;" /* flush entry away */
+//                                             :
+//                                             : "r"(addr)
+//                                             : "memory"
+//                       );
+//       }
 //CYG_MACRO_END
-                          
+
 // Write dirty cache lines to memory for the given address range.
 // ---- this seems not to work despite the documentation ---
 //#define HAL_DCACHE_STORE( _base_ , _size_ )
 //CYG_MACRO_START
-//    register int addr, enda;
-//    for ( addr = (~(HAL_DCACHE_LINE_SIZE - 1)) & (int)(_base_),
-//              enda = (int)(_base_) + (_size_);
-//          addr < enda ;
-//          addr += HAL_DCACHE_LINE_SIZE )
-//    {
-//        asm volatile ("mcr  p15,0,%0,c7,c10,1;" /* push entry to RAM */
-//                      :
-//                      : "r"(addr)
-//                      : "memory"
-//            );
-//    }
+//       register int addr, enda;
+//       for ( addr = (~(HAL_DCACHE_LINE_SIZE - 1)) & (int)(_base_),
+//                             enda = (int)(_base_) + (_size_);
+//                     addr < enda ;
+//                     addr += HAL_DCACHE_LINE_SIZE )
+//       {
+//               asm volatile ("mcr  p15,0,%0,c7,c10,1;" /* push entry to RAM */
+//                                             :
+//                                             : "r"(addr)
+//                                             : "memory"
+//                       );
+//       }
 //CYG_MACRO_END
 
 // Preread the given range into the cache with the intention of reading
@@ -526,22 +526,22 @@ CYG_MACRO_END
 // Cache controls for safely disabling/reenabling caches around execution
 // of relocated code.
 
-#define HAL_FLASH_CACHES_OFF(_d_, _i_)          \
-    CYG_MACRO_START                             \
-    HAL_ICACHE_IS_ENABLED(_i_);                 \
-    HAL_DCACHE_IS_ENABLED(_d_);                 \
-    HAL_ICACHE_INVALIDATE_ALL();                \
-    HAL_ICACHE_DISABLE();                       \
-    HAL_DCACHE_SYNC();                          \
-    HAL_DCACHE_INVALIDATE_ALL();                \
-    HAL_DCACHE_DISABLE();                       \
-    CYG_MACRO_END
-
-#define HAL_FLASH_CACHES_ON(_d_, _i_)           \
-    CYG_MACRO_START                             \
-    if (_d_) HAL_DCACHE_ENABLE();               \
-    if (_i_) HAL_ICACHE_ENABLE();               \
-    CYG_MACRO_END
+#define HAL_FLASH_CACHES_OFF(_d_, _i_)                 \
+       CYG_MACRO_START                                                         \
+       HAL_ICACHE_IS_ENABLED(_i_);                                     \
+       HAL_DCACHE_IS_ENABLED(_d_);                                     \
+       HAL_ICACHE_INVALIDATE_ALL();                            \
+       HAL_ICACHE_DISABLE();                                           \
+       HAL_DCACHE_SYNC();                                                      \
+       HAL_DCACHE_INVALIDATE_ALL();                            \
+       HAL_DCACHE_DISABLE();                                           \
+       CYG_MACRO_END
+
+#define HAL_FLASH_CACHES_ON(_d_, _i_)                  \
+       CYG_MACRO_START                                                         \
+       if (_d_) HAL_DCACHE_ENABLE();                           \
+       if (_i_) HAL_ICACHE_ENABLE();                           \
+       CYG_MACRO_END
 
 //-----------------------------------------------------------------------------
 // Virtual<->Physical translations