diff options
author | Tim Wawrzynczak <twawrzynczak@chromium.org> | 2022-09-20 11:48:40 -0600 |
---|---|---|
committer | Paul Fagerburg <pfagerburg@chromium.org> | 2022-09-22 15:54:17 +0000 |
commit | 6f95cb50c5b344d81979ed73d8f650cd60f8e5e6 (patch) | |
tree | d5a22e312b94cf7766462e084fd7005725cf0fac /src/mainboard/google/brya/variants | |
parent | 0eba73228f17489f8b4d4e736d800e88fb4001f2 (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>
Diffstat (limited to 'src/mainboard/google/brya/variants')
-rw-r--r-- | src/mainboard/google/brya/variants/agah/variant.c | 18 |
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); +} |