xref: /nrf52832-nimble/rt-thread/libcpu/arm/am335x/cpu.c (revision 104654410c56c573564690304ae786df310c91fc)
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