Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* Declare dependencies between CPUIDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <asm/cpufeature.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) struct cpuid_dep {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 	unsigned int	feature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 	unsigned int	depends;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * Table of CPUID features that depend on others.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * This only includes dependencies that can be usefully disabled, not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * features part of the base set (like FPU).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * Note this all is not __init / __initdata because it can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * called from cpu hotplug. It shouldn't do anything in this case,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * but it's difficult to tell that to the init reference checker.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) static const struct cpuid_dep cpuid_deps[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	{ X86_FEATURE_FXSR,			X86_FEATURE_FPU	      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	{ X86_FEATURE_XSAVEOPT,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	{ X86_FEATURE_XSAVEC,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	{ X86_FEATURE_XSAVES,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	{ X86_FEATURE_AVX,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	{ X86_FEATURE_PKU,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	{ X86_FEATURE_MPX,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	{ X86_FEATURE_XGETBV1,			X86_FEATURE_XSAVE     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	{ X86_FEATURE_CMOV,			X86_FEATURE_FXSR      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	{ X86_FEATURE_MMX,			X86_FEATURE_FXSR      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	{ X86_FEATURE_MMXEXT,			X86_FEATURE_MMX       },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	{ X86_FEATURE_FXSR_OPT,			X86_FEATURE_FXSR      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	{ X86_FEATURE_XSAVE,			X86_FEATURE_FXSR      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	{ X86_FEATURE_XMM,			X86_FEATURE_FXSR      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	{ X86_FEATURE_XMM2,			X86_FEATURE_XMM       },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	{ X86_FEATURE_XMM3,			X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	{ X86_FEATURE_XMM4_1,			X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	{ X86_FEATURE_XMM4_2,			X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	{ X86_FEATURE_XMM3,			X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	{ X86_FEATURE_PCLMULQDQ,		X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	{ X86_FEATURE_SSSE3,			X86_FEATURE_XMM2,     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	{ X86_FEATURE_F16C,			X86_FEATURE_XMM2,     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	{ X86_FEATURE_AES,			X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	{ X86_FEATURE_SHA_NI,			X86_FEATURE_XMM2      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	{ X86_FEATURE_FMA,			X86_FEATURE_AVX       },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	{ X86_FEATURE_AVX2,			X86_FEATURE_AVX,      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	{ X86_FEATURE_AVX512F,			X86_FEATURE_AVX,      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	{ X86_FEATURE_AVX512IFMA,		X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	{ X86_FEATURE_AVX512PF,			X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	{ X86_FEATURE_AVX512ER,			X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	{ X86_FEATURE_AVX512CD,			X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	{ X86_FEATURE_AVX512DQ,			X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	{ X86_FEATURE_AVX512BW,			X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	{ X86_FEATURE_AVX512VL,			X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	{ X86_FEATURE_AVX512VBMI,		X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	{ X86_FEATURE_AVX512_VBMI2,		X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	{ X86_FEATURE_GFNI,			X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	{ X86_FEATURE_VAES,			X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	{ X86_FEATURE_VPCLMULQDQ,		X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	{ X86_FEATURE_AVX512_VNNI,		X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	{ X86_FEATURE_AVX512_BITALG,		X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	{ X86_FEATURE_AVX512_4VNNIW,		X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	{ X86_FEATURE_AVX512_4FMAPS,		X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	{ X86_FEATURE_AVX512_VPOPCNTDQ,		X86_FEATURE_AVX512F   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	{ X86_FEATURE_AVX512_VP2INTERSECT,	X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	{ X86_FEATURE_CQM_OCCUP_LLC,		X86_FEATURE_CQM_LLC   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	{ X86_FEATURE_CQM_MBM_TOTAL,		X86_FEATURE_CQM_LLC   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	{ X86_FEATURE_CQM_MBM_LOCAL,		X86_FEATURE_CQM_LLC   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	{ X86_FEATURE_AVX512_BF16,		X86_FEATURE_AVX512VL  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	{ X86_FEATURE_ENQCMD,			X86_FEATURE_XSAVES    },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	{ X86_FEATURE_PER_THREAD_MBA,		X86_FEATURE_MBA       },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) static inline void clear_feature(struct cpuinfo_x86 *c, unsigned int feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	 * Note: This could use the non atomic __*_bit() variants, but the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	 * rest of the cpufeature code uses atomics as well, so keep it for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	 * consistency. Cleanup all of it separately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	if (!c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		clear_cpu_cap(&boot_cpu_data, feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		set_bit(feature, (unsigned long *)cpu_caps_cleared);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		clear_bit(feature, (unsigned long *)c->x86_capability);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) /* Take the capabilities and the BUG bits into account */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) #define MAX_FEATURE_BITS ((NCAPINTS + NBUGINTS) * sizeof(u32) * 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) static void do_clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	DECLARE_BITMAP(disable, MAX_FEATURE_BITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	const struct cpuid_dep *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	bool changed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	if (WARN_ON(feature >= MAX_FEATURE_BITS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	clear_feature(c, feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	/* Collect all features to disable, handling dependencies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	memset(disable, 0, sizeof(disable));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	__set_bit(feature, disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	/* Loop until we get a stable state. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		changed = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		for (d = cpuid_deps; d->feature; d++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 			if (!test_bit(d->depends, disable))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 			if (__test_and_set_bit(d->feature, disable))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 			changed = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 			clear_feature(c, d->feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	} while (changed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	do_clear_cpu_cap(c, feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) void setup_clear_cpu_cap(unsigned int feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	do_clear_cpu_cap(NULL, feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }