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 | [S390_CPU_FEATURE_UV] = {.type = TYPE_FACILITY, .num = 158}, |
24 | }; |
25 | |
26 | /* |
27 | * cpu_have_feature - Test CPU features on module initialization |
28 | */ |
29 | int cpu_have_feature(unsigned int num) |
30 | { |
31 | struct s390_cpu_feature *feature; |
32 | |
33 | if (WARN_ON_ONCE(num >= MAX_CPU_FEATURES)) |
34 | return 0; |
35 | feature = &s390_cpu_features[num]; |
36 | switch (feature->type) { |
37 | case TYPE_HWCAP: |
38 | return !!(elf_hwcap & BIT(feature->num)); |
39 | case TYPE_FACILITY: |
40 | return test_facility(feature->num); |
41 | default: |
42 | WARN_ON_ONCE(1); |
43 | return 0; |
44 | } |
45 | } |
46 | EXPORT_SYMBOL(cpu_have_feature); |
47 |