From 6f95cb50c5b344d81979ed73d8f650cd60f8e5e6 Mon Sep 17 00:00:00 2001 From: Tim Wawrzynczak Date: Tue, 20 Sep 2022 11:48:40 -0600 Subject: [PATCH] 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 Change-Id: I66ca3701c4c2fe5359621023b1fd45f8afd3b745 Reviewed-on: https://review.coreboot.org/c/coreboot/+/67746 Reviewed-by: Tarun Tuli Tested-by: build bot (Jenkins) --- .../google/brya/variants/agah/variant.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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 #include #include -#include +#include #include #include #include @@ -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); +}