12059ee3cSMarcel Moolenaar /*-
24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni *
42059ee3cSMarcel Moolenaar * Copyright (c) 2003, 2004 Marcel Moolenaar
52059ee3cSMarcel Moolenaar * All rights reserved.
62059ee3cSMarcel Moolenaar *
72059ee3cSMarcel Moolenaar * Redistribution and use in source and binary forms, with or without
82059ee3cSMarcel Moolenaar * modification, are permitted provided that the following conditions
92059ee3cSMarcel Moolenaar * are met:
102059ee3cSMarcel Moolenaar *
112059ee3cSMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright
122059ee3cSMarcel Moolenaar * notice, this list of conditions and the following disclaimer.
132059ee3cSMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright
142059ee3cSMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the
152059ee3cSMarcel Moolenaar * documentation and/or other materials provided with the distribution.
162059ee3cSMarcel Moolenaar *
172059ee3cSMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
182059ee3cSMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
192059ee3cSMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
202059ee3cSMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
212059ee3cSMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
222059ee3cSMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232059ee3cSMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242059ee3cSMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252059ee3cSMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
262059ee3cSMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272059ee3cSMarcel Moolenaar */
282059ee3cSMarcel Moolenaar
297f166c93SColin Percival #include "opt_acpi.h"
307f166c93SColin Percival
312059ee3cSMarcel Moolenaar #include <sys/param.h>
322059ee3cSMarcel Moolenaar #include <sys/systm.h>
332059ee3cSMarcel Moolenaar #include <sys/bus.h>
342059ee3cSMarcel Moolenaar
352059ee3cSMarcel Moolenaar #include <machine/bus.h>
362059ee3cSMarcel Moolenaar
372059ee3cSMarcel Moolenaar #include <dev/uart/uart.h>
382059ee3cSMarcel Moolenaar #include <dev/uart/uart_cpu.h>
397f166c93SColin Percival #include <dev/uart/uart_cpu_acpi.h>
402059ee3cSMarcel Moolenaar
412059ee3cSMarcel Moolenaar bus_space_tag_t uart_bus_space_io = X86_BUS_SPACE_IO;
422059ee3cSMarcel Moolenaar bus_space_tag_t uart_bus_space_mem = X86_BUS_SPACE_MEM;
432059ee3cSMarcel Moolenaar
4407007f31SColin Percival extern int late_console;
4507007f31SColin Percival
462059ee3cSMarcel Moolenaar int
uart_cpu_eqres(struct uart_bas * b1,struct uart_bas * b2)472059ee3cSMarcel Moolenaar uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
482059ee3cSMarcel Moolenaar {
492059ee3cSMarcel Moolenaar
502059ee3cSMarcel Moolenaar return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
512059ee3cSMarcel Moolenaar }
522059ee3cSMarcel Moolenaar
532059ee3cSMarcel Moolenaar int
uart_cpu_getdev(int devtype,struct uart_devinfo * di)542059ee3cSMarcel Moolenaar uart_cpu_getdev(int devtype, struct uart_devinfo *di)
552059ee3cSMarcel Moolenaar {
562059ee3cSMarcel Moolenaar struct uart_class *class;
572059ee3cSMarcel Moolenaar unsigned int i, ivar;
582059ee3cSMarcel Moolenaar
592059ee3cSMarcel Moolenaar class = &uart_ns8250_class;
602059ee3cSMarcel Moolenaar if (class == NULL)
612059ee3cSMarcel Moolenaar return (ENXIO);
622059ee3cSMarcel Moolenaar
632059ee3cSMarcel Moolenaar /* Check the environment. */
642059ee3cSMarcel Moolenaar if (uart_getenv(devtype, di, class) == 0)
652059ee3cSMarcel Moolenaar return (0);
662059ee3cSMarcel Moolenaar
677f166c93SColin Percival #ifdef DEV_ACPI
6807007f31SColin Percival /*
6907007f31SColin Percival * Check if SPCR can tell us what console to use. If running with
7007007f31SColin Percival * !late_console, we haven't set up our own page tables yet, so we
7107007f31SColin Percival * can't map ACPI tables to look at them.
7207007f31SColin Percival */
73*a931b85aSAndrew Turner if (late_console && uart_cpu_acpi_setup(devtype, di) == 0)
747f166c93SColin Percival return (0);
757f166c93SColin Percival #endif
767f166c93SColin Percival
772059ee3cSMarcel Moolenaar /*
782059ee3cSMarcel Moolenaar * Scan the hints. We only try units 0 to 3 (inclusive). This
792059ee3cSMarcel Moolenaar * covers the ISA legacy where 4 UARTs had their resources
802059ee3cSMarcel Moolenaar * predefined.
812059ee3cSMarcel Moolenaar */
822059ee3cSMarcel Moolenaar for (i = 0; i < 4; i++) {
832059ee3cSMarcel Moolenaar if (resource_int_value("uart", i, "flags", &ivar))
842059ee3cSMarcel Moolenaar continue;
852059ee3cSMarcel Moolenaar if (devtype == UART_DEV_CONSOLE && !UART_FLAGS_CONSOLE(ivar))
862059ee3cSMarcel Moolenaar continue;
872059ee3cSMarcel Moolenaar if (devtype == UART_DEV_DBGPORT && !UART_FLAGS_DBGPORT(ivar))
882059ee3cSMarcel Moolenaar continue;
892059ee3cSMarcel Moolenaar /*
902059ee3cSMarcel Moolenaar * We have a possible device. Make sure it's enabled and
912059ee3cSMarcel Moolenaar * that we have an I/O port.
922059ee3cSMarcel Moolenaar */
932059ee3cSMarcel Moolenaar if (resource_int_value("uart", i, "disabled", &ivar) == 0 &&
942059ee3cSMarcel Moolenaar ivar != 0)
952059ee3cSMarcel Moolenaar continue;
962059ee3cSMarcel Moolenaar if (resource_int_value("uart", i, "port", &ivar) != 0 ||
972059ee3cSMarcel Moolenaar ivar == 0)
982059ee3cSMarcel Moolenaar continue;
992059ee3cSMarcel Moolenaar /*
1002059ee3cSMarcel Moolenaar * Got it. Fill in the instance and return it. We only have
1012059ee3cSMarcel Moolenaar * ns8250 and successors on i386.
1022059ee3cSMarcel Moolenaar */
1032059ee3cSMarcel Moolenaar di->ops = uart_getops(class);
1042059ee3cSMarcel Moolenaar di->bas.chan = 0;
1052059ee3cSMarcel Moolenaar di->bas.bst = uart_bus_space_io;
1062059ee3cSMarcel Moolenaar if (bus_space_map(di->bas.bst, ivar, uart_getrange(class), 0,
1072059ee3cSMarcel Moolenaar &di->bas.bsh) != 0)
1082059ee3cSMarcel Moolenaar continue;
1092059ee3cSMarcel Moolenaar di->bas.regshft = 0;
1102059ee3cSMarcel Moolenaar di->bas.rclk = 0;
1112059ee3cSMarcel Moolenaar if (resource_int_value("uart", i, "baud", &ivar) != 0)
1122059ee3cSMarcel Moolenaar ivar = 0;
1132059ee3cSMarcel Moolenaar di->baudrate = ivar;
1142059ee3cSMarcel Moolenaar di->databits = 8;
1152059ee3cSMarcel Moolenaar di->stopbits = 1;
1162059ee3cSMarcel Moolenaar di->parity = UART_PARITY_NONE;
1172059ee3cSMarcel Moolenaar return (0);
1182059ee3cSMarcel Moolenaar }
1192059ee3cSMarcel Moolenaar
1202059ee3cSMarcel Moolenaar return (ENXIO);
1212059ee3cSMarcel Moolenaar }
122