[coreboot-gerrit] Patch set updated for coreboot: 548620a Fix VGA option rom INT15 handler

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Wed Nov 20 01:10:17 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4135

-gerrit

commit 548620ad4900bb0949097c4d3f4dd638db2822f4
Author: Stefan Reinauer <reinauer at chromium.org>
Date:   Tue Apr 23 15:00:02 2013 -0700

    Fix VGA option rom INT15 handler
    
    The format of this function changed but was not updated in
    all mainboards.  This fixes all Sandybridge/Ivybridge boards.
    The int15 handler no longer takes a regs structure as an
    argument and instead uses global variables.  The yabel interface
    is now similar enough that we can drop the duplicate handler.
    
    Change-Id: Icdaae4d6d50884f6d7bce7a167d48cb1d4807010
    Reviewed-on: https://gerrit.chromium.org/gerrit/48969
    Reviewed-by: Aaron Durbin <adurbin at chromium.org>
    Commit-Queue: Stefan Reinauer <reinauer at google.com>
    Tested-by: Stefan Reinauer <reinauer at google.com>
---
 src/mainboard/google/butterfly/mainboard.c | 152 +++++------------------------
 src/mainboard/google/link/mainboard.c      | 152 +++++------------------------
 src/mainboard/google/parrot/mainboard.c    | 152 +++++------------------------
 src/mainboard/google/stout/mainboard.c     | 152 +++++------------------------
 4 files changed, 91 insertions(+), 517 deletions(-)

diff --git a/src/mainboard/google/butterfly/mainboard.c b/src/mainboard/google/butterfly/mainboard.c
index a1d9126..c33b9cf 100644
--- a/src/mainboard/google/butterfly/mainboard.c
+++ b/src/mainboard/google/butterfly/mainboard.c
@@ -2,7 +2,7 @@
  * This file is part of the coreboot project.
  *
  * Copyright (C) 2007-2009 coresystems GmbH
- * Copyright (C) 2011-2012 The ChromiumOS Authors.  All rights reserved.
+ * Copyright (C) 2011-2012 Google 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
@@ -24,7 +24,7 @@
 #include <device/pci_def.h>
 #include <device/pci_ops.h>
 #include <console/console.h>
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 #include <x86emu/x86emu.h>
 #endif
 #include <pc80/mc146818rtc.h>
@@ -191,15 +191,15 @@ void mainboard_suspend_resume(void)
 	outb(0xcb, 0xb2);
 }
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_REALMODE) && CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static int int15_handler(struct eregs *regs)
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
+static int int15_handler(void)
 {
 	int res = -1;
 
 	printk(BIOS_DEBUG, "%s: INT15 function %04x!\n",
-	       __func__, regs->eax & 0xffff);
+	       __func__, X86_AX);
 
-	switch (regs->eax & 0xffff) {
+	switch (X86_AX) {
 	case 0x5f34:
 		/*
 		 * Set Panel Fitting Hook:
@@ -208,10 +208,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 0 = Centering (do not set with bit1 or bit2)
 		 *  0     = video bios default
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffffff00;
-		regs->ecx |= 0x00;	/* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CL = 0x00;	/* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f35:
@@ -226,10 +224,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 6 = EFP2
 		 *  bit 7 = LFP2
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0000;	/* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CX = 0x0000;	/* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f51:
@@ -240,148 +236,46 @@ static int int15_handler(struct eregs *regs)
 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0001;	/* Int-LVDS */
+		X86_AX = 0x005f;
+		X86_CX = 0x0001;	/* Int-LVDS */
 		res = 0;
 		break;
 	case 0x5f70:
-		switch ((regs->ecx >> 8) & 0xff) {
+		switch (X86_CH) {
 		case 0:
 			/* Get Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 1:
 			/* Set Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 2:
 			/* Get SG/Non-SG mode */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		default:
 			/* Interrupt was not handled */
 			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-			       ((regs->ecx >> 8) & 0xff));
+			       X86_CH);
 			return 0;
 		}
 		break;
 
 	default:
-		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n",
-		       regs->eax & 0xffff);
+		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX);
 		break;
 	}
 	return res;
 }
 #endif
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
-static int int15_handler(void)
-{
-	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 0x5f34:
-		/*
-		 * Set Panel Fitting Hook:
-		 *  bit 2 = Graphics Stretching
-		 *  bit 1 = Text Stretching
-		 *  bit 0 = Centering (do not set with bit1 or bit2)
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x00;
-		break;
-	case 0x5f35:
-		/*
-		 * Boot Display Device Hook:
-		 *  bit 0 = CRT
-		 *  bit 1 = TV (eDP)
-		 *  bit 2 = EFP
-		 *  bit 3 = LFP
-		 *  bit 4 = CRT2
-		 *  bit 5 = TV2 (eDP)
-		 *  bit 6 = EFP2
-		 *  bit 7 = LFP2
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x0000;	/* Use video bios default */
-		break;
-	case 0x5f51:
-		/*
-		 * Hook to select active LFP configuration:
-		 *  00h = No LVDS, VBIOS does not enable LVDS
-		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder
-		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
-		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 1;	/* Int-LVDS */
-		break;
-	case 0x5f70:
-		switch (M.x86.R_CH) {
-		case 0:
-			/* Get Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CL = 0;
-			break;
-		case 1:
-			/* Set Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		case 2:
-			/* Get SG/Non-SG mode */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		default:
-			/* Interrupt was not handled */
-			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-			       M.x86.R_CH);
-			return 0;
-		}
-		break;
-	default:
-		/* Interrupt was not handled */
-		printk(BIOS_DEBUG, "Unknown INT15 function: 0x%04x\n",
-		       M.x86.R_AX);
-		return 0;
-	}
-
-	/* Interrupt handled */
-	return 1;
-}
-#endif
-
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static void int15_install(void)
-{
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
-	typedef int (*yabel_handleIntFunc)(void);
-	extern yabel_handleIntFunc yabel_intFuncArray[256];
-	yabel_intFuncArray[0x15] = int15_handler;
-#endif
-#ifdef CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-	mainboard_interrupt_handlers(0x15, &int15_handler);
-#endif
-}
-#endif
-
 /* Audio Setup */
 
 extern const u32 *cim_verb_data;
