On Wed, Feb 12, 2014 at 07:23:14PM -0500, Kevin O'Connor wrote:
On Wed, Feb 12, 2014 at 10:35:08PM +0100, Paul Menzel wrote:
Am Mittwoch, den 12.02.2014, 12:58 -0500 schrieb Kevin O'Connor:
I've run some basic tests on this version of SeaVGABIOS on my hardware. However, I don't have one of the boards where coreboot supports native vga init. It would be great if someone with the hardware (looks like stout, x60, and maybe others) could run tests.
Thanks to Luc, the VIA K8x890 based boards like Asus M2V-MX SE have had native graphics init for a long time.
commit aeb6c9870f0b1af8c0b55b2034f881da6757c4a4 Author: Luc Verhaegen <libv@skynet.be> Date: Thu Jul 23 16:04:58 2009 +0000 sb/via/k8t890: add vga textmode code for k8m890 chrome igp. Add initialisation for the VIA Chrome 9 IGP on the k8m890 through native code and through the general vga infrastructure i committed a month or two ago. Add videoram_size option for k8m890 and the Asus M2V-MX SE.
Looking through the output of
$ git grep k8t890 src/mainboard/
the boards Asus A8V-E Deluxe, Asus A8V-E SE, Asus K8V-X, Asus M2V-MX SE and Asus M2V should theoretically support that.
Okay. The SeaVGABIOS implementation is expecting a coreboot table (LB_TAG_FRAMEBUFFER). So, as long as that is present it should work.
FYI, I updated the test vgabios code to also support "EGA style" text buffers. If the LB_TAG_FRAMEBUFFER table isn't found, then SeaVGABIOS will assume there is an EGA style text buffer.
If anyone wants to give one of the above boards a try, the updated code is at:
https://github.com/KevinOConnor/seabios/tree/testing
Please see my previous email in this thread for directions on how to compile and use this branch.
-Kevin
Subject: [PATCH] vgabios: Add support for native coreboot EGA style text consoles. To: seabios@seabios.org
If a CB_TAG_FRAMEBUFFER coreboot table isn't found, assume there is a standard text mode console mapped at 0xB8000.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- vgasrc/Kconfig | 3 ++- vgasrc/cbvga.c | 50 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 17 deletions(-)
diff --git a/vgasrc/Kconfig b/vgasrc/Kconfig index 20ac2ce..00c5000 100644 --- a/vgasrc/Kconfig +++ b/vgasrc/Kconfig @@ -55,6 +55,7 @@ menu "VGA ROM" config VGA_COREBOOT depends on COREBOOT bool "coreboot linear framebuffer" + select VGA_STDVGA_FRAMEBUFFER select VGA_HIGH_FRAMEBUFFER help Build support for a vgabios wrapper around video @@ -116,7 +117,7 @@ menu "VGA ROM" Support VBE.
config VGA_PCI - depends on BUILD_VGABIOS + depends on BUILD_VGABIOS && !VGA_COREBOOT bool "PCI ROM Headers" default y help diff --git a/vgasrc/cbvga.c b/vgasrc/cbvga.c index d3dc2a4..305c798 100644 --- a/vgasrc/cbvga.c +++ b/vgasrc/cbvga.c @@ -7,19 +7,19 @@ #include "biosvar.h" // GET_BDA #include "cbvga.h" // cbvga_setup #include "output.h" // dprintf +#include "stdvga.h" // SEG_CTEXT +#include "string.h" // memset16_far #include "util.h" // find_cb_table #include "vgabios.h" // VGAREG_*
-#define CBMODENUM 0x140 -static struct vgamode_s CBmode VAR16 = { - MM_DIRECT, 0, 0, 0, 8, 16, 0 -}; +static int CBmode VAR16; +static struct vgamode_s CBmodeinfo VAR16; static u32 CBlinelength VAR16;
struct vgamode_s *cbvga_find_mode(int mode) { - if (mode == CBMODENUM) - return &CBmode; + if (mode == GET_GLOBAL(CBmode)) + return &CBmodeinfo; return NULL; }
@@ -27,7 +27,7 @@ void cbvga_list_modes(u16 seg, u16 *dest, u16 *last) { if (dest<last) { - SET_FARVAR(seg, *dest, CBMODENUM); + SET_FARVAR(seg, *dest, GET_GLOBAL(CBmode)); dest++; } SET_FARVAR(seg, *dest, 0xffff); @@ -93,7 +93,11 @@ int cbvga_set_mode(struct vgamode_s *vmode_g, int flags) { if (!(flags & MF_NOCLEARMEM)) { - int i, lines = GET_GLOBAL(CBmode.height); + if (GET_GLOBAL(CBmodeinfo.memmodel) == MM_TEXT) { + memset16_far(SEG_CTEXT, (void*)0, 0x0720, 80*25*2); + return 0; + } + int i, lines = GET_GLOBAL(CBmodeinfo.height); u32 stride = GET_GLOBAL(CBlinelength); void *dest = (void*)GET_GLOBAL(VBE_framebuffer); for (i=0; i<lines; i++, dest+=stride) @@ -137,8 +141,18 @@ cbvga_setup(void) } struct cb_framebuffer *cbfb = find_cb_subtable(cbh, CB_TAG_FRAMEBUFFER); if (!cbfb) { - dprintf(1, "Unable to find coreboot framebuffer table\n"); - return -1; + // Assume there is an EGA text framebuffer. + dprintf(1, "Did not find coreboot framebuffer - assuming EGA text\n"); + SET_VGA(CBmode, 0x03); + SET_VGA(CBlinelength, 80*2); + SET_VGA(CBmodeinfo.memmodel, MM_TEXT); + SET_VGA(CBmodeinfo.width, 80); + SET_VGA(CBmodeinfo.height, 25); + SET_VGA(CBmodeinfo.depth, 4); + SET_VGA(CBmodeinfo.cwidth, 9); + SET_VGA(CBmodeinfo.cheight, 16); + SET_VGA(CBmodeinfo.sstart, SEG_CTEXT); + return 0; }
u64 addr = GET_FARVAR(0, cbfb->physical_address); @@ -155,15 +169,19 @@ cbvga_setup(void) return -1; }
+ SET_VGA(CBmode, 0x140); SET_VGA(VBE_framebuffer, addr); SET_VGA(VBE_total_memory, linelength * ylines); SET_VGA(CBlinelength, linelength); - SET_VGA(CBmode.width, xlines); - SET_VGA(CBmode.height, ylines); - SET_VGA(CBmode.depth, bpp); - - // Setup BDA - vga_set_mode(CBMODENUM, MF_NOCLEARMEM); + SET_VGA(CBmodeinfo.memmodel, MM_DIRECT); + SET_VGA(CBmodeinfo.width, xlines); + SET_VGA(CBmodeinfo.height, ylines); + SET_VGA(CBmodeinfo.depth, bpp); + SET_VGA(CBmodeinfo.cwidth, 8); + SET_VGA(CBmodeinfo.cheight, 16); + + // Setup BDA and clear screen. + vga_set_mode(GET_GLOBAL(CBmode), MF_NOCLEARMEM);
return 0; }