3 * Copyright (C) 2008 Advanced Micro Devices, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <libpayload-config.h>
30 #include <libpayload.h>
31 #include <video_console.h>
33 #if CONFIG(LP_GEODELX_VIDEO_CONSOLE)
34 extern struct video_console geodelx_video_console
;
37 #if CONFIG(LP_COREBOOT_VIDEO_CONSOLE)
38 extern struct video_console coreboot_video_console
;
41 #if CONFIG(LP_VGA_VIDEO_CONSOLE)
42 extern struct video_console vga_video_console
;
45 static struct video_console
*console_list
[] =
47 #if CONFIG(LP_GEODELX_VIDEO_CONSOLE)
48 &geodelx_video_console
,
50 #if CONFIG(LP_COREBOOT_VIDEO_CONSOLE)
51 &coreboot_video_console
,
53 #if CONFIG(LP_VGA_VIDEO_CONSOLE)
58 static struct video_console
*console
;
63 void video_get_rows_cols(unsigned int *rows
, unsigned int *cols
)
66 *cols
= console
->columns
;
67 *rows
= console
->rows
;
73 static void video_console_fixup_cursor(void)
84 if (cursorx
>= console
->columns
) {
89 if (console
->rows
<= 0)
92 while(cursory
>= console
->rows
) {
97 if (console
->set_cursor
)
98 console
->set_cursor(cursorx
, cursory
);
101 void video_console_cursor_enable(int state
)
103 if (console
&& console
->enable_cursor
)
104 console
->enable_cursor(state
);
107 void video_console_clear(void)
115 if (console
&& console
->set_cursor
)
116 console
->set_cursor(cursorx
, cursory
);
119 void video_console_putc(u8 row
, u8 col
, unsigned int ch
)
122 console
->putc(row
, col
, ch
);
125 void video_console_putchar(unsigned int ch
)
130 /* replace black-on-black with light-gray-on-black.
131 * do it here, instead of in libc/console.c
133 if ((ch
& 0xFF00) == 0) {
151 cursorx
= console
->columns
;
156 while(cursorx
% 8 && cursorx
< console
->columns
)
157 console
->putc(cursory
, cursorx
++, (ch
& 0xFF00) | ' ');
160 console
->putc(cursory
, cursorx
++, ch
);
164 video_console_fixup_cursor();
167 void video_printf(int foreground
, int background
, enum video_printf_align align
,
168 const char *fmt
, ...)
175 len
= vsnprintf(str
, ARRAY_SIZE(str
), fmt
, ap
);
180 /* vsnprintf can return len larger than size. when it happens,
181 * only size-1 characters have been actually written. */
182 if (len
>= ARRAY_SIZE(str
))
183 len
= ARRAY_SIZE(str
) - 1;
185 if (len
> console
->columns
) {
189 case VIDEO_PRINTF_ALIGN_LEFT
:
192 case VIDEO_PRINTF_ALIGN_CENTER
:
193 cursorx
= (console
->columns
- len
) / 2;
195 case VIDEO_PRINTF_ALIGN_RIGHT
:
196 cursorx
= console
->columns
- len
;
209 video_console_putchar(str
[i
++] | foreground
| background
);
212 void video_console_get_cursor(unsigned int *x
, unsigned int *y
, unsigned int *en
)
218 if (console
&& console
->get_cursor
)
219 console
->get_cursor(x
, y
, en
);
225 void video_console_set_cursor(unsigned int x
, unsigned int y
)
229 video_console_fixup_cursor();
232 static struct console_output_driver cons
= {
233 .putchar
= video_console_putchar
239 unsigned int dummy_cursor_enabled
;
241 for (i
= 0; i
< ARRAY_SIZE(console_list
); i
++) {
242 if (console_list
[i
]->init())
245 console
= console_list
[i
];
247 if (console
->get_cursor
)
248 console
->get_cursor((unsigned int*)&cursorx
,
249 (unsigned int*)&cursory
,
250 &dummy_cursor_enabled
);
257 video_console_fixup_cursor();
263 int video_console_init(void)
265 int ret
= video_init();
268 console_add_output_driver(&cons
);