Attach com over acpi on amd64. Some hardware uses a different interrupt
authoranton <anton@openbsd.org>
Thu, 16 Dec 2021 08:03:17 +0000 (08:03 +0000)
committeranton <anton@openbsd.org>
Thu, 16 Dec 2021 08:03:17 +0000 (08:03 +0000)
assignment compared to the the legacy one supported by com over isa.
This causes the console to halt once userland takes over as no
interrupts are received. The actual address and irq can be read from
ACPI, kettenis@ already added support for arm64 which paved the way for
amd64.

Some consoles that previously attached over isa are now expected to
attach over acpi.

Thanks to patrick@ for testing on arm64.

ok kettenis@

share/man/man4/com.4
sys/arch/amd64/conf/GENERIC
sys/arch/amd64/conf/RAMDISK
sys/arch/amd64/conf/RAMDISK_CD
sys/dev/acpi/acpi.c
sys/dev/acpi/com_acpi.c

index 73b421f..ea5ec93 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: com.4,v 1.48 2021/05/20 00:55:15 jsg Exp $
+.\"    $OpenBSD: com.4,v 1.49 2021/12/16 08:03:17 anton Exp $
 .\"    $NetBSD: com.4,v 1.5 1996/03/16 00:07:08 thorpej Exp $
 .\"
 .\" Copyright (c) 1990, 1991 The Regents of the University of California.
@@ -33,7 +33,7 @@
 .\"
 .\"     from: @(#)dca.4        5.2 (Berkeley) 3/27/91
 .\"
-.Dd $Mdocdate: May 20 2021 $
+.Dd $Mdocdate: December 16 2021 $
 .Dt COM 4
 .Os
 .Sh NAME
 .Cd "com0 at isa? port 0x3f8 irq 4"
 .Cd "com1 at isa? port 0x2f8 irq 3"
 .Pp
-.Cd "# armv7"
-.Cd "com* at fdt?"
-.Pp
-.Cd "# arm64"
+.Cd "# amd64 and arm64"
 .Cd "com* at acpi?"
+.Pp
+.Cd "# arm64 and armv7"
 .Cd "com* at fdt?"
 .Pp
 .Cd "# hppa"
index ecccd13..3b1e7dc 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: GENERIC,v 1.505 2021/11/02 08:25:47 patrick Exp $
+#      $OpenBSD: GENERIC,v 1.506 2021/12/16 08:03:17 anton Exp $
 #
 # For further information on compiling OpenBSD kernels, see the config(8)
 # man page.
@@ -65,6 +65,11 @@ amdgpio*     at acpi?
 aplgpio*       at acpi?
 bytgpio*       at acpi?
 chvgpio*       at acpi?
+com0           at acpi?
+com1           at acpi?
+com2           at acpi?
+com3           at acpi?
+com*           at acpi?
 glkgpio*       at acpi?
 pchgpio*       at acpi?
 sdhc*          at acpi?
index 6041293..7141e7a 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: RAMDISK,v 1.83 2021/03/19 04:30:56 deraadt Exp $
+#      $OpenBSD: RAMDISK,v 1.84 2021/12/16 08:03:17 anton Exp $
 
 machine                amd64
 maxusers       4
@@ -34,6 +34,9 @@ acpipci*      at acpi?
 acpiprt*       at acpi?
 acpimadt0      at acpi?
 #acpitz*       at acpi?
+com0           at acpi?
+com1           at acpi?
+com*           at acpi?
 
 mpbios0                at bios0
 
index 8bd646b..b60148c 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: RAMDISK_CD,v 1.194 2021/11/07 16:06:31 patrick Exp $
+#      $OpenBSD: RAMDISK_CD,v 1.195 2021/12/16 08:03:17 anton Exp $
 
 machine                amd64
 maxusers       4
@@ -51,6 +51,10 @@ bytgpio*     at acpi?
 sdhc*          at acpi?
 acpihve*       at acpi?
 chvgpio*        at acpi?
+com0           at acpi?
+com1           at acpi?
+com2           at acpi?
+com*           at acpi?
 glkgpio*       at acpi?
 
 mpbios0                at bios0
index 1bf5eb1..0e84622 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpi.c,v 1.402 2021/12/07 10:15:25 kettenis Exp $ */
+/* $OpenBSD: acpi.c,v 1.403 2021/12/16 08:03:17 anton Exp $ */
 /*
  * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
  * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
@@ -3140,7 +3140,6 @@ const char *acpi_isa_hids[] = {
        "PNP0303",      /* IBM Enhanced Keyboard (101/102-key, PS/2 Mouse) */
        "PNP0400",      /* Standard LPT Parallel Port */
        "PNP0401",      /* ECP Parallel Port */
