annotate packages/hal/sparclite/sleb/current/include/hal_cache.h @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 #ifndef CYGONCE_HAL_CACHE_H
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_HAL_CACHE_H
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 // hal_cache.h
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 // HAL Cache control support (such as it is in the simulator)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 //=============================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
11 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
12 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
13 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
15 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
16 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
17 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
18 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
19 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
20 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
21 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
22 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
23 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
24 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
25 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
26 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
27 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
28 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
29 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
30 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
31 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
32 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
33 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
34 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
35 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
36 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
37 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
38 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
39 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
40 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
41 // ####ECOSGPLCOPYRIGHTEND####
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 // Author(s): nickg, gthomas, hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 // Contributors: nickg, gthomas, hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 // Date: 1999-01-28
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 // Purpose: Define Interrupt support
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 // Description: The macros defined here provide the HAL APIs for handling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 // the caches.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 // Usage:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 // #include <cyg/hal/hal_cache.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 // ...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 #include <pkgconf/hal_sparclite.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 // SPARClite cache macros
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 // The MB6863x Control Registers are in Address Space 1:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 #define HAL_SPARC_ASI_1_READ( addr, res ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 asm volatile( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 "lda [ %1 ] 1, %0" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 : "=r"(res) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 : "r"(addr) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 #define HAL_SPARC_ASI_1_WRITE( addr, val ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 asm volatile( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 "sta %0, [ %1 ] 1" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 : \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 : "r"(val),"r"(addr) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 #define HAL_SPARC_MMCR_CBIR 0x00 // Cache/BusInterfaceUnit Control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 #define HAL_SPARC_MMCR_LCR 0x04 // Lock Control Register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #define HAL_SPARC_MMCR_LCSR 0x08 // Lock Control Save Reg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 #define HAL_SPARC_MMCR_CSR 0x0c // Cache Status Reg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 #define HAL_SPARC_MMCR_RLCR 0x10 // Restore Lock Control Register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 #define HAL_SPARC_MMCR_CBIR_ICE 0x01 // Instruction Cache Enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 #define HAL_SPARC_MMCR_CBIR_GICL 0x02 // Global IC Lock
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 #define HAL_SPARC_MMCR_CBIR_DCE 0x04 // Data CE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 #define HAL_SPARC_MMCR_CBIR_GDCL 0x08 // G Data CE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 #define HAL_SPARC_MMCR_CBIR_PBE 0x10 // Prefetch Buffer Enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 #define HAL_SPARC_MMCR_CBIR_WBE 0x20 // Write BE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 // Cache dimensions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 // These definitions are suitable for any MB8683x processor:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 // The largest possible cachesize and "ways",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 // the smallest possible line size.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 // This gives values that can correctly manipulate the cache by
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 // jumping on memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 // Data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 #define HAL_DCACHE_SIZE 0x2000 // Size of data cache in bytes
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 #define HAL_DCACHE_LINE_SIZE 16 // Size of a data cache line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 #define HAL_DCACHE_WAYS 2 // Associativity of the cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 // Instruction cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 #define HAL_ICACHE_SIZE 0x2000 // Size of cache in bytes
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 #define HAL_ICACHE_LINE_SIZE 16 // Size of a cache line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 #define HAL_ICACHE_WAYS 2 // Associativity of the cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 #define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 #define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 // Global control of data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 // Enable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 #define HAL_DCACHE_ENABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 _v_ |= HAL_SPARC_MMCR_CBIR_DCE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 // Disable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 #define HAL_DCACHE_DISABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 _v_ &=~ HAL_SPARC_MMCR_CBIR_DCE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 // Invalidate the entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 #define HAL_DCACHE_INVALIDATE_ALL() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 asm volatile ( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 "set 3, %%l0;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 "set 0x00001000, %%l1;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 "set 0x80001000, %%l2;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 "sta %%l0, [ %%l1 ] 0x0e;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 "sta %%l0, [ %%l2 ] 0x0e;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 "nop" : : : "l0","l1","l2" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 // Synchronize the contents of the cache with memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 #define HAL_DCACHE_SYNC() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 /* read 8k from the ROM; that should do it... */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 volatile cyg_uint32 *_p_ = (cyg_uint32 *)0; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 volatile cyg_uint32 *_q_ = (cyg_uint32 *)HAL_DCACHE_SIZE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 volatile cyg_uint32 _tmp_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 for ( ; _p_ < _q_; _p_ ++ ) _tmp_ = *_q_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 // Query the state of the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 #define HAL_DCACHE_IS_ENABLED(_state_) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 (_state_) = (0 != (_v_ & HAL_SPARC_MMCR_CBIR_DCE)); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 // Set the data cache refill burst size
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 //#define HAL_DCACHE_BURST_SIZE(_size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 // Set the data cache write mode
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 //#define HAL_DCACHE_WRITE_MODE( _mode_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 //#define HAL_DCACHE_WRITETHRU_MODE 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 //#define HAL_DCACHE_WRITEBACK_MODE 1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 // Load the contents of the given address range into the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 // and then lock the cache so that it stays there.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 //#define HAL_DCACHE_LOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 // Undo a previous lock operation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 //#define HAL_DCACHE_UNLOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 // Unlock entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 //#define HAL_DCACHE_UNLOCK_ALL()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 // Data cache line control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 // Allocate cache lines for the given address range without reading its
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 // contents from memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 //#define HAL_DCACHE_ALLOCATE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 // Write dirty cache lines to memory and invalidate the cache entries
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 // for the given address range.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 //#define HAL_DCACHE_FLUSH( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 // Invalidate cache lines in the given range without writing to memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 //#define HAL_DCACHE_INVALIDATE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 // Write dirty cache lines to memory for the given address range.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 //#define HAL_DCACHE_STORE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 // Preread the given range into the cache with the intention of reading
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 // from it later.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 //#define HAL_DCACHE_READ_HINT( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 // Preread the given range into the cache with the intention of writing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 // to it later.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 //#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 // Allocate and zero the cache lines associated with the given range.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 //#define HAL_DCACHE_ZERO( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 // Global control of Instruction cache - use Data cache controls since they
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 // are not separatable.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 // Enable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 #define HAL_ICACHE_ENABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 _v_ |= HAL_SPARC_MMCR_CBIR_ICE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 // Disable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 #define HAL_ICACHE_DISABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 _v_ &=~ HAL_SPARC_MMCR_CBIR_ICE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 // Invalidate the entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 #define HAL_ICACHE_INVALIDATE_ALL() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 asm volatile ( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 "set 3, %%l0;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 "set 0x00001000, %%l1;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 "set 0x80001000, %%l2;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 "sta %%l0, [ %%l1 ] 0x0c;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 "sta %%l0, [ %%l2 ] 0x0c;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 "nop" : : : "l0","l1","l2" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 // Synchronize the contents of the cache with memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 #define HAL_ICACHE_SYNC() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 HAL_DCACHE_SYNC(); /* Ensure data is in memory */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 HAL_ICACHE_INVALIDATE_ALL(); /* Pick up new memory contents */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 // Query the state of the instruction cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 #define HAL_ICACHE_IS_ENABLED(_state_) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 (_state_) = (0 != (_v_ & HAL_SPARC_MMCR_CBIR_ICE)); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 // Set the instruction cache refill burst size
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 //#define HAL_ICACHE_BURST_SIZE(_size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 // Load the contents of the given address range into the instruction cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 // and then lock the cache so that it stays there.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 //#define HAL_ICACHE_LOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 // Undo a previous lock operation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 //#define HAL_ICACHE_UNLOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 // Unlock entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 //#define HAL_ICACHE_UNLOCK_ALL()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 // Instruction cache line control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 // Invalidate cache lines in the given range without writing to memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 //#define HAL_ICACHE_INVALIDATE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 #endif // ifndef CYGONCE_HAL_CACHE_H
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 // End of hal_cache.h