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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5af1b67  armv7-a/armv7-r:cache: modify hardcode in cache set/way 
operation
5af1b67 is described below

commit 5af1b671b6e6b998323f142f9b75f448b8483729
Author: zhuyanlin <zhuyanl...@xiaomi.com>
AuthorDate: Tue Mar 1 15:35:10 2022 +0800

    armv7-a/armv7-r:cache: modify hardcode in cache set/way operation
    
    Some chip not use the default cache size & way , read from
    CCSIDR instead of hardcode.
    
    Signed-off-by: zhuyanlin <zhuyanl...@xiaomi.com>
---
 arch/arm/src/armv7-a/cp15_clean_dcache_all.S      | 16 +++++++++++++---
 arch/arm/src/armv7-a/cp15_flush_dcache_all.S      | 15 +++++++++++++--
 arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S | 15 +++++++++++++--
 arch/arm/src/armv7-r/cp15_clean_dcache_all.S      | 11 +++++++++++
 arch/arm/src/armv7-r/cp15_flush_dcache_all.S      | 11 +++++++++++
 arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S | 11 +++++++++++
 6 files changed, 72 insertions(+), 7 deletions(-)

diff --git a/arch/arm/src/armv7-a/cp15_clean_dcache_all.S 
b/arch/arm/src/armv7-a/cp15_clean_dcache_all.S
index e2413a0..d95d31e 100644
--- a/arch/arm/src/armv7-a/cp15_clean_dcache_all.S
+++ b/arch/arm/src/armv7-a/cp15_clean_dcache_all.S
@@ -91,19 +91,28 @@
 
 cp15_clean_dcache_all:
 
-       mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
+       push            {r4, r5}
 
+       mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
        ldr             r3, =0x7fff                     /* Isolate the NumSets 
field (bits 13-27) */
        and             r0, r3, r1, lsr #13             /* r0=NumSets (number 
of sets - 1) */
 
+       ldr             r3,=0x7                         /* Isolate the LineSize 
field (bits 0-2) */
+       and             r5, r3, r1                      /* r4=(Log2LineSize - 
2) in word */
+       add             r5, #4                          /* r4=Set/way operation 
line shfit */
+
        ldr             r3, =0x3ff                      /* Isolate the way 
field (bits 3-12) */
        and             r1, r3, r1, lsr #3              /* r1=(number of ways - 
1) */
 
+       add             r4, r1, #1
+       clz             r4, r4
+       add             r4, #1                          /* r4=Set/way operation 
Way shift */
+
 way_loop:
        mov             r3, r0                          /* Init Sets */
 set_loop:
-       mov             r2, r1, lsl #30                 /* r2 = way loop 
counter << 30 */
-       orr             r2, r3, lsl #5                  /* r2 = set/way cache 
operation format */
+       mov             r2, r1, lsl r4                  /* r2 = way loop 
counter << way shift */
+       orr             r2, r3, lsl r5                  /* r2 = set/way cache 
operation format */
        mcr             CP15_DCCSW(r2)                  /* Data Cache Clean by 
Set/Way */
        subs            r3, r3, #1                      /* Subtraction set 
counter */
        bcs             set_loop                        /* Keep looping if not 
*/
@@ -112,6 +121,7 @@ set_loop:
        bcs             way_loop                        /* Keep looping if not 
*/
 
        dsb
+       pop             {r4, r5}
        bx              lr
        .size cp15_clean_dcache_all, . - cp15_clean_dcache_all
        .end
diff --git a/arch/arm/src/armv7-a/cp15_flush_dcache_all.S 
b/arch/arm/src/armv7-a/cp15_flush_dcache_all.S
index e51bc85..fc7c260 100644
--- a/arch/arm/src/armv7-a/cp15_flush_dcache_all.S
+++ b/arch/arm/src/armv7-a/cp15_flush_dcache_all.S
@@ -91,19 +91,29 @@
 
 cp15_flush_dcache_all:
 
+       push            {r4, r5}
+
        mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
 
        ldr             r3, =0x7fff                     /* Isolate the NumSets 
field (bits 13-27) */
        and             r0, r3, r1, lsr #13             /* r0=NumSets (number 
of sets - 1) */
 
