12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Copyright IBM Corp. 2022
- */
- #include <linux/cpufeature.h>
- #include <linux/bug.h>
- #include <asm/elf.h>
- enum {
- TYPE_HWCAP,
- TYPE_FACILITY,
- };
- struct s390_cpu_feature {
- unsigned int type : 4;
- unsigned int num : 28;
- };
- static struct s390_cpu_feature s390_cpu_features[MAX_CPU_FEATURES] = {
- [S390_CPU_FEATURE_MSA] = {.type = TYPE_HWCAP, .num = HWCAP_NR_MSA},
- [S390_CPU_FEATURE_VXRS] = {.type = TYPE_HWCAP, .num = HWCAP_NR_VXRS},
- [S390_CPU_FEATURE_UV] = {.type = TYPE_FACILITY, .num = 158},
- };
- /*
- * cpu_have_feature - Test CPU features on module initialization
- */
- int cpu_have_feature(unsigned int num)
- {
- struct s390_cpu_feature *feature;
- if (WARN_ON_ONCE(num >= MAX_CPU_FEATURES))
- return 0;
- feature = &s390_cpu_features[num];
- switch (feature->type) {
- case TYPE_HWCAP:
- return !!(elf_hwcap & BIT(feature->num));
- case TYPE_FACILITY:
- return test_facility(feature->num);
- default:
- WARN_ON_ONCE(1);
- return 0;
- }
- }
- EXPORT_SYMBOL(cpu_have_feature);
|