@@ -494,9 +388,9 @@ static void mainboard_enable(device_t dev)
 {
 	dev->ops->init = mainboard_init;
 	dev->ops->get_smbios_data = butterfly_onboard_smbios_data;
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 	/* Install custom int15 handler for VGA OPROM */
-	int15_install();
+	mainboard_interrupt_handlers(0x15, &int15_handler);
 #endif
 	verb_setup();
 }
diff --git a/src/mainboard/google/link/mainboard.c b/src/mainboard/google/link/mainboard.c
index f0afd81..01d4484 100644
--- a/src/mainboard/google/link/mainboard.c
+++ b/src/mainboard/google/link/mainboard.c
@@ -25,7 +25,7 @@
 #include <device/pci_def.h>
 #include <device/pci_ops.h>
 #include <console/console.h>
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 #include <x86emu/x86emu.h>
 #endif
 #include <pc80/mc146818rtc.h>
@@ -61,15 +61,15 @@ void mainboard_suspend_resume(void)
 	outb(0xcb, 0xb2);
 }
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_REALMODE) && CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static int int15_handler(struct eregs *regs)
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
+static int int15_handler(void)
 {
 	int res=-1;
 
 	printk(BIOS_DEBUG, "%s: INT15 function %04x!\n",
-			__func__, regs->eax & 0xffff);
+			__func__, X86_AX);
 
