[coreboot-gerrit] Patch set updated for coreboot: [NEEDS TESTING] lenovo/T400: correct GPIO for hybrid driver
Arthur Heymans (arthur@aheymans.xyz)
gerrit at coreboot.org
Tue Aug 30 23:03:43 CEST 2016
Arthur Heymans (arthur at aheymans.xyz) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/16354
-gerrit
commit 962ade9cca4570946be0e81206970f638bbef931
Author: Arthur Heymans <arthur at aheymans.xyz>
Date: Tue Aug 30 13:42:33 2016 +0200
[NEEDS TESTING] lenovo/T400: correct GPIO for hybrid driver
Currently the hybrid driver uses GPIO 52 to configure mux. This is not
the right GPIO on the T400 according to the schematics "MALIBU-3 EXT".
It should be GPIO22.
The polarities on the gpio's are also set differently on Lenovo T400.
On the Lenovo T400 HIGH on GPIO22 means enable.
Previously also gpio 49 (GFX_PWR_EN), 19 (BKLT_CTRL_SEL),
17 (DGFX_PWRGD_GPIO) were configured for hybrid graphics to work on T400,
but this was reverted in 14d1a93e: "Revert mainboard/lenovo/t400:
Add initial hybrid graphics support".
This patch sets those gpios correctly again for the Lenovo T400.
Change-Id: I3167303abeb6b3711d53508c61a340d03b1e050a
Signed-off-by: Arthur Heymans <arthur at aheymans.xyz>
---
src/drivers/lenovo/Kconfig | 5 ++++
src/drivers/lenovo/hybrid_graphics.c | 52 +++++++++++++++++++++++++++++++++---
src/mainboard/lenovo/t400/Kconfig | 20 ++++++++++++++
3 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/src/drivers/lenovo/Kconfig b/src/drivers/lenovo/Kconfig
index 38b86da..4c62de1 100644
--- a/src/drivers/lenovo/Kconfig
+++ b/src/drivers/lenovo/Kconfig
@@ -39,3 +39,8 @@ config HYBRID_GRAPHICS_GPIO_NUM
help
Set a default GPIO that sets the panel LVDS signal routing to
integrated or discrete GPU.
+
+config ENABLE_DISCRETE_IS_HIGH
+ depends on DRIVERS_LENOVO_HYBRID_GRAPHICS
+ bool
+ default n
diff --git a/src/drivers/lenovo/hybrid_graphics.c b/src/drivers/lenovo/hybrid_graphics.c
index 9b46646..00ad7df 100644
--- a/src/drivers/lenovo/hybrid_graphics.c
+++ b/src/drivers/lenovo/hybrid_graphics.c
@@ -25,6 +25,7 @@
#include <console/console.h>
#include <southbridge/intel/common/gpio.h>
+#define HYBRID_GRAPHICS_INT_CLAIM_VGA 0x2
/* Hybrid graphics allows to connect LVDS interface to either iGPU
* or dGPU depending on GPIO level.
* Nvidia is calling this functionality "muxed Optimus".
@@ -40,12 +41,37 @@
#define HYBRID_GRAPHICS_INTEGRATED 0
#define HYBRID_GRAPHICS_DISCRETE 1
+#if CONFIG_NORTHBRIDGE_INTEL_GM45
+#define GGC_ADDR 0x52
+#endif
+
+#if CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE
+#define GGC_ADDR 0x50
+#endif
+
+#if CONFIG_NORTHBRIDGE_INTEL_IVYBRIDGE
+#define GGC_ADDR 0x50
+#endif
+
static void hybrid_graphics_disable_peg(struct device *dev)
{
- struct device *peg_dev;
+ struct device *peg_dev, *gmch;
+ u8 disable_lvl = CONFIG_ENABLE_DISCRETE_IS_HIGH ?
+ GPIO_LEVEL_LOW : GPIO_LEVEL_HIGH;
+ u32 tmp;
/* connect LVDS interface to iGPU */
- set_gpio(CONFIG_HYBRID_GRAPHICS_GPIO_NUM, GPIO_LEVEL_HIGH);
+ set_gpio(CONFIG_HYBRID_GRAPHICS_GPIO_NUM, disable_lvl);
+ /* configure BKLT_CTL */
+ if (CONFIG_BKLT_CTRL_SEL_GPIO)
+ set_gpio(CONFIG_BKLT_CTRL_SEL_GPIO, disable_lvl);
+ /* configure DGFX_PWRGD */
+ if (CONFIG_DGFX_PWRGD_GPIO)
+ set_gpio(CONFIG_DGFX_PWRGD_GPIO, disable_lvl);
+ /* configure GFX_PWR_EN_GPIO */
+ if (CONFIG_GFX_PWR_EN_GPIO)
+ set_gpio(CONFIG_GFX_PWR_EN_GPIO, disable_lvl);
+
printk(BIOS_DEBUG, "Hybrid graphics: Switching panel to integrated GPU.\n");
dev->enabled = 0;
@@ -53,6 +79,11 @@ static void hybrid_graphics_disable_peg(struct device *dev)
peg_dev = dev_find_slot(0, PCI_DEVFN(1, 0));
if (peg_dev)
peg_dev->enabled = 0;
+ /* Enable IGD */
+ gmch = dev_find_slot(0, PCI_DEVFN(0, 0));
+ tmp = pci_read_config16(gmch, GGC_ADDR);
+ pci_write_config16(gmch, GGC_ADDR, tmp
+ & ~HYBRID_GRAPHICS_INT_CLAIM_VGA);
printk(BIOS_DEBUG, "Hybrid graphics: Disabled PEG10.\n");
}
@@ -61,14 +92,24 @@ static void hybrid_graphics_disable_peg(struct device *dev)
* is present. Enable/disable VGA devices here. */
static void hybrid_graphics_enable_peg(struct device *dev)
{
+ struct device *gmch;
u8 hybrid_graphics_mode;
+ u8 enable_lvl = CONFIG_ENABLE_DISCRETE_IS_HIGH ?
+ GPIO_LEVEL_HIGH : GPIO_LEVEL_LOW;
+ u32 tmp;
hybrid_graphics_mode = HYBRID_GRAPHICS_INTEGRATED;
get_option(&hybrid_graphics_mode, "hybrid_graphics_mode");
if (hybrid_graphics_mode == HYBRID_GRAPHICS_DISCRETE) {
/* connect LVDS interface to dGPU */
- set_gpio(CONFIG_HYBRID_GRAPHICS_GPIO_NUM, GPIO_LEVEL_LOW);
+ set_gpio(CONFIG_HYBRID_GRAPHICS_GPIO_NUM, enable_lvl);
+ if (CONFIG_BKLT_CTRL_SEL_GPIO)
+ set_gpio(CONFIG_BKLT_CTRL_SEL_GPIO, enable_lvl);
+ if (CONFIG_DGFX_PWRGD_GPIO)
+ set_gpio(CONFIG_DGFX_PWRGD_GPIO, enable_lvl);
+ if (CONFIG_GFX_PWR_EN_GPIO)
+ set_gpio(CONFIG_GFX_PWR_EN_GPIO, enable_lvl);
printk(BIOS_DEBUG, "Hybrid graphics: Switching panel to discrete GPU.\n");
dev->enabled = 1;
@@ -77,6 +118,11 @@ static void hybrid_graphics_enable_peg(struct device *dev)
if (dev && dev->ops->disable)
dev->ops->disable(dev);
dev->enabled = 0;
+ gmch = dev_find_slot(0, PCI_DEVFN(0, 0));
+ tmp = pci_read_config16(gmch, GGC_ADDR);
+ pci_write_config16(gmch, GGC_ADDR, tmp
+ | HYBRID_GRAPHICS_INT_CLAIM_VGA);
+
printk(BIOS_DEBUG, "Hybrid graphics: Disabled IGD.\n");
} else
diff --git a/src/mainboard/lenovo/t400/Kconfig b/src/mainboard/lenovo/t400/Kconfig
index a444bf8..65bb116 100644
--- a/src/mainboard/lenovo/t400/Kconfig
+++ b/src/mainboard/lenovo/t400/Kconfig
@@ -56,4 +56,24 @@ config ONBOARD_VGA_IS_PRIMARY
bool
default y
+config HYBRID_GRAPHICS_GPIO_NUM
+ int
+ default 22
+
+config BKLT_CTRL_SEL_GPIO
+ int
+ default 19
+
+config GFX_PWR_EN_GPIO
+ int
+ default 49
+
+config DGFX_PWRGD_GPIO
+ int
+ default 17
+
+config ENABLE_DISCRETE_IS_HIGH
+ bool
+ default y
+
endif # BOARD_LENOVO_T400
More information about the coreboot-gerrit
mailing list