diff options
author | Furquan Shaikh <furquan@chromium.org> | 2017-08-04 16:24:12 -0700 |
---|---|---|
committer | Furquan Shaikh <furquan@google.com> | 2017-08-10 16:25:10 +0000 |
commit | 96024836077d28100035950e517b2ae5ad1ab5d9 (patch) | |
tree | 78fd702432075acdde0b5ab895f304d51738b5a0 /src/soc/intel/skylake/uart.c | |
parent | a8198eb9ad1daea7b88ffa1d995907783a7c13c3 (diff) |
soc/intel/skylake: Enable UART debug controller on S3 resume
1. Add a new variable to GNVS to store information during S3 suspend
whether UART debug port controller is enabled.
2. On resume, read stored GNVS variable to decide if UART debug port
controller needs to be initialized.
3. Provide helpers functions required by intel/common UART driver for
enabling controller on S3 resume.
BUG=b:64030366
TEST=Verified behavior with different combinations:
1. Serial console enabled in coreboot: No change in behavior.
2. Serial console enabled only in kernel: coreboot initializes debug
controller on S3 resume.
3. Serial console not enabled in coreboot and kernel: coreboot skips
initialization of debug controller on S3 resume.
Change-Id: Iad1cc974bc396ecd55b05ebb6591eec6cedfa16c
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://review.coreboot.org/20886
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel/skylake/uart.c')
-rw-r--r-- | src/soc/intel/skylake/uart.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/soc/intel/skylake/uart.c b/src/soc/intel/skylake/uart.c index 07326d5eb3..4e65859ea7 100644 --- a/src/soc/intel/skylake/uart.c +++ b/src/soc/intel/skylake/uart.c @@ -14,22 +14,20 @@ * GNU General Public License for more details. */ +#include <cbmem.h> #include <device/pci.h> #include <intelblocks/uart.h> #include <soc/iomap.h> +#include <soc/nvs.h> #include <soc/pci_devs.h> -static int pch_uart_is_debug(struct device *dev) -{ - return dev->path.pci.devfn == PCH_DEVFN_UART2; -} - +#if !ENV_SMM void pch_uart_read_resources(struct device *dev) { pci_dev_read_resources(dev); /* Set the configured UART base address for the debug port */ - if (IS_ENABLED(CONFIG_UART_DEBUG) && pch_uart_is_debug(dev)) { + if (IS_ENABLED(CONFIG_UART_DEBUG) && uart_is_debug_controller(dev)) { struct resource *res = find_resource(dev, PCI_BASE_ADDRESS_0); /* Need to set the base and size for the resource allocator. */ res->base = UART_DEBUG_BASE_ADDRESS; @@ -38,3 +36,19 @@ void pch_uart_read_resources(struct device *dev) IORESOURCE_FIXED; } } +#endif + +bool pch_uart_init_debug_controller_on_resume(void) +{ + global_nvs_t *gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS); + + if (gnvs) + return !!gnvs->uior; + + return false; +} + +device_t pch_uart_get_debug_controller(void) +{ + return PCH_DEV_UART2; +} |