xref: /openbmc/linux/arch/mips/include/asm/cpu.h (revision 0dd4781bca56871434507ed35d5bb8ef92077907)
1384740dcSRalf Baechle /*
2384740dcSRalf Baechle  * cpu.h: Values of the PRId register used to match up
3384740dcSRalf Baechle  *        various MIPS cpu types.
4384740dcSRalf Baechle  *
5384740dcSRalf Baechle  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
6384740dcSRalf Baechle  * Copyright (C) 2004  Maciej W. Rozycki
7384740dcSRalf Baechle  */
8384740dcSRalf Baechle #ifndef _ASM_CPU_H
9384740dcSRalf Baechle #define _ASM_CPU_H
10384740dcSRalf Baechle 
11384740dcSRalf Baechle /* Assigned Company values for bits 23:16 of the PRId Register
12384740dcSRalf Baechle    (CP0 register 15, select 0).  As of the MIPS32 and MIPS64 specs from
13384740dcSRalf Baechle    MTI, the PRId register is defined in this (backwards compatible)
14384740dcSRalf Baechle    way:
15384740dcSRalf Baechle 
16384740dcSRalf Baechle   +----------------+----------------+----------------+----------------+
17384740dcSRalf Baechle   | Company Options| Company ID     | Processor ID   | Revision       |
18384740dcSRalf Baechle   +----------------+----------------+----------------+----------------+
19384740dcSRalf Baechle    31            24 23            16 15             8 7
20384740dcSRalf Baechle 
21384740dcSRalf Baechle    I don't have docs for all the previous processors, but my impression is
22384740dcSRalf Baechle    that bits 16-23 have been 0 for all MIPS processors before the MIPS32/64
23384740dcSRalf Baechle    spec.
24384740dcSRalf Baechle */
25384740dcSRalf Baechle 
26384740dcSRalf Baechle #define PRID_COMP_LEGACY	0x000000
27384740dcSRalf Baechle #define PRID_COMP_MIPS		0x010000
28384740dcSRalf Baechle #define PRID_COMP_BROADCOM	0x020000
29384740dcSRalf Baechle #define PRID_COMP_ALCHEMY	0x030000
30384740dcSRalf Baechle #define PRID_COMP_SIBYTE	0x040000
31384740dcSRalf Baechle #define PRID_COMP_SANDCRAFT	0x050000
32384740dcSRalf Baechle #define PRID_COMP_NXP   	0x060000
33384740dcSRalf Baechle #define PRID_COMP_TOSHIBA	0x070000
34384740dcSRalf Baechle #define PRID_COMP_LSI		0x080000
35384740dcSRalf Baechle #define PRID_COMP_LEXRA		0x0b0000
36*0dd4781bSDavid Daney #define PRID_COMP_CAVIUM	0x0d0000
37384740dcSRalf Baechle 
38384740dcSRalf Baechle 
39384740dcSRalf Baechle /*
40384740dcSRalf Baechle  * Assigned values for the product ID register.  In order to detect a
41384740dcSRalf Baechle  * certain CPU type exactly eventually additional registers may need to
42384740dcSRalf Baechle  * be examined.  These are valid when 23:16 == PRID_COMP_LEGACY
43384740dcSRalf Baechle  */
44384740dcSRalf Baechle #define PRID_IMP_R2000		0x0100
45384740dcSRalf Baechle #define PRID_IMP_AU1_REV1	0x0100
46384740dcSRalf Baechle #define PRID_IMP_AU1_REV2	0x0200
47384740dcSRalf Baechle #define PRID_IMP_R3000		0x0200		/* Same as R2000A  */
48384740dcSRalf Baechle #define PRID_IMP_R6000		0x0300		/* Same as R3000A  */
49384740dcSRalf Baechle #define PRID_IMP_R4000		0x0400
50384740dcSRalf Baechle #define PRID_IMP_R6000A		0x0600
51384740dcSRalf Baechle #define PRID_IMP_R10000		0x0900
52384740dcSRalf Baechle #define PRID_IMP_R4300		0x0b00
53384740dcSRalf Baechle #define PRID_IMP_VR41XX		0x0c00
54384740dcSRalf Baechle #define PRID_IMP_R12000		0x0e00
55384740dcSRalf Baechle #define PRID_IMP_R14000		0x0f00
56384740dcSRalf Baechle #define PRID_IMP_R8000		0x1000
57384740dcSRalf Baechle #define PRID_IMP_PR4450		0x1200
58384740dcSRalf Baechle #define PRID_IMP_R4600		0x2000
59384740dcSRalf Baechle #define PRID_IMP_R4700		0x2100
60384740dcSRalf Baechle #define PRID_IMP_TX39		0x2200
61384740dcSRalf Baechle #define PRID_IMP_R4640		0x2200
62384740dcSRalf Baechle #define PRID_IMP_R4650		0x2200		/* Same as R4640 */
63384740dcSRalf Baechle #define PRID_IMP_R5000		0x2300
64384740dcSRalf Baechle #define PRID_IMP_TX49		0x2d00
65384740dcSRalf Baechle #define PRID_IMP_SONIC		0x2400
66384740dcSRalf Baechle #define PRID_IMP_MAGIC		0x2500
67384740dcSRalf Baechle #define PRID_IMP_RM7000		0x2700
68384740dcSRalf Baechle #define PRID_IMP_NEVADA		0x2800		/* RM5260 ??? */
69384740dcSRalf Baechle #define PRID_IMP_RM9000		0x3400
70384740dcSRalf Baechle #define PRID_IMP_LOONGSON1	0x4200
71384740dcSRalf Baechle #define PRID_IMP_R5432		0x5400
72384740dcSRalf Baechle #define PRID_IMP_R5500		0x5500
73384740dcSRalf Baechle #define PRID_IMP_LOONGSON2	0x6300
74384740dcSRalf Baechle 
75384740dcSRalf Baechle #define PRID_IMP_UNKNOWN	0xff00
76384740dcSRalf Baechle 
77384740dcSRalf Baechle /*
78384740dcSRalf Baechle  * These are the PRID's for when 23:16 == PRID_COMP_MIPS
79384740dcSRalf Baechle  */
80384740dcSRalf Baechle 
81384740dcSRalf Baechle #define PRID_IMP_4KC		0x8000
82384740dcSRalf Baechle #define PRID_IMP_5KC		0x8100
83384740dcSRalf Baechle #define PRID_IMP_20KC		0x8200
84384740dcSRalf Baechle #define PRID_IMP_4KEC		0x8400
85384740dcSRalf Baechle #define PRID_IMP_4KSC		0x8600
86384740dcSRalf Baechle #define PRID_IMP_25KF		0x8800
87384740dcSRalf Baechle #define PRID_IMP_5KE		0x8900
88384740dcSRalf Baechle #define PRID_IMP_4KECR2		0x9000
89384740dcSRalf Baechle #define PRID_IMP_4KEMPR2	0x9100
90384740dcSRalf Baechle #define PRID_IMP_4KSD		0x9200
91384740dcSRalf Baechle #define PRID_IMP_24K		0x9300
92384740dcSRalf Baechle #define PRID_IMP_34K		0x9500
93384740dcSRalf Baechle #define PRID_IMP_24KE		0x9600
94384740dcSRalf Baechle #define PRID_IMP_74K		0x9700
95384740dcSRalf Baechle #define PRID_IMP_1004K		0x9900
96384740dcSRalf Baechle 
97384740dcSRalf Baechle /*
98384740dcSRalf Baechle  * These are the PRID's for when 23:16 == PRID_COMP_SIBYTE
99384740dcSRalf Baechle  */
100384740dcSRalf Baechle 
101384740dcSRalf Baechle #define PRID_IMP_SB1            0x0100
102384740dcSRalf Baechle #define PRID_IMP_SB1A           0x1100
103384740dcSRalf Baechle 
104384740dcSRalf Baechle /*
105384740dcSRalf Baechle  * These are the PRID's for when 23:16 == PRID_COMP_SANDCRAFT
106384740dcSRalf Baechle  */
107384740dcSRalf Baechle 
108384740dcSRalf Baechle #define PRID_IMP_SR71000        0x0400
109384740dcSRalf Baechle 
110384740dcSRalf Baechle /*
111384740dcSRalf Baechle  * These are the PRID's for when 23:16 == PRID_COMP_BROADCOM
112384740dcSRalf Baechle  */
113384740dcSRalf Baechle 
114384740dcSRalf Baechle #define PRID_IMP_BCM4710	0x4000
115384740dcSRalf Baechle #define PRID_IMP_BCM3302	0x9000
116384740dcSRalf Baechle 
117384740dcSRalf Baechle /*
118*0dd4781bSDavid Daney  * These are the PRID's for when 23:16 == PRID_COMP_CAVIUM
119*0dd4781bSDavid Daney  */
120*0dd4781bSDavid Daney 
121*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN38XX 0x0000
122*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN31XX 0x0100
123*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN30XX 0x0200
124*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN58XX 0x0300
125*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN56XX 0x0400
126*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN50XX 0x0600
127*0dd4781bSDavid Daney #define PRID_IMP_CAVIUM_CN52XX 0x0700
128*0dd4781bSDavid Daney 
129*0dd4781bSDavid Daney /*
130384740dcSRalf Baechle  * Definitions for 7:0 on legacy processors
131384740dcSRalf Baechle  */
132384740dcSRalf Baechle 
133384740dcSRalf Baechle #define PRID_REV_MASK		0x00ff
134384740dcSRalf Baechle 
135384740dcSRalf Baechle #define PRID_REV_TX4927		0x0022
136384740dcSRalf Baechle #define PRID_REV_TX4937		0x0030
137384740dcSRalf Baechle #define PRID_REV_R4400		0x0040
138384740dcSRalf Baechle #define PRID_REV_R3000A		0x0030
139384740dcSRalf Baechle #define PRID_REV_R3000		0x0020
140384740dcSRalf Baechle #define PRID_REV_R2000A		0x0010
141384740dcSRalf Baechle #define PRID_REV_TX3912 	0x0010
142384740dcSRalf Baechle #define PRID_REV_TX3922 	0x0030
143384740dcSRalf Baechle #define PRID_REV_TX3927 	0x0040
144384740dcSRalf Baechle #define PRID_REV_VR4111		0x0050
145384740dcSRalf Baechle #define PRID_REV_VR4181		0x0050	/* Same as VR4111 */
146384740dcSRalf Baechle #define PRID_REV_VR4121		0x0060
147384740dcSRalf Baechle #define PRID_REV_VR4122		0x0070
148384740dcSRalf Baechle #define PRID_REV_VR4181A	0x0070	/* Same as VR4122 */
149384740dcSRalf Baechle #define PRID_REV_VR4130		0x0080
150384740dcSRalf Baechle #define PRID_REV_34K_V1_0_2	0x0022
151384740dcSRalf Baechle 
152384740dcSRalf Baechle /*
153384740dcSRalf Baechle  * Older processors used to encode processor version and revision in two
154384740dcSRalf Baechle  * 4-bit bitfields, the 4K seems to simply count up and even newer MTI cores
155384740dcSRalf Baechle  * have switched to use the 8-bits as 3:3:2 bitfield with the last field as
156384740dcSRalf Baechle  * the patch number.  *ARGH*
157384740dcSRalf Baechle  */
158384740dcSRalf Baechle #define PRID_REV_ENCODE_44(ver, rev)					\
159384740dcSRalf Baechle 	((ver) << 4 | (rev))
160384740dcSRalf Baechle #define PRID_REV_ENCODE_332(ver, rev, patch)				\
161384740dcSRalf Baechle 	((ver) << 5 | (rev) << 2 | (patch))
162384740dcSRalf Baechle 
163384740dcSRalf Baechle /*
164384740dcSRalf Baechle  * FPU implementation/revision register (CP1 control register 0).
165384740dcSRalf Baechle  *
166384740dcSRalf Baechle  * +---------------------------------+----------------+----------------+
167384740dcSRalf Baechle  * | 0                               | Implementation | Revision       |
168384740dcSRalf Baechle  * +---------------------------------+----------------+----------------+
169384740dcSRalf Baechle  *  31                             16 15             8 7              0
170384740dcSRalf Baechle  */
171384740dcSRalf Baechle 
172384740dcSRalf Baechle #define FPIR_IMP_NONE		0x0000
173384740dcSRalf Baechle 
174384740dcSRalf Baechle enum cpu_type_enum {
175384740dcSRalf Baechle 	CPU_UNKNOWN,
176384740dcSRalf Baechle 
177384740dcSRalf Baechle 	/*
178384740dcSRalf Baechle 	 * R2000 class processors
179384740dcSRalf Baechle 	 */
180384740dcSRalf Baechle 	CPU_R2000, CPU_R3000, CPU_R3000A, CPU_R3041, CPU_R3051, CPU_R3052,
181384740dcSRalf Baechle 	CPU_R3081, CPU_R3081E,
182384740dcSRalf Baechle 
183384740dcSRalf Baechle 	/*
184384740dcSRalf Baechle 	 * R6000 class processors
185384740dcSRalf Baechle 	 */
186384740dcSRalf Baechle 	CPU_R6000, CPU_R6000A,
187384740dcSRalf Baechle 
188384740dcSRalf Baechle 	/*
189384740dcSRalf Baechle 	 * R4000 class processors
190384740dcSRalf Baechle 	 */
191384740dcSRalf Baechle 	CPU_R4000PC, CPU_R4000SC, CPU_R4000MC, CPU_R4200, CPU_R4300, CPU_R4310,
192384740dcSRalf Baechle 	CPU_R4400PC, CPU_R4400SC, CPU_R4400MC, CPU_R4600, CPU_R4640, CPU_R4650,
193384740dcSRalf Baechle 	CPU_R4700, CPU_R5000, CPU_R5000A, CPU_R5500, CPU_NEVADA, CPU_R5432,
194384740dcSRalf Baechle 	CPU_R10000, CPU_R12000, CPU_R14000, CPU_VR41XX, CPU_VR4111, CPU_VR4121,
195384740dcSRalf Baechle 	CPU_VR4122, CPU_VR4131, CPU_VR4133, CPU_VR4181, CPU_VR4181A, CPU_RM7000,
196384740dcSRalf Baechle 	CPU_SR71000, CPU_RM9000, CPU_TX49XX,
197384740dcSRalf Baechle 
198384740dcSRalf Baechle 	/*
199384740dcSRalf Baechle 	 * R8000 class processors
200384740dcSRalf Baechle 	 */
201384740dcSRalf Baechle 	CPU_R8000,
202384740dcSRalf Baechle 
203384740dcSRalf Baechle 	/*
204384740dcSRalf Baechle 	 * TX3900 class processors
205384740dcSRalf Baechle 	 */
206384740dcSRalf Baechle 	CPU_TX3912, CPU_TX3922, CPU_TX3927,
207384740dcSRalf Baechle 
208384740dcSRalf Baechle 	/*
209384740dcSRalf Baechle 	 * MIPS32 class processors
210384740dcSRalf Baechle 	 */
211384740dcSRalf Baechle 	CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K,
212384740dcSRalf Baechle 	CPU_AU1000, CPU_AU1100, CPU_AU1200, CPU_AU1210, CPU_AU1250, CPU_AU1500,
213384740dcSRalf Baechle 	CPU_AU1550, CPU_PR4450, CPU_BCM3302, CPU_BCM4710,
214384740dcSRalf Baechle 
215384740dcSRalf Baechle 	/*
216384740dcSRalf Baechle 	 * MIPS64 class processors
217384740dcSRalf Baechle 	 */
218384740dcSRalf Baechle 	CPU_5KC, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2,
219*0dd4781bSDavid Daney 	CPU_CAVIUM_OCTEON,
220384740dcSRalf Baechle 
221384740dcSRalf Baechle 	CPU_LAST
222384740dcSRalf Baechle };
223384740dcSRalf Baechle 
224384740dcSRalf Baechle 
225384740dcSRalf Baechle /*
226384740dcSRalf Baechle  * ISA Level encodings
227384740dcSRalf Baechle  *
228384740dcSRalf Baechle  */
229384740dcSRalf Baechle #define MIPS_CPU_ISA_I		0x00000001
230384740dcSRalf Baechle #define MIPS_CPU_ISA_II		0x00000002
231384740dcSRalf Baechle #define MIPS_CPU_ISA_III	0x00000004
232384740dcSRalf Baechle #define MIPS_CPU_ISA_IV		0x00000008
233384740dcSRalf Baechle #define MIPS_CPU_ISA_V		0x00000010
234384740dcSRalf Baechle #define MIPS_CPU_ISA_M32R1	0x00000020
235384740dcSRalf Baechle #define MIPS_CPU_ISA_M32R2	0x00000040
236384740dcSRalf Baechle #define MIPS_CPU_ISA_M64R1	0x00000080
237384740dcSRalf Baechle #define MIPS_CPU_ISA_M64R2	0x00000100
238384740dcSRalf Baechle 
239384740dcSRalf Baechle #define MIPS_CPU_ISA_32BIT (MIPS_CPU_ISA_I | MIPS_CPU_ISA_II | \
240384740dcSRalf Baechle 	MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 )
241384740dcSRalf Baechle #define MIPS_CPU_ISA_64BIT (MIPS_CPU_ISA_III | MIPS_CPU_ISA_IV | \
242384740dcSRalf Baechle 	MIPS_CPU_ISA_V | MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)
243384740dcSRalf Baechle 
244384740dcSRalf Baechle /*
245384740dcSRalf Baechle  * CPU Option encodings
246384740dcSRalf Baechle  */
247384740dcSRalf Baechle #define MIPS_CPU_TLB		0x00000001 /* CPU has TLB */
248384740dcSRalf Baechle #define MIPS_CPU_4KEX		0x00000002 /* "R4K" exception model */
249384740dcSRalf Baechle #define MIPS_CPU_3K_CACHE	0x00000004 /* R3000-style caches */
250384740dcSRalf Baechle #define MIPS_CPU_4K_CACHE	0x00000008 /* R4000-style caches */
251384740dcSRalf Baechle #define MIPS_CPU_TX39_CACHE	0x00000010 /* TX3900-style caches */
252384740dcSRalf Baechle #define MIPS_CPU_FPU		0x00000020 /* CPU has FPU */
253384740dcSRalf Baechle #define MIPS_CPU_32FPR		0x00000040 /* 32 dbl. prec. FP registers */
254384740dcSRalf Baechle #define MIPS_CPU_COUNTER	0x00000080 /* Cycle count/compare */
255384740dcSRalf Baechle #define MIPS_CPU_WATCH		0x00000100 /* watchpoint registers */
256384740dcSRalf Baechle #define MIPS_CPU_DIVEC		0x00000200 /* dedicated interrupt vector */
257384740dcSRalf Baechle #define MIPS_CPU_VCE		0x00000400 /* virt. coherence conflict possible */
258384740dcSRalf Baechle #define MIPS_CPU_CACHE_CDEX_P	0x00000800 /* Create_Dirty_Exclusive CACHE op */
259384740dcSRalf Baechle #define MIPS_CPU_CACHE_CDEX_S	0x00001000 /* ... same for seconary cache ... */
260384740dcSRalf Baechle #define MIPS_CPU_MCHECK		0x00002000 /* Machine check exception */
261384740dcSRalf Baechle #define MIPS_CPU_EJTAG		0x00004000 /* EJTAG exception */
262384740dcSRalf Baechle #define MIPS_CPU_NOFPUEX	0x00008000 /* no FPU exception */
263384740dcSRalf Baechle #define MIPS_CPU_LLSC		0x00010000 /* CPU has ll/sc instructions */
264384740dcSRalf Baechle #define MIPS_CPU_INCLUSIVE_CACHES	0x00020000 /* P-cache subset enforced */
265384740dcSRalf Baechle #define MIPS_CPU_PREFETCH	0x00040000 /* CPU has usable prefetch */
266384740dcSRalf Baechle #define MIPS_CPU_VINT		0x00080000 /* CPU supports MIPSR2 vectored interrupts */
267384740dcSRalf Baechle #define MIPS_CPU_VEIC		0x00100000 /* CPU supports MIPSR2 external interrupt controller mode */
268384740dcSRalf Baechle #define MIPS_CPU_ULRI		0x00200000 /* CPU has ULRI feature */
269384740dcSRalf Baechle 
270384740dcSRalf Baechle /*
271384740dcSRalf Baechle  * CPU ASE encodings
272384740dcSRalf Baechle  */
273384740dcSRalf Baechle #define MIPS_ASE_MIPS16		0x00000001 /* code compression */
274384740dcSRalf Baechle #define MIPS_ASE_MDMX		0x00000002 /* MIPS digital media extension */
275384740dcSRalf Baechle #define MIPS_ASE_MIPS3D		0x00000004 /* MIPS-3D */
276384740dcSRalf Baechle #define MIPS_ASE_SMARTMIPS	0x00000008 /* SmartMIPS */
277384740dcSRalf Baechle #define MIPS_ASE_DSP		0x00000010 /* Signal Processing ASE */
278384740dcSRalf Baechle #define MIPS_ASE_MIPSMT		0x00000020 /* CPU supports MIPS MT */
279384740dcSRalf Baechle 
280384740dcSRalf Baechle 
281384740dcSRalf Baechle #endif /* _ASM_CPU_H */
282