xref: /openbmc/linux/arch/loongarch/include/asm/cpu-features.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4   *
5   * Derived from MIPS:
6   * Copyright (C) 2003, 2004 Ralf Baechle
7   * Copyright (C) 2004  Maciej W. Rozycki
8   */
9  #ifndef __ASM_CPU_FEATURES_H
10  #define __ASM_CPU_FEATURES_H
11  
12  #include <asm/cpu.h>
13  #include <asm/cpu-info.h>
14  
15  #define cpu_opt(opt)			(cpu_data[0].options & (opt))
16  #define cpu_has(feat)			(cpu_data[0].options & BIT_ULL(feat))
17  
18  #define cpu_has_loongarch		(cpu_has_loongarch32 | cpu_has_loongarch64)
19  #define cpu_has_loongarch32		(cpu_data[0].isa_level & LOONGARCH_CPU_ISA_32BIT)
20  #define cpu_has_loongarch64		(cpu_data[0].isa_level & LOONGARCH_CPU_ISA_64BIT)
21  
22  #ifdef CONFIG_32BIT
23  # define cpu_has_64bits			(cpu_data[0].isa_level & LOONGARCH_CPU_ISA_64BIT)
24  # define cpu_vabits			31
25  # define cpu_pabits			31
26  #endif
27  
28  #ifdef CONFIG_64BIT
29  # define cpu_has_64bits			1
30  # define cpu_vabits			cpu_data[0].vabits
31  # define cpu_pabits			cpu_data[0].pabits
32  # define __NEED_ADDRBITS_PROBE
33  #endif
34  
35  /*
36   * SMP assumption: Options of CPU 0 are a superset of all processors.
37   * This is true for all known LoongArch systems.
38   */
39  #define cpu_has_cpucfg		cpu_opt(LOONGARCH_CPU_CPUCFG)
40  #define cpu_has_lam		cpu_opt(LOONGARCH_CPU_LAM)
41  #define cpu_has_ual		cpu_opt(LOONGARCH_CPU_UAL)
42  #define cpu_has_fpu		cpu_opt(LOONGARCH_CPU_FPU)
43  #define cpu_has_lsx		cpu_opt(LOONGARCH_CPU_LSX)
44  #define cpu_has_lasx		cpu_opt(LOONGARCH_CPU_LASX)
45  #define cpu_has_crc32		cpu_opt(LOONGARCH_CPU_CRC32)
46  #define cpu_has_complex		cpu_opt(LOONGARCH_CPU_COMPLEX)
47  #define cpu_has_crypto		cpu_opt(LOONGARCH_CPU_CRYPTO)
48  #define cpu_has_lvz		cpu_opt(LOONGARCH_CPU_LVZ)
49  #define cpu_has_lbt_x86		cpu_opt(LOONGARCH_CPU_LBT_X86)
50  #define cpu_has_lbt_arm		cpu_opt(LOONGARCH_CPU_LBT_ARM)
51  #define cpu_has_lbt_mips	cpu_opt(LOONGARCH_CPU_LBT_MIPS)
52  #define cpu_has_lbt		(cpu_has_lbt_x86|cpu_has_lbt_arm|cpu_has_lbt_mips)
53  #define cpu_has_csr		cpu_opt(LOONGARCH_CPU_CSR)
54  #define cpu_has_tlb		cpu_opt(LOONGARCH_CPU_TLB)
55  #define cpu_has_watch		cpu_opt(LOONGARCH_CPU_WATCH)
56  #define cpu_has_vint		cpu_opt(LOONGARCH_CPU_VINT)
57  #define cpu_has_csripi		cpu_opt(LOONGARCH_CPU_CSRIPI)
58  #define cpu_has_extioi		cpu_opt(LOONGARCH_CPU_EXTIOI)
59  #define cpu_has_prefetch	cpu_opt(LOONGARCH_CPU_PREFETCH)
60  #define cpu_has_pmp		cpu_opt(LOONGARCH_CPU_PMP)
61  #define cpu_has_perf		cpu_opt(LOONGARCH_CPU_PMP)
62  #define cpu_has_scalefreq	cpu_opt(LOONGARCH_CPU_SCALEFREQ)
63  #define cpu_has_flatmode	cpu_opt(LOONGARCH_CPU_FLATMODE)
64  #define cpu_has_eiodecode	cpu_opt(LOONGARCH_CPU_EIODECODE)
65  #define cpu_has_guestid		cpu_opt(LOONGARCH_CPU_GUESTID)
66  #define cpu_has_hypervisor	cpu_opt(LOONGARCH_CPU_HYPERVISOR)
67  #define cpu_has_ptw		cpu_opt(LOONGARCH_CPU_PTW)
68  
69  #endif /* __ASM_CPU_FEATURES_H */
70