xref: /openbmc/linux/arch/loongarch/include/asm/cpu.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1f2ac457aSHuacai Chen /* SPDX-License-Identifier: GPL-2.0 */
2f2ac457aSHuacai Chen /*
3f2ac457aSHuacai Chen  * cpu.h: Values of the PRID register used to match up
4f2ac457aSHuacai Chen  *	  various LoongArch CPU types.
5f2ac457aSHuacai Chen  *
6f2ac457aSHuacai Chen  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
7f2ac457aSHuacai Chen  */
8f2ac457aSHuacai Chen #ifndef _ASM_CPU_H
9f2ac457aSHuacai Chen #define _ASM_CPU_H
10f2ac457aSHuacai Chen 
11f2ac457aSHuacai Chen /*
12f2ac457aSHuacai Chen  * As described in LoongArch specs from Loongson Technology, the PRID register
13f2ac457aSHuacai Chen  * (CPUCFG.00) has the following layout:
14f2ac457aSHuacai Chen  *
15f2ac457aSHuacai Chen  * +---------------+----------------+------------+--------------------+
16f2ac457aSHuacai Chen  * | Reserved      | Company ID     | Series ID  |  Product ID        |
17f2ac457aSHuacai Chen  * +---------------+----------------+------------+--------------------+
18f2ac457aSHuacai Chen  *  31		 24 23		  16 15	       12 11		     0
19f2ac457aSHuacai Chen  */
20f2ac457aSHuacai Chen 
21f2ac457aSHuacai Chen /*
22f2ac457aSHuacai Chen  * Assigned Company values for bits 23:16 of the PRID register.
23f2ac457aSHuacai Chen  */
24f2ac457aSHuacai Chen 
25f2ac457aSHuacai Chen #define PRID_COMP_MASK		0xff0000
26f2ac457aSHuacai Chen 
27f2ac457aSHuacai Chen #define PRID_COMP_LOONGSON	0x140000
28f2ac457aSHuacai Chen 
29f2ac457aSHuacai Chen /*
30f2ac457aSHuacai Chen  * Assigned Series ID values for bits 15:12 of the PRID register. In order
31f2ac457aSHuacai Chen  * to detect a certain CPU type exactly eventually additional registers may
32f2ac457aSHuacai Chen  * need to be examined.
33f2ac457aSHuacai Chen  */
34f2ac457aSHuacai Chen 
35f2ac457aSHuacai Chen #define PRID_SERIES_MASK	0xf000
36f2ac457aSHuacai Chen 
37f2ac457aSHuacai Chen #define PRID_SERIES_LA132	0x8000  /* Loongson 32bit */
38f2ac457aSHuacai Chen #define PRID_SERIES_LA264	0xa000  /* Loongson 64bit, 2-issue */
39fd200632SJinyang He #define PRID_SERIES_LA364	0xb000  /* Loongson 64bit, 3-issue */
40f2ac457aSHuacai Chen #define PRID_SERIES_LA464	0xc000  /* Loongson 64bit, 4-issue */
41f2ac457aSHuacai Chen #define PRID_SERIES_LA664	0xd000  /* Loongson 64bit, 6-issue */
42f2ac457aSHuacai Chen 
43f2ac457aSHuacai Chen /*
44f2ac457aSHuacai Chen  * Particular Product ID values for bits 11:0 of the PRID register.
45f2ac457aSHuacai Chen  */
46f2ac457aSHuacai Chen 
47f2ac457aSHuacai Chen #define PRID_PRODUCT_MASK	0x0fff
48f2ac457aSHuacai Chen 
49f2ac457aSHuacai Chen #if !defined(__ASSEMBLY__)
50f2ac457aSHuacai Chen 
51f2ac457aSHuacai Chen enum cpu_type_enum {
52f2ac457aSHuacai Chen 	CPU_UNKNOWN,
53f2ac457aSHuacai Chen 	CPU_LOONGSON32,
54f2ac457aSHuacai Chen 	CPU_LOONGSON64,
55f2ac457aSHuacai Chen 	CPU_LAST
56f2ac457aSHuacai Chen };
57f2ac457aSHuacai Chen 
58f2ac457aSHuacai Chen #endif /* !__ASSEMBLY */
59f2ac457aSHuacai Chen 
60f2ac457aSHuacai Chen /*
61f2ac457aSHuacai Chen  * ISA Level encodings
62f2ac457aSHuacai Chen  *
63f2ac457aSHuacai Chen  */
64f2ac457aSHuacai Chen 
65f2ac457aSHuacai Chen #define LOONGARCH_CPU_ISA_LA32R 0x00000001
66f2ac457aSHuacai Chen #define LOONGARCH_CPU_ISA_LA32S 0x00000002
67f2ac457aSHuacai Chen #define LOONGARCH_CPU_ISA_LA64  0x00000004
68f2ac457aSHuacai Chen 
69f2ac457aSHuacai Chen #define LOONGARCH_CPU_ISA_32BIT (LOONGARCH_CPU_ISA_LA32R | LOONGARCH_CPU_ISA_LA32S)
70f2ac457aSHuacai Chen #define LOONGARCH_CPU_ISA_64BIT LOONGARCH_CPU_ISA_LA64
71f2ac457aSHuacai Chen 
72f2ac457aSHuacai Chen /*
73f2ac457aSHuacai Chen  * CPU Option encodings
74f2ac457aSHuacai Chen  */
75f2ac457aSHuacai Chen #define CPU_FEATURE_CPUCFG		0	/* CPU has CPUCFG */
76f2ac457aSHuacai Chen #define CPU_FEATURE_LAM			1	/* CPU has Atomic instructions */
77f2ac457aSHuacai Chen #define CPU_FEATURE_UAL			2	/* CPU supports unaligned access */
78f2ac457aSHuacai Chen #define CPU_FEATURE_FPU			3	/* CPU has FPU */
79f2ac457aSHuacai Chen #define CPU_FEATURE_LSX			4	/* CPU has LSX (128-bit SIMD) */
80f2ac457aSHuacai Chen #define CPU_FEATURE_LASX		5	/* CPU has LASX (256-bit SIMD) */
81*df830336SHuacai Chen #define CPU_FEATURE_CRC32		6	/* CPU has CRC32 instructions */
82*df830336SHuacai Chen #define CPU_FEATURE_COMPLEX		7	/* CPU has Complex instructions */
83*df830336SHuacai Chen #define CPU_FEATURE_CRYPTO		8	/* CPU has Crypto instructions */
84*df830336SHuacai Chen #define CPU_FEATURE_LVZ			9	/* CPU has Virtualization extension */
85*df830336SHuacai Chen #define CPU_FEATURE_LBT_X86		10	/* CPU has X86 Binary Translation */
86*df830336SHuacai Chen #define CPU_FEATURE_LBT_ARM		11	/* CPU has ARM Binary Translation */
87*df830336SHuacai Chen #define CPU_FEATURE_LBT_MIPS		12	/* CPU has MIPS Binary Translation */
88*df830336SHuacai Chen #define CPU_FEATURE_TLB			13	/* CPU has TLB */
89*df830336SHuacai Chen #define CPU_FEATURE_CSR			14	/* CPU has CSR */
90*df830336SHuacai Chen #define CPU_FEATURE_WATCH		15	/* CPU has watchpoint registers */
91*df830336SHuacai Chen #define CPU_FEATURE_VINT		16	/* CPU has vectored interrupts */
92*df830336SHuacai Chen #define CPU_FEATURE_CSRIPI		17	/* CPU has CSR-IPI */
93*df830336SHuacai Chen #define CPU_FEATURE_EXTIOI		18	/* CPU has EXT-IOI */
94*df830336SHuacai Chen #define CPU_FEATURE_PREFETCH		19	/* CPU has prefetch instructions */
95*df830336SHuacai Chen #define CPU_FEATURE_PMP			20	/* CPU has perfermance counter */
96*df830336SHuacai Chen #define CPU_FEATURE_SCALEFREQ		21	/* CPU supports cpufreq scaling */
97*df830336SHuacai Chen #define CPU_FEATURE_FLATMODE		22	/* CPU has flat mode */
98*df830336SHuacai Chen #define CPU_FEATURE_EIODECODE		23	/* CPU has EXTIOI interrupt pin decode mode */
99*df830336SHuacai Chen #define CPU_FEATURE_GUESTID		24	/* CPU has GuestID feature */
100*df830336SHuacai Chen #define CPU_FEATURE_HYPERVISOR		25	/* CPU has hypervisor (running in VM) */
101f2ac457aSHuacai Chen #define CPU_FEATURE_PTW			26	/* CPU has hardware page table walker */
102f2ac457aSHuacai Chen 
103f2ac457aSHuacai Chen #define LOONGARCH_CPU_CPUCFG		BIT_ULL(CPU_FEATURE_CPUCFG)
104f2ac457aSHuacai Chen #define LOONGARCH_CPU_LAM		BIT_ULL(CPU_FEATURE_LAM)
105f2ac457aSHuacai Chen #define LOONGARCH_CPU_UAL		BIT_ULL(CPU_FEATURE_UAL)
106f2ac457aSHuacai Chen #define LOONGARCH_CPU_FPU		BIT_ULL(CPU_FEATURE_FPU)
107f2ac457aSHuacai Chen #define LOONGARCH_CPU_LSX		BIT_ULL(CPU_FEATURE_LSX)
108*df830336SHuacai Chen #define LOONGARCH_CPU_LASX		BIT_ULL(CPU_FEATURE_LASX)
109f2ac457aSHuacai Chen #define LOONGARCH_CPU_CRC32		BIT_ULL(CPU_FEATURE_CRC32)
110f2ac457aSHuacai Chen #define LOONGARCH_CPU_COMPLEX		BIT_ULL(CPU_FEATURE_COMPLEX)
111f2ac457aSHuacai Chen #define LOONGARCH_CPU_CRYPTO		BIT_ULL(CPU_FEATURE_CRYPTO)
112f2ac457aSHuacai Chen #define LOONGARCH_CPU_LVZ		BIT_ULL(CPU_FEATURE_LVZ)
113f2ac457aSHuacai Chen #define LOONGARCH_CPU_LBT_X86		BIT_ULL(CPU_FEATURE_LBT_X86)
114f2ac457aSHuacai Chen #define LOONGARCH_CPU_LBT_ARM		BIT_ULL(CPU_FEATURE_LBT_ARM)
115f2ac457aSHuacai Chen #define LOONGARCH_CPU_LBT_MIPS		BIT_ULL(CPU_FEATURE_LBT_MIPS)
116f2ac457aSHuacai Chen #define LOONGARCH_CPU_TLB		BIT_ULL(CPU_FEATURE_TLB)
117f2ac457aSHuacai Chen #define LOONGARCH_CPU_CSR		BIT_ULL(CPU_FEATURE_CSR)
118f2ac457aSHuacai Chen #define LOONGARCH_CPU_WATCH		BIT_ULL(CPU_FEATURE_WATCH)
119f2ac457aSHuacai Chen #define LOONGARCH_CPU_VINT		BIT_ULL(CPU_FEATURE_VINT)
120f2ac457aSHuacai Chen #define LOONGARCH_CPU_CSRIPI		BIT_ULL(CPU_FEATURE_CSRIPI)
121f2ac457aSHuacai Chen #define LOONGARCH_CPU_EXTIOI		BIT_ULL(CPU_FEATURE_EXTIOI)
122f2ac457aSHuacai Chen #define LOONGARCH_CPU_PREFETCH		BIT_ULL(CPU_FEATURE_PREFETCH)
123f2ac457aSHuacai Chen #define LOONGARCH_CPU_PMP		BIT_ULL(CPU_FEATURE_PMP)
124f2ac457aSHuacai Chen #define LOONGARCH_CPU_SCALEFREQ		BIT_ULL(CPU_FEATURE_SCALEFREQ)
125f2ac457aSHuacai Chen #define LOONGARCH_CPU_FLATMODE		BIT_ULL(CPU_FEATURE_FLATMODE)
126f2ac457aSHuacai Chen #define LOONGARCH_CPU_EIODECODE		BIT_ULL(CPU_FEATURE_EIODECODE)
127f2ac457aSHuacai Chen #define LOONGARCH_CPU_GUESTID		BIT_ULL(CPU_FEATURE_GUESTID)
128f2ac457aSHuacai Chen #define LOONGARCH_CPU_HYPERVISOR	BIT_ULL(CPU_FEATURE_HYPERVISOR)
129f2ac457aSHuacai Chen #define LOONGARCH_CPU_PTW		BIT_ULL(CPU_FEATURE_PTW)
130 
131 #endif /* _ASM_CPU_H */
132