diff options
Diffstat (limited to 'config/coreboot/default/patches')
38 files changed, 3969 insertions, 50 deletions
| diff --git a/config/coreboot/default/patches/0001-add-c3-and-clockgen-to-apple-macbook21.patch b/config/coreboot/default/patches/0001-add-c3-and-clockgen-to-apple-macbook21.patch index c908a185..31c1bb30 100644 --- a/config/coreboot/default/patches/0001-add-c3-and-clockgen-to-apple-macbook21.patch +++ b/config/coreboot/default/patches/0001-add-c3-and-clockgen-to-apple-macbook21.patch @@ -1,7 +1,7 @@ -From 857f80c0f41908c2672bd71e161b421676c1f22b Mon Sep 17 00:00:00 2001 +From bd959c38f6ee21db1ff8f4fbb0675e38bfbe1147 Mon Sep 17 00:00:00 2001  From: Vitali64 <5405891-vitali64yt@users.noreply.gitlab.com>  Date: Wed, 27 Oct 2021 13:36:01 +0200 -Subject: [PATCH 01/24] add c3 and clockgen to apple/macbook21 +Subject: [PATCH 01/37] add c3 and clockgen to apple/macbook21  ---   src/mainboard/apple/macbook21/Kconfig       |  1 + diff --git a/config/coreboot/default/patches/0002-lenovo-t400-Enable-all-SATA-ports.patch b/config/coreboot/default/patches/0002-lenovo-t400-Enable-all-SATA-ports.patch index e48d1d77..0c2b080f 100644 --- a/config/coreboot/default/patches/0002-lenovo-t400-Enable-all-SATA-ports.patch +++ b/config/coreboot/default/patches/0002-lenovo-t400-Enable-all-SATA-ports.patch @@ -1,7 +1,7 @@ -From 055da4d70c9857b6e301a1fca61e7bf39b8ed788 Mon Sep 17 00:00:00 2001 +From e5eab4c8043b89a325b4a28bf7da456d68475144 Mon Sep 17 00:00:00 2001  From: persmule <persmule@gmail.com>  Date: Sun, 31 Oct 2021 23:33:26 +0000 -Subject: [PATCH 02/24] lenovo/t400: Enable all SATA ports +Subject: [PATCH 02/37] lenovo/t400: Enable all SATA ports  There are 2 SATA ports on the chassis of t400(s), but at least one dock for  t400 contains a port for (P/S)ATA device, and t400s has a eSATA port on its diff --git a/config/coreboot/default/patches/0003-lenovo-x230-set-me_state-Disabled-in-cmos.default.patch b/config/coreboot/default/patches/0003-lenovo-x230-set-me_state-Disabled-in-cmos.default.patch index 3a4916ba..4ccde9a6 100644 --- a/config/coreboot/default/patches/0003-lenovo-x230-set-me_state-Disabled-in-cmos.default.patch +++ b/config/coreboot/default/patches/0003-lenovo-x230-set-me_state-Disabled-in-cmos.default.patch @@ -1,7 +1,7 @@ -From c0246706b784309729194a8e7dd12e130eb74130 Mon Sep 17 00:00:00 2001 +From fd398cc10600cccce3dd4931651a5294ffebde9a Mon Sep 17 00:00:00 2001  From: Leah Rowe <leah@libreboot.org>  Date: Mon, 3 Jan 2022 19:06:22 +0000 -Subject: [PATCH 03/24] lenovo/x230: set me_state=Disabled in cmos.default +Subject: [PATCH 03/37] lenovo/x230: set me_state=Disabled in cmos.default  I only recently found out about this. It's possible to use me_cleaner to  do the same thing, but some people might just flash coreboot and not do diff --git a/config/coreboot/default/patches/0004-set-me_state-Disabled-on-all-cmos.default-files.patch b/config/coreboot/default/patches/0004-set-me_state-Disabled-on-all-cmos.default-files.patch index d3eaa5a8..39319d58 100644 --- a/config/coreboot/default/patches/0004-set-me_state-Disabled-on-all-cmos.default-files.patch +++ b/config/coreboot/default/patches/0004-set-me_state-Disabled-on-all-cmos.default-files.patch @@ -1,7 +1,7 @@ -From b84b1d40d5fef3278d9ea218e92576c095d8814c Mon Sep 17 00:00:00 2001 +From 74230d8123cb7c31afd084658720084b1a5ac5d9 Mon Sep 17 00:00:00 2001  From: Leah Rowe <leah@libreboot.org>  Date: Wed, 2 Mar 2022 21:50:01 +0000 -Subject: [PATCH 04/24] set me_state=Disabled on all cmos.default files! +Subject: [PATCH 04/37] set me_state=Disabled on all cmos.default files!  yeah. why the hell isn't this the default diff --git a/config/coreboot/default/patches/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch b/config/coreboot/default/patches/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch index 0938b9f2..9c00ab79 100644 --- a/config/coreboot/default/patches/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch +++ b/config/coreboot/default/patches/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch @@ -1,7 +1,7 @@ -From f6593dd2146657ee39e2ac3f4b4bac5e7569df67 Mon Sep 17 00:00:00 2001 +From f592ac32892d7f99fa2e68504bb147e5d06184ca Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Sun, 19 Feb 2023 18:21:43 +0000 -Subject: [PATCH 05/24] util/ifdtool: add --nuke flag (all 0xFF on region) +Subject: [PATCH 05/37] util/ifdtool: add --nuke flag (all 0xFF on region)  When this option is used, the region's contents are overwritten  with all ones (0xFF). diff --git a/config/coreboot/default/patches/0006-mb-dell-e6400-Enable-01.0-device-in-devicetree-for-d.patch b/config/coreboot/default/patches/0006-mb-dell-e6400-Enable-01.0-device-in-devicetree-for-d.patch index b6f44a1a..ee60c3c8 100644 --- a/config/coreboot/default/patches/0006-mb-dell-e6400-Enable-01.0-device-in-devicetree-for-d.patch +++ b/config/coreboot/default/patches/0006-mb-dell-e6400-Enable-01.0-device-in-devicetree-for-d.patch @@ -1,7 +1,7 @@ -From c730bc21c276376baa36956548af1e8412325a9e Mon Sep 17 00:00:00 2001 +From 18069af7c0c6beedfadb615cca9127e82a0d8007 Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Sat, 6 May 2023 15:53:41 -0600 -Subject: [PATCH 06/24] mb/dell/e6400: Enable 01.0 device in devicetree for +Subject: [PATCH 06/37] mb/dell/e6400: Enable 01.0 device in devicetree for   dGPU models  Change-Id: I9b8e5d3cd1e1f64dc87b682b1e045b6342924aed diff --git a/config/coreboot/default/patches/0007-Remove-warning-for-coreboot-images-built-without-a-p.patch b/config/coreboot/default/patches/0007-Remove-warning-for-coreboot-images-built-without-a-p.patch index 793abd91..525bd366 100644 --- a/config/coreboot/default/patches/0007-Remove-warning-for-coreboot-images-built-without-a-p.patch +++ b/config/coreboot/default/patches/0007-Remove-warning-for-coreboot-images-built-without-a-p.patch @@ -1,7 +1,7 @@ -From b109338522d997dd1b1f705891f000c2f8bfe457 Mon Sep 17 00:00:00 2001 +From 9563c107a4b40e66b610d7205a21590c7c181c78 Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Fri, 12 May 2023 19:55:15 -0600 -Subject: [PATCH 07/24] Remove warning for coreboot images built without a +Subject: [PATCH 07/37] Remove warning for coreboot images built without a   payload  I added this in upstream to prevent people from accidentally flashing diff --git a/config/coreboot/default/patches/0008-HACK-Disable-coreboot-related-BL31-features.patch b/config/coreboot/default/patches/0008-HACK-Disable-coreboot-related-BL31-features.patch index e4fc4f35..bd2c56bd 100644 --- a/config/coreboot/default/patches/0008-HACK-Disable-coreboot-related-BL31-features.patch +++ b/config/coreboot/default/patches/0008-HACK-Disable-coreboot-related-BL31-features.patch @@ -1,7 +1,7 @@ -From 243d3b1892d33b4eccc9c48333fbc137c4294a73 Mon Sep 17 00:00:00 2001 +From 7f650a19d30fe6157b150c5248d6086007323d72 Mon Sep 17 00:00:00 2001  From: Alper Nebi Yasak <alpernebiyasak@gmail.com>  Date: Thu, 22 Jun 2023 16:44:27 +0300 -Subject: [PATCH 08/24] HACK: Disable coreboot related BL31 features +Subject: [PATCH 08/37] HACK: Disable coreboot related BL31 features  I don't know why, but removing this BL31 make argument lets gru-kevin  power off properly when shut down from Linux. Needs investigation. diff --git a/config/coreboot/default/patches/0009-dell-e6430-use-ME-Soft-Temporary-Disable.patch b/config/coreboot/default/patches/0009-dell-e6430-use-ME-Soft-Temporary-Disable.patch index afada4b5..ca3b6264 100644 --- a/config/coreboot/default/patches/0009-dell-e6430-use-ME-Soft-Temporary-Disable.patch +++ b/config/coreboot/default/patches/0009-dell-e6430-use-ME-Soft-Temporary-Disable.patch @@ -1,7 +1,7 @@ -From ef4f92299f18c5f28bfe8392cbc0e27d48c03415 Mon Sep 17 00:00:00 2001 +From 3f6f65ed6a435fe49534c8a0b5cb98c3eac71150 Mon Sep 17 00:00:00 2001  From: Leah Rowe <leah@libreboot.org>  Date: Sun, 5 Nov 2023 11:41:41 +0000 -Subject: [PATCH 09/24] dell/e6430: use ME Soft Temporary Disable +Subject: [PATCH 09/37] dell/e6430: use ME Soft Temporary Disable  i overlooked this. it's set on other boards. diff --git a/config/coreboot/default/patches/0010-mb-hp-Add-Compaq-Elite-8300-CMT-port.patch b/config/coreboot/default/patches/0010-mb-hp-Add-Compaq-Elite-8300-CMT-port.patch index 96a1881c..2a7d5c17 100644 --- a/config/coreboot/default/patches/0010-mb-hp-Add-Compaq-Elite-8300-CMT-port.patch +++ b/config/coreboot/default/patches/0010-mb-hp-Add-Compaq-Elite-8300-CMT-port.patch @@ -1,7 +1,7 @@ -From 0cf8b5be9187a6d54e100483943c72f550bc2690 Mon Sep 17 00:00:00 2001 +From b4d48233a8d829d7285501f662d999aad898be21 Mon Sep 17 00:00:00 2001  From: Riku Viitanen <riku.viitanen@protonmail.com>  Date: Sat, 23 Dec 2023 19:02:10 +0200 -Subject: [PATCH 10/24] mb/hp: Add Compaq Elite 8300 CMT port +Subject: [PATCH 10/37] mb/hp: Add Compaq Elite 8300 CMT port  Based on autoport and Z220 SuperIO code. diff --git a/config/coreboot/default/patches/0011-nb-intel-haswell-make-IOMMU-a-runtime-option.patch b/config/coreboot/default/patches/0011-nb-intel-haswell-make-IOMMU-a-runtime-option.patch index 564cb74c..f8c56155 100644 --- a/config/coreboot/default/patches/0011-nb-intel-haswell-make-IOMMU-a-runtime-option.patch +++ b/config/coreboot/default/patches/0011-nb-intel-haswell-make-IOMMU-a-runtime-option.patch @@ -1,7 +1,7 @@ -From a4ffe8da011550fdeacae85ebf642ff57ffb08cc Mon Sep 17 00:00:00 2001 +From a16ff494adb1f706d402a2e167d0d53c775d0897 Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Sat, 2 Mar 2024 22:51:09 +0000 -Subject: [PATCH 11/24] nb/intel/haswell: make IOMMU a runtime option +Subject: [PATCH 11/37] nb/intel/haswell: make IOMMU a runtime option  When I tested graphics cards on a coreboot port for Dell  OptiPlex 9020 SFF, I could not use a graphics card unless diff --git a/config/coreboot/default/patches/0012-dell-optiplex_9020-Disable-IOMMU-by-default.patch b/config/coreboot/default/patches/0012-dell-optiplex_9020-Disable-IOMMU-by-default.patch index 06316010..e578d22a 100644 --- a/config/coreboot/default/patches/0012-dell-optiplex_9020-Disable-IOMMU-by-default.patch +++ b/config/coreboot/default/patches/0012-dell-optiplex_9020-Disable-IOMMU-by-default.patch @@ -1,7 +1,7 @@ -From bcb2017f4c583742bc60179e6f7c7381e1fa0a39 Mon Sep 17 00:00:00 2001 +From 4b0536ce7cd55eedc52d13497bea59d91e8924d8 Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Sat, 2 Mar 2024 23:00:09 +0000 -Subject: [PATCH 12/24] dell/optiplex_9020: Disable IOMMU by default +Subject: [PATCH 12/37] dell/optiplex_9020: Disable IOMMU by default  Needed to make graphics cards work. Turning it on is  recommended if only using iGPU, otherwise leave it off diff --git a/config/coreboot/default/patches/0013-nb-haswell-Fully-disable-iGPU-when-dGPU-is-used.patch b/config/coreboot/default/patches/0013-nb-haswell-Fully-disable-iGPU-when-dGPU-is-used.patch index 1b4f7327..89584d95 100644 --- a/config/coreboot/default/patches/0013-nb-haswell-Fully-disable-iGPU-when-dGPU-is-used.patch +++ b/config/coreboot/default/patches/0013-nb-haswell-Fully-disable-iGPU-when-dGPU-is-used.patch @@ -1,7 +1,7 @@ -From 1515f6f416a75ecf6de0615f30fc1c5c6696e4d8 Mon Sep 17 00:00:00 2001 +From c8329f84b2d06581dcbeecedc38b7c4715a9cba7 Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Sat, 6 Apr 2024 01:22:47 +0100 -Subject: [PATCH 13/24] nb/haswell: Fully disable iGPU when dGPU is used +Subject: [PATCH 13/37] nb/haswell: Fully disable iGPU when dGPU is used  My earlier patch disabled decode *and* disabled the iGPU itself, but  a subsequent revision disabled only VGA decode. Upon revisiting, I diff --git a/config/coreboot/default/patches/0014-ec-dell-mec5035-Add-S3-suspend-SMI-handler.patch b/config/coreboot/default/patches/0014-ec-dell-mec5035-Add-S3-suspend-SMI-handler.patch index fe9c4731..70556090 100644 --- a/config/coreboot/default/patches/0014-ec-dell-mec5035-Add-S3-suspend-SMI-handler.patch +++ b/config/coreboot/default/patches/0014-ec-dell-mec5035-Add-S3-suspend-SMI-handler.patch @@ -1,7 +1,7 @@ -From 7eb31625fc82a8f697a2f7972b24a4dd19effe5b Mon Sep 17 00:00:00 2001 +From 73dbf291631fdbae2d8e8a761c147523c8d9e65c Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Fri, 3 May 2024 11:03:32 -0600 -Subject: [PATCH 14/24] ec/dell/mec5035: Add S3 suspend SMI handler +Subject: [PATCH 14/37] ec/dell/mec5035: Add S3 suspend SMI handler  This is necessary for S3 resume to work on SNB and newer Dell Latitude  laptops. If a command isn't sent, the EC cuts power to the DIMMs, diff --git a/config/coreboot/default/patches/0015-nb-haswell-lock-policy-regs-when-disabling-IOMMU.patch b/config/coreboot/default/patches/0015-nb-haswell-lock-policy-regs-when-disabling-IOMMU.patch index 7bc6b3a1..9525b8ce 100644 --- a/config/coreboot/default/patches/0015-nb-haswell-lock-policy-regs-when-disabling-IOMMU.patch +++ b/config/coreboot/default/patches/0015-nb-haswell-lock-policy-regs-when-disabling-IOMMU.patch @@ -1,7 +1,7 @@ -From 961814da316a7bd760cd4aa3acd8e176a9ff2cf1 Mon Sep 17 00:00:00 2001 +From a507fe609a2e99c95218ec430916eaf4c3cb61d9 Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Sat, 4 May 2024 02:00:53 +0100 -Subject: [PATCH 15/24] nb/haswell: lock policy regs when disabling IOMMU +Subject: [PATCH 15/37] nb/haswell: lock policy regs when disabling IOMMU  Angel Pons told me I should do it. See comments here:  https://review.coreboot.org/c/coreboot/+/81016 diff --git a/config/coreboot/default/patches/0016-nb-intel-gm45-Make-DDR2-raminit-work.patch b/config/coreboot/default/patches/0016-nb-intel-gm45-Make-DDR2-raminit-work.patch index d024045f..091a15c4 100644 --- a/config/coreboot/default/patches/0016-nb-intel-gm45-Make-DDR2-raminit-work.patch +++ b/config/coreboot/default/patches/0016-nb-intel-gm45-Make-DDR2-raminit-work.patch @@ -1,7 +1,7 @@ -From 24e8c088fbe14b598e588383d331f06f21d87190 Mon Sep 17 00:00:00 2001 +From 9e0a6aa376db81f9409eda92b6783a8262c1fedb Mon Sep 17 00:00:00 2001  From: Angel Pons <th3fanbus@gmail.com>  Date: Mon, 10 May 2021 22:40:59 +0200 -Subject: [PATCH 16/24] nb/intel/gm45: Make DDR2 raminit work +Subject: [PATCH 16/37] nb/intel/gm45: Make DDR2 raminit work  List of changes:   - Update some timing and ODT values diff --git a/config/coreboot/default/patches/0017-nb-gm45-Fix-Angel-s-DDR2-RCOMP-fix-on-DDR3-boards.patch b/config/coreboot/default/patches/0017-nb-gm45-Fix-Angel-s-DDR2-RCOMP-fix-on-DDR3-boards.patch index 8b85564d..4ba74757 100644 --- a/config/coreboot/default/patches/0017-nb-gm45-Fix-Angel-s-DDR2-RCOMP-fix-on-DDR3-boards.patch +++ b/config/coreboot/default/patches/0017-nb-gm45-Fix-Angel-s-DDR2-RCOMP-fix-on-DDR3-boards.patch @@ -1,7 +1,7 @@ -From b0ff2cc0470a44078e87bff6226d34b7ac652508 Mon Sep 17 00:00:00 2001 +From 6acc310c1d695d47c148296da9da189de21d58be Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Tue, 6 Aug 2024 00:50:24 +0100 -Subject: [PATCH 17/24] nb/gm45: Fix Angel's DDR2 RCOMP fix on DDR3 boards +Subject: [PATCH 17/37] nb/gm45: Fix Angel's DDR2 RCOMP fix on DDR3 boards  We add this patch: diff --git a/config/coreboot/default/patches/0018-mb-dell-e6400-Use-100-MHz-reference-clock-for-displa.patch b/config/coreboot/default/patches/0018-mb-dell-e6400-Use-100-MHz-reference-clock-for-displa.patch index 2ef3bd9d..1cf7c0ac 100644 --- a/config/coreboot/default/patches/0018-mb-dell-e6400-Use-100-MHz-reference-clock-for-displa.patch +++ b/config/coreboot/default/patches/0018-mb-dell-e6400-Use-100-MHz-reference-clock-for-displa.patch @@ -1,7 +1,7 @@ -From 8926fcba34f6d6ea59bcddbbebf1830df38106d2 Mon Sep 17 00:00:00 2001 +From 7461210ecc7c8e41f3f941bd5ce7943e5f66c711 Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Mon, 20 May 2024 10:24:16 -0600 -Subject: [PATCH 18/24] mb/dell/e6400: Use 100 MHz reference clock for display +Subject: [PATCH 18/37] mb/dell/e6400: Use 100 MHz reference clock for display  The E6400 uses a 100 MHz reference clock for spread spectrum support on  LVDS, whereas libgfxinit previously assumed a 96 MHz input clock. For diff --git a/config/coreboot/default/patches/0019-nb-x4x-define-INTEL_GMA_DPLL_REF_FREQ.patch b/config/coreboot/default/patches/0019-nb-x4x-define-INTEL_GMA_DPLL_REF_FREQ.patch index 63a7487a..2edfaae3 100644 --- a/config/coreboot/default/patches/0019-nb-x4x-define-INTEL_GMA_DPLL_REF_FREQ.patch +++ b/config/coreboot/default/patches/0019-nb-x4x-define-INTEL_GMA_DPLL_REF_FREQ.patch @@ -1,7 +1,7 @@ -From a80e71ba4cd7dc7c131c9649de1424899fddddb1 Mon Sep 17 00:00:00 2001 +From a683dffd774dbbe25cc77c0f7d3853232c17c2bf Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Mon, 12 Aug 2024 02:15:24 +0100 -Subject: [PATCH 19/24] nb/x4x: define INTEL_GMA_DPLL_REF_FREQ +Subject: [PATCH 19/37] nb/x4x: define INTEL_GMA_DPLL_REF_FREQ  set it to 96MHz. fixes the following build error when  building for x4x boards e.g. gigabyte ga-g41m-es2l: diff --git a/config/coreboot/default/patches/0020-mb-dell-Convert-E6400-into-a-variant.patch b/config/coreboot/default/patches/0020-mb-dell-Convert-E6400-into-a-variant.patch index f187c108..a0068142 100644 --- a/config/coreboot/default/patches/0020-mb-dell-Convert-E6400-into-a-variant.patch +++ b/config/coreboot/default/patches/0020-mb-dell-Convert-E6400-into-a-variant.patch @@ -1,7 +1,7 @@ -From 1d62741f0f069241c2d1497c7faf0b31249e706d Mon Sep 17 00:00:00 2001 +From a48ba23bb4a24730fa49b5a10b56c9de873dea8a Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Thu, 26 Sep 2024 19:48:26 -0600 -Subject: [PATCH 20/24] mb/dell: Convert E6400 into a variant +Subject: [PATCH 20/37] mb/dell: Convert E6400 into a variant  All the GM45 Dell Latitudes should be nearly identical, so convert the  E6400 port into a variant so that future ports for the other systems can diff --git a/config/coreboot/default/patches/0021-mb-dell-gm45_latitudes-Add-E4300-variant.patch b/config/coreboot/default/patches/0021-mb-dell-gm45_latitudes-Add-E4300-variant.patch index 17fa6aff..af893982 100644 --- a/config/coreboot/default/patches/0021-mb-dell-gm45_latitudes-Add-E4300-variant.patch +++ b/config/coreboot/default/patches/0021-mb-dell-gm45_latitudes-Add-E4300-variant.patch @@ -1,7 +1,7 @@ -From 031aca7160b8258bd16d5c5a3481c6ee900111e1 Mon Sep 17 00:00:00 2001 +From b87e6774f0407ea48610c83ea54ab6a4b4a78a24 Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Thu, 26 Sep 2024 19:51:25 -0600 -Subject: [PATCH 21/24] mb/dell/gm45_latitudes: Add E4300 variant +Subject: [PATCH 21/37] mb/dell/gm45_latitudes: Add E4300 variant  Change-Id: I0f2059501b11be103187e3ce1a7c04ab85ae63d2  Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com> diff --git a/config/coreboot/default/patches/0022-mb-dell-Add-S3-SMI-handler-for-Dell-Latitudes.patch b/config/coreboot/default/patches/0022-mb-dell-Add-S3-SMI-handler-for-Dell-Latitudes.patch index ddcaadb3..bbdce358 100644 --- a/config/coreboot/default/patches/0022-mb-dell-Add-S3-SMI-handler-for-Dell-Latitudes.patch +++ b/config/coreboot/default/patches/0022-mb-dell-Add-S3-SMI-handler-for-Dell-Latitudes.patch @@ -1,7 +1,7 @@ -From e6a153dbaf95b034f75dd6717c6d250d1cc21635 Mon Sep 17 00:00:00 2001 +From 0bc9ca409793836dcdb386db97b7a9464d92a973 Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Fri, 3 May 2024 16:31:12 -0600 -Subject: [PATCH 22/24] mb/dell: Add S3 SMI handler for Dell Latitudes +Subject: [PATCH 22/37] mb/dell: Add S3 SMI handler for Dell Latitudes  Integrate the previously added mec5035_smi_sleep() function into  mainboard code to fix S3 suspend on the SNB/IVB Latitudes and the E7240. diff --git a/config/coreboot/default/patches/0023-ec-dell-mec5035-Route-power-button-event-to-host.patch b/config/coreboot/default/patches/0023-ec-dell-mec5035-Route-power-button-event-to-host.patch index 0351d503..ab01c935 100644 --- a/config/coreboot/default/patches/0023-ec-dell-mec5035-Route-power-button-event-to-host.patch +++ b/config/coreboot/default/patches/0023-ec-dell-mec5035-Route-power-button-event-to-host.patch @@ -1,7 +1,7 @@ -From 41fab69e70eb78b93e1998396bf85a5afbaa61ef Mon Sep 17 00:00:00 2001 +From d91dc168d6b8eca5e78aef9e48571d6edb156d45 Mon Sep 17 00:00:00 2001  From: Nicholas Chin <nic.c3.14@gmail.com>  Date: Tue, 18 Jun 2024 21:31:08 -0600 -Subject: [PATCH 23/24] ec/dell/mec5035: Route power button event to host +Subject: [PATCH 23/37] ec/dell/mec5035: Route power button event to host  If command 0x3e with an argument of 1 isn't sent to the EC, pressing the  power button results in the EC powering off the system without letting diff --git a/config/coreboot/default/patches/0024-Disable-compression-on-refcode-insertion.patch b/config/coreboot/default/patches/0024-Disable-compression-on-refcode-insertion.patch index 51928bd6..c557e9d7 100644 --- a/config/coreboot/default/patches/0024-Disable-compression-on-refcode-insertion.patch +++ b/config/coreboot/default/patches/0024-Disable-compression-on-refcode-insertion.patch @@ -1,7 +1,7 @@ -From 1380f0f6f3c73bbd994228acdbcbbc06da7c6cb2 Mon Sep 17 00:00:00 2001 +From b6bd33b0430f72c2fce16a3b1e41927ef540923b Mon Sep 17 00:00:00 2001  From: Leah Rowe <info@minifree.org>  Date: Tue, 31 Dec 2024 14:42:24 +0000 -Subject: [PATCH 24/24] Disable compression on refcode insertion +Subject: [PATCH 24/37] Disable compression on refcode insertion  Compression is not reliably reproducible. In an lbmk release  context, this means we cannot rely on vendorfile insertion. diff --git a/config/coreboot/default/patches/0025-nb-intel-Disable-stack-overflow-debug-options.patch b/config/coreboot/default/patches/0025-nb-intel-Disable-stack-overflow-debug-options.patch index c9e243f4..696be518 100644 --- a/config/coreboot/default/patches/0025-nb-intel-Disable-stack-overflow-debug-options.patch +++ b/config/coreboot/default/patches/0025-nb-intel-Disable-stack-overflow-debug-options.patch @@ -1,7 +1,7 @@ -From 3400b3e7c31e45506bb060db0164fa9390366d27 Mon Sep 17 00:00:00 2001 +From fc4c65f3bb807b9fc766745a70f92729b0b8d99e Mon Sep 17 00:00:00 2001  From: Leah Rowe <leah@libreboot.org>  Date: Mon, 21 Apr 2025 02:58:47 +0100 -Subject: [PATCH 1/1] nb/intel/*: Disable stack overflow debug options +Subject: [PATCH 25/37] nb/intel/*: Disable stack overflow debug options  Signed-off-by: Leah Rowe <leah@libreboot.org>  --- diff --git a/config/coreboot/default/patches/0026-soc-intel-skylake-configure-usb-acpi.patch b/config/coreboot/default/patches/0026-soc-intel-skylake-configure-usb-acpi.patch new file mode 100644 index 00000000..c411c18b --- /dev/null +++ b/config/coreboot/default/patches/0026-soc-intel-skylake-configure-usb-acpi.patch @@ -0,0 +1,94 @@ +From 14002b2575d73d3edbc72584502a463e6802cba6 Mon Sep 17 00:00:00 2001 +From: Felix Singer <felixsinger@posteo.net> +Date: Wed, 26 Jun 2024 04:24:31 +0200 +Subject: [PATCH 26/37] soc/intel/skylake: configure usb acpi + +Change-Id: I53fc73046e4b107064fa8c3c617ba6d9b807b71d +Signed-off-by: Felix Singer <felixsinger@posteo.net> +--- + src/soc/intel/skylake/Kconfig    |  1 + + src/soc/intel/skylake/chipset.cb | 56 +++++++++++++++++++++++++++++++- + 2 files changed, 56 insertions(+), 1 deletion(-) + +diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig +index 4ad33496b2..9191ed0ff8 100644 +--- a/src/soc/intel/skylake/Kconfig ++++ b/src/soc/intel/skylake/Kconfig +@@ -10,6 +10,7 @@ config SOC_INTEL_COMMON_SKYLAKE_BASE + 	select CPU_INTEL_COMMON + 	select CPU_INTEL_FIRMWARE_INTERFACE_TABLE + 	select CPU_SUPPORTS_PM_TIMER_EMULATION ++	select DRIVERS_USB_ACPI + 	select EDK2_CPU_TIMER_LIB if PAYLOAD_EDK2 + 	select FSP_COMPRESS_FSP_S_LZ4 + 	select FSP_M_XIP +diff --git a/src/soc/intel/skylake/chipset.cb b/src/soc/intel/skylake/chipset.cb +index 6538a1475b..dfb81d496e 100644 +--- a/src/soc/intel/skylake/chipset.cb ++++ b/src/soc/intel/skylake/chipset.cb +@@ -13,7 +13,61 @@ chip soc/intel/skylake + 		device pci 07.0 alias chap         off                     end + 		device pci 08.0 alias gmm          off                     end # Gaussian Mixture Model + 		device pci 13.0 alias ish          off                     end # SensorHub +-		device pci 14.0 alias south_xhci   off ops usb_xhci_ops    end ++		device pci 14.0 alias south_xhci   off ops usb_xhci_ops ++			chip drivers/usb/acpi ++				register "type" = "UPC_TYPE_HUB" ++				device usb 0.0 alias xhci_root_hub off ++					chip drivers/usb/acpi ++						device usb 2.0 alias usb2_port1 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.1 alias usb2_port2 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.2 alias usb2_port3 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.3 alias usb2_port4 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.4 alias usb2_port5 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.5 alias usb2_port6 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.6 alias usb2_port7 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.7 alias usb2_port8 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.8 alias usb2_port9 off end ++					end ++					chip drivers/usb/acpi ++						device usb 2.9 alias usb2_port10 off end ++					end ++					chip drivers/usb/acpi ++						device usb 3.0 alias usb3_port1 off end ++					end ++					chip drivers/usb/acpi ++						device usb 3.1 alias usb3_port2 off end ++					end ++					chip drivers/usb/acpi ++						device usb 3.2 alias usb3_port3 off end ++					end ++					chip drivers/usb/acpi ++						device usb 3.3 alias usb3_port4 off end ++					end ++					chip drivers/usb/acpi ++						device usb 3.4 alias usb3_port5 off end ++					end ++					chip drivers/usb/acpi ++						device usb 3.5 alias usb3_port6 off end ++					end ++				end ++			end ++		end + 		device pci 14.1 alias south_xdci   off ops usb_xdci_ops    end + 		device pci 14.2 alias thermal      off                     end + 		device pci 14.3 alias cio          off                     end +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0027-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch b/config/coreboot/default/patches/0027-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch new file mode 100644 index 00000000..9d75cec6 --- /dev/null +++ b/config/coreboot/default/patches/0027-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch @@ -0,0 +1,30 @@ +From 3bb65b7f2a02ecb93e15ae037da38ad8f812747b Mon Sep 17 00:00:00 2001 +From: Mate Kukri <km@mkukri.xyz> +Date: Fri, 22 Nov 2024 21:26:48 +0000 +Subject: [PATCH 27/37] soc/intel/skylake: Enable 4E/4F PNP I/O ports in + bootblock + +Change-Id: I57c9d8a9513a268e2ca6a0abd1306cd038598173 +Signed-off-by: Mate Kukri <km@mkukri.xyz> +--- + src/soc/intel/skylake/bootblock/pch.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/soc/intel/skylake/bootblock/pch.c b/src/soc/intel/skylake/bootblock/pch.c +index df00bb85a9..beaece960b 100644 +--- a/src/soc/intel/skylake/bootblock/pch.c ++++ b/src/soc/intel/skylake/bootblock/pch.c +@@ -100,8 +100,8 @@ static void soc_config_pwrmbase(void) +  + void pch_early_iorange_init(void) + { +-	uint16_t io_enables = LPC_IOE_SUPERIO_2E_2F | LPC_IOE_KBC_60_64 | +-			LPC_IOE_EC_62_66; ++	uint16_t io_enables = LPC_IOE_EC_4E_4F | LPC_IOE_SUPERIO_2E_2F | ++			LPC_IOE_KBC_60_64 | LPC_IOE_EC_62_66; +  + 	const config_t *config = config_of_soc(); +  +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0028-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch b/config/coreboot/default/patches/0028-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch new file mode 100644 index 00000000..df71dc47 --- /dev/null +++ b/config/coreboot/default/patches/0028-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch @@ -0,0 +1,2232 @@ +From b515ba5b0cd02dc1771f27eaa716582b0827a638 Mon Sep 17 00:00:00 2001 +From: Mate Kukri <km@mkukri.xyz> +Date: Tue, 31 Dec 2024 22:49:15 +0000 +Subject: [PATCH 28/37] mb/lenovo: Add ThinkPad T480 and ThinkPad T480s + +These machine have BootGuard fused and requires deguard to +boot coreboot. + +Known issues: +- Alpine Ridge Thunderbolt 3 controller does not work +- Some Fn+F{1-12} keys aren't handled correctly +- Nvidia dGPU is finicky +  - Needs option ROM +  - Power enable code is buggy +  - Nouveau only works on linux 6.8-6.9 +- Headphone jack isn't detected as plugged in despite correct verbs + +Thanks to Leah Rowe for helping with the T480s. + +Signed-off-by: Mate Kukri <km@mkukri.xyz> +Change-Id: I19d421412c771c1f242f6ff39453f824fa866163 +--- + src/device/pci_rom.c                          |   4 +- + src/ec/lenovo/h8/acpi/ec.asl                  |   2 +- + src/ec/lenovo/h8/bluetooth.c                  |   6 +- + src/ec/lenovo/h8/wwan.c                       |   6 +- + src/mainboard/lenovo/sklkbl_thinkpad/Kconfig  |  57 +++++ + .../lenovo/sklkbl_thinkpad/Kconfig.name       |   7 + + .../lenovo/sklkbl_thinkpad/Makefile.mk        |  73 +++++++ + .../lenovo/sklkbl_thinkpad/acpi/ec.asl        |  12 ++ + .../lenovo/sklkbl_thinkpad/acpi/superio.asl   |   3 + + .../lenovo/sklkbl_thinkpad/bootblock.c        |  60 ++++++ + .../lenovo/sklkbl_thinkpad/devicetree.cb      |  71 ++++++ + src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl |  33 +++ + src/mainboard/lenovo/sklkbl_thinkpad/ec.c     | 153 +++++++++++++ + src/mainboard/lenovo/sklkbl_thinkpad/ec.h     |  99 +++++++++ + src/mainboard/lenovo/sklkbl_thinkpad/gpio.h   |   8 + + .../lenovo/sklkbl_thinkpad/ramstage.c         | 105 +++++++++ + .../sklkbl_thinkpad/variants/t480/data.vbt    | Bin 0 -> 4106 bytes + .../variants/t480/gma-mainboard.ads           |  19 ++ + .../sklkbl_thinkpad/variants/t480/gpio.c      | 203 ++++++++++++++++++ + .../sklkbl_thinkpad/variants/t480/hda_verb.c  |  90 ++++++++ + .../variants/t480/memory_init_params.c        |  20 ++ + .../variants/t480/overridetree.cb             | 103 +++++++++ + .../sklkbl_thinkpad/variants/t480s/data.vbt   | Bin 0 -> 4106 bytes + .../variants/t480s/gma-mainboard.ads          |  19 ++ + .../sklkbl_thinkpad/variants/t480s/gpio.c     | 199 +++++++++++++++++ + .../sklkbl_thinkpad/variants/t480s/hda_verb.c |  90 ++++++++ + .../variants/t480s/memory_init_params.c       |  44 ++++ + .../variants/t480s/overridetree.cb            | 103 +++++++++ + .../variants/t480s/spd/spd_0.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_1.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_10.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_11.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_12.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_13.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_14.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_15.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_16.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_17.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_18.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_19.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_2.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_20.bin             | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_3.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_4.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_5.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_6.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_7.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_8.bin              | Bin 0 -> 512 bytes + .../variants/t480s/spd/spd_9.bin              | Bin 0 -> 512 bytes + 49 files changed, 1583 insertions(+), 6 deletions(-) + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/Kconfig + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/ec.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/ec.h + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/gpio.h + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_12.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_13.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_18.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_20.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_3.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin + create mode 100644 src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_9.bin + +diff --git a/src/device/pci_rom.c b/src/device/pci_rom.c +index dc41ef14ce..bba98d9dea 100644 +--- a/src/device/pci_rom.c ++++ b/src/device/pci_rom.c +@@ -396,14 +396,16 @@ void pci_rom_ssdt(const struct device *device) + 		rom = cbrom; + 	} +  ++#if 0 + 	const char *scope = acpi_device_path(device); + 	if (!scope) { + 		printk(BIOS_ERR, "%s: Missing ACPI scope\n", dev_path(device)); + 		return; + 	} ++#endif +  + 	/* write _ROM method */ +-	acpigen_write_scope(scope); ++	acpigen_write_scope("\\_SB.PCI0.RP01.PEGP"); + 	acpigen_write_rom((void *)rom, rom->size * 512); + 	acpigen_pop_len(); /* pop scope */ + } +diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl +index bc54d3b422..8f4a8e1986 100644 +--- a/src/ec/lenovo/h8/acpi/ec.asl ++++ b/src/ec/lenovo/h8/acpi/ec.asl +@@ -331,7 +331,7 @@ Device(EC) + #include "sleepbutton.asl" + #include "lid.asl" + #include "beep.asl" +-#include "thermal.asl" ++//#include "thermal.asl" + #include "systemstatus.asl" + #include "thinkpad.asl" + } +diff --git a/src/ec/lenovo/h8/bluetooth.c b/src/ec/lenovo/h8/bluetooth.c +index 16fc8dce39..be71a24ced 100644 +--- a/src/ec/lenovo/h8/bluetooth.c ++++ b/src/ec/lenovo/h8/bluetooth.c +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ +  +-#include <southbridge/intel/common/gpio.h> ++// #include <southbridge/intel/common/gpio.h> + #include <console/console.h> + #include <device/device.h> + #include <ec/acpi/ec.h> +@@ -28,16 +28,18 @@ bool h8_has_bdc(const struct device *dev) + { + 	struct ec_lenovo_h8_config *conf = dev->chip_info; +  +-	if (!conf->has_bdc_detection) { ++	if (1 || !conf->has_bdc_detection) { + 		printk(BIOS_INFO, "H8: BDC detection not implemented. " + 				  "Assuming BDC installed\n"); + 		return true; + 	} +  ++#if 0 + 	if (get_gpio(conf->bdc_gpio_num) == conf->bdc_gpio_lvl) { + 		printk(BIOS_INFO, "H8: BDC installed\n"); + 		return true; + 	} ++#endif +  + 	printk(BIOS_INFO, "H8: BDC not installed\n"); + 	return false; +diff --git a/src/ec/lenovo/h8/wwan.c b/src/ec/lenovo/h8/wwan.c +index 685886fcce..5cdcf77406 100644 +--- a/src/ec/lenovo/h8/wwan.c ++++ b/src/ec/lenovo/h8/wwan.c +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ +  +-#include <southbridge/intel/common/gpio.h> ++// #include <southbridge/intel/common/gpio.h> + #include <console/console.h> + #include <device/device.h> + #include <ec/acpi/ec.h> +@@ -26,16 +26,18 @@ bool h8_has_wwan(const struct device *dev) + { + 	struct ec_lenovo_h8_config *conf = dev->chip_info; +  +-	if (!conf->has_wwan_detection) { ++	if (1 || !conf->has_wwan_detection) { + 		printk(BIOS_INFO, "H8: WWAN detection not implemented. " + 				  "Assuming WWAN installed\n"); + 		return true; + 	} +  ++#if 0 + 	if (get_gpio(conf->wwan_gpio_num) == conf->wwan_gpio_lvl) { + 		printk(BIOS_INFO, "H8: WWAN installed\n"); + 		return true; + 	} ++#endif +  + 	printk(BIOS_INFO, "H8: WWAN not installed\n"); + 	return false; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig +new file mode 100644 +index 0000000000..4998672943 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig +@@ -0,0 +1,57 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++	bool ++	select BOARD_ROMSIZE_KB_16384 ++	select EC_LENOVO_H8 ++	select EC_LENOVO_PMH7 ++	select H8_HAS_BAT_THRESHOLDS_IMPL ++	select H8_HAS_LEDLOGO ++	select H8_HAS_PRIMARY_FN_KEYS ++	select HAVE_ACPI_RESUME ++	select HAVE_ACPI_TABLES ++	select INTEL_GMA_HAVE_VBT ++	select INTEL_INT15 ++	select MAINBOARD_HAS_LIBGFXINIT ++	select MAINBOARD_HAS_TPM2 ++	select MAINBOARD_USES_IFD_GBE_REGION ++	select MEMORY_MAPPED_TPM ++	select SOC_INTEL_COMMON_BLOCK_HDA_VERB ++	select SOC_INTEL_KABYLAKE ++	select SPD_READ_BY_WORD ++	select SYSTEM_TYPE_LAPTOP ++ ++config BOARD_LENOVO_T480 ++	bool ++	select BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ ++config BOARD_LENOVO_T480S ++	bool ++	select BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ ++if BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ ++config MAINBOARD_DIR ++	default "lenovo/sklkbl_thinkpad" ++ ++config VARIANT_DIR ++	default "t480" if BOARD_LENOVO_T480 ++	default "t480s" if BOARD_LENOVO_T480S ++ ++config OVERRIDE_DEVICETREE ++	default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" ++ ++config MAINBOARD_PART_NUMBER ++	default "T480" if BOARD_LENOVO_T480 ++	default "T480s" if BOARD_LENOVO_T480S ++ ++config CBFS_SIZE ++	default 0x900000 ++ ++config DIMM_MAX ++	default 2 ++ ++config DIMM_SPD_SIZE ++	default 512	# DDR4 ++ ++endif +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name +new file mode 100644 +index 0000000000..abc273f387 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name +@@ -0,0 +1,7 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_LENOVO_T480 ++	bool "ThinkPad T480" ++ ++config BOARD_LENOVO_T480S ++	bool "ThinkPad T480s" +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk b/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk +new file mode 100644 +index 0000000000..c308239177 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk +@@ -0,0 +1,73 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++bootblock-y += bootblock.c ec.c ++ ++romstage-y += variants/$(VARIANT_DIR)/memory_init_params.c ++ ++ramstage-y += ramstage.c ec.c ++ramstage-y += variants/$(VARIANT_DIR)/gpio.c variants/$(VARIANT_DIR)/hda_verb.c ++ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += variants/$(VARIANT_DIR)/gma-mainboard.ads ++ ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_0.bin ++spd_0.bin-file := variants/$(VARIANT_DIR)/spd/spd_0.bin ++spd_0.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_1.bin ++spd_1.bin-file := variants/$(VARIANT_DIR)/spd/spd_1.bin ++spd_1.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_2.bin ++spd_2.bin-file := variants/$(VARIANT_DIR)/spd/spd_2.bin ++spd_2.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_3.bin ++spd_3.bin-file := variants/$(VARIANT_DIR)/spd/spd_3.bin ++spd_3.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_4.bin ++spd_4.bin-file := variants/$(VARIANT_DIR)/spd/spd_4.bin ++spd_4.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_5.bin ++spd_5.bin-file := variants/$(VARIANT_DIR)/spd/spd_5.bin ++spd_5.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_6.bin ++spd_6.bin-file := variants/$(VARIANT_DIR)/spd/spd_6.bin ++spd_6.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_7.bin ++spd_7.bin-file := variants/$(VARIANT_DIR)/spd/spd_7.bin ++spd_7.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_8.bin ++spd_8.bin-file := variants/$(VARIANT_DIR)/spd/spd_8.bin ++spd_8.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_9.bin ++spd_9.bin-file := variants/$(VARIANT_DIR)/spd/spd_9.bin ++spd_9.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_10.bin ++spd_10.bin-file := variants/$(VARIANT_DIR)/spd/spd_10.bin ++spd_10.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_11.bin ++spd_11.bin-file := variants/$(VARIANT_DIR)/spd/spd_11.bin ++spd_11.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_12.bin ++spd_12.bin-file := variants/$(VARIANT_DIR)/spd/spd_12.bin ++spd_12.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_13.bin ++spd_13.bin-file := variants/$(VARIANT_DIR)/spd/spd_13.bin ++spd_13.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_14.bin ++spd_14.bin-file := variants/$(VARIANT_DIR)/spd/spd_14.bin ++spd_14.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_15.bin ++spd_15.bin-file := variants/$(VARIANT_DIR)/spd/spd_15.bin ++spd_15.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_16.bin ++spd_16.bin-file := variants/$(VARIANT_DIR)/spd/spd_16.bin ++spd_16.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_17.bin ++spd_17.bin-file := variants/$(VARIANT_DIR)/spd/spd_17.bin ++spd_17.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_18.bin ++spd_18.bin-file := variants/$(VARIANT_DIR)/spd/spd_18.bin ++spd_18.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_19.bin ++spd_19.bin-file := variants/$(VARIANT_DIR)/spd/spd_19.bin ++spd_19.bin-type := raw ++cbfs-files-$(CONFIG_BOARD_LENOVO_T480S) += spd_20.bin ++spd_20.bin-file := variants/$(VARIANT_DIR)/spd/spd_20.bin ++spd_20.bin-type := raw +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl +new file mode 100644 +index 0000000000..3a949a2fca +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl +@@ -0,0 +1,12 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#define BRIGHTNESS_UP \_SB.PCI0.GFX0.INCB ++#define BRIGHTNESS_DOWN \_SB.PCI0.GFX0.DECB ++#define THINKPAD_EC_GPE 22 ++ ++Name(\TCRT, 100) ++Name(\TPSV, 90) ++Name(\FLVL, 0) ++ ++#include <ec/lenovo/h8/acpi/ec.asl> ++#include <ec/lenovo/h8/acpi/thinkpad_bat_thresholds_b0.asl> +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl +new file mode 100644 +index 0000000000..55b1db5b11 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl +@@ -0,0 +1,3 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <drivers/pc80/pc/ps2_controller.asl> +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c b/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c +new file mode 100644 +index 0000000000..fb660dbdfa +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c +@@ -0,0 +1,60 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <arch/io.h> ++#include <bootblock_common.h> ++#include <device/pci.h> ++#include <soc/pci_devs.h> ++#include "ec.h" ++ ++static void configure_uart(uint16_t port, uint16_t iobase, uint8_t irqno) ++{ ++	microchip_pnp_enter_conf_state(port); ++ ++	// Select LPC I/F LDN ++	pnp_write(port, PNP_LDN_SELECT, LDN_LPCIF); ++	// Write UART BAR ++	pnp_write_le32(port, LPCIF_BAR_UART, (uint32_t) iobase << 16 | 0x8707); ++	// Set SIRQ4 to UART ++	pnp_write(port, LPCIF_SIRQ(irqno), LDN_UART); ++ ++	// Configure UART LDN ++	pnp_write(port, PNP_LDN_SELECT, LDN_UART); ++	pnp_write(port, UART_ACTIVATE, 0x01); ++	pnp_write(port, UART_CONFIG_SELECT, 0x00); ++ ++	microchip_pnp_exit_conf_state(port); ++ ++#ifdef CONFIG_BOARD_LENOVO_T480 ++	// Supply debug unlock key ++	debug_write_key(DEBUG_RW_KEY_IDX, debug_rw_key); ++ ++	// Use debug writes to set UART_TX and UART_RX GPIOs ++	debug_write_dword(0xf0c400 + 0x110, 0x00001000); ++	debug_write_dword(0xf0c400 + 0x114, 0x00001000); ++#endif ++} ++ ++ ++#define UART_PORT	0x3f8 ++#define UART_IRQ	4 ++ ++void bootblock_mainboard_early_init(void) ++{ ++	// Tell EC via BIOS Debug Port 1 that the world isn't on fire ++ ++	// Let the EC know that BIOS code is running ++	outb(0x11, 0x86); ++	outb(0x6e, 0x86); ++ ++	// Enable accesses to EC1 interface ++	ec0_write(0, ec0_read(0) | 0x20); ++ ++	// Reset LEDs to power on state ++	// (Without this warm reboot leaves LEDs off) ++	ec0_write(0x0c, 0x80); ++	ec0_write(0x0c, 0x07); ++	ec0_write(0x0c, 0x8a); ++ ++	// Setup debug UART ++	configure_uart(EC_CFG_PORT, UART_PORT, UART_IRQ); ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb b/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb +new file mode 100644 +index 0000000000..c07d4d53ca +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb +@@ -0,0 +1,71 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++chip soc/intel/skylake ++	# IGD Displays ++	register "gfx" = "GMA_STATIC_DISPLAYS(0)" ++ ++	register "panel_cfg" = "{ ++		.up_delay_ms		= 200, ++		.down_delay_ms		=  50, ++		.cycle_delay_ms		= 600, ++		.backlight_on_delay_ms	=   1, ++		.backlight_off_delay_ms	= 200, ++		.backlight_pwm_hz	= 200, ++	}" ++ ++        # Power ++        register "PmConfigSlpS3MinAssert" = "2"         # 50ms ++        register "PmConfigSlpS4MinAssert" = "1"         # 1s ++        register "PmConfigSlpSusMinAssert" = "3"        # 500ms ++        register "PmConfigSlpAMinAssert" = "3"          # 2s ++ ++	device domain 0 on ++		device ref igpu on end ++		device ref sa_thermal on end ++		device ref thermal on end ++		device ref south_xhci on end ++		device ref lpc_espi on ++			register "serirq_mode" = "SERIRQ_CONTINUOUS" ++ ++			register "gen1_dec" = "0x007c1601" ++			register "gen2_dec" = "0x000c15e1" ++ ++			chip ec/lenovo/pmh7 ++				register "backlight_enable" = "true" ++				register "dock_event_enable" = "true" ++				device pnp ff.1 on end # dummy ++			end ++ ++			chip ec/lenovo/h8 ++				register "beepmask0" = "0x00" ++				register "beepmask1" = "0x86" ++				register "config0" = "0xa6" ++				register "config1" = "0x0d" ++				register "config2" = "0xa8" ++				register "config3" = "0xc4" ++				register "has_keyboard_backlight" = "1" ++				register "event2_enable" = "0xff" ++				register "event3_enable" = "0xff" ++				register "event4_enable" = "0xd0" ++				register "event5_enable" = "0x3c" ++				register "event7_enable" = "0x01" ++				register "event8_enable" = "0x7b" ++				register "event9_enable" = "0xff" ++				register "eventc_enable" = "0xff" ++				register "eventd_enable" = "0xff" ++				register "evente_enable" = "0x9d" ++				device pnp ff.2 on # dummy ++					io 0x60 = 0x62 ++					io 0x62 = 0x66 ++					io 0x64 = 0x1600 ++					io 0x66 = 0x1604 ++				end ++			end ++ ++			chip drivers/pc80/tpm ++				device pnp 0c31.0 on end ++			end ++		end ++		device ref hda on end ++	end ++end +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl b/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl +new file mode 100644 +index 0000000000..aa4d4de2a6 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl +@@ -0,0 +1,33 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <acpi/acpi.h> ++DefinitionBlock( ++	"dsdt.aml", ++	"DSDT", ++	ACPI_DSDT_REV_2, ++	OEM_ID, ++	ACPI_TABLE_CREATOR, ++	0x20110725 ++) ++{ ++	#include <acpi/dsdt_top.asl> ++	#include <soc/intel/common/block/acpi/acpi/globalnvs.asl> ++	#include <cpu/intel/common/acpi/cpu.asl> ++ ++	Device (\_SB.PCI0) ++	{ ++		#include <soc/intel/skylake/acpi/systemagent.asl> ++		#include <soc/intel/skylake/acpi/pch.asl> ++		#include <drivers/intel/gma/acpi/default_brightness_levels.asl> ++	} ++ ++	Scope (\_SB.PCI0.RP01) ++	{ ++		Device (PEGP) ++		{ ++			Name (_ADR, Zero) ++		} ++	} ++ ++	#include <southbridge/intel/common/acpi/sleepstates.asl> ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/ec.c b/src/mainboard/lenovo/sklkbl_thinkpad/ec.c +new file mode 100644 +index 0000000000..adb6a60324 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/ec.c +@@ -0,0 +1,153 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <arch/io.h> ++#include "ec.h" ++ ++#define MICROCHIP_CONFIGURATION_ENTRY_KEY	0x55 ++#define MICROCHIP_CONFIGURATION_EXIT_KEY	0xaa ++ ++void microchip_pnp_enter_conf_state(uint16_t port) ++{ ++	outb(MICROCHIP_CONFIGURATION_ENTRY_KEY, port); ++} ++ ++void microchip_pnp_exit_conf_state(uint16_t port) ++{ ++	outb(MICROCHIP_CONFIGURATION_EXIT_KEY, port); ++} ++ ++uint8_t pnp_read(uint16_t port, uint8_t index) ++{ ++	outb(index, port); ++	return inb(port + 1); ++} ++ ++uint32_t pnp_read_le32(uint16_t port, uint8_t index) ++{ ++	return (uint32_t) pnp_read(port, index) | ++			(uint32_t) pnp_read(port, index + 1) << 8 | ++			(uint32_t) pnp_read(port, index + 2) << 16 | ++			(uint32_t) pnp_read(port, index + 3) << 24; ++} ++ ++void pnp_write(uint16_t port, uint8_t index, uint8_t value) ++{ ++	outb(index, port); ++	outb(value, port + 1); ++} ++ ++void pnp_write_le32(uint16_t port, uint8_t index, uint32_t value) ++{ ++	pnp_write(port, index, value & 0xff); ++	pnp_write(port, index + 1, value >> 8 & 0xff); ++	pnp_write(port, index + 2, value >> 16 & 0xff); ++	pnp_write(port, index + 3, value >> 24 & 0xff); ++} ++ ++static void ecN_clear_out_queue(uint16_t cmd_port, uint16_t data_port) ++{ ++	while (inb(cmd_port) & EC_OBF) ++		inb(data_port); ++} ++ ++static void ecN_wait_to_send(uint16_t cmd_port, uint16_t data_port) ++{ ++	while (inb(cmd_port) & EC_IBF) ++		; ++} ++ ++static void ecN_wait_to_recv(uint16_t cmd_port, uint16_t data_port) ++{ ++	while (!(inb(cmd_port) & EC_OBF)) ++		; ++} ++ ++uint8_t ecN_read(uint16_t cmd_port, uint16_t data_port, uint8_t addr) ++{ ++	ecN_clear_out_queue(cmd_port, data_port); ++	ecN_wait_to_send(cmd_port, data_port); ++	outb(EC_READ, cmd_port); ++	ecN_wait_to_send(cmd_port, data_port); ++	outb(addr, data_port); ++	ecN_wait_to_recv(cmd_port, data_port); ++	return inb(data_port); ++} ++ ++void ecN_write(uint16_t cmd_port, uint16_t data_port, uint8_t addr, uint8_t val) ++{ ++	ecN_clear_out_queue(cmd_port, data_port); ++	ecN_wait_to_send(cmd_port, data_port); ++	outb(EC_WRITE, cmd_port); ++	ecN_wait_to_send(cmd_port, data_port); ++	outb(addr, data_port); ++	ecN_wait_to_send(cmd_port, data_port); ++	outb(val, data_port); ++} ++ ++uint8_t eeprom_read(uint16_t addr) ++{ ++	ecN_clear_out_queue(EC2_CMD, EC2_DATA); ++	ecN_wait_to_send(EC2_CMD, EC2_DATA); ++	outl(1, EC2_CMD); ++	ecN_wait_to_send(EC2_CMD, EC2_DATA); ++	outl(addr, EC2_DATA); ++	ecN_wait_to_recv(EC2_CMD, EC2_DATA); ++	return inl(EC2_DATA); ++} ++ ++void eeprom_write(uint16_t addr, uint8_t val) ++{ ++	ecN_clear_out_queue(EC2_CMD, EC2_DATA); ++	ecN_wait_to_send(EC2_CMD, EC2_DATA); ++	outl(2, EC2_CMD); ++	ecN_wait_to_send(EC2_CMD, EC2_DATA); ++	outl((uint32_t) addr | (uint32_t) val << 16, EC2_DATA); ++	ecN_wait_to_recv(EC2_CMD, EC2_DATA); ++	inl(EC2_DATA); ++} ++ ++uint16_t debug_loaded_keys(void) ++{ ++	return (uint16_t) ec0_read(0x87) << 8 | (uint16_t) ec0_read(0x86); ++} ++ ++static void debug_cmd(uint8_t cmd) ++{ ++	ec0_write(EC_DEBUG_CMD, cmd); ++	while (ec0_read(EC_DEBUG_CMD) & 0x80) ++		; ++} ++ ++void debug_read_key(uint8_t i, uint8_t *key) ++{ ++	debug_cmd(0x80 | (i & 0xf)); ++	for (int j = 0; j < 8; ++j) ++		key[j] = ec0_read(0x3e + j); ++} ++ ++void debug_write_key(uint8_t i, const uint8_t *key) ++{ ++	for (int j = 0; j < 8; ++j) ++		ec0_write(0x3e + j, key[j]); ++	debug_cmd(0xc0 |  (i & 0xf)); ++} ++ ++uint32_t debug_read_dword(uint32_t addr) ++{ ++	ecN_clear_out_queue(EC3_CMD, EC3_DATA); ++	ecN_wait_to_send(EC3_CMD, EC3_DATA); ++	outl(addr << 8 | 0xE2, EC3_DATA); ++	ecN_wait_to_recv(EC3_CMD, EC3_DATA); ++	return inl(EC3_DATA); ++} ++ ++void debug_write_dword(uint32_t addr, uint32_t val) ++{ ++	ecN_clear_out_queue(EC3_CMD, EC3_DATA); ++	ecN_wait_to_send(EC3_CMD, EC3_DATA); ++	outl(addr << 8 | 0xEA, EC3_DATA); ++	ecN_wait_to_send(EC3_CMD, EC3_DATA); ++	outl(val, EC3_DATA); ++} ++ ++const uint8_t debug_rw_key[8] = { 0x7a, 0x41, 0xb1, 0x49, 0xfe, 0x21, 0x01, 0xcf }; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/ec.h b/src/mainboard/lenovo/sklkbl_thinkpad/ec.h +new file mode 100644 +index 0000000000..d2963c8962 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/ec.h +@@ -0,0 +1,99 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#ifndef SKLKBL_THINKPAD_EC_H ++#define SKLKBL_THINKPAD_EC_H ++ ++// EC configuration base address ++#define EC_CFG_PORT		0x4e ++ ++// Chip global registers ++#define PNP_LDN_SELECT		0x07 ++# define LDN_UART		0x07 ++# define LDN_LPCIF		0x0c ++#define EC_DEVICE_ID		0x20 ++#define EC_DEVICE_REV		0x21 ++ ++// LPC I/F registers ++#define LPCIF_SIRQ(i)		(0x40 + (i)) ++ ++#define LPCIF_BAR_CFG		0x60 ++#define LPCIF_BAR_MAILBOX	0x64 ++#define LPCIF_BAR_8042		0x68 ++#define LPCIF_BAR_ACPI_EC0	0x6c ++#define LPCIF_BAR_ACPI_EC1	0x70 ++#define LPCIF_BAR_ACPI_EC2	0x74 ++#define LPCIF_BAR_ACPI_EC3	0x78 ++#define LPCIF_BAR_ACPI_PM0	0x7c ++#define LPCIF_BAR_UART		0x80 ++#define LPCIF_BAR_FAST_KYBD	0x84 ++#define LPCIF_BAR_EMBED_FLASH	0x88 ++#define LPCIF_BAR_GP_SPI	0x8c ++#define LPCIF_BAR_EMI		0x90 ++#define LPCIF_BAR_PMH7		0x94 ++#define LPCIF_BAR_PORT80_DBG0	0x98 ++#define LPCIF_BAR_PORT80_DBG1	0x9c ++#define LPCIF_BAR_RTC		0xa0 ++ ++// UART registers ++#define UART_ACTIVATE		0x30 ++#define UART_CONFIG_SELECT	0xf0 ++ ++void microchip_pnp_enter_conf_state(uint16_t port); ++void microchip_pnp_exit_conf_state(uint16_t port); ++uint8_t pnp_read(uint16_t port, uint8_t index); ++uint32_t pnp_read_le32(uint16_t port, uint8_t index); ++void pnp_write(uint16_t port, uint8_t index, uint8_t value); ++void pnp_write_le32(uint16_t port, uint8_t index, uint32_t value); ++ ++#define EC0_CMD		0x0066 ++#define EC0_DATA	0x0062 ++#define EC1_CMD		0x1604 ++#define EC1_DATA	0x1600 ++#define EC2_CMD		0x1634 ++#define EC2_DATA	0x1630 ++#define EC3_CMD		0x161c ++#define EC3_DATA	0x1618 ++ ++#define EC_OBF		(1 << 0) ++#define EC_IBF		(1 << 1) ++ ++#define EC_READ		0x80 ++#define EC_WRITE	0x81 ++ ++uint8_t ecN_read(uint16_t cmd_port, uint16_t data_port, uint8_t addr); ++ ++void ecN_write(uint16_t cmd_port, uint16_t data_port, uint8_t addr, uint8_t val); ++ ++// EC0 and EC1 mostly are useful with the READ/WRITE commands ++#define ec0_read(addr) ecN_read(EC0_CMD, EC0_DATA, addr) ++#define ec0_write(addr, val) ecN_write(EC0_CMD, EC0_DATA, addr, val) ++#define ec1_read(addr) ecN_read(EC1_CMD, EC1_DATA, addr) ++#define ec1_write(addr, val) ecN_write(EC1_CMD, EC1_DATA, addr, val) ++ ++// Read from the emulated EEPROM ++uint8_t eeprom_read(uint16_t addr); ++ ++// Write to the emulated EEPROM ++void eeprom_write(uint16_t addr, uint8_t val); ++ ++// Read loaded debug key mask ++uint16_t debug_loaded_keys(void); ++ ++// The following location (via either EC0 or EC1) can be used to interact with the debug interface ++#define EC_DEBUG_CMD 0x3d ++ ++void debug_read_key(uint8_t i, uint8_t *key); ++ ++void debug_write_key(uint8_t i, const uint8_t *key); ++ ++uint32_t debug_read_dword(uint32_t addr); ++ ++void debug_write_dword(uint32_t addr, uint32_t val); ++ ++// RW unlock key index ++#define DEBUG_RW_KEY_IDX 1 ++ ++// RW unlock key for EC version N24HT37W ++extern const uint8_t debug_rw_key[8]; ++ ++#endif +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h b/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h +new file mode 100644 +index 0000000000..d89ed712d4 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h +@@ -0,0 +1,8 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#ifndef GPIO_H ++#define GPIO_H ++ ++void variant_config_gpios(void); ++ ++#endif +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c b/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c +new file mode 100644 +index 0000000000..44c8578852 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c +@@ -0,0 +1,105 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <arch/io.h> ++#include <device/device.h> ++#include <drivers/intel/gma/int15.h> ++#include <option.h> ++#include <soc/ramstage.h> ++#include "ec.h" ++#include "gpio.h" ++ ++#define GPIO_GPU_RST		GPP_E22 // active low ++#define GPIO_1R8VIDEO_AON_ON	GPP_E23 ++ ++#define GPIO_DGFX_PWRGD		GPP_F3 ++ ++#define GPIO_DISCRETE_PRESENCE	GPP_D9	// active low ++#define GPIO_DGFX_VRAM_ID0	GPP_D11 ++#define GPIO_DGFX_VRAM_ID1	GPP_D12 ++ ++void mainboard_silicon_init_params(FSP_SIL_UPD *params) ++{ ++	static const char * const dgfx_vram_id_str[] = { "1GB", "2GB", "4GB", "N/A" }; ++ ++	int dgfx_vram_id; ++ ++	// Setup GPIOs ++	variant_config_gpios(); ++ ++	// Detect and enable dGPU ++	if (gpio_get(GPIO_DISCRETE_PRESENCE) == 0) { // active low ++		dgfx_vram_id = gpio_get(GPIO_DGFX_VRAM_ID0) | gpio_get(GPIO_DGFX_VRAM_ID1) << 1; ++		printk(BIOS_DEBUG, "Discrete GPU present with %s VRAM\n", dgfx_vram_id_str[dgfx_vram_id]); ++ ++		// NOTE: i pulled this GPU enable sequence from thin air ++		// it sometimes works but is buggy and the GPU disappears in some cases so disabling it by default. ++		// also unrelated to this enable sequence the nouveau driver only works on 6.8-6.9 kernels ++		if (get_uint_option("dgpu_enable", 0)) { ++			printk(BIOS_DEBUG, "Enabling discrete GPU\n"); ++			gpio_set(GPIO_1R8VIDEO_AON_ON, 1);	// Enable GPU power rail ++			while (!gpio_get(GPIO_DGFX_PWRGD))	// Wait for power good signal from GPU ++				; ++			gpio_set(GPIO_GPU_RST, 1);		// Release GPU from reset ++		} else { ++			printk(BIOS_DEBUG, "Discrete GPU will remain disabled\n"); ++		} ++ ++	} else { ++		printk(BIOS_DEBUG, "Discrete GPU not present\n"); ++	} ++} ++ ++static void dump_ec_cfg(uint16_t port) ++{ ++	microchip_pnp_enter_conf_state(port); ++ ++	// Device info ++	printk(BIOS_DEBUG, "Device id  %02x\n", pnp_read(port, EC_DEVICE_ID)); ++	printk(BIOS_DEBUG, "Device rev %02x\n", pnp_read(port, EC_DEVICE_REV)); ++ ++	// Switch to LPCIF LDN ++	pnp_write(port, PNP_LDN_SELECT, LDN_LPCIF); ++ ++	// Dump SIRQs ++	for (int i = 0; i <= 15; i += 1) ++		printk(BIOS_DEBUG, "SIRQ%d = %02x\n", i, pnp_read(port, LPCIF_SIRQ(i))); ++ ++	// Dump BARs ++	printk(BIOS_DEBUG, "BAR CFG = %08x\n", pnp_read_le32(port, LPCIF_BAR_CFG)); ++	printk(BIOS_DEBUG, "BAR MAILBOX = %08x\n", pnp_read_le32(port, LPCIF_BAR_MAILBOX)); ++	printk(BIOS_DEBUG, "BAR 8042 = %08x\n", pnp_read_le32(port, LPCIF_BAR_8042)); ++	printk(BIOS_DEBUG, "BAR ACPI_EC0 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC0)); ++	printk(BIOS_DEBUG, "BAR ACPI_EC1 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC1)); ++	printk(BIOS_DEBUG, "BAR ACPI_EC2 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC2)); ++	printk(BIOS_DEBUG, "BAR ACPI_EC3 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_EC3)); ++	printk(BIOS_DEBUG, "BAR ACPI_PM0 = %08x\n", pnp_read_le32(port, LPCIF_BAR_ACPI_PM0)); ++	printk(BIOS_DEBUG, "BAR UART = %08x\n", pnp_read_le32(port, LPCIF_BAR_UART)); ++	printk(BIOS_DEBUG, "BAR FAST_KYBD = %08x\n", pnp_read_le32(port, LPCIF_BAR_FAST_KYBD)); ++	printk(BIOS_DEBUG, "BAR EMBED_FLASH = %08x\n", pnp_read_le32(port, LPCIF_BAR_EMBED_FLASH)); ++	printk(BIOS_DEBUG, "BAR GP_SPI = %08x\n", pnp_read_le32(port, LPCIF_BAR_GP_SPI)); ++	printk(BIOS_DEBUG, "BAR EMI = %08x\n", pnp_read_le32(port, LPCIF_BAR_EMI)); ++	printk(BIOS_DEBUG, "BAR PMH7 = %08x\n", pnp_read_le32(port, LPCIF_BAR_PMH7)); ++	printk(BIOS_DEBUG, "BAR PORT80_DBG0 = %08x\n", pnp_read_le32(port, LPCIF_BAR_PORT80_DBG0)); ++	printk(BIOS_DEBUG, "BAR PORT80_DBG1 = %08x\n", pnp_read_le32(port, LPCIF_BAR_PORT80_DBG1)); ++	printk(BIOS_DEBUG, "BAR RTC = %08x\n", pnp_read_le32(port, LPCIF_BAR_RTC)); ++ ++	microchip_pnp_exit_conf_state(port); ++} ++ ++static void mainboard_enable(struct device *dev) ++{ ++	if (CONFIG(VGA_ROM_RUN)) ++		install_intel_vga_int15_handler(GMA_INT15_ACTIVE_LFP_EDP, ++						GMA_INT15_PANEL_FIT_DEFAULT, ++						GMA_INT15_BOOT_DISPLAY_DEFAULT, 0); ++} ++ ++static void mainboard_init(void *chip_info) ++{ ++	dump_ec_cfg(EC_CFG_PORT); ++} ++ ++struct chip_operations mainboard_ops = { ++	.enable_dev = mainboard_enable, ++	.init = mainboard_init, ++}; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..4db4202961d0be67b75f52b28f2111d5655595c3 +GIT binary patch +literal 4106 +zcmeHJU2GIp6h5=FKeKmc=rAo()>4l^U|XP_ZDGYy!|YE>mu}hZ4|PdQy1<TF-O}0? +zDF)LeX(GlTYoZ2xkUp4bc(Fbi;|s>bV0gipVB&+pHzmFpc`=IXxii}qiqH*)7}PU+ +z?woV)x!<09?wNbfhQa6n_IK}3M!Gw&OgS)sY2Q$LJ4F+z{-JneATkt9refXr6+8sr +zR{e1eASVcGl#mf_O&p%I^1;3af=xDeN0ZnydT=;zHOH-q=O;(UFda)^<j^52Z;c<A +zv~t)#xI2OzS7p&7!}%QUJu-688gD}mM%EbG*3`NU(Fiq%!p$v4=y8%;+qQ?>LXW8| +z-Vsanq!Y==Kq9plQ+*gu^hf&pJ9?tY{h01cbtR&SfsVM!_*!D4W5>papLuo?gRur| +zF$`lX;f2t48Dpd4V@(*z=dq95OkkfiVU53N<(gE+=U)KHEdU4}@R=aMjTTTOcb8-a +zC9IXSxZB*|#u~SlHnpsY25L#Sxy6ljl16gI)H0f>for?qaszCX;ESpG=pqROFWR~Z +zTqQzcH(berra`9K(R~0OJ_eeA<Ovbd&vdN3&y}qtJ`q3y6wpP2V}*{Dbi8b357>=> +z&R-)LYP^U3@%6h}+0)7m-mEOhOM92<j^WbYrTU_kNXz~GCDNT`I|IC3AsFzURKM6k +zQdYbOof5*Zq``6G)5LxcgKFZn#G8mi#5;*Qh*QM-i4PHv5FaHzLHru=Tg2yx{aFHb +z(R2S=c8RBfL#5J#E-BTphw@OA+GpyZ;G1*r11OzSMVJD%l2Wuxx^l~w*1QYefHUN4 +zpSM~1{wGHQJOdv7$#vPs;Ii+!aI*SVDadZ``zyQq-N$35E%P{WT}(AcpKmkH*)gyF +z|NhTLpsow9_zOk6x>l32>zpvu-&@ZkPf<>~Bsv&Oy1O(`pbLUf3vt*0HIRk0U3EzI +zIeSaIE9*jps%6qP7$EQo8=K#f^K_mFpy5prkNNSOU;oI@KK0}Ge*G6eyWz+6OyADf +zE`}D<k1}?G;rmSggt5;V{>b#-81u-uS=OJB*=`v}WPMs@ugdtLtbZo6OEUf}>!QL` +z1zQ!pLt!Zek0|;p3VTDrj}`q(g?+8yuZk|KY?X>TRlP@LPpbH`s-ITbSygS+Jq6cQ +zp|Em=T_#B53Y|R}mtw!K3mUyWRhytxx_wi^(}HurDkx@L%OlKIA%rq@7%bE{p{Wl~ +zJJ%lV6&>fxBjnbA8G(&P?a8o%P#c~Wo$7|%1UE-$r;6jwt1uejOfMLwF-BDgC-Q+N +za!Hx;1S&$9!rlNCTsI*IMZ0#Y5aEO7sjIz#jb`S|q7OpRYx`h&=PK}_YnN#poNF=7 +z3yTO|pc0N&G3cozl21Q6c)l0vjm~0uFL)%2_T5RYR1$~dO~u)4px!jFycZNnchPVA +z!0+Vc_afL{m>rv2PY8{Cma`W{yG~JNJu?;L!#fSLmwRW{8R@gD7Z5~{xvZGpN)U`j +z^I~=;XVmtVzgSv@Na@HC?lC8A1l2+CU<IqV7J%6_t~L}S#%I}a5R3FZk`D#n4m*-O +z$?u%iuC_w$3p=)&nXQX^AwrdnK*hRu`Mqc`AzOgztfsBxvm77j5G7KQo#~<Ufx}jQ +z?|~8PU!d?s-JLd{0Ph}c6J*Zsxd^=dPINEGPS4+NOQoUG&E#4_TUNoTPI5CrmHR%r +VymGKbcpH8Yo8|ycF3<xZ{s}94r0@U$ + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads +new file mode 100644 +index 0000000000..fcfbd75a92 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads +@@ -0,0 +1,19 @@ ++-- SPDX-License-Identifier: GPL-2.0-or-later ++ ++with HW.GFX.GMA; ++with HW.GFX.GMA.Display_Probing; ++ ++use HW.GFX.GMA; ++use HW.GFX.GMA.Display_Probing; ++ ++private package GMA.Mainboard is ++ ++   ports : constant Port_List := ++     (eDP, ++      DP1, ++      DP2, ++      HDMI1, ++      HDMI2, ++      others => Disabled); ++ ++end GMA.Mainboard; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c +new file mode 100644 +index 0000000000..f7c29e1f39 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c +@@ -0,0 +1,203 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <soc/gpio.h> ++#include "../../gpio.h" ++ ++/* FIXME: There are multiple GPIOs here that should be locked to prevent "TPM GPIO fail" style ++ * attacks. Unfortunately SKL/KBL GPIO locking *does not* work currently. */ ++ ++static const struct pad_config gpio_table[] = { ++ ++	/* ------- GPIO Community 0 ------- */ ++ ++	/* ------- GPIO Group GPP_A ------- */ ++	PAD_CFG_NF(GPP_A0, NONE, DEEP, NF1),				/* -KBRC */ ++	PAD_CFG_NF(GPP_A1, NATIVE, DEEP, NF1),				/* LPC_AD0 */ ++	PAD_CFG_NF(GPP_A2, NATIVE, DEEP, NF1),				/* LPC_AD1 */ ++	PAD_CFG_NF(GPP_A3, NATIVE, DEEP, NF1),				/* LPC_AD2 */ ++	PAD_CFG_NF(GPP_A4, NATIVE, DEEP, NF1),				/* LPC_AD3 */ ++	PAD_CFG_NF(GPP_A5, NONE, DEEP, NF1),				/* -LPC_FRAME */ ++	PAD_CFG_NF(GPP_A6, NONE, DEEP, NF1),				/* IRQSER */ ++	PAD_CFG_NF(GPP_A7, NONE, DEEP, NF1),				/* -TPM_IRQ */ ++	PAD_CFG_NF(GPP_A8, NONE, DEEP, NF1),				/* -CLKRUN */ ++	PAD_CFG_NF(GPP_A9, NATIVE, DEEP, NF1),				/* LPCCLK_EC_24M */ ++	PAD_CFG_NF(GPP_A10, NATIVE, DEEP, NF1),				/* LPCCLK_DEBUG_24M */ ++	PAD_NC(GPP_A11, NONE), ++	PAD_NC(GPP_A12, NONE), ++	PAD_CFG_NF(GPP_A13, NATIVE, DEEP, NF1),				/* -SUSWARN */ ++	PAD_CFG_NF(GPP_A14, NATIVE, DEEP, NF1),				/* -SUS_STAT */ ++	PAD_CFG_NF(GPP_A15, NATIVE, DEEP, NF1),				/* -SUSWARN */ ++	PAD_NC(GPP_A16, NONE), ++	PAD_NC(GPP_A17, NONE), ++	PAD_NC(GPP_A18, NONE), ++	PAD_NC(GPP_A19, NONE), ++	PAD_NC(GPP_A20, NONE), ++	PAD_NC(GPP_A21, NONE), ++	PAD_NC(GPP_A22, NONE), ++	PAD_NC(GPP_A23, NONE), ++ ++	/* ------- GPIO Group GPP_B ------- */ ++	PAD_NC(GPP_B0, NONE), ++	PAD_NC(GPP_B1, NONE), ++	PAD_NC(GPP_B2, NONE), ++	PAD_NC(GPP_B3, NONE), ++	PAD_CFG_GPI_SCI(GPP_B4, NONE, DEEP, EDGE_SINGLE, INVERT),	/* -TBT_PLUG_EVENT */ ++	PAD_CFG_NF(GPP_B5, NONE, DEEP, NF1),				/* -CLKREQ_PCIE0 */ ++	PAD_CFG_NF(GPP_B6, NONE, DEEP, NF1),				/* -CLKREQ_PCIE4 */ ++	PAD_CFG_NF(GPP_B7, NONE, DEEP, NF1),				/* -CLKREQ_PCIE5 */ ++	PAD_CFG_NF(GPP_B8, NONE, DEEP, NF1),				/* -CLKREQ_PCIE6 */ ++	PAD_CFG_NF(GPP_B9, NONE, DEEP, NF1),				/* -CLKREQ_PCIE8 */ ++	PAD_CFG_NF(GPP_B10, NONE, DEEP, NF1),				/* -CLKREQ_PCIE10 */ ++	PAD_NC(GPP_B11, NONE), ++	PAD_CFG_NF(GPP_B12, NONE, DEEP, NF1),				/* -PCH_SLP_S0 */ ++	PAD_CFG_NF(GPP_B13, NONE, DEEP, NF1),				/* -PLTRST */ ++	PAD_CFG_NF(GPP_B14, NATIVE, DEEP, NF1),				/* PCH_SPKR */ ++	PAD_CFG_GPO(GPP_B15, 1, DEEP),					/* NFC_DLREQ */ ++	PAD_NC(GPP_B16, NONE), ++	PAD_NC(GPP_B17, NONE), ++	PAD_NC(GPP_B18, NONE), ++	PAD_NC(GPP_B19, NONE), ++	PAD_NC(GPP_B20, NONE), ++	PAD_NC(GPP_B21, NONE), ++	PAD_NC(GPP_B22, NONE), ++	PAD_NC(GPP_B23, NONE), ++ ++	/* ------- GPIO Community 1 ------- */ ++ ++	/* ------- GPIO Group GPP_C ------- */ ++	PAD_CFG_NF(GPP_C0, NONE, DEEP, NF1),				/* SMB_CLK */ ++	PAD_CFG_NF(GPP_C1, NONE, DEEP, NF1),				/* SMB_DATA */ ++	PAD_NC(GPP_C2, NONE), ++	PAD_CFG_NF(GPP_C3, NONE, DEEP, NF1),				/* SML0_CLK */ ++	PAD_CFG_NF(GPP_C4, NONE, DEEP, NF1),				/* SML0_DATA */ ++	PAD_NC(GPP_C5, NONE), ++	PAD_CFG_NF(GPP_C6, NONE, DEEP, NF1),				/* EC_SCL2 */ ++	PAD_CFG_NF(GPP_C7, NONE, DEEP, NF1),				/* EC_SDA2 */ ++	PAD_NC(GPP_C8, NONE), ++	PAD_NC(GPP_C9, NONE), ++	PAD_NC(GPP_C10, NONE), ++	PAD_NC(GPP_C11, NONE), ++	PAD_NC(GPP_C12, NONE), ++	PAD_NC(GPP_C13, NONE), ++	PAD_NC(GPP_C14, NONE), ++	PAD_NC(GPP_C15, NONE), ++	PAD_CFG_NF(GPP_C16, NONE, DEEP, NF1),				/* I2C0_DATA */ ++	PAD_CFG_NF(GPP_C17, NONE, DEEP, NF1),				/* I2C0_CLK */ ++	PAD_NC(GPP_C18, NONE), ++	PAD_NC(GPP_C19, NONE), ++	PAD_CFG_GPO(GPP_C20, 0, DEEP),					/* EPRIVACY_ON */ ++	PAD_CFG_GPO(GPP_C21, 0, DEEP),					/* TBT_FORCE_PWR */ ++	PAD_CFG_GPI_SCI(GPP_C22, NONE, DEEP, EDGE_SINGLE, INVERT),	/* -EC_SCI */ ++	PAD_CFG_GPI_SCI(GPP_C23, NONE, DEEP, EDGE_SINGLE, INVERT),	/* -EC_WAKE */ ++ ++	/* ------- GPIO Group GPP_D ------- */ ++	PAD_NC(GPP_D0, NONE), ++	PAD_NC(GPP_D1, NONE), ++	PAD_NC(GPP_D2, NONE), ++	PAD_NC(GPP_D3, NONE), ++	PAD_NC(GPP_D4, NONE), ++	PAD_NC(GPP_D5, NONE), ++	PAD_NC(GPP_D6, NONE), ++	PAD_NC(GPP_D7, NONE), ++	PAD_NC(GPP_D8, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_D9, UP_20K, DEEP, OFF, ACPI),		/* -DISCRETE_PRESENCE */ ++	PAD_NC(GPP_D10, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_D11, UP_20K, DEEP, OFF, ACPI),		/* DGFX_VRAM_ID0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_D12, UP_20K, DEEP, OFF, ACPI),		/* DGFX_VRAM_ID1 */ ++	PAD_NC(GPP_D13, NONE), ++	PAD_NC(GPP_D14, NONE), ++	PAD_NC(GPP_D15, NONE), ++	PAD_NC(GPP_D16, NONE), ++	PAD_CFG_GPO(GPP_D17, 0, DEEP),					/* DDI_PRIORITY1 */ ++	PAD_NC(GPP_D18, NONE), ++	PAD_NC(GPP_D19, NONE), ++	PAD_NC(GPP_D20, NONE), ++	PAD_NC(GPP_D21, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_D22, UP_20K, DEEP, OFF, ACPI),		/* -NFC_DTCT */ ++	PAD_NC(GPP_D23, NONE), ++ ++	/* ------- GPIO Group GPP_E ------- */ ++	PAD_NC(GPP_E0, NONE), ++	PAD_CFG_NF(GPP_E1, NONE, DEEP, NF1),				/* -WWAN_SATA_DTCT (always HIGH) */ ++	PAD_CFG_NF(GPP_E2, NONE, DEEP, NF1),				/* -PE_DTCT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_E3, NONE, DEEP, EDGE_SINGLE, ACPI),	/* -TBT_PLUG_EVENT */ ++	PAD_CFG_GPO(GPP_E4, 1, DEEP),					/* NFC_ON */ ++	PAD_NC(GPP_E5, NONE), ++	PAD_CFG_NF(GPP_E6, NONE, RSMRST, NF1),				/* SATA2_DEVSLP */ ++	PAD_NC(GPP_E7, NONE), ++	PAD_NC(GPP_E8, NONE), ++	PAD_CFG_NF(GPP_E9, NONE, DEEP, NF1),				/* -USB_PORT0_OC0 (AON port) */ ++	PAD_CFG_NF(GPP_E10, NONE, DEEP, NF1),				/* -USB_PORT1_OC1 (regular port) */ ++	PAD_NC(GPP_E11, NONE), ++	PAD_CFG_GPI_APIC_HIGH(GPP_E12, NONE, DEEP),			/* NFC_INT */ ++	PAD_CFG_NF(GPP_E13, NONE, DEEP, NF1),				/* DDIP1_HPD */ ++	PAD_CFG_NF(GPP_E14, NONE, DEEP, NF1),				/* DDIP2_HPD */ ++	PAD_NC(GPP_E15, NONE), ++	PAD_NC(GPP_E16, NONE), ++	PAD_CFG_NF(GPP_E17, NONE, DEEP, NF1),				/* EDP_HPD */ ++	PAD_NC(GPP_E18, NONE), ++	PAD_NC(GPP_E19, NONE), ++	PAD_CFG_NF(GPP_E20, NONE, DEEP, NF1),				/* DDIP2_CTRLCLK */ ++	PAD_CFG_NF(GPP_E21, NONE, DEEP, NF1),				/* DDIP2_CTRLDATA */ ++	PAD_CFG_TERM_GPO(GPP_E22, 0, UP_20K, RSMRST),			/* -GPU_RST */ ++	PAD_CFG_TERM_GPO(GPP_E23, 0, UP_20K, RSMRST),			/* 1R8VIDEO_AON_ON */ ++ ++	/* ------- GPIO Community 2 ------- */ ++ ++	/* -------- GPIO Group GPD -------- */ ++	PAD_CFG_NF(GPD0, NONE, PWROK, NF1),				/* -BATLOW */ ++	PAD_CFG_NF(GPD1, NATIVE, PWROK, NF1),				/* AC_PRESENT */ ++	PAD_CFG_NF(GPD2, NATIVE, PWROK, NF1),				/* -LANWAKE */ ++	PAD_CFG_NF(GPD3, UP_20K, PWROK, NF1),				/* -PWRSW_EC */ ++	PAD_CFG_NF(GPD4, NONE, PWROK, NF1),				/* -PCH_SLP_S3 */ ++	PAD_CFG_NF(GPD5, NONE, PWROK, NF1),				/* -PCH_SLP_S4 */ ++	PAD_CFG_NF(GPD6, NONE, PWROK, NF1),				/* -PCH_SLP_M */ ++	PAD_NC(GPD7, NONE), ++	PAD_CFG_NF(GPD8, NONE, PWROK, NF1),				/* SUSCLK_32K */ ++	PAD_CFG_NF(GPD9, NONE, PWROK, NF1),				/* -PCH_SLP_WLAN */ ++	PAD_CFG_NF(GPD10, NONE, PWROK, NF1),				/* -PCH_SLP_S5 */ ++	PAD_CFG_NF(GPD11, NONE, PWROK, NF1),				/* LANPHYPC */ ++ ++	/* ------- GPIO Community 3 ------- */ ++ ++	/* ------- GPIO Group GPP_F ------- */ ++	PAD_NC(GPP_F0, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_F1, NONE, DEEP, OFF, ACPI),		/* GC6_FB_EN */ ++	PAD_CFG_GPO(GPP_F2, 1, DEEP),					/* -GPU_EVENT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F3, NONE, DEEP, OFF, ACPI),		/* DGFX_PWRGD */ ++	PAD_CFG_GPO(GPP_F4, 1, DEEP),					/* -WWAN_RESET */ ++	PAD_NC(GPP_F5, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_F6, UP_20K, DEEP, OFF, ACPI),		/* -MIC_HW_EN (R961 to GND) */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F7, UP_20K, DEEP, OFF, ACPI),		/* -INT_MIC_DTCT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F8, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F9, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG1 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F10, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG2 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F11, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG3 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F12, UP_20K, DEEP, OFF, ACPI),		/* PLANARID0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F13, UP_20K, DEEP, OFF, ACPI),		/* PLANARID1 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F14, UP_20K, DEEP, OFF, ACPI),		/* PLANARID2 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F15, UP_20K, DEEP, OFF, ACPI),		/* PLANARID3 */ ++	PAD_NC(GPP_F16, NONE), ++	PAD_NC(GPP_F17, NONE), ++	PAD_NC(GPP_F18, NONE), ++	PAD_NC(GPP_F19, NONE), ++	PAD_NC(GPP_F20, NONE), ++	PAD_NC(GPP_F21, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_F22, UP_20K, DEEP, OFF, ACPI),		/* -INTRUDER_PCH */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F23, UP_20K, DEEP, OFF, ACPI),		/* -SC_DTCT */ ++ ++	/* ------- GPIO Group GPP_G ------- */ ++	PAD_NC(GPP_G0, NONE), ++	PAD_NC(GPP_G1, NONE), ++	PAD_NC(GPP_G2, NONE), ++	PAD_NC(GPP_G3, NONE), ++	PAD_CFG_GPO(GPP_G4, 0, DEEP),					/* TBT_RTD3_PWR_EN */ ++	PAD_CFG_GPO(GPP_G5, 0, DEEP),					/* TBT_FORCE_USB_PWR */ ++	PAD_CFG_GPO(GPP_G6, 0, DEEP),					/* -TBT_PERST */ ++	PAD_CFG_GPI_SCI(GPP_G7, NONE, DEEP, LEVEL, INVERT),		/* -TBT_PCIE_WAKE */ ++}; ++ ++void variant_config_gpios(void) ++{ ++	gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table)); ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c +new file mode 100644 +index 0000000000..3a951ce0da +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c +@@ -0,0 +1,90 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <device/azalia_device.h> ++ ++const u32 cim_verb_data[] = { ++	0x10ec0257, // Vendor/Device ID: Realtek ALC257 ++	0x17aa225d, // Subsystem ID ++	11, ++	AZALIA_SUBVENDOR(0, 0x17aa225d), ++ ++	AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC( ++		AZALIA_INTEGRATED, ++		AZALIA_INTERNAL, ++		AZALIA_MIC_IN, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_NO_JACK_PRESENCE_DETECT, ++		2, 0 ++	)), ++	AZALIA_PIN_CFG(0, 0x13, 0x40000000), // does not describe a jack or internal device ++	AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( ++		AZALIA_INTEGRATED, ++		AZALIA_INTERNAL, ++		AZALIA_SPEAKER, ++		AZALIA_OTHER_ANALOG, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_NO_JACK_PRESENCE_DETECT, ++		1, 0 ++	)), ++	AZALIA_PIN_CFG(0, 0x18, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++		AZALIA_MIC_IN, ++		AZALIA_STEREO_MONO_1_8, ++		AZALIA_BLACK, ++		AZALIA_JACK_PRESENCE_DETECT, ++		3, 0 ++	)), ++	AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x1b, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x1d, 0x40661b45), // does not describe a jack or internal device ++	AZALIA_PIN_CFG(0, 0x1e, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++		AZALIA_HP_OUT, ++		AZALIA_STEREO_MONO_1_8, ++		AZALIA_BLACK, ++		AZALIA_JACK_PRESENCE_DETECT, ++		1, 15 ++	)), ++ ++	0x8086280b, // Vendor/Device ID: Intel Kabylake HDMI ++	0x80860101, // Subsystem ID ++	4, ++	AZALIA_SUBVENDOR(2, 0x80860101), ++ ++	AZALIA_PIN_CFG(2, 0x05, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_DIGITAL_DISPLAY, ++		AZALIA_DIGITAL_OTHER_OUT, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_JACK_PRESENCE_DETECT, ++		1, 0 ++	)), ++	AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_DIGITAL_DISPLAY, ++		AZALIA_DIGITAL_OTHER_OUT, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_JACK_PRESENCE_DETECT, ++		2, 0 ++	)), ++	AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_DIGITAL_DISPLAY, ++		AZALIA_DIGITAL_OTHER_OUT, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_JACK_PRESENCE_DETECT, ++		3, 0 ++	)), ++}; ++ ++const u32 pc_beep_verbs[] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c +new file mode 100644 +index 0000000000..5252a402f9 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c +@@ -0,0 +1,20 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <soc/romstage.h> ++#include <spd_bin.h> ++ ++void mainboard_memory_init_params(FSPM_UPD *mupd) ++{ ++	FSP_M_CONFIG *mem_cfg = &mupd->FspmConfig; ++	mem_cfg->DqPinsInterleaved = true;			/* DDR_DQ in interleave mode */ ++	mem_cfg->CaVrefConfig      = 2;				/* VREF_CA to CH_A and VREF_DQ_B to CH_B */ ++	mem_cfg->MemorySpdDataLen  = CONFIG_DIMM_SPD_SIZE; ++ ++	/* Get SPD for memory slots */ ++	struct spd_block blk = { .addr_map = { 0x50, 0x51, } }; ++	get_spd_smbus(&blk); ++	dump_spd_info(&blk); ++ ++	mem_cfg->MemorySpdPtr00    = (uintptr_t)blk.spd_array[0]; ++	mem_cfg->MemorySpdPtr10    = (uintptr_t)blk.spd_array[1]; ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb +new file mode 100644 +index 0000000000..bf66bd3a69 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb +@@ -0,0 +1,103 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++chip soc/intel/skylake ++	device domain 0 on ++		device ref south_xhci on ++			register "usb2_ports" = "{ ++				[0] = USB2_PORT_MID(OC1),		// USB-A ++				[1] = USB2_PORT_MID(OC0),		// USB-A (always on) ++				[2] = USB2_PORT_MID(OC_SKIP),		// JSC-1 (smartcard slot) ++				[3] = USB2_PORT_MID(OC_SKIP),		// USB-C (charging port) ++				[4] = USB2_PORT_MID(OC_SKIP),		// JCAM1 (IR camera) ++				[5] = USB2_PORT_MID(OC_SKIP),		// JWWAN1 (M.2 WWAN USB) ++				[6] = USB2_PORT_MID(OC_SKIP),		// JWLAN1 (M.2 WLAN USB) ++				[7] = USB2_PORT_MID(OC_SKIP),		// JCAM1 (webcam) ++				[8] = USB2_PORT_MID(OC_SKIP),		// JFPR1 (fingerprint reader) ++				[9] = USB2_PORT_MID(OC_SKIP),		// JLCD1 (touch panel) ++			}" ++			register "usb3_ports" = "{ ++				[0] = USB3_PORT_DEFAULT(OC1),		// USB-A ++				[1] = USB3_PORT_DEFAULT(OC0),		// USB-A (always on) ++				[2] = USB3_PORT_DEFAULT(OC_SKIP),	// RTS5344S (SD card reader) ++				[3] = USB3_PORT_DEFAULT(OC_SKIP),	// USB-C (charging port) ++			}" ++		end ++ ++		device ref sata on ++			# SATA_2 - JHDD1 SATA SSD ++			register "SataPortsEnable[2]" = "1" ++			register "SataPortsDevSlp[2]" = "1" ++		end ++ ++		# PCIe controller 1 - 1x4 ++		#   PCIE 1-4   - RP1  - dGPU - CLKOUT0 - CLKREQ0 ++		# ++		# PCIe controller 2 - 2x1+1x2 (lane reversal) ++		#   PCIE 5     - GBE  - GBE  - CLKOUT1 - CLKREQ1 (clobbers RP8) ++		#   PCIE 6     - RP7  - WLAN - CLKOUT2 - CLKREQ2 ++		#   PCIE 7-8   - RP5  - WWAN - CLKOUT3 - CLKREQ3 ++		# ++		# PCIe controller 3 - 2x2 ++		#   PCIE 9-10  - RP9  - TB3  - CLKOUT4 - CLKREQ4 ++		#   PCIE 11-12 - RP11 - SSD  - CLKOUT5 - CLKREQ5 ++ ++		# dGPU - x4 ++		device ref pcie_rp1 on ++			register "PcieRpEnable[0]"			= "1" ++			register "PcieRpClkReqSupport[0]"		= "1" ++			register "PcieRpClkReqNumber[0]"		= "0" ++			register "PcieRpClkSrcNumber[0]"		= "0" ++			register "PcieRpAdvancedErrorReporting[0]"	= "1" ++			register "PcieRpLtrEnable[0]"			= "1" ++		end ++ ++		# Ethernet (clobbers RP8) ++		device ref gbe on ++			register "LanClkReqSupported"			= "1" ++			register "LanClkReqNumber"			= "1" ++			register "EnableLanLtr"				= "1" ++			register "EnableLanK1Off"			= "1" ++		end ++ ++		# M.2 WLAN - x1 ++		device ref pcie_rp7 on ++			register "PcieRpEnable[6]"			= "1" ++			register "PcieRpClkReqSupport[6]"		= "1" ++			register "PcieRpClkReqNumber[6]"		= "2" ++			register "PcieRpClkSrcNumber[6]"		= "2" ++			register "PcieRpAdvancedErrorReporting[6]"	= "1" ++			register "PcieRpLtrEnable[6]"			= "1" ++		end ++ ++		# M.2 WWAN - x2 ++		device ref pcie_rp5 on ++			register "PcieRpEnable[4]"			= "1" ++			register "PcieRpClkReqSupport[4]"		= "1" ++			register "PcieRpClkReqNumber[4]"		= "3" ++			register "PcieRpClkSrcNumber[4]"		= "3" ++			register "PcieRpAdvancedErrorReporting[4]"	= "1" ++			register "PcieRpLtrEnable[4]"			= "1" ++		end ++ ++		# TB3 (Alpine Ridge LP) - x2 ++		device ref pcie_rp9 on ++			register "PcieRpEnable[8]"			= "1" ++			register "PcieRpClkReqSupport[8]"		= "1" ++			register "PcieRpClkReqNumber[8]"		= "4" ++			register "PcieRpClkSrcNumber[8]"		= "4" ++			register "PcieRpAdvancedErrorReporting[8]"	= "1" ++			register "PcieRpLtrEnable[8]"			= "1" ++			register "PcieRpHotPlug[8]"			= "1" ++		end ++ ++		# M.2 2280 caddy - x2 ++		device ref pcie_rp11 on ++			register "PcieRpEnable[10]"			= "1" ++			register "PcieRpClkReqSupport[10]"		= "1" ++			register "PcieRpClkReqNumber[10]"		= "5" ++			register "PcieRpClkSrcNumber[10]"		= "5" ++			register "PcieRpAdvancedErrorReporting[10]"	= "1" ++			register "PcieRpLtrEnable[10]"			= "1" ++		end ++	end ++end +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..47732e37d5b2bad4e674fd10eafa605d26f97840 +GIT binary patch +literal 4106 +zcmeHJUu+a*5TCu>yW9JAmoD2P<t%lC2CfC#y%tU^HSGOq>9tqx`iFWXCLD09R<E?S +zMT)`nNScT-%9*GEA8a2?G`v`!jPV6yVlcd5OnC6Y;F}U&jJz1db9VRID@E)DLk#NN +z&9^i2&Hiq_`R2ZF8ipf7IM{nI5$^585@kULrrx0OPKv~ngNI__q41$dA{p()ui+v1 +zw(9rm09lUPAP4nOTm0CRnF|aw5^SQSH<G}<u_Gfnvn6IuK0h@!j;UxI!$*&rIdkIh +zl$piB;eBDWa1|CgK9bAg{^O%Z%!ziiz{neeJDb~fBI?1GV5p^44?a$ETl=n1d+;%Z +z#X6(OzEnIB9*QUTV{!mv@xk!mU}s+>aS&4j$?kY0KGYdgn6;MZ*!anbk!PNr!a%eU +zTXkLEL3ly5L&oUX#CS7?b2%Kad?s<goHQq1G_%bLv);c5qQC)gZtxnw!L3%1MWI_X +z0wUImYD_R11gsI%l%Zw})KN_c#&!YgM3v;Up{7+s1=lXlB>-#@;mhg8>>>#S&)d2I +zmP&-g0$k02szSQj(Y*j}YYtQnDH0;2ui<!ko-28Y){6ilAcrmz951v4RTWQ_ye!or +z4xOJya#Sr7{o)%XFUfJCndM%KM(c^ol_hzlb*1h&uC%Vy%U(P!_qUfwcb4r;SmPQ_ +zhxf($vVo)we+jxogb`7NQ^aS9eQpNT#2bmX5(kO*5O)$Mi4PJVB_1U{L42C{HR894 +z=ZJk70(Q~o{*COiRR#_fix0XaS3?igAuo2!)<NF8ARGWF&M7=h16xZaS|UxpZA)w3 +z1CQUC@^&oxtbG2HGk&WA9=_qa;$?8fdy_j;eY+H3ciR5U?|$2?oT;mPoV=Dx&CwUf +zv~zYWs{cR#vl*!ChO54O0k3UT#mpur4fXeCdE_aoNtZ|mgF!ck3Nmy<0BRuy4NwCa +zNZDP7XrHsU<-0NyB2=wXwgEqZPukelExAY+hyWVj0{)~A=X~17KK7XpzxQcB``9fX +zZf4pp#`ZEanRbG)(+odg+NX?t!SF|>{mPhI!flfFgv9nqI4Wr~5_?s`k0kALiCvcP +zCrRUFrpVYPYn?Jn%6MGXUXj_GGJYa!U&-tn8Gn&ANnz_0+@olH3VTw)mlf@-!p<v7 +zljhF5u5tObYwR{boRI14NxNkGd6QG=>8{!e#p0ct5}M(h16D>p?OGjSz6v3juERjS +z#z{?mXvVqrXs_rvUmYR40gNzg(QD6y9E94?4DWO|6eb83LI-smcVC6x1n2reH}rAp +zLM);f=tWDCr``UF5T>!;PYu^H1g>EBP8A}2*fM>s-@nC3pDV|}6+CtfhG(II7`pcw +z`jLfJ!?;*R@Bp=Nw2EPOC7FEs(cugIP_K6tN_$~tvS8nx6iOv|IMrO3&-m*N9ZP#b +znG^~>I|l1cUVSeD9r^k3h0TP}WWD9=MZxY<<azgO1@-W5<NTHW*-d)t{Q4yX9_+?a +zHawLe=uO6@%xqS#?JxafX%#$`BhkIqq>Z3B2yU!k71#YRpThOJtVheMDA50rV#s@U +z+nKbA{O(olYR}icuzQD*-cjBQ9;%!eMDVP>7mWsF@=%>o)wSgq=n%DHNOYwRr4Ao6 +zbNdgEn*RdDS>Rud+fIY0N8JkP3q6;>8o%R(CE2n3?Xg%qP+U%~6|{XFyxv7Y#;J2Z +XK$lk*wsY^m4}9|iz?mg_AjCfat$CyH + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads +new file mode 100644 +index 0000000000..fcfbd75a92 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads +@@ -0,0 +1,19 @@ ++-- SPDX-License-Identifier: GPL-2.0-or-later ++ ++with HW.GFX.GMA; ++with HW.GFX.GMA.Display_Probing; ++ ++use HW.GFX.GMA; ++use HW.GFX.GMA.Display_Probing; ++ ++private package GMA.Mainboard is ++ ++   ports : constant Port_List := ++     (eDP, ++      DP1, ++      DP2, ++      HDMI1, ++      HDMI2, ++      others => Disabled); ++ ++end GMA.Mainboard; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c +new file mode 100644 +index 0000000000..a98dd2bc4e +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c +@@ -0,0 +1,199 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <soc/gpio.h> ++#include "../../gpio.h" ++ ++static const struct pad_config gpio_table[] = { ++	/* ------- GPIO Community 0 ------- */ ++ ++	/* ------- GPIO Group GPP_A ------- */ ++	PAD_CFG_NF(GPP_A0, NONE, DEEP, NF1),				/* -KBRC */ ++	PAD_CFG_NF(GPP_A1, NATIVE, DEEP, NF1),				/* LPC_AD0 */ ++	PAD_CFG_NF(GPP_A2, NATIVE, DEEP, NF1),				/* LPC_AD1 */ ++	PAD_CFG_NF(GPP_A3, NATIVE, DEEP, NF1),				/* LPC_AD2 */ ++	PAD_CFG_NF(GPP_A4, NATIVE, DEEP, NF1),				/* LPC_AD3 */ ++	PAD_CFG_NF(GPP_A5, NONE, DEEP, NF1),				/* -LPC_FRAME */ ++	PAD_CFG_NF(GPP_A6, NONE, DEEP, NF1),				/* IRQSER */ ++	PAD_CFG_NF(GPP_A7, NONE, DEEP, NF1),				/* -TPM_IRQ */ ++	PAD_CFG_NF(GPP_A8, NONE, DEEP, NF1),				/* -CLKRUN */ ++	PAD_CFG_NF(GPP_A9, DN_20K, DEEP, NF1),				/* LPCCLK_EC_24M */ ++	PAD_CFG_NF(GPP_A10, DN_20K, DEEP, NF1),				/* LPCCLK_DEBUG_24M */ ++	PAD_NC(GPP_A11, NONE), ++	PAD_NC(GPP_A12, NONE), ++	PAD_CFG_NF(GPP_A13, NONE, DEEP, NF1),				/* -SUSWARN */ ++	PAD_CFG_NF(GPP_A14, NONE, DEEP, NF1),				/* -SUS_STAT */ ++	PAD_CFG_NF(GPP_A15, UP_20K, DEEP, NF1),				/* -SUSWARN */ ++	PAD_NC(GPP_A16, NONE), ++	PAD_NC(GPP_A17, NONE), ++	PAD_NC(GPP_A18, NONE), ++	PAD_NC(GPP_A19, NONE), ++	PAD_NC(GPP_A20, NONE), ++	PAD_NC(GPP_A21, NONE), ++	PAD_NC(GPP_A22, NONE), ++	PAD_NC(GPP_A23, NONE), ++ ++	/* ------- GPIO Group GPP_B ------- */ ++	PAD_CFG_NF(GPP_B0, NONE, DEEP, NF1), ++	PAD_CFG_NF(GPP_B1, NONE, DEEP, NF1), ++	PAD_NC(GPP_B2, NONE), ++	PAD_NC(GPP_B3, NONE), ++	PAD_CFG_GPI_SCI(GPP_B4, NONE, DEEP, EDGE_SINGLE, INVERT),	/* -TBT_PLUG_EVENT */ ++	PAD_CFG_NF(GPP_B5, NONE, DEEP, NF1),				/* -CLKREQ_PCIE0 (dGPU) */ ++	PAD_CFG_NF(GPP_B6, NONE, DEEP, NF1),				/* -CLKREQ_PCIE3 (WWAN) */ ++	PAD_CFG_NF(GPP_B7, NONE, DEEP, NF1),				/* -CLKREQ_PCIE4 (GBE) */ ++	PAD_CFG_NF(GPP_B8, NONE, DEEP, NF1),				/* -CLKREQ_PCIE5 (WLAN) */ ++	PAD_CFG_NF(GPP_B9, NONE, DEEP, NF1),				/* -CLKREQ_PCIE6 (TB3) */ ++	PAD_CFG_NF(GPP_B10, NONE, DEEP, NF1),				/* -CLKREQ_PCIE8 (SSD) */ ++	PAD_NC(GPP_B11, NONE), ++	PAD_CFG_NF(GPP_B12, NONE, DEEP, NF1),				/* -PCH_SLP_S0 */ ++	PAD_CFG_NF(GPP_B13, NONE, DEEP, NF1),				/* -PLTRST */ ++	PAD_CFG_NF(GPP_B14, NONE, DEEP, NF1),				/* PCH_SPKR */ ++	PAD_CFG_GPO(GPP_B15, 0, DEEP),					/* NFC_DLREQ */ ++	PAD_NC(GPP_B16, NONE), ++	PAD_NC(GPP_B17, NONE), ++	PAD_NC(GPP_B18, NONE), ++	PAD_NC(GPP_B19, NONE), ++	PAD_NC(GPP_B20, NONE), ++	PAD_NC(GPP_B21, NONE), ++	PAD_NC(GPP_B22, NONE), ++	PAD_NC(GPP_B23, NONE), ++ ++	/* ------- GPIO Community 1 ------- */ ++ ++	/* ------- GPIO Group GPP_C ------- */ ++	PAD_CFG_NF(GPP_C0, NONE, DEEP, NF1),				/* SMB_CLK */ ++	PAD_CFG_NF(GPP_C1, NONE, DEEP, NF1),				/* SMB_DATA */ ++	PAD_CFG_GPO(GPP_C2, 1, DEEP), ++	PAD_CFG_NF(GPP_C3, NONE, DEEP, NF1),				/* SML0_CLK */ ++	PAD_CFG_NF(GPP_C4, NONE, DEEP, NF1),				/* SML0_DATA */ ++	PAD_NC(GPP_C5, NONE), ++	PAD_CFG_NF(GPP_C6, NONE, DEEP, NF1),				/* EC_SCL2 */ ++	PAD_CFG_NF(GPP_C7, NONE, DEEP, NF1),				/* EC_SDA2 */ ++	PAD_NC(GPP_C8, NONE), ++	PAD_NC(GPP_C9, NONE), ++	PAD_NC(GPP_C10, NONE), ++	PAD_NC(GPP_C11, NONE), ++	PAD_NC(GPP_C12, NONE), ++	PAD_NC(GPP_C13, NONE), ++	PAD_NC(GPP_C14, NONE), ++	PAD_NC(GPP_C15, NONE), ++	PAD_CFG_NF(GPP_C16, NONE, DEEP, NF1),				/* I2C0_DATA */ ++	PAD_CFG_NF(GPP_C17, NONE, DEEP, NF1),				/* I2C0_CLK */ ++	PAD_NC(GPP_C18, NONE), ++	PAD_NC(GPP_C19, NONE), ++	PAD_CFG_GPO(GPP_C20, 0, DEEP),					/* EPRIVACY_ON */ ++	PAD_CFG_GPO(GPP_C21, 0, DEEP),					/* TBT_FORCE_PWR */ ++	PAD_CFG_GPI_SCI(GPP_C22, NONE, DEEP, EDGE_SINGLE, INVERT),	/* -EC_SCI */ ++	PAD_CFG_GPI_SCI(GPP_C23, NONE, DEEP, EDGE_SINGLE, INVERT),	/* -EC_WAKE */ ++ ++	/* ------- GPIO Group GPP_D ------- */ ++	PAD_NC(GPP_D0, NONE), ++	PAD_NC(GPP_D1, NONE), ++	PAD_NC(GPP_D2, NONE), ++	PAD_NC(GPP_D3, NONE), ++	PAD_NC(GPP_D4, NONE), ++	PAD_NC(GPP_D5, NONE), ++	PAD_NC(GPP_D6, NONE), ++	PAD_NC(GPP_D7, NONE), ++	PAD_NC(GPP_D8, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_D9, UP_20K, DEEP, OFF, ACPI),		/* -DISCRETE_PRESENCE */ ++	PAD_NC(GPP_D10, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_D11, UP_20K, DEEP, OFF, ACPI),		/* DGFX_VRAM_ID0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_D12, UP_20K, DEEP, OFF, ACPI),		/* DGFX_VRAM_ID1 */ ++	PAD_NC(GPP_D13, NONE), ++	PAD_NC(GPP_D14, NONE), ++	PAD_NC(GPP_D15, NONE), ++	PAD_NC(GPP_D16, NONE), ++	PAD_CFG_GPO(GPP_D17, 0, DEEP),					/* DDI_PRIORITY */ ++	PAD_NC(GPP_D18, NONE), ++	PAD_NC(GPP_D19, NONE), ++	PAD_NC(GPP_D20, NONE), ++	PAD_NC(GPP_D21, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_D22, UP_20K, DEEP, OFF, ACPI),		/* -NFC_DTCT */ ++	PAD_NC(GPP_D23, NONE), ++ ++	/* ------- GPIO Group GPP_E ------- */ ++	PAD_CFG_GPO(GPP_E0, 1, DEEP),					/* BDC_ON */ ++	PAD_NC(GPP_E1, NONE), ++	PAD_CFG_NF(GPP_E2, NONE, DEEP, NF1),				/* -SATA2_DTCT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_E3, NONE, DEEP, EDGE_SINGLE, ACPI),	/* -TBT_PLUG_EVENT */ ++	PAD_CFG_GPO(GPP_E4, 1, DEEP),					/* NFC_ON */ ++	PAD_NC(GPP_E5, NONE), ++	PAD_CFG_NF(GPP_E6, NONE, RSMRST, NF1),				/* SATA2_DEVSLP */ ++	PAD_NC(GPP_E7, NONE), ++	PAD_NC(GPP_E8, NONE), ++	PAD_CFG_NF(GPP_E9, NONE, DEEP, NF1),				/* -USB_PORT0_OC0 */ ++	PAD_CFG_NF(GPP_E10, NONE, DEEP, NF1),				/* -USB_PORT1_OC1 */ ++	PAD_NC(GPP_E11, NONE), ++	PAD_CFG_GPI_APIC_HIGH(GPP_E12, NONE, DEEP),			/* NFC_INT */ ++	PAD_CFG_NF(GPP_E13, NONE, DEEP, NF1),				/* DDIP1_HPD */ ++	PAD_CFG_NF(GPP_E14, NONE, DEEP, NF1),				/* DDIP2_HPD */ ++	PAD_NC(GPP_E15, NONE), ++	PAD_NC(GPP_E16, NONE), ++	PAD_CFG_NF(GPP_E17, NONE, DEEP, NF1),				/* EDP_HPD */ ++	PAD_NC(GPP_E18, NONE), ++	PAD_CFG_GPO(GPP_E19, 0, DEEP), ++	PAD_CFG_NF(GPP_E20, NONE, DEEP, NF1),				/* DDIP2_CTRLCLK */ ++	PAD_CFG_NF(GPP_E21, NONE, DEEP, NF1),				/* DDIP2_CTRLDATA */ ++	PAD_CFG_TERM_GPO(GPP_E22, 0, UP_20K, RSMRST),			/* -GPU_RST */ ++	PAD_CFG_TERM_GPO(GPP_E23, 0, UP_20K, RSMRST),			/* 1R8VIDEO_AON_ON */ ++ ++	/* ------- GPIO Community 2 ------- */ ++ ++	/* -------- GPIO Group GPD -------- */ ++	PAD_CFG_NF(GPD0, NONE, PWROK, NF1),				/* -BATLOW */ ++	PAD_CFG_NF(GPD1, NATIVE, PWROK, NF1),				/* AC_PRESENT */ ++	PAD_CFG_NF(GPD2, NATIVE, PWROK, NF1),				/* -LANWAKE */ ++	PAD_CFG_NF(GPD3, UP_20K, PWROK, NF1),				/* -PWRSW_EC */ ++	PAD_CFG_NF(GPD4, NONE, PWROK, NF1),				/* -PCH_SLP_S3 */ ++	PAD_CFG_NF(GPD5, NONE, PWROK, NF1),				/* -PCH_SLP_S4 */ ++	PAD_CFG_NF(GPD6, NONE, PWROK, NF1),				/* -PCH_SLP_M */ ++	PAD_NC(GPD7, NONE), ++	PAD_CFG_NF(GPD8, NONE, PWROK, NF1),				/* SUSCLK_32K */ ++	PAD_CFG_NF(GPD9, NONE, PWROK, NF1),				/* -PCH_SLP_WLAN */ ++	PAD_CFG_NF(GPD10, NONE, PWROK, NF1),				/* -PCH_SLP_S5 */ ++	PAD_CFG_NF(GPD11, NONE, PWROK, NF1),				/* LANPHYPC */ ++ ++	/* ------- GPIO Community 3 ------- */ ++ ++	/* ------- GPIO Group GPP_F ------- */ ++	PAD_CFG_GPO(GPP_F0, 0, DEEP), ++	PAD_CFG_GPI_TRIG_OWN(GPP_F1, NONE, DEEP, OFF, ACPI),		/* GC6_FB_EN */ ++	PAD_CFG_GPO(GPP_F2, 1, DEEP),					/* -GPU_EVENT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F3, NONE, PLTRST, OFF, ACPI),		/* DGFX_PWRGD */ ++	PAD_NC(GPP_F4, NONE),						/* -WWAN_RESET */ ++	PAD_NC(GPP_F5, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_F6, UP_20K, DEEP, OFF, ACPI),		/* -MIC_HW_EN (R37 to GND) */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F7, UP_20K, DEEP, OFF, ACPI),		/* -INT_MIC_DTCT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F8, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F9, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG1 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F10, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG2 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F11, UP_20K, DEEP, OFF, ACPI),		/* WWAN_CFG3 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F12, UP_20K, DEEP, OFF, ACPI),		/* PLANARID0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F13, UP_20K, DEEP, OFF, ACPI),		/* PLANARID1 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F14, UP_20K, DEEP, OFF, ACPI),		/* PLANARID2 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F15, UP_20K, DEEP, OFF, ACPI),		/* PLANARID3 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F16, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F17, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID1 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F18, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID2 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F19, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID3 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F20, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID4 */ ++	PAD_NC(GPP_F21, NONE), ++	PAD_CFG_GPI_TRIG_OWN(GPP_F22, UP_20K, DEEP, OFF, ACPI),		/* -TAMPER_SW_DTCT */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F23, UP_20K, DEEP, OFF, ACPI),		/* -SC_DTCT */ ++ ++	/* ------- GPIO Group GPP_G ------- */ ++	PAD_NC(GPP_G0, NONE), ++	PAD_NC(GPP_G1, NONE), ++	PAD_NC(GPP_G2, NONE), ++	PAD_NC(GPP_G3, NONE), ++	PAD_CFG_GPO(GPP_G4, 0, DEEP),					/* TBT_RTD3_PWR_EN */ ++	PAD_CFG_GPO(GPP_G5, 0, DEEP),					/* TBT_FORCE_USB_PWR */ ++	PAD_CFG_GPO(GPP_G6, 0, DEEP),					/* -TBT_PERST */ ++	PAD_CFG_GPI_SCI(GPP_G7, NONE, DEEP, LEVEL, INVERT),		/* -TBT_PCIE_WAKE */ ++}; ++ ++void variant_config_gpios(void) ++{ ++	gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table)); ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c +new file mode 100644 +index 0000000000..b1d96c5a76 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c +@@ -0,0 +1,90 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <device/azalia_device.h> ++ ++const u32 cim_verb_data[] = { ++	0x10ec0257, // Vendor/Device ID: Realtek ALC257 ++	0x17aa2258, // Subsystem ID ++	11, ++	AZALIA_SUBVENDOR(0, 0x17aa2258), ++ ++	AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC( ++		AZALIA_INTEGRATED, ++		AZALIA_INTERNAL, ++		AZALIA_MIC_IN, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_NO_JACK_PRESENCE_DETECT, ++		2, 0 ++	)), ++	AZALIA_PIN_CFG(0, 0x13, 0x40000000), // does not describe a jack or internal device ++	AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( ++		AZALIA_INTEGRATED, ++		AZALIA_INTERNAL, ++		AZALIA_SPEAKER, ++		AZALIA_OTHER_ANALOG, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_NO_JACK_PRESENCE_DETECT, ++		1, 0 ++	)), ++	AZALIA_PIN_CFG(0, 0x18, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++		AZALIA_MIC_IN, ++		AZALIA_STEREO_MONO_1_8, ++		AZALIA_BLACK, ++		AZALIA_JACK_PRESENCE_DETECT, ++		3, 0 ++	)), ++	AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x1b, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x1d, 0x40661b45), // does not describe a jack or internal device ++	AZALIA_PIN_CFG(0, 0x1e, AZALIA_PIN_CFG_NC(0)), ++	AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, ++		AZALIA_HP_OUT, ++		AZALIA_STEREO_MONO_1_8, ++		AZALIA_BLACK, ++		AZALIA_JACK_PRESENCE_DETECT, ++		1, 15 ++	)), ++ ++	0x8086280b, // Vendor/Device ID: Intel Kabylake HDMI ++	0x80860101, // Subsystem ID ++	4, ++	AZALIA_SUBVENDOR(2, 0x80860101), ++ ++	AZALIA_PIN_CFG(2, 0x05, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_DIGITAL_DISPLAY, ++		AZALIA_DIGITAL_OTHER_OUT, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_JACK_PRESENCE_DETECT, ++		1, 0 ++	)), ++	AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_DIGITAL_DISPLAY, ++		AZALIA_DIGITAL_OTHER_OUT, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_JACK_PRESENCE_DETECT, ++		1, 0 ++	)), ++	AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC( ++		AZALIA_JACK, ++		AZALIA_DIGITAL_DISPLAY, ++		AZALIA_DIGITAL_OTHER_OUT, ++		AZALIA_OTHER_DIGITAL, ++		AZALIA_COLOR_UNKNOWN, ++		AZALIA_JACK_PRESENCE_DETECT, ++		1, 0 ++	)), ++}; ++ ++const u32 pc_beep_verbs[] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c +new file mode 100644 +index 0000000000..001e934b3a +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <cbfs.h> ++#include <gpio.h> ++#include <soc/gpio.h> ++#include <soc/romstage.h> ++#include <spd_bin.h> ++#include <stdio.h> ++ ++static const struct pad_config memory_id_gpio_table[] = { ++	PAD_CFG_GPI_TRIG_OWN(GPP_F16, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID0 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F17, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID1 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F18, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID2 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F19, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID3 */ ++	PAD_CFG_GPI_TRIG_OWN(GPP_F20, UP_20K, DEEP, OFF, ACPI),		/* MEMORYID4 */ ++}; ++ ++void mainboard_memory_init_params(FSPM_UPD *mupd) ++{ ++	int spd_idx; ++	char spd_name[20]; ++	size_t spd_size; ++ ++	FSP_M_CONFIG *mem_cfg = &mupd->FspmConfig; ++	mem_cfg->DqPinsInterleaved = true;			/* DDR_DQ in interleave mode */ ++	mem_cfg->CaVrefConfig      = 2;				/* VREF_CA to CH_A and VREF_DQ_B to CH_B */ ++	mem_cfg->MemorySpdDataLen  = CONFIG_DIMM_SPD_SIZE; ++ ++	/* Get SPD for soldered RAM SPD (CH A) */ ++	gpio_configure_pads(memory_id_gpio_table, ARRAY_SIZE(memory_id_gpio_table)); ++ ++	spd_idx = gpio_get(GPP_F16) | gpio_get(GPP_F17) << 1 | gpio_get(GPP_F18) << 2 | ++		  gpio_get(GPP_F19) << 3 | gpio_get(GPP_F20) << 4; ++	printk(BIOS_DEBUG, "Detected MEMORY_ID = %d\n", spd_idx); ++	snprintf(spd_name, sizeof(spd_name), "spd_%d.bin", spd_idx); ++	mem_cfg->MemorySpdPtr00    = (uintptr_t)cbfs_map(spd_name, &spd_size); ++ ++	/* Get SPD for memory slot (CH B) */ ++	struct spd_block blk = { .addr_map = { [1] = 0x51, } }; ++	get_spd_smbus(&blk); ++	dump_spd_info(&blk); ++ ++	mem_cfg->MemorySpdPtr10    = (uintptr_t)blk.spd_array[1]; ++} +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb +new file mode 100644 +index 0000000000..d4afca20c4 +--- /dev/null ++++ b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb +@@ -0,0 +1,103 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++chip soc/intel/skylake ++	device domain 0 on ++		device ref south_xhci on ++			register "usb2_ports" = "{ ++				[0] = USB2_PORT_MID(OC0),		// JUSB1 (USB-A always on) ++				[1] = USB2_PORT_MID(OC1),		// JUSB2 (USB-A) ++				[2] = USB2_PORT_MID(OC_SKIP),		// JFPR (smartcard slot) ++				[3] = USB2_PORT_MID(OC_SKIP),		// JUSBC (USB-C) ++				[4] = USB2_PORT_MID(OC_SKIP),		// JCAM (IR camera) ++				[5] = USB2_PORT_MID(OC_SKIP),		// JWWAN (M.2 WWAN USB) ++				[6] = USB2_PORT_MID(OC_SKIP),		// JWLAN (M.2 WLAN USB) ++				[7] = USB2_PORT_MID(OC_SKIP),		// JCAM (webcam) ++				[8] = USB2_PORT_MID(OC_SKIP),		// JFPR (fingerprint reader) ++				[9] = USB2_PORT_MID(OC_SKIP),		// JLCD (touch panel) ++			}" ++			register "usb3_ports" = "{ ++				[0] = USB3_PORT_DEFAULT(OC0),		// JUSB1 (USB-A always on) ++				[1] = USB3_PORT_DEFAULT(OC1),		// JUSB2 (USB-A) ++				[2] = USB3_PORT_DEFAULT(OC_SKIP),	// JSD (SD card reader) ++				[3] = USB3_PORT_DEFAULT(OC_SKIP),	// JUSBC (USB-C) ++			}" ++		end ++ ++		device ref sata on ++			# SATA_2 - Main M.2 SATA SSD ++			register "SataPortsEnable[2]" = "1" ++			register "SataPortsDevSlp[2]" = "1" ++		end ++ ++		# PCIe controller 1 - 1x2+2x1 ++		#   PCIE 1-2   - RP1  - dGPU - CLKOUT0 - CLKREQ0 ++		#   PCIE 4     - RP4  - WWAN - CLKOUT1 - CLKREQ1 ++		# ++		# PCIe controller 2 - 2x1+1x2 (lane reversal) ++		#   PCIE 5     - GBE  - GBE  - CLKOUT2 - CLKREQ2 (clobbers RP8) ++		#   PCIE 6     - RP7  - WLAN - CLKOUT3 - CLKREQ3 ++		#   PCIE 7-8   - RP5  - TB3  - CLKOUT4 - CLKREQ4 ++		# ++		# PCIe controller 3 - 1x4 (lane reversal) ++		#   PCIE 9-12  - RP9  - SSD  - CLKOUT5 - CLKREQ5 ++ ++		# dGPU - x2 ++		device ref pcie_rp1 on ++			register "PcieRpEnable[0]"			= "1" ++			register "PcieRpClkReqSupport[0]"		= "1" ++			register "PcieRpClkReqNumber[0]"		= "0" ++			register "PcieRpClkSrcNumber[0]"		= "0" ++			register "PcieRpAdvancedErrorReporting[0]"	= "1" ++			register "PcieRpLtrEnable[0]"			= "1" ++		end ++ ++		# M.2 WWAN - x1 ++		device ref pcie_rp4 on ++			register "PcieRpEnable[3]"			= "1" ++			register "PcieRpClkReqSupport[3]"		= "1" ++			register "PcieRpClkReqNumber[3]"		= "1" ++			register "PcieRpClkSrcNumber[3]"		= "1" ++			register "PcieRpAdvancedErrorReporting[3]"	= "1" ++			register "PcieRpLtrEnable[3]"			= "1" ++		end ++ ++		# Ethernet (clobbers RP8) ++		device ref gbe on ++			register "LanClkReqSupported"			= "1" ++			register "LanClkReqNumber"			= "2" ++			register "EnableLanLtr"				= "1" ++			register "EnableLanK1Off"			= "1" ++		end ++ ++		# M.2 WLAN - x1 ++		device ref pcie_rp7 on ++			register "PcieRpEnable[6]"			= "1" ++			register "PcieRpClkReqSupport[6]"		= "1" ++			register "PcieRpClkReqNumber[6]"		= "3" ++			register "PcieRpClkSrcNumber[6]"		= "3" ++			register "PcieRpAdvancedErrorReporting[6]"	= "1" ++			register "PcieRpLtrEnable[6]"			= "1" ++		end ++ ++		# TB3 (Alpine Ridge LP) - x2 ++		device ref pcie_rp5 on ++			register "PcieRpEnable[4]"			= "1" ++			register "PcieRpClkReqSupport[4]"		= "1" ++			register "PcieRpClkReqNumber[4]"		= "4" ++			register "PcieRpClkSrcNumber[4]"		= "4" ++			register "PcieRpAdvancedErrorReporting[4]"	= "1" ++			register "PcieRpLtrEnable[4]"			= "1" ++			register "PcieRpHotPlug[4]"			= "1" ++		end ++ ++		# M.2 2280 SSD - x2 ++		device ref pcie_rp9 on ++			register "PcieRpEnable[8]"			= "1" ++			register "PcieRpClkReqSupport[8]"		= "1" ++			register "PcieRpClkReqNumber[8]"		= "5" ++			register "PcieRpClkSrcNumber[8]"		= "5" ++			register "PcieRpAdvancedErrorReporting[8]"	= "1" ++			register "PcieRpLtrEnable[8]"			= "1" ++		end ++	end ++end +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..86f39ddb55ea9fb58d5e5699637636ef597c734e +GIT binary patch +literal 512 +zcmY!u;9+)EWZ+<6U|?oq29gXMJYRrxPEL*>N67~+1r7#Qh7a1t+8`-(puhlu3{YAD +YT>%dM8_BI;nL`dsaHtp+rc($20I8n}l>h($ + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..df0f6e58b79286a4aeb690c5027adf7a1f5f668b +GIT binary patch +literal 512 +zcmY!u;9+i6oWQ}rz`)GN3?vyic)kGXoSYm%j*<^t3LFfq3@hZcwLwzoK!E`Q8KATR +Yx&j>hH(SqvWezd%<4`dwOs5b40B_I==>Px# + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..24f0d8992bc5244c62488da9633e4885f52f3e22 +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i?q-XHu740(BZf(&^dxD+@TSQ$QOn`kgpFo@WI<Pkv3 +zjN25185j^Oge*SRoUI_)=hwI&^9wTJQ%GaE+Z>cy&~OfFg0G3Wp`)phiHWn5fv$6q +PvjPw>z-1}5hGzN!nb#F$ + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..59b6b9e78263c42aae367ab7d4a784d888f30efe +GIT binary patch +literal 512 +zcmY!u<Y8`AWZ+;(U|?osW&i?q-XHu740(BZf(&^dxD+@TSQ%DGYiKZ3Fo@WI<Pm^J +zTbD)5RGF87L5G`J#gvCx7a@nAHD@bG{`ob#fBb?9_?6OB_I)U&#y6aUn&4|<Zs=&} +YZDQ=?WT@*L<g5S$3~*UWt)ZEI0F{0fq5uE@ + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_12.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_12.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..93be0ac94fc57222cd29e34eee11042d7842ac25 +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i?q-XHu740(BZf(&^dxD+@TSQ$QOn`kgpFo@WI<Pkv3 +zjN25185j^Oge*SRoUI_)=hwI&^9wTJQ%GaE+Z>cy(6E*fVuXjUqlKwqu$iM<keQ!u +VsD}a&Ff^?FkI#a;_$28g2LQ`x7jOUo + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_13.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_13.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..171a272bc734b72395622bf889d24972ef2d14f7 +GIT binary patch +literal 512 +zcmY!u<Y8`AWZ+;(U|?osW&i?q-XHu740(BZf(&^dxD+@TSQ%DGYiKZ3Fo@WI<Pkv3 +zjN25185j^Oge*SRoUI_)=hr%!_!*h-DWtL7fk%{D(6E*fVuXjUqob)|u$iN8keQ!u +VsD}a&Ff^?FkI#a;_$28g2LP>g7pDLK + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a2a64a5e1adada3fc00b2e4edc60c77e610881a9 +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i><-XH%N8S?V-1R3%^a4B#wurhqmHql_HU=XnZ$x{Q& +z*$Oh{IYWaWKO+-03?$Qx1CPkm2-nu217(^xhPas;8kw1RMCls2o4FbS#SI&DT;VDQ +GCj$V){1T)9 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a2a64a5e1adada3fc00b2e4edc60c77e610881a9 +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i><-XH%N8S?V-1R3%^a4B#wurhqmHql_HU=XnZ$x{Q& +z*$Oh{IYWaWKO+-03?$Qx1CPkm2-nu217(^xhPas;8kw1RMCls2o4FbS#SI&DT;VDQ +GCj$V){1T)9 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..5f23e86606094d3e5d2011db902ebd4a500bbffa +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i><-XHc140(BZf(&^dxD+@TSQ$QOn`kgpFo@WI<Pkv3 +zjN25185j^Oge*SRoUI_)=M3$7{ESTa6w+Akz#~d6Xjsb#F~Y;w(ZbX)*v#20$jnbS +V%v%8n7#i08$7jJ^e3JB$0{}ZV7fApB + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_18.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_18.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..05633943eb5af166da66a2e1f4e74948f75782fb +GIT binary patch +literal 512 +zcmY!u<Y9JIoXEkDz`)GN%m4&zyg%$281nM+1R3%^a4B#wurhqmHql_HU=XnZ$s>T6 +z8Mi42GcX`n2w8lrIa@)p&l&!{<7bq|r;x^SwThHl(6E*fVuXjUqobjFu$i-OkeQ!u +Vn70BDFf^?FkI#a;_$28g2LNS*7)Ag9 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..857da9c9828cdac842329f6cef4539283777268b +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i?K-XH(98S?V-1R3%^a4B#wurhqmHql_HU=XnZ$x{Q& +z*$Oh{Il~1>enuv07)YiW2Og2B5w5L42g)>Y3~@6xG%_>sh|)E7H}WzBiW@fQc)?W; +GP6hy+m=i1j + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..b5b14cf2dfa06ae183b0379da4dc825129e1589f +GIT binary patch +literal 512 +zcmY!u;9+)EWZ+<6U|?oq29gXMJU@VRUS6IcN7)B11r7#Qh7a1tdLSuupuhlu3{YAD +XT>%b$v*cE=%%S%6I8=-Z(<uZ1pPdSg + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_20.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_20.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_3.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_3.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..d73736008af1eb67456b2fd66f7dec3b6669a442 +GIT binary patch +literal 512 +zcmY!u;9+i&oWQ}rz`)GN3?vyic)kGXoSYm%juHh92G#;*h81$!dLSuupuhlu3{YAD +YT>%b$+tzbnnL|62aHtp+rc($20QGqazW@LL + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..829f149547bc24859646c33d5926938d7a1b90cb +GIT binary patch +literal 512 +zcmY!u;9+)EWZ+<6U|?oq29gXMJYRrxPEL*>N67~+1r7#Qh7a1tdLSuupuhlu3{YAD +XT>%b$o8(ro%%OI594bbI=@bG0z{d&v + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..a64a5a93fb4aef4d5f63d79cb2582731b9ac5063 +GIT binary patch +literal 512 +NcmZQz7zHCa1ONg600961 + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..940f1e3cd8e5bd9ea32a82a14edcdcbc8132d8c7 +GIT binary patch +literal 512 +zcmY!u<Y8`AWZ+;(U|?osW&i><-XH%N8S?V-1R3%^a4B#wurjQW(9mG0U=XnZ$x{Q& +z0UPq1A)%L_QJxwGl4(Y*BAFWD+8T7AOcTeDU_*B^6OSleBX=`bLy)jxgN`d)<=|uh +E020*^DF6Tf + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..30c84410d417ef7afa8705c93cdb64a9f4e915a0 +GIT binary patch +literal 512 +zcmY!u<Y9JIWZ+;(U|?oqW&i?q-XHZ040(BZf(&^dxD+@TSQ$QOn`kgpFo@WI<f#GX +zYz3L}{MzzRenxp}7)YiWinU~FgllWifig`TL)=Uajm%6uqI8Yijh&1X6cmgabe!NS +H2PXpn6CD!Q + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_9.bin b/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_9.bin +new file mode 100644 +index 0000000000000000000000000000000000000000..7facef55b93fe1f67411c00bab84862769461f63 +GIT binary patch +literal 512 +zcmY!u<Y8`AWZ+;(U|?osW&i?q-XHZ040(BZf(&^dxD+@TSQ%DGYiKZ3Fo@WI<f#GX +zYz3L}{F>W!enxp}7)YiWinU~FgllWifig`TLxK(6%}hL^bdB7N9Ss$Lz^FmT39fQ* +FG5`?&65ap+ + +literal 0 +HcmV?d00001 + +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0029-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch b/config/coreboot/default/patches/0029-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch new file mode 100644 index 00000000..eb9263b9 --- /dev/null +++ b/config/coreboot/default/patches/0029-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch @@ -0,0 +1,708 @@ +From 75cc0ea09234064318046624845b0afc5afb0ce5 Mon Sep 17 00:00:00 2001 +From: Nicholas Chin <nic.c3.14@gmail.com> +Date: Mon, 30 Sep 2024 20:44:38 -0400 +Subject: [PATCH 29/37] mb/dell: Add Optiplex 780 MT (x4x/ICH10) + +Change-Id: Idb45737ce95bfd26e978323c650de7d308b5079c +Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com> +--- + src/mainboard/dell/optiplex_780/Kconfig       |  40 ++++ + src/mainboard/dell/optiplex_780/Kconfig.name  |   4 + + src/mainboard/dell/optiplex_780/Makefile.mk   |  10 + + src/mainboard/dell/optiplex_780/acpi/ec.asl   |   5 + + .../dell/optiplex_780/acpi/ich10_pci_irqs.asl |  32 ++++ + .../dell/optiplex_780/acpi/superio.asl        |  18 ++ + .../dell/optiplex_780/board_info.txt          |   6 + + src/mainboard/dell/optiplex_780/cmos.default  |   8 + + src/mainboard/dell/optiplex_780/cmos.layout   |  72 ++++++++ + src/mainboard/dell/optiplex_780/cstates.c     |   8 + + src/mainboard/dell/optiplex_780/devicetree.cb |  63 +++++++ + src/mainboard/dell/optiplex_780/dsdt.asl      |  26 +++ + .../dell/optiplex_780/gma-mainboard.ads       |  16 ++ + .../optiplex_780/variants/780_mt/data.vbt     | Bin 0 -> 1917 bytes + .../optiplex_780/variants/780_mt/early_init.c |  12 ++ + .../dell/optiplex_780/variants/780_mt/gpio.c  | 174 ++++++++++++++++++ + .../optiplex_780/variants/780_mt/hda_verb.c   |  26 +++ + .../variants/780_mt/overridetree.cb           |  10 + + 18 files changed, 530 insertions(+) + create mode 100644 src/mainboard/dell/optiplex_780/Kconfig + create mode 100644 src/mainboard/dell/optiplex_780/Kconfig.name + create mode 100644 src/mainboard/dell/optiplex_780/Makefile.mk + create mode 100644 src/mainboard/dell/optiplex_780/acpi/ec.asl + create mode 100644 src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl + create mode 100644 src/mainboard/dell/optiplex_780/acpi/superio.asl + create mode 100644 src/mainboard/dell/optiplex_780/board_info.txt + create mode 100644 src/mainboard/dell/optiplex_780/cmos.default + create mode 100644 src/mainboard/dell/optiplex_780/cmos.layout + create mode 100644 src/mainboard/dell/optiplex_780/cstates.c + create mode 100644 src/mainboard/dell/optiplex_780/devicetree.cb + create mode 100644 src/mainboard/dell/optiplex_780/dsdt.asl + create mode 100644 src/mainboard/dell/optiplex_780/gma-mainboard.ads + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb + +diff --git a/src/mainboard/dell/optiplex_780/Kconfig b/src/mainboard/dell/optiplex_780/Kconfig +new file mode 100644 +index 0000000000..2d06c75c9a +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/Kconfig +@@ -0,0 +1,40 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_DELL_OPTIPLEX_780_COMMON ++	def_bool n ++	select BOARD_ROMSIZE_KB_8192 ++	select CPU_INTEL_SOCKET_LGA775 ++	select DRIVERS_I2C_CK505 ++	select HAVE_ACPI_RESUME ++	select HAVE_ACPI_TABLES ++	select HAVE_CMOS_DEFAULT ++	select HAVE_OPTION_TABLE ++	select INTEL_GMA_HAVE_VBT ++	select MAINBOARD_HAS_LIBGFXINIT ++	select MAINBOARD_USES_IFD_GBE_REGION ++	select NORTHBRIDGE_INTEL_X4X ++	select PCIEXP_ASPM ++	select PCIEXP_CLK_PM ++	select SOUTHBRIDGE_INTEL_I82801JX ++ ++config BOARD_DELL_OPTIPLEX_780_MT ++	select BOARD_DELL_OPTIPLEX_780_COMMON ++ ++if BOARD_DELL_OPTIPLEX_780_COMMON ++ ++config VGA_BIOS_ID ++	default "8086,2e22" ++ ++config MAINBOARD_DIR ++	default "dell/optiplex_780" ++ ++config MAINBOARD_PART_NUMBER ++	default "OptiPlex 780 MT" if BOARD_DELL_OPTIPLEX_780_MT ++ ++config OVERRIDE_DEVICETREE ++	default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" ++ ++config VARIANT_DIR ++	default "780_mt" if BOARD_DELL_OPTIPLEX_780_MT ++ ++endif # BOARD_DELL_OPTIPLEX_780_COMMON +diff --git a/src/mainboard/dell/optiplex_780/Kconfig.name b/src/mainboard/dell/optiplex_780/Kconfig.name +new file mode 100644 +index 0000000000..db7f2e8fe3 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/Kconfig.name +@@ -0,0 +1,4 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_DELL_OPTIPLEX_780_MT ++	bool "OptiPlex 780 MT" +diff --git a/src/mainboard/dell/optiplex_780/Makefile.mk b/src/mainboard/dell/optiplex_780/Makefile.mk +new file mode 100644 +index 0000000000..d462995d75 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/Makefile.mk +@@ -0,0 +1,10 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++ramstage-y += cstates.c ++romstage-y += variants/$(VARIANT_DIR)/gpio.c ++ ++bootblock-y += variants/$(VARIANT_DIR)/early_init.c ++romstage-y += variants/$(VARIANT_DIR)/early_init.c ++ ++ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads ++ramstage-y += variants/$(VARIANT_DIR)/hda_verb.c +diff --git a/src/mainboard/dell/optiplex_780/acpi/ec.asl b/src/mainboard/dell/optiplex_780/acpi/ec.asl +new file mode 100644 +index 0000000000..479296cb76 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/acpi/ec.asl +@@ -0,0 +1,5 @@ ++/* SPDX-License-Identifier: CC-PDDC */ ++ ++/* Please update the license if adding licensable material. */ ++ ++/* dummy */ +diff --git a/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl b/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl +new file mode 100644 +index 0000000000..b7588dcc41 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl +@@ -0,0 +1,32 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++/* This is board specific information: ++ * IRQ routing for the 0:1e.0 PCI bridge of the ICH10 ++ */ ++ ++If (PICM) { ++	Return (Package() { ++		/* PCI slot */ ++		Package() { 0x0001ffff, 0, 0, 0x14}, ++		Package() { 0x0001ffff, 1, 0, 0x15}, ++		Package() { 0x0001ffff, 2, 0, 0x16}, ++		Package() { 0x0001ffff, 3, 0, 0x17}, ++ ++		Package() { 0x0002ffff, 0, 0, 0x15}, ++		Package() { 0x0002ffff, 1, 0, 0x16}, ++		Package() { 0x0002ffff, 2, 0, 0x17}, ++		Package() { 0x0002ffff, 3, 0, 0x14}, ++	}) ++} Else { ++	Return (Package() { ++		Package() { 0x0001ffff, 0, \_SB.PCI0.LPCB.LNKE, 0}, ++		Package() { 0x0001ffff, 1, \_SB.PCI0.LPCB.LNKF, 0}, ++		Package() { 0x0001ffff, 2, \_SB.PCI0.LPCB.LNKG, 0}, ++		Package() { 0x0001ffff, 3, \_SB.PCI0.LPCB.LNKH, 0}, ++ ++		Package() { 0x0002ffff, 0, \_SB.PCI0.LPCB.LNKF, 0}, ++		Package() { 0x0002ffff, 1, \_SB.PCI0.LPCB.LNKG, 0}, ++		Package() { 0x0002ffff, 2, \_SB.PCI0.LPCB.LNKH, 0}, ++		Package() { 0x0002ffff, 3, \_SB.PCI0.LPCB.LNKE, 0}, ++	}) ++} +diff --git a/src/mainboard/dell/optiplex_780/acpi/superio.asl b/src/mainboard/dell/optiplex_780/acpi/superio.asl +new file mode 100644 +index 0000000000..9f3900b86c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/acpi/superio.asl +@@ -0,0 +1,18 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#undef SUPERIO_DEV ++#undef SUPERIO_PNP_BASE ++#undef IT8720F_SHOW_SP1 ++#undef IT8720F_SHOW_SP2 ++#undef IT8720F_SHOW_EC ++#undef IT8720F_SHOW_KBCK ++#undef IT8720F_SHOW_KBCM ++#undef IT8720F_SHOW_GPIO ++#undef IT8720F_SHOW_CIR ++#define SUPERIO_DEV		SIO0 ++#define SUPERIO_PNP_BASE	0x2e ++#define IT8720F_SHOW_EC		1 ++#define IT8720F_SHOW_KBCK	1 ++#define IT8720F_SHOW_KBCM	1 ++#define IT8720F_SHOW_GPIO	1 ++#include <superio/ite/it8720f/acpi/superio.asl> +diff --git a/src/mainboard/dell/optiplex_780/board_info.txt b/src/mainboard/dell/optiplex_780/board_info.txt +new file mode 100644 +index 0000000000..aaf657b583 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/board_info.txt +@@ -0,0 +1,6 @@ ++Category: desktop ++Board URL: https://www.acer.com/ac/en/GB/content/support-product/1137?b=1 ++ROM package: SOIC-8 ++ROM protocol: SPI ++ROM socketed: n ++Flashrom support: y +diff --git a/src/mainboard/dell/optiplex_780/cmos.default b/src/mainboard/dell/optiplex_780/cmos.default +new file mode 100644 +index 0000000000..23f0e55f3e +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/cmos.default +@@ -0,0 +1,8 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++boot_option=Fallback ++debug_level=Debug ++power_on_after_fail=Disable ++nmi=Enable ++sata_mode=AHCI ++gfx_uma_size=64M +diff --git a/src/mainboard/dell/optiplex_780/cmos.layout b/src/mainboard/dell/optiplex_780/cmos.layout +new file mode 100644 +index 0000000000..9f5012adb4 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/cmos.layout +@@ -0,0 +1,72 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++# ----------------------------------------------------------------- ++entries ++ ++# ----------------------------------------------------------------- ++0	120	r	0	reserved_memory ++ ++# ----------------------------------------------------------------- ++# RTC_BOOT_BYTE (coreboot hardcoded) ++384	1	e	4	boot_option ++388	4	h	0	reboot_counter ++ ++# ----------------------------------------------------------------- ++# coreboot config options: console ++395	4	e	6	debug_level ++ ++# coreboot config options: southbridge ++408	1	e	10	sata_mode ++409	2	e	7	power_on_after_fail ++411	1	e	1	nmi ++ ++# coreboot config options: cpu ++ ++# coreboot config options: northbridge ++432	4	e	11	gfx_uma_size ++ ++# coreboot config options: check sums ++984	16	h	0	check_sum ++ ++# ----------------------------------------------------------------- ++ ++enumerations ++ ++#ID	value	text ++1	0	Disable ++1	1	Enable ++2	0	Enable ++2	1	Disable ++4	0	Fallback ++4	1	Normal ++6	0	Emergency ++6	1	Alert ++6	2	Critical ++6	3	Error ++6	4	Warning ++6	5	Notice ++6	6	Info ++6	7	Debug ++6	8	Spew ++7	0	Disable ++7	1	Enable ++7	2	Keep ++10	0	AHCI ++10	1	Compatible ++11	1	4M ++11	2	8M ++11	3	16M ++11	4	32M ++11	5	48M ++11	6	64M ++11	7	128M ++11	8	256M ++11	9	96M ++11	10	160M ++11	11	224M ++11	12	352M ++ ++# ----------------------------------------------------------------- ++checksums ++ ++checksum 392 983 984 +diff --git a/src/mainboard/dell/optiplex_780/cstates.c b/src/mainboard/dell/optiplex_780/cstates.c +new file mode 100644 +index 0000000000..4adf0edc63 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/cstates.c +@@ -0,0 +1,8 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <acpi/acpigen.h> ++ ++int get_cst_entries(const acpi_cstate_t **entries) ++{ ++	return 0; ++} +diff --git a/src/mainboard/dell/optiplex_780/devicetree.cb b/src/mainboard/dell/optiplex_780/devicetree.cb +new file mode 100644 +index 0000000000..95e3bd517c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/devicetree.cb +@@ -0,0 +1,63 @@ ++# SPDX-License-Identifier: GPL-2.0-or-later ++ ++chip northbridge/intel/x4x ++	device cpu_cluster 0 on ops x4x_cpu_bus_ops end		# APIC cluster ++	device domain 0 on ++		ops x4x_pci_domain_ops		# PCI domain ++		subsystemid 0x8086 0x0028 inherit ++		device pci 0.0 on  end		# Host Bridge ++		device pci 1.0 on  end		# PCIe x16 2.0 slot ++		device pci 2.0 on  end		# Integrated graphics controller ++		device pci 2.1 on  end		# Integrated graphics controller 2 ++		device pci 3.0 off end		# ME ++		device pci 3.1 off end		# ME ++		chip southbridge/intel/i82801jx	# ICH10 ++			register "gpe0_en" = "0x40" ++ ++			# Set AHCI mode. ++			register "sata_port_map"	= "0x3f" ++			register "sata_clock_request"	= "1" ++ ++			# Enable PCIe ports 0,1 as slots. ++			register "pcie_slot_implemented" = "0x3" ++ ++			device pci 19.0 on  end		# GBE ++			device pci 1a.0 on  end		# USB ++			device pci 1a.1 on  end		# USB ++			device pci 1a.2 on  end		# USB ++			device pci 1a.7 on  end		# USB ++			device pci 1b.0 on  end		# Audio ++			device pci 1c.0 off end		# PCIe 1 ++			device pci 1c.1 off end		# PCIe 2 ++			device pci 1c.2 off end		# PCIe 3 ++			device pci 1c.3 off end		# PCIe 4 ++			device pci 1c.4 off end		# PCIe 5 ++			device pci 1c.5 off end		# PCIe 6 ++			device pci 1d.0 on  end		# USB ++			device pci 1d.1 on  end		# USB ++			device pci 1d.2 on  end		# USB ++			device pci 1d.7 on  end		# USB ++			device pci 1e.0 on  end		# PCI bridge ++			device pci 1f.0 on  end		# LPC bridge ++			device pci 1f.2 on  end		# SATA (IDE: port 0-3, AHCI/RAID: 0-5) ++			device pci 1f.3 on		# SMBus ++				chip drivers/i2c/ck505	# IDT CV194 ++					register "mask" = "{ 0xff, 0xff, 0xff, 0xff, ++							     0xff, 0xff, 0xff, 0xff, ++							     0xff, 0xff, 0xff, 0xff, ++							     0xff, 0xff, 0xff, 0xff, ++							     0xff, 0xff, 0xff }" ++					register "regs" = "{ 0x15, 0x82, 0xff, 0xff, ++							     0xff, 0x00, 0x00, 0x95, ++							     0x00, 0x65, 0x7d, 0x56, ++							     0x13, 0xc0, 0x00, 0x07, ++							     0x01, 0x0a, 0x64 }" ++					device i2c 69 on end ++				end ++			end ++			device pci 1f.4 off end ++			device pci 1f.5 off end		# SATA 2 (for port 4-5 in IDE mode) ++			device pci 1f.6 off end		# Thermal Subsystem ++		end ++	end ++end +diff --git a/src/mainboard/dell/optiplex_780/dsdt.asl b/src/mainboard/dell/optiplex_780/dsdt.asl +new file mode 100644 +index 0000000000..9ad70469de +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/dsdt.asl +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <acpi/acpi.h> ++DefinitionBlock( ++	"dsdt.aml", ++	"DSDT", ++	ACPI_DSDT_REV_2, ++	OEM_ID, ++	ACPI_TABLE_CREATOR, ++	0x20090811	// OEM revision ++) ++{ ++	#include <acpi/dsdt_top.asl> ++ ++	OSYS = 2002 ++	// global NVS and variables ++	#include <southbridge/intel/common/acpi/platform.asl> ++ ++	Device (\_SB.PCI0) ++	{ ++		#include <northbridge/intel/x4x/acpi/x4x.asl> ++		#include <southbridge/intel/i82801jx/acpi/ich10.asl> ++	} ++ ++	#include <southbridge/intel/common/acpi/sleepstates.asl> ++} +diff --git a/src/mainboard/dell/optiplex_780/gma-mainboard.ads b/src/mainboard/dell/optiplex_780/gma-mainboard.ads +new file mode 100644 +index 0000000000..bc81cf4a40 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/gma-mainboard.ads +@@ -0,0 +1,16 @@ ++-- SPDX-License-Identifier: GPL-2.0-or-later ++ ++with HW.GFX.GMA; ++with HW.GFX.GMA.Display_Probing; ++ ++use HW.GFX.GMA; ++use HW.GFX.GMA.Display_Probing; ++ ++private package GMA.Mainboard is ++ ++   ports : constant Port_List := ++     (DP2, ++      Analog, ++      others => Disabled); ++ ++end GMA.Mainboard; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt b/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..fefda9d6f226b88ab67c5b044de30a707df22fbf +GIT binary patch +literal 1917 +zcmd6nO>7%Q6vzLwGv0Mv$FUpJ*ik4iQd_wnX*X`M0y3~p?8a$~>ZXxZMU`4dc9RGb +zTXq_i1Bwd~aNr{c4i)r(goF^M-nek+sY0sMa}Sk>xFFy_FTEfX^Y+7unt+OgkeJbX +zznS;`v-5V=o<pVaS;}Q53%NpOI!8{cz{K0eVfK65_|*A}SF)Me%$4!N`H5-z90%~a +zvGog3fe5LjnM&o#3$<#k{6>{ZwwmnN>gY?}>{`7^JBpP$l`EBIwbi0*k&aU)n@v)E +znI_A1T57efS5MG<y}m-_+CrVKE#0VADDft%nb#Y<<ao9;Mf?!XvM)_$Xla>NN5_ut +zt=x`G)EjR#mlhURC^2!A3p33TcBg4-d8JyTiF&hfk}|a#&Dfe2%~V^}=4!QavNzBh +z0Pae^5`gfb?<R!YN+PQ)U7<%H;73qF3iyQT71$?W2s|f{69_4sRY(x>7Q)c(LsP)8 +zQy)2gw<F#IP`I}U>gG1S^>aw&0D}Z+-SCcJJF;s)yXJeQ|4N{SU?$I`#$HZa<Jq(M +zbA{r}Z0XY6<@U{Y-d!KWR>9dWBuxA$6X;VK;%W?Y>I;0P`|*vwAK$S(VB2JSq6g4n +z>oEf8XCt;_Y-iYBWz#<re{?il1^f{S#nht`VW!62^5R*KQ6_?#8e&Qw=9%`og2x!s +z&J)wlZ=a<yoJkutfwu4%aVXlu?i^8v?R77IyGvKcD|M`CFG$6FUmK8q<|o>3T9EmJ +z2x?*GPeN%?=Fj3+fv~4%I(nv~XF7VOqi5RsAt%13JtW>q=<<<Gei4)FzWqGEt6P8D +zA9m}s>;0IkLPSUGL%_1h)2kjaZzuV;`43yCV;I=#Jcyyw@xKE8GGX39@am|0GKhH` +zawsKv^FvHqm+<DDPT)%}_kZ8^eT88YGmG-#)X3=RRB|L^Uj_{yd%JeO<1HRZVz=Fz +z+aqUCWdF3_={#Q&&k)eF1i=WV`AbSlzo*bP?x?ir5BVVO`R34f89jWL{Z}or^BwmG +z-E;A_iWVUUWnWQl3L|~0xA@rHJRA-;7V)Y6B5=@E8R@?(?5{Eh23RefpSOGX_F{8A +z1PtU+iNng^h#C7J<vufJ9>c8*FfFsu??w)Oed@;Mg~21%rCZ%d{x!>-zmv4AyWL1E +xfz+CGUnQ7Y^TD}&c_cQRYlBC+`?m?k6Nuw??s04gg4@4`<@FO{XEbO(<xf!`#Pk3F + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c b/src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c +new file mode 100644 +index 0000000000..e2fa05cd8f +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c +@@ -0,0 +1,12 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++ ++#include <northbridge/intel/x4x/x4x.h> ++ ++void mb_get_spd_map(u8 spd_map[4]) ++{ ++	// BTX form factor ++	spd_map[0] = 0x53; ++	spd_map[1] = 0x52; ++	spd_map[2] = 0x51; ++	spd_map[3] = 0x50; ++} +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c b/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c +new file mode 100644 +index 0000000000..9993f17c55 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c +@@ -0,0 +1,174 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <southbridge/intel/common/gpio.h> ++ ++static const struct pch_gpio_set1 pch_gpio_set1_mode = { ++	.gpio0  = GPIO_MODE_NATIVE, ++	.gpio1  = GPIO_MODE_NATIVE, ++	.gpio2  = GPIO_MODE_GPIO, ++	.gpio3  = GPIO_MODE_GPIO, ++	.gpio4  = GPIO_MODE_GPIO, ++	.gpio5  = GPIO_MODE_GPIO, ++	.gpio6  = GPIO_MODE_GPIO, ++	.gpio7  = GPIO_MODE_NATIVE, ++	.gpio8  = GPIO_MODE_NATIVE, ++	.gpio9  = GPIO_MODE_GPIO, ++	.gpio10 = GPIO_MODE_GPIO, ++	.gpio11 = GPIO_MODE_NATIVE, ++	.gpio12 = GPIO_MODE_NATIVE, ++	.gpio13 = GPIO_MODE_GPIO, ++	.gpio14 = GPIO_MODE_GPIO, ++	.gpio15 = GPIO_MODE_NATIVE, ++	.gpio16 = GPIO_MODE_GPIO, ++	.gpio17 = GPIO_MODE_NATIVE, ++	.gpio18 = GPIO_MODE_GPIO, ++	.gpio19 = GPIO_MODE_GPIO, ++	.gpio20 = GPIO_MODE_GPIO, ++	.gpio21 = GPIO_MODE_GPIO, ++	.gpio22 = GPIO_MODE_GPIO, ++	.gpio23 = GPIO_MODE_NATIVE, ++	.gpio24 = GPIO_MODE_GPIO, ++	.gpio25 = GPIO_MODE_NATIVE, ++	.gpio26 = GPIO_MODE_NATIVE, ++	.gpio27 = GPIO_MODE_GPIO, ++	.gpio28 = GPIO_MODE_GPIO, ++	.gpio29 = GPIO_MODE_GPIO, ++	.gpio30 = GPIO_MODE_GPIO, ++	.gpio31 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_direction = { ++	.gpio2  = GPIO_DIR_INPUT, ++	.gpio3  = GPIO_DIR_INPUT, ++	.gpio4  = GPIO_DIR_INPUT, ++	.gpio5  = GPIO_DIR_INPUT, ++	.gpio6  = GPIO_DIR_INPUT, ++	.gpio9  = GPIO_DIR_OUTPUT, ++	.gpio10 = GPIO_DIR_INPUT, ++	.gpio13 = GPIO_DIR_INPUT, ++	.gpio14 = GPIO_DIR_INPUT, ++	.gpio16 = GPIO_DIR_INPUT, ++	.gpio18 = GPIO_DIR_OUTPUT, ++	.gpio19 = GPIO_DIR_INPUT, ++	.gpio20 = GPIO_DIR_OUTPUT, ++	.gpio21 = GPIO_DIR_INPUT, ++	.gpio22 = GPIO_DIR_INPUT, ++	.gpio24 = GPIO_DIR_INPUT, ++	.gpio27 = GPIO_DIR_INPUT, ++	.gpio28 = GPIO_DIR_OUTPUT, ++	.gpio29 = GPIO_DIR_INPUT, ++	.gpio30 = GPIO_DIR_INPUT, ++	.gpio31 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_level = { ++	.gpio9  = GPIO_LEVEL_HIGH, ++	.gpio18 = GPIO_LEVEL_HIGH, ++	.gpio20 = GPIO_LEVEL_HIGH, ++	.gpio28 = GPIO_LEVEL_LOW, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_blink = { ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_invert = { ++	.gpio13 = GPIO_INVERT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_mode = { ++	.gpio32 = GPIO_MODE_GPIO, ++	.gpio33 = GPIO_MODE_GPIO, ++	.gpio34 = GPIO_MODE_GPIO, ++	.gpio35 = GPIO_MODE_GPIO, ++	.gpio36 = GPIO_MODE_GPIO, ++	.gpio37 = GPIO_MODE_GPIO, ++	.gpio38 = GPIO_MODE_GPIO, ++	.gpio39 = GPIO_MODE_GPIO, ++	.gpio40 = GPIO_MODE_NATIVE, ++	.gpio41 = GPIO_MODE_NATIVE, ++	.gpio42 = GPIO_MODE_NATIVE, ++	.gpio43 = GPIO_MODE_NATIVE, ++	.gpio44 = GPIO_MODE_NATIVE, ++	.gpio45 = GPIO_MODE_NATIVE, ++	.gpio46 = GPIO_MODE_NATIVE, ++	.gpio47 = GPIO_MODE_NATIVE, ++	.gpio48 = GPIO_MODE_GPIO, ++	.gpio49 = GPIO_MODE_GPIO, ++	.gpio50 = GPIO_MODE_NATIVE, ++	.gpio51 = GPIO_MODE_NATIVE, ++	.gpio52 = GPIO_MODE_NATIVE, ++	.gpio53 = GPIO_MODE_NATIVE, ++	.gpio54 = GPIO_MODE_GPIO, ++	.gpio55 = GPIO_MODE_NATIVE, ++	.gpio56 = GPIO_MODE_GPIO, ++	.gpio57 = GPIO_MODE_GPIO, ++	.gpio58 = GPIO_MODE_NATIVE, ++	.gpio59 = GPIO_MODE_NATIVE, ++	.gpio60 = GPIO_MODE_GPIO, ++	.gpio61 = GPIO_MODE_NATIVE, ++	.gpio62 = GPIO_MODE_NATIVE, ++	.gpio63 = GPIO_MODE_NATIVE, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_direction = { ++	.gpio32 = GPIO_DIR_INPUT, ++	.gpio33 = GPIO_DIR_INPUT, ++	.gpio34 = GPIO_DIR_INPUT, ++	.gpio35 = GPIO_DIR_OUTPUT, ++	.gpio36 = GPIO_DIR_INPUT, ++	.gpio37 = GPIO_DIR_INPUT, ++	.gpio38 = GPIO_DIR_INPUT, ++	.gpio39 = GPIO_DIR_INPUT, ++	.gpio48 = GPIO_DIR_INPUT, ++	.gpio49 = GPIO_DIR_OUTPUT, ++	.gpio54 = GPIO_DIR_INPUT, ++	.gpio56 = GPIO_DIR_OUTPUT, ++	.gpio57 = GPIO_DIR_INPUT, ++	.gpio60 = GPIO_DIR_OUTPUT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_level = { ++	.gpio35 = GPIO_LEVEL_LOW, ++	.gpio49 = GPIO_LEVEL_HIGH, ++	.gpio56 = GPIO_LEVEL_HIGH, ++	.gpio60 = GPIO_LEVEL_LOW, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_mode = { ++	.gpio64 = GPIO_MODE_NATIVE, ++	.gpio65 = GPIO_MODE_NATIVE, ++	.gpio66 = GPIO_MODE_NATIVE, ++	.gpio67 = GPIO_MODE_NATIVE, ++	.gpio68 = GPIO_MODE_NATIVE, ++	.gpio69 = GPIO_MODE_NATIVE, ++	.gpio70 = GPIO_MODE_NATIVE, ++	.gpio71 = GPIO_MODE_NATIVE, ++	.gpio72 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_direction = { ++	.gpio72 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_level = { ++}; ++ ++const struct pch_gpio_map mainboard_gpio_map = { ++	.set1 = { ++		.mode      = &pch_gpio_set1_mode, ++		.direction = &pch_gpio_set1_direction, ++		.level     = &pch_gpio_set1_level, ++		.blink     = &pch_gpio_set1_blink, ++		.invert    = &pch_gpio_set1_invert, ++	}, ++	.set2 = { ++		.mode      = &pch_gpio_set2_mode, ++		.direction = &pch_gpio_set2_direction, ++		.level     = &pch_gpio_set2_level, ++	}, ++	.set3 = { ++		.mode      = &pch_gpio_set3_mode, ++		.direction = &pch_gpio_set3_direction, ++		.level     = &pch_gpio_set3_level, ++	}, ++}; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c b/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c +new file mode 100644 +index 0000000000..4158bcf899 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++ ++#include <device/azalia_device.h> ++ ++const u32 cim_verb_data[] = { ++	/* coreboot specific header */ ++	0x11d4194a, /* Analog Devices AD1984A */ ++	0xbfd40000, /*  Subsystem ID */ ++	10,         /* Number of entries */ ++ ++	/* Pin Widget Verb Table */ ++	AZALIA_PIN_CFG(0, 0x11, 0x032140f0), ++	AZALIA_PIN_CFG(0, 0x12, 0x21214010), ++	AZALIA_PIN_CFG(0, 0x13, 0x901701f0), ++	AZALIA_PIN_CFG(0, 0x14, 0x03a190f0), ++	AZALIA_PIN_CFG(0, 0x15, 0xb7a70121), ++	AZALIA_PIN_CFG(0, 0x16, 0x9933012e), ++	AZALIA_PIN_CFG(0, 0x17, 0x97a601f0), ++	AZALIA_PIN_CFG(0, 0x1a, 0x90f301f0), ++	AZALIA_PIN_CFG(0, 0x1b, 0x014510f0), ++	AZALIA_PIN_CFG(0, 0x1c, 0x21a19020), ++}; ++ ++const u32 pc_beep_verbs[0] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb b/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb +new file mode 100644 +index 0000000000..555b1c1f5c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb +@@ -0,0 +1,10 @@ ++## SPDX-License-Identifier: GPL-2.0-or-later ++ ++chip northbridge/intel/x4x ++	device domain 0 on ++		chip southbridge/intel/i82801jx ++			device pci 1c.0 on  end		# PCIe 1 ++			device pci 1c.1 on  end		# PCIe 2 ++		end ++	end ++end +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0030-mb-dell-optiplex_780-Add-USFF-variant.patch b/config/coreboot/default/patches/0030-mb-dell-optiplex_780-Add-USFF-variant.patch new file mode 100644 index 00000000..8ce7471b --- /dev/null +++ b/config/coreboot/default/patches/0030-mb-dell-optiplex_780-Add-USFF-variant.patch @@ -0,0 +1,326 @@ +From 6725ec0bb976c61cbe87e61bf0e8b02e38d14de9 Mon Sep 17 00:00:00 2001 +From: Nicholas Chin <nic.c3.14@gmail.com> +Date: Wed, 30 Oct 2024 20:55:25 -0600 +Subject: [PATCH 30/37] mb/dell/optiplex_780: Add USFF variant + +Change-Id: I3aa21c743749f4a11a2501f4c121316bd2f1a103 +Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com> +--- + src/mainboard/dell/optiplex_780/Kconfig       |   5 + + src/mainboard/dell/optiplex_780/Kconfig.name  |   3 + + .../optiplex_780/variants/780_usff/data.vbt   | Bin 0 -> 1917 bytes + .../variants/780_usff/early_init.c            |   9 + + .../optiplex_780/variants/780_usff/gpio.c     | 166 ++++++++++++++++++ + .../optiplex_780/variants/780_usff/hda_verb.c |  26 +++ + .../variants/780_usff/overridetree.cb         |  10 ++ + 7 files changed, 219 insertions(+) + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb + +diff --git a/src/mainboard/dell/optiplex_780/Kconfig b/src/mainboard/dell/optiplex_780/Kconfig +index 2d06c75c9a..fc649e35d5 100644 +--- a/src/mainboard/dell/optiplex_780/Kconfig ++++ b/src/mainboard/dell/optiplex_780/Kconfig +@@ -20,6 +20,9 @@ config BOARD_DELL_OPTIPLEX_780_COMMON + config BOARD_DELL_OPTIPLEX_780_MT + 	select BOARD_DELL_OPTIPLEX_780_COMMON +  ++config BOARD_DELL_OPTIPLEX_780_USFF ++	select BOARD_DELL_OPTIPLEX_780_COMMON ++ + if BOARD_DELL_OPTIPLEX_780_COMMON +  + config VGA_BIOS_ID +@@ -30,11 +33,13 @@ config MAINBOARD_DIR +  + config MAINBOARD_PART_NUMBER + 	default "OptiPlex 780 MT" if BOARD_DELL_OPTIPLEX_780_MT ++	default "OptiPlex 780 USFF" if BOARD_DELL_OPTIPLEX_780_USFF +  + config OVERRIDE_DEVICETREE + 	default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" +  + config VARIANT_DIR + 	default "780_mt" if BOARD_DELL_OPTIPLEX_780_MT ++	default "780_usff" if BOARD_DELL_OPTIPLEX_780_USFF +  + endif # BOARD_DELL_OPTIPLEX_780_COMMON +diff --git a/src/mainboard/dell/optiplex_780/Kconfig.name b/src/mainboard/dell/optiplex_780/Kconfig.name +index db7f2e8fe3..bc84c82a79 100644 +--- a/src/mainboard/dell/optiplex_780/Kconfig.name ++++ b/src/mainboard/dell/optiplex_780/Kconfig.name +@@ -2,3 +2,6 @@ +  + config BOARD_DELL_OPTIPLEX_780_MT + 	bool "OptiPlex 780 MT" ++ ++config BOARD_DELL_OPTIPLEX_780_USFF ++	bool "OptiPlex 780 USFF" +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt b/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..dbd764f285ed18f7ee9c54bc777560138bd9b5f7 +GIT binary patch +literal 1917 +zcmd6nO>7%Q6vzLwGv3{}j$^l`v7@w1q*9sEq+2(b3K>`@c5#TSx@i<uQKf!)+gO;| +zveT#>P+W+B10OwbsGtX=N(gc4jSGjKDkP+yIUo^nsel8$^ny^9H?td8Ra=EiCEn=G +z@6DV4?!2AdojnUv^Rirgvs$heXUkGs9S+{Jc2WPhP0buTak^BTFP@&N9-E$(UtuSX +zS{r`=b+EX|Ig`2a*^5oDdG>8jE-1BBxs`*jgrf_sj_fP;%L|PwURRcCFBMCroNRQv +zmp$2TUhc}qJMB(u#jDG@x6(N85thC4%Z=8hiN}lj&zb2~``u3C;?lCrPQOTnInFqB +zhvdwqWv?lxTb=fVEH;~RPHDPw&g*&|s$pU<Iv53Rb6YTgMPOY8;~P1Yglh^6Fgt1^ +zCTz|SVPcSpZ44F@&oNPUMO@&BE3y(57YP_Y!4SZhE?GXYa7k+b0(X|s7u3GDRf^1# +zOd2ZCCPO|I&sHEt;p8UshhHtYQ>7!7x2m<d`Gu2<r+Qc4|6pwd8&zFboH_W7XE7uU +zWW-@Cim&mdY2!O{JANR)OTJG2z>LBtAF!g>K`zPnkx!DpPHuk6{_zc*0qi7)Aet$T +z1ks@8hWS#+6cI5)j1oD86{5PX8Zu2(^OC6M`<pE+J?KFZ=&_JVP1YL=#z<-Q*24K4 +zn+$YxrHNJJc`k?_8N=Kres26_#E8GLn2{jfW5P%ge`kL(Btkt=>xo)V)Ow=U6P12c +z=U0uNC9T9v{)-|#h(mSX*hSA8)ZeocL7l4J&!{RSO{6~oTtyn535j!RQh#GA*wTF8 +zvasRbO~d!?*FbM3K`W?lHx=v*(jiARIhWyh4^io|;n?@1H>uqJy>0sjV-Dt)_=%bE +zgNO3D@uE5m+7aqi?Y8b+inye%Z=HUmgBtaZ3Lc%OLt+bo+)5BjVwT<{mxT`nde$vb +zV99s{>`r76L#Hr6XW6r|<iq#4Jr?XsxKyeJKEj7;e4SZ^1B12u&iV_9M0*Kem@fmn +z1C>>HT47I`**Q#Vu0QW!^VP-9S{xXzpq_zS#9k-;aXz?b+S!Ne$Kkk6dq<Gj{q2D( +z>&Hj-x+kx1W-4#E&beDT*S)=&NoSE?<-w!G@~aW()0ZN4O&=Q+nZa)p%Vd$k-_$a= +T#w3FFBiyj<XAh$hb(enud`r7S + +literal 0 +HcmV?d00001 + +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c b/src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c +new file mode 100644 +index 0000000000..2a55fc3a6e +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c +@@ -0,0 +1,9 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++ ++#include <northbridge/intel/x4x/x4x.h> ++ ++void mb_get_spd_map(u8 spd_map[4]) ++{ ++	spd_map[0] = 0x50; ++	spd_map[2] = 0x52; ++} +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c b/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c +new file mode 100644 +index 0000000000..389f4077d7 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c +@@ -0,0 +1,166 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include <southbridge/intel/common/gpio.h> ++ ++static const struct pch_gpio_set1 pch_gpio_set1_mode = { ++	.gpio0  = GPIO_MODE_NATIVE, ++	.gpio1  = GPIO_MODE_NATIVE, ++	.gpio2  = GPIO_MODE_GPIO, ++	.gpio3  = GPIO_MODE_GPIO, ++	.gpio4  = GPIO_MODE_GPIO, ++	.gpio5  = GPIO_MODE_GPIO, ++	.gpio6  = GPIO_MODE_GPIO, ++	.gpio7  = GPIO_MODE_NATIVE, ++	.gpio8  = GPIO_MODE_NATIVE, ++	.gpio9  = GPIO_MODE_GPIO, ++	.gpio10 = GPIO_MODE_GPIO, ++	.gpio11 = GPIO_MODE_NATIVE, ++	.gpio12 = GPIO_MODE_NATIVE, ++	.gpio13 = GPIO_MODE_GPIO, ++	.gpio14 = GPIO_MODE_GPIO, ++	.gpio15 = GPIO_MODE_NATIVE, ++	.gpio16 = GPIO_MODE_GPIO, ++	.gpio17 = GPIO_MODE_NATIVE, ++	.gpio18 = GPIO_MODE_GPIO, ++	.gpio19 = GPIO_MODE_GPIO, ++	.gpio20 = GPIO_MODE_GPIO, ++	.gpio21 = GPIO_MODE_GPIO, ++	.gpio22 = GPIO_MODE_GPIO, ++	.gpio23 = GPIO_MODE_NATIVE, ++	.gpio24 = GPIO_MODE_GPIO, ++	.gpio25 = GPIO_MODE_NATIVE, ++	.gpio26 = GPIO_MODE_NATIVE, ++	.gpio27 = GPIO_MODE_GPIO, ++	.gpio28 = GPIO_MODE_GPIO, ++	.gpio29 = GPIO_MODE_GPIO, ++	.gpio30 = GPIO_MODE_GPIO, ++	.gpio31 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_direction = { ++	.gpio2  = GPIO_DIR_INPUT, ++	.gpio3  = GPIO_DIR_INPUT, ++	.gpio4  = GPIO_DIR_INPUT, ++	.gpio5  = GPIO_DIR_INPUT, ++	.gpio6  = GPIO_DIR_INPUT, ++	.gpio9  = GPIO_DIR_OUTPUT, ++	.gpio10 = GPIO_DIR_INPUT, ++	.gpio13 = GPIO_DIR_INPUT, ++	.gpio14 = GPIO_DIR_INPUT, ++	.gpio16 = GPIO_DIR_INPUT, ++	.gpio18 = GPIO_DIR_OUTPUT, ++	.gpio19 = GPIO_DIR_INPUT, ++	.gpio20 = GPIO_DIR_OUTPUT, ++	.gpio21 = GPIO_DIR_INPUT, ++	.gpio22 = GPIO_DIR_INPUT, ++	.gpio24 = GPIO_DIR_INPUT, ++	.gpio27 = GPIO_DIR_INPUT, ++	.gpio28 = GPIO_DIR_OUTPUT, ++	.gpio29 = GPIO_DIR_INPUT, ++	.gpio30 = GPIO_DIR_INPUT, ++	.gpio31 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_level = { ++	.gpio9  = GPIO_LEVEL_HIGH, ++	.gpio18 = GPIO_LEVEL_HIGH, ++	.gpio20 = GPIO_LEVEL_HIGH, ++	.gpio28 = GPIO_LEVEL_HIGH, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_blink = { ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_invert = { ++	.gpio13 = GPIO_INVERT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_mode = { ++	.gpio32 = GPIO_MODE_GPIO, ++	.gpio33 = GPIO_MODE_GPIO, ++	.gpio34 = GPIO_MODE_GPIO, ++	.gpio35 = GPIO_MODE_GPIO, ++	.gpio36 = GPIO_MODE_GPIO, ++	.gpio37 = GPIO_MODE_GPIO, ++	.gpio38 = GPIO_MODE_GPIO, ++	.gpio39 = GPIO_MODE_GPIO, ++	.gpio40 = GPIO_MODE_NATIVE, ++	.gpio41 = GPIO_MODE_NATIVE, ++	.gpio42 = GPIO_MODE_NATIVE, ++	.gpio43 = GPIO_MODE_NATIVE, ++	.gpio44 = GPIO_MODE_NATIVE, ++	.gpio45 = GPIO_MODE_NATIVE, ++	.gpio46 = GPIO_MODE_NATIVE, ++	.gpio47 = GPIO_MODE_NATIVE, ++	.gpio48 = GPIO_MODE_GPIO, ++	.gpio49 = GPIO_MODE_GPIO, ++	.gpio50 = GPIO_MODE_NATIVE, ++	.gpio51 = GPIO_MODE_NATIVE, ++	.gpio52 = GPIO_MODE_NATIVE, ++	.gpio53 = GPIO_MODE_NATIVE, ++	.gpio54 = GPIO_MODE_GPIO, ++	.gpio55 = GPIO_MODE_NATIVE, ++	.gpio56 = GPIO_MODE_GPIO, ++	.gpio57 = GPIO_MODE_GPIO, ++	.gpio58 = GPIO_MODE_NATIVE, ++	.gpio59 = GPIO_MODE_NATIVE, ++	.gpio60 = GPIO_MODE_GPIO, ++	.gpio61 = GPIO_MODE_NATIVE, ++	.gpio62 = GPIO_MODE_NATIVE, ++	.gpio63 = GPIO_MODE_NATIVE, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_direction = { ++	.gpio32 = GPIO_DIR_INPUT, ++	.gpio33 = GPIO_DIR_INPUT, ++	.gpio34 = GPIO_DIR_INPUT, ++	.gpio35 = GPIO_DIR_OUTPUT, ++	.gpio36 = GPIO_DIR_INPUT, ++	.gpio37 = GPIO_DIR_INPUT, ++	.gpio38 = GPIO_DIR_INPUT, ++	.gpio39 = GPIO_DIR_INPUT, ++	.gpio48 = GPIO_DIR_INPUT, ++	.gpio49 = GPIO_DIR_OUTPUT, ++	.gpio54 = GPIO_DIR_INPUT, ++	.gpio56 = GPIO_DIR_OUTPUT, ++	.gpio57 = GPIO_DIR_INPUT, ++	.gpio60 = GPIO_DIR_OUTPUT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_level = { ++	.gpio35 = GPIO_LEVEL_LOW, ++	.gpio49 = GPIO_LEVEL_HIGH, ++	.gpio56 = GPIO_LEVEL_HIGH, ++	.gpio60 = GPIO_LEVEL_LOW, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_mode = { ++	.gpio72 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_direction = { ++	.gpio72 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_level = { ++}; ++ ++const struct pch_gpio_map mainboard_gpio_map = { ++	.set1 = { ++		.mode      = &pch_gpio_set1_mode, ++		.direction = &pch_gpio_set1_direction, ++		.level     = &pch_gpio_set1_level, ++		.blink     = &pch_gpio_set1_blink, ++		.invert    = &pch_gpio_set1_invert, ++	}, ++	.set2 = { ++		.mode      = &pch_gpio_set2_mode, ++		.direction = &pch_gpio_set2_direction, ++		.level     = &pch_gpio_set2_level, ++	}, ++	.set3 = { ++		.mode      = &pch_gpio_set3_mode, ++		.direction = &pch_gpio_set3_direction, ++		.level     = &pch_gpio_set3_level, ++	}, ++}; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c b/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c +new file mode 100644 +index 0000000000..c94e06b156 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++ ++#include <device/azalia_device.h> ++ ++const u32 cim_verb_data[] = { ++	/* coreboot specific header */ ++	0x11d4194a, /* Analog Devices AD1984A */ ++	0x10280420, /*  Subsystem ID */ ++	10,         /* Number of entries */ ++ ++	/* Pin Widget Verb Table */ ++	AZALIA_PIN_CFG(0, 0x11, 0x02214040), ++	AZALIA_PIN_CFG(0, 0x12, 0x01014010), ++	AZALIA_PIN_CFG(0, 0x13, 0x991301f0), ++	AZALIA_PIN_CFG(0, 0x14, 0x02a19020), ++	AZALIA_PIN_CFG(0, 0x15, 0x01813030), ++	AZALIA_PIN_CFG(0, 0x16, 0x413301f0), ++	AZALIA_PIN_CFG(0, 0x17, 0x41a601f0), ++	AZALIA_PIN_CFG(0, 0x1a, 0x41f301f0), ++	AZALIA_PIN_CFG(0, 0x1b, 0x414501f0), ++	AZALIA_PIN_CFG(0, 0x1c, 0x413301f0), ++}; ++ ++const u32 pc_beep_verbs[0] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb b/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb +new file mode 100644 +index 0000000000..555b1c1f5c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb +@@ -0,0 +1,10 @@ ++## SPDX-License-Identifier: GPL-2.0-or-later ++ ++chip northbridge/intel/x4x ++	device domain 0 on ++		chip southbridge/intel/i82801jx ++			device pci 1c.0 on  end		# PCIe 1 ++			device pci 1c.1 on  end		# PCIe 2 ++		end ++	end ++end +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0031-dell-3050micro-disable-nvme-hotplug.patch b/config/coreboot/default/patches/0031-dell-3050micro-disable-nvme-hotplug.patch new file mode 100644 index 00000000..c154a9a1 --- /dev/null +++ b/config/coreboot/default/patches/0031-dell-3050micro-disable-nvme-hotplug.patch @@ -0,0 +1,49 @@ +From 4ffaddc37d30d39f25faeaef73046a6e2ce525e8 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 11 Dec 2024 01:06:01 +0000 +Subject: [PATCH 31/37] dell/3050micro: disable nvme hotplug + +in my testing, when running my 3050micro for a few days, +the nvme would sometimes randomly rename. + +e.g. nvme0n1 renamed to nvme0n2 + +this might cause crashes in linux, if booting only from the +nvme. in my case, i was booting from mdraid (sata+nvme) and +every few days, the nvme would rename at least once, causing +my RAID to become unsynced. since i'm using RAID1, this was +OK and I could simply re-sync the array, but this is quite +precarious indeed. if you're using raid0, that will potentially +corrupt your RAID array indefinitely. + +this same issue manifested on the T480/T480 thinkpads, and +S3 resume would break because of that, when booting from nvme, +because the nvme would be "unplugged" and appear to linux as a +new device (the one that you booted from). + +the fix there was to disable hotplugging on that pci-e slot +for the nvme, so apply the same fix here for 3050 micro + +Signed-off-by: Leah Rowe <leah@libreboot.org> +--- + src/mainboard/dell/optiplex_3050/devicetree.cb | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/mainboard/dell/optiplex_3050/devicetree.cb b/src/mainboard/dell/optiplex_3050/devicetree.cb +index da11085ab6..2a97306c5d 100644 +--- a/src/mainboard/dell/optiplex_3050/devicetree.cb ++++ b/src/mainboard/dell/optiplex_3050/devicetree.cb +@@ -45,7 +45,9 @@ chip soc/intel/skylake + 			register "PcieRpAdvancedErrorReporting[20]"     = "1" + 			register "PcieRpLtrEnable[20]"                  = "true" + 			register "PcieRpClkSrcNumber[20]"               = "3" +-			register "PcieRpHotPlug[20]"                    = "1" ++# disable hotplug on nvme to prevent renaming e.g. nvme0n1 rename to nvme0n2, ++# which could cause crashes in linux if booting from nvme ++			register "PcieRpHotPlug[20]"                    = "0" + 		end +  + 		# Realtek LAN +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0032-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch b/config/coreboot/default/patches/0032-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch new file mode 100644 index 00000000..e60c102f --- /dev/null +++ b/config/coreboot/default/patches/0032-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch @@ -0,0 +1,78 @@ +From 5d8930edfa1d9537ba80e24c0cf8f0c9e4e9ec72 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 18 Dec 2024 02:06:18 +0000 +Subject: [PATCH 32/37] lenovo: Add Kconfig option CONFIG_LENOVO_TBFW_BIN + +This is used by lbmk to know where a tb.bin file goes, +when extracting and padding TBT.bin from Lenovo ThunderBolt +firmware updates on T480/T480s and other machines, grabbing +Lenovo update files. + +Not used in any builds, so it's not relevant for ./mk inject + +However, the ThunderBolt firmware is now auto-downloaded on +T480/T480s. This is not inserted, because it doesn't go in +the main flash, but the resulting ROM image can be flashed +on the TB controller's separate flash chip. + +Locations are as follows: + +vendorfiles/t480s/tb.bin +vendorfiles/t480/tb.bin + +This can be used for other affected ThinkPads when they're +added to Libreboot, but note that Lenovo provides different +TB firmware files for each machine. + +Since I assume it's the same TB controller on all of those +machines, I have to wonder: what difference is there between +the various TBT.bin files provided by Lenovo, and how do they +differ in terms of actual flashed configuration? + +We simply flash the padded TBT.bin when updating the firmware, +flashing externally. That's what this patch is for, so that +lbmk can auto-download them. + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + src/mainboard/lenovo/Kconfig | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/src/mainboard/lenovo/Kconfig b/src/mainboard/lenovo/Kconfig +index 2ffbaab85f..512b326381 100644 +--- a/src/mainboard/lenovo/Kconfig ++++ b/src/mainboard/lenovo/Kconfig +@@ -18,4 +18,30 @@ config MAINBOARD_FAMILY + 	string + 	default MAINBOARD_PART_NUMBER +  ++config LENOVO_TBFW_BIN ++	string "Lenovo ThunderBolt firmware bin file" ++	default "" ++	help ++	  ThunderBolt firmware for certain ThinkPad models e.g. T480. ++	  Not used in the actual build. Libreboot's build system uses this ++	  along with config/vendor/*/pkg.cfg entries defining a URL to the ++	  Lenovo download link and hash. The resulting file when processed by ++	  lbmk can be flashed to the ThunderBolt firmware's 25XX NOR device. ++	  Earlier versions of this firmware had debug commands enabled that ++	  sent logs to said flash IC, and it would quickly fill up, bricking ++	  the ThunderBolt controller. With these updates, flashed externally, ++	  you can fix the issue if present or otherwise prevent it. The benefit ++	  here is that you then don't need to use Windows or a boot disk. You ++	  can flash the TB firmware while flashing Libreboot firmware. Easy! ++	  Look for these variables in lbmk: ++	  TBFW_url TBFW_url_bkup TBFW_hash and look at how it handles that and ++	  CONFIG_LENOVO_TBFW_BIN, in lbmk's include/vendor.sh file. ++	  The path set by CONFIG_LENOVO_TBFW_BIN is used by lbmk when extracting ++	  the firmware, putting it at that desired location. In this way, lbmk ++	  can auto-download such firmware. E.g. ./mk -d coreboot t480_fsp_16mb ++	  and it appears at vendorfiles/t480/tb.bin fully padded and everything! ++ ++	  Just leave this blank if you don't care about this option. It's not ++	  useful for every ThinkPad, only certain models. ++ + endif # VENDOR_LENOVO +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0033-soc-intel-skylake-Don-t-compress-FSP-S.patch b/config/coreboot/default/patches/0033-soc-intel-skylake-Don-t-compress-FSP-S.patch new file mode 100644 index 00000000..a7ab5a96 --- /dev/null +++ b/config/coreboot/default/patches/0033-soc-intel-skylake-Don-t-compress-FSP-S.patch @@ -0,0 +1,36 @@ +From 49cee334bc7fe9a78b9355b5256a37984bac385a Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Thu, 26 Dec 2024 19:45:20 +0000 +Subject: [PATCH 33/37] soc/intel/skylake: Don't compress FSP-S + +Build systems like lbmk need to reproducibly insert +certain vendor files on release images. + +Compression isn't always reproducible, and making it +so costs a lot more time than simply disabling compression. + +With this change, the FSP-S module will now be inserted +without compression, which means that there will now be +about 40KB of extra space used in the flash. + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + src/soc/intel/skylake/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig +index 9191ed0ff8..d51ffaef7b 100644 +--- a/src/soc/intel/skylake/Kconfig ++++ b/src/soc/intel/skylake/Kconfig +@@ -12,7 +12,7 @@ config SOC_INTEL_COMMON_SKYLAKE_BASE + 	select CPU_SUPPORTS_PM_TIMER_EMULATION + 	select DRIVERS_USB_ACPI + 	select EDK2_CPU_TIMER_LIB if PAYLOAD_EDK2 +-	select FSP_COMPRESS_FSP_S_LZ4 ++#	select FSP_COMPRESS_FSP_S_LZ4 + 	select FSP_M_XIP + 	select GENERIC_GPIO_LIB + 	select HAVE_FSP_GOP +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0034-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch b/config/coreboot/default/patches/0034-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch new file mode 100644 index 00000000..ceee75c4 --- /dev/null +++ b/config/coreboot/default/patches/0034-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch @@ -0,0 +1,82 @@ +From 09740dc9d43a8dc24b7416b70476796515af6581 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Tue, 31 Dec 2024 01:40:42 +0000 +Subject: [PATCH 34/37] soc/intel/pmc: Hardcoded poweroff after power fail + +Coreboot can set the power state for power on after previous +power failure, based on the option table. On the ThinkPad T480, +we have no nvram and, due to coreboot's design, we therefore +have no option table, so the default setting is enabled. + +In my testing, this seems to be that the system will turn on +after a power failure. If your ThinkPad was previously in a state +where it wouldn't turn on when plugging in the power, it'd be fine. + +If your battery ran out later on, this would be triggered and +your ThinkPad would permanently turn on, when plugging in a charger, +and there is currently no way to configure this behaviour. + +We currently only use the common SoC PMC code on the ThinkPad +T480, T480s and the Dell OptiPlex 3050 Micro, at the time of +this patch, and it is desirable that the system be set to power +off after power fail anyway. + +In some cases, you might want the opposite, for example if you're +running a server. This will be documented on the website, for that +reason. + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + src/soc/intel/common/block/pmc/pmclib.c | 36 +++---------------------- + 1 file changed, 4 insertions(+), 32 deletions(-) + +diff --git a/src/soc/intel/common/block/pmc/pmclib.c b/src/soc/intel/common/block/pmc/pmclib.c +index 64b9bb997c..7823775bcb 100644 +--- a/src/soc/intel/common/block/pmc/pmclib.c ++++ b/src/soc/intel/common/block/pmc/pmclib.c +@@ -776,38 +776,10 @@ void pmc_clear_pmcon_sts(void) +  + void pmc_set_power_failure_state(const bool target_on) + { +-	const unsigned int state = get_uint_option("power_on_after_fail", +-					 CONFIG_MAINBOARD_POWER_FAILURE_STATE); +- +-	/* +-	 * On the shutdown path (target_on == false), we only need to +-	 * update the register for MAINBOARD_POWER_STATE_PREVIOUS. For +-	 * all other cases, we don't write the register to avoid clob- +-	 * bering the value set on the boot path. This is necessary, +-	 * for instance, when we can't access the option backend in SMM. +-	 */ +- +-	switch (state) { +-	case MAINBOARD_POWER_STATE_OFF: +-		if (!target_on) +-			break; +-		printk(BIOS_INFO, "Set power off after power failure.\n"); +-		pmc_soc_set_afterg3_en(false); +-		break; +-	case MAINBOARD_POWER_STATE_ON: +-		if (!target_on) +-			break; +-		printk(BIOS_INFO, "Set power on after power failure.\n"); +-		pmc_soc_set_afterg3_en(true); +-		break; +-	case MAINBOARD_POWER_STATE_PREVIOUS: +-		printk(BIOS_INFO, "Keep power state after power failure.\n"); +-		pmc_soc_set_afterg3_en(target_on); +-		break; +-	default: +-		printk(BIOS_WARNING, "Unknown power-failure state: %d\n", state); +-		break; +-	} ++	if (!target_on) ++		return; ++	printk(BIOS_INFO, "Set power off after power failure.\n"); ++	pmc_soc_set_afterg3_en(false); + } +  + /* This function returns the highest assertion duration of the SLP_Sx assertion widths */ +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0035-src-intel-skylake-Disable-stack-overflow-debug-optio.patch b/config/coreboot/default/patches/0035-src-intel-skylake-Disable-stack-overflow-debug-optio.patch new file mode 100644 index 00000000..eb5f0028 --- /dev/null +++ b/config/coreboot/default/patches/0035-src-intel-skylake-Disable-stack-overflow-debug-optio.patch @@ -0,0 +1,61 @@ +From 18f4e970ebda43dd538f74398aea463a67040dd3 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <leah@libreboot.org> +Date: Mon, 6 Jan 2025 01:36:23 +0000 +Subject: [PATCH 35/37] src/intel/skylake: Disable stack overflow debug options + +The option was appearing in T480/3050micro configs of lbmk, +after updating on the coreboot/next uprev for 20241206 rev8: + +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y + +I did some digging. See coreboot commit: + +commit 51cc2bacb6b07279b97e9934d079060475481fb6 +Author: Subrata Banik <subratabanik@google.com> +Date:   Fri Dec 13 13:07:28 2024 +0530 + +    soc/intel/pantherlake: Disable stack overflow debug options + +Well now: + +I'm disabling this behaviour on Skylake, for the same +behaviour, because I want as few behaviour changes in general, +as possible, for the rev8 release. + +According to Subrata's patch, which was for Pantherlake, +without this change, stack corruption can occur on verstage +and romstage early on. Please look at that coreboot patch, +referenced above, for clarity. + +I see no harm in disabling this option for Skylake, since +the behaviour that it otherwise enables was not present +before. + +Signed-off-by: Leah Rowe <leah@libreboot.org> +--- + src/soc/intel/skylake/Kconfig | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig +index d51ffaef7b..42af82a5d8 100644 +--- a/src/soc/intel/skylake/Kconfig ++++ b/src/soc/intel/skylake/Kconfig +@@ -129,6 +129,15 @@ config DCACHE_RAM_SIZE + 	  The size of the cache-as-ram region required during bootblock + 	  and/or romstage. +  ++# Override DEBUG Kconfig to avoid false alarm about stack overflow. ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS ++	bool ++	default n ++ ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS_IN_ALL_STAGES ++	bool ++	default n ++ + config DCACHE_BSP_STACK_SIZE + 	hex + 	default 0x20400 if FSP_USES_CB_STACK +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0036-src-intel-x4x-Disable-stack-overflow-debug.patch b/config/coreboot/default/patches/0036-src-intel-x4x-Disable-stack-overflow-debug.patch new file mode 100644 index 00000000..2e06ad79 --- /dev/null +++ b/config/coreboot/default/patches/0036-src-intel-x4x-Disable-stack-overflow-debug.patch @@ -0,0 +1,33 @@ +From 8dcd86c34d92b9b17bcfe4c7c61793042dc97268 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <leah@libreboot.org> +Date: Mon, 6 Jan 2025 01:53:53 +0000 +Subject: [PATCH 36/37] src/intel/x4x: Disable stack overflow debug + +Signed-off-by: Leah Rowe <leah@libreboot.org> +--- + src/northbridge/intel/x4x/Kconfig | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/northbridge/intel/x4x/Kconfig b/src/northbridge/intel/x4x/Kconfig +index 1803ef5733..7129aabf72 100644 +--- a/src/northbridge/intel/x4x/Kconfig ++++ b/src/northbridge/intel/x4x/Kconfig +@@ -32,6 +32,15 @@ config ECAM_MMCONF_BUS_NUMBER + 	int + 	default 256 +  ++# Override DEBUG Kconfig to avoid false alarm about stack overflow. ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS ++	bool ++	default n ++ ++config DEBUG_STACK_OVERFLOW_BREAKPOINTS_IN_ALL_STAGES ++	bool ++	default n ++ + # This number must be equal or lower than what's reported in ACPI PCI _CRS + config DOMAIN_RESOURCE_32BIT_LIMIT + 	default 0xfec00000 +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0037-Conditional-TBFW-setting-for-T480-T480S.patch b/config/coreboot/default/patches/0037-Conditional-TBFW-setting-for-T480-T480S.patch new file mode 100644 index 00000000..7bca06a7 --- /dev/null +++ b/config/coreboot/default/patches/0037-Conditional-TBFW-setting-for-T480-T480S.patch @@ -0,0 +1,37 @@ +From 9b547c2029611793f895117a807fa2d2c22a5332 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <leah@libreboot.org> +Date: Mon, 21 Apr 2025 05:14:45 +0100 +Subject: [PATCH 37/37] Conditional TBFW setting for T480/T480S + +Otherwise, other boards will define it, which +might trigger the vendor download script, and +lead to a non-zero exit. + +Signed-off-by: Leah Rowe <leah@libreboot.org> +--- + src/mainboard/lenovo/Kconfig | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/mainboard/lenovo/Kconfig b/src/mainboard/lenovo/Kconfig +index 512b326381..3d3490b35d 100644 +--- a/src/mainboard/lenovo/Kconfig ++++ b/src/mainboard/lenovo/Kconfig +@@ -18,6 +18,8 @@ config MAINBOARD_FAMILY + 	string + 	default MAINBOARD_PART_NUMBER +  ++if BOARD_LENOVO_T480 || BOARD_LENOVO_T480S ++ + config LENOVO_TBFW_BIN + 	string "Lenovo ThunderBolt firmware bin file" + 	default "" +@@ -44,4 +46,6 @@ config LENOVO_TBFW_BIN + 	  Just leave this blank if you don't care about this option. It's not + 	  useful for every ThinkPad, only certain models. +  ++endif # BOARD LENOVO_T480 || BOARD_LENOVO_T480S ++ + endif # VENDOR_LENOVO +--  +2.39.5 + diff --git a/config/coreboot/default/patches/0038-do-not-break-building-other-thinkpads-with-the-hacks.patch b/config/coreboot/default/patches/0038-do-not-break-building-other-thinkpads-with-the-hacks.patch new file mode 100644 index 00000000..87cde056 --- /dev/null +++ b/config/coreboot/default/patches/0038-do-not-break-building-other-thinkpads-with-the-hacks.patch @@ -0,0 +1,153 @@ +From 49204919e885dca2be45ffbaf2f5af62109ec3a7 Mon Sep 17 00:00:00 2001 +From: gaspar-ilom <gasparilom@riseup.net> +Date: Thu, 6 Mar 2025 23:00:00 +0000 +Subject: [PATCH 1/1] do not break building other thinkpads with the hacks for + the t480/s made Mate Kukri + +still not fixing things properly but at least it should now be possible to build older thinkpads without regressions. +prior, some code was just commented or unreachable. now we make this explicit with preprocessor directives. +heads should build all boards on this coreboot version from the same coreboot tree. + +Signed-off-by: gaspar-ilom <gasparilom@riseup.net> +--- + src/device/pci_rom.c         |  9 ++++++--- + src/ec/lenovo/h8/acpi/ec.asl |  4 +++- + src/ec/lenovo/h8/bluetooth.c | 14 ++++++++++---- + src/ec/lenovo/h8/wwan.c      | 14 ++++++++++---- + 4 files changed, 29 insertions(+), 12 deletions(-) + +diff --git a/src/device/pci_rom.c b/src/device/pci_rom.c +index bba98d9dea..db3dbbe2ce 100644 +--- a/src/device/pci_rom.c ++++ b/src/device/pci_rom.c +@@ -396,16 +396,19 @@ void pci_rom_ssdt(const struct device *device) + 		rom = cbrom; + 	} +  +-#if 0 ++ ++	#if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++	const char *scope = "\\_SB.PCI0.RP01.PEGP"; ++	#else + 	const char *scope = acpi_device_path(device); ++	#endif + 	if (!scope) { + 		printk(BIOS_ERR, "%s: Missing ACPI scope\n", dev_path(device)); + 		return; + 	} +-#endif +  + 	/* write _ROM method */ +-	acpigen_write_scope("\\_SB.PCI0.RP01.PEGP"); ++	acpigen_write_scope(scope); + 	acpigen_write_rom((void *)rom, rom->size * 512); + 	acpigen_pop_len(); /* pop scope */ + } +diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl +index 8f4a8e1986..f80c15106c 100644 +--- a/src/ec/lenovo/h8/acpi/ec.asl ++++ b/src/ec/lenovo/h8/acpi/ec.asl +@@ -331,7 +331,9 @@ Device(EC) + #include "sleepbutton.asl" + #include "lid.asl" + #include "beep.asl" +-//#include "thermal.asl" ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++#include "thermal.asl" ++#endif + #include "systemstatus.asl" + #include "thinkpad.asl" + } +diff --git a/src/ec/lenovo/h8/bluetooth.c b/src/ec/lenovo/h8/bluetooth.c +index be71a24ced..e60b6c088c 100644 +--- a/src/ec/lenovo/h8/bluetooth.c ++++ b/src/ec/lenovo/h8/bluetooth.c +@@ -1,6 +1,8 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ +  +-// #include <southbridge/intel/common/gpio.h> ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++#include <southbridge/intel/common/gpio.h> ++#endif + #include <console/console.h> + #include <device/device.h> + #include <ec/acpi/ec.h> +@@ -26,23 +28,27 @@ void h8_bluetooth_enable(int on) +  */ + bool h8_has_bdc(const struct device *dev) + { ++	#if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++	printk(BIOS_INFO, "H8: BDC detection not implemented. " ++			  "Assuming BDC installed\n"); ++	return true; ++	#else + 	struct ec_lenovo_h8_config *conf = dev->chip_info; +  +-	if (1 || !conf->has_bdc_detection) { ++	if (!conf->has_bdc_detection) { + 		printk(BIOS_INFO, "H8: BDC detection not implemented. " + 				  "Assuming BDC installed\n"); + 		return true; + 	} +  +-#if 0 + 	if (get_gpio(conf->bdc_gpio_num) == conf->bdc_gpio_lvl) { + 		printk(BIOS_INFO, "H8: BDC installed\n"); + 		return true; + 	} +-#endif +  + 	printk(BIOS_INFO, "H8: BDC not installed\n"); + 	return false; ++	#endif + } +  + /* +diff --git a/src/ec/lenovo/h8/wwan.c b/src/ec/lenovo/h8/wwan.c +index 5cdcf77406..b4f5787e01 100644 +--- a/src/ec/lenovo/h8/wwan.c ++++ b/src/ec/lenovo/h8/wwan.c +@@ -1,6 +1,8 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ +  +-// #include <southbridge/intel/common/gpio.h> ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++#include <southbridge/intel/common/gpio.h> ++#endif + #include <console/console.h> + #include <device/device.h> + #include <ec/acpi/ec.h> +@@ -24,23 +26,27 @@ void h8_wwan_enable(int on) +  */ + bool h8_has_wwan(const struct device *dev) + { ++	#if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) ++	printk(BIOS_INFO, "H8: WWAN detection not implemented. " ++			  "Assuming WWAN installed\n"); ++	return true; ++	#else + 	struct ec_lenovo_h8_config *conf = dev->chip_info; +  +-	if (1 || !conf->has_wwan_detection) { ++	if (!conf->has_wwan_detection) { + 		printk(BIOS_INFO, "H8: WWAN detection not implemented. " + 				  "Assuming WWAN installed\n"); + 		return true; + 	} +  +-#if 0 + 	if (get_gpio(conf->wwan_gpio_num) == conf->wwan_gpio_lvl) { + 		printk(BIOS_INFO, "H8: WWAN installed\n"); + 		return true; + 	} +-#endif +  + 	printk(BIOS_INFO, "H8: WWAN not installed\n"); + 	return false; ++	#endif + } +  + /* +--  +2.39.5 + | 
