git: 9da8235cc843 - main - ichwd: add Lewisburg Super SKUs, Cannon and Comet Lake support

Wojciech Macek wma at FreeBSD.org
Thu Aug 26 10:05:03 UTC 2021


The branch main has been updated by wma:

URL: https://cgit.FreeBSD.org/src/commit/?id=9da8235cc843364bd2df7a4d6fcd8c1be7ca67c0

commit 9da8235cc843364bd2df7a4d6fcd8c1be7ca67c0
Author:     Paweł Anikiel <pan at semihalf.com>
AuthorDate: 2021-07-30 08:57:28 +0000
Commit:     Wojciech Macek <wma at FreeBSD.org>
CommitDate: 2021-08-26 10:04:28 +0000

    ichwd: add Lewisburg Super SKUs, Cannon and Comet Lake support
    
    Cannon and Comet Lake PCHs have their PMC hidden, so when reading
    the ACPI Base Address fails, we assume a default value.
    
    Obtained from:  Semihalf
    Sponsored by:   Stormshield
---
 sys/dev/ichwd/ichwd.c | 27 ++++++++++++++++++++-------
 sys/dev/ichwd/ichwd.h | 14 ++++++++++++++
 2 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/sys/dev/ichwd/ichwd.c b/sys/dev/ichwd/ichwd.c
index 587f99f9e7ee..5aab4af0a1f7 100644
--- a/sys/dev/ichwd/ichwd.c
+++ b/sys/dev/ichwd/ichwd.c
@@ -296,6 +296,9 @@ static struct ichwd_device ichwd_devices[] = {
 
 static struct ichwd_device ichwd_smb_devices[] = {
 	{ DEVICEID_LEWISBURG_SMB, "Lewisburg watchdog timer",		10, 4 },
+	{ DEVICEID_LEWISBURG_SMB_SSKU, "Lewisburg watchdog timer",	10, 4 },
+	{ DEVICEID_CANNON_SMB,    "Cannon Lake watchdog timer",		10, 4, PMC_HIDDEN},
+	{ DEVICEID_COMET_SMB,     "Comet Lake watchdog timer",		10, 4, PMC_HIDDEN},
 	{ DEVICEID_SRPTLP_SMB,    "Sunrise Point-LP watchdog timer",	10, 4 },
 	{ DEVICEID_C3000,         "Intel Atom C3000 watchdog timer",	10, 4 },
 	{ 0, NULL, 0, 0 },
@@ -788,13 +791,23 @@ ichwd_smb_attach(device_t dev)
 	isab = device_get_parent(device_get_parent(dev));
 	pmdev = pci_find_dbsf(pci_get_domain(isab), pci_get_bus(isab), 31, 2);
 	if (pmdev == NULL) {
-		device_printf(dev, "unable to find Power Management device\n");
-		return (ENXIO);
-	}
-	acpi_base = pci_read_config(pmdev, ICH_PMBASE, 4) & 0xffffff00;
-	if (acpi_base == 0) {
-		device_printf(dev, "ACPI base address is not set\n");
-		return (ENXIO);
+		if (id_p->quirks & PMC_HIDDEN) {
+			/*
+			 * Since the PMC is hidden, we take the default value for the
+			 * given device, which happens to be the same for the ones we
+			 * support.
+			 */
+			acpi_base = ACPI_DEFAULT_CANNON;
+		} else {
+			device_printf(dev, "unable to find Power Management device\n");
+			return (ENXIO);
+		}
+	} else {
+		acpi_base = pci_read_config(pmdev, ICH_PMBASE, 4) & 0xffffff00;
+		if (acpi_base == 0) {
+			device_printf(dev, "ACPI base address is not set\n");
+			return (ENXIO);
+		}
 	}
 
 	/* Allocate SMI control I/O register space. */
diff --git a/sys/dev/ichwd/ichwd.h b/sys/dev/ichwd/ichwd.h
index f78485249871..4a15d5201a4b 100644
--- a/sys/dev/ichwd/ichwd.h
+++ b/sys/dev/ichwd/ichwd.h
@@ -38,6 +38,7 @@ struct ichwd_device {
 	char			*desc;
 	unsigned int		 ich_version;
 	unsigned int		 tco_version;
+	uint32_t		 quirks;
 };
 
 struct ichwd_softc {
@@ -277,6 +278,9 @@ struct ichwd_softc {
 #define	DEVICEID_WCPT_LP7	0x9cc7
 #define	DEVICEID_WCPT_LP9	0x9cc9
 #define	DEVICEID_LEWISBURG_SMB	0xa1a3
+#define	DEVICEID_LEWISBURG_SMB_SSKU	0xa223
+#define DEVICEID_CANNON_SMB	0xa323
+#define DEVICEID_COMET_SMB	0x06a3
 #define	DEVICEID_SRPTLP_SMB	0x9d23
 
 /* ICH LPC Interface Bridge Registers (ICH5 and older) */
@@ -386,6 +390,9 @@ struct ichwd_softc {
 #define	TCO_INTRD_SEL_INTR	0x0001
 #define	TCO_INTRD_SEL_SMI	0x0002
 
+/* default ACPI Base values */
+#define ACPI_DEFAULT_CANNON	0x1800
+
 /*
  * Masks for the TCO timer value field in TCO_RLD.
  * If the datasheets are to be believed, the minimum value actually varies
@@ -408,4 +415,11 @@ struct ichwd_softc {
  */
 #define	ICHWD_TCO_V3_TICK	1000000000
 
+/*
+ * Quirks
+ */
+
+/* On Cannon Lake and Commet Lake PHCs, the PMC is hidden */
+#define PMC_HIDDEN		(1 << 0)
+
 #endif


More information about the dev-commits-src-all mailing list