aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mvp/mvpkm/coproc_defs.h
blob: 26218cfd9470fd6fea0b2b57217155c1a18eb125 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
/*
 * Linux 2.6.32 and later Kernel module for VMware MVP Hypervisor Support
 *
 * Copyright (C) 2010-2012 VMware, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; see the file COPYING.  If not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
#line 5

/**
 *  @file
 *
 *  @brief Constant definitions for ARM CP15 coprocessor registers.
 *
 *  Derived from tweety hypervisor/src/armv6/trango_macros.inc file
 */

#ifndef _COPROC_DEFS_H_
#define _COPROC_DEFS_H_

#define INCLUDE_ALLOW_MVPD
#define INCLUDE_ALLOW_VMX
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_MONITOR
#define INCLUDE_ALLOW_PV
#define INCLUDE_ALLOW_GPL
#include "include_check.h"

/**
 * @name CP10 registers.
 *
 * MCR/MRC format: @code #define <name> <opcode_1>, <CRn>, <CRm>, <opcode_2> @endcode
 * @{
 */
#define VFP_FPSID                           7,  c0,  c0, 0
#define VFP_MVFR0                           7,  c7,  c0, 0
#define VFP_MVFR1                           7,  c6,  c0, 0
#define VFP_FPEXC                           7,  c8,  c0, 0
#define VFP_FPSCR                           7,  c1,  c0, 0
#define VFP_FPINST                          7,  c9,  c0, 0
#define VFP_FPINST2                         7, c10,  c0, 0
/*@}*/


/**
 * @name CP15 registers.
 *
 * MCR/MRC format: @code #define <name> <opcode_1>, <CRn>, <CRm>, <opcode_2> @endcode
 * MCRR format: @code #define <name> <opcode>, <CRm>@endcode
 * @{
 */
#define ID_CODE                             0,  c0,  c0, 0
#define CACHE_TYPE                          0,  c0,  c0, 1
#define MPIDR                               0,  c0,  c0, 5
#define CACHE_SIZE_ID                       1,  c0,  c0, 0
#define CACHE_LEVEL_ID                      1,  c0,  c0, 1
#define CACHE_SIZE_SELECTION                2,  c0,  c0, 0
#define MEM_MODEL_FEATURE_0                 0,  c0,  c1, 4
#define CONTROL_REGISTER                    0,  c1,  c0, 0
#define TTBASE0_POINTER                     0,  c2,  c0, 0
#define TTBASE1_POINTER                     0,  c2,  c0, 1
#define TTCONTROL                           0,  c2,  c0, 2
#define DOMAIN_CONTROL                      0,  c3,  c0, 0
#define DATA_FAULT_STATUS                   0,  c5,  c0, 0
#define INST_FAULT_STATUS                   0,  c5,  c0, 1
#define AUX_DATA_FAULT_STATUS               0,  c5,  c1, 0
#define AUX_INST_FAULT_STATUS               0,  c5,  c1, 1
#define DATA_FAULT_ADDRESS                  0,  c6,  c0, 0
#define INST_FAULT_ADDRESS                  0,  c6,  c0, 2
#define WAIT_FOR_INTERRUPT                  0,  c7,  c0, 4
#define PHYSICAL_ADDRESS                    0,  c7,  c4, 0
#define ICACHE_INVALIDATE_POU               0,  c7,  c5, 0
#define ICACHE_INVALIDATE_MVA_POU           0,  c7,  c5, 1
#define ICACHE_INVALIDATE_INDEX             0,  c7,  c5, 2
#define BTAC_INVALIDATE                     0,  c7,  c5, 6
#define BTAC_INVALIDATE_MVA                 0,  c7,  c5, 7
#define DCACHE_INVALIDATE                   0,  c7,  c6, 0
#define DCACHE_INVALIDATE_MVA_POC           0,  c7,  c6, 1
#define DCACHE_INVALIDATE_INDEX             0,  c7,  c6, 2
#define UCACHE_INVALIDATE                   0,  c7,  c7, 0
#define V2P_CURRENT_PRIV_READ               0,  c7,  c8, 0
#define V2P_CURRENT_PRIV_WRITE              0,  c7,  c8, 1
#define V2P_CURRENT_USER_READ               0,  c7,  c8, 2
#define V2P_CURRENT_USER_WRITE              0,  c7,  c8, 3
#define V2P_OTHER_PRIV_READ                 0,  c7,  c8, 4
#define V2P_OTHER_PRIV_WRITE                0,  c7,  c8, 5
#define V2P_OTHER_USER_READ                 0,  c7,  c8, 6
#define V2P_OTHER_USER_WRITE                0,  c7,  c8, 7
#define DCACHE_CLEAN                        0,  c7, c10, 0
#define DCACHE_CLEAN_MVA_POC                0,  c7, c10, 1
#define DCACHE_CLEAN_INDEX                  0,  c7, c10, 2
#define DCACHE_CLEAN_MVA_POU                0,  c7, c11, 1
#define DCACHE_CLEAN_INVALIDATE             0,  c7, c14, 0
#define DCACHE_CLEAN_INVALIDATE_MVA_POC     0,  c7, c14, 1
#define DCACHE_CLEAN_INVALIDATE_INDEX       0,  c7, c14, 2
#define ITLB_INVALIDATE_ALL                 0,  c8,  c5, 0
#define ITLB_INVALIDATE_SINGLE              0,  c8,  c5, 1
#define ITLB_INVALIDATE_ASID                0,  c8,  c5, 2
#define DTLB_INVALIDATE_ALL                 0,  c8,  c6, 0
#define DTLB_INVALIDATE_SINGLE              0,  c8,  c6, 1
#define DTLB_INVALIDATE_ASID                0,  c8,  c6, 2
#define UTLB_INVALIDATE_ALL                 0,  c8,  c7, 0
#define UTLB_INVALIDATE_SINGLE              0,  c8,  c7, 1
#define UTLB_INVALIDATE_ASID                0,  c8,  c7, 2
#define TLB_LOCKDOWN                        0, c10,  c0, 0
#define PRIMARY_REGION_REMAP                0, c10,  c2, 0
#define MAIR0                               PRIMARY_REGION_REMAP
#define NORMAL_MEMORY_REMAP                 0, c10,  c2, 1
#define MAIR1                               NORMAL_MEMORY_REMAP
#define VECTOR_BASE                         0, c12,  c0, 0
#define INTERRUPT_STATUS                    0, c12,  c1, 0
#define CONTEXT_ID                          0, c13,  c0, 1
#define TID_USER_RW                         0, c13,  c0, 2
#define TID_USER_RO                         0, c13,  c0, 3
#define TID_PRIV_RW                         0, c13,  c0, 4
#define CLEAR_FAULT_IN_EFSR                 7, c15,  c0, 1
#define VBAR                                0, c12,  c0, 0

