aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/drivers
diff options
context:
space:
mode:
authorJordan Crouse <jordan.crouse@amd.com>2008-04-10 22:49:02 +0000
committerJordan Crouse <jordan.crouse@amd.com>2008-04-10 22:49:02 +0000
commit30939bdffd0435df4aa0830b2da1ef06ceebfba3 (patch)
tree12c08ea67c3c6756c7959813a043f075844d09fa /payloads/libpayload/drivers
parentbac89d088cf102851122925b31404b7ae52c21c3 (diff)
libpayload: Add video console framework
Add a framework for multiple video console drivers. This is to prepare for the Geode driver. Signed-off-by: Jordan Crouse <jordan.crouse@amd.com> Acked-by: Uwe Hermann <uwe@hermann-uwe.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3230 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'payloads/libpayload/drivers')
-rw-r--r--payloads/libpayload/drivers/Makefile.inc5
-rw-r--r--payloads/libpayload/drivers/vga.c212
-rw-r--r--payloads/libpayload/drivers/video/vga.c140
-rw-r--r--payloads/libpayload/drivers/video/video.c160
4 files changed, 304 insertions, 213 deletions
diff --git a/payloads/libpayload/drivers/Makefile.inc b/payloads/libpayload/drivers/Makefile.inc
index 9f436da79c..746ba45255 100644
--- a/payloads/libpayload/drivers/Makefile.inc
+++ b/payloads/libpayload/drivers/Makefile.inc
@@ -29,6 +29,9 @@
##
TARGETS-$(CONFIG_SERIAL_CONSOLE) += drivers/serial.o
-TARGETS-$(CONFIG_VGA_CONSOLE) += drivers/vga.o
TARGETS-$(CONFIG_PC_KEYBOARD) += drivers/keyboard.o
TARGETS-$(CONFIG_NVRAM) += drivers/nvram.o
+
+# Video console drivers
+TARGETS-$(CONFIG_VIDEO_CONSOLE) += drivers/video/video.o
+TARGETS-$(CONFIG_VGA_VIDEO_CONSOLE) += drivers/video/vga.o
diff --git a/payloads/libpayload/drivers/vga.c b/payloads/libpayload/drivers/vga.c
deleted file mode 100644
index db1cda170b..0000000000
--- a/payloads/libpayload/drivers/vga.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * This file is part of the libpayload project.
- *
- * Copyright (C) 2008 Advanced Micro Devices, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <arch/types.h>
-#include <libpayload.h>
-
-#define WIDTH 80
-#define HEIGHT 25
-
-#define VGA_COLOR_WHITE 7
-
-#define CRTC_INDEX 0x3d4
-#define CRTC_DATA 0x3d5
-
-#define VIDEO(_r, _c) \
- ((uint16_t *) (0xB8000 + ((_r) * (WIDTH * 2)) + ((_c) * 2)))
-
-static int cursor_enabled;
-static int cursorx;
-static int cursory;
-
-static void vga_scroll_up(void);
-
-static inline uint8_t crtc_read(uint8_t index)
-{
- outb(index, CRTC_INDEX);
- return inb(CRTC_DATA);
-}
-
-static inline void crtc_write(uint8_t data, uint8_t index)
-{
- outb(index, CRTC_INDEX);
- outb(data, CRTC_DATA);
-}
-
-static void vga_get_cursor_pos(void)
-{
- unsigned int addr;
-
- addr = ((unsigned int)crtc_read(0x0E)) << 8;
- addr += crtc_read(0x0F);
-
- cursorx = addr % WIDTH;
- cursory = addr / WIDTH;
-}
-
-static void vga_fixup_cursor(void)
-{
- unsigned int addr;
-
- if (!cursor_enabled)
- return;
-
- if (cursorx < 0)
- cursorx = 0;
-
- if (cursory < 0)
- cursory = 0;
-
- if (cursorx >= WIDTH) {
- cursorx = 0;
- cursory++;
- }
-
- while (cursory >= HEIGHT)
- vga_scroll_up();
-
- addr = cursorx + (WIDTH * cursory);
- crtc_write(addr >> 8, 0x0E);
- crtc_write(addr, 0x0F);
-}
-
-void vga_cursor_enable(int state)
-{
- unsigned char tmp = crtc_read(0x0a);
-
- if (state == 0) {
- tmp |= (1 << 5);
- cursor_enabled = 0;
- } else {
- tmp &= ~(1 << 5);
- cursor_enabled = 1;
- vga_fixup_cursor();
- }
-
- crtc_write(tmp, 0x0a);
-}
-
-void vga_clear_line(uint8_t row, uint8_t ch, uint8_t attr)
-{
- int col;
- uint16_t *ptr = VIDEO(row, 0);
-
- for (col = 0; col < WIDTH; col++)
- ptr[col] = ((attr & 0xFF) << 8) | (ch & 0xFF);
-}
-
-static void vga_scroll_up(void)
-{
- uint16_t *src = VIDEO(1, 0);
- uint16_t *dst = VIDEO(0, 0);
- int i;
-
- for (i = 0; i < (HEIGHT - 1) * WIDTH; i++)
- *dst++ = *src++;
-
- vga_clear_line(HEIGHT - 1, ' ', VGA_COLOR_WHITE);
- cursory--;
-}
-
-void vga_fill(uint8_t ch, uint8_t attr)
-{
- uint8_t row;
- for (row = 0; row < HEIGHT; row++)
- vga_clear_line(row, ch, attr);
-}
-
-void vga_clear(void)
-{
- vga_fill(' ', VGA_COLOR_WHITE);
- vga_move_cursor(0, 0);
-}
-
-void vga_putc(uint8_t row, uint8_t col, unsigned int c)
-{
- uint16_t *ptr = VIDEO(row, col);
- *ptr = (uint16_t) (c & 0xFFFF);
-}
-
-void vga_putchar(unsigned int ch)
-{
-
- uint16_t *ptr;
-
- switch (ch & 0xFF) {
- case '\r':
- cursorx = 0;
- break;
- case '\n':
- cursory++;
- break;
- case '\b':
- cursorx--;
- ptr = VIDEO(cursory, cursorx);
- *ptr = (*ptr & 0xFF00) | ' ';
- break;
- case '\t':
- cursorx = (cursorx + 8) & ~7;
- break;
-
- default:
- ptr = VIDEO(cursory, cursorx);
- *ptr = (uint16_t) (ch & 0xFFFF);
- cursorx++;
- break;
- }
-
- vga_fixup_cursor();
-}
-
-void vga_move_cursor(int x, int y)
-{
- cursorx = x;
- cursory = y;
-
- vga_fixup_cursor();
-}
-
-void vga_init(void)
-{
- /* Get the position of the cursor. */
- vga_get_cursor_pos();
-
- /* See if it currently enabled or not. */
- cursor_enabled = !(crtc_read(0x0A) & (1 << 5));
-
- /* If the cursor is enabled, get us to a sane point. */
- if (cursor_enabled) {
- /* Go to the next line. */
- if (cursorx) {
- cursorx = 0;
- cursory++;
- }
- vga_fixup_cursor();
- }
-}
diff --git a/payloads/libpayload/drivers/video/vga.c b/payloads/libpayload/drivers/video/vga.c
new file mode 100644
index 0000000000..388c7b1ee7
--- /dev/null
+++ b/payloads/libpayload/drivers/video/vga.c
@@ -0,0 +1,140 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <libpayload.h>
+#include <video_console.h>
+
+#define VGA_COLOR_WHITE 7
+
+#define CRTC_INDEX 0x3d4
+#define CRTC_DATA 0x3d5
+
+#define VIDEO(_r, _c)\
+ ((u16 *) (0xB8000 + ((_r) * (VIDEO_COLS * 2)) + ((_c) * 2)))
+
+static u8 crtc_read(u8 index)
+{
+ outb(index, CRTC_INDEX);
+ return inb(CRTC_DATA);
+}
+
+static void crtc_write(u8 data, u8 index)
+{
+ outb(index, CRTC_INDEX);
+ outb(data, CRTC_DATA);
+}
+
+static void vga_get_cursor(unsigned int *x, unsigned int *y, unsigned int *en)
+{
+ unsigned int addr;
+ addr = ((unsigned int) crtc_read(0x0E)) << 8;
+ addr += crtc_read(0x0E);
+
+ *x = addr % VIDEO_COLS;
+ *y = addr / VIDEO_COLS;
+
+ *en = !(crtc_read(0x0A) & (1 << 5));
+}
+
+static void vga_set_cursor(unsigned int x, unsigned int y)
+{
+ unsigned int addr;
+
+ addr = x + (VIDEO_COLS * y);
+ crtc_write(addr >> 8, 0x0E);
+ crtc_write(addr, 0x0E);
+}
+
+static void vga_enable_cursor(int state)
+{
+ unsigned char tmp = crtc_read(0x0a);
+
+ if (state == 0)
+ tmp |= (1 << 5);
+
+ else
+ tmp &= ~(1 << 5);
+
+ crtc_write(tmp, 0x0a);
+}
+
+static void vga_clear_line(u8 row, u8 ch, u8 attr)
+{
+ int col;
+ u16 *ptr = VIDEO(0, row);
+
+ for(col = 0; col < VIDEO_COLS; col++)
+ ptr[col] = ((attr & 0xFF) << 8) | (ch & 0xFF);
+}
+
+static void vga_scroll_up(void)
+{
+ u16 *src = VIDEO(0,1);
+ u16 *dst = VIDEO(0,0);
+ int i;
+
+ for(i = 0; i < (VIDEO_ROWS - 1) * VIDEO_COLS; i++)
+ *dst++ = *src++;
+
+ vga_clear_line(VIDEO_ROWS - 1, ' ', VGA_COLOR_WHITE);
+}
+
+static void vga_fill(u8 ch, u8 attr)
+{
+ u8 row;
+ for(row = 0; row < VIDEO_ROWS; row++)
+ vga_clear_line(row, ch, attr);
+}
+
+static void vga_clear(void)
+{
+ vga_fill(' ', VGA_COLOR_WHITE);
+}
+
+static void vga_putc(u8 row, u8 col, unsigned int c)
+{
+ u16 *ptr = VIDEO(row, col);
+ *ptr = (u16) (c & 0xFFFF);
+}
+
+static int vga_init(void)
+{
+ return 0;
+}
+
+struct video_console vga_video_console = {
+ .init = vga_init,
+ .putc = vga_putc,
+ .clear = vga_clear,
+ .scroll_up = vga_scroll_up,
+
+ .get_cursor = vga_get_cursor,
+ .set_cursor = vga_set_cursor,
+ .enable_cursor = vga_enable_cursor,
+};
diff --git a/payloads/libpayload/drivers/video/video.c b/payloads/libpayload/drivers/video/video.c
new file mode 100644
index 0000000000..89c146d6ce
--- /dev/null
+++ b/payloads/libpayload/drivers/video/video.c
@@ -0,0 +1,160 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <libpayload.h>
+#include <video_console.h>
+
+#ifdef CONFIG_VGA_VIDEO_CONSOLE
+extern struct video_console vga_video_console;
+#endif
+
+static struct video_console *console_list[] =
+{
+#ifdef CONFIG_VGA_VIDEO_CONSOLE
+ &vga_video_console,
+#endif
+};
+
+static struct video_console *console;
+
+static unsigned int cursorx;
+static unsigned int cursory;
+static unsigned int cursor_enabled = 1;
+
+static void video_console_fixup_cursor(void)
+{
+ if (!cursor_enabled)
+ return;
+
+ if (cursorx < 0)
+ cursorx = 0;
+
+ if (cursory < 0)
+ cursory = 0;
+
+ if (cursorx > VIDEO_COLS) {
+ cursorx = 0;
+ cursory++;
+ }
+
+ while(cursory >= VIDEO_ROWS) {
+ console->scroll_up();
+ cursory--;
+ }
+
+ if (console && console->set_cursor)
+ console->set_cursor(cursorx, cursory);
+}
+
+void video_console_cursor_enable(int state)
+{
+ if (console && console->enable_cursor)
+ console->enable_cursor(state);
+
+ cursor_enabled = state;
+
+ if (cursor_enabled)
+ video_console_fixup_cursor();
+}
+
+void video_console_clear(void)
+{
+ if (console)
+ console->clear();
+
+ cursorx = 0;
+ cursory = 0;
+
+ if (console && console->set_cursor)
+ console->set_cursor(cursorx, cursory);
+}
+
+void video_console_putc(u8 row, u8 col, unsigned int ch)
+{
+ if (console)
+ console->putc(row, col, ch);
+}
+
+void video_console_putchar(unsigned int ch)
+{
+ switch(ch & 0xFF) {
+ case '\r':
+ cursorx = 0;
+ break;
+
+ case '\n':
+ cursory++;
+ break;
+
+ case '\b':
+ cursorx--;
+ break;
+
+ case '\t':
+ while(cursorx % 8 && cursorx < VIDEO_COLS) {
+ if (console)
+ console->putc(cursorx, cursory, (ch & 0xFF00) | ' ');
+
+ cursorx++;
+ }
+ break;
+ default:
+ if (console)
+ console->putc(cursorx++, cursory, ch);
+ break;
+ }
+
+ video_console_fixup_cursor();
+}
+
+int video_console_init(void)
+{
+ int i;
+
+ for(i = 0; i < ARRAY_SIZE(console_list); i++) {
+ if (console_list[i]->init())
+ continue;
+
+ console = console_list[i];
+
+ if (console->get_cursor)
+ console->get_cursor(&cursorx, &cursory, &cursor_enabled);
+
+ if (cursorx) {
+ cursorx = 0;
+ cursory++;
+ }
+
+ video_console_fixup_cursor();
+ return 0;
+ }
+
+ return 0;
+}
+