1f73373
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
Jeremy Cline d1b6f8c
From: Laura Abbott <labbott@redhat.com>
Jeremy Cline d1b6f8c
Date: Wed, 13 Nov 2019 14:44:30 -0500
Jeremy Cline d1b6f8c
Subject: [PATCH] Add support for deprecating processors
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Message-id: <20191113144431.9403-4-labbott@redhat.com>
Jeremy Cline d1b6f8c
Patchwork-id: 286081
Jeremy Cline d1b6f8c
O-Subject: [ARK INTERNAL PATCHv2 3/4] [redhat] Add support for deprecating processors
Jeremy Cline d1b6f8c
Bugzilla:
Jeremy Cline d1b6f8c
RH-Acked-by: Don Zickus <dzickus@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Jiri Benc <jbenc@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
This is the squashed version of the following patches
Jeremy Cline d1b6f8c
modifed to use the new CONFIG_RH_DISABLE_DEPRECATED option
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
add rh_check_supported
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Message-id: <1525313397-75200-1-git-send-email-darcari@redhat.com>
Jeremy Cline d1b6f8c
Patchwork-id: 212189
Jeremy Cline d1b6f8c
O-Subject: [RHEL8.0 BZ 1565717 v2] x86: add rh_check_supported
Jeremy Cline d1b6f8c
Bugzilla: 1565717
Jeremy Cline d1b6f8c
RH-Acked-by: Steve Best <sbest@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Mikulas Patocka <mpatocka@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Description:
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Add code to verify that the booted x86 processor is supported by
Jeremy Cline d1b6f8c
Red Hat.  In cases where the processor is not supported a critical
Jeremy Cline d1b6f8c
message is logged.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Initially the supported set of processors for RHEL8 remains the same
Jeremy Cline d1b6f8c
as RHEL7.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Bugzilla: http://bugzilla.redhat.com/1565717
Jeremy Cline d1b6f8c
Brew: https://brewweb.devel.redhat.com/taskinfo?taskID=15966242
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Test: Booted brew build on supported (Haswell) and unsupported processor (CNL)
Jeremy Cline d1b6f8c
      and achieved desired results.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Upstream: RHEL Only
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Cc: David Arcari <darcari@redhat.com>
Jeremy Cline d1b6f8c
Cc: Mikulas Patocka <mpatocka@redhat.com>
Jeremy Cline d1b6f8c
Cc: Dave Young <dyoung@redhat.com>
Jeremy Cline d1b6f8c
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Jeremy Cline d1b6f8c
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
update rh_check_supported processor list
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Message-id: <1530618602-17477-1-git-send-email-darcari@redhat.com>
Jeremy Cline d1b6f8c
Patchwork-id: 223452
Jeremy Cline d1b6f8c
O-Subject: [RHEL8.0 BZ 1595918] x86: update rh_check_supported processor list
Jeremy Cline d1b6f8c
Bugzilla: 1595918
Jeremy Cline d1b6f8c
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Steve Best <sbest@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Bugzilla: http://bugzilla.redhat.com/1595918
Jeremy Cline d1b6f8c
Upstream Status: RHEL_only
Jeremy Cline d1b6f8c
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16916208
Jeremy Cline d1b6f8c
Tested: Verified on a varity of supported and unsupported Intel and AMD systems.
Jeremy Cline d1b6f8c
	Results as expected.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