-	switch(regs->eax & 0xffff) {
+	switch(X86_AX) {
 	case 0x5f34:
 		/*
 		 * Set Panel Fitting Hook:
@@ -78,10 +78,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 0 = Centering (do not set with bit1 or bit2)
 		 *  0     = video bios default
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffffff00;
-		regs->ecx |= 0x00; /* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CL = 0x00; /* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f35:
@@ -96,10 +94,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 6 = EFP2
 		 *  bit 7 = LFP2
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0000; /* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CX = 0x0000; /* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f51:
@@ -110,42 +106,34 @@ static int int15_handler(struct eregs *regs)
 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0003; /* eDP */
+		X86_AX = 0x005f;
+		X86_CX = 0x0003; /* eDP */
 		res = 0;
 		break;
 	case 0x5f70:
-		switch ((regs->ecx >> 8) & 0xff) {
+		switch (X86_CH) {
 		case 0:
 			/* Get Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 1:
 			/* Set Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 2:
 			/* Get SG/Non-SG mode */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		default:
 			/* Interrupt was not handled */
 			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-				((regs->ecx >> 8) & 0xff));
+				X86_CH);
 			return 0;
 		}
 		break;
@@ -153,109 +141,13 @@ static int int15_handler(struct eregs *regs)
 		res = 0;
 		break;
         default:
-		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n",
-				regs->eax & 0xffff);
+		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX);
 		break;
 	}
 	return res;
 }
 #endif
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
-static int int15_handler(void)
-{
-	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 0x5f34:
-		/*
-		 * Set Panel Fitting Hook:
-		 *  bit 2 = Graphics Stretching
-		 *  bit 1 = Text Stretching
-		 *  bit 0 = Centering (do not set with bit1 or bit2)
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x00;
-		break;
-	case 0x5f35:
-		/*
-		 * Boot Display Device Hook:
-		 *  bit 0 = CRT
-		 *  bit 1 = TV (eDP)
-		 *  bit 2 = EFP
-		 *  bit 3 = LFP
-		 *  bit 4 = CRT2
-		 *  bit 5 = TV2 (eDP)
-		 *  bit 6 = EFP2
-		 *  bit 7 = LFP2
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x0000; /* Use video bios default */
-		break;
-	case 0x5f51:
-		/*
-		 * Hook to select active LFP configuration:
-		 *  00h = No LVDS, VBIOS does not enable LVDS
-		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder
-		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
-		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 3; /* eDP */
-		break;
-	case 0x5f70:
-		switch (M.x86.R_CH) {
-		case 0:
-			/* Get Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CL = 0;
-			break;
-		case 1:
-			/* Set Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		case 2:
-			/* Get SG/Non-SG mode */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		default:
-			/* Interrupt was not handled */
-			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-				M.x86.R_CH);
-			return 0;
-		}
-		break;
-	case 0x5fac:
-		break;
-	default:
-		/* Interrupt was not handled */
-		printk(BIOS_DEBUG, "Unknown INT15 function: 0x%04x\n",
-			M.x86.R_AX);
-		return 0;
-	}
-
-	/* Interrupt handled */
-	return 1;
-}
-#endif
-
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static void int15_install(void)
-{
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
-	typedef int (* yabel_handleIntFunc)(void);
-	extern yabel_handleIntFunc yabel_intFuncArray[256];
-	yabel_intFuncArray[0x15] = int15_handler;
-#endif
-#ifdef CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-	mainboard_interrupt_handlers(0x15, &int15_handler);
-#endif
-}
-#endif
-
 /* Audio Setup */
 
 extern const u32 * cim_verb_data;
@@ -343,9 +235,9 @@ static void mainboard_enable(device_t dev)
 {
 	dev->ops->init = mainboard_init;
 	dev->ops->get_smbios_data = link_onboard_smbios_data;
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 	/* Install custom int15 handler for VGA OPROM */
-	int15_install();
+	mainboard_interrupt_handlers(0x15, &int15_handler);
 #endif
 	verb_setup();
 }
diff --git a/src/mainboard/google/parrot/mainboard.c b/src/mainboard/google/parrot/mainboard.c
index 3822723..c07d9e2 100644
--- a/src/mainboard/google/parrot/mainboard.c
+++ b/src/mainboard/google/parrot/mainboard.c
@@ -2,7 +2,7 @@
  * This file is part of the coreboot project.
  *
  * Copyright (C) 2007-2009 coresystems GmbH
- * Copyright (C) 2011 The ChromiumOS Authors.  All rights reserved.
+ * Copyright (C) 2011 Google 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
@@ -24,7 +24,7 @@
 #include <device/pci_def.h>
 #include <device/pci_ops.h>
 #include <console/console.h>
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 #include <x86emu/x86emu.h>
 #endif
 #include <pc80/mc146818rtc.h>
@@ -49,15 +49,15 @@ void mainboard_suspend_resume(void)
 	outb(0xe1, 0xb2);
 }
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_REALMODE) && CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static int int15_handler(struct eregs *regs)
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
+static int int15_handler(void)
 {
 	int res=-1;
 
 	printk(BIOS_DEBUG, "%s: INT15 function %04x!\n",
-			__func__, regs->eax & 0xffff);
+			__func__, X86_AX);
 
