OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [mips/] [mips32/] [current/] [include/] [var_arch.h] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
#ifndef CYGONCE_HAL_VAR_ARCH_H
2
#define CYGONCE_HAL_VAR_ARCH_H
3
 
4
//==========================================================================
5
//
6
//      var_arch.h
7
//
8
//      Architecture specific abstractions
9
//
10
//==========================================================================
11
// ####ECOSGPLCOPYRIGHTBEGIN####                                            
12
// -------------------------------------------                              
13
// This file is part of eCos, the Embedded Configurable Operating System.   
14
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
15
//
16
// eCos is free software; you can redistribute it and/or modify it under    
17
// the terms of the GNU General Public License as published by the Free     
18
// Software Foundation; either version 2 or (at your option) any later      
19
// version.                                                                 
20
//
21
// eCos is distributed in the hope that it will be useful, but WITHOUT      
22
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
23
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
24
// for more details.                                                        
25
//
26
// You should have received a copy of the GNU General Public License        
27
// along with eCos; if not, write to the Free Software Foundation, Inc.,    
28
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
29
//
30
// As a special exception, if other files instantiate templates or use      
31
// macros or inline functions from this file, or you compile this file      
32
// and link it with other works to produce a work based on this file,       
33
// this file does not by itself cause the resulting work to be covered by   
34
// the GNU General Public License. However the source code for this file    
35
// must still be made available in accordance with section (3) of the GNU   
36
// General Public License v2.                                               
37
//
38
// This exception does not invalidate any other reasons why a work based    
39
// on this file might be covered by the GNU General Public License.         
40
// -------------------------------------------                              
41
// ####ECOSGPLCOPYRIGHTEND####                                              
42
//==========================================================================
43
//#####DESCRIPTIONBEGIN####
44
//
45
// Author(s):    nickg
46
// Contributors: nickg, dmoseley
47
// Date:         1999-02-17
48
// Purpose:      Define architecture abstractions
49
// Description:  This file contains any extra or modified definitions for
50
//               this variant of the architecture.
51
// Usage:        #include <cyg/hal/var_arch.h>
52
//              
53
//####DESCRIPTIONEND####
54
//
55
//==========================================================================
56
 
57
#ifndef __ASSEMBLER__
58
#include <pkgconf/hal.h>
59
#include <cyg/infra/cyg_type.h>
60
#endif
61
 
62
//--------------------------------------------------------------------------
63
// Define macros for accessing CP0 registers
64
 
65
#define HAL_GET_CP0_REGISTER_32( _regval_, _cp0_regno_, _cp0_regsel_ )  \
66
{                                                                       \
67
    cyg_uint32 tmp;                                                     \
68
    asm volatile ("mfc0   %0,$%1,%2\nnop\n"                             \
69
                   : "=r" (tmp)                                         \
70
                   : "i"  (_cp0_regno_), "i"  (_cp0_regsel_)  );        \
71
    _regval_ = tmp;                                                     \
72
}
73
 
74
#define HAL_SET_CP0_REGISTER_32( _regval_, _cp0_regno_, _cp0_regsel_ )          \
75
{                                                                               \
76
    cyg_uint32 tmp = _regval_;                                                  \
77
    asm volatile ("mtc0   %1,$%2,%3\nnop\n"                                     \
78
                   : "=r" (tmp)                                                 \
79
                   : "r" (tmp), "i"  (_cp0_regno_), "i" (_cp0_regsel_) );       \
80
}
81
 
82
#define HAL_GET_CP0_REGISTER_64( _regval_, _cp0_regno_, _cp0_regsel_ ) \
83
        HAL_GET_CP0_REGISTER_32( _regval_, _cp0_regno_, _cp0_regsel_ )
84
#define HAL_SET_CP0_REGISTER_64( _regval_, _cp0_regno_, _cp0_regsel_ ) \
85
        HAL_SET_CP0_REGISTER_32( _regval_, _cp0_regno_, _cp0_regsel_ )
86
 
87
//--------------------------------------------------------------------------
88
// Bit manipulation macros
89
 
