1/*-
2 * Copyright (c) 2011 Google, Inc.
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 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <stand.h>
28#include <sys/font.h>
29#include "bootstrap.h"
30#include "libuserboot.h"
31
32int console;
33
34static struct console *userboot_comconsp;
35
36static void userboot_cons_probe(struct console *cp);
37static int userboot_cons_init(int);
38static void userboot_comcons_probe(struct console *cp);
39static int userboot_comcons_init(int);
40static void userboot_cons_putchar(int);
41static int userboot_cons_getchar(void);
42static int userboot_cons_poll(void);
43
44struct console userboot_console = {
45	.c_name = "userboot",
46	.c_desc = "userboot",
47	.c_probe = userboot_cons_probe,
48	.c_init = userboot_cons_init,
49	.c_out = userboot_cons_putchar,
50	.c_in = userboot_cons_getchar,
51	.c_ready = userboot_cons_poll,
52};
53
54/*
55 * Provide a simple alias to allow loader scripts to set the
56 * console to comconsole without resulting in an error
57 */
58struct console userboot_comconsole = {
59	.c_name = "comconsole",
60	.c_desc = "comconsole",
61	.c_probe = userboot_comcons_probe,
62	.c_init = userboot_comcons_init,
63	.c_out = userboot_cons_putchar,
64	.c_in = userboot_cons_getchar,
65	.c_ready = userboot_cons_poll,
66};
67
68static void
69userboot_cons_probe(struct console *cp)
70{
71
72	cp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
73}
74
75static int
76userboot_cons_init(int arg)
77{
78
79	return (0);
80}
81
82static void
83userboot_comcons_probe(struct console *cp)
84{
85
86	/*
87	 * Save the console pointer so the comcons_init routine
88	 * can set the C_PRESENT* flags. They are not set
89	 * here to allow the existing userboot console to
90	 * be elected the default.
91	 */
92	userboot_comconsp = cp;
93}
94
95static int
96userboot_comcons_init(int arg)
97{
98
99	/*
100	 * Set the C_PRESENT* flags to allow the comconsole
101	 * to be selected as the active console
102	 */
103	userboot_comconsp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
104	return (0);
105}
106
107static void
108userboot_cons_putchar(int c)
109{
110
111        CALLBACK(putc, c);
112}
113
114static int
115userboot_cons_getchar()
116{
117
118	return (CALLBACK(getc));
119}
120
121static int
122userboot_cons_poll()
123{
124
125	return (CALLBACK(poll));
126}
127