-	switch(regs->eax & 0xffff) {
+	switch(X86_AX) {
 	case 0x5f34:
 		/*
 		 * Set Panel Fitting Hook:
@@ -66,10 +66,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 0 = Centering (do not set with bit1 or bit2)
 		 *  0     = video bios default
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffffff00;
-		regs->ecx |= 0x00; /* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CL = 0x00; /* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f35:
@@ -84,10 +82,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 6 = EFP2
 		 *  bit 7 = LFP2
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0000; /* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CX = 0x0000; /* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f51:
@@ -98,148 +94,46 @@ static int int15_handler(struct eregs *regs)
 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0003; /* eDP */
+		X86_AX = 0x005f;
+		X86_CX = 0x0003; /* eDP */
 		res = 0;
 		break;
 	case 0x5f70:
-		switch ((regs->ecx >> 8) & 0xff) {
+		switch (X86_CH) {
 		case 0:
 			/* Get Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 1:
 			/* Set Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 2:
 			/* Get SG/Non-SG mode */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		default:
 			/* Interrupt was not handled */
 			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-				((regs->ecx >> 8) & 0xff));
+				X86_CH);
 			return 0;
 		}
 		break;
 
         default:
-		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n",
-				regs->eax & 0xffff);
+		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX);
 		break;
 	}
 	return res;
 }
 #endif
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
-static int int15_handler(void)
-{
-	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 0x5f34:
-		/*
-		 * Set Panel Fitting Hook:
-		 *  bit 2 = Graphics Stretching
-		 *  bit 1 = Text Stretching
-		 *  bit 0 = Centering (do not set with bit1 or bit2)
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x00;
-		break;
-	case 0x5f35:
-		/*
-		 * Boot Display Device Hook:
-		 *  bit 0 = CRT
-		 *  bit 1 = TV (eDP)
-		 *  bit 2 = EFP
-		 *  bit 3 = LFP
-		 *  bit 4 = CRT2
-		 *  bit 5 = TV2 (eDP)
-		 *  bit 6 = EFP2
-		 *  bit 7 = LFP2
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x0000; /* Use video bios default */
-		break;
-	case 0x5f51:
-		/*
-		 * Hook to select active LFP configuration:
-		 *  00h = No LVDS, VBIOS does not enable LVDS
-		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder
-		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
-		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 3; /* eDP */
-		break;
-	case 0x5f70:
-		switch (M.x86.R_CH) {
-		case 0:
-			/* Get Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CL = 0;
-			break;
-		case 1:
-			/* Set Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		case 2:
-			/* Get SG/Non-SG mode */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		default:
-			/* Interrupt was not handled */
-			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-				M.x86.R_CH);
-			return 0;
-		}
-		break;
-	default:
-		/* Interrupt was not handled */
-		printk(BIOS_DEBUG, "Unknown INT15 function: 0x%04x\n",
-			M.x86.R_AX);
-		return 0;
-	}
-
-	/* Interrupt handled */
-	return 1;
-}
-#endif
-
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static void int15_install(void)
-{
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
-	typedef int (* yabel_handleIntFunc)(void);
-	extern yabel_handleIntFunc yabel_intFuncArray[256];
-	yabel_intFuncArray[0x15] = int15_handler;
-#endif
-#ifdef CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-	mainboard_interrupt_handlers(0x15, &int15_handler);
-#endif
-}
-#endif
-
 /* Audio Setup */
 
 extern const u32 * cim_verb_data;
@@ -315,9 +209,9 @@ static void mainboard_enable(device_t dev)
 {
 	dev->ops->init = mainboard_init;
 	dev->ops->get_smbios_data = parrot_onboard_smbios_data;
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 	/* Install custom int15 handler for VGA OPROM */
-	int15_install();
+	mainboard_interrupt_handlers(0x15, &int15_handler);
 #endif
 	verb_setup();
 }
diff --git a/src/mainboard/google/stout/mainboard.c b/src/mainboard/google/stout/mainboard.c
index 4af0ff5..62ac7ea 100644
--- a/src/mainboard/google/stout/mainboard.c
+++ b/src/mainboard/google/stout/mainboard.c
@@ -2,7 +2,7 @@
  * This file is part of the coreboot project.
  *
  * Copyright (C) 2007-2009 coresystems GmbH
- * Copyright (C) 2011 The ChromiumOS Authors.  All rights reserved.
+ * Copyright (C) 2011 Google 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
@@ -24,7 +24,7 @@
 #include <device/pci_def.h>
 #include <device/pci_ops.h>
 #include <console/console.h>
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 #include <x86emu/x86emu.h>
 #endif
 #include <pc80/mc146818rtc.h>
@@ -49,15 +49,15 @@ void mainboard_suspend_resume(void)
 	ec_write_cmd(EC_CMD_NOTIFY_ACPI_ENTER);
 }
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_REALMODE) && CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static int int15_handler(struct eregs *regs)
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
+static int int15_handler(void)
 {
 	int res=-1;
 
 	printk(BIOS_DEBUG, "%s: INT15 function %04x!\n",
-			__func__, regs->eax & 0xffff);
+			__func__, X86_AX);
 