+       ldr             r3,=0x7                         /* Isolate the LineSize 
field (bits 0-2) */
+       and             r5, r3                          /* r4=(Log2LineSize - 
2) in word */
+       add             r5, #4                          /* r4=Set/way operation 
line shfit */
+
        ldr             r3, =0x3ff                      /* Isolate the way 
field (bits 3-12) */
        and             r1, r3, r1, lsr #3              /* r1=(number of ways - 
1) */
 
+       add             r4, r1, #1
+       clz             r4, r4
+       add             r4, #1                          /* r4=Set/way operation 
Way shift */
+
 way_loop:
        mov             r3, r0                          /* Init Sets */
 set_loop:
-       mov             r2, r1, lsl #30                 /* r2 = way loop 
counter << 30 */
-       orr             r2, r3, lsl #5                  /* r2 = set/way cache 
operation format */
+       mov             r2, r1, lsl r4                  /* r2 = way loop 
counter << way shift */
+       orr             r2, r3, lsl r5                  /* r2 = set/way cache 
operation format */
        mcr             CP15_DCCISW(r2)                 /* Data Cache Clean and 
Invalidate by Set/Way */
        subs            r3, r3, #1                      /* Subtraction set 
counter */
        bcs             set_loop                        /* Keep looping if not 
*/
@@ -112,6 +122,7 @@ set_loop:
        bcs             way_loop                        /* Keep looping if not 
*/
 
        dsb
+       pop             {r4, r5}
        bx              lr
        .size cp15_flush_dcache_all, . - cp15_flush_dcache_all
        .end
diff --git a/arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S 
b/arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S
index 4500b41..9447b60 100644
--- a/arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S
+++ b/arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S
@@ -91,19 +91,29 @@
 
 cp15_invalidate_dcache_all:
 
+       push            {r4, r5}
+
        mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
 
        ldr             r3, =0x7fff                     /* Isolate the NumSets 
field (bits 13-27) */
        and             r0, r3, r1, lsr #13             /* r0=NumSets (number 
of sets - 1) */
 
+       ldr             r3,=0x7                         /* Isolate the LineSize 
field (bits 0-2) */
+       and             r5, r3                          /* r4=(Log2LineSize - 
2) in word */
+       add             r5, #4                          /* r4=Set/way operation 
line shfit */
+
        ldr             r3, =0x3ff                      /* Isolate the way 
field (bits 3-12) */
        and             r1, r3, r1, lsr #3              /* r1=(number of ways - 
1) */
 
+       add             r4, r1, #1
+       clz             r4, r4
+       add             r4, #1                          /* r4=Set/way operation 
Way shift */
+
 way_loop:
        mov             r3, r0                          /* Init Sets */
 set_loop:
-       mov             r2, r1, lsl #30                 /* r2 = way loop 
counter << 30 */
-       orr             r2, r3, lsl #5                  /* r2 = set/way cache 
operation format */
+       mov             r2, r1, lsl r4                  /* r2 = way loop 
counter << way shift */
+       orr             r2, r3, lsl r5                  /* r2 = set/way cache 
operation format */
        mcr             CP15_DCISW(r2)                  /* Data Cache 
Invalidate by Set/Way */
        subs            r3, r3, #1                      /* Subtraction set 
counter */
        bcs             set_loop                        /* Keep looping if not 
*/
@@ -112,6 +122,7 @@ set_loop:
        bcs             way_loop                        /* Keep looping if not 
*/
 
        dsb
+       pop             {r4, r5}
        bx              lr
        .size cp15_invalidate_dcache_all, . - cp15_invalidate_dcache_all
        .end
diff --git a/arch/arm/src/armv7-r/cp15_clean_dcache_all.S 
b/arch/arm/src/armv7-r/cp15_clean_dcache_all.S
index 1efc7ed..c3c199f 100644
--- a/arch/arm/src/armv7-r/cp15_clean_dcache_all.S
+++ b/arch/arm/src/armv7-r/cp15_clean_dcache_all.S
@@ -91,14 +91,24 @@
 
 cp15_clean_dcache_all:
 
+       push            {r4, r5}
+
        mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
 
        ldr             r3, =0x7fff                     /* Isolate the NumSets 
field (bits 13-27) */
        and             r0, r3, r1, lsr #13             /* r0=NumSets (number 
