xref: /openbmc/linux/arch/s390/kernel/cpufeature.c (revision e2f39c9f547c88efd208f67a9ecacc1d78bf30a4)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright IBM Corp. 2022
4  */
5 
6 #include <linux/cpufeature.h>
7 #include <linux/bug.h>
8 #include <asm/elf.h>
9 
10 enum {
11 	TYPE_HWCAP,
12 	TYPE_FACILITY,
13 };
14 
15 struct s390_cpu_feature {
16 	unsigned int type	: 4;
17 	unsigned int num	: 28;
18 };
19 
20 static struct s390_cpu_feature s390_cpu_features[MAX_CPU_FEATURES] = {
21 	[S390_CPU_FEATURE_MSA]	= {.type = TYPE_HWCAP, .num = HWCAP_NR_MSA},
22 	[S390_CPU_FEATURE_VXRS]	= {.type = TYPE_HWCAP, .num = HWCAP_NR_VXRS},
23 };
24 
25 /*
26  * cpu_have_feature - Test CPU features on module initialization
27  */
28 int cpu_have_feature(unsigned int num)
29 {
30 	struct s390_cpu_feature *feature;
31 
32 	if (WARN_ON_ONCE(num >= MAX_CPU_FEATURES))
33 		return 0;
34 	feature = &s390_cpu_features[num];
35 	switch (feature->type) {
36 	case TYPE_HWCAP:
37 		return !!(elf_hwcap & BIT(feature->num));
38 	case TYPE_FACILITY:
39 		return test_facility(feature->num);
40 	default:
41 		WARN_ON_ONCE(1);
42 		return 0;
43 	}
44 }
45 EXPORT_SYMBOL(cpu_have_feature);
46