[SeaBIOS] [PATCH 06/15] Add VESA mode tables and needed functions

Christian Gmeiner christian.gmeiner at gmail.com
Sat Sep 1 17:12:57 CEST 2012


In oder to support VESA we need to provide mode table and
some functions to work with modes. mode_setting will be
added later.

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 vgasrc/geodevga.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 vgasrc/geodevga.h |  2 ++
 2 files changed, 51 insertions(+)

diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c
index 636d55b..a1a79c9 100644
--- a/vgasrc/geodevga.c
+++ b/vgasrc/geodevga.c
@@ -17,6 +17,55 @@
 
 
 /****************************************************************
+ * Mode tables
+ ****************************************************************/
+
+static struct geodevga_mode
+{
+    u16 mode;
+    struct vgamode_s info;
+} geodevga_modes[] VAR16 = {
+    /* VESA modes */
+    { 0x101, { MM_PACKED, 640,  480,  8,  8, 16, SEG_GRAPH } },
+    { 0x103, { MM_PACKED, 800,  600,  8,  8, 16, SEG_GRAPH } },
+    { 0x105, { MM_PACKED, 1024, 768,  8,  8, 16, SEG_GRAPH } },
+    { 0x107, { MM_PACKED, 1280, 1024, 8,  8, 16, SEG_GRAPH } },
+    { 0x110, { MM_DIRECT, 640,  480,  15, 8, 16, SEG_GRAPH } },
+    { 0x111, { MM_DIRECT, 640,  480,  16, 8, 16, SEG_GRAPH } },
+    { 0x112, { MM_DIRECT, 640,  480,  24, 8, 16, SEG_GRAPH } },
+    { 0x113, { MM_DIRECT, 800,  600,  15, 8, 16, SEG_GRAPH } },
+    { 0x114, { MM_DIRECT, 800,  600,  16, 8, 16, SEG_GRAPH } },
+    { 0x115, { MM_DIRECT, 800,  600,  24, 8, 16, SEG_GRAPH } },
+    { 0x116, { MM_DIRECT, 1024, 768,  15, 8, 16, SEG_GRAPH } },
+    { 0x117, { MM_DIRECT, 1024, 768,  16, 8, 16, SEG_GRAPH } },
+    { 0x118, { MM_DIRECT, 1024, 768,  24, 8, 16, SEG_GRAPH } },
+    { 0x119, { MM_DIRECT, 1280, 1024, 15, 8, 16, SEG_GRAPH } },
+    { 0x11A, { MM_DIRECT, 1280, 1024, 16, 8, 16, SEG_GRAPH } },
+};
+
+struct vgamode_s *geodevga_find_mode(int mode)
+{
+    struct geodevga_mode *m = geodevga_modes;
+    for (; m < &geodevga_modes[ARRAY_SIZE(geodevga_modes)]; m++)
+        if (GET_GLOBAL(m->mode) == mode)
+            return &m->info;
+    return stdvga_find_mode(mode);
+}
+
+void geodevga_list_modes(u16 seg, u16 *dest, u16 *last)
+{
+    struct geodevga_mode *m = geodevga_modes;
+    for (; m < &geodevga_modes[ARRAY_SIZE(geodevga_modes)] && dest<last; m++) {
+        u16 mode = GET_GLOBAL(m->mode);
+        if (mode == 0xffff)
+            continue;
+        SET_FARVAR(seg, *dest, mode);
+        dest++;
+    }
+    stdvga_list_modes(seg, dest, last);
+}
+
+/****************************************************************
 * MSR and High Mem access through VSA Virtual Register
 ****************************************************************/
 
diff --git a/vgasrc/geodevga.h b/vgasrc/geodevga.h
index 14e33d6..fe149df 100644
--- a/vgasrc/geodevga.h
+++ b/vgasrc/geodevga.h
@@ -65,5 +65,7 @@
 #define DC_CFG_MSK                      0xf000a6
 
 int geodevga_init();
+struct vgamode_s *geodevga_find_mode(int mode);
+void geodevga_list_modes(u16 seg, u16 *dest, u16 *last);
 
 #endif
-- 
1.7.11.rc2.5.g68f532f




More information about the SeaBIOS mailing list