of sets - 1) */
 
+       ldr             r3,=0x7                         /* Isolate the LineSize 
field (bits 0-2) */
+       and             r5, r3                          /* r4=(Log2LineSize - 
2) in word */
+       add             r5, #4                          /* r4=Set/way operation 
line shfit */
+
        ldr             r3, =0x3ff                      /* Isolate the way 
field (bits 3-12) */
        and             r1, r3, r1, lsr #3              /* r1=(number of ways - 
1) */
 
+       add             r4, r1, #1
+       clz             r4, r4
+       add             r4, #1                          /* r4=Set/way operation 
Way shift */
+
 way_loop:
        mov             r3, r0                          /* Init Sets */
 set_loop:
@@ -112,6 +122,7 @@ set_loop:
        bcs             way_loop                        /* Keep looping if not 
*/
 
        dsb
+       pop             {r4, r5}
        bx              lr
        .size cp15_clean_dcache_all, . - cp15_clean_dcache_all
        .end
diff --git a/arch/arm/src/armv7-r/cp15_flush_dcache_all.S 
b/arch/arm/src/armv7-r/cp15_flush_dcache_all.S
index 1be538e..0ae8cfe 100644
--- a/arch/arm/src/armv7-r/cp15_flush_dcache_all.S
+++ b/arch/arm/src/armv7-r/cp15_flush_dcache_all.S
@@ -91,14 +91,24 @@
 
 cp15_flush_dcache_all:
 
+       push            {r4, r5}
+
        mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
 
        ldr             r3, =0x7fff                     /* Isolate the NumSets 
field (bits 13-27) */
        and             r0, r3, r1, lsr #13             /* r0=NumSets (number 
of sets - 1) */
 
+       ldr             r3,=0x7                         /* Isolate the LineSize 
field (bits 0-2) */
+       and             r5, r3                          /* r4=(Log2LineSize - 
2) in word */
+       add             r5, #4                          /* r4=Set/way operation 
line shfit */
+
        ldr             r3, =0x3ff                      /* Isolate the way 
field (bits 3-12) */
        and             r1, r3, r1, lsr #3              /* r1=(number of ways - 
1) */
 
+       add             r4, r1, #1
+       clz             r4, r4
+       add             r4, #1                          /* r4=Set/way operation 
Way shift */
+
 way_loop:
        mov             r3, r0                          /* Init Sets */
 set_loop:
@@ -112,6 +122,7 @@ set_loop:
        bcs             way_loop                        /* Keep looping if not 
*/
 
        dsb
+       pop             {r4, r5}
        bx              lr
        .size cp15_flush_dcache_all, . - cp15_flush_dcache_all
        .end
diff --git a/arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S 
b/arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S
index 71a45d1..d1836a8 100644
--- a/arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S
+++ b/arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S
@@ -91,14 +91,24 @@
 
 cp15_invalidate_dcache_all:
 
+       push            {r4, r5}
+
        mrc             CP15_CCSIDR(r1)                 /* Read the Cache Size 
Identification Register */
 
        ldr             r3, =0x7fff                     /* Isolate the NumSets 
field (bits 13-27) */
        and             r0, r3, r1, lsr #13             /* r0=NumSets (number 
of sets - 1) */
 
+       ldr             r3,=0x7                         /* Isolate the LineSize 
field (bits 0-2) */
+       and             r5, r3                          /* r4=(Log2LineSize - 
2) in word */
+       add             r5, #4                          /* r4=Set/way operation 
line shfit */
+
        ldr             r3, =0x3ff                      /* Isolate the way 
field (bits 3-12) */
        and             r1, r3, r1, lsr #3              /* r1=(number of ways - 
1) */
 
+       add             r4, r1, #1
+       clz             r4, r4
+       add             r4, #1                          /* r4=Set/way operation 
Way shift */
+
 way_loop:
        mov             r3, r0                          /* Init Sets */
 set_loop:
@@ -112,6 +122,7 @@ set_loop:
        bcs             way_loop                        /* Keep looping if not 
*/
 
        dsb
+       pop             {r4, r5}
        bx              lr
        .size cp15_invalidate_dcache_all, . - cp15_invalidate_dcache_all
        .end

Reply via email to