#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
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;
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)
}
+static u8 static_functionality[0x10] VAR16 = {
+ /* 0 */ 0xff, // All modes supported #1
+ /* 1 */ 0xe0, // All modes supported #2
+ /* 2 */ 0x0f, // All modes supported #3
+ /* 3 */ 0x00, 0x00, 0x00, 0x00, // reserved
+ /* 7 */ 0x07, // 200, 350, 400 scan lines
+ /* 8 */ 0x02, // mamimum number of visible charsets in text mode
+ /* 9 */ 0x08, // total number of charset blocks in text mode
+ /* a */ 0xe7, // Change to add new functions
+ /* b */ 0x0c, // Change to add new functions
+ /* c */ 0x00, // reserved
+ /* d */ 0x00, // reserved
+ /* e */ 0x00, // Change to add new functions
+ /* f */ 0x00 // reserved
+};
+
struct funcInfo {
struct segoff_s static_functionality;
u8 bda_0x49[30];
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) {
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));