/*
 * ARMv7 performance counters' registers (MVP related)
 * - ARM Architecture Reference Manual v7-A and v7-R: DDI0406B
 * - Cortex-A8 TRM, rev.r1p1: DDI0344B
 */
#define PERF_MON_CONTROL_REGISTER           0,  c9, c12, 0
#define CYCLE_COUNT                         0,  c9, c13, 0
#define PERF_MON_COUNT_SET                  0,  c9, c12, 1
#define PERF_MON_COUNT_CLR                  0,  c9, c12, 2
#define PERF_MON_FLAG_RDCLR                 0,  c9, c12, 3
#define PERF_MON_EVENT_SELECT               0,  c9, c12, 5
#define PERF_MON_EVENT_TYPE                 0,  c9, c13, 1
#define PERF_MON_EVENT_COUNT                0,  c9, c13, 2
#define PERF_MON_INTEN_SET                  0,  c9, c14, 1
#define PERF_MON_INTEN_CLR                  0,  c9, c14, 2

#define COPROC_ACCESS_CONTROL               0,  c1,  c0, 2
#define NON_SECURE_ACCESS_CONTROL           0,  c1,  c1, 2

#define HYP_CFG                             4,  c1,  c1, 0
#define HYP_DEBUG_CONTROL                   4,  c1,  c1, 1
#define HYP_COPROC_TRAP                     4,  c1,  c1, 2
#define HYP_SYS_TRAP                        4,  c1,  c1, 3
#define VIRT_TCR                            4,  c2,  c1, 2
#define HYP_SYNDROME                        4,  c5,  c2, 0
#define HYP_DATA_FAULT_ADDRESS              4,  c6,  c0, 0
#define HYP_INST_FAULT_ADDRESS              4,  c6,  c0, 2
#define HYP_IPA_FAULT_ADDRESS               4,  c6,  c0, 4
#define UTLB_INVALIDATE_ALL_HYP             4,  c8,  c7, 0
#define UTLB_INVALIDATE_SINGLE_HYP          4,  c8,  c7, 1
#define UTLB_INVALIDATE_ALL_NS_NON_HYP      4,  c8,  c7, 4

#define EXT_TTBR0                           0,  c2
#define EXT_TTBR1                           1,  c2
#define HYP_TTBR                            4,  c2
#define VIRT_TTBR                           6,  c2
#define EXT_PHYSICAL_ADDRESS                0,  c7
/*@}*/

/**
 * @name CP15 configuration control register bits.
 * @{
 */
