xref: /nrf52832-nimble/rt-thread/libcpu/mips/common/mips_cache.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : mips_cache.c
3*10465441SEvalZero  * This file is part of RT-Thread RTOS
4*10465441SEvalZero  * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
5*10465441SEvalZero  *
6*10465441SEvalZero  *  This program is free software; you can redistribute it and/or modify
7*10465441SEvalZero  *  it under the terms of the GNU General Public License as published by
8*10465441SEvalZero  *  the Free Software Foundation; either version 2 of the License, or
9*10465441SEvalZero  *  (at your option) any later version.
10*10465441SEvalZero  *
11*10465441SEvalZero  *  This program is distributed in the hope that it will be useful,
12*10465441SEvalZero  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*10465441SEvalZero  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*10465441SEvalZero  *  GNU General Public License for more details.
15*10465441SEvalZero  *
16*10465441SEvalZero  *  You should have received a copy of the GNU General Public License along
17*10465441SEvalZero  *  with this program; if not, write to the Free Software Foundation, Inc.,
18*10465441SEvalZero  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19*10465441SEvalZero  *
20*10465441SEvalZero  * Change Logs:
21*10465441SEvalZero  * Date           Author       Notes
22*10465441SEvalZero  * 2016��9��7��     Urey         the first version
23*10465441SEvalZero  */
24*10465441SEvalZero 
25*10465441SEvalZero #include <rtthread.h>
26*10465441SEvalZero #include "mips.h"
27*10465441SEvalZero 
28*10465441SEvalZero extern void cache_init(rt_ubase_t cache_size, rt_ubase_t cache_line_size);
r4k_cache_init(void)29*10465441SEvalZero void r4k_cache_init(void)
30*10465441SEvalZero {
31*10465441SEvalZero //	cache_init(dcache_size, cpu_dcache_line_size);
32*10465441SEvalZero }
33*10465441SEvalZero 
r4k_cache_flush_all(void)34*10465441SEvalZero void r4k_cache_flush_all(void)
35*10465441SEvalZero {
36*10465441SEvalZero     blast_dcache16();
37*10465441SEvalZero     blast_icache16();
38*10465441SEvalZero }
39*10465441SEvalZero 
40*10465441SEvalZero 
r4k_icache_flush_all(void)41*10465441SEvalZero void r4k_icache_flush_all(void)
42*10465441SEvalZero {
43*10465441SEvalZero     blast_icache16();
44*10465441SEvalZero }
45*10465441SEvalZero 
r4k_icache_flush_range(rt_ubase_t addr,rt_ubase_t size)46*10465441SEvalZero void r4k_icache_flush_range(rt_ubase_t addr, rt_ubase_t size)
47*10465441SEvalZero {
48*10465441SEvalZero 	rt_ubase_t end, a;
49*10465441SEvalZero 
50*10465441SEvalZero     if (size > g_mips_core.icache_size)
51*10465441SEvalZero     {
52*10465441SEvalZero         blast_icache16();
53*10465441SEvalZero     }
54*10465441SEvalZero     else
55*10465441SEvalZero     {
56*10465441SEvalZero     	rt_ubase_t ic_lsize = g_mips_core.icache_line_size;
57*10465441SEvalZero 
58*10465441SEvalZero         a = addr & ~(ic_lsize - 1);
59*10465441SEvalZero         end = ((addr + size) - 1) & ~(ic_lsize - 1);
60*10465441SEvalZero         while (1)
61*10465441SEvalZero         {
62*10465441SEvalZero             flush_icache_line(a);
63*10465441SEvalZero             if (a == end)
64*10465441SEvalZero                 break;
65*10465441SEvalZero             a += ic_lsize;
66*10465441SEvalZero         }
67*10465441SEvalZero     }
68*10465441SEvalZero }
69*10465441SEvalZero 
r4k_icache_lock_range(rt_ubase_t addr,rt_ubase_t size)70*10465441SEvalZero void r4k_icache_lock_range(rt_ubase_t addr, rt_ubase_t size)
71*10465441SEvalZero {
72*10465441SEvalZero 	rt_ubase_t end, a;
73*10465441SEvalZero 	rt_ubase_t ic_lsize = g_mips_core.icache_line_size;
74*10465441SEvalZero 
75*10465441SEvalZero     a = addr & ~(ic_lsize - 1);
76*10465441SEvalZero     end = ((addr + size) - 1) & ~(ic_lsize - 1);
77*10465441SEvalZero     while (1)
78*10465441SEvalZero     {
79*10465441SEvalZero         lock_icache_line(a);
80*10465441SEvalZero         if (a == end)
81*10465441SEvalZero             break;
82*10465441SEvalZero         a += ic_lsize;
83*10465441SEvalZero     }
84*10465441SEvalZero }
85*10465441SEvalZero 
r4k_dcache_inv(rt_ubase_t addr,rt_ubase_t size)86*10465441SEvalZero void r4k_dcache_inv(rt_ubase_t addr, rt_ubase_t size)
87*10465441SEvalZero {
88*10465441SEvalZero 	rt_ubase_t end, a;
89*10465441SEvalZero     rt_ubase_t dc_lsize = g_mips_core.dcache_line_size;
90*10465441SEvalZero 
91*10465441SEvalZero     a = addr & ~(dc_lsize - 1);
92*10465441SEvalZero     end = ((addr + size) - 1) & ~(dc_lsize - 1);
93*10465441SEvalZero     while (1)
94*10465441SEvalZero     {
95*10465441SEvalZero         invalidate_dcache_line(a);
96*10465441SEvalZero         if (a == end)
97*10465441SEvalZero             break;
98*10465441SEvalZero         a += dc_lsize;
99*10465441SEvalZero     }
100*10465441SEvalZero }
101*10465441SEvalZero 
r4k_dcache_wback_inv(rt_ubase_t addr,rt_ubase_t size)102*10465441SEvalZero void r4k_dcache_wback_inv(rt_ubase_t addr, rt_ubase_t size)
103*10465441SEvalZero {
104*10465441SEvalZero 	rt_ubase_t end, a;
105*10465441SEvalZero 
106*10465441SEvalZero     if (size >= g_mips_core.dcache_size)
107*10465441SEvalZero     {
108*10465441SEvalZero         blast_dcache16();
109*10465441SEvalZero     }
110*10465441SEvalZero     else
111*10465441SEvalZero     {
112*10465441SEvalZero     	rt_ubase_t dc_lsize = g_mips_core.dcache_line_size;
113*10465441SEvalZero 
114*10465441SEvalZero         a = addr & ~(dc_lsize - 1);
115*10465441SEvalZero         end = ((addr + size) - 1) & ~(dc_lsize - 1);
116*10465441SEvalZero         while (1)
117*10465441SEvalZero         {
118*10465441SEvalZero             flush_dcache_line(a);
119*10465441SEvalZero             if (a == end)
120*10465441SEvalZero                 break;
121*10465441SEvalZero             a += dc_lsize;
122*10465441SEvalZero         }
123*10465441SEvalZero     }
124*10465441SEvalZero }
125*10465441SEvalZero 
126*10465441SEvalZero #define dma_cache_wback_inv(start,size) \
127*10465441SEvalZero     do { (void) (start); (void) (size); } while (0)
128*10465441SEvalZero #define dma_cache_wback(start,size) \
129*10465441SEvalZero     do { (void) (start); (void) (size); } while (0)
130*10465441SEvalZero #define dma_cache_inv(start,size)   \
131*10465441SEvalZero     do { (void) (start); (void) (size); } while (0)
132*10465441SEvalZero 
133*10465441SEvalZero 
r4k_dma_cache_sync(rt_ubase_t addr,rt_size_t size,enum dma_data_direction direction)134*10465441SEvalZero void r4k_dma_cache_sync(rt_ubase_t addr, rt_size_t size, enum dma_data_direction direction)
135*10465441SEvalZero {
136*10465441SEvalZero     switch (direction)
137*10465441SEvalZero     {
138*10465441SEvalZero         case DMA_TO_DEVICE:
139*10465441SEvalZero             r4k_dcache_wback_inv(addr, size);
140*10465441SEvalZero         break;
141*10465441SEvalZero 
142*10465441SEvalZero         case DMA_FROM_DEVICE:
143*10465441SEvalZero             r4k_dcache_wback_inv(addr, size);
144*10465441SEvalZero         break;
145*10465441SEvalZero 
146*10465441SEvalZero         case DMA_BIDIRECTIONAL:
147*10465441SEvalZero             dma_cache_wback_inv(addr, size);
148*10465441SEvalZero         break;
149*10465441SEvalZero         default:
150*10465441SEvalZero             RT_ASSERT(0) ;
151*10465441SEvalZero     }
152*10465441SEvalZero }
153*10465441SEvalZero 
154