X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=vgasrc%2Fvgabios.c;h=62b09b45caad464c3e9d8014a75d4f0f4b1d9e72;hb=4a73f933968e5cf6f2a6ce1ad87448dd6b136e48;hp=cd39cf1311a910e4e69ca6080d8a242bdabdab60;hpb=efb4523d4b65999970fd3d07ac5db36b46a27daa;p=seabios.git diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c index cd39cf1..62b09b4 100644 --- a/vgasrc/vgabios.c +++ b/vgasrc/vgabios.c @@ -20,11 +20,27 @@ #include "stdvga.h" // stdvga_set_cursor_shape #include "clext.h" // clext_1012 #include "vgahw.h" // vgahw_set_mode +#include "pci.h" // pci_config_readw +#include "pci_regs.h" // PCI_VENDOR_ID // XXX #define DEBUG_VGA_POST 1 #define DEBUG_VGA_10 3 +// Standard Video Save Pointer Table +struct VideoSavePointer_s { + struct segoff_s videoparam; + struct segoff_s paramdynamicsave; + struct segoff_s textcharset; + struct segoff_s graphcharset; + struct segoff_s secsavepointer; + u8 reserved[8]; +} PACKED; + +static struct VideoSavePointer_s video_save_pointer_table VAR16; + +struct VideoParam_s video_param_table[29] VAR16; + /**************************************************************** * PCI Data @@ -135,7 +151,7 @@ set_active_page(u8 page) return; // Get the mode - struct vgamode_s *vmode_g = vgahw_find_mode(GET_BDA(video_mode)); + struct vgamode_s *vmode_g = get_current_mode(); if (!vmode_g) return; @@ -320,6 +336,17 @@ restore_bda_state(u16 seg, struct saveBDAstate *info) SET_IVT(0x43, GET_FARVAR(seg, info->font1)); } + +/**************************************************************** + * Mode setting + ****************************************************************/ + +struct vgamode_s * +get_current_mode(void) +{ + return vgahw_find_mode(GET_BDA(video_mode)); +} + // Setup BDA after a mode switch. void modeswitch_set_bda(int mode, int flags, struct vgamode_s *vmode_g) @@ -1212,14 +1239,19 @@ init_bios_area(void) SET_BDA(video_msr, 0x09); } -u16 VgaBDF VAR16; +int VgaBDF VAR16 = -1; void VISIBLE16 vga_post(struct bregs *regs) { debug_enter(regs, DEBUG_VGA_POST); - SET_VGA(VgaBDF, regs->ax); + if (CONFIG_VGA_PCI) { + u16 bdf = regs->ax; + if (pci_config_readw(bdf, PCI_VENDOR_ID) == CONFIG_VGA_VID + && pci_config_readw(bdf, PCI_DEVICE_ID) == CONFIG_VGA_DID) + SET_VGA(VgaBDF, bdf); + } int ret = vgahw_init(); if (ret) { @@ -1229,7 +1261,9 @@ vga_post(struct bregs *regs) init_bios_area(); - build_video_param(); + SET_VGA(video_save_pointer_table.videoparam + , SEGOFF(get_global_seg(), (u32)video_param_table)); + stdvga_build_video_param(); extern void entry_10(void); SET_IVT(0x10, SEGOFF(get_global_seg(), (u32)entry_10));