1*0812ab31SAndrew Turner /*- 2*0812ab31SAndrew Turner * Copyright (c) 2016 The FreeBSD Foundation 3*0812ab31SAndrew Turner * All rights reserved. 4*0812ab31SAndrew Turner * 5*0812ab31SAndrew Turner * This software was developed by Andrew Turner under sponsorship from 6*0812ab31SAndrew Turner * the FreeBSD Foundation. 7*0812ab31SAndrew Turner * 8*0812ab31SAndrew Turner * Redistribution and use in source and binary forms, with or without 9*0812ab31SAndrew Turner * modification, are permitted provided that the following conditions 10*0812ab31SAndrew Turner * are met: 11*0812ab31SAndrew Turner * 1. Redistributions of source code must retain the above copyright 12*0812ab31SAndrew Turner * notice, this list of conditions and the following disclaimer. 13*0812ab31SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 14*0812ab31SAndrew Turner * notice, this list of conditions and the following disclaimer in the 15*0812ab31SAndrew Turner * documentation and/or other materials provided with the distribution. 16*0812ab31SAndrew Turner * 17*0812ab31SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*0812ab31SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*0812ab31SAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*0812ab31SAndrew Turner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*0812ab31SAndrew Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*0812ab31SAndrew Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*0812ab31SAndrew Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*0812ab31SAndrew Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*0812ab31SAndrew Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*0812ab31SAndrew Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*0812ab31SAndrew Turner * SUCH DAMAGE. 28*0812ab31SAndrew Turner */ 29*0812ab31SAndrew Turner 30*0812ab31SAndrew Turner #include "opt_acpi.h" 31*0812ab31SAndrew Turner #include "opt_platform.h" 32*0812ab31SAndrew Turner 33*0812ab31SAndrew Turner #include <sys/cdefs.h> 34*0812ab31SAndrew Turner __FBSDID("$FreeBSD$"); 35*0812ab31SAndrew Turner 36*0812ab31SAndrew Turner #include <sys/param.h> 37*0812ab31SAndrew Turner #include <sys/bus.h> 38*0812ab31SAndrew Turner #include <sys/kernel.h> 39*0812ab31SAndrew Turner #include <sys/module.h> 40*0812ab31SAndrew Turner #include <sys/systm.h> 41*0812ab31SAndrew Turner 42*0812ab31SAndrew Turner #include <vm/vm.h> 43*0812ab31SAndrew Turner #include <vm/pmap.h> 44*0812ab31SAndrew Turner 45*0812ab31SAndrew Turner #include <machine/bus.h> 46*0812ab31SAndrew Turner 47*0812ab31SAndrew Turner #include <dev/uart/uart.h> 48*0812ab31SAndrew Turner #include <dev/uart/uart_bus.h> 49*0812ab31SAndrew Turner #include <dev/uart/uart_cpu.h> 50*0812ab31SAndrew Turner 51*0812ab31SAndrew Turner #ifdef FDT 52*0812ab31SAndrew Turner #include <dev/fdt/fdt_common.h> 53*0812ab31SAndrew Turner #include <dev/ofw/ofw_bus.h> 54*0812ab31SAndrew Turner #include <dev/ofw/ofw_bus_subr.h> 55*0812ab31SAndrew Turner #include <dev/uart/uart_cpu_fdt.h> 56*0812ab31SAndrew Turner #endif 57*0812ab31SAndrew Turner 58*0812ab31SAndrew Turner /* 59*0812ab31SAndrew Turner * UART console routines. 60*0812ab31SAndrew Turner */ 61*0812ab31SAndrew Turner bus_space_tag_t uart_bus_space_io; 62*0812ab31SAndrew Turner bus_space_tag_t uart_bus_space_mem; 63*0812ab31SAndrew Turner 64*0812ab31SAndrew Turner int 65*0812ab31SAndrew Turner uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) 66*0812ab31SAndrew Turner { 67*0812ab31SAndrew Turner 68*0812ab31SAndrew Turner if (pmap_kextract(b1->bsh) == 0) 69*0812ab31SAndrew Turner return (0); 70*0812ab31SAndrew Turner if (pmap_kextract(b2->bsh) == 0) 71*0812ab31SAndrew Turner return (0); 72*0812ab31SAndrew Turner return ((pmap_kextract(b1->bsh) == pmap_kextract(b2->bsh)) ? 1 : 0); 73*0812ab31SAndrew Turner } 74*0812ab31SAndrew Turner 75*0812ab31SAndrew Turner int 76*0812ab31SAndrew Turner uart_cpu_getdev(int devtype, struct uart_devinfo *di) 77*0812ab31SAndrew Turner { 78*0812ab31SAndrew Turner struct uart_class *class; 79*0812ab31SAndrew Turner bus_space_handle_t bsh; 80*0812ab31SAndrew Turner bus_space_tag_t bst; 81*0812ab31SAndrew Turner u_int rclk, shift; 82*0812ab31SAndrew Turner int br, err; 83*0812ab31SAndrew Turner 84*0812ab31SAndrew Turner /* Allow overriding the FDT using the environment. */ 85*0812ab31SAndrew Turner class = &uart_ns8250_class; 86*0812ab31SAndrew Turner err = uart_getenv(devtype, di, class); 87*0812ab31SAndrew Turner if (err == 0) 88*0812ab31SAndrew Turner return (0); 89*0812ab31SAndrew Turner 90*0812ab31SAndrew Turner if (devtype != UART_DEV_CONSOLE) 91*0812ab31SAndrew Turner return (ENXIO); 92*0812ab31SAndrew Turner 93*0812ab31SAndrew Turner err = ENXIO; 94*0812ab31SAndrew Turner #ifdef FDT 95*0812ab31SAndrew Turner err = uart_cpu_fdt_probe(&class, &bst, &bsh, &br, &rclk, &shift); 96*0812ab31SAndrew Turner #endif 97*0812ab31SAndrew Turner if (err != 0) 98*0812ab31SAndrew Turner return (err); 99*0812ab31SAndrew Turner 100*0812ab31SAndrew Turner /* 101*0812ab31SAndrew Turner * Finalize configuration. 102*0812ab31SAndrew Turner */ 103*0812ab31SAndrew Turner di->bas.chan = 0; 104*0812ab31SAndrew Turner di->bas.regshft = shift; 105*0812ab31SAndrew Turner di->baudrate = br; 106*0812ab31SAndrew Turner di->bas.rclk = rclk; 107*0812ab31SAndrew Turner di->ops = uart_getops(class); 108*0812ab31SAndrew Turner di->databits = 8; 109*0812ab31SAndrew Turner di->stopbits = 1; 110*0812ab31SAndrew Turner di->parity = UART_PARITY_NONE; 111*0812ab31SAndrew Turner di->bas.bst = bst; 112*0812ab31SAndrew Turner di->bas.bsh = bsh; 113*0812ab31SAndrew Turner uart_bus_space_mem = di->bas.bst; 114*0812ab31SAndrew Turner uart_bus_space_io = NULL; 115*0812ab31SAndrew Turner 116*0812ab31SAndrew Turner return (0); 117*0812ab31SAndrew Turner } 118