Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright IBM Corp. 2022
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  * cpu_have_feature - Test CPU features on module initialization
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);