90
#ifndef CYGHWR_HAL_BIT_INDEXES_DEFINED
91
 
92
//--------------------------------------------------------
93
// Determine the index of the ls bit of the supplied mask.
94
 
95
#define HAL_LSBIT_INDEX(_index_, _mask_)                                \
96
    CYG_MACRO_START                                                     \
97
    unsigned _reg_;                                                     \
98
                                                                        \
99
    _reg_ = (_mask_);                                                   \
100
    _reg_ &= -_reg_;                                                    \
101
    asm volatile ("clz    %0, %1\n"                                     \
102
               : "=r" (_reg_)                                           \
103
               : "r" (_reg_) );                                         \
104
    (_index_) = 31 - _reg_;                                             \
105
    CYG_MACRO_END
106
 
107
//--------------------------------------------------------
108
// Determine the index of the ms bit of the supplied mask.
109
 
110
#define HAL_MSBIT_INDEX(_index_, _mask_)                                \
111
    CYG_MACRO_START                                                     \
112
    unsigned _reg_;                                                     \
113
                                                                        \
114
    _reg_ = (_mask_);                                                   \
115
    asm volatile ("clz    %0, %1\n"                                     \
116
             : "=r" (_reg_)                                             \
117
             : "r" (_reg_) );                                           \
118
    (_index_) = 31 - _reg_;                                             \
119
    CYG_MACRO_END
120
 
121
#define CYGHWR_HAL_BIT_INDEXES_DEFINED
122
#endif
123
 
124
//--------------------------------------------------------------------------
125
 
126
#ifdef CYGARC_HAL_COMMON_EXPORT_CPU_MACROS
127
/* System Control Coprocessor (CP0) exception processing registers */
128
/* These supplement the definitions in mips-regs.h */
129
#define C0_INDEX        $0              /* Index into TLB Array - 4Kc core */
130
#define C0_RANDOM       $1              /* Randomly generated index into TLB Array - 4Kc core */
131
#define C0_ENTRYLO0     $2              /* Low-order portion of the TLB entry for even-numbered virtual pages - 4Kc core */
132
#define C0_ENTRYLO1     $3              /* Low-order portion of the TLB entry for odd-numbered virtual pages - 4Kc core */
133
#define CO_PAGEMASK     $5              /* Pointer to page table entry in memory - 4Kc core */
134
#define C0_WIRED        $6              /* Number of fixed TLB entries - 4Kc core */
135
#define C0_ENTRYHI      $10             /* High-order portion of the TLB entry - 4Kc core */
136
#define C0_PRId         $15             /* Processor Identification and Revision */
137
#define C0_CONFIG       $16             /* Configuration Register */
138
#define C0_LLADDR       $17             /* Load linked address */
139
#define C0_LLADDR       $17             /* Load linked address */
140
#define C0_DEBUG        $23             /* Debug control and exception status */
141
#define C0_DEPC         $24             /* Program counter at last debug exception */
142
#define C0_TAGLO        $28             /* Low-order portion of cache tag interface */
143
#define C0_TAGHI        $29             /* High-order portion of cache tag interface (not implemented in 4K cores */
144
#define C0_DESAVE       $31             /* Debug handler scratch pad register */
145
 
146
/* Coprocessor Register selector field */
147
#define C0_SELECTOR_0   0x0
148
#define C0_SELECTOR_1   0x1
149
 
150
/* Status register fields */
151
#define SR_RP           0x08000000      /* Enter reduced-power mode */
152
#define SR_NMI          0x00080000      /* Reset vector called through assertion of the NMI signal */
153
 
154
/* Cause register fields */
155
#define CAUSE_IV        0x00800000      /* Interrupt vector to use -- Bit=0 -> offset=0x180;
156
                                                                      Bit=1 -> offset=0x200; */
