aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Wawrzynczak <twawrzynczak@chromium.org>2022-09-20 11:48:40 -0600
committerPaul Fagerburg <pfagerburg@chromium.org>2022-09-22 15:54:17 +0000
commit6f95cb50c5b344d81979ed73d8f650cd60f8e5e6 (patch)
treed5a22e312b94cf7766462e084fd7005725cf0fac
parent0eba73228f17489f8b4d4e736d800e88fb4001f2 (diff)
mb/google/brya/var/agah: Explictly program the dGPU's PCI IRQ
Currently the `pch_pirq_init()` function in lpc_lib.c will program PIRQ IRQs for all PCI devices discovered during enumeration. This may not be correct for all devices, and causes strange behavior with the Nvidia dGPU; it will start out with IRQ 11 and then after a suspend/resume cycle, it will get programmed back to 16, so the Linux kernel must be doing some IRQ sanitization at some point. To fix this anomaly, explicitly program the IRQ to 16 (which we know is what IRQ it will eventually take). BUG=b:243972575 TEST=`lspci -vvv -s1:00.0|grep IRQ` shows IRQ 16 is programmed at boot and stays consistent after suspend/resume. Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Change-Id: I66ca3701c4c2fe5359621023b1fd45f8afd3b745 Reviewed-on: https://review.coreboot.org/c/coreboot/+/67746 Reviewed-by: Tarun Tuli <taruntuli@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/mainboard/google/brya/variants/agah/variant.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/mainboard/google/brya/variants/agah/variant.c b/src/mainboard/google/brya/variants/agah/variant.c
index 4e7f6d20f3..43aea8cf6d 100644
--- a/src/mainboard/google/brya/variants/agah/variant.c
+++ b/src/mainboard/google/brya/variants/agah/variant.c
@@ -5,7 +5,7 @@
#include <baseboard/variants.h>
#include <boardid.h>
#include <delay.h>
-#include <device/pci_ops.h>
+#include <device/pci.h>
#include <gpio.h>
#include <timer.h>
#include <types.h>
@@ -161,3 +161,19 @@ void variant_fill_ssdt(const struct device *dev)
acpigen_write_method_end();
acpigen_write_scope_end();
}
+
+void variant_finalize(void)
+{
+ /*
+ * Currently the `pch_pirq_init()` function in lpc_lib.c will program
+ * PIRQ IRQs for all PCI devices discovered during enumeration. This may
+ * not be correct for all devices, and causes strange behavior with the
+ * Nvidia dGPU; it will start out with IRQ 11 and then after a
+ * suspend/resume cycle, it will get programmed back to 16, so the Linux
+ * kernel must be doing some IRQ sanitization at some point. To fix
+ * this anomaly, explicitly program the IRQ to 16 (which we know is what
+ * IRQ it will eventually take).
+ */
+ const struct device *dgpu = DEV_PTR(dgpu);
+ pci_write_config8(dgpu, PCI_INTERRUPT_LINE, 16);
+}