/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2009 coresystems GmbH
 * Copyright (C) 2009 Libra Li <libra.li@technexion.com>
 * Copyright (C) 2010 Siemens AG, Inc.
 * (Written by Josef Kellermann <joseph.kellermann@heitec.de> for Siemens AG, Inc.)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <stdint.h>
#include <stdlib.h>
#include <console/console.h>
#include <arch/interrupt.h>
#include <x86emu/regs.h>
#include "int15_func.h"

int sbios_INT15_handler(void);
/*extern*/ unsigned long vgainfo_addr;

static INT15_function_extensions __int15_func;

/* System BIOS int15 function */
int sbios_INT15_handler(void)
{
	int res = -1;

	printk(BIOS_DEBUG, "System BIOS INT 15h\n");

	switch (X86_EAX & 0xffff) {
#define BOOT_DISPLAY_DEFAULT    0
#define BOOT_DISPLAY_CRT        (1 << 0)
#define BOOT_DISPLAY_TV         (1 << 1)
#define BOOT_DISPLAY_EFP        (1 << 2)
#define BOOT_DISPLAY_LCD        (1 << 3)
#define BOOT_DISPLAY_CRT2       (1 << 4)
#define BOOT_DISPLAY_TV2        (1 << 5)
#define BOOT_DISPLAY_EFP2       (1 << 6)
#define BOOT_DISPLAY_LCD2       (1 << 7)
	case 0x5f35:
		X86_EAX = 0x5f;
		X86_ECX = BOOT_DISPLAY_DEFAULT;
		res = 0;
		break;
	case 0x5f40:
		X86_EAX = 0x5f;
		X86_ECX = 3; // This is mainboard specific
		printk(BIOS_DEBUG, "DISPLAY=%x\n", X86_ECX);
		res = 0;
		break;
	case 0x4e08:
		switch (X86_EBX & 0xff) {
			case 0x00:
				X86_EAX &= ~(0xff);
				X86_EBX = (X86_EBX & ~(0xff)) | __int15_func.regs.func00_LCD_panel_id;
				printk(BIOS_DEBUG, "DISPLAY = %x\n", X86_EBX & 0xff);
				res = 0;
				break;
			case 0x02:
				break;
			case 0x05:
				X86_EAX &= ~(0xff);
				X86_EBX = (X86_EBX & ~(0xff)) | __int15_func.regs.func05_TV_standard;
				printk(BIOS_DEBUG, "TV = %x\n", X86_EBX & 0xff);
				res = 0;
				break;
			case 0x80:
				X86_EAX &= ~(0xff);
				X86_EBX &= ~(0xff);
				printk(BIOS_DEBUG, "Integrated System Information = %x:%x\n", X86_EDX, X86_EDI);
				vgainfo_addr = (X86_EDX * 16) + X86_EDI;
				res = 0;
				break;
			case 0x89:
				X86_EAX &= ~(0xff);
				X86_EBX &= ~(0xff);
				printk(BIOS_DEBUG, "Get supported display device information\n");
				res = 0;
				break;
			default:
				break;
		}
	break;
	default:
		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_EAX & 0xffff);
		break;
	}

	return res;
}

/* Initialization VBIOS function extensions */
void install_INT15_function_extensions(INT15_function_extensions *int15_func)
{
	printk(BIOS_DEBUG, "Initialize function extensions for Callback function number 04E08h ..\n");
	__int15_func.regs.func00_LCD_panel_id = int15_func->regs.func00_LCD_panel_id;
	__int15_func.regs.func05_TV_standard = int15_func->regs.func05_TV_standard;
	mainboard_interrupt_handlers(0x15, &sbios_INT15_handler);
}