157
#define CAUSE_WP        0x00400000      /* Watch exception deferred due to either Status[EXL] or Status[ERL] */
158
#define CAUSE_MIPS32IP7 CAUSE_IP8       /* The MIPS32 architecture refers to these bits using a 0 base, */
159
#define CAUSE_MIPS32IP6 CAUSE_IP7       /* but the generic mips-regs.h refers to them with a 1 base */
160
#define CAUSE_MIPS32IP5 CAUSE_IP6
161
#define CAUSE_MIPS32IP4 CAUSE_IP5
162
#define CAUSE_MIPS32IP3 CAUSE_IP4
163
#define CAUSE_MIPS32IP2 CAUSE_IP3
164
#define CAUSE_MIPS32IP1 CAUSE_IP2
165
#define CAUSE_MIPS32IP0 CAUSE_IP1
166
 
167
#define CAUSE_MIPS32HW5 CAUSE_MIPS32IP1
168
#define CAUSE_MIPS32HW4 CAUSE_MIPS32IP1
169
#define CAUSE_MIPS32HW3 CAUSE_MIPS32IP1
170
#define CAUSE_MIPS32HW2 CAUSE_MIPS32IP1
171
#define CAUSE_MIPS32HW1 CAUSE_MIPS32IP1
172
#define CAUSE_MIPS32HW0 CAUSE_MIPS32IP1
173
#define CAUSE_MIPS32SW1 CAUSE_MIPS32IP1
174
#define CAUSE_MIPS32SW0 CAUSE_MIPS32IP0
175
 
176
/* Exception Codes */
177
#define EXC_WATCH       23              /* Reference to the Watch address */
178
#define EXC_MCHECK      24              /* Machine Check */
179
 
180
/* Processor Identification fields */
181
#define PRId_COMPANY_ID_MASK              0x00FF0000  /* Which company manufactured this chip */
182
#define PRId_COMPANY_MIPS_TECHNOLOGIES    0x00010000
183
#define PRId_PROCESSOR_ID_MASK            0x0000FF00  /* Which processor is this */
184
#define PRId_PROCESSOR_4Kc                0x00008000
185
#define PRId_PROCESSOR_4Kp_4Km            0x00008300
186
#define PRId_REVISION                     0x000000FF /* Which revision is this */
187
 
188
/* Config register fields */
189
#define CONFIG_M                          0x80000000 /* Hardwired to '1' to indicate presence of Config1 register */
190
#define CONFIG_K23                        0x70000000 /* Controls cacheability of kseg2 and kseg3 in BAT */
191
#define CONFIG_KU                         0x0E000000 /* Controls cacheability of ksegu in BAT */
192
#define CONFIG_MDU                        0x00100000 /* MDU Type: 0 == Fast Multiplier Array; 1 == Iterative */
193
#define CONFIG_MM                         0x00060000 /* Merge mode */
194
#define CONFIG_BM                         0x00010000 /* Burst mode: 0 == Sequential; 1 == SubBlock */
195
#define CONFIG_BE                         0x00008000 /* Endian mode: 0 == Little Endian; 1 == Big Endian */
196
#define CONFIG_AT                         0x00006000 /* Architecture Type */
197
#define CONFIG_AR                         0x00001C00 /* Architecture Revision */
198
#define CONFIG_MT                         0x00000380 /* MMU Type */
199
#define CONFIG_K0                         0x00000007 /* kseg0 coherency algorithm */
200
 
201
/* KSEG cache control codes */
202
#define CONFIG_KSEG2_3_CACHEABLE          0x30000000 /* KSeg2 and KSeg3 are cacheable/noncoherent/write-through/no write-allocate */
203
#define CONFIG_KSEG2_3_UNCACHEABLE        0x20000000 /* KSeg2 and KSeg3 are cacheable/noncoherent/write-through/no write-allocate */
204
#define CONFIG_KSEGU_CACHEABLE            0x06000000 /* KSegu is cacheable/noncoherent/write-through/no write-allocate */
205
#define CONFIG_KSEGU_UNCACHEABLE          0x04000000 /* KSegu is cacheable/noncoherent/write-through/no write-allocate */
206
#define CONFIG_KSEG0_CACHEABLE            0x00000003 /* KSeg0 is cacheable/noncoherent/write-through/no write-allocate */
207
#define CONFIG_KSEG0_UNCACHEABLE          0x00000002 /* KSeg0 is cacheable/noncoherent/write-through/no write-allocate */
208
 
