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

Reply via email to