Skip to content

Commit 48543c4

Browse files
George Guochenhuacai
authored andcommitted
LoongArch: Add detection for SC.Q support
Check the CPUCFG2_SCQ bit to determine if the current CPU supports the SC.Q instruction. Reviewed-by: Hengqi Chen <hengqi.chen@gmail.com> Tested-by: Hengqi Chen <hengqi.chen@gmail.com> Co-developed-by: Yangyang Lian <lianyangyang@kylinos.cn> Signed-off-by: Yangyang Lian <lianyangyang@kylinos.cn> Signed-off-by: George Guo <guodongtai@kylinos.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 07d5798 commit 48543c4

5 files changed

Lines changed: 39 additions & 30 deletions

File tree

arch/loongarch/include/asm/cpu-features.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
*/
3636
#define cpu_has_cpucfg cpu_opt(LOONGARCH_CPU_CPUCFG)
3737
#define cpu_has_lam cpu_opt(LOONGARCH_CPU_LAM)
38+
#define cpu_has_scq cpu_opt(LOONGARCH_CPU_SCQ)
3839
#define cpu_has_ual cpu_opt(LOONGARCH_CPU_UAL)
3940
#define cpu_has_fpu cpu_opt(LOONGARCH_CPU_FPU)
4041
#define cpu_has_lsx cpu_opt(LOONGARCH_CPU_LSX)

arch/loongarch/include/asm/cpu.h

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -95,39 +95,41 @@ static inline char *id_to_core_name(unsigned int id)
9595
*/
9696
#define CPU_FEATURE_CPUCFG 0 /* CPU has CPUCFG */
9797
#define CPU_FEATURE_LAM 1 /* CPU has Atomic instructions */
98-
#define CPU_FEATURE_UAL 2 /* CPU supports unaligned access */
99-
#define CPU_FEATURE_FPU 3 /* CPU has FPU */
100-
#define CPU_FEATURE_LSX 4 /* CPU has LSX (128-bit SIMD) */
101-
#define CPU_FEATURE_LASX 5 /* CPU has LASX (256-bit SIMD) */
102-
#define CPU_FEATURE_CRC32 6 /* CPU has CRC32 instructions */
103-
#define CPU_FEATURE_COMPLEX 7 /* CPU has Complex instructions */
104-
#define CPU_FEATURE_CRYPTO 8 /* CPU has Crypto instructions */
105-
#define CPU_FEATURE_LVZ 9 /* CPU has Virtualization extension */
106-
#define CPU_FEATURE_LBT_X86 10 /* CPU has X86 Binary Translation */
107-
#define CPU_FEATURE_LBT_ARM 11 /* CPU has ARM Binary Translation */
108-
#define CPU_FEATURE_LBT_MIPS 12 /* CPU has MIPS Binary Translation */
109-
#define CPU_FEATURE_TLB 13 /* CPU has TLB */
110-
#define CPU_FEATURE_CSR 14 /* CPU has CSR */
111-
#define CPU_FEATURE_IOCSR 15 /* CPU has IOCSR */
112-
#define CPU_FEATURE_WATCH 16 /* CPU has watchpoint registers */
113-
#define CPU_FEATURE_VINT 17 /* CPU has vectored interrupts */
114-
#define CPU_FEATURE_CSRIPI 18 /* CPU has CSR-IPI */
115-
#define CPU_FEATURE_EXTIOI 19 /* CPU has EXT-IOI */
116-
#define CPU_FEATURE_PREFETCH 20 /* CPU has prefetch instructions */
117-
#define CPU_FEATURE_PMP 21 /* CPU has perfermance counter */
118-
#define CPU_FEATURE_SCALEFREQ 22 /* CPU supports cpufreq scaling */
119-
#define CPU_FEATURE_FLATMODE 23 /* CPU has flat mode */
120-
#define CPU_FEATURE_EIODECODE 24 /* CPU has EXTIOI interrupt pin decode mode */
121-
#define CPU_FEATURE_GUESTID 25 /* CPU has GuestID feature */
122-
#define CPU_FEATURE_HYPERVISOR 26 /* CPU has hypervisor (running in VM) */
123-
#define CPU_FEATURE_PTW 27 /* CPU has hardware page table walker */
124-
#define CPU_FEATURE_LSPW 28 /* CPU has LSPW (lddir/ldpte instructions) */
125-
#define CPU_FEATURE_MSGINT 29 /* CPU has MSG interrupt */
126-
#define CPU_FEATURE_AVECINT 30 /* CPU has AVEC interrupt */
127-
#define CPU_FEATURE_REDIRECTINT 31 /* CPU has interrupt remapping */
98+
#define CPU_FEATURE_SCQ 2 /* CPU has SC.Q instruction */
99+
#define CPU_FEATURE_UAL 3 /* CPU supports unaligned access */
100+
#define CPU_FEATURE_FPU 4 /* CPU has FPU */
101+
#define CPU_FEATURE_LSX 5 /* CPU has LSX (128-bit SIMD) */
102+
#define CPU_FEATURE_LASX 6 /* CPU has LASX (256-bit SIMD) */
103+
#define CPU_FEATURE_CRC32 7 /* CPU has CRC32 instructions */
104+
#define CPU_FEATURE_COMPLEX 8 /* CPU has Complex instructions */
105+
#define CPU_FEATURE_CRYPTO 9 /* CPU has Crypto instructions */
106+
#define CPU_FEATURE_LVZ 10 /* CPU has Virtualization extension */
107+
#define CPU_FEATURE_LBT_X86 11 /* CPU has X86 Binary Translation */
108+
#define CPU_FEATURE_LBT_ARM 12 /* CPU has ARM Binary Translation */
109+
#define CPU_FEATURE_LBT_MIPS 13 /* CPU has MIPS Binary Translation */
110+
#define CPU_FEATURE_TLB 14 /* CPU has TLB */
111+
#define CPU_FEATURE_CSR 15 /* CPU has CSR */
112+
#define CPU_FEATURE_IOCSR 16 /* CPU has IOCSR */
113+
#define CPU_FEATURE_WATCH 17 /* CPU has watchpoint registers */
114+
#define CPU_FEATURE_VINT 18 /* CPU has vectored interrupts */
115+
#define CPU_FEATURE_CSRIPI 19 /* CPU has CSR-IPI */
116+
#define CPU_FEATURE_EXTIOI 20 /* CPU has EXT-IOI */
117+
#define CPU_FEATURE_PREFETCH 21 /* CPU has prefetch instructions */
118+
#define CPU_FEATURE_PMP 22 /* CPU has perfermance counter */
119+
#define CPU_FEATURE_SCALEFREQ 23 /* CPU supports cpufreq scaling */
120+
#define CPU_FEATURE_FLATMODE 24 /* CPU has flat mode */
121+
#define CPU_FEATURE_EIODECODE 25 /* CPU has EXTIOI interrupt pin decode mode */
122+
#define CPU_FEATURE_GUESTID 26 /* CPU has GuestID feature */
123+
#define CPU_FEATURE_HYPERVISOR 27 /* CPU has hypervisor (running in VM) */
124+
#define CPU_FEATURE_PTW 28 /* CPU has hardware page table walker */
125+
#define CPU_FEATURE_LSPW 29 /* CPU has LSPW (lddir/ldpte instructions) */
126+
#define CPU_FEATURE_MSGINT 30 /* CPU has MSG interrupt */
127+
#define CPU_FEATURE_AVECINT 31 /* CPU has AVEC interrupt */
128+
#define CPU_FEATURE_REDIRECTINT 32 /* CPU has interrupt remapping */
128129