209
/* Merge mode control codes */
210
#define CONFIG_NO_MERGING                 0x00000000
211
#define CONFIG_SYSAD_VALID_MERGING        0x00200000
212
#define CONFIG_FULL_MERGING               0x00400000
213
 
214
/* Architecture Type codes */
215
#define CONFIG_AT_MIPS32                  0x00000000
216
 
217
/* Architecture Revision codes */
218
#define CONFIG_AR_REVISION_1              0x00000000
219
 
220
/* MMU Type codes */
221
#define CONFIG_MMU_TYPE_STANDARD_TLB      0x00000080
222
#define CONFIG_MMU_TYPE_FIXED             0x00000180
223
 
224
/* Config1 register fields */
225
#define CONFIG1_MMU_SIZE_MASK             0x7E000000 /* Number of entries in the TLB minus 1 */
226
#define CONFIG1_IS                        0x01C00000 /* Number of instruction cache sets per way */
227
#define CONFIG1_IL                        0x00380000 /* Instruction cache line size */
228
#define CONFIG1_IA                        0x00030000 /* Level of Instruction cache associativity */
229
#define CONFIG1_DS                        0x0000E000 /* Number of data cache sets per way */
230
#define CONFIG1_DL                        0x00001C00 /* Data cache line size */
231
#define CONFIG1_DA                        0x00000380 /* Level of Data cache associativity */
232
#define CONFIG1_PC                        0x00000010 /* Performance Counter registers implemented */
233
#define CONFIG1_WR                        0x00000008 /* Watch registers implemented */
234
#define CONFIG1_CA                        0x00000004 /* Code compression implemented */
235
#define CONFIG1_EP                        0x00000002 /* EJTAG implemented */
236
#define CONFIG1_FP                        0x00000001 /* FPU implemented */
237
 
238
/* Instruction cache sets-per-way codes */
239
#define CONFIG1_ICACHE_64_SETS_PER_WAY    0x00000000
240
#define CONFIG1_ICACHE_128_SETS_PER_WAY   0x00400000
241
#define CONFIG1_ICACHE_256_SETS_PER_WAY   0x00800000
242
 
243
/* Instruction cache line size codes */
244
#define CONFIG1_ICACHE_NOT_PRESET         0x00000000
245
#define CONFIG1_ICACHE_LINE_SIZE_16_BYTES 0x00180000
246
 
247
/* Instruction cache associativity codes */
248
#define CONFIG1_ICACHE_DIRECT_MAPPED      0x00000000
249
#define CONFIG1_ICACHE_2_WAY              0x00010000
250
#define CONFIG1_ICACHE_3_WAY              0x00020000
251
#define CONFIG1_ICACHE_4_WAY              0x00030000
252
 
253
/* Data cache sets-per-way codes */
254
#define CONFIG1_DCACHE_64_SETS_PER_WAY    0x00000000
255
#define CONFIG1_DCACHE_128_SETS_PER_WAY   0x00002000
256
#define CONFIG1_DCACHE_256_SETS_PER_WAY   0x00004000
257
 
258
/* Data cache line size codes */
259
#define CONFIG1_DCACHE_NOT_PRESET         0x00000000
260
#define CONFIG1_DCACHE_LINE_SIZE_16_BYTES 0x00000C00
261
 
262
/* Data cache associativity codes */
263
#define CONFIG1_DCACHE_DIRECT_MAPPED      0x00000000
264
#define CONFIG1_DCACHE_2_WAY              0x00000080
265
#define CONFIG1_DCACHE_3_WAY              0x00000100
266
#define CONFIG1_DCACHE_4_WAY              0x00000180
267
 
268
#endif // ifdef CYGARC_HAL_COMMON_EXPORT_CPU_MACROS
269
 
270
//--------------------------------------------------------------------------
271
#endif // CYGONCE_HAL_VAR_ARCH_H
272
// End of var_arch.h

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.