cpufeature.c 1009 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright IBM Corp. 2022
  4. */
  5. #include <linux/cpufeature.h>
  6. #include <linux/bug.h>
  7. #include <asm/elf.h>
  8. enum {
  9. TYPE_HWCAP,
  10. TYPE_FACILITY,
  11. };
  12. struct s390_cpu_feature {
  13. unsigned int type : 4;
  14. unsigned int num : 28;
  15. };
  16. static struct s390_cpu_feature s390_cpu_features[MAX_CPU_FEATURES] = {
  17. [S390_CPU_FEATURE_MSA] = {.type = TYPE_HWCAP, .num = HWCAP_NR_MSA},
  18. [S390_CPU_FEATURE_VXRS] = {.type = TYPE_HWCAP, .num = HWCAP_NR_VXRS},
  19. [S390_CPU_FEATURE_UV] = {.type = TYPE_FACILITY, .num = 158},
  20. };
  21. /*
  22. * cpu_have_feature - Test CPU features on module initialization
  23. */
  24. int cpu_have_feature(unsigned int num)
  25. {
  26. struct s390_cpu_feature *feature;
  27. if (WARN_ON_ONCE(num >= MAX_CPU_FEATURES))
  28. return 0;
  29. feature = &s390_cpu_features[num];
  30. switch (feature->type) {
  31. case TYPE_HWCAP:
  32. return !!(elf_hwcap & BIT(feature->num));
  33. case TYPE_FACILITY:
  34. return test_facility(feature->num);
  35. default:
  36. WARN_ON_ONCE(1);
  37. return 0;
  38. }
  39. }
  40. EXPORT_SYMBOL(cpu_have_feature);