-	switch(regs->eax & 0xffff) {
+	switch(X86_AX) {
 	case 0x5f34:
 		/*
 		 * Set Panel Fitting Hook:
@@ -66,10 +66,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 0 = Centering (do not set with bit1 or bit2)
 		 *  0     = video bios default
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffffff00;
-		regs->ecx |= 0x00; /* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CL = 0x00; /* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f35:
@@ -84,10 +82,8 @@ static int int15_handler(struct eregs *regs)
 		 *  bit 6 = EFP2
 		 *  bit 7 = LFP2
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0000; /* Use video bios default */
+		X86_AX = 0x005f;
+		X86_CX = 0x0000; /* Use video bios default */
 		res = 0;
 		break;
 	case 0x5f51:
@@ -98,148 +94,46 @@ static int int15_handler(struct eregs *regs)
 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
 		 */
-		regs->eax &= 0xffff0000;
-		regs->eax |= 0x005f;
-		regs->ecx &= 0xffff0000;
-		regs->ecx |= 0x0001;
+		X86_AX = 0x005f;
+		X86_CX = 0x0001;
 		res = 0;
 		break;
 	case 0x5f70:
-		switch ((regs->ecx >> 8) & 0xff) {
+		switch (X86_CH) {
 		case 0:
 			/* Get Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 1:
 			/* Set Mux */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		case 2:
 			/* Get SG/Non-SG mode */
-			regs->eax &= 0xffff0000;
-			regs->eax |= 0x005f;
-			regs->ecx &= 0xffff0000;
-			regs->ecx |= 0x0000;
+			X86_AX = 0x005f;
+			X86_CX = 0x0000;
 			res = 0;
 			break;
 		default:
 			/* Interrupt was not handled */
 			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-				((regs->ecx >> 8) & 0xff));
+				X86_CH);
 			return 0;
 		}
 		break;
 
         default:
-		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n",
-				regs->eax & 0xffff);
+		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX);
 		break;
 	}
 	return res;
 }
 #endif
 
-#if defined(CONFIG_PCI_OPTION_ROM_RUN_YABEL) && CONFIG_PCI_OPTION_ROM_RUN_YABEL
-static int int15_handler(void)
-{
-	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 0x5f34:
-		/*
-		 * Set Panel Fitting Hook:
-		 *  bit 2 = Graphics Stretching
-		 *  bit 1 = Text Stretching
-		 *  bit 0 = Centering (do not set with bit1 or bit2)
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CL = 0x00;
-		break;
-	case 0x5f35:
-		/*
-		 * Boot Display Device Hook:
-		 *  bit 0 = CRT
-		 *  bit 1 = TV (eDP)
-		 *  bit 2 = EFP
-		 *  bit 3 = LFP
-		 *  bit 4 = CRT2
-		 *  bit 5 = TV2 (eDP)
-		 *  bit 6 = EFP2
-		 *  bit 7 = LFP2
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 0x0000; /* Use video bios default */
-		break;
-	case 0x5f51:
-		/*
-		 * Hook to select active LFP configuration:
-		 *  00h = No LVDS, VBIOS does not enable LVDS
-		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder
-		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
-		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
-		 */
-		M.x86.R_AX = 0x005f;
-		M.x86.R_CX = 1;
-		break;
-	case 0x5f70:
-		switch (M.x86.R_CH) {
-		case 0:
-			/* Get Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CL = 0;
-			break;
-		case 1:
-			/* Set Mux */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		case 2:
-			/* Get SG/Non-SG mode */
-			M.x86.R_AX = 0x005f;
-			M.x86.R_CX = 0;
-			break;
-		default:
-			/* Interrupt was not handled */
-			printk(BIOS_DEBUG, "Unknown INT15 5f70 function: 0x%02x\n",
-				M.x86.R_CH);
-			return 0;
-		}
-		break;
-	default:
-		/* Interrupt was not handled */
-		printk(BIOS_DEBUG, "Unknown INT15 function: 0x%04x\n",
-			M.x86.R_AX);
-		return 0;
-	}
-
-	/* Interrupt handled */
-	return 1;
-}
-#endif
-
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-static void int15_install(void)
-{
-#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
-	typedef int (* yabel_handleIntFunc)(void);
-	extern yabel_handleIntFunc yabel_intFuncArray[256];
-	yabel_intFuncArray[0x15] = int15_handler;
-#endif
-#ifdef CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-	mainboard_interrupt_handlers(0x15, &int15_handler);
-#endif
-}
-#endif
-
 /* Audio Setup */
 
 extern const u32 * cim_verb_data;
@@ -280,9 +174,9 @@ 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 || CONFIG_PCI_OPTION_ROM_RUN_REALMODE
+#if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 	/* Install custom int15 handler for VGA OPROM */
-	int15_install();
+	mainboard_interrupt_handlers(0x15, &int15_handler);
 #endif
 	verb_setup();
 }



More information about the coreboot-gerrit mailing list