uart_cpu_x86.c revision 119815
1/*
2 * Copyright (c) 2003 Marcel Moolenaar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/dev/uart/uart_cpu_amd64.c 119815 2003-09-06 23:13:47Z marcel $");
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/bus.h>
33
34#include <machine/bus.h>
35
36#include <dev/uart/uart.h>
37#include <dev/uart/uart_cpu.h>
38
39int
40uart_cpu_getdev(int devtype, struct uart_devinfo *di)
41{
42	unsigned int i, ivar;
43
44	/*
45	 * Scan the hints. We only try units 0 to 3 (inclusive). This
46	 * covers the ISA legacy where 4 UARTs had their resources
47	 * predefined.
48	 */
49	for (i = 0; i < 4; i++) {
50		if (resource_int_value("uart", i, "flags", &ivar))
51			continue;
52		if (devtype == UART_DEV_CONSOLE && !UART_FLAGS_CONSOLE(ivar))
53			continue;
54		if (devtype == UART_DEV_DBGPORT && !UART_FLAGS_DBGPORT(ivar))
55			continue;
56		/*
57		 * We have a possible device. Make sure it's enabled and
58		 * that we have an I/O port.
59		 */
60		if (resource_int_value("uart", i, "disabled", &ivar) == 0 &&
61		    ivar != 0)
62			continue;
63		if (resource_int_value("uart", i, "port", &ivar) != 0 ||
64		    ivar == 0)
65			continue;
66		/*
67		 * Got it. Fill in the instance and return it. We only have
68		 * ns8250 and successors on i386.
69		 */
70		di->ops = uart_ns8250_ops;
71		di->bas.bst = AMD64_BUS_SPACE_IO;
72		di->bas.bsh = ivar;
73		di->bas.regshft = 0;
74		di->bas.rclk = 0;
75		if (resource_int_value("uart", i, "baud", &ivar) != 0)
76			ivar = 0;
77		di->baudrate = ivar;
78		di->databits = 8;
79		di->stopbits = 1;
80		di->parity = UART_PARITY_NONE;
81		return (0);
82	}
83
84	return (ENXIO);
85}
86
87int
88uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
89{
90
91	return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
92}
93