This version of vgahooks.c was used for the vx800 example board. It
makes some changes to int15 support.
-Bari
// Hooks for via vgabios calls into main bios.
//
// Copyright (C) 2008 Kevin O'Connor <[email protected]>
//
// This file may be distributed under the terms of the GNU GPLv3 license.
#include "bregs.h" // set_code_fail
#include "biosvar.h" // GET_GLOBAL
#include "pci.h" // pci_find_device
#include "pci_ids.h" // PCI_VENDOR_ID_VIA
#include "util.h" // handle_155f
#include "config.h" // CONFIG_*
/*
static void
handle_155f00(struct bregs *regs)
{
regs->eax = 0x5f;
set_success(regs);
}
static void
handle_155f01(struct bregs *regs)
{
regs->eax = 0x5f;
regs->ecx = (regs->ecx & 0xffffff00 ) | 2; // panel type = 2 = 1024 * 768
set_success(regs);
dprintf(1, "Warning: VGA panel type is hardcoded\n");
}
static void
handle_155f02(struct bregs *regs)
{
regs->eax = 0x5f;
regs->ebx= (regs->ebx & 0xffff0000) | 2;
regs->ecx= (regs->ecx & 0xffff0000) | 0x401; // PAL + crt only
regs->edx= (regs->edx & 0xffff0000) | 0; // TV Layout - default
set_success(regs);
dprintf(1, "Warning: VGA TV/CRT output type is hardcoded\n");
}
static void
handle_155f0f(struct bregs *regs)
{
regs->eax = 0x5f;
set_success(regs);
}
*/
static void
handle_155f18(struct bregs *regs)
{
//regs->ebx = 0x86; MCLK = 667(8=667), 64M (2^ 6)frame buffer,
u8 i;
int bdf;
bdf = pci_find_device(0x1106,0x3409);
i=pci_config_readb(bdf,0xa1);
i=(i&0x70);
i=i>>4;
if(i==0){
regs->eax=0x00; //not support 5f18
set_code_fail(regs, RET_EUNSUPPORTED);
}
i=i+2;
regs->ebx=(u32)i;
i=pci_config_readb(bdf,0x90);
i=(i&0x07);
i=i+3;
i=i<<4;
regs->ebx=(regs->ebx)+((u32)i);
regs->eax=0x5f;
set_success(regs);
}
/*
static void
handle_155f19(struct bregs *regs)
{
regs->eax = 0x5f;
regs->ecx = 0x3;
set_success(regs);
}
*/
/*static void
handle_155fXX(struct bregs *regs)
{
regs->eax = 0x00;
set_code_fail(regs, RET_EUNSUPPORTED);
}
*/
static void
handle_155f00(struct bregs *regs)
{
regs->eax = 0;
regs->ebx = 0;
regs->ecx = 0;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f01(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0;
regs->ecx = 0x02;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f02(struct bregs *regs)
{
regs->eax = 0x005F005F;
regs->ebx = 0x01000300;
regs->ecx = 0x03000003;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f03(struct bregs *regs)
{
regs->eax = 0x005F0000;
regs->ebx = 0;
regs->ecx = 0x1C000000;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f04(struct bregs *regs)
{
regs->eax = 0x005F0000;
regs->ebx = 0;
regs->ecx = 0x00100000;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f05(struct bregs *regs)
{
regs->eax = 0x005F0000;
regs->ebx = 0;
regs->ecx = 0x00020000;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f07(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0x00040300;
regs->ecx = 0x04000003;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f08(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0x00040300;
regs->ecx = 0x04000003;
regs->edx = 0;
set_success(regs);
}
/*
static void
handle_155f18(struct bregs *regs)
{
regs->eax = 0x0000005F;
regs->ebx = 0x00000086;
regs->ecx = 0;
regs->edx = 0;
set_success(regs);
}
*/
static void
handle_155f19(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0x00040300;
regs->ecx = 0x04000003;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f21(struct bregs *regs)
{
regs->eax = 0x00008000;
regs->ebx = 0;
regs->ecx = 0;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f22(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0x00000100;
regs->ecx = 0x04040300;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f24(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0;
regs->ecx = 0x00001C00;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f26(struct bregs *regs)
{
regs->eax = 0x0000005F;
regs->ebx = 0;
regs->ecx = 0x00000010;
regs->edx = 0;
set_success(regs);
}
static void
handle_155f28(struct bregs *regs)
{
regs->eax = 0x8000005F;
regs->ebx = 0;
regs->ecx = 0x00000002;
regs->edx = 0;
set_success(regs);
}
static void
handle_155fXX(struct bregs *regs)
{
regs->eax = 0x00;
set_code_fail(regs, RET_EUNSUPPORTED);
}
void
handle_155f(struct bregs *regs)
{
if (! CONFIG_VGAHOOKS) {
handle_155fXX(regs);
return;
}
switch (regs->al) {
/* case 0x00: handle_155f00(regs); break;
case 0x01: handle_155f01(regs); break;
case 0x02: handle_155f02(regs); break;
case 0x0f: handle_155f0f(regs); break;
case 0x18: handle_155f18(regs); break;
case 0x19: handle_155f19(regs); break;*/
case 0x00: handle_155f00(regs); break;
case 0x01: handle_155f01(regs); break;
case 0x02: handle_155f02(regs); break;
case 0x03: handle_155f03(regs); break;
case 0x04: handle_155f04(regs); break;
case 0x05: handle_155f05(regs); break;
case 0x06: handle_155f00(regs); break;
case 0x07: handle_155f07(regs); break;
case 0x08: handle_155f08(regs); break;
case 0x09: handle_155f00(regs); break;
case 0x0a: handle_155f00(regs); break;
case 0x0b: handle_155f00(regs); break;
case 0x0f: handle_155f00(regs); break;
case 0x10: handle_155f00(regs); break;
case 0x18: handle_155f18(regs); break;
case 0x19: handle_155f19(regs); break;
case 0x1a: handle_155f00(regs); break;
case 0x21: handle_155f21(regs); break;
case 0x22: handle_155f22(regs); break;
case 0x24: handle_155f24(regs); break;
case 0x26: handle_155f26(regs); break;
case 0x28: handle_155f28(regs); break;
default: handle_155fXX(regs); break;
}
}
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot