diff options
Diffstat (limited to 'src/drivers/intel/gma')
-rw-r--r-- | src/drivers/intel/gma/Kconfig | 4 | ||||
-rw-r--r-- | src/drivers/intel/gma/Makefile.inc | 3 | ||||
-rw-r--r-- | src/drivers/intel/gma/int15.c | 124 | ||||
-rw-r--r-- | src/drivers/intel/gma/int15.h | 35 |
4 files changed, 166 insertions, 0 deletions
diff --git a/src/drivers/intel/gma/Kconfig b/src/drivers/intel/gma/Kconfig index e26c297a09..6657224680 100644 --- a/src/drivers/intel/gma/Kconfig +++ b/src/drivers/intel/gma/Kconfig @@ -32,3 +32,7 @@ config INTEL_DDI config INTEL_EDID bool default n + +config INTEL_INT15 + bool + default n diff --git a/src/drivers/intel/gma/Makefile.inc b/src/drivers/intel/gma/Makefile.inc index 7a1b97babb..b19334eef6 100644 --- a/src/drivers/intel/gma/Makefile.inc +++ b/src/drivers/intel/gma/Makefile.inc @@ -20,3 +20,6 @@ ramstage-$(CONFIG_INTEL_DP) += intel_dp.c drm_dp_helper.c display.c ramstage-$(CONFIG_INTEL_DDI) += intel_ddi.c ramstage-$(CONFIG_INTEL_EDID) += edid.c +ifeq ($(CONFIG_VGA_ROM_RUN),y) +ramstage-$(CONFIG_INTEL_INT15) += int15.c +endif diff --git a/src/drivers/intel/gma/int15.c b/src/drivers/intel/gma/int15.c new file mode 100644 index 0000000000..f21088fec1 --- /dev/null +++ b/src/drivers/intel/gma/int15.c @@ -0,0 +1,124 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2009 coresystems GmbH + * Copyright (C) 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 + * the Free Software Foundation; version 2 of the License. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <x86emu/x86emu.h> +#include <arch/interrupt.h> +#include "int15.h" + +static int active_lfp, pfit, display, panel_type; + +int intel_vga_int15_handler(void) +{ + int res = 0; + + printk(BIOS_DEBUG, "%s: AX=%04x BX=%04x CX=%04x DX=%04x\n", + __func__, X86_AX, X86_BX, X86_CX, X86_DX); + + switch (X86_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) + * 0 = video bios default + */ + X86_AX = 0x005f; + X86_CX = pfit; + res = 1; + 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 + */ + X86_AX = 0x005f; + X86_CX = display; + res = 1; + break; + case 0x5f40: /* Boot Panel Type */ + X86_AX = 0x005f; // Success + X86_CL = panel_type; + printk(BIOS_DEBUG, "DISPLAY=%x\n", X86_CL); + 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 + */ + X86_AX = 0x005f; + X86_CX = active_lfp; + res = 1; + break; + case 0x5f70: + switch ((X86_CX >> 8) & 0xff) { + case 0: + /* Get Mux */ + X86_AX = 0x005f; + X86_CX = 0x0000; + res = 1; + break; + case 1: + /* Set Mux */ + X86_AX = 0x005f; + X86_CX = 0x0000; + res = 1; + break; + case 2: + /* Get SG/Non-SG mode */ + X86_AX = 0x005f; + X86_CX = 0x0000; + res = 1; + break; + default: + /* Interrupt was not handled */ + printk(BIOS_DEBUG, + "Unknown INT15 5f70 function: 0x%02x\n", + ((X86_CX >> 8) & 0xff)); + break; + } + break; + + default: + printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX); + break; + } + return res; +} + + +void install_intel_vga_int15_handler(int active_lfp_, int pfit_, int display_, int panel_type_) +{ + active_lfp = active_lfp_; + pfit = pfit_; + display = display_; + panel_type = panel_type_; + mainboard_interrupt_handlers(0x15, &intel_vga_int15_handler); +} diff --git a/src/drivers/intel/gma/int15.h b/src/drivers/intel/gma/int15.h new file mode 100644 index 0000000000..b5abc94fb9 --- /dev/null +++ b/src/drivers/intel/gma/int15.h @@ -0,0 +1,35 @@ +int intel_vga_int15_handler(void); + +enum { + GMA_INT15_BOOT_DISPLAY_DEFAULT = 0, + GMA_INT15_BOOT_DISPLAY_CRT = (1 << 0), + GMA_INT15_BOOT_DISPLAY_TV = (1 << 1), + GMA_INT15_BOOT_DISPLAY_EFP = (1 << 2), + GMA_INT15_BOOT_DISPLAY_LFP = (1 << 3), + GMA_INT15_BOOT_DISPLAY_CRT2 = (1 << 4), + GMA_INT15_BOOT_DISPLAY_TV2 = (1 << 5), + GMA_INT15_BOOT_DISPLAY_EFP2 = (1 << 6), + GMA_INT15_BOOT_DISPLAY_LFP2 = (1 << 7), +}; +enum { + GMA_INT15_PANEL_FIT_DEFAULT = 0, + GMA_INT15_PANEL_FIT_CENTERING = (1 << 0), + GMA_INT15_PANEL_FIT_TXT_STRETCH = (1 << 1), + GMA_INT15_PANEL_FIT_GFX_STRETCH = (1 << 2), +}; + +enum { + GMA_INT15_ACTIVE_LFP_NONE = 0x00, + GMA_INT15_ACTIVE_LFP_INT_LVDS = 0x01, + GMA_INT15_ACTIVE_LFP_SVDO_LVDS = 0x02, + GMA_INT15_ACTIVE_LFP_EDP = 0x03, +}; + + +#if CONFIG_VGA_ROM_RUN +/* Install custom int15 handler for VGA OPROM */ +void install_intel_vga_int15_handler(int active_lfp, int pfit, int display, int panel_type); +#else +static inline void install_intel_vga_int15_handler(int active_lfp, int pfit, int display, int panel_type) {} +#endif + |