-       "PNP0501",      /* 16550A-compatible COM Serial Port */
        "PNP0700",      /* PC-class Floppy Disk Controller */
        "PNP0F03",      /* Microsoft PS/2-style Mouse */
        "PNP0F13",      /* PS/2 Mouse */
index 852be6c..12e6128 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: com_acpi.c,v 1.2 2020/05/08 11:18:01 kettenis Exp $   */
+/*     $OpenBSD: com_acpi.c,v 1.3 2021/12/16 08:03:17 anton Exp $      */
 /*
  * Copyright (c) 2018 Mark Kettenis
  *
@@ -49,10 +49,12 @@ struct cfattach com_acpi_ca = {
 
 const char *com_hids[] = {
        "HISI0031",
+       "PNP0501",
        NULL
 };
 
 int    com_acpi_is_console(struct com_acpi_softc *);
+int    com_acpi_is_designware(const char *);
 int    com_acpi_intr_designware(void *);
 
 int
@@ -69,7 +71,7 @@ com_acpi_attach(struct device *parent, struct device *self, void *aux)
 {
        struct com_acpi_softc *sc = (struct com_acpi_softc *)self;
        struct acpi_attach_args *aaa = aux;
-       uint32_t freq;
+       int (*intrfn)(void *) = comintr;
 
        sc->sc_acpi = (struct acpi_softc *)parent;
        sc->sc_node = aaa->aaa_node;
@@ -88,31 +90,39 @@ com_acpi_attach(struct device *parent, struct device *self, void *aux)
        printf(" addr 0x%llx/0x%llx", aaa->aaa_addr[0], aaa->aaa_size[0]);
        printf(" irq %d", aaa->aaa_irq[0]);
 
-       freq = acpi_getpropint(sc->sc_node, "clock-frequency", 0);
-
        sc->sc.sc_iot = aaa->aaa_bst[0];
        sc->sc.sc_iobase = aaa->aaa_addr[0];
-       sc->sc.sc_uarttype = COM_UART_16550;
-       sc->sc.sc_frequency = freq ? freq : COM_FREQ;
-
-       sc->sc.sc_reg_width = acpi_getpropint(sc->sc_node, "reg-io-width", 4);
-       sc->sc.sc_reg_shift = acpi_getpropint(sc->sc_node, "reg-shift", 2);
-
-       if (com_acpi_is_console(sc)) {
-               SET(sc->sc.sc_hwflags, COM_HW_CONSOLE);
-               SET(sc->sc.sc_swflags, COM_SW_SOFTCAR);
-               comconsfreq = sc->sc.sc_frequency;
-               comconsrate = B115200;
+       sc->sc.sc_frequency = acpi_getpropint(sc->sc_node, "clock-frequency",
+           COM_FREQ);
+
+       if (com_acpi_is_designware(aaa->aaa_dev)) {
+               intrfn = com_acpi_intr_designware;
+               sc->sc.sc_uarttype = COM_UART_16550;
+               sc->sc.sc_reg_width = acpi_getpropint(sc->sc_node,
+                   "reg-io-width", 4);
+               sc->sc.sc_reg_shift = acpi_getpropint(sc->sc_node,
+                   "reg-shift", 2);
+
+               if (com_acpi_is_console(sc)) {
+                       SET(sc->sc.sc_hwflags, COM_HW_CONSOLE);
+                       SET(sc->sc.sc_swflags, COM_SW_SOFTCAR);
+                       comconsfreq = sc->sc.sc_frequency;
+                       comconsrate = B115200;
+               }
        }
 
-       if (bus_space_map(sc->sc.sc_iot, aaa->aaa_addr[0], aaa->aaa_size[0],
-           0, &sc->sc.sc_ioh)) {
-               printf(": can't map registers\n");
-               return;
+       if (sc->sc.sc_iobase == comconsaddr) {
+               sc->sc.sc_ioh = comconsioh;
+       } else {
+               if (bus_space_map(sc->sc.sc_iot,
+                   aaa->aaa_addr[0], aaa->aaa_size[0], 0, &sc->sc.sc_ioh)) {
+                       printf(": can't map registers\n");
+                       return;
+               }
        }
 
        sc->sc_ih = acpi_intr_establish(aaa->aaa_irq[0], aaa->aaa_irq_flags[0],
-           IPL_TTY, com_acpi_intr_designware, sc, sc->sc.sc_dev.dv_xname);
+           IPL_TTY, intrfn, sc, sc->sc.sc_dev.dv_xname);
        if (sc->sc_ih == NULL) {
                printf(": can't establish interrupt\n");
                return;
@@ -144,6 +154,12 @@ com_acpi_is_console(struct com_acpi_softc *sc)
        return 0;
 }
 
+int
+com_acpi_is_designware(const char *hid)
+{
+       return strcmp("HISI0031", hid) == 0;
+}
+
 int
 com_acpi_intr_designware(void *cookie)
 {