0001
0002
0003
0004
0005
0006 #include <linux/cpufeature.h>
0007 #include <linux/bug.h>
0008 #include <asm/elf.h>
0009
0010 enum {
0011 TYPE_HWCAP,
0012 TYPE_FACILITY,
0013 };
0014
0015 struct s390_cpu_feature {
0016 unsigned int type : 4;
0017 unsigned int num : 28;
0018 };
0019
0020 static struct s390_cpu_feature s390_cpu_features[MAX_CPU_FEATURES] = {
0021 [S390_CPU_FEATURE_MSA] = {.type = TYPE_HWCAP, .num = HWCAP_NR_MSA},
0022 [S390_CPU_FEATURE_VXRS] = {.type = TYPE_HWCAP, .num = HWCAP_NR_VXRS},
0023 [S390_CPU_FEATURE_UV] = {.type = TYPE_FACILITY, .num = 158},
0024 };
0025
0026
0027
0028
0029 int cpu_have_feature(unsigned int num)
0030 {
0031 struct s390_cpu_feature *feature;
0032
0033 if (WARN_ON_ONCE(num >= MAX_CPU_FEATURES))
0034 return 0;
0035 feature = &s390_cpu_features[num];
0036 switch (feature->type) {
0037 case TYPE_HWCAP:
0038 return !!(elf_hwcap & BIT(feature->num));
0039 case TYPE_FACILITY:
0040 return test_facility(feature->num);
0041 default:
0042 WARN_ON_ONCE(1);
0043 return 0;
0044 }
0045 }
0046 EXPORT_SYMBOL(cpu_have_feature);