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_move_cursor(int x
, int y
)
129 video_console_fixup_cursor();
132 void video_console_putchar(unsigned int ch
)
137 /* replace black-on-black with light-gray-on-black.
138 * do it here, instead of in libc/console.c
140 if ((ch
& 0xFF00) == 0) {
158 cursorx
= console
->columns
;
163 while(cursorx
% 8 && cursorx
< console
->columns
)
164 console
->putc(cursory
, cursorx
++, (ch
& 0xFF00) | ' ');
167 console
->putc(cursory
, cursorx
++, ch
);
171 video_console_fixup_cursor();
174 void video_printf(int foreground
, int background
, enum video_printf_align align
,
175 const char *fmt
, ...)
182 len
= vsnprintf(str
, ARRAY_SIZE(str
), fmt
, ap
);
187 /* vsnprintf can return len larger than size. when it happens,
188 * only size-1 characters have been actually written. */
189 if (len
>= ARRAY_SIZE(str
))
190 len
= ARRAY_SIZE(str
) - 1;
192 if (len
> console
->columns
) {
196 case VIDEO_PRINTF_ALIGN_LEFT
:
199 case VIDEO_PRINTF_ALIGN_CENTER
:
200 cursorx
= (console
->columns
- len
) / 2;
202 case VIDEO_PRINTF_ALIGN_RIGHT
:
203 cursorx
= console
->columns
- len
;
216 video_console_putchar(str
[i
++] | foreground
| background
);
219 void video_console_get_cursor(unsigned int *x
, unsigned int *y
, unsigned int *en
)
225 if (console
&& console
->get_cursor
)
226 console
->get_cursor(x
, y
, en
);
232 void video_console_set_cursor(unsigned int x
, unsigned int y
)
236 video_console_fixup_cursor();
239 static struct console_output_driver cons
= {
240 .putchar
= video_console_putchar
246 unsigned int dummy_cursor_enabled
;
248 for (i
= 0; i
< ARRAY_SIZE(console_list
); i
++) {
249 if (console_list
[i
]->init())
252 console
= console_list
[i
];
254 if (console
->get_cursor
)
255 console
->get_cursor((unsigned int*)&cursorx
,
256 (unsigned int*)&cursory
,
257 &dummy_cursor_enabled
);
264 video_console_fixup_cursor();
270 int video_console_init(void)
272 int ret
= video_init();
275 console_add_output_driver(&cons
);