1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2011-09-15 Bernard first version
9*10465441SEvalZero */
10*10465441SEvalZero
11*10465441SEvalZero #include <rthw.h>
12*10465441SEvalZero #include <rtthread.h>
13*10465441SEvalZero #include "am33xx.h"
14*10465441SEvalZero
15*10465441SEvalZero /**
16*10465441SEvalZero * @addtogroup AM33xx
17*10465441SEvalZero */
18*10465441SEvalZero /*@{*/
19*10465441SEvalZero
20*10465441SEvalZero #define ICACHE_MASK (rt_uint32_t)(1 << 12)
21*10465441SEvalZero #define DCACHE_MASK (rt_uint32_t)(1 << 2)
22*10465441SEvalZero
23*10465441SEvalZero #if defined(__CC_ARM)
cp15_rd(void)24*10465441SEvalZero rt_inline rt_uint32_t cp15_rd(void)
25*10465441SEvalZero {
26*10465441SEvalZero rt_uint32_t i;
27*10465441SEvalZero
28*10465441SEvalZero __asm
29*10465441SEvalZero {
30*10465441SEvalZero mrc p15, 0, i, c1, c0, 0
31*10465441SEvalZero }
32*10465441SEvalZero
33*10465441SEvalZero return i;
34*10465441SEvalZero }
35*10465441SEvalZero
cache_enable(rt_uint32_t bit)36*10465441SEvalZero rt_inline void cache_enable(rt_uint32_t bit)
37*10465441SEvalZero {
38*10465441SEvalZero rt_uint32_t value;
39*10465441SEvalZero
40*10465441SEvalZero __asm
41*10465441SEvalZero {
42*10465441SEvalZero mrc p15, 0, value, c1, c0, 0
43*10465441SEvalZero orr value, value, bit
44*10465441SEvalZero mcr p15, 0, value, c1, c0, 0
45*10465441SEvalZero }
46*10465441SEvalZero }
47*10465441SEvalZero
cache_disable(rt_uint32_t bit)48*10465441SEvalZero rt_inline void cache_disable(rt_uint32_t bit)
49*10465441SEvalZero {
50*10465441SEvalZero rt_uint32_t value;
51*10465441SEvalZero
52*10465441SEvalZero __asm
53*10465441SEvalZero {
54*10465441SEvalZero mrc p15, 0, value, c1, c0, 0
55*10465441SEvalZero bic value, value, bit
56*10465441SEvalZero mcr p15, 0, value, c1, c0, 0
57*10465441SEvalZero }
58*10465441SEvalZero }
59*10465441SEvalZero #elif defined(__GNUC__)
cp15_rd(void)60*10465441SEvalZero rt_inline rt_uint32_t cp15_rd(void)
61*10465441SEvalZero {
62*10465441SEvalZero rt_uint32_t i;
63*10465441SEvalZero
64*10465441SEvalZero asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));
65*10465441SEvalZero return i;
66*10465441SEvalZero }
67*10465441SEvalZero
cache_enable(rt_uint32_t bit)68*10465441SEvalZero rt_inline void cache_enable(rt_uint32_t bit)
69*10465441SEvalZero {
70*10465441SEvalZero __asm__ __volatile__( \
71*10465441SEvalZero "mrc p15,0,r0,c1,c0,0\n\t" \
72*10465441SEvalZero "orr r0,r0,%0\n\t" \
73*10465441SEvalZero "mcr p15,0,r0,c1,c0,0" \
74*10465441SEvalZero : \
75*10465441SEvalZero :"r" (bit) \
76*10465441SEvalZero :"memory");
77*10465441SEvalZero }
78*10465441SEvalZero
cache_disable(rt_uint32_t bit)79*10465441SEvalZero rt_inline void cache_disable(rt_uint32_t bit)
80*10465441SEvalZero {
81*10465441SEvalZero __asm__ __volatile__( \
82*10465441SEvalZero "mrc p15,0,r0,c1,c0,0\n\t" \
83*10465441SEvalZero "bic r0,r0,%0\n\t" \
84*10465441SEvalZero "mcr p15,0,r0,c1,c0,0" \
85*10465441SEvalZero : \
86*10465441SEvalZero :"r" (bit) \
87*10465441SEvalZero :"memory");
88*10465441SEvalZero }
89*10465441SEvalZero #endif
90*10465441SEvalZero
91*10465441SEvalZero
92*10465441SEvalZero #if defined(__CC_ARM)|(__GNUC__)
93*10465441SEvalZero /**
94*10465441SEvalZero * enable I-Cache
95*10465441SEvalZero *
96*10465441SEvalZero */
rt_hw_cpu_icache_enable()97*10465441SEvalZero void rt_hw_cpu_icache_enable()
98*10465441SEvalZero {
99*10465441SEvalZero cache_enable(ICACHE_MASK);
100*10465441SEvalZero }
101*10465441SEvalZero
102*10465441SEvalZero /**
103*10465441SEvalZero * disable I-Cache
104*10465441SEvalZero *
105*10465441SEvalZero */
rt_hw_cpu_icache_disable()106*10465441SEvalZero void rt_hw_cpu_icache_disable()
107*10465441SEvalZero {
108*10465441SEvalZero cache_disable(ICACHE_MASK);
109*10465441SEvalZero }
110*10465441SEvalZero
111*10465441SEvalZero /**
112*10465441SEvalZero * return the status of I-Cache
113*10465441SEvalZero *
114*10465441SEvalZero */
rt_hw_cpu_icache_status()115*10465441SEvalZero rt_base_t rt_hw_cpu_icache_status()
116*10465441SEvalZero {
117*10465441SEvalZero return (cp15_rd() & ICACHE_MASK);
118*10465441SEvalZero }
119*10465441SEvalZero
120*10465441SEvalZero /**
121*10465441SEvalZero * enable D-Cache
122*10465441SEvalZero *
123*10465441SEvalZero */
rt_hw_cpu_dcache_enable()124*10465441SEvalZero void rt_hw_cpu_dcache_enable()
125*10465441SEvalZero {
126*10465441SEvalZero cache_enable(DCACHE_MASK);
127*10465441SEvalZero }
128*10465441SEvalZero
129*10465441SEvalZero /**
130*10465441SEvalZero * disable D-Cache
131*10465441SEvalZero *
132*10465441SEvalZero */
rt_hw_cpu_dcache_disable()133*10465441SEvalZero void rt_hw_cpu_dcache_disable()
134*10465441SEvalZero {
135*10465441SEvalZero cache_disable(DCACHE_MASK);
136*10465441SEvalZero }
137*10465441SEvalZero
138*10465441SEvalZero /**
139*10465441SEvalZero * return the status of D-Cache
140*10465441SEvalZero *
141*10465441SEvalZero */
rt_hw_cpu_dcache_status()142*10465441SEvalZero rt_base_t rt_hw_cpu_dcache_status()
143*10465441SEvalZero {
144*10465441SEvalZero return (cp15_rd() & DCACHE_MASK);
145*10465441SEvalZero }
146*10465441SEvalZero #endif
147*10465441SEvalZero
148*10465441SEvalZero /**
149*10465441SEvalZero * shutdown CPU
150*10465441SEvalZero *
151*10465441SEvalZero */
rt_hw_cpu_shutdown()152*10465441SEvalZero void rt_hw_cpu_shutdown()
153*10465441SEvalZero {
154*10465441SEvalZero rt_uint32_t level;
155*10465441SEvalZero rt_kprintf("shutdown...\n");
156*10465441SEvalZero
157*10465441SEvalZero level = rt_hw_interrupt_disable();
158*10465441SEvalZero while (level)
159*10465441SEvalZero {
160*10465441SEvalZero RT_ASSERT(0);
161*10465441SEvalZero }
162*10465441SEvalZero }
163*10465441SEvalZero
164*10465441SEvalZero /*@}*/
165