@@ -263,28 +263,33 @@ static void __init probe_page_size_mask(void)
263263}
264264
265265/*
266- * INVLPG may not properly flush Global entries
267- * on these CPUs when PCIDs are enabled .
266+ * INVLPG may not properly flush Global entries on
267+ * these CPUs. New microcode fixes the issue .
268268 */
269269static const struct x86_cpu_id invlpg_miss_ids [] = {
270- X86_MATCH_VFM (INTEL_ALDERLAKE , 0 ),
271- X86_MATCH_VFM (INTEL_ALDERLAKE_L , 0 ),
272- X86_MATCH_VFM (INTEL_ATOM_GRACEMONT , 0 ),
273- X86_MATCH_VFM (INTEL_RAPTORLAKE , 0 ),
274- X86_MATCH_VFM (INTEL_RAPTORLAKE_P , 0 ),
275- X86_MATCH_VFM (INTEL_RAPTORLAKE_S , 0 ),
270+ X86_MATCH_VFM (INTEL_ALDERLAKE , 0x2e ),
271+ X86_MATCH_VFM (INTEL_ALDERLAKE_L , 0x42c ),
272+ X86_MATCH_VFM (INTEL_ATOM_GRACEMONT , 0x11 ),
273+ X86_MATCH_VFM (INTEL_RAPTORLAKE , 0x118 ),
274+ X86_MATCH_VFM (INTEL_RAPTORLAKE_P , 0x4117 ),
275+ X86_MATCH_VFM (INTEL_RAPTORLAKE_S , 0x2e ),
276276 {}
277277};
278278
279279static void setup_pcid (void )
280280{
281+ const struct x86_cpu_id * invlpg_miss_match ;
282+
281283 if (!IS_ENABLED (CONFIG_X86_64 ))
282284 return ;
283285
284286 if (!boot_cpu_has (X86_FEATURE_PCID ))
285287 return ;
286288
287- if (x86_match_cpu (invlpg_miss_ids )) {
289+ invlpg_miss_match = x86_match_cpu (invlpg_miss_ids );
290+
291+ if (invlpg_miss_match &&
292+ boot_cpu_data .microcode < invlpg_miss_match -> driver_data ) {
288293 pr_info ("Incomplete global flushes, disabling PCID" );
289294 setup_clear_cpu_cap (X86_FEATURE_PCID );
290295 return ;
0 commit comments