static int vesa_probe(void) { #if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID) u16 ax, cx, di; u16 mode; addr_t mode_ptr; struct mode_info *mi; int nmodes = 0; video_vesa.modes = GET_HEAP(struct mode_info, 0); ax = 0x4f00; di = (size_t)&vginfo; asm(INT10 : "+a" (ax), "+D" (di), "=m" (vginfo) : : "ebx", "ecx", "edx", "esi"); if (ax != 0x004f || vginfo.signature != VESA_MAGIC || vginfo.version < 0x0102) return 0; /* Not present */ #endif /* CONFIG_VIDEO_VESA || CONFIG_FIRMWARE_EDID */ #ifdef CONFIG_VIDEO_VESA set_fs(vginfo.video_mode_ptr.seg); mode_ptr = vginfo.video_mode_ptr.off; while ((mode = rdfs16(mode_ptr)) != 0xffff) { mode_ptr += 2; if (!heap_free(sizeof(struct mode_info))) break; /* Heap full, can't save mode info */ if (mode & ~0x1ff) continue; memset(&vminfo, 0, sizeof vminfo); /* Just in case... */ ax = 0x4f01; cx = mode; di = (size_t)&vminfo; asm(INT10 : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo) : : "ebx", "edx", "esi"); if (ax != 0x004f) continue; if ((vminfo.mode_attr & 0x15) == 0x05) { /* Text Mode, TTY BIOS supported, supported by hardware */ mi = GET_HEAP(struct mode_info, 1); mi->mode = mode + VIDEO_FIRST_VESA; mi->depth = 0; /* text */ mi->x = vminfo.h_res; mi->y = vminfo.v_res; nmodes++; } else if ((vminfo.mode_attr & 0x99) == 0x99 &&
static int bios_probe(void) { u8 mode; #ifdef _WAKEUP u8 saved_mode = 0x03; #else u8 saved_mode = boot_params.screen_info.orig_video_mode; #endif u16 crtc; struct mode_info *mi; int nmodes = 0; if (adapter != ADAPTER_EGA && adapter != ADAPTER_VGA) return 0; set_fs(0); crtc = vga_crtc(); video_bios.modes = GET_HEAP(struct mode_info, 0); for (mode = 0x14; mode <= 0x7f; mode++) { if (!heap_free(sizeof(struct mode_info))) break; if (mode_defined(VIDEO_FIRST_BIOS+mode)) continue; if (set_bios_mode(mode)) continue; /* Try to verify that it's a text mode. */ /* Attribute Controller: make graphics controller disabled */ if (in_idx(0x3c0, 0x10) & 0x01) continue; /* Graphics Controller: verify Alpha addressing enabled */ if (in_idx(0x3ce, 0x06) & 0x01) continue; /* CRTC cursor location low should be zero(?) */ if (in_idx(crtc, 0x0f)) continue; mi = GET_HEAP(struct mode_info, 1); mi->mode = VIDEO_FIRST_BIOS+mode; mi->depth = 0; /* text */ mi->x = rdfs16(0x44a); mi->y = rdfs8(0x484)+1; nmodes++; } set_bios_mode(saved_mode); return nmodes; }
static int vesa_probe(void) { struct biosregs ireg, oreg; u16 mode; addr_t mode_ptr; struct mode_info *mi; int nmodes = 0; video_vesa.modes = GET_HEAP(struct mode_info, 0); initregs(&ireg); ireg.ax = 0x4f00; ireg.di = (size_t)&vginfo; intcall(0x10, &ireg, &oreg); if (oreg.ax != 0x004f || vginfo.signature != VESA_MAGIC || vginfo.version < 0x0102) return 0; /* Not present */ set_fs(vginfo.video_mode_ptr.seg); mode_ptr = vginfo.video_mode_ptr.off; while ((mode = rdfs16(mode_ptr)) != 0xffff) { mode_ptr += 2; if (!heap_free(sizeof(struct mode_info))) break; /* Heap full, can't save mode info */ if (mode & ~0x1ff) continue; memset(&vminfo, 0, sizeof vminfo); /* Just in case... */ ireg.ax = 0x4f01; ireg.cx = mode; ireg.di = (size_t)&vminfo; intcall(0x10, &ireg, &oreg); if (oreg.ax != 0x004f) continue; if ((vminfo.mode_attr & 0x15) == 0x05) { /* Text Mode, TTY BIOS supported, supported by hardware */ mi = GET_HEAP(struct mode_info, 1); mi->mode = mode + VIDEO_FIRST_VESA; mi->depth = 0; /* text */ mi->x = vminfo.h_res; mi->y = vminfo.v_res; nmodes++; } else if ((vminfo.mode_attr & 0x99) == 0x99 &&
int query_mca(void) { struct biosregs ireg, oreg; u16 len; initregs(&ireg); ireg.ah = 0xc0; intcall(0x15, &ireg, &oreg); if (oreg.eflags & X86_EFLAGS_CF) return -1; /* No MCA present */ set_fs(oreg.es); len = rdfs16(oreg.bx); if (len > sizeof(boot_params.sys_desc_table)) len = sizeof(boot_params.sys_desc_table); copy_from_fs(&boot_params.sys_desc_table, oreg.bx, len); return 0; }