You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/09/21 10:07:12 UTC
[incubator-nuttx] 02/04: armv7a/r: refact cp15_cache functions
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
commit 6d92810d5a8d6a02e8737a91821f7ef82c8ee1b2
Author: ligd <li...@xiaomi.com>
AuthorDate: Fri Sep 16 14:31:52 2022 +0800
armv7a/r: refact cp15_cache functions
Signed-off-by: ligd <li...@xiaomi.com>
---
arch/arm/src/armv7-a/Make.defs | 8 +-
arch/arm/src/armv7-a/cp15_cache_size.S | 85 --------
arch/arm/src/armv7-a/cp15_cacheops.c | 245 ++++++++++++++++++++++
arch/arm/src/armv7-a/cp15_clean_dcache.S | 116 ----------
arch/arm/src/armv7-a/cp15_clean_dcache_all.S | 127 -----------
arch/arm/src/armv7-a/cp15_coherent_dcache.S | 138 ------------
arch/arm/src/armv7-a/cp15_flush_dcache.S | 116 ----------
arch/arm/src/armv7-a/cp15_flush_dcache_all.S | 128 -----------
arch/arm/src/armv7-a/cp15_invalidate_dcache.S | 123 -----------
arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S | 128 -----------
arch/arm/src/armv7-r/Make.defs | 9 +-
arch/arm/src/armv7-r/cp15_cache_size.S | 84 --------
arch/arm/src/armv7-r/cp15_cacheops.c | 245 ++++++++++++++++++++++
arch/arm/src/armv7-r/cp15_clean_dcache.S | 116 ----------
arch/arm/src/armv7-r/cp15_clean_dcache_all.S | 129 ------------
arch/arm/src/armv7-r/cp15_coherent_dcache.S | 140 -------------
arch/arm/src/armv7-r/cp15_flush_dcache.S | 116 ----------
arch/arm/src/armv7-r/cp15_flush_dcache_all.S | 129 ------------
arch/arm/src/armv7-r/cp15_invalidate_dcache.S | 123 -----------
arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S | 128 -----------
20 files changed, 494 insertions(+), 1939 deletions(-)
diff --git a/arch/arm/src/armv7-a/Make.defs b/arch/arm/src/armv7-a/Make.defs
index 2ab71d59b2..791275125d 100644
--- a/arch/arm/src/armv7-a/Make.defs
+++ b/arch/arm/src/armv7-a/Make.defs
@@ -36,11 +36,7 @@ endif
# Common assembly language files
-CMN_ASRCS += arm_cpuhead.S arm_vectoraddrexcptn.S
-CMN_ASRCS += arm_vectors.S cp15_cache_size.S cp15_clean_dcache_all.S
-CMN_ASRCS += cp15_clean_dcache.S cp15_coherent_dcache.S
-CMN_ASRCS += cp15_flush_dcache_all.S cp15_flush_dcache.S
-CMN_ASRCS += cp15_invalidate_dcache_all.S cp15_invalidate_dcache.S
+CMN_ASRCS += arm_cpuhead.S arm_vectoraddrexcptn.S arm_vectors.S
# Common C source files
@@ -49,7 +45,7 @@ CMN_CSRCS += arm_doirq.c arm_gicv2.c arm_gicv2_dump.c
CMN_CSRCS += arm_initialstate.c arm_mmu.c arm_prefetchabort.c
CMN_CSRCS += arm_schedulesigaction.c arm_sigdeliver.c
CMN_CSRCS += arm_syscall.c arm_tcbinfo.c arm_undefinedinsn.c
-CMN_CSRCS += arm_perf.c
+CMN_CSRCS += arm_perf.c cp15_cacheops.c
ifeq ($(CONFIG_ARMV7A_HAVE_PTM), y)
CMN_CSRCS += arm_timer.c
diff --git a/arch/arm/src/armv7-a/cp15_cache_size.S b/arch/arm/src/armv7-a/cp15_cache_size.S
deleted file mode 100644
index e53aac1d72..0000000000
--- a/arch/arm/src/armv7-a/cp15_cache_size.S
+++ /dev/null
@@ -1,85 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_cache_size.S
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_cache_size.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_cache_size
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_cache_size
- *
- * Description:
- * Get cp15 cache size in byte
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * Cache size in byte
- *
- ****************************************************************************/
-
- .globl cp15_cache_size
- .type cp15_cache_size, function
-
-cp15_cache_size:
-
- mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
-
- ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
- and r2, r3, r0, lsr #13 /* r2=NumSets (number of sets - 1) */
- add r2, #1
-
- ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
- and r1, r3, r0, lsr #3 /* r1=(number of ways - 1) */
- add r1, #1
-
- ldr r3,=0x7 /* Isolate the LineSize field (bits 0-2) */
- and r0, r3 /* r0=(Log2LineSize - 2) in word */
- add r0, #4 /* r0=Log2lineSize in byte */
-
- mul r2, r1, r2 /* r2=Sets*Ways */
- lsl r0, r2, r0 /* r0=Sets*Ways*LineSize */
-
- bx lr
-
- .size cp15_cache_size, . - cp15_cache_size
- .end
diff --git a/arch/arm/src/armv7-a/cp15_cacheops.c b/arch/arm/src/armv7-a/cp15_cacheops.c
new file mode 100644
index 0000000000..fcdf566caa
--- /dev/null
+++ b/arch/arm/src/armv7-a/cp15_cacheops.c
@@ -0,0 +1,245 @@
+/****************************************************************************
+ * arch/arm/src/armv7-a/cp15_cacheops.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/cache.h>
+#include <nuttx/irq.h>
+
+#include "cp15_cacheops.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define CP15_CACHE_INVALIDATE 0
+#define CP15_CACHE_CLEAN 1
+#define CP15_CACHE_CLEANINVALIDATE 2
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline uint32_t ilog2(uint32_t u)
+{
+ int i = 0;
+
+ while (u >>= 1)
+ {
+ i++;
+ }
+
+ return i;
+}
+
+static inline uint32_t cp15_cache_get_info(uint32_t *sets, uint32_t *ways)
+{
+ uint32_t ccsidr = CP15_GET(CCSIDR);
+
+ if (sets)
+ {
+ *sets = ((ccsidr >> 13) & 0x7fff) + 1;
+ }
+
+ if (ways)
+ {
+ *ways = ((ccsidr >> 3) & 0x3ff) + 1;
+ }
+
+ return (1 << ((ccsidr & 0x7) + 2)) * 4;
+}
+
+static void cp15_dcache_op_level(uint32_t level, int op)
+{
+ uint32_t sets;
+ uint32_t ways;
+ uint32_t set;
+ uint32_t way;
+ uint32_t line;
+ uint32_t way_shift;
+ uint32_t set_shift;
+ uint32_t val = level << 1;
+
+ /* Select by CSSELR */
+
+ CP15_SET(CSSELR, val);
+
+ /* Get cache info */
+
+ line = cp15_cache_get_info(&sets, &ways);
+
+ way_shift = 32 - ilog2(ways);
+ set_shift = ilog2(line);
+
+ ARM_DSB();
+
+ /* A: Log2(ways)
+ * B: L+S
+ * L: Log2(line)
+ * S: Log2(sets)
+ *
+ * The bits are packed as follows:
+ * 31 31-A B B-1 L L-1 4 3 1 0
+ * |---|-------------|--------|-------|-----|-|
+ * |Way| zeros | Set | zeros |level|0|
+ * |---|-------------|--------|-------|-----|-|
+ */
+
+ for (way = 0; way < ways; way++)
+ {
+ for (set = 0; set < sets; set++)
+ {
+ val = level << 1;
+ val |= way << way_shift;
+ val |= set << set_shift;
+
+ switch (op)
+ {
+ case CP15_CACHE_INVALIDATE:
+ cp15_invalidate_dcacheline_bysetway(val);
+ break;
+ case CP15_CACHE_CLEAN:
+ cp15_clean_dcache_bysetway(val);
+ break;
+ case CP15_CACHE_CLEANINVALIDATE:
+ cp15_cleaninvalidate_dcacheline(val);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ ARM_ISB();
+}
+
+static void cp15_dcache_op(int op)
+{
+ uint32_t clidr = CP15_GET(CLIDR);
+ int level;
+
+ for (level = 0; level < 7; level++)
+ {
+ uint32_t ctype = clidr & 0x7;
+
+ switch (ctype)
+ {
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ cp15_dcache_op_level(level, op);
+ break;
+ default:
+ break;
+ }
+
+ clidr >>= 3;
+ if (clidr == 0)
+ {
+ break;
+ }
+ }
+}
+
+static void cp15_dcache_op_mva(uintptr_t start, uintptr_t end, int op)
+{
+ uint32_t line;
+
+ line = cp15_cache_get_info(NULL, NULL);
+ start &= ~(line - 1);
+
+ ARM_DSB();
+
+ while (start < end)
+ {
+ switch (op)
+ {
+ case CP15_CACHE_INVALIDATE:
+ cp15_invalidate_dcacheline_bymva(start);
+ break;
+ case CP15_CACHE_CLEAN:
+ cp15_clean_dcache_bymva(start);
+ break;
+ case CP15_CACHE_CLEANINVALIDATE:
+ cp15_cleaninvalidate_dcacheline_bymva(start);
+ break;
+ default:
+ break;
+ }
+
+ start += line;
+ }
+
+ ARM_ISB();
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void cp15_coherent_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_CLEANINVALIDATE);
+ cp15_invalidate_icache();
+}
+
+void cp15_invalidate_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_INVALIDATE);
+}
+
+void cp15_invalidate_dcache_all(void)
+{
+ cp15_dcache_op(CP15_CACHE_INVALIDATE);
+}
+
+void cp15_clean_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_CLEAN);
+}
+
+void cp15_clean_dcache_all(void)
+{
+ cp15_dcache_op(CP15_CACHE_CLEAN);
+}
+
+void cp15_flush_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_CLEANINVALIDATE);
+}
+
+void cp15_flush_dcache_all(void)
+{
+ cp15_dcache_op(CP15_CACHE_CLEANINVALIDATE);
+}
+
+uint32_t cp15_cache_size(void)
+{
+ uint32_t sets;
+ uint32_t ways;
+ uint32_t line;
+
+ line = cp15_cache_get_info(&sets, &ways);
+
+ return sets * ways * line;
+}
diff --git a/arch/arm/src/armv7-a/cp15_clean_dcache.S b/arch/arm/src/armv7-a/cp15_clean_dcache.S
deleted file mode 100644
index 89f980eb67..0000000000
--- a/arch/arm/src/armv7-a/cp15_clean_dcache.S
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_clean_dcache.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_clean_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_clean_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_clean_dcache
- *
- * Description:
- * Clean the data cache within the specified region by flushing the
- * contents of the data cache to memory.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_clean_dcache
- .type cp15_clean_dcache, function
-
-cp15_clean_dcache:
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r0, r0, r3 /* R0=aligned start address */
-
- /* Loop, cleaning each cache line by writing its contents to memory */
-
-1:
- mcr CP15_DCCMVAC(r0) /* Clean data cache line to PoC by VA */
- add r0, r0, r2 /* R12=Next cache line */
- cmp r0, r1 /* Loop until all cache lines have been cleaned */
- blo 1b
-
- dsb
- bx lr
- .size cp15_clean_dcache, . - cp15_clean_dcache
- .end
diff --git a/arch/arm/src/armv7-a/cp15_clean_dcache_all.S b/arch/arm/src/armv7-a/cp15_clean_dcache_all.S
deleted file mode 100644
index d95d31e73e..0000000000
--- a/arch/arm/src/armv7-a/cp15_clean_dcache_all.S
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_clean_dcache_all.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_clean_dcache_all.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_clean_dcache_all
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_clean_dcache_all
- *
- * Description:
- * Clean the entire contents of D cache.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_clean_dcache_all
- .type cp15_clean_dcache_all, function
-
-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, 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 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 */
-
- subs r1, r1, #1 /* Subtraction the way counter */
- 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_coherent_dcache.S b/arch/arm/src/armv7-a/cp15_coherent_dcache.S
deleted file mode 100644
index 88c5feb4c3..0000000000
--- a/arch/arm/src/armv7-a/cp15_coherent_dcache.S
+++ /dev/null
@@ -1,138 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_coherent_dcache.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_coherent_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_coherent_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_coherent_dcache
- *
- * Description:
- * Ensure that the I and D caches are coherent within specified region
- * by cleaning the D cache (i.e., flushing the D cache contents to memory
- * and invalidating the I cache. This is typically used when code has been
- * written to a memory region, and will be executed.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_coherent_dcache
- .type cp15_coherent_dcache, function
-
-cp15_coherent_dcache:
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r12, r0, r3 /* R12=aligned start address */
-
- /* Loop, flushing each D cache line to memory */
-1:
- mcr CP15_DCCMVAU(r12) /* Clean data or unified cache line by VA to PoU */
- add r12, r12, r2 /* R12=Next cache line */
- cmp r12, r1 /* Loop until all cache lines have been cleaned */
- blo 1b
-
- dsb
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- and r3, r3, #0xf /* Isolate the IminLine field */
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r12, r0, r3 /* R12=aligned start address */
-
- /* Loop, invalidating each I cache line to memory */
-1:
- mcr CP15_ICIMVAU(r12) /* Invalidate instruction cache by VA to PoU */
- add r12, r12, r2 /* R12=Next cache line */
- cmp r12, r1 /* Loop until all cache lines have been invalidated */
- blo 1b
-
- mov r0, #0
- mcr CP15_BPIALLIS(r0) /* Invalidate entire branch predictor array Inner Shareable */
- mcr CP15_BPIALL(r0) /* Invalidate entire branch predictor array Inner Shareable */
-
- dsb
- isb
- bx lr
- .size cp15_coherent_dcache, . - cp15_coherent_dcache
- .end
diff --git a/arch/arm/src/armv7-a/cp15_flush_dcache.S b/arch/arm/src/armv7-a/cp15_flush_dcache.S
deleted file mode 100644
index 88423cb246..0000000000
--- a/arch/arm/src/armv7-a/cp15_flush_dcache.S
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_flush_dcache.S
- *
- * Copyright (C) 2013, 2018 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_flush_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_flush_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_flush_dcache
- *
- * Description:
- * Flush the data cache within the specified region by cleaning and
- * invalidating the D cache.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_flush_dcache
- .type cp15_flush_dcache, function
-
-cp15_flush_dcache:
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r0, r0, r3 /* R0=aligned start address */
-
- /* Loop, cleaning and invaliding each D cache line in the address range */
-
-1:
- mcr CP15_DCCIMVAC(r0) /* Clean and invalidate data cache line by VA to PoC */
- add r0, r0, r2 /* R12=Next cache line */
- cmp r0, r1 /* Loop until all cache lines have been cleaned */
- blo 1b
-
- dsb
- bx lr
- .size cp15_flush_dcache, . - cp15_flush_dcache
- .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
deleted file mode 100644
index ddb5d70637..0000000000
--- a/arch/arm/src/armv7-a/cp15_flush_dcache_all.S
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_flush_dcache_all.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_flush_dcache_all.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_flush_dcache_all
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_flush_dcache_all
- *
- * Description:
- * Flush the entire contents of D cache.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_flush_dcache_all
- .type cp15_flush_dcache_all, function
-
-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, 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 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 */
-
- subs r1, r1, #1 /* Subtraction the way counter */
- 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.S b/arch/arm/src/armv7-a/cp15_invalidate_dcache.S
deleted file mode 100644
index 4f04a5e74e..0000000000
--- a/arch/arm/src/armv7-a/cp15_invalidate_dcache.S
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_invalidate_dcache.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_invalidate_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_invalidate_dcache
- *
- * Description:
- * Invalidate the data cache within the specified region; we will be
- * performing a DMA operation in this region and we want to purge old data
- * in the cache.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache
- .type cp15_invalidate_dcache, function
-
-cp15_invalidate_dcache:
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- tst r0, r3
- bic r0, r0, r3 /* R0=aligned start address */
-
- mcrne CP15_DCCIMVAC(r0) /* Clean and invalidate data cache line by VA to PoC */
-
- tst r1, r3
- bic r1, r1, r3 /* R0=aligned end address */
- mcrne CP15_DCCIMVAC(r1) /* Clean and invalidate data cache line by VA to PoC */
-
- /* Loop, invalidating each D cache line */
-1:
- mcr CP15_DCIMVAC(r0) /* Invalidate data cache line by VA to PoC */
- add r0, r0, r2 /* R12=Next cache line */
- cmp r0, r1 /* Loop until all cache lines have been invalidate */
- blo 1b
-
- dsb
- bx lr
- .size cp15_invalidate_dcache, . - cp15_invalidate_dcache
- .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
deleted file mode 100644
index 9b5f95491e..0000000000
--- a/arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_invalidate_dcache_all.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache_all
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_invalidate_dcache_all
- *
- * Description:
- * Invalidate the entire contents of D cache.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache_all
- .type cp15_invalidate_dcache_all, function
-
-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, 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 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 */
-
- subs r1, r1, #1 /* Subtraction the way counter */
- 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/Make.defs b/arch/arm/src/armv7-r/Make.defs
index 749c0ad60f..faece6ac8b 100644
--- a/arch/arm/src/armv7-r/Make.defs
+++ b/arch/arm/src/armv7-r/Make.defs
@@ -33,16 +33,11 @@ CMN_CSRCS += arm_cache.c arm_dataabort.c arm_doirq.c arm_gicv2.c
CMN_CSRCS += arm_initialstate.c arm_prefetchabort.c
CMN_CSRCS += arm_schedulesigaction.c arm_sigdeliver.c
CMN_CSRCS += arm_syscall.c arm_tcbinfo.c arm_undefinedinsn.c
-CMN_CSRCS += arm_perf.c
+CMN_CSRCS += arm_perf.c cp15_cacheops.c
# Common C source files
-CMN_ASRCS += arm_head.S arm_vectoraddrexcptn.S
-CMN_ASRCS += arm_vectors.S cp15_cache_size.S
-CMN_ASRCS += cp15_clean_dcache_all.S cp15_clean_dcache.S
-CMN_ASRCS += cp15_coherent_dcache.S cp15_flush_dcache_all.S
-CMN_ASRCS += cp15_flush_dcache.S cp15_invalidate_dcache_all.S
-CMN_ASRCS += cp15_invalidate_dcache.S
+CMN_ASRCS += arm_head.S arm_vectoraddrexcptn.S arm_vectors.S
ifeq ($(CONFIG_ARMV7R_HAVE_PTM), y)
CMN_CSRCS += arm_timer.c
diff --git a/arch/arm/src/armv7-r/cp15_cache_size.S b/arch/arm/src/armv7-r/cp15_cache_size.S
deleted file mode 100644
index a1e6a328cc..0000000000
--- a/arch/arm/src/armv7-r/cp15_cache_size.S
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_cache_size.S
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_cache_size.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_cache_size
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_cache_size
- *
- * Description:
- * Get cp15 cache size in byte
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * Cache size in byte
- *
- ****************************************************************************/
-
- .globl cp15_cache_size
- .type cp15_cache_size, function
-
-cp15_cache_size:
-
- mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
-
- ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
- and r2, r3, r0, lsr #13 /* r2=NumSets (number of sets - 1) */
- add r2, #1
-
- ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
- and r1, r3, r0, lsr #3 /* r1=(number of ways - 1) */
- add r1, #1
-
- ldr r3,=0x7 /* Isolate the LineSize field (bits 0-2) */
- and r0, r3 /* r0=(Log2LineSize - 2) in word */
- add r0, #4 /* r0=Log2lineSize in byte */
-
- mul r2, r1, r2 /* r2=Sets*Ways */
- lsl r0, r2, r0 /* r0=Sets*Ways*LineSize */
-
- bx lr
-
- .size cp15_cache_size, . - cp15_cache_size
- .end
diff --git a/arch/arm/src/armv7-r/cp15_cacheops.c b/arch/arm/src/armv7-r/cp15_cacheops.c
new file mode 100644
index 0000000000..7938d3bd05
--- /dev/null
+++ b/arch/arm/src/armv7-r/cp15_cacheops.c
@@ -0,0 +1,245 @@
+/****************************************************************************
+ * arch/arm/src/armv7-r/cp15_cacheops.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/cache.h>
+#include <nuttx/irq.h>
+
+#include "cp15_cacheops.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define CP15_CACHE_INVALIDATE 0
+#define CP15_CACHE_CLEAN 1
+#define CP15_CACHE_CLEANINVALIDATE 2
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline uint32_t ilog2(uint32_t u)
+{
+ int i = 0;
+
+ while (u >>= 1)
+ {
+ i++;
+ }
+
+ return i;
+}
+
+static inline uint32_t cp15_cache_get_info(uint32_t *sets, uint32_t *ways)
+{
+ uint32_t ccsidr = CP15_GET(CCSIDR);
+
+ if (sets)
+ {
+ *sets = ((ccsidr >> 13) & 0x7fff) + 1;
+ }
+
+ if (ways)
+ {
+ *ways = ((ccsidr >> 3) & 0x3ff) + 1;
+ }
+
+ return (1 << ((ccsidr & 0x7) + 2)) * 4;
+}
+
+static void cp15_dcache_op_level(uint32_t level, int op)
+{
+ uint32_t sets;
+ uint32_t ways;
+ uint32_t set;
+ uint32_t way;
+ uint32_t line;
+ uint32_t way_shift;
+ uint32_t set_shift;
+ uint32_t val = level << 1;
+
+ /* Select by CSSELR */
+
+ CP15_SET(CSSELR, val);
+
+ /* Get cache info */
+
+ line = cp15_cache_get_info(&sets, &ways);
+
+ way_shift = 32 - ilog2(ways);
+ set_shift = ilog2(line);
+
+ ARM_DSB();
+
+ /* A: Log2(ways)
+ * B: L+S
+ * L: Log2(line)
+ * S: Log2(sets)
+ *
+ * The bits are packed as follows:
+ * 31 31-A B B-1 L L-1 4 3 1 0
+ * |---|-------------|--------|-------|-----|-|
+ * |Way| zeros | Set | zeros |level|0|
+ * |---|-------------|--------|-------|-----|-|
+ */
+
+ for (way = 0; way < ways; way++)
+ {
+ for (set = 0; set < sets; set++)
+ {
+ val = level << 1;
+ val |= way << way_shift;
+ val |= set << set_shift;
+
+ switch (op)
+ {
+ case CP15_CACHE_INVALIDATE:
+ cp15_invalidate_dcacheline_bysetway(val);
+ break;
+ case CP15_CACHE_CLEAN:
+ cp15_clean_dcache_bysetway(val);
+ break;
+ case CP15_CACHE_CLEANINVALIDATE:
+ cp15_cleaninvalidate_dcacheline(val);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ ARM_ISB();
+}
+
+static void cp15_dcache_op(int op)
+{
+ uint32_t clidr = CP15_GET(CLIDR);
+ int level;
+
+ for (level = 0; level < 7; level++)
+ {
+ uint32_t ctype = clidr & 0x7;
+
+ switch (ctype)
+ {
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ cp15_dcache_op_level(level, op);
+ break;
+ default:
+ break;
+ }
+
+ clidr >>= 3;
+ if (clidr == 0)
+ {
+ break;
+ }
+ }
+}
+
+static void cp15_dcache_op_mva(uintptr_t start, uintptr_t end, int op)
+{
+ uint32_t line;
+
+ line = cp15_cache_get_info(NULL, NULL);
+ start &= ~(line - 1);
+
+ ARM_DSB();
+
+ while (start < end)
+ {
+ switch (op)
+ {
+ case CP15_CACHE_INVALIDATE:
+ cp15_invalidate_dcacheline_bymva(start);
+ break;
+ case CP15_CACHE_CLEAN:
+ cp15_clean_dcache_bymva(start);
+ break;
+ case CP15_CACHE_CLEANINVALIDATE:
+ cp15_cleaninvalidate_dcacheline_bymva(start);
+ break;
+ default:
+ break;
+ }
+
+ start += line;
+ }
+
+ ARM_ISB();
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void cp15_coherent_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_CLEANINVALIDATE);
+ cp15_invalidate_icache();
+}
+
+void cp15_invalidate_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_INVALIDATE);
+}
+
+void cp15_invalidate_dcache_all(void)
+{
+ cp15_dcache_op(CP15_CACHE_INVALIDATE);
+}
+
+void cp15_clean_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_CLEAN);
+}
+
+void cp15_clean_dcache_all(void)
+{
+ cp15_dcache_op(CP15_CACHE_CLEAN);
+}
+
+void cp15_flush_dcache(uintptr_t start, uintptr_t end)
+{
+ cp15_dcache_op_mva(start, end, CP15_CACHE_CLEANINVALIDATE);
+}
+
+void cp15_flush_dcache_all(void)
+{
+ cp15_dcache_op(CP15_CACHE_CLEANINVALIDATE);
+}
+
+uint32_t cp15_cache_size(void)
+{
+ uint32_t sets;
+ uint32_t ways;
+ uint32_t line;
+
+ line = cp15_cache_get_info(&sets, &ways);
+
+ return sets * ways * line;
+}
diff --git a/arch/arm/src/armv7-r/cp15_clean_dcache.S b/arch/arm/src/armv7-r/cp15_clean_dcache.S
deleted file mode 100644
index 71a9534d8e..0000000000
--- a/arch/arm/src/armv7-r/cp15_clean_dcache.S
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_clean_dcache.S
- *
- * Copyright (C) 2015 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_clean_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_clean_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_clean_dcache
- *
- * Description:
- * Clean the data cache within the specified region by flushing the
- * contents of the data cache to memory.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_clean_dcache
- .type cp15_clean_dcache, function
-
-cp15_clean_dcache:
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r0, r0, r3 /* R0=aligned start address */
-
- /* Loop, cleaning each cache line by writing its contents to memory */
-
-1:
- mcr CP15_DCCMVAC(r0) /* Clean data cache line to PoC by VA */
- add r0, r0, r2 /* R12=Next cache line */
- cmp r0, r1 /* Loop until all cache lines have been cleaned */
- blo 1b
-
- dsb
- bx lr
- .size cp15_clean_dcache, . - cp15_clean_dcache
- .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
deleted file mode 100644
index 4a08dfbc70..0000000000
--- a/arch/arm/src/armv7-r/cp15_clean_dcache_all.S
+++ /dev/null
@@ -1,129 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_clean_dcache_all.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_clean_dcache_all.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_clean_dcache_all
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_clean_dcache_all
- *
- * Description:
- * clean the entire contents of D cache.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_clean_dcache_all
- .type cp15_clean_dcache_all, function
-
-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, 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 */
- mcr CP15_DCCSW(r2) /* Data Cache Clean by Set/Way */
- subs r3, r3, #1 /* Subtraction set counter */
- bcs set_loop /* Keep looping if not */
-
- subs r1, r1, #1 /* Subtraction the way counter */
- 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_coherent_dcache.S b/arch/arm/src/armv7-r/cp15_coherent_dcache.S
deleted file mode 100644
index cb4589452b..0000000000
--- a/arch/arm/src/armv7-r/cp15_coherent_dcache.S
+++ /dev/null
@@ -1,140 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_coherent_dcache.S
- *
- * Copyright (C) 2015, 2017 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_coherent_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_coherent_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_coherent_dcache
- *
- * Description:
- * Ensure that the I and D caches are coherent within specified region
- * by cleaning the D cache (i.e., flushing the D cache contents to memory
- * and invalidating the I cache. This is typically used when code has been
- * written to a memory region, and will be executed.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_coherent_dcache
- .type cp15_coherent_dcache, function
-
-cp15_coherent_dcache:
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r12, r0, r3 /* R12=aligned start address */
-
- /* Loop, flushing each D cache line to memory */
-1:
- mcr CP15_DCCMVAU(r12) /* Clean data or unified cache line by VA to PoU */
- add r12, r12, r2 /* R12=Next cache line */
- cmp r12, r1 /* Loop until all cache lines have been cleaned */
- blo 1b
-
- dsb
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- and r3, r3, #0xf /* Isolate the IminLine field */
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r12, r0, r3 /* R12=aligned start address */
-
- /* Loop, invalidating each I cache line to memory */
-1:
- mcr CP15_ICIMVAU(r12) /* Invalidate instruction cache by VA to PoU */
- add r12, r12, r2 /* R12=Next cache line */
- cmp r12, r1 /* Loop until all cache lines have been invalidated */
- blo 1b
-
- mov r0, #0
-#ifdef CONFIG_SMP
- mcr CP15_BPIALLIS(r0) /* Invalidate entire branch predictor array Inner Shareable */
-#endif
- mcr CP15_BPIALL(r0) /* Invalidate all branch predictors */
-
- dsb
- isb
- bx lr
- .size cp15_coherent_dcache, . - cp15_coherent_dcache
- .end
diff --git a/arch/arm/src/armv7-r/cp15_flush_dcache.S b/arch/arm/src/armv7-r/cp15_flush_dcache.S
deleted file mode 100644
index 2bdc4e5474..0000000000
--- a/arch/arm/src/armv7-r/cp15_flush_dcache.S
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_flush_dcache.S
- *
- * Copyright (C) 2015, 2018 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_flush_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_flush_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_flush_dcache
- *
- * Description:
- * Flush the data cache within the specified region by cleaning and
- * invalidating the D cache.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_flush_dcache
- .type cp15_flush_dcache, function
-
-cp15_flush_dcache:
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- bic r0, r0, r3 /* R0=aligned start address */
-
- /* Loop, cleaning and invaliding each D cache line in the address range */
-
-1:
- mcr CP15_DCCIMVAC(r0) /* Clean and invalidate data cache line by VA to PoC */
- add r0, r0, r2 /* R12=Next cache line */
- cmp r0, r1 /* Loop until all cache lines have been cleaned */
- blo 1b
-
- dsb
- bx lr
- .size cp15_flush_dcache, . - cp15_flush_dcache
- .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
deleted file mode 100644
index 747d12271d..0000000000
--- a/arch/arm/src/armv7-r/cp15_flush_dcache_all.S
+++ /dev/null
@@ -1,129 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_flush_dcache_all.S
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_flush_dcache_all.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_flush_dcache_all
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_flush_dcache_all
- *
- * Description:
- * Flush the entire contents of D cache.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_flush_dcache_all
- .type cp15_flush_dcache_all, function
-
-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, 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 */
- 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 */
-
- subs r1, r1, #1 /* Subtraction the way counter */
- 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.S b/arch/arm/src/armv7-r/cp15_invalidate_dcache.S
deleted file mode 100644
index 67d11603c8..0000000000
--- a/arch/arm/src/armv7-r/cp15_invalidate_dcache.S
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_invalidate_dcache.S
- *
- * Copyright (C) 2015 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_invalidate_dcache.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_invalidate_dcache
- *
- * Description:
- * Invalidate the data cache within the specified region; we will be
- * performing a DMA operation in this region and we want to purge old data
- * in the cache.
- *
- * Input Parameters:
- * start - virtual start address of region
- * end - virtual end address of region + 1
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache
- .type cp15_invalidate_dcache, function
-
-cp15_invalidate_dcache:
-
- mrc CP15_CTR(r3) /* Read the Cache Type Register */
- lsr r3, r3, #16 /* Isolate the DMinLine field */
- and r3, r3, #0xf
- mov r2, #4
- mov r2, r2, lsl r3 /* Get the cache line size in bytes */
-
- sub r3, r2, #1 /* R3=Cache line size mask */
- tst r0, r3
- bic r0, r0, r3 /* R0=aligned start address */
-
- mcrne CP15_DCCIMVAC(r0) /* Clean and invalidate data cache line by VA to PoC */
-
- tst r1, r3
- bic r1, r1, r3 /* R0=aligned end address */
- mcrne CP15_DCCIMVAC(r1) /* Clean and invalidate data cache line by VA to PoC */
-
- /* Loop, invalidating each D cache line */
-1:
- mcr CP15_DCIMVAC(r0) /* Invalidate data cache line by VA to PoC */
- add r0, r0, r2 /* R12=Next cache line */
- cmp r0, r1 /* Loop until all cache lines have been invalidate */
- blo 1b
-
- dsb
- bx lr
- .size cp15_invalidate_dcache, . - cp15_invalidate_dcache
- .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
deleted file mode 100644
index 399e8cf8e2..0000000000
--- a/arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
- * arch/arm/src/armv7-r/cp15_invalidate_dcache_all.S
- *
- * Copyright (C) 2015 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Portions of this file derive from Atmel sample code for the SAMA5D3
- * Cortex-A5 which also has a modified BSD-style license:
- *
- * Copyright (c) 2012, Atmel Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor Atmel nor the names of the contributors may
- * be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/* References:
- *
- * "Cortex-A5 MPCore, Technical Reference Manual", Revision: r0p1,
- * Copyright (c) 2010 ARM. All rights reserved. ARM DDI 0434B (ID101810)
- * "ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition",
- * Copyright (c) 1996-1998, 2000, 2004-2012 ARM. All rights reserved. ARM
- * DDI 0406C.b (ID072512)
- */
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include "cp15.h"
-
- .file "cp15_invalidate_dcache_all.S"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Symbols
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache_all
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
- .text
-
-/****************************************************************************
- * Name: cp15_invalidate_dcache_all
- *
- * Description:
- * Invalidate the entire contents of D cache.
- *
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
- .globl cp15_invalidate_dcache_all
- .type cp15_invalidate_dcache_all, function
-
-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, 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 */
- mcr CP15_DCISW(r2) /* Data Cache Invalidate by Set/Way */
- subs r3, r3, #1 /* Subtraction set counter */
- bcs set_loop /* Keep looping if not */
-
- subs r1, r1, #1 /* Subtraction the way counter */
- bcs way_loop /* Keep looping if not */
-
- dsb
- pop {r4, r5}
- bx lr
- .size cp15_invalidate_dcache_all, . - cp15_invalidate_dcache_all
- .end