Mercurial > ecos
annotate packages/hal/mips/arch/current/include/hal_cache.h @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | 6b5f480c6929 |
| children | d2c90368aeef |
| rev | line source |
|---|---|
| 0 | 1 #ifndef CYGONCE_HAL_CACHE_H |
| 2 #define CYGONCE_HAL_CACHE_H | |
| 3 | |
| 4 //============================================================================= | |
| 5 // | |
| 2 | 6 // hal_cache.h |
| 0 | 7 // |
| 2 | 8 // HAL cache control API |
| 0 | 9 // |
| 10 //============================================================================= | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
11 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
12 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
13 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
15 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
16 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
17 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
18 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
19 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
22 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
23 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
24 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
25 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
26 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
28 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
29 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
30 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
31 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
32 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
33 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
34 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
36 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
37 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
38 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
40 // at http://sources.redhat.com/ecos/ecos-license |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
41 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
42 //####ECOSGPLCOPYRIGHTEND#### |
| 0 | 43 //============================================================================= |
| 44 //#####DESCRIPTIONBEGIN#### | |
| 45 // | |
| 2 | 46 // Author(s): nickg |
| 47 // Contributors: nickg | |
| 48 // Date: 1998-02-17 | |
| 49 // Purpose: Cache control API | |
| 50 // Description: The macros defined here provide the HAL APIs for handling | |
| 0 | 51 // cache control operations. |
| 52 // Usage: | |
| 2 | 53 // #include <cyg/hal/hal_cache.h> |
| 54 // ... | |
| 55 // | |
| 0 | 56 // |
| 57 //####DESCRIPTIONEND#### | |
| 58 // | |
| 59 //============================================================================= | |
| 60 | |
| 2 | 61 #include <pkgconf/hal.h> |
| 0 | 62 #include <cyg/infra/cyg_type.h> |
| 63 | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
64 #include <cyg/hal/var_cache.h> |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
65 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
66 // Use this macro to allow the assembler to accept "cache" instructions, |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
67 // which are MIPS ISA 3. This is useful if someone is compiling |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
68 // with -mips2, but the architecture is really MIPS ISA 3. |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
69 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
66
diff
changeset
|
70 #define _hal_asm_mips_cpp_stringize( _x_ ) #_x_ |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
66
diff
changeset
|
71 #define _HAL_ASM_SET_MIPS_ISA( _isal_ ) asm volatile ( \ |
|
121
6bd9d475ed4b
Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents:
92
diff
changeset
|
72 ".set mips" _hal_asm_mips_cpp_stringize(_isal_) ) |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
73 |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
74 |
| 0 | 75 //============================================================================= |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
76 // Default Implementation. This uses the standard MIPS CP0 registers and |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
77 // cache instructions. Note that not all variants will have all of the |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
78 // functionality defined here. |
| 0 | 79 |
| 80 //----------------------------------------------------------------------------- | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
81 // Cache dimensions. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
82 // These really should be defined in var_cache.h. If they are not, then provide |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
83 // a set of numbers that are typical of many variants. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
84 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
85 #ifndef HAL_DCACHE_SIZE |
| 0 | 86 |
| 87 // Data cache | |
| 88 #define HAL_DCACHE_SIZE 4096 // Size of data cache in bytes | |
| 89 #define HAL_DCACHE_LINE_SIZE 16 // Size of a data cache line | |
| 90 #define HAL_DCACHE_WAYS 2 // Associativity of the cache | |
| 91 | |
| 92 // Instruction cache | |
| 93 #define HAL_ICACHE_SIZE 4096 // Size of cache in bytes | |
| 94 #define HAL_ICACHE_LINE_SIZE 16 // Size of a cache line | |
| 95 #define HAL_ICACHE_WAYS 2 // Associativity of the cache | |
| 96 | |
| 97 #define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS)) | |
| 98 #define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS)) | |
| 99 | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
100 #endif |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
101 |
| 0 | 102 //----------------------------------------------------------------------------- |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
103 // Cache instruction uses LSBs or MSBs (depending on the |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
104 // implementation) of the virtual address to specify which WAY to |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
105 // affect. The _ALL_WAYS macro defines the necessary cache instructions |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
106 // to affect all ways. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
107 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
108 #ifdef HAL_MIPS_CACHE_INSN_USES_LSB |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
109 # define _IWAY(_n_) ((_n_)*HAL_ICACHE_SIZE/HAL_ICACHE_WAYS+(_n_)) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
110 # define _DWAY(_n_) ((_n_)*HAL_DCACHE_SIZE/HAL_DCACHE_WAYS+(_n_)) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
111 #else |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
112 # define _IWAY(_n_) ((_n_)*HAL_ICACHE_SIZE/HAL_ICACHE_WAYS) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
113 # define _DWAY(_n_) ((_n_)*HAL_DCACHE_SIZE/HAL_DCACHE_WAYS) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
114 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
115 |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
116 #if (HAL_DCACHE_WAYS == 1) |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
117 #define _HAL_ASM_DCACHE_ALL_WAYS( _cmd_ , _addr_ ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
118 asm volatile ("cache %0,0(%1);" \ |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
121
diff
changeset
|
119 : : "I" ((_cmd_) | 1), "r"(_addr_) ) |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
120 #elif (HAL_DCACHE_WAYS == 2) |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
121 #define _HAL_ASM_DCACHE_ALL_WAYS( _cmd_ , _addr_ ) \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
122 asm volatile ("cache %0,0(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
123 "cache %0,%2(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
124 : : "I" ((_cmd_) | 1), "r"(_addr_), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
125 "I" (_DWAY(1))) |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
126 #elif (HAL_DCACHE_WAYS == 4) |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
127 #define _HAL_ASM_DCACHE_ALL_WAYS( _cmd_ , _addr_ ) \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
128 asm volatile ("cache %0,0(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
129 "cache %0,%2(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
130 "cache %0,%3(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
131 "cache %0,%4(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
132 : : "I" ((_cmd_) | 1), "r"(_addr_), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
133 "I" (_DWAY(1)), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
134 "I" (_DWAY(2)), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
135 "I" (_DWAY(3))) |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
136 #else |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
137 # error "Unsupported number of ways" |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
138 #endif |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
139 |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
140 #if (HAL_ICACHE_WAYS == 1) |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
141 #define _HAL_ASM_ICACHE_ALL_WAYS( _cmd_ , _addr_ ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
142 asm volatile ("cache %0,0(%1);" \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
143 : : "I" (_cmd_), "r"(_addr_) ) |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
144 #elif (HAL_ICACHE_WAYS == 2) |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
145 #define _HAL_ASM_ICACHE_ALL_WAYS( _cmd_ , _addr_ ) \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
146 asm volatile ("cache %0,0(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
147 "cache %0,%2(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
148 : : "I" (_cmd_), "r"(_addr_), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
149 "I" (_IWAY(1))) |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
150 #elif (HAL_ICACHE_WAYS == 4) |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
151 #define _HAL_ASM_ICACHE_ALL_WAYS( _cmd_ , _addr_ ) \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
152 asm volatile ("cache %0,0(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
153 "cache %0,%2(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
154 "cache %0,%3(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
155 "cache %0,%4(%1);" \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
156 : : "I" (_cmd_), "r"(_addr_), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
157 "I" (_IWAY(1)), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
158 "I" (_IWAY(2)), \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
124
diff
changeset
|
159 "I" (_IWAY(3))) |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
160 #else |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
161 # error "Unsupported number of ways" |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
162 #endif |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
163 |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
164 //----------------------------------------------------------------------------- |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
165 // Size adjustment |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
166 // These macros adjust the size argument up to a whole multiple of the |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
167 // cache line size. This ensures that we apply the cache operation to |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
168 // all cache lines covered by the address[size] arguments in the |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
169 // macros below. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
170 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
171 #define HAL_DCACHE_ADJUST_SIZE(_size_) \ |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
172 (((_size_)+HAL_DCACHE_LINE_SIZE-1) & ~(HAL_DCACHE_LINE_SIZE-1)) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
173 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
174 #define HAL_ICACHE_ADJUST_SIZE(_size_) \ |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
175 (((_size_)+HAL_ICACHE_LINE_SIZE-1) & ~(HAL_ICACHE_LINE_SIZE-1)) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
176 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
177 //----------------------------------------------------------------------------- |
| 0 | 178 // Global control of data cache |
| 179 | |
| 180 // Enable the data cache | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
181 // There is no default mechanism for enabling or disabling the caches. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
182 #ifndef HAL_DCACHE_ENABLE_DEFINED |
| 0 | 183 #define HAL_DCACHE_ENABLE() |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
184 #endif |
| 0 | 185 |
| 186 // Disable the data cache | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
187 #ifndef HAL_DCACHE_DISABLE_DEFINED |
| 0 | 188 #define HAL_DCACHE_DISABLE() |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
189 #endif |
| 0 | 190 |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
191 #ifndef HAL_DCACHE_IS_ENABLED_DEFINED |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
192 #define HAL_DCACHE_IS_ENABLED(_state_) (_state_) = 1; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
193 #endif |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
194 |
| 0 | 195 // Invalidate the entire cache |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
196 // We simply use HAL_DCACHE_SYNC() to do this. For writeback caches this |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
197 // is not quite what we want, but there is no index-invalidate operation |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
198 // available. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
199 #ifndef HAL_DCACHE_INVALIDATE_ALL_DEFINED |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
200 #define HAL_DCACHE_INVALIDATE_ALL() HAL_DCACHE_SYNC() |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
201 #endif |
| 0 | 202 |
| 203 // Synchronize the contents of the cache with memory. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
204 // This uses the index-writeback-invalidate operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
205 #ifndef HAL_DCACHE_SYNC_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
206 #define HAL_DCACHE_SYNC() \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
207 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
208 register CYG_ADDRESS _baddr_ = 0x80000000; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
209 register CYG_ADDRESS _addr_ = 0x80000000; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
210 register CYG_WORD _size_ = HAL_DCACHE_SIZE; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
211 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
212 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
213 { _HAL_ASM_DCACHE_ALL_WAYS(0x01, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
214 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
215 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
216 #endif |
| 0 | 217 |
| 218 // Set the data cache refill burst size | |
| 219 //#define HAL_DCACHE_BURST_SIZE(_size_) | |
| 220 | |
| 221 // Set the data cache write mode | |
| 222 //#define HAL_DCACHE_WRITE_MODE( _mode_ ) | |
| 223 | |
| 224 //#define HAL_DCACHE_WRITETHRU_MODE 0 | |
| 225 //#define HAL_DCACHE_WRITEBACK_MODE 1 | |
| 226 | |
| 227 // Load the contents of the given address range into the data cache | |
| 228 // and then lock the cache so that it stays there. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
229 // This uses the fetch-and-lock cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
230 #ifndef HAL_DCACHE_LOCK_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
231 #define HAL_DCACHE_LOCK(_base_, _asize_) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
232 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
233 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
234 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
235 register CYG_WORD _size_ = HAL_DCACHE_ADJUST_SIZE(_asize_); \ |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
236 register CYG_WORD _state_; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
237 HAL_DCACHE_IS_ENABLED( _state_ ); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
238 if( _state_ ) { \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
239 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
240 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
241 { _HAL_ASM_DCACHE_ALL_WAYS(0x1d, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
242 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
243 } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
244 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
245 #endif |
| 0 | 246 |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
247 // Undo a previous lock operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
248 // Do this by flushing the cache, which is defined to clear the lock bit. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
249 #ifndef HAL_DCACHE_UNLOCK_DEFINED |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
250 #define HAL_DCACHE_UNLOCK(_base_, _size_) \ |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
251 HAL_DCACHE_FLUSH( _base_, _size_ ) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
252 #endif |
| 0 | 253 |
| 2 | 254 // Unlock entire cache |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
255 #ifndef HAL_DCACHE_UNLOCK_ALL_DEFINED |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
256 #define HAL_DCACHE_UNLOCK_ALL() \ |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
257 HAL_DCACHE_INVALIDATE_ALL() |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
258 #endif |
| 2 | 259 |
| 0 | 260 //----------------------------------------------------------------------------- |
| 261 // Data cache line control | |
| 262 | |
| 263 // Allocate cache lines for the given address range without reading its | |
| 264 // contents from memory. | |
| 265 //#define HAL_DCACHE_ALLOCATE( _base_ , _size_ ) | |
| 266 | |
| 267 // Write dirty cache lines to memory and invalidate the cache entries | |
| 268 // for the given address range. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
269 // This uses the hit-writeback-invalidate cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
270 #ifndef HAL_DCACHE_FLUSH_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
271 #define HAL_DCACHE_FLUSH( _base_ , _asize_ ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
272 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
273 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
274 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
275 register CYG_WORD _size_ = HAL_DCACHE_ADJUST_SIZE(_asize_); \ |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
276 register CYG_WORD _state_; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
277 HAL_DCACHE_IS_ENABLED( _state_ ); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
278 if( _state_ ) { \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
279 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
280 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
281 { _HAL_ASM_DCACHE_ALL_WAYS(0x15, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
282 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
283 } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
284 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
285 #endif |
| 0 | 286 |
| 287 // Invalidate cache lines in the given range without writing to memory. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
288 // This uses the hit-invalidate cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
289 #ifndef HAL_DCACHE_INVALIDATE_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
290 #define HAL_DCACHE_INVALIDATE( _base_ , _asize_ ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
291 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
292 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
293 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
294 register CYG_WORD _size_ = HAL_DCACHE_ADJUST_SIZE(_asize_); \ |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
295 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
296 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
297 { _HAL_ASM_DCACHE_ALL_WAYS(0x11, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
298 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
299 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
300 #endif |
| 0 | 301 |
| 302 // Write dirty cache lines to memory for the given address range. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
303 // This uses the hit-writeback cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
304 #ifndef HAL_DCACHE_STORE_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
305 #define HAL_DCACHE_STORE( _base_ , _asize_ ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
306 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
307 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
308 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
309 register CYG_WORD _size_ = HAL_DCACHE_ADJUST_SIZE(_asize_); \ |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
310 register CYG_WORD _state_; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
311 HAL_DCACHE_IS_ENABLED( _state_ ); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
312 if( _state_ ) { \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
313 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
314 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
315 { _HAL_ASM_DCACHE_ALL_WAYS(0x19, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
316 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
317 } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
318 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
319 #endif |
| 0 | 320 |
| 321 // Preread the given range into the cache with the intention of reading | |
| 322 // from it later. | |
| 323 //#define HAL_DCACHE_READ_HINT( _base_ , _size_ ) | |
| 324 | |
| 325 // Preread the given range into the cache with the intention of writing | |
| 326 // to it later. | |
| 327 //#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ ) | |
| 328 | |
| 329 // Allocate and zero the cache lines associated with the given range. | |
| 330 //#define HAL_DCACHE_ZERO( _base_ , _size_ ) | |
| 331 | |
| 332 //----------------------------------------------------------------------------- | |
| 333 // Global control of Instruction cache | |
| 334 | |
| 335 // Enable the instruction cache | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
336 // There is no default mechanism for enabling or disabling the caches. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
337 #ifndef HAL_ICACHE_ENABLE_DEFINED |
| 0 | 338 #define HAL_ICACHE_ENABLE() |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
339 #endif |
| 0 | 340 |
| 341 // Disable the instruction cache | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
342 #ifndef HAL_ICACHE_DISABLE_DEFINED |
| 0 | 343 #define HAL_ICACHE_DISABLE() |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
344 #endif |
| 0 | 345 |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
346 #ifndef HAL_ICACHE_IS_ENABLED_DEFINED |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
347 #define HAL_ICACHE_IS_ENABLED(_state_) (_state_) = 1; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
348 #endif |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
349 |
| 0 | 350 // Invalidate the entire cache |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
351 // This uses the index-invalidate cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
352 #ifndef HAL_ICACHE_INVALIDATE_ALL_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
353 #define HAL_ICACHE_INVALIDATE_ALL() \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
354 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
355 register CYG_ADDRESS _baddr_ = 0x80000000; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
356 register CYG_ADDRESS _addr_ = 0x80000000; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
357 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
358 for( ; _addr_ < _baddr_+HAL_ICACHE_SIZE; _addr_ += HAL_ICACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
359 { _HAL_ASM_ICACHE_ALL_WAYS(0x00, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
360 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
361 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
362 #endif |
| 0 | 363 |
| 364 // Synchronize the contents of the cache with memory. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
365 // Simply force the cache to reload. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
366 #ifndef HAL_ICACHE_SYNC_DEFINED |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
367 #define HAL_ICACHE_SYNC() HAL_ICACHE_INVALIDATE_ALL() |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
368 #endif |
| 0 | 369 |
| 370 // Set the instruction cache refill burst size | |
| 371 //#define HAL_ICACHE_BURST_SIZE(_size_) | |
| 372 | |
| 373 // Load the contents of the given address range into the instruction cache | |
| 374 // and then lock the cache so that it stays there. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
375 // This uses the fetch-and-lock cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
376 #ifndef HAL_ICACHE_LOCK_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
377 #define HAL_ICACHE_LOCK(_base_, _asize_) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
378 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
379 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
380 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
381 register CYG_WORD _size_ = HAL_ICACHE_ADJUST_SIZE(_asize_); \ |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
382 register CYG_WORD _state_; \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
383 HAL_ICACHE_IS_ENABLED( _state_ ); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
384 if( _state_ ) { \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
385 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
386 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_DCACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
387 { _HAL_ASM_ICACHE_ALL_WAYS(0x1c, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
388 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
389 } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
390 CYG_MACRO_END |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
391 #endif |
| 0 | 392 |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
393 // Undo a previous lock operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
394 // Do this by invalidating the cache, which is defined to clear the lock bit. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
395 #ifndef HAL_ICACHE_UNLOCK_DEFINED |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
396 #define HAL_ICACHE_UNLOCK(_base_, _size_) \ |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
397 HAL_ICACHE_INVALIDATE( _base_, _size_ ) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
398 #endif |
| 0 | 399 |
| 2 | 400 // Unlock entire cache |
| 401 //#define HAL_ICACHE_UNLOCK_ALL() | |
| 402 | |
| 0 | 403 //----------------------------------------------------------------------------- |
| 404 // Instruction cache line control | |
| 405 | |
| 406 // Invalidate cache lines in the given range without writing to memory. | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
407 // This uses the hit-invalidate cache operation. |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
408 #ifndef HAL_ICACHE_INVALIDATE_DEFINED |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
409 #define HAL_ICACHE_INVALIDATE( _base_ , _asize_ ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
410 CYG_MACRO_START \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
411 register CYG_ADDRESS _baddr_ = (CYG_ADDRESS)(_base_); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
412 register CYG_ADDRESS _addr_ = (CYG_ADDRESS)(_base_); \ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
413 register CYG_WORD _size_ = HAL_ICACHE_ADJUST_SIZE(_asize_); \ |
|
92
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
414 _HAL_ASM_SET_MIPS_ISA(3); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
415 for( ; _addr_ <= _baddr_+_size_; _addr_ += HAL_ICACHE_LINE_SIZE ) \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
416 { _HAL_ASM_ICACHE_ALL_WAYS(0x10, _addr_); } \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
417 _HAL_ASM_SET_MIPS_ISA(0); \ |
|
08ffab08d2ee
Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
418 CYG_MACRO_END |
| 0 | 419 #endif |
| 420 | |
| 421 //----------------------------------------------------------------------------- | |
| 2 | 422 // Check that a supported configuration has actually defined some macros. |
| 423 | |
| 424 #ifndef HAL_DCACHE_ENABLE | |
| 425 | |
| 426 #error Unsupported MIPS configuration | |
| 427 | |
| 428 #endif | |
| 429 | |
| 430 //----------------------------------------------------------------------------- | |
| 0 | 431 #endif // ifndef CYGONCE_HAL_CACHE_H |
| 432 // End of hal_cache.h |
