summaryrefslogtreecommitdiffstats
path: root/src/mainboard/google/brya/acpi/power.asl
diff options
context:
space:
mode:
authorTim Wawrzynczak <twawrzynczak@chromium.org>2022-02-25 09:13:49 -0700
committerTim Wawrzynczak <twawrzynczak@chromium.org>2022-05-20 14:58:46 +0000
commitc85253337934e3dd2aa5fc6b55371f9b48ef3b4c (patch)
tree6f563de2b18775a5124ef8aacbe058e454a6ab8f /src/mainboard/google/brya/acpi/power.asl
parent2efd8315f20ff1fbdccdc0b6f0af97b4a7512981 (diff)
downloadcoreboot-c85253337934e3dd2aa5fc6b55371f9b48ef3b4c.tar.gz
coreboot-c85253337934e3dd2aa5fc6b55371f9b48ef3b4c.tar.bz2
coreboot-c85253337934e3dd2aa5fc6b55371f9b48ef3b4c.zip
mb/google/brya: Add PEG and initial Nvidia dGPU ASL support
Some brya variants will use a GN20 series Nvidia GPU, which requires quite a bit of ACPI support code to be written for it. This patch lands a decent bit of the initial code for it on the brya platform, including: 1) PEG RTD3 methods 2) DGPU power operations (RTD3 and GCOFF, NVJT _DSM and other Methods) 3) NVOP _DSM method There will be more support to come later, this is all written to specifications from the Nvidia Software Design Guide for GN20. BUG=b:214581763 TEST=build patch train Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Change-Id: Ifce1610210e9636e87dda4b55c8287334adfcc42 Reviewed-on: https://review.coreboot.org/c/coreboot/+/62931 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com> Reviewed-by: Subrata Banik <subratabanik@google.com>
Diffstat (limited to 'src/mainboard/google/brya/acpi/power.asl')
-rw-r--r--src/mainboard/google/brya/acpi/power.asl297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/mainboard/google/brya/acpi/power.asl b/src/mainboard/google/brya/acpi/power.asl
new file mode 100644
index 000000000000..b5822fcf9b41
--- /dev/null
+++ b/src/mainboard/google/brya/acpi/power.asl
@@ -0,0 +1,297 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+
+/* Voltage rail control signals */
+#define GPIO_1V8_PWR_EN GPP_E18
+#define GPIO_1V8_PG GPP_E20
+#define GPIO_NV33_PWR_EN GPP_A21
+#define GPIO_NV33_PG GPP_A22
+#define GPIO_NVVDD_PWR_EN GPP_E0
+#define GPIO_NVVDD_PG GPP_E16
+#define GPIO_PEXVDD_PWR_EN GPP_E10
+#define GPIO_PEXVDD_PG GPP_E17
+#define GPIO_FBVDD_PWR_EN GPP_A17
+#define GPIO_FBVDD_PG GPP_E4
+
+#define GPIO_GPU_PERST_L GPP_B3
+#define GPIO_GPU_ALLRAILS_PG GPP_E5
+#define GPIO_GPU_NVVDD_EN GPP_A19
+
+#define GC6_DEFER_TYPE_EXIT_GC6 3
+
+/* Optimus Power Control State */
+Name (OPCS, OPTIMUS_POWER_CONTROL_DISABLE)
+
+/* PCI configuration space Owner */
+Name (PCIO, PCI_OWNER_SBIOS)
+
+/* Saved PCI configuration space memory (VGA Buffer) */
+Name (VGAB, Buffer (0xfb) { 0x00 })
+
+/* Deferred GPU State */
+Name (OPS0, OPTIMUS_CONTROL_NO_RUN_PS0)
+
+/* GC6 Entry/Exit state */
+Name (GC6E, GC6_STATE_EXITED)
+
+/* Defer GC6 entry / exit until D3-cold request */
+Name (DFEN, 0)
+/* Deferred GC6 Enter control */
+Name (DFCI, 0)
+/* Deferred GC6 Exit control */
+Name (DFCO, 0)
+
+/* "GC6 In", i.e. GC6 Entry Sequence */
+Method (GC6I, 0, Serialized)
+{
+ GC6E = GC6_STATE_TRANSITION
+
+ /* Put PCIe link into L2/3 */
+ \_SB.PCI0.PEG0.DL23 ()
+
+ /* Assert GPU_PERST_L */
+ \_SB.PCI0.STXS (GPIO_GPU_PERST_L)
+
+ /* Deassert PG_GPU_ALLRAILS */
+ \_SB.PCI0.CTXS (GPIO_GPU_ALLRAILS_PG)
+
+ /* Deassert EN_PP0950_GPU_X */
+ \_SB.PCI0.CTXS (GPIO_PEXVDD_PWR_EN)
+
+ /* Wait for de-assertion of PG_PP0950_GPU */
+ GPPL (GPIO_PEXVDD_PG, 0, 20)
+
+ /* Deassert EN_PPVAR_GPU_NVVDD */
+ \_SB.PCI0.CTXS (GPIO_NVVDD_PWR_EN)
+
+ /* Wait for de-assertion of PG_PPVAR_GPU_NVVDD */
+ GPPL (GPIO_NVVDD_PG, 0, 20)
+
+ /* Deassert EN_PCH_PPVAR_GPU_FBVDDQ */
+ \_SB.PCI0.CTXS (GPIO_FBVDD_PWR_EN)
+
+ /* Deassert EN_PP3300_GPU */
+ \_SB.PCI0.CTXS (GPIO_NV33_PWR_EN)
+
+ /* Wait for de-assertion of PG_PP3300_GPU */
+ GPPL (GPIO_NV33_PG, 0, 20)
+
+ GC6E = GC6_STATE_ENTERED
+}
+
+/* "GC6 Out", i.e. GC6 Exit Sequence */
+Method (GC6O, 0, Serialized)
+{
+ GC6E = GC6_STATE_TRANSITION
+
+ /* Assert EN_PP3300_GPU */
+ \_SB.PCI0.STXS (GPIO_NV33_PWR_EN)
+
+ /* Wait for assertion of PG_PP3300_GPU */
+ GPPL (GPIO_NV33_PG, 1, 20)
+
+ /* Deassert GPU_PERST_L */
+ \_SB.PCI0.CTXS (GPIO_GPU_PERST_L)
+
+ /* Put PCIe link into L0 state */
+ \_SB.PCI0.PEG0.LD23 ()
+
+ /* Wait for GPU to assert GPU_NVVDD_EN */
+ GPPL (GPIO_GPU_NVVDD_EN, 1, 20)
+
+ /*
+ * There is a 4ms window once the GPU asserts GPU_NVVDD_EN to
+ * perform the following:
+ * 1. Enable GPU_NVVDD
+ * 2. Enable GPU_PEX
+ * 3. Wait for all PG
+ * 4. Assert FBVDD
+ * At the end of the 4ms window, the GPU will deassert its
+ * GPIO1_GC6_FB_EN signal that is used to keep the FBVDD
+ * rail up during GC6.
+ */
+ \_SB.PCI0.STXS (GPIO_NVVDD_PWR_EN)
+ Stall (20)
+ \_SB.PCI0.STXS (GPIO_PEXVDD_PWR_EN)
+ GPPL (GPIO_NVVDD_PG, 1, 4)
+ GPPL (GPIO_PEXVDD_PG, 1, 4)
+ \_SB.PCI0.STXS (GPIO_FBVDD_PWR_EN)
+
+ /* Assert PG_GPU_ALLRAILS */
+ \_SB.PCI0.STXS (GPIO_GPU_ALLRAILS_PG)
+
+ GC6E = GC6_STATE_EXITED
+}
+
+/* GCOFF exit sequence */
+Method (PGON, 0, Serialized)
+{
+ /* Assert PERST# */
+ \_SB.PCI0.CTXS (GPIO_GPU_PERST_L)
+
+ /* Ramp up 1.8V rail */
+ \_SB.PCI0.STXS (GPIO_1V8_PWR_EN)
+ GPPL (GPIO_1V8_PG, 1, 20)
+
+ /* Ramp up NV33 rail */
+ \_SB.PCI0.STXS (GPIO_NV33_PWR_EN)
+ GPPL (GPIO_NV33_PG, 1, 20)
+
+ /* Ramp up NVVDD rail */
+ \_SB.PCI0.STXS (GPIO_NVVDD_PWR_EN)
+ GPPL (GPIO_NVVDD_PG, 1, 5)
+
+ /* Ramp up PEXVDD rail */
+ \_SB.PCI0.STXS (GPIO_PEXVDD_PWR_EN)
+ GPPL (GPIO_PEXVDD_PG, 1, 5)
+
+ /* Ramp up FBVDD rail */
+ \_SB.PCI0.STXS (GPIO_FBVDD_PWR_EN)
+ GPPL (GPIO_FBVDD_PG, 1, 5)
+
+ /* All rails are good */
+ \_SB.PCI0.STXS (GPIO_GPU_ALLRAILS_PG)
+ Sleep (1)
+
+ /* Deassert PERST# */
+ \_SB.PCI0.STXS (GPIO_GPU_PERST_L)
+}
+
+/* GCOFF entry sequence */
+Method (PGOF, 0, Serialized)
+{
+ /* Assert PERST# */
+ \_SB.PCI0.CTXS (GPIO_GPU_PERST_L)
+ Sleep (5)
+
+ /* All rails are about to go down */
+ \_SB.PCI0.CTXS (GPIO_GPU_ALLRAILS_PG)
+
+ /* Ramp down FBVDD */
+ \_SB.PCI0.CTXS (GPIO_FBVDD_PWR_EN)
+ GPPL (GPIO_FBVDD_PG, 0, 20)
+
+ /* Ramp down PEXVDD */
+ \_SB.PCI0.CTXS (GPIO_PEXVDD_PWR_EN)
+ GPPL (GPIO_PEXVDD_PG, 0, 20)
+
+ /* Ramp down NVVDD */
+ \_SB.PCI0.CTXS (GPIO_NVVDD_PWR_EN)
+ GPPL (GPIO_NVVDD_PG, 0, 20)
+
+ /* Ramp down NV33 */
+ \_SB.PCI0.CTXS (GPIO_NV33_PWR_EN)
+ GPPL (GPIO_NV33_PG, 0, 20)
+
+ /* Ramp down 1.8V */
+ \_SB.PCI0.CTXS (GPIO_1V8_PWR_EN)
+ GPPL (GPIO_1V8_PG, 0, 20)
+}
+
+/* Handle deferred GC6 vs. poweron request */
+Method (NPON, 0, Serialized)
+{
+ If (DFEN == GC6_DEFER_ENABLE) /* 1 */
+ {
+ If (DFCO == GC6_DEFER_TYPE_EXIT_GC6) /* 3 */
+ {
+ GC6O ()
+ }
+
+ DFEN = GC6_DEFER_DISABLE
+ }
+ Else
+ {
+ PGON ()
+ }
+}
+
+/* Handle deferred GC6 vs. poweroff request */
+Method (NPOF, 0, Serialized)
+{
+ If (DFEN == GC6_DEFER_ENABLE)
+ {
+ /* Deferred GC6 entry */
+ If (DFCI == NVJT_GPC_EGNS || DFCI == NVJT_GPC_EGIS)
+ {
+ GC6I ()
+ }
+
+ DFEN = GC6_DEFER_DISABLE
+ }
+ Else
+ {
+ PGOF ()
+ }
+}
+
+Method (_ON, 0, Serialized)
+{
+ PGON ()
+}
+
+Method (_OFF, 0, Serialized)
+{
+ PGOF ()
+}
+
+/* Put device into D0 */
+Method (_PS0, 0, NotSerialized)
+{
+ If (OPS0 == OPTIMUS_CONTROL_RUN_PS0)
+ {
+ /* Restore PCI config space */
+ If (PCIO == PCI_OWNER_SBIOS)
+ {
+ VGAR = VGAB
+ }
+
+ /* Poweron or deferred GC6 exit */
+ NPON ()
+
+ OPS0 = OPTIMUS_CONTROL_NO_RUN_PS0
+ }
+}
+
+/* Put device into D3 */
+Method (_PS3, 0, NotSerialized)
+{
+ If (OPCS == OPTIMUS_POWER_CONTROL_ENABLE)
+ {
+ /* Save PCI config space to ACPI buffer */
+ If (PCIO == PCI_OWNER_SBIOS)
+ {
+ VGAB = VGAR
+ }
+
+ /* Poweroff or deferred GC6 entry */
+ NPOF ()
+
+ /* Because _PS3 ran _OFF, _PS0 must run _ON */
+ OPS0 = OPTIMUS_CONTROL_RUN_PS0
+
+ /* OPCS is one-shot, so reset it */
+ OPCS = OPTIMUS_POWER_CONTROL_DISABLE
+ }
+}
+
+/*
+ * Normally, _ON and _OFF of the power resources listed in _PRx will be
+ * evaluated before entering D0/D3. However, for Optimus, the package
+ * should refer to the PCIe controller itself, not a dependent device.
+ */
+Name (_PR0, Package() { \_SB.PCI0.PEG0 })
+Name (_PR3, Package() { \_SB.PCI0.PEG0 })
+
+Method (_STA, 0, Serialized)
+{
+ If (GC6E == GC6_STATE_EXITED &&
+ \_SB.PCI0.GTXS(GPIO_GPU_ALLRAILS_PG) == 1)
+ {
+ Return (0xF)
+ }
+ Else
+ {
+ Return (0)
+ }
+}