The branch main has been updated by andrew:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=e822f1d6f5333cc7ff47a88238c269b8a6a6f01a

commit e822f1d6f5333cc7ff47a88238c269b8a6a6f01a
Author:     Andrew Turner <and...@freebsd.org>
AuthorDate: 2025-08-13 09:23:07 +0000
Commit:     Andrew Turner <and...@freebsd.org>
CommitDate: 2025-08-13 09:31:16 +0000

    uart: Add UART_ACPI_SPCR_CLASS
    
    We don't care about most of acpi_uart_compat_data in the spcr code.
    Split out the mapping from the SPCR interface type to uart class into
    a new struct. This allows new SPCR interface types to be added that
    don't have an entry in the DSDT, e.g. some PCI uarts may not.
    
    Reviewed by:    imp, jhibbits
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D51878
---
 sys/dev/uart/uart_cpu_acpi.c   | 12 ++++++------
 sys/dev/uart/uart_cpu_acpi.h   |  8 ++++++++
 sys/dev/uart/uart_dev_ns8250.c |  7 +++++++
 sys/dev/uart/uart_dev_pl011.c  |  8 ++++++++
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/sys/dev/uart/uart_cpu_acpi.c b/sys/dev/uart/uart_cpu_acpi.c
index 2e2ff101619b..da77603f0093 100644
--- a/sys/dev/uart/uart_cpu_acpi.c
+++ b/sys/dev/uart/uart_cpu_acpi.c
@@ -44,15 +44,15 @@
 #include <contrib/dev/acpica/include/accommon.h>
 #include <contrib/dev/acpica/include/actables.h>
 
-static struct acpi_uart_compat_data *
+static struct acpi_spcr_compat_data *
 uart_cpu_acpi_scan(uint8_t interface_type)
 {
-       struct acpi_uart_compat_data **cd, *curcd;
+       struct acpi_spcr_compat_data **cd, *curcd;
        int i;
 
-       SET_FOREACH(cd, uart_acpi_class_and_device_set) {
+       SET_FOREACH(cd, uart_acpi_spcr_class_set) {
                curcd = *cd;
-               for (i = 0; curcd[i].cd_hid != NULL; i++) {
+               for (i = 0; curcd[i].cd_class != NULL; i++) {
                        if (curcd[i].cd_port_subtype == interface_type)
                                return (&curcd[i]);
                }
@@ -135,7 +135,7 @@ uart_cpu_acpi_spcr(int devtype, struct uart_devinfo *di)
 {
        vm_paddr_t spcr_physaddr;
        ACPI_TABLE_SPCR *spcr;
-       struct acpi_uart_compat_data *cd;
+       struct acpi_spcr_compat_data *cd;
        struct uart_class *class;
        int error = ENXIO;
 
@@ -229,7 +229,7 @@ uart_cpu_acpi_dbg2(struct uart_devinfo *di)
        ACPI_TABLE_DBG2 *dbg2;
        ACPI_DBG2_DEVICE *dbg2_dev;
        ACPI_GENERIC_ADDRESS *base_address;
-       struct acpi_uart_compat_data *cd;
+       struct acpi_spcr_compat_data *cd;
        struct uart_class *class;
        int error;
        bool found;
diff --git a/sys/dev/uart/uart_cpu_acpi.h b/sys/dev/uart/uart_cpu_acpi.h
index c11ead373b86..7205303f0084 100644
--- a/sys/dev/uart/uart_cpu_acpi.h
+++ b/sys/dev/uart/uart_cpu_acpi.h
@@ -35,6 +35,14 @@
 
 struct uart_class;
 
+struct acpi_spcr_compat_data {
+       struct uart_class *cd_class;
+       uint16_t cd_port_subtype;
+};
+SET_DECLARE(uart_acpi_spcr_class_set, struct acpi_spcr_compat_data);
+#define        UART_ACPI_SPCR_CLASS(data)                                      
\
+       DATA_SET(uart_acpi_spcr_class_set, data)
+
 struct acpi_uart_compat_data {
        const char *cd_hid;
        struct uart_class *cd_class;
diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
index 0f19ede6d9df..09eadb5d75e3 100644
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -492,6 +492,13 @@ UART_CLASS(uart_ns8250_class);
  * XXX -- refactor out ACPI and FDT ifdefs
  */
 #ifdef DEV_ACPI
+static struct acpi_spcr_compat_data acpi_spcr_compat_data[] = {
+       { &uart_ns8250_class, ACPI_DBG2_16550_COMPATIBLE },
+       { &uart_ns8250_class, ACPI_DBG2_16550_SUBSET },
+       { NULL, 0 },
+};
+UART_ACPI_SPCR_CLASS(acpi_spcr_compat_data);
+
 static struct acpi_uart_compat_data acpi_compat_data[] = {
        {"AMD0020",     &uart_ns8250_class, 0, 2, 0, 48000000, 
UART_F_BUSY_DETECT, "AMD / Synopsys Designware UART"},
        {"AMDI0020", &uart_ns8250_class, 0, 2, 0, 48000000, UART_F_BUSY_DETECT, 
"AMD / Synopsys Designware UART"},
diff --git a/sys/dev/uart/uart_dev_pl011.c b/sys/dev/uart/uart_dev_pl011.c
index a0d5a5b1c7e2..dca2765cac59 100644
--- a/sys/dev/uart/uart_dev_pl011.c
+++ b/sys/dev/uart/uart_dev_pl011.c
@@ -391,6 +391,14 @@ UART_FDT_CLASS_AND_DEVICE(fdt_compat_data);
 #endif
 
 #ifdef DEV_ACPI
+static struct acpi_spcr_compat_data acpi_spcr_compat_data[] = {
+       { &uart_pl011_class, ACPI_DBG2_ARM_PL011 },
+       { &uart_pl011_class, ACPI_DBG2_ARM_SBSA_GENERIC },
+       { &uart_pl011_class, ACPI_DBG2_ARM_SBSA_32BIT },
+       { NULL, 0 },
+};
+UART_ACPI_SPCR_CLASS(acpi_spcr_compat_data);
+
 static struct acpi_uart_compat_data acpi_compat_data[] = {
        {"ARMH0011", &uart_pl011_class, ACPI_DBG2_ARM_PL011, 2, 0, 0, 0, "uart 
pl011"},
        {"ARMHB000", &uart_pl011_class, ACPI_DBG2_ARM_SBSA_GENERIC, 2, 0, 0, 0, 
"uart pl011"},

Reply via email to