aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2012-02-02 22:52:17 -0500
committerKevin O'Connor <kevin@koconnor.net>2012-02-02 22:52:17 -0500
commitcfd7ef9d8b38d9706671a4e88d40dcc4ac922b6a (patch)
treebd3a12909491fbbe04a59827b4a24986ef42623e
parentb88869564b2637d05dda14f6cededceebfbb0f66 (diff)
downloadseabios-cfd7ef9d8b38d9706671a4e88d40dcc4ac922b6a.tar.gz
vgabios: Handle VGA option rom being re-run.
Check for the case where the option rom is executed a second time - in that case re-init the hardware, but do not set any variables. This should make the rom better behaving when run from S3 resume. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--vgasrc/bochsvga.c3
-rw-r--r--vgasrc/clext.c19
-rw-r--r--vgasrc/vgabios.c8
-rw-r--r--vgasrc/vgabios.h1
4 files changed, 22 insertions, 9 deletions
diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c
index e6ab7941..92100044 100644
--- a/vgasrc/bochsvga.c
+++ b/vgasrc/bochsvga.c
@@ -258,6 +258,9 @@ bochsvga_init(void)
dispi_write(VBE_DISPI_INDEX_ID, VBE_DISPI_ID5);
+ if (GET_GLOBAL(HaveRunInit))
+ return 0;
+
u32 lfb_addr = VBE_DISPI_LFB_PHYSICAL_ADDRESS;
int bdf = GET_GLOBAL(VgaBDF);
if (CONFIG_VGA_PCI && bdf >= 0) {
diff --git a/vgasrc/clext.c b/vgasrc/clext.c
index 26b34e0d..0470d80a 100644
--- a/vgasrc/clext.c
+++ b/vgasrc/clext.c
@@ -590,6 +590,17 @@ clext_init(void)
return -1;
dprintf(1, "cirrus init 2\n");
+ // memory setup
+ stdvga_sequ_write(0x0a, stdvga_sequ_read(0x0f) & 0x18);
+ // set vga mode
+ stdvga_sequ_write(0x07, 0x00);
+ // reset bitblt
+ stdvga_grdc_write(0x31, 0x04);
+ stdvga_grdc_write(0x31, 0x00);
+
+ if (GET_GLOBAL(HaveRunInit))
+ return 0;
+
u32 lfb_addr = 0;
int bdf = GET_GLOBAL(VgaBDF);
if (CONFIG_VGA_PCI && bdf >= 0)
@@ -600,13 +611,5 @@ clext_init(void)
SET_VGA(VBE_total_memory, totalmem * 64 * 1024);
SET_VGA(VBE_win_granularity, 16);
- // memory setup
- stdvga_sequ_write(0x0a, stdvga_sequ_read(0x0f) & 0x18);
- // set vga mode
- stdvga_sequ_write(0x07, 0x00);
- // reset bitblt
- stdvga_grdc_write(0x31, 0x04);
- stdvga_grdc_write(0x31, 0x00);
-
return 0;
}
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index e69c6c51..ec251fe2 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -1271,13 +1271,14 @@ init_bios_area(void)
}
int VgaBDF VAR16 = -1;
+int HaveRunInit VAR16;
void VISIBLE16
vga_post(struct bregs *regs)
{
debug_enter(regs, DEBUG_VGA_POST);
- if (CONFIG_VGA_PCI) {
+ if (CONFIG_VGA_PCI && !GET_GLOBAL(HaveRunInit)) {
u16 bdf = regs->ax;
if ((pci_config_readw(bdf, PCI_VENDOR_ID)
== GET_GLOBAL(rom_pci_data.vendor))
@@ -1292,6 +1293,9 @@ vga_post(struct bregs *regs)
return;
}
+ if (GET_GLOBAL(HaveRunInit))
+ return;
+
init_bios_area();
SET_VGA(video_save_pointer_table.videoparam
@@ -1303,6 +1307,8 @@ vga_post(struct bregs *regs)
// XXX - clear screen and display info
+ SET_VGA(HaveRunInit, 1);
+
// Fixup checksum
extern u8 _rom_header_size, _rom_header_checksum;
SET_VGA(_rom_header_checksum, 0);
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index b47c6691..0aff6849 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -75,6 +75,7 @@ extern u8 vgafont16alt[];
// vgabios.c
extern int VgaBDF;
+extern int HaveRunInit;
#define SET_VGA(var, val) SET_FARVAR(get_global_seg(), (var), (val))
struct carattr {
u8 car, attr, use_attr;