In RHEL8, we are marking some of the older processors as unsupported. No code
Jeremy Cline d1b6f8c
is being removed; however, the older processors are not supported and as such
Jeremy Cline d1b6f8c
are not candidates for certification.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Cc: David Arcari <darcari@redhat.com>
Jeremy Cline d1b6f8c
Cc: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
Cc: Steve Best <sbest@redhat.com>
Jeremy Cline d1b6f8c
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
Jeremy Cline d1b6f8c
Signed-off-by: Jakub Racek <jracek@redhat.com>
Jeremy Cline d1b6f8c
refresh: rename FAM6_ATOM again, see f2c4db1bd
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
mark whiskey-lake processor supported
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Message-id: <1533125629-12870-1-git-send-email-darcari@redhat.com>
Jeremy Cline d1b6f8c
Patchwork-id: 225809
Jeremy Cline d1b6f8c
O-Subject: [ BZ 1609604] mark whiskey-lake processor supported
Jeremy Cline d1b6f8c
Bugzilla: 1609604
Jeremy Cline d1b6f8c
RH-Acked-by: Steve Best <sbest@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Bugzilla: http://bugzilla.redhat.com/1609604
Jeremy Cline d1b6f8c
Build Info: https://brewweb.devel.redhat.com/taskinfo?taskID=17474338
Jeremy Cline d1b6f8c
Upstream Status: RHEL Only
Jeremy Cline d1b6f8c
Tested: Successful excecution of platform-test suite.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Whiskey Lake is cpu model 142 with stepping 11.  Stepping > 11 for cpu model
Jeremy Cline d1b6f8c
142 is not supported.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
For model 158, the highest supported stepping is 10.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Cc: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
Cc: David Arcari <darcari@redhat.com>
Jeremy Cline d1b6f8c
Cc: Dave Young <dyoung@redhat.com>
Jeremy Cline d1b6f8c
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
mark intel knights landing and knights mill unsupported
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Message-id: <1533580277-126323-1-git-send-email-darcari@redhat.com>
Jeremy Cline d1b6f8c
Patchwork-id: 226187
Jeremy Cline d1b6f8c
O-Subject: [RHEL8.0 BZ 1610493] mark intel knights landing and knights mill unsupported
Jeremy Cline d1b6f8c
Bugzilla: 1610493
Jeremy Cline d1b6f8c
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
RH-Acked-by: Steve Best <sbest@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Bugzilla: http://bugzilla.redhat.com/1610493
Jeremy Cline d1b6f8c
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=17625348
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Tested: verified on KNL/KNM system
Jeremy Cline d1b6f8c
Upstream Status: RHEL Only
Jeremy Cline d1b6f8c
Depends: http://bugzilla.redhat.com/1609604
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
We are marking KNL/KNM processors as unsupported. No code is being removed;
Jeremy Cline d1b6f8c
however, the older processors are not supported and as such are not
Jeremy Cline d1b6f8c
candidates for certification.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Upstream Status: RHEL only
Jeremy Cline d1b6f8c
Cc: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
Cc: David Arcari <darcari@redhat.com>
Jeremy Cline d1b6f8c
Cc: Dave Young <dyoung@redhat.com>
Jeremy Cline d1b6f8c
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
Jeremy Cline d1b6f8c
---
Jeremy Cline d1b6f8c
 arch/x86/kernel/cpu/common.c |   1 +
Jeremy Cline d1b6f8c
 arch/x86/kernel/setup.c      | 132 ++++++++++++++++++++++++++++++++++-
Jeremy Cline d1b6f8c
 2 files changed, 132 insertions(+), 1 deletion(-)
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
9b53592
index 95c090a45b4b..bcc6d2df56c0 100644
Jeremy Cline d1b6f8c
--- a/arch/x86/kernel/cpu/common.c
Jeremy Cline d1b6f8c
+++ b/arch/x86/kernel/cpu/common.c
fb49733
@@ -1236,6 +1236,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
Jeremy Cline d1b6f8c
 		cpu_detect(c);
Jeremy Cline d1b6f8c
 		get_cpu_vendor(c);
Jeremy Cline d1b6f8c
 		get_cpu_cap(c);
Jeremy Cline d1b6f8c
+		get_model_name(c); /* RHEL: get model name for unsupported check */
Jeremy Cline d1b6f8c
 		get_cpu_address_sizes(c);
Jeremy Cline d1b6f8c
 		setup_force_cpu_cap(X86_FEATURE_CPUID);
d176dfc
Jeremy Cline d1b6f8c
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
fa1dee0
index a3767e74c758..a1b8cb9a2579 100644
Jeremy Cline d1b6f8c
--- a/arch/x86/kernel/setup.c
Jeremy Cline d1b6f8c
+++ b/arch/x86/kernel/setup.c
Jeremy Cline d1b6f8c
@@ -44,6 +44,7 @@
Jeremy Cline d1b6f8c
 #include <asm/unwind.h>
Jeremy Cline d1b6f8c
 #include <asm/vsyscall.h>
Jeremy Cline d1b6f8c
 #include <linux/vmalloc.h>
Jeremy Cline d1b6f8c
+#include <asm/intel-family.h>
d176dfc
Jeremy Cline d1b6f8c
 /*
Jeremy Cline d1b6f8c
  * max_low_pfn_mapped: highest directly mapped pfn < 4 GB
fa1dee0
@@ -753,7 +754,132 @@ static void __init trim_low_memory_range(void)
Jeremy Cline d1b6f8c
 {
Jeremy Cline d1b6f8c
 	memblock_reserve(0, ALIGN(reserve_low, PAGE_SIZE));
Jeremy Cline d1b6f8c
 }
Jeremy Cline d1b6f8c
-	
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+static bool valid_amd_processor(__u8 family, const char *model_id)
Jeremy Cline d1b6f8c
+{
Jeremy Cline d1b6f8c
+	bool valid;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	switch(family) {
Jeremy Cline d1b6f8c
+	case 0x15:
Jeremy Cline d1b6f8c
+		valid = true;
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case 0x17:
Jeremy Cline d1b6f8c
+		valid = strstr(model_id, "AMD EPYC 7");
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	default:
Jeremy Cline d1b6f8c
+		valid = false;
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+	}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	return valid;
Jeremy Cline d1b6f8c
+}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+static bool valid_intel_processor(__u8 family, __u8 model, __u8 stepping)
Jeremy Cline d1b6f8c
+{
Jeremy Cline d1b6f8c
+	bool valid;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	if (family != 6)
Jeremy Cline d1b6f8c
+		return false;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	switch(model) {
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_ATOM_GOLDMONT_D:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_BROADWELL:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_BROADWELL_G:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_BROADWELL_X:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_BROADWELL_D:
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_HASWELL:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_HASWELL_G:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_HASWELL_L:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_HASWELL_X:
Jeremy Cline d1b6f8c
+		valid = true;
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_KABYLAKE:
Jeremy Cline d1b6f8c
+		valid = (stepping <= 10);
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_KABYLAKE_L:
Jeremy Cline d1b6f8c
+		valid = (stepping <= 11);
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_SKYLAKE_L:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_SKYLAKE:
Jeremy Cline d1b6f8c
+	case INTEL_FAM6_SKYLAKE_X:
Jeremy Cline d1b6f8c
+		/* stepping > 4 is Cascade Lake and is not supported */
Jeremy Cline d1b6f8c
+		valid = (stepping <= 4);
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	default:
Jeremy Cline d1b6f8c
+		valid = false;
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+	}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	return valid;
Jeremy Cline d1b6f8c
+}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+static void rh_check_supported(void)
Jeremy Cline d1b6f8c
+{
Jeremy Cline d1b6f8c
+	bool guest;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	guest = (x86_hyper_type != X86_HYPER_NATIVE || boot_cpu_has(X86_FEATURE_HYPERVISOR));
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	/* RHEL supports single cpu on guests only */
Jeremy Cline d1b6f8c
+	if (((boot_cpu_data.x86_max_cores * smp_num_siblings) == 1) &&
Jeremy Cline d1b6f8c
+	    !guest && is_kdump_kernel()) {
Jeremy Cline d1b6f8c
+		pr_crit("Detected single cpu native boot.\n");
Jeremy Cline d1b6f8c
+		pr_crit("Important:  In this kernel, single threaded, single CPU 64-bit physical systems are unsupported.");
Jeremy Cline d1b6f8c
+	}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	/*
Jeremy Cline d1b6f8c
+	 * If the RHEL kernel does not support this hardware, the kernel will
Jeremy Cline d1b6f8c
+	 * attempt to boot, but no support is provided for this hardware
Jeremy Cline d1b6f8c
+	 */
Jeremy Cline d1b6f8c
+	switch (boot_cpu_data.x86_vendor) {
Jeremy Cline d1b6f8c
+	case X86_VENDOR_AMD:
Jeremy Cline d1b6f8c
+		if (!valid_amd_processor(boot_cpu_data.x86,
Jeremy Cline d1b6f8c
+					 boot_cpu_data.x86_model_id)) {
Jeremy Cline d1b6f8c
+			pr_crit("Detected CPU family %xh model %d\n",
Jeremy Cline d1b6f8c
+				boot_cpu_data.x86,
Jeremy Cline d1b6f8c
+				boot_cpu_data.x86_model);
Jeremy Cline d1b6f8c
+			mark_hardware_unsupported("AMD Processor");
Jeremy Cline d1b6f8c
+		}
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	case X86_VENDOR_INTEL:
Jeremy Cline d1b6f8c
+		if (!valid_intel_processor(boot_cpu_data.x86,
Jeremy Cline d1b6f8c
+					   boot_cpu_data.x86_model,
Jeremy Cline d1b6f8c
+					   boot_cpu_data.x86_stepping)) {
Jeremy Cline d1b6f8c
+			pr_crit("Detected CPU family %d model %d stepping %d\n",
Jeremy Cline d1b6f8c
+				boot_cpu_data.x86,
Jeremy Cline d1b6f8c
+				boot_cpu_data.x86_model,
Jeremy Cline d1b6f8c
+				boot_cpu_data.x86_stepping);
Jeremy Cline d1b6f8c
+			mark_hardware_unsupported("Intel Processor");
Jeremy Cline d1b6f8c
+		}
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	default:
Jeremy Cline d1b6f8c
+		pr_crit("Detected processor %s %s\n",
Jeremy Cline d1b6f8c
+			boot_cpu_data.x86_vendor_id,
Jeremy Cline d1b6f8c
+			boot_cpu_data.x86_model_id);
Jeremy Cline d1b6f8c
+		mark_hardware_unsupported("Processor");
Jeremy Cline d1b6f8c
+		break;
Jeremy Cline d1b6f8c
+	}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	/*
Jeremy Cline d1b6f8c
+	 * Due to the complexity of x86 lapic & ioapic enumeration, and PCI IRQ
Jeremy Cline d1b6f8c
+	 * routing, ACPI is required for x86.  acpi=off is a valid debug kernel
Jeremy Cline d1b6f8c
+	 * parameter, so just print out a loud warning in case something
Jeremy Cline d1b6f8c
+	 * goes wrong (which is most of the time).
Jeremy Cline d1b6f8c
+	 */
Jeremy Cline d1b6f8c
+	if (acpi_disabled && !guest)
Jeremy Cline d1b6f8c
+		pr_crit("ACPI has been disabled or is not available on this hardware.  This may result in a single cpu boot, incorrect PCI IRQ routing, or boot failure.\n");
Jeremy Cline d1b6f8c
+}
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
 /*
Jeremy Cline d1b6f8c
  * Dump out kernel offset information on panic.
Jeremy Cline d1b6f8c
  */
fa1dee0
@@ -1250,6 +1376,10 @@ void __init setup_arch(char **cmdline_p)
Jeremy Cline d1b6f8c
 		efi_apply_memmap_quirks();
Jeremy Cline d1b6f8c
 #endif
d176dfc
Jeremy Cline d1b6f8c
+#ifdef CONFIG_RH_DISABLE_DEPRECATED
Jeremy Cline d1b6f8c
+	rh_check_supported();
Jeremy Cline d1b6f8c
+#endif
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
 	unwind_init();
Jeremy Cline d1b6f8c
 }
d176dfc
Jeremy Cline d1b6f8c
-- 
d176dfc
2.26.2
Jeremy Cline d1b6f8c