summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Reinauer <stepan@coresystems.de>2010-04-11 20:04:50 +0000
committerStefan Reinauer <stepan@openbios.org>2010-04-11 20:04:50 +0000
commitd9466493ec85045659336d11868ddd626944b650 (patch)
treef0c6e55e1c890433308e0fabb8ca35a364b86324
parent4cc5af95b510141214fb454ffbf7796d4e086813 (diff)
add int15 handler for thomson ip1000
fix mbi length detection, this will remove what looked like an endless loop during vga init in some cases. Signed-off-by: Stefan Reinauer <stepan@coresystems.de> Acked-by: Stefan Reinauer <stepan@coresystems.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5408 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r--src/mainboard/thomson/ip1000/mainboard.c62
-rw-r--r--src/northbridge/intel/i82830/i82830_smihandler.c8
-rw-r--r--src/northbridge/intel/i82830/vga.c2
3 files changed, 70 insertions, 2 deletions
diff --git a/src/mainboard/thomson/ip1000/mainboard.c b/src/mainboard/thomson/ip1000/mainboard.c
index f8f775a348..eeac3e3fc9 100644
--- a/src/mainboard/thomson/ip1000/mainboard.c
+++ b/src/mainboard/thomson/ip1000/mainboard.c
@@ -22,6 +22,9 @@
#include <device/device.h>
#include <boot/tables.h>
#include <delay.h>
+#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
+#include <x86emu/x86emu.h>
+#endif
#include <arch/coreboot_tables.h>
#include <arch/io.h>
#include "chip.h"
@@ -102,6 +105,61 @@ static void flash_gpios(void)
}
}
+
+#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
+static int int15_handler(void)
+{
+ u8 display_id;
+#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)
+
+ printk(BIOS_DEBUG, "%s: AX=%04x BX=%04x CX=%04x DX=%04x\n",
+ __func__, M.x86.R_AX, M.x86.R_BX, M.x86.R_CX, M.x86.R_DX);
+
+ switch (M.x86.R_AX) {
+ case 0x5f35: /* Boot Display */
+ M.x86.R_AX = 0x005f; // Success
+ // M.x86.R_CL = BOOT_DISPLAY_TV;
+ M.x86.R_CL = BOOT_DISPLAY_DEFAULT;
+ break;
+ case 0x5f36: /* Boot TV Format Hook */
+ printk(BIOS_DEBUG, "Boot TV Format Hook. TODO\n");
+ /* Interrupt was not handled */
+ return 0;
+ case 0x5f31: /* Post Completion Hook */
+ case 0x5f33: /* Hook After Mode Set */
+ case 0x5f34: /* Set Panel Fitting Hook */
+ case 0x5f38: /* Hook Before Mode Set */
+ case 0x5f45: /* Hook Before VESA VBE/DDC */
+ case 0x5f46: /* Hook Before VESA VBE/PM */
+ case 0x5f47: /* Notif Display Switch Hook */
+ case 0x5f65: /* Local Memory Initialization Hook */
+ /* Interrupt was not handled */
+ return 0;
+ default:
+ /* Interrupt was not handled */
+ return 0;
+ }
+
+ /* Interrupt handled */
+ return 1;
+}
+
+static void int15_install(void)
+{
+ typedef int (* yabel_handleIntFunc)(void);
+ extern yabel_handleIntFunc yabel_intFuncArray[256];
+ yabel_intFuncArray[0x15] = int15_handler;
+}
+#endif
+
static void mainboard_init(device_t dev)
{
parport_gpios();
@@ -111,6 +169,10 @@ static void mainboard_init(device_t dev)
static void mainboard_enable(device_t dev)
{
dev->ops->init = mainboard_init;
+#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
+ /* Install custom int15 handler for VGA OPROM */
+ int15_install();
+#endif
}
struct chip_operations mainboard_ops = {
diff --git a/src/northbridge/intel/i82830/i82830_smihandler.c b/src/northbridge/intel/i82830/i82830_smihandler.c
index e53d283b4b..733e624c26 100644
--- a/src/northbridge/intel/i82830/i82830_smihandler.c
+++ b/src/northbridge/intel/i82830/i82830_smihandler.c
@@ -187,7 +187,7 @@ static void mbi_call(u8 subf, banner_id_t *banner_id)
int i, count=0;
obj_header->banner.retsts = MSH_IF_NOT_FOUND;
- for (i=0; i< mbi_len;) {
+ for (i=0; i<mbi_len;) {
int len;
if (!(mbi[i] == 0xf0 && mbi [i+1] == 0xf6)) {
@@ -199,6 +199,12 @@ static void mbi_call(u8 subf, banner_id_t *banner_id)
len = ALIGN((mbi_header->size * 16) + sizeof(mbi_header) + mbi_header->name_len, 16);
if (obj_header->objnum == count) {
+#ifdef DEBUG_SMI_I82830
+ if (mbi_header->name_len == 0xff) {
+ printk(BIOS_DEBUG, "| |- corrupt.\n");
+ break;
+ }
+#endif
int headerlen = ALIGN(sizeof(mbi_header) + mbi_header->name_len + 15, 16);
#ifdef DEBUG_SMI_I82830
printk(BIOS_DEBUG, "| |- headerlen = %d\n", headerlen);
diff --git a/src/northbridge/intel/i82830/vga.c b/src/northbridge/intel/i82830/vga.c
index 37c967414b..66b591b548 100644
--- a/src/northbridge/intel/i82830/vga.c
+++ b/src/northbridge/intel/i82830/vga.c
@@ -42,7 +42,7 @@ static void vga_init(device_t dev)
"type %x\n", file->type, CBFS_TYPE_MBI);
} else {
mbi = (void *) CBFS_SUBHEADER(file);
- mbi_len = file->len;
+ mbi_len = ntohl(file->len);
}
} else {
printk(BIOS_INFO, "Could not find MBI.\n");