#define ARM_CP15_CNTL_M         (1 << 0)
#define ARM_CP15_CNTL_A         (1 << 1)
#define ARM_CP15_CNTL_C         (1 << 2)
#define ARM_CP15_CNTL_B         (1 << 7)
#define ARM_CP15_CNTL_Z         (1 << 11)
#define ARM_CP15_CNTL_I         (1 << 12)
#define ARM_CP15_CNTL_V         (1 << 13)
#define ARM_CP15_CNTL_U         (1 << 22)
#define ARM_CP15_CNTL_VE        (1 << 24)
#define ARM_CP15_CNTL_EE        (1 << 25)
#define ARM_CP15_CNTL_TRE       (1 << 28)
#define ARM_CP15_CNTL_AFE       (1 << 29)
#define ARM_CP15_CNTL_TE        (1 << 30)

/*@}*/

/**
 * @brief Initial System Control Register (SCTLR) value.
 *
 * Magic described on B3-97 ARM DDI 0406B, it's the power-on
 * value, e.g. caches/MMU/alignment checking/TEX remap etc. disabled.
 */
#define ARM_CP15_CNTL_INIT 0x00c50078

/**
 * @name System control coprocessor primary registers.
 * Each primary register is backed by potentially multiple
 * physical registers in the vCPU CP15 register file.
 * @{
 */
#define ARM_CP15_CRN_ID         0  ///< Processor ID, cache, TCM and TLB type
#define ARM_CP15_CRN_CNTL       1  ///< System configuration bits
#define ARM_CP15_CRN_PT         2  ///< Page table control
#define ARM_CP15_CRN_DACR       3  ///< Domain access control
#define ARM_CP15_CRN_F_STATUS   5  ///< Fault status
#define ARM_CP15_CRN_F_ADDR     6  ///< Fault address
#define ARM_CP15_CRN_CACHE      7  ///< Cache/write buffer control
#define ARM_CP15_CRN_TLB        8  ///< TLB control
#define ARM_CP15_CRN_REMAP      10 ///< Memory Remap registers
#define ARM_CP15_CRN_SER        12 ///< Security Extension registers
#define ARM_CP15_CRN_PID        13 ///< Process ID
#define ARM_CP15_CRN_TIMER      14 ///< Architecture timers

#define ARM_CP15_CRM_INVALIDATE_D_CACHE_RANGE            6
#define ARM_CP15_CRM_CLEAN_AND_INVALIDATE_D_CACHE_RANGE  14
/*@}*/

/**
 * @name ARMv7 performance counter control/status register bits (MVP related)
 * INTEN: counters overflow interrupt enable
 * CNTEN: counters enable
 * @{
 */
#define ARMV7_PMNC_E        (1 << 0)
#define ARMV7_PMNC_INTEN_P0 (1 << 0)
#define ARMV7_PMNC_INTEN_P1 (1 << 1)
#define ARMV7_PMNC_INTEN_P2 (1 << 2)
#define ARMV7_PMNC_INTEN_P3 (1 << 3)
#define ARMV7_PMNC_INTEN_C (1 << 31)
#define ARMV7_PMNC_INTEN_MASK 0x8000000f
#define ARMV7_PMNC_CNTEN_P0 (1 << 0)
#define ARMV7_PMNC_CNTEN_P1 (1 << 1)
#define ARMV7_PMNC_CNTEN_P2 (1 << 2)
#define ARMV7_PMNC_CNTEN_P3 (1 << 3)
#define ARMV7_PMNC_CNTEN_C (1 << 31)
#define ARMV7_PMNC_FLAG_P0 (1 << 0)
#define ARMV7_PMNC_FLAG_P1 (1 << 1)
#define ARMV7_PMNC_FLAG_P2 (1 << 2)
#define ARMV7_PMNC_FLAG_P3 (1 << 3)
#define ARMV7_PMNC_FLAG_C (1 << 31)
/*@}*/

/**
 * @name TTBR masks.
 * See B4.9.2 ARM DDI 0100I and B3.12.24 ARM DDI 0406A.
 * @{
 */
#define ARM_CP15_TTBASE_MASK    MVP_MASK(14, 18)
#define ARM_CP15_TTBASE_SPLIT_MASK(ttbcrn) MVP_MASK(14-ttbcrn, 18+ttbcrn)
#define ARM_CP15_TTATTRIB_MASK  MVP_MASK(0, 6)
/*@}*/

/**
 * @name ARM fault status register encoding/decoding.
 * See B4.6 and B4.9.6 in ARM DDI 0100I.
 * @{
 */
#define ARM_CP15_FSR_STATUS_POS         0
#define ARM_CP15_FSR_STATUS_POS2        10
#define ARM_CP15_FSR_DOMAIN_POS         4
#define ARM_CP15_FSR_WR_POS             11

#define ARM_CP15_FSR_STATUS_LEN         4
#define ARM_CP15_FSR_DOMAIN_LEN         4

