blob: c54effae2202e83691d163aad4c42cd7cb6243f0 [file] [log] [blame]
David Howellsb920de12008-02-08 04:19:31 -08001/* MN10300 Core system registers
2 *
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */
11#ifndef _ASM_CPU_REGS_H
12#define _ASM_CPU_REGS_H
13
14#ifndef __ASSEMBLY__
15#include <linux/types.h>
16#endif
17
David Howellsb920de12008-02-08 04:19:31 -080018/* we tell the compiler to pretend to be AM33 so that it doesn't try and use
19 * the FP regs, but tell the assembler that we're actually allowed AM33v2
20 * instructions */
21#ifndef __ASSEMBLY__
22asm(" .am33_2\n");
23#else
24.am33_2
25#endif
David Howellsb920de12008-02-08 04:19:31 -080026
27#ifdef __KERNEL__
28
29#ifndef __ASSEMBLY__
30#define __SYSREG(ADDR, TYPE) (*(volatile TYPE *)(ADDR))
31#define __SYSREGC(ADDR, TYPE) (*(const volatile TYPE *)(ADDR))
32#else
33#define __SYSREG(ADDR, TYPE) ADDR
34#define __SYSREGC(ADDR, TYPE) ADDR
35#endif
36
37/* CPU registers */
38#define EPSW_FLAG_Z 0x00000001 /* zero flag */
39#define EPSW_FLAG_N 0x00000002 /* negative flag */
40#define EPSW_FLAG_C 0x00000004 /* carry flag */
41#define EPSW_FLAG_V 0x00000008 /* overflow flag */
42#define EPSW_IM 0x00000700 /* interrupt mode */
43#define EPSW_IM_0 0x00000000 /* interrupt mode 0 */
44#define EPSW_IM_1 0x00000100 /* interrupt mode 1 */
45#define EPSW_IM_2 0x00000200 /* interrupt mode 2 */
46#define EPSW_IM_3 0x00000300 /* interrupt mode 3 */
47#define EPSW_IM_4 0x00000400 /* interrupt mode 4 */
48#define EPSW_IM_5 0x00000500 /* interrupt mode 5 */
49#define EPSW_IM_6 0x00000600 /* interrupt mode 6 */
50#define EPSW_IM_7 0x00000700 /* interrupt mode 7 */
51#define EPSW_IE 0x00000800 /* interrupt enable */
Lucas De Marchi25985ed2011-03-30 22:57:33 -030052#define EPSW_S 0x00003000 /* software auxiliary bits */
David Howellsb920de12008-02-08 04:19:31 -080053#define EPSW_T 0x00008000 /* trace enable */
54#define EPSW_nSL 0x00010000 /* not supervisor level */
55#define EPSW_NMID 0x00020000 /* nonmaskable interrupt disable */
56#define EPSW_nAR 0x00040000 /* register bank control */
57#define EPSW_ML 0x00080000 /* monitor level */
58#define EPSW_FE 0x00100000 /* FPU enable */
Akira Takeuchi8fbbf7c2010-10-27 17:28:40 +010059#define EPSW_IM_SHIFT 8 /* EPSW_IM_SHIFT determines the interrupt mode */
60
61#define NUM2EPSW_IM(num) ((num) << EPSW_IM_SHIFT)
David Howellsb920de12008-02-08 04:19:31 -080062
63/* FPU registers */
64#define FPCR_EF_I 0x00000001 /* inexact result FPU exception flag */
65#define FPCR_EF_U 0x00000002 /* underflow FPU exception flag */
66#define FPCR_EF_O 0x00000004 /* overflow FPU exception flag */
67#define FPCR_EF_Z 0x00000008 /* zero divide FPU exception flag */
68#define FPCR_EF_V 0x00000010 /* invalid operand FPU exception flag */
69#define FPCR_EE_I 0x00000020 /* inexact result FPU exception enable */
70#define FPCR_EE_U 0x00000040 /* underflow FPU exception enable */
71#define FPCR_EE_O 0x00000080 /* overflow FPU exception enable */
72#define FPCR_EE_Z 0x00000100 /* zero divide FPU exception enable */
73#define FPCR_EE_V 0x00000200 /* invalid operand FPU exception enable */
74#define FPCR_EC_I 0x00000400 /* inexact result FPU exception cause */
75#define FPCR_EC_U 0x00000800 /* underflow FPU exception cause */
76#define FPCR_EC_O 0x00001000 /* overflow FPU exception cause */
77#define FPCR_EC_Z 0x00002000 /* zero divide FPU exception cause */
78#define FPCR_EC_V 0x00004000 /* invalid operand FPU exception cause */
79#define FPCR_RM 0x00030000 /* rounding mode */
80#define FPCR_RM_NEAREST 0x00000000 /* - round to nearest value */
81#define FPCR_FCC_U 0x00040000 /* FPU unordered condition code */
82#define FPCR_FCC_E 0x00080000 /* FPU equal condition code */
83#define FPCR_FCC_G 0x00100000 /* FPU greater than condition code */
84#define FPCR_FCC_L 0x00200000 /* FPU less than condition code */
85#define FPCR_INIT 0x00000000 /* no exceptions, rounding to nearest */
86
87/* CPU control registers */
88#define CPUP __SYSREG(0xc0000020, u16) /* CPU pipeline register */
89#define CPUP_DWBD 0x0020 /* write buffer disable flag */
90#define CPUP_IPFD 0x0040 /* instruction prefetch disable flag */
91#define CPUP_EXM 0x0080 /* exception operation mode */
92#define CPUP_EXM_AM33V1 0x0000 /* - AM33 v1 exception mode */
93#define CPUP_EXM_AM33V2 0x0080 /* - AM33 v2 exception mode */
94
95#define CPUM __SYSREG(0xc0000040, u16) /* CPU mode register */
96#define CPUM_SLEEP 0x0004 /* set to enter sleep state */
97#define CPUM_HALT 0x0008 /* set to enter halt state */
98#define CPUM_STOP 0x0010 /* set to enter stop state */
99
100#define CPUREV __SYSREGC(0xc0000050, u32) /* CPU revision register */
101#define CPUREV_TYPE 0x0000000f /* CPU type */
102#define CPUREV_TYPE_S 0
Akira Takeuchi8fbbf7c2010-10-27 17:28:40 +0100103#define CPUREV_TYPE_AM33_1 0x00000000 /* - AM33-1 core, AM33/1.00 arch */
104#define CPUREV_TYPE_AM33_2 0x00000001 /* - AM33-2 core, AM33/2.00 arch */
105#define CPUREV_TYPE_AM34_1 0x00000002 /* - AM34-1 core, AM33/2.00 arch */
106#define CPUREV_TYPE_AM33_3 0x00000003 /* - AM33-3 core, AM33/2.00 arch */
107#define CPUREV_TYPE_AM34_2 0x00000004 /* - AM34-2 core, AM33/3.00 arch */
David Howellsb920de12008-02-08 04:19:31 -0800108#define CPUREV_REVISION 0x000000f0 /* CPU revision */
109#define CPUREV_REVISION_S 4
110#define CPUREV_ICWAY 0x00000f00 /* number of instruction cache ways */
111#define CPUREV_ICWAY_S 8
112#define CPUREV_ICSIZE 0x0000f000 /* instruction cache way size */
113#define CPUREV_ICSIZE_S 12
114#define CPUREV_DCWAY 0x000f0000 /* number of data cache ways */
115#define CPUREV_DCWAY_S 16
116#define CPUREV_DCSIZE 0x00f00000 /* data cache way size */
117#define CPUREV_DCSIZE_S 20
118#define CPUREV_FPUTYPE 0x0f000000 /* FPU core type */
119#define CPUREV_FPUTYPE_NONE 0x00000000 /* - no FPU core implemented */
120#define CPUREV_OCDCTG 0xf0000000 /* on-chip debug function category */
121
122#define DCR __SYSREG(0xc0000030, u16) /* Debug control register */
123
124/* interrupt/exception control registers */
125#define IVAR0 __SYSREG(0xc0000000, u16) /* interrupt vector 0 */
126#define IVAR1 __SYSREG(0xc0000004, u16) /* interrupt vector 1 */
127#define IVAR2 __SYSREG(0xc0000008, u16) /* interrupt vector 2 */
128#define IVAR3 __SYSREG(0xc000000c, u16) /* interrupt vector 3 */
129#define IVAR4 __SYSREG(0xc0000010, u16) /* interrupt vector 4 */
130#define IVAR5 __SYSREG(0xc0000014, u16) /* interrupt vector 5 */
131#define IVAR6 __SYSREG(0xc0000018, u16) /* interrupt vector 6 */
132
133#define TBR __SYSREG(0xc0000024, u32) /* Trap table base */
134#define TBR_TB 0xff000000 /* table base address bits 31-24 */
135#define TBR_INT_CODE 0x00ffffff /* interrupt code */
136
137#define DEAR __SYSREG(0xc0000038, u32) /* Data access exception address */
138
139#define sISR __SYSREG(0xc0000044, u32) /* Supervisor interrupt status */
140#define sISR_IRQICE 0x00000001 /* ICE interrupt */
141#define sISR_ISTEP 0x00000002 /* single step interrupt */
142#define sISR_MISSA 0x00000004 /* memory access address misalignment fault */
143#define sISR_UNIMP 0x00000008 /* unimplemented instruction execution fault */
144#define sISR_PIEXE 0x00000010 /* program interrupt */
145#define sISR_MEMERR 0x00000020 /* illegal memory access fault */
146#define sISR_IBREAK 0x00000040 /* instraction break interrupt */
147#define sISR_DBSRL 0x00000080 /* debug serial interrupt */
148#define sISR_PERIDB 0x00000100 /* peripheral debug interrupt */
149#define sISR_EXUNIMP 0x00000200 /* unimplemented ex-instruction execution fault */
150#define sISR_OBREAK 0x00000400 /* operand break interrupt */
151#define sISR_PRIV 0x00000800 /* privileged instruction execution fault */
152#define sISR_BUSERR 0x00001000 /* bus error fault */
153#define sISR_DBLFT 0x00002000 /* double fault */
154#define sISR_DBG 0x00008000 /* debug reserved interrupt */
155#define sISR_ITMISS 0x00010000 /* instruction TLB miss */
156#define sISR_DTMISS 0x00020000 /* data TLB miss */
157#define sISR_ITEX 0x00040000 /* instruction TLB access exception */
158#define sISR_DTEX 0x00080000 /* data TLB access exception */
159#define sISR_ILGIA 0x00100000 /* illegal instruction access exception */
160#define sISR_ILGDA 0x00200000 /* illegal data access exception */
161#define sISR_IOIA 0x00400000 /* internal I/O space instruction access excep */
162#define sISR_PRIVA 0x00800000 /* privileged space instruction access excep */
163#define sISR_PRIDA 0x01000000 /* privileged space data access excep */
164#define sISR_DISA 0x02000000 /* data space instruction access excep */
165#define sISR_SYSC 0x04000000 /* system call instruction excep */
166#define sISR_FPUD 0x08000000 /* FPU disabled excep */
167#define sISR_FPUUI 0x10000000 /* FPU unimplemented instruction excep */
168#define sISR_FPUOP 0x20000000 /* FPU operation excep */
169#define sISR_NE 0x80000000 /* multiple synchronous exceptions excep */
170
171/* cache control registers */
172#define CHCTR __SYSREG(0xc0000070, u16) /* cache control */
173#define CHCTR_ICEN 0x0001 /* instruction cache enable */
174#define CHCTR_DCEN 0x0002 /* data cache enable */
175#define CHCTR_ICBUSY 0x0004 /* instruction cache busy */
176#define CHCTR_DCBUSY 0x0008 /* data cache busy */
177#define CHCTR_ICINV 0x0010 /* instruction cache invalidate */
178#define CHCTR_DCINV 0x0020 /* data cache invalidate */
179#define CHCTR_DCWTMD 0x0040 /* data cache writing mode */
180#define CHCTR_DCWTMD_WRBACK 0x0000 /* - write back mode */
181#define CHCTR_DCWTMD_WRTHROUGH 0x0040 /* - write through mode */
182#define CHCTR_DCALMD 0x0080 /* data cache allocation mode */
183#define CHCTR_ICWMD 0x0f00 /* instruction cache way mode */
184#define CHCTR_DCWMD 0xf000 /* data cache way mode */
185
Akira Takeuchi8fbbf7c2010-10-27 17:28:40 +0100186#ifdef CONFIG_AM34_2
187#define ICIVCR __SYSREG(0xc0000c00, u32) /* icache area invalidate control */
188#define ICIVCR_ICIVBSY 0x00000008 /* icache area invalidate busy */
189#define ICIVCR_ICI 0x00000001 /* icache area invalidate */
190
191#define ICIVMR __SYSREG(0xc0000c04, u32) /* icache area invalidate mask */
192
193#define DCPGCR __SYSREG(0xc0000c10, u32) /* data cache area purge control */
194#define DCPGCR_DCPGBSY 0x00000008 /* data cache area purge busy */
195#define DCPGCR_DCP 0x00000002 /* data cache area purge */
196#define DCPGCR_DCI 0x00000001 /* data cache area invalidate */
197
198#define DCPGMR __SYSREG(0xc0000c14, u32) /* data cache area purge mask */
199#endif /* CONFIG_AM34_2 */
200
David Howellsb920de12008-02-08 04:19:31 -0800201/* MMU control registers */
202#define MMUCTR __SYSREG(0xc0000090, u32) /* MMU control register */
203#define MMUCTR_IRP 0x0000003f /* instruction TLB replace pointer */
204#define MMUCTR_ITE 0x00000040 /* instruction TLB enable */
205#define MMUCTR_IIV 0x00000080 /* instruction TLB invalidate */
206#define MMUCTR_ITL 0x00000700 /* instruction TLB lock pointer */
207#define MMUCTR_ITL_NOLOCK 0x00000000 /* - no lock */
208#define MMUCTR_ITL_LOCK0 0x00000100 /* - entry 0 locked */
209#define MMUCTR_ITL_LOCK0_1 0x00000200 /* - entry 0-1 locked */
210#define MMUCTR_ITL_LOCK0_3 0x00000300 /* - entry 0-3 locked */
211#define MMUCTR_ITL_LOCK0_7 0x00000400 /* - entry 0-7 locked */
212#define MMUCTR_ITL_LOCK0_15 0x00000500 /* - entry 0-15 locked */
213#define MMUCTR_CE 0x00008000 /* cacheable bit enable */
214#define MMUCTR_DRP 0x003f0000 /* data TLB replace pointer */
215#define MMUCTR_DTE 0x00400000 /* data TLB enable */
216#define MMUCTR_DIV 0x00800000 /* data TLB invalidate */
217#define MMUCTR_DTL 0x07000000 /* data TLB lock pointer */
218#define MMUCTR_DTL_NOLOCK 0x00000000 /* - no lock */
219#define MMUCTR_DTL_LOCK0 0x01000000 /* - entry 0 locked */
220#define MMUCTR_DTL_LOCK0_1 0x02000000 /* - entry 0-1 locked */
221#define MMUCTR_DTL_LOCK0_3 0x03000000 /* - entry 0-3 locked */
222#define MMUCTR_DTL_LOCK0_7 0x04000000 /* - entry 0-7 locked */
223#define MMUCTR_DTL_LOCK0_15 0x05000000 /* - entry 0-15 locked */
Akira Takeuchi8fbbf7c2010-10-27 17:28:40 +0100224#ifdef CONFIG_AM34_2
225#define MMUCTR_WTE 0x80000000 /* write-through cache TLB entry bit enable */
226#endif
David Howellsb920de12008-02-08 04:19:31 -0800227
228#define PIDR __SYSREG(0xc0000094, u16) /* PID register */
229#define PIDR_PID 0x00ff /* process identifier */
230
231#define PTBR __SYSREG(0xc0000098, unsigned long) /* Page table base register */
232
233#define IPTEL __SYSREG(0xc00000a0, u32) /* instruction TLB entry */
234#define DPTEL __SYSREG(0xc00000b0, u32) /* data TLB entry */
235#define xPTEL_V 0x00000001 /* TLB entry valid */
236#define xPTEL_UNUSED1 0x00000002 /* unused bit */
237#define xPTEL_UNUSED2 0x00000004 /* unused bit */
238#define xPTEL_C 0x00000008 /* cached if set */
239#define xPTEL_PV 0x00000010 /* page valid */
240#define xPTEL_D 0x00000020 /* dirty */
241#define xPTEL_PR 0x000001c0 /* page protection */
242#define xPTEL_PR_ROK 0x00000000 /* - R/O kernel */
243#define xPTEL_PR_RWK 0x00000100 /* - R/W kernel */
244#define xPTEL_PR_ROK_ROU 0x00000080 /* - R/O kernel and R/O user */
245#define xPTEL_PR_RWK_ROU 0x00000180 /* - R/W kernel and R/O user */
246#define xPTEL_PR_RWK_RWU 0x000001c0 /* - R/W kernel and R/W user */
247#define xPTEL_G 0x00000200 /* global (use PID if 0) */
248#define xPTEL_PS 0x00000c00 /* page size */
249#define xPTEL_PS_4Kb 0x00000000 /* - 4Kb page */
250#define xPTEL_PS_128Kb 0x00000400 /* - 128Kb page */
251#define xPTEL_PS_1Kb 0x00000800 /* - 1Kb page */
252#define xPTEL_PS_4Mb 0x00000c00 /* - 4Mb page */
253#define xPTEL_PPN 0xfffff006 /* physical page number */
254
David Howellsb920de12008-02-08 04:19:31 -0800255#define IPTEU __SYSREG(0xc00000a4, u32) /* instruction TLB virtual addr */
256#define DPTEU __SYSREG(0xc00000b4, u32) /* data TLB virtual addr */
257#define xPTEU_VPN 0xfffffc00 /* virtual page number */
258#define xPTEU_PID 0x000000ff /* process identifier to which applicable */
259
260#define IPTEL2 __SYSREG(0xc00000a8, u32) /* instruction TLB entry */
261#define DPTEL2 __SYSREG(0xc00000b8, u32) /* data TLB entry */
262#define xPTEL2_V 0x00000001 /* TLB entry valid */
263#define xPTEL2_C 0x00000002 /* cacheable */
264#define xPTEL2_PV 0x00000004 /* page valid */
265#define xPTEL2_D 0x00000008 /* dirty */
266#define xPTEL2_PR 0x00000070 /* page protection */
267#define xPTEL2_PR_ROK 0x00000000 /* - R/O kernel */
268#define xPTEL2_PR_RWK 0x00000040 /* - R/W kernel */
269#define xPTEL2_PR_ROK_ROU 0x00000020 /* - R/O kernel and R/O user */
270#define xPTEL2_PR_RWK_ROU 0x00000060 /* - R/W kernel and R/O user */
271#define xPTEL2_PR_RWK_RWU 0x00000070 /* - R/W kernel and R/W user */
272#define xPTEL2_G 0x00000080 /* global (use PID if 0) */
273#define xPTEL2_PS 0x00000300 /* page size */
274#define xPTEL2_PS_4Kb 0x00000000 /* - 4Kb page */
275#define xPTEL2_PS_128Kb 0x00000100 /* - 128Kb page */
276#define xPTEL2_PS_1Kb 0x00000200 /* - 1Kb page */
277#define xPTEL2_PS_4Mb 0x00000300 /* - 4Mb page */
Akira Takeuchidccbf482010-10-27 17:28:50 +0100278#define xPTEL2_CWT 0x00000400 /* cacheable write-through */
279#define xPTEL2_UNUSED1 0x00000800 /* unused bit (broadcast mask) */
280#define xPTEL2_PPN 0xfffff000 /* physical page number */
281
282#define xPTEL2_V_BIT 0 /* bit numbers corresponding to above masks */
283#define xPTEL2_C_BIT 1
284#define xPTEL2_PV_BIT 2
285#define xPTEL2_D_BIT 3
286#define xPTEL2_G_BIT 7
287#define xPTEL2_UNUSED1_BIT 11
David Howellsb920de12008-02-08 04:19:31 -0800288
289#define MMUFCR __SYSREGC(0xc000009c, u32) /* MMU exception cause */
290#define MMUFCR_IFC __SYSREGC(0xc000009c, u16) /* MMU instruction excep cause */
291#define MMUFCR_DFC __SYSREGC(0xc000009e, u16) /* MMU data exception cause */
292#define MMUFCR_xFC_TLBMISS 0x0001 /* TLB miss flag */
293#define MMUFCR_xFC_INITWR 0x0002 /* initial write excep flag */
294#define MMUFCR_xFC_PGINVAL 0x0004 /* page invalid excep flag */
295#define MMUFCR_xFC_PROTVIOL 0x0008 /* protection violation excep flag */
296#define MMUFCR_xFC_ACCESS 0x0010 /* access level flag */
297#define MMUFCR_xFC_ACCESS_USR 0x0000 /* - user mode */
298#define MMUFCR_xFC_ACCESS_SR 0x0010 /* - supervisor mode */
299#define MMUFCR_xFC_TYPE 0x0020 /* access type flag */
300#define MMUFCR_xFC_TYPE_READ 0x0000 /* - read */
301#define MMUFCR_xFC_TYPE_WRITE 0x0020 /* - write */
302#define MMUFCR_xFC_PR 0x01c0 /* page protection flag */
303#define MMUFCR_xFC_PR_ROK 0x0000 /* - R/O kernel */
304#define MMUFCR_xFC_PR_RWK 0x0100 /* - R/W kernel */
305#define MMUFCR_xFC_PR_ROK_ROU 0x0080 /* - R/O kernel and R/O user */
306#define MMUFCR_xFC_PR_RWK_ROU 0x0180 /* - R/W kernel and R/O user */
307#define MMUFCR_xFC_PR_RWK_RWU 0x01c0 /* - R/W kernel and R/W user */
308#define MMUFCR_xFC_ILLADDR 0x0200 /* illegal address excep flag */
309
Akira Takeuchi8fbbf7c2010-10-27 17:28:40 +0100310#ifdef CONFIG_MN10300_HAS_ATOMIC_OPS_UNIT
311/* atomic operation registers */
312#define AAR __SYSREG(0xc0000a00, u32) /* cacheable address */
313#define AAR2 __SYSREG(0xc0000a04, u32) /* uncacheable address */
314#define ADR __SYSREG(0xc0000a08, u32) /* data */
315#define ASR __SYSREG(0xc0000a0c, u32) /* status */
316#define AARU __SYSREG(0xd400aa00, u32) /* user address */
317#define ADRU __SYSREG(0xd400aa08, u32) /* user data */
318#define ASRU __SYSREG(0xd400aa0c, u32) /* user status */
319
320#define ASR_RW 0x00000008 /* read */
321#define ASR_BW 0x00000004 /* bus error */
322#define ASR_IW 0x00000002 /* interrupt */
323#define ASR_LW 0x00000001 /* bus lock */
324
325#define ASRU_RW ASR_RW /* read */
326#define ASRU_BW ASR_BW /* bus error */
327#define ASRU_IW ASR_IW /* interrupt */
328#define ASRU_LW ASR_LW /* bus lock */
329
330/* in inline ASM, we stick the base pointer in to a reg and use offsets from
331 * it */
332#define ATOMIC_OPS_BASE_ADDR 0xc0000a00
333#ifndef __ASSEMBLY__
334asm(
335 "_AAR = 0\n"
336 "_AAR2 = 4\n"
337 "_ADR = 8\n"
338 "_ASR = 12\n");
339#else
340#define _AAR 0
341#define _AAR2 4
342#define _ADR 8
343#define _ASR 12
344#endif
345
346/* physical page address for userspace atomic operations registers */
347#define USER_ATOMIC_OPS_PAGE_ADDR 0xd400a000
348
349#endif /* CONFIG_MN10300_HAS_ATOMIC_OPS_UNIT */
350
David Howellsb920de12008-02-08 04:19:31 -0800351#endif /* __KERNEL__ */
352
353#endif /* _ASM_CPU_REGS_H */