Patrick Georgi has submitted this change. ( https://review.coreboot.org/c/coreboot/+/38494 )
Change subject: drivers/net/r8168: Add SSDT Power Resource Methods ......................................................................
drivers/net/r8168: Add SSDT Power Resource Methods
Turns out when going into S0ix we want the kernel to toggle de-assert to 0 for the ISOLATE# pin on the NIC for S0ix not to be woken by PCIe traffic on PCH. Upon resume the ISOLATE# pin on the NIC is then re-asserted for it to become lively again.
V.2: Ensure reset_gpio && enable_gpio are optional.
BUG=b:147026979 BRANCH=none TEST=Boot puff and do 100 cycles of S0ix.
Change-Id: I3ae8dc30f45f55eec23f45e7b5fbc67a4542f87d Signed-off-by: Edward O'Callaghan quasisec@google.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/38494 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Furquan Shaikh furquan@google.com --- M src/drivers/net/chip.h M src/drivers/net/r8168.c 2 files changed, 22 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Furquan Shaikh: Looks good to me, approved
diff --git a/src/drivers/net/chip.h b/src/drivers/net/chip.h index 430bc33..249b80f 100644 --- a/src/drivers/net/chip.h +++ b/src/drivers/net/chip.h @@ -15,10 +15,22 @@ #define __DRIVERS_R8168_CHIP_H__
#include <stdint.h> +#include <arch/acpi_device.h>
struct drivers_net_config { uint16_t customized_leds; unsigned int wake; /* Wake pin for ACPI _PRW */ + + /* Does the device have a power resource? */ + bool has_power_resource; + + /* GPIO used to stop operation of device. */ + struct acpi_gpio stop_gpio; + /* Delay to be inserted after disabling stop. */ + unsigned int stop_delay_ms; + /* Delay to be inserted after enabling stop. */ + unsigned int stop_off_delay_ms; + /* * There maybe many NIC cards in a system. * This parameter is for driver to identify what diff --git a/src/drivers/net/r8168.c b/src/drivers/net/r8168.c index 1bca879..07069aa 100644 --- a/src/drivers/net/r8168.c +++ b/src/drivers/net/r8168.c @@ -317,6 +317,16 @@ if (dev->chip_ops) acpigen_write_name_string("_DDN", dev->chip_ops->name);
+ /* Power Resource */ + if (config->has_power_resource) { + const struct acpi_power_res_params power_res_params = { + .stop_gpio = &config->stop_gpio, + .stop_delay_ms = config->stop_delay_ms, + .stop_off_delay_ms = config->stop_off_delay_ms + }; + acpi_device_add_power_res(&power_res_params); + } + /* Address */ address = PCI_SLOT(dev->path.pci.devfn) & 0xffff; address <<= 16;