#define ARM_CP15_FSR_STATUS_DEBUG_EVENT           0x2
#define ARM_CP15_FSR_STATUS_ALIGNMENT             0x1
#define ARM_CP15_FSR_STATUS_ICACHE_MAINT          0x4
#define ARM_CP15_FSR_STATUS_TRANSLATION_SECT      0x5
#define ARM_CP15_FSR_STATUS_TRANSLATION_PAGE      0x7
#define ARM_CP15_FSR_STATUS_DOMAIN_SECT           0x9
#define ARM_CP15_FSR_STATUS_DOMAIN_PAGE           0xb
#define ARM_CP15_FSR_STATUS_PERMISSION_SECT       0xd
#define ARM_CP15_FSR_STATUS_PERMISSION_PAGE       0xf
#define ARM_CP15_FSR_STATUS_ACCESS_FLAG_SECT      0x3
#define ARM_CP15_FSR_STATUS_ACCESS_FLAG_PAGE      0x6
#define ARM_CP15_FSR_STATUS_SYNC_EXT_ABORT        0x8
#define ARM_CP15_FSR_STATUS_ASYNC_EXT_ABORT      0x16
/*@}*/

/**
 * @brief Generate ARM fault status register value.
 *
 * @param fs status from Table B4-1. Only implemented for fs <= 0xf.
 * @param domain domain accessed when abort occurred.
 * @param write write access caused abort.
 */
#define ARM_CP15_FSR(fs,domain,write) \
   (((fs) << ARM_CP15_FSR_STATUS_POS) | \
    ((domain) << ARM_CP15_FSR_DOMAIN_POS) |  \
    ((write) ? (1 << ARM_CP15_FSR_WR_POS) : 0))

#define ARM_CP15_FSR_STATUS(r) \
   (MVP_EXTRACT_FIELD((r), ARM_CP15_FSR_STATUS_POS, ARM_CP15_FSR_STATUS_LEN) | \
    (MVP_BIT((r), ARM_CP15_FSR_STATUS_POS2) << ARM_CP15_FSR_STATUS_LEN))
#define ARM_CP15_FSR_DOMAIN(r) \
   MVP_EXTRACT_FIELD((r), ARM_CP15_FSR_DOMAIN_POS, ARM_CP15_FSR_DOMAIN_LEN)
#define ARM_CP15_FSR_WR(r) \
   MVP_BIT((r), ARM_CP15_FSR_WR_POS)
/*@}*/

/*
 * This should mask out the major and minor revision numbers.
 * As per http://infocenter.arm.com/help/topic/com.arm.doc.ddi0211k/I65012.html
 */
#define ARM_CP15_MAIN_ID_NOREVISION_MASK 0xFF0FFFF0

// 2-8 ARM DDI 0151C
#define ARM_CP15_MAIN_ID_920_T   0x41129200
// 3-18 ARM DDI 0211H
#define ARM_CP15_MAIN_ID_1136J_S 0x4107B362

/* Coprocessor Access Control Register */
#define CPACR_ASEDIS              (1 << 31)
#define CPACR_D32DIS              (1 << 30)
#define CPACR_CP10_MASK           (0x3 << (10*2))
#define CPACR_CP10_CP11_MASK      ( (0x3 << (10*2)) | (0x3 << (11*2)) )
#define CPACR_CP10_CP11_PRIV_ONLY ( (0x1 << (10*2)) | (0x1 << (11*2)) )
                                     /* 2-bit access permission per Co-Proc */

/**
 * @name ARM VFP/Adv. SIMD Extension System Registers
 * @{
 */
#define ARM_VFP_SYSTEM_REG_FPSID    0x0
#define ARM_VFP_SYSTEM_REG_FPSCR    0x1
#define ARM_VFP_SYSTEM_REG_MVFR1    0x6
#define ARM_VFP_SYSTEM_REG_MVFR0    0x7
#define ARM_VFP_SYSTEM_REG_FPEXC    0x8
#define ARM_VFP_SYSTEM_REG_FPINST   0x9
#define ARM_VFP_SYSTEM_REG_FPINST2  0xa

#define ARM_VFP_SYSTEM_REG_FPEXC_EX   (1 << 31)
#define ARM_VFP_SYSTEM_REG_FPEXC_EN   (1 << 30)
#define ARM_VFP_SYSTEM_REG_FPEXC_FP2V (1 << 28)

#define ARM_VFP_SYSTEM_REG_MVFR0_A_SIMD_BIT  (0)
#define ARM_VFP_SYSTEM_REG_MVFR0_A_SIMD_MASK (0xf << ARM_VFP_SYSTEM_REG_MVFR0_A_SIMD_BIT)
/*@}*/

/**
 * @name ARM Multi Processor ID Register (MPIDR) decoding
 * @{
 */
#define ARM_CP15_MPIDR_MP          (0x1 << 31)
#define ARM_CP15_MPIDR_U           (0x1 << 30)
/*@}*/

#endif /// ifndef _COPROC_DEFS_H_