vgabios: Introduce stdvga_get_crtc() and use it consistently.
authorKevin O'Connor <kevin@koconnor.net>
Sat, 31 Dec 2011 21:00:54 +0000 (16:00 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Sat, 31 Dec 2011 21:03:41 +0000 (16:03 -0500)
The low level VGA code shouldn't depend on the crtc address stored in
the BDA - it can find the address on its own.

The cirrus_get_crtc() function is the same - replace it with
stdvga_get_crtc().

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
vgasrc/clext.c
vgasrc/stdvga.c
vgasrc/stdvga.h

index 7987d28a0389432970b7f0c0296b42b35abf6915..7774ba3c2f0b4663ebe8265f87436b085cd85295 100644 (file)
@@ -327,14 +327,6 @@ cirrus_switch_mode_setregs(u16 *data, u16 port)
     }
 }
 
     }
 }
 
-static u16
-cirrus_get_crtc(void)
-{
-    if (inb(VGAREG_READ_MISC_OUTPUT) & 1)
-        return VGAREG_VGA_CRTC_ADDRESS;
-    return VGAREG_MDA_CRTC_ADDRESS;
-}
-
 static void
 cirrus_switch_mode(struct cirrus_mode_s *table)
 {
 static void
 cirrus_switch_mode(struct cirrus_mode_s *table)
 {
@@ -342,7 +334,7 @@ cirrus_switch_mode(struct cirrus_mode_s *table)
     outw(0x1206, VGAREG_SEQU_ADDRESS);
     cirrus_switch_mode_setregs(GET_GLOBAL(table->seq), VGAREG_SEQU_ADDRESS);
     cirrus_switch_mode_setregs(GET_GLOBAL(table->graph), VGAREG_GRDC_ADDRESS);
     outw(0x1206, VGAREG_SEQU_ADDRESS);
     cirrus_switch_mode_setregs(GET_GLOBAL(table->seq), VGAREG_SEQU_ADDRESS);
     cirrus_switch_mode_setregs(GET_GLOBAL(table->graph), VGAREG_GRDC_ADDRESS);
-    cirrus_switch_mode_setregs(GET_GLOBAL(table->crtc), cirrus_get_crtc());
+    cirrus_switch_mode_setregs(GET_GLOBAL(table->crtc), stdvga_get_crtc());
 
     outb(0x00, VGAREG_PEL_MASK);
     inb(VGAREG_PEL_MASK);
 
     outb(0x00, VGAREG_PEL_MASK);
     inb(VGAREG_PEL_MASK);
@@ -433,7 +425,7 @@ cirrus_check(void)
 static void
 cirrus_extbios_80h(struct bregs *regs)
 {
 static void
 cirrus_extbios_80h(struct bregs *regs)
 {
-    u16 crtc_addr = cirrus_get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x27, crtc_addr);
     u8 v = inb(crtc_addr + 1);
     if (v == 0xa0)
     outb(0x27, crtc_addr);
     u8 v = inb(crtc_addr + 1);
     if (v == 0xa0)
@@ -458,7 +450,7 @@ cirrus_extbios_81h(struct bregs *regs)
 static void
 cirrus_extbios_82h(struct bregs *regs)
 {
 static void
 cirrus_extbios_82h(struct bregs *regs)
 {
-    u16 crtc_addr = cirrus_get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x27, crtc_addr);
     regs->al = inb(crtc_addr + 1) & 0x03;
     regs->ah = 0xAF;
     outb(0x27, crtc_addr);
     regs->al = inb(crtc_addr + 1) & 0x03;
     regs->ah = 0xAF;
@@ -596,7 +588,7 @@ cirrus_get_bpp_bytes(void)
 static void
 cirrus_set_line_offset(u16 new_line_offset)
 {
 static void
 cirrus_set_line_offset(u16 new_line_offset)
 {
-    u16 crtc_addr = cirrus_get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x13, crtc_addr);
     outb(new_line_offset / 8, crtc_addr + 1);
 
     outb(0x13, crtc_addr);
     outb(new_line_offset / 8, crtc_addr + 1);
 
@@ -608,7 +600,7 @@ cirrus_set_line_offset(u16 new_line_offset)
 static u16
 cirrus_get_line_offset(void)
 {
 static u16
 cirrus_get_line_offset(void)
 {
-    u16 crtc_addr = cirrus_get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x13, crtc_addr);
     u8 reg13 = inb(crtc_addr + 1);
     outb(0x1b, crtc_addr);
     outb(0x13, crtc_addr);
     u8 reg13 = inb(crtc_addr + 1);
     outb(0x1b, crtc_addr);
@@ -648,7 +640,7 @@ cirrus_get_line_offset_entry(struct cirrus_mode_s *table_g)
 static void
 cirrus_set_start_addr(u32 addr)
 {
 static void
 cirrus_set_start_addr(u32 addr)
 {
-    u16 crtc_addr = cirrus_get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x0d, crtc_addr);
     outb(addr, crtc_addr + 1);
 
     outb(0x0d, crtc_addr);
     outb(addr, crtc_addr + 1);
 
@@ -668,7 +660,7 @@ cirrus_set_start_addr(u32 addr)
 static u32
 cirrus_get_start_addr(void)
 {
 static u32
 cirrus_get_start_addr(void)
 {
-    u16 crtc_addr = cirrus_get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x0c, crtc_addr);
     u8 b2 = inb(crtc_addr + 1);
 
     outb(0x0c, crtc_addr);
     u8 b2 = inb(crtc_addr + 1);
 
index 8622d0c6d81d0e5f17f04ba4d74494884db8428c..f40c172b6dc9ca20d831fb2a041930300206f123 100644 (file)
@@ -8,8 +8,7 @@
 #include "stdvga.h" // stdvga_init
 #include "ioport.h" // outb
 #include "farptr.h" // SET_FARVAR
 #include "stdvga.h" // stdvga_init
 #include "ioport.h" // outb
 #include "farptr.h" // SET_FARVAR
-#include "biosvar.h" // GET_BDA
-#include "vgabios.h" // VGAREG_*
+#include "biosvar.h" // GET_GLOBAL
 #include "util.h" // memcpy_far
 
 // TODO
 #include "util.h" // memcpy_far
 
 // TODO
@@ -338,16 +337,18 @@ stdvga_load_font(u16 seg, void *src_far, u16 count
  * CRTC registers
  ****************************************************************/
 
  * CRTC registers
  ****************************************************************/
 
-static u16
-get_crtc(void)
+u16
+stdvga_get_crtc(void)
 {
 {
-    return GET_BDA(crtc_address);
+    if (inb(VGAREG_READ_MISC_OUTPUT) & 1)
+        return VGAREG_VGA_CRTC_ADDRESS;
+    return VGAREG_MDA_CRTC_ADDRESS;
 }
 
 void
 stdvga_set_cursor_shape(u8 start, u8 end)
 {
 }
 
 void
 stdvga_set_cursor_shape(u8 start, u8 end)
 {
-    u16 crtc_addr = get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x0a, crtc_addr);
     outb(start, crtc_addr + 1);
     outb(0x0b, crtc_addr);
     outb(0x0a, crtc_addr);
     outb(start, crtc_addr + 1);
     outb(0x0b, crtc_addr);
@@ -357,7 +358,7 @@ stdvga_set_cursor_shape(u8 start, u8 end)
 void
 stdvga_set_active_page(u16 address)
 {
 void
 stdvga_set_active_page(u16 address)
 {
-    u16 crtc_addr = get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x0c, crtc_addr);
     outb((address & 0xff00) >> 8, crtc_addr + 1);
     outb(0x0d, crtc_addr);
     outb(0x0c, crtc_addr);
     outb((address & 0xff00) >> 8, crtc_addr + 1);
     outb(0x0d, crtc_addr);
@@ -367,7 +368,7 @@ stdvga_set_active_page(u16 address)
 void
 stdvga_set_cursor_pos(u16 address)
 {
 void
 stdvga_set_cursor_pos(u16 address)
 {
-    u16 crtc_addr = get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x0e, crtc_addr);
     outb((address & 0xff00) >> 8, crtc_addr + 1);
     outb(0x0f, crtc_addr);
     outb(0x0e, crtc_addr);
     outb((address & 0xff00) >> 8, crtc_addr + 1);
     outb(0x0f, crtc_addr);
@@ -377,7 +378,7 @@ stdvga_set_cursor_pos(u16 address)
 void
 stdvga_set_scan_lines(u8 lines)
 {
 void
 stdvga_set_scan_lines(u8 lines)
 {
-    u16 crtc_addr = get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x09, crtc_addr);
     u8 crtc_r9 = inb(crtc_addr + 1);
     crtc_r9 = (crtc_r9 & 0xe0) | (lines - 1);
     outb(0x09, crtc_addr);
     u8 crtc_r9 = inb(crtc_addr + 1);
     crtc_r9 = (crtc_r9 & 0xe0) | (lines - 1);
@@ -388,7 +389,7 @@ stdvga_set_scan_lines(u8 lines)
 u16
 stdvga_get_vde(void)
 {
 u16
 stdvga_get_vde(void)
 {
-    u16 crtc_addr = get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     outb(0x12, crtc_addr);
     u16 vde = inb(crtc_addr + 1);
     outb(0x07, crtc_addr);
     outb(0x12, crtc_addr);
     u16 vde = inb(crtc_addr + 1);
     outb(0x07, crtc_addr);
@@ -405,7 +406,7 @@ stdvga_get_vde(void)
 void
 stdvga_save_state(u16 seg, struct saveVideoHardware *info)
 {
 void
 stdvga_save_state(u16 seg, struct saveVideoHardware *info)
 {
-    u16 crtc_addr = get_crtc();
+    u16 crtc_addr = stdvga_get_crtc();
     SET_FARVAR(seg, info->sequ_index, inb(VGAREG_SEQU_ADDRESS));
     SET_FARVAR(seg, info->crtc_index, inb(crtc_addr));
     SET_FARVAR(seg, info->grdc_index, inb(VGAREG_GRDC_ADDRESS));
     SET_FARVAR(seg, info->sequ_index, inb(VGAREG_SEQU_ADDRESS));
     SET_FARVAR(seg, info->crtc_index, inb(crtc_addr));
     SET_FARVAR(seg, info->grdc_index, inb(VGAREG_GRDC_ADDRESS));
index 0d5f59b5d41158e79704fc2d9effb3ed1445a9ca..fb983045fa487eab837d6a93ef6021ac44048c57 100644 (file)
@@ -129,6 +129,7 @@ void stdvga_grdc_write(u8 index, u8 value);
 void stdvga_set_text_block_specifier(u8 spec);
 void stdvga_load_font(u16 seg, void *src_far, u16 count
                       , u16 start, u8 destflags, u8 fontsize);
 void stdvga_set_text_block_specifier(u8 spec);
 void stdvga_load_font(u16 seg, void *src_far, u16 count
                       , u16 start, u8 destflags, u8 fontsize);
+u16 stdvga_get_crtc(void);
 void stdvga_set_cursor_shape(u8 start, u8 end);
 void stdvga_set_active_page(u16 address);
 void stdvga_set_cursor_pos(u16 address);
 void stdvga_set_cursor_shape(u8 start, u8 end);
 void stdvga_set_active_page(u16 address);
 void stdvga_set_cursor_pos(u16 address);