Mention branches and keyring.
[releases.git] / s390 / kernel / cpufeature.c
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);