129130
#define LOONGARCH_CPU_CPUCFG BIT_ULL(CPU_FEATURE_CPUCFG)
130131
#define LOONGARCH_CPU_LAM BIT_ULL(CPU_FEATURE_LAM)
132+
#define LOONGARCH_CPU_SCQ BIT_ULL(CPU_FEATURE_SCQ)
131133
#define LOONGARCH_CPU_UAL BIT_ULL(CPU_FEATURE_UAL)
132134
#define LOONGARCH_CPU_FPU BIT_ULL(CPU_FEATURE_FPU)
133135
#define LOONGARCH_CPU_LSX BIT_ULL(CPU_FEATURE_LSX)

arch/loongarch/include/uapi/asm/hwcap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@
1818
#define HWCAP_LOONGARCH_LBT_MIPS (1 << 12)
1919
#define HWCAP_LOONGARCH_PTW (1 << 13)
2020
#define HWCAP_LOONGARCH_LSPW (1 << 14)
21+
#define HWCAP_LOONGARCH_SCQ (1 << 15)
2122

2223
#endif /* _UAPI_ASM_HWCAP_H */

arch/loongarch/kernel/cpu-probe.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
177177
c->options |= LOONGARCH_CPU_LAM;
178178
elf_hwcap |= HWCAP_LOONGARCH_LAM;
179179
}
180+
if (config & CPUCFG2_SCQ) {
181+
c->options |= LOONGARCH_CPU_SCQ;
182+
elf_hwcap |= HWCAP_LOONGARCH_SCQ;
183+
}
180184
if (config & CPUCFG2_FP) {
181185
c->options |= LOONGARCH_CPU_FPU;
182186
elf_hwcap |= HWCAP_LOONGARCH_FPU;

arch/loongarch/kernel/proc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
6262
seq_printf(m, "Features\t\t:");
6363
if (cpu_has_cpucfg) seq_printf(m, " cpucfg");
6464
if (cpu_has_lam) seq_printf(m, " lam");
65+
if (cpu_has_scq) seq_printf(m, " scq");
6566
if (cpu_has_ual) seq_printf(m, " ual");
6667
if (cpu_has_fpu) seq_printf(m, " fpu");
6768
if (cpu_has_lsx) seq_printf(m, " lsx");

0 commit comments

Comments
 (0)