From 736d4d25df5ece86c3b2f611a5e4dda1eac627a7 Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Fri, 30 Jun 2023 15:37:38 +0200 Subject: [PATCH] acpi: Add function to add ARM PL011 to ACPI DBG2 Signed-off-by: Arthur Heymans Change-Id: I3c3f7f579ec0ec4fdb72e1f6b785026daab17bac Reviewed-on: https://review.coreboot.org/c/coreboot/+/76297 Reviewed-by: Tim Wawrzynczak Tested-by: build bot (Jenkins) --- src/acpi/acpi.c | 73 ++++++++++++++++++++++++++++------------- src/include/acpi/acpi.h | 5 ++- 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c index edd2ca507b..e30b7d32cd 100644 --- a/src/acpi/acpi.c +++ b/src/acpi/acpi.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -817,13 +818,49 @@ static void acpi_create_dbg2(acpi_dbg2_header_t *dbg2, header->checksum = acpi_checksum((uint8_t *)dbg2, header->length); } -unsigned long acpi_write_dbg2_pci_uart(acpi_rsdp_t *rsdp, unsigned long current, - const struct device *dev, uint8_t access_size) +static unsigned long acpi_write_dbg2_uart(acpi_rsdp_t *rsdp, unsigned long current, + int space_id, uint64_t base, uint32_t size, + int access_size, const char *name) { acpi_dbg2_header_t *dbg2 = (acpi_dbg2_header_t *)current; - struct resource *res; acpi_addr_t address; + memset(&address, 0, sizeof(address)); + + address.space_id = space_id; + address.addrl = (uint32_t)base; + address.addrh = (uint32_t)((base >> 32) & 0xffffffff); + address.access_size = access_size; + + int subtype; + /* 16550-compatible with parameters defined in Generic Address Structure */ + if (CONFIG(DRIVERS_UART_8250IO) || CONFIG(DRIVERS_UART_8250MEM)) + subtype = ACPI_DBG2_PORT_SERIAL_16550; + else if (CONFIG(DRIVERS_UART_PL011)) + subtype = ACPI_DBG2_PORT_SERIAL_ARM_PL011; + else + return current; + + acpi_create_dbg2(dbg2, + ACPI_DBG2_PORT_SERIAL, + subtype, + &address, size, + name); + + if (dbg2->header.length) { + current += dbg2->header.length; + current = acpi_align_current(current); + acpi_add_table(rsdp, dbg2); + } + + return current; +} + +unsigned long acpi_write_dbg2_pci_uart(acpi_rsdp_t *rsdp, unsigned long current, + const struct device *dev, uint8_t access_size) +{ + struct resource *res; + if (!dev) { printk(BIOS_DEBUG, "%s: Device not found\n", __func__); return current; @@ -839,33 +876,25 @@ unsigned long acpi_write_dbg2_pci_uart(acpi_rsdp_t *rsdp, unsigned long current, return current; } - memset(&address, 0, sizeof(address)); + int space_id; if (res->flags & IORESOURCE_IO) - address.space_id = ACPI_ADDRESS_SPACE_IO; + space_id = ACPI_ADDRESS_SPACE_IO; else if (res->flags & IORESOURCE_MEM) - address.space_id = ACPI_ADDRESS_SPACE_MEMORY; + space_id = ACPI_ADDRESS_SPACE_MEMORY; else { printk(BIOS_ERR, "%s: Unknown address space type\n", __func__); return current; } - address.addrl = (uint32_t)res->base; - address.addrh = (uint32_t)((res->base >> 32) & 0xffffffff); - address.access_size = access_size; + return acpi_write_dbg2_uart(rsdp, current, space_id, res->base, res->size, access_size, acpi_device_path(dev)); +} - acpi_create_dbg2(dbg2, - ACPI_DBG2_PORT_SERIAL, - ACPI_DBG2_PORT_SERIAL_16550, - &address, res->size, - acpi_device_path(dev)); - - if (dbg2->header.length) { - current += dbg2->header.length; - current = acpi_align_current(current); - acpi_add_table(rsdp, dbg2); - } - - return current; +unsigned long acpi_pl011_write_dbg2_uart(acpi_rsdp_t *rsdp, unsigned long current, + uint64_t base, const char *name) +{ + return acpi_write_dbg2_uart(rsdp, current, ACPI_ADDRESS_SPACE_MEMORY, base, + sizeof(struct pl011_uart), ACPI_ACCESS_SIZE_DWORD_ACCESS, + name); } static void acpi_create_facs(void *header) diff --git a/src/include/acpi/acpi.h b/src/include/acpi/acpi.h index 1d68b8e396..76518637f7 100644 --- a/src/include/acpi/acpi.h +++ b/src/include/acpi/acpi.h @@ -1622,7 +1622,10 @@ unsigned long acpi_write_hpet(const struct device *device, unsigned long start, void generate_cpu_entries(const struct device *device); unsigned long acpi_write_dbg2_pci_uart(acpi_rsdp_t *rsdp, unsigned long current, - const struct device *dev, uint8_t access_size); + const struct device *dev, uint8_t access_size); +unsigned long acpi_pl011_write_dbg2_uart(acpi_rsdp_t *rsdp, unsigned long current, + uint64_t base, const char *name); + void acpi_create_dmar(acpi_dmar_t *dmar, enum dmar_flags flags, unsigned long (*acpi_fill_dmar)(unsigned long)); unsigned long acpi_create_dmar_drhd(unsigned long current, u8 flags,