[coreboot-gerrit] Patch set updated for coreboot: fa1c4b9 mainboard/lenovo/t400: Add initial hybrid graphics support
Timothy Pearson (tpearson@raptorengineeringinc.com)
gerrit at coreboot.org
Mon Apr 6 10:43:48 CEST 2015
Timothy Pearson (tpearson at raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9319
-gerrit
commit fa1c4b945833b0eff8618d465fc1559182a619fb
Author: Timothy Pearson <tpearson at raptorengineeringinc.com>
Date: Sun Apr 5 18:10:09 2015 -0500
mainboard/lenovo/t400: Add initial hybrid graphics support
TEST: Booted T400 with Intel/ATI hybrid graphics in integrated
mode with native Intel graphics init and verified integrated
panel framebuffer functionality in SeaBIOS and Linux.
Change-Id: I37e72c5dad0d7ab3915cc3d439ae9a4a9b3787e3
Signed-off-by: Timothy Pearson <tpearson at raptorengineeringinc.com>
---
src/mainboard/lenovo/t400/cmos.default | 1 +
src/mainboard/lenovo/t400/cmos.layout | 8 ++-
src/mainboard/lenovo/t400/romstage.c | 101 +++++++++++++++++++++++++++++++++
3 files changed, 109 insertions(+), 1 deletion(-)
diff --git a/src/mainboard/lenovo/t400/cmos.default b/src/mainboard/lenovo/t400/cmos.default
index 1da4c7c..0fe82b7 100644
--- a/src/mainboard/lenovo/t400/cmos.default
+++ b/src/mainboard/lenovo/t400/cmos.default
@@ -13,3 +13,4 @@ sticky_fn=Disable
power_management_beeps=Enable
low_battery_beep=Enable
sata_mode=AHCI
+hybrid_graphics_mode=Integrated Only
\ No newline at end of file
diff --git a/src/mainboard/lenovo/t400/cmos.layout b/src/mainboard/lenovo/t400/cmos.layout
index 57dd4d1..fb16ce7 100644
--- a/src/mainboard/lenovo/t400/cmos.layout
+++ b/src/mainboard/lenovo/t400/cmos.layout
@@ -85,7 +85,10 @@ entries
# coreboot config options: northbridge
939 3 e 11 gfx_uma_size
-#942 2 r 0 unused
+# coreboot config options: graphics
+942 2 e 12 hybrid_graphics_mode
+
+#944 2 r 0 unused
# coreboot config options: check sums
984 16 h 0 check_sum
@@ -137,6 +140,9 @@ enumerations
11 3 128M
11 5 96M
11 6 160M
+12 0 Integrated Only
+12 1 Discrete Only
+12 2 Switchable
# -----------------------------------------------------------------
checksums
diff --git a/src/mainboard/lenovo/t400/romstage.c b/src/mainboard/lenovo/t400/romstage.c
index 5f50f32..45447d8 100644
--- a/src/mainboard/lenovo/t400/romstage.c
+++ b/src/mainboard/lenovo/t400/romstage.c
@@ -1,6 +1,7 @@
/*
* This file is part of the coreboot project.
*
+ * Copyright (C) 2015 Timothy Pearson <tpearson at raptorengineeringinc.com>, Raptor Engineering
* Copyright (C) 2012 secunet Security Networks AG
*
* This program is free software; you can redistribute it and/or
@@ -38,6 +39,86 @@
#define LPC_DEV PCI_DEV(0, 0x1f, 0)
#define MCH_DEV PCI_DEV(0, 0, 0)
+#define HYBRID_GRAPHICS_INTEGRATED_ONLY 0
+#define HYBRID_GRAPHICS_DISCRETE_ONLY 1
+#define HYBRID_GRAPHICS_SWITCHABLE 2
+
+#define HYBRID_GRAPHICS_GP_LVL_BITS 0x004a0000
+#define HYBRID_GRAPHICS_GP_LVL2_BITS 0x00020000
+
+#define HYBRID_GRAPHICS_DETECT_GP_BITS 0x00000010
+
+static void hybrid_graphics_set_up_gpio(void)
+{
+ uint32_t tmp;
+
+ /* Enable hybrid graphics GPIO lines */
+
+ tmp = inl(DEFAULT_GPIOBASE + GP_IO_USE_SEL);
+ tmp = tmp | HYBRID_GRAPHICS_GP_LVL_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_IO_USE_SEL);
+
+ tmp = inl(DEFAULT_GPIOBASE + GP_IO_USE_SEL2);
+ tmp = tmp | HYBRID_GRAPHICS_GP_LVL2_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_IO_USE_SEL2);
+
+ /* Set hybrid graphics control GPIO lines to output */
+ tmp = inl(DEFAULT_GPIOBASE + GP_IO_SEL);
+ tmp = tmp & ~HYBRID_GRAPHICS_GP_LVL_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_IO_SEL);
+
+ tmp = inl(DEFAULT_GPIOBASE + GP_IO_SEL2);
+ tmp = tmp & ~HYBRID_GRAPHICS_GP_LVL2_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_IO_SEL2);
+
+ /* Set hybrid graphics detect GPIO lines to input */
+ tmp = inl(DEFAULT_GPIOBASE + GP_IO_SEL);
+ tmp = tmp | HYBRID_GRAPHICS_DETECT_GP_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_IO_SEL);
+}
+
+static bool hybrid_graphics_installed(void)
+{
+ if (inl(DEFAULT_GPIOBASE + GP_LVL) & HYBRID_GRAPHICS_DETECT_GP_BITS)
+ return false;
+ else
+ return true;
+}
+
+static void hybrid_graphics_switch_to_integrated_graphics(void)
+{
+ uint32_t tmp;
+
+ /* Configure muxes */
+ tmp = inl(DEFAULT_GPIOBASE + GP_LVL);
+ tmp = tmp & ~HYBRID_GRAPHICS_GP_LVL_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_LVL);
+
+ tmp = inl(DEFAULT_GPIOBASE + GP_LVL2);
+ tmp = tmp & ~HYBRID_GRAPHICS_GP_LVL2_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_LVL2);
+}
+
+static void hybrid_graphics_switch_to_discrete_graphics(void)
+{
+ uint32_t tmp;
+
+ /* Configure muxes */
+ tmp = inl(DEFAULT_GPIOBASE + GP_LVL);
+ tmp = tmp | HYBRID_GRAPHICS_GP_LVL_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_LVL);
+
+ tmp = inl(DEFAULT_GPIOBASE + GP_LVL2);
+ tmp = tmp | HYBRID_GRAPHICS_GP_LVL2_BITS;
+ outl(tmp, DEFAULT_GPIOBASE + GP_LVL2);
+}
+
+static void hybrid_graphics_enable_switchable_graphics(void)
+{
+ /* Dynamic switching is handled by the OS via ACPI */
+ hybrid_graphics_switch_to_integrated_graphics();
+}
+
static void default_southbridge_gpio_setup(void)
{
outl(0x197e23fe, DEFAULT_GPIOBASE + GP_IO_USE_SEL);
@@ -99,6 +180,26 @@ void main(unsigned long bist)
default_southbridge_gpio_setup();
+ /* Set up hybrid graphics GPIOs */
+ hybrid_graphics_set_up_gpio();
+
+ if (hybrid_graphics_installed()) {
+ /* Select appropriate hybrid graphics device */
+ uint8_t hybrid_graphics_mode = HYBRID_GRAPHICS_INTEGRATED_ONLY;
+ get_option(&hybrid_graphics_mode, "hybrid_graphics_mode");
+ printk(BIOS_DEBUG, "Hybrid graphics available, setting mode %d\n", hybrid_graphics_mode);
+ if (hybrid_graphics_mode == HYBRID_GRAPHICS_INTEGRATED_ONLY)
+ hybrid_graphics_switch_to_integrated_graphics();
+ else if (hybrid_graphics_mode == HYBRID_GRAPHICS_DISCRETE_ONLY)
+ hybrid_graphics_switch_to_discrete_graphics();
+ else if (hybrid_graphics_mode == HYBRID_GRAPHICS_SWITCHABLE)
+ hybrid_graphics_enable_switchable_graphics();
+ }
+ else {
+ printk(BIOS_DEBUG, "Hybrid graphics not installed\n");
+ hybrid_graphics_switch_to_integrated_graphics();
+ }
+
/* ASPM related setting, set early by original BIOS. */
DMIBAR16(0x204) &= ~(3 << 10);
More information about the coreboot-gerrit
mailing list