2N/A * GRUB -- GRand Unified Bootloader 2N/A * Copyright (C) 2005,2006,2007,2008,2009 Free Software Foundation, Inc. 2N/A * GRUB is free software: you can redistribute it and/or modify 2N/A * it under the terms of the GNU General Public License as published by 2N/A * the Free Software Foundation, either version 3 of the License, or 2N/A * (at your option) any later version. 2N/A * GRUB is distributed in the hope that it will be useful, 2N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of 2N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2N/A * GNU General Public License for more details. 2N/A * You should have received a copy of the GNU General Public License 2N/A/* Track last mode to support cards which fail on get_mode. */ 2N/A return (
void *) ((((
unsigned long)
ptr &
0xFFFF0000) >>
12UL)
2N/A + ((
unsigned long)
ptr &
0x0000FFFF));
2N/A asm volatile (
"xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" \
2N/A :
"=a" (a),
"=r" (b),
"=c" (c),
"=d" (d) \
2N/A asm volatile (
"rdmsr" :
"=a" (a),
"=d" (d) :
"c" (
num))
2N/A asm volatile (
"wrmsr" : :
"c" (
num),
"a" (
lo),
"d" (
hi) :
"memory")
2N/A/* Try to set up a variable-range write-combining MTRR for a memory region. 2N/A This is best-effort; if it seems too hard, we just accept the performance 2N/A degradation rather than risking undefined behaviour. It is intended 2N/A exclusively to work around BIOS bugs, as the BIOS should already be 2N/A setting up a suitable MTRR. */ 2N/A /* Check that fb_base and fb_size can be represented using a single 2N/A return;
/* under 1MB, so covered by fixed-range MTRRs */ 2N/A return;
/* over 36 bits, so out of range */ 2N/A return;
/* variable-range MTRRs must cover at least 4KB */ 2N/A return;
/* not a power of two */ 2N/A return;
/* not aligned on size boundary */ 2N/A /* Check CPU capabilities. */ 2N/A if (! (
mtrrcap &
0x00000400))
/* write-combining */ 2N/A bits_lo =
0xFFFFF000;
/* assume maxphyaddr >= 36 */ 2N/A /* Check whether an MTRR already covers this region. If not, take an 2N/A unused one if possible. */ 2N/A return;
/* existing MTRR overlaps this region */ 2N/A return;
/* all MTRRs in use */ 2N/A /* Set up the first unused MTRR we found. */ 2N/A/* Call VESA BIOS 0x4f09 to set palette data, return status. */ 2N/A/* Call VESA BIOS 0x4f00 to get VBE Controller Information, return status. */ 2N/A /* Store *controller_info to %es:%di. */ 2N/A/* Call VESA BIOS 0x4f01 to get VBE Mode Information, return status. */ 2N/A /* Store *mode_info to %es:%di. */ 2N/A/* Call VESA BIOS 0x4f02 to set video mode, return status. */ 2N/A /* Store *crtc_info to %es:%di. */ 2N/A/* Call VESA BIOS 0x4f03 to return current VBE Mode, return status. */ 2N/A/* Call VESA BIOS 0x4f05 to set memory window, return status. */ 2N/A /* BL = window, BH = 0, Set memory window. */ 2N/A/* Call VESA BIOS 0x4f05 to return memory window, return status. */ 2N/A /* BH = 1, Get memory window. BL = window. */ 2N/A/* Call VESA BIOS 0x4f06 to set scanline length (in bytes), return status. */ 2N/A /* BL = 2, Set Scan Line in Bytes. */ 2N/A/* Call VESA BIOS 0x4f06 to return scanline length (in bytes), return status. */ 2N/A /* BL = 1, Get Scan Line Length (in bytes). */ 2N/A/* Call VESA BIOS 0x4f07 to set display start, return status. */ 2N/A /* Store x in %ecx. */ 2N/A /* BL = 80h, Set Display Start during Vertical Retrace. */ 2N/A/* Call VESA BIOS 0x4f07 to get display start, return status. */ 2N/A /* BL = 1, Get Display Start. */ 2N/A/* Call VESA BIOS 0x4f0a. */ 2N/A/* Call VESA BIOS 0x4f11 to get flat panel information, return status. */ 2N/A/* Call VESA BIOS 0x4f15 to get DDC availability, return status. */ 2N/A/* Call VESA BIOS 0x4f15 to read EDID information, return status. */ 2N/A /* Clear caller's controller info block. */ 2N/A /* Do not probe more than one time, if not necessary. */ 2N/A /* Clear old copy of controller info block. */ 2N/A /* Mark VESA BIOS extension as undetected. */ 2N/A /* Use low memory scratch area as temporary storage 2N/A for VESA BIOS call. */ 2N/A /* Prepare info block. */ 2N/A /* Try to get controller info block. */ 2N/A /* Copy it for later usage. */ 2N/A /* Mark VESA BIOS extension as detected. */ 2N/A /* Make copy of controller info block to caller. */ 2N/A /* Use low memory scratch area as temporary storage for VESA BIOS calls. */ 2N/A /* Use low memory scratch area as temporary storage for VESA BIOS calls. */ 2N/A /* Make sure that VBE is supported. */ 2N/A /* Try to get mode info. */ 2N/A /* For all VESA BIOS modes, force linear frame buffer. */ 2N/A /* We only want linear frame buffer modes. */ 2N/A /* Determine frame buffer pixel format. */ 2N/A "unsupported pixel format 0x%x",
2N/A /* Get current mode. */ 2N/A /* Try to set video mode. */ 2N/A /* If this is not a VESA mode, guess address. */ 2N/A /* Check whether mode is text mode or graphics mode. */ 2N/A /* No special action needed for text mode as it is not supported for 2N/A graphical support. */ 2N/A /* Graphics mode. */ 2N/A /* If video mode is in indexed color, setup default VGA palette. */ 2N/A /* Make sure that the BIOS can reach the palette. */ 2N/A /* Just ignore the status. */ 2N/A /* Copy mode info for caller. */ 2N/A /* Make sure that VBE is supported. */ 2N/A /* Try to query current mode from VESA BIOS. */ 2N/A /* XXX: ATI cards don't support get_mode. */ 2N/A /* Make sure that VBE is supported. */ 2N/A /* If mode is not VESA mode, skip mode info query. */ 2N/A /* Try to get mode info from VESA BIOS. */ 2N/A "cannot get information on the mode %x",
mode);
2N/A /* Make copy of mode info block. */ 2N/A /* Just clear mode info block if it isn't a VESA mode. */ 2N/A /* Check if there is adapter present. 2N/A Firmware note: There has been a report that some cards store video mode 2N/A list in temporary memory. So we must first use vbe probe to get 2N/A refreshed information to receive valid pointers and data, and then 2N/A copy this information to somewhere safe. */ 2N/A /* Copy modelist to local memory. */ 2N/A while(*p++ !=
0xFFFF)
2N/A /* Adapter could be found, figure out initial video mode. */ 2N/A /* Free allocated resources. */ 2N/A /* Reset frame buffer. */ 2N/A /* Restore old video mode. */ 2N/A /* TODO: Decide, is this something we want to do. */ 2N/A /* TODO: Free any resources allocated by driver. */ 2N/A Set framebuffer render target page and display the proper page, based on 2N/A `doublebuf_state.render_page' and `doublebuf_state.displayed_page', 2N/A /* Tell the video adapter to display the new front page. */ 2N/A /* CGA is basically 4-bit packed pixel. */ 2N/A /* Non chain 4 is a special case of planar. */ 2N/A /* Calculate bytes_per_pixel value. */ 2N/A /* Could not retrieve mode info, retreat. */ 2N/A /* Decode depth from mode_type. If it is zero, then autodetect. */ 2N/A /* Fall back to 640x480. This is conservative, but the largest 2N/A mode supported by the graphics card may not be safe for the 2N/A /* Walk thru mode list and try to find matching mode. */ 2N/A /* Could not retrieve mode info, retreat. */ 2N/A /* If not available, skip it. */ 2N/A /* Monochrome is unusable. */ 2N/A /* We support only linear frame buffer modes. */ 2N/A /* We allow only graphical modes. */ 2N/A /* Not compatible memory model. */ 2N/A /* Unsupported bitdepth . */ 2N/A /* Resolution exceeds that of preferred mode. */ 2N/A /* Non matching resolution. */ 2N/A /* Check if user requested RGB or index color mode. */ 2N/A /* If there is a request for specific depth, ignore others. */ 2N/A /* Select mode with most of "volume" (size of framebuffer in bits). */ 2N/A /* Save so far best mode information for later use. */ 2N/A /* Try to initialize best mode found. */ 2N/A /* If this fails, then we have mode selection heuristics problem, 2N/A or adapter failure. */ 2N/A /* Fill mode info details. */ 2N/A /* Get video RAM size in bytes. */ 2N/A /* Copy default palette to initialize emulated palette. */ 2N/A /* Couldn't found matching mode. */ 2N/A /* TODO: Implement setting indexed color mode palette to hardware. */ 2N/A //status = grub_vbe_bios_set_palette_data (sizeof (vga_colors) 2N/A // / sizeof (struct grub_vbe_palette_data), 2N/A /* Then set color to emulated palette. */ 2N/A /* The total_memory field is in 64 KiB units. */ 2N/A .
name =
"VESA BIOS Extension Video Driver",