Commit f24f669d authored by Xi Ruoyao's avatar Xi Ruoyao Committed by Dave Hansen
Browse files

x86/mm: Don't disable PCID when INVLPG has been fixed by microcode



Per the "Processor Specification Update" documentations referred by
the intel-microcode-20240312 release note, this microcode release has
fixed the issue for all affected models.

So don't disable PCID if the microcode is new enough.  The precise
minimum microcode revision fixing the issue was provided by Pawan
Intel.

[ dhansen: comment and changelog tweaks ]

Signed-off-by: default avatarXi Ruoyao <xry111@xry111.site>
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Acked-by: default avatarPawan Gupta <pawan.kumar.gupta@linux.intel.com>
Link: https://lore.kernel.org/all/168436059559.404.13934972543631851306.tip-bot2@tip-bot2/
Link: https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases/tag/microcode-20240312
Link: https://cdrdv2.intel.com/v1/dl/getContent/740518 # RPL042, rev. 13
Link: https://cdrdv2.intel.com/v1/dl/getContent/682436 # ADL063, rev. 24
Link: https://lore.kernel.org/all/20240325231300.qrltbzf6twm43ftb@desk/
Link: https://lore.kernel.org/all/20240522020625.69418-1-xry111%40xry111.site
parent 9852d85e
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -263,28 +263,33 @@ static void __init probe_page_size_mask(void)
}

/*
 * INVLPG may not properly flush Global entries
 * on these CPUs when PCIDs are enabled.
 * INVLPG may not properly flush Global entries on
 * these CPUs.  New microcode fixes the issue.
 */
static const struct x86_cpu_id invlpg_miss_ids[] = {
	X86_MATCH_VFM(INTEL_ALDERLAKE,	    0),
	X86_MATCH_VFM(INTEL_ALDERLAKE_L,    0),
	X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, 0),
	X86_MATCH_VFM(INTEL_RAPTORLAKE,	    0),
	X86_MATCH_VFM(INTEL_RAPTORLAKE_P,   0),
	X86_MATCH_VFM(INTEL_RAPTORLAKE_S,   0),
	X86_MATCH_VFM(INTEL_ALDERLAKE,	    0x2e),
	X86_MATCH_VFM(INTEL_ALDERLAKE_L,    0x42c),
	X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, 0x11),
	X86_MATCH_VFM(INTEL_RAPTORLAKE,	    0x118),
	X86_MATCH_VFM(INTEL_RAPTORLAKE_P,   0x4117),
	X86_MATCH_VFM(INTEL_RAPTORLAKE_S,   0x2e),
	{}
};

static void setup_pcid(void)
{
	const struct x86_cpu_id *invlpg_miss_match;

	if (!IS_ENABLED(CONFIG_X86_64))
		return;

	if (!boot_cpu_has(X86_FEATURE_PCID))
		return;

	if (x86_match_cpu(invlpg_miss_ids)) {
	invlpg_miss_match = x86_match_cpu(invlpg_miss_ids);

	if (invlpg_miss_match &&
	    boot_cpu_data.microcode < invlpg_miss_match->driver_data) {
		pr_info("Incomplete global flushes, disabling PCID");
		setup_clear_cpu_cap(X86_FEATURE_PCID);
		return;