code:
From fbbc8d6a278c733eca475c17cbf95a8946e2c173 Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Thu, 4 Aug 2016 11:00:13 +0200
Subject: [PATCH 1/3] Revert "drivers/lenovo: Add hybrid graphics driver"

This reverts commit 5919ba42ed0ce5b1b13717514698444232c6036c.

Change-Id: I027581ef769ca8232e72f89738c1bdec13f62687

diff --git a/src/drivers/lenovo/Kconfig b/src/drivers/lenovo/Kconfig
index f8eddf2..f20f3b2 100644
--- a/src/drivers/lenovo/Kconfig
+++ b/src/drivers/lenovo/Kconfig
@@ -27,16 +27,3 @@ config DIGITIZER_ABSENT
 endchoice

 endif
-
-config DRIVERS_LENOVO_HYBRID_GRAPHICS
-	bool
-	default n
-
-config HYBRID_GRAPHICS_GPIO_NUM
-	depends on DRIVERS_LENOVO_HYBRID_GRAPHICS
-	int
-	default 52
-	help
-	  Set a default GPIO that sets the panel LVDS signal routing to
-	  integrated or discrete GPU.
-
diff --git a/src/drivers/lenovo/Makefile.inc b/src/drivers/lenovo/Makefile.inc
index 66f8594..c50db5b 100644
--- a/src/drivers/lenovo/Makefile.inc
+++ b/src/drivers/lenovo/Makefile.inc
@@ -1,2 +1 @@
 ramstage-$(CONFIG_DRIVERS_LENOVO_WACOM) += wacom.c
-ramstage-$(CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS) += hybrid_graphics.c
diff --git a/src/drivers/lenovo/hybrid_graphics.c b/src/drivers/lenovo/hybrid_graphics.c
deleted file mode 100644
index 9b46646..0000000
--- a/src/drivers/lenovo/hybrid_graphics.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2015-2016 Patrick Rudolph
- * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
- *
- * 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.
- */
-
-#include <types.h>
-#include <string.h>
-#include <option.h>
-#include <device/device.h>
-#include <device/pci_def.h>
-#include <device/pci_ops.h>
-#include <device/pci_ids.h>
-#include <device/pci.h>
-#include <console/console.h>
-#include <southbridge/intel/common/gpio.h>
-
-/* Hybrid graphics allows to connect LVDS interface to either iGPU
- * or dGPU depending on GPIO level.
- * Nvidia is calling this functionality "muxed Optimus".
- * Some devices, like T430s, only support "muxless Optimus" where the
- * Intel GPU is always connected to the panel.
- * As it is only linked on lenovo and only executed if the GPU exists
- * we know for sure that the dGPU is there and connected to first PEG slot.
- *
- * Note: Once native gfx init is done for AMD or Nvida graphic
- *       cards, merge this code.
- */
-
-#define HYBRID_GRAPHICS_INTEGRATED 0
-#define HYBRID_GRAPHICS_DISCRETE 1
-
-static void hybrid_graphics_disable_peg(struct device *dev)
-{
-	struct device *peg_dev;
-
-	/* connect LVDS interface to iGPU */
-	set_gpio(CONFIG_HYBRID_GRAPHICS_GPIO_NUM, GPIO_LEVEL_HIGH);
-	printk(BIOS_DEBUG, "Hybrid graphics: Switching panel to integrated GPU.\n");
-	dev->enabled = 0;
-
-	/* Disable PEG10 */
-	peg_dev = dev_find_slot(0, PCI_DEVFN(1, 0));
-	if (peg_dev)
-		peg_dev->enabled = 0;
-
-	printk(BIOS_DEBUG, "Hybrid graphics: Disabled PEG10.\n");
-}
-
-/* Called before VGA enable bits are set and only if dGPU
- * is present. Enable/disable VGA devices here. */
-static void hybrid_graphics_enable_peg(struct device *dev)
-{
-	u8 hybrid_graphics_mode;
-
-	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);
-		printk(BIOS_DEBUG, "Hybrid graphics: Switching panel to discrete GPU.\n");
-		dev->enabled = 1;
-
-		/* Disable IGD */
-		dev = dev_find_slot(0, PCI_DEVFN(2, 0));
-		if (dev && dev->ops->disable)
-			dev->ops->disable(dev);
-		dev->enabled = 0;
-
-		printk(BIOS_DEBUG, "Hybrid graphics: Disabled IGD.\n");
-	} else
-		hybrid_graphics_disable_peg(dev);
-}
-
-static struct pci_operations pci_dev_ops_pci = {
-	.set_subsystem = pci_dev_set_subsystem,
-};
-
-struct device_operations hybrid_graphics_ops = {
-	.read_resources   = pci_dev_read_resources,
-	.set_resources    = pci_dev_set_resources,
-	.enable_resources = pci_dev_enable_resources,
-	.init             = pci_dev_init,
-	.scan_bus         = 0,
-	.enable           = hybrid_graphics_enable_peg,
-	.disable          = hybrid_graphics_disable_peg,
-	.ops_pci          = &pci_dev_ops_pci,
-};
-
-static const unsigned short pci_device_ids_nvidia[] = {
-		0x0ffc, /* Nvidia NVS Quadro K1000m Lenovo W530 */
-		0x0def, /* NVidia NVS 5400m Lenovo T430/T530 */
-		0x0dfc, /* NVidia NVS 5200m Lenovo T430s */
-		0x1056, /* NVidia NVS 4200m Lenovo T420/T520 */
-		0x1057, /* NVidia NVS 4200m Lenovo T420/T520 */
-		0x0a6c, /* NVidia NVS 3100m Lenovo T410/T510 */
-		0 };
-
-static const struct pci_driver hybrid_peg_nvidia __pci_driver = {
-	.ops	 = &hybrid_graphics_ops,
-	.vendor	 = PCI_VENDOR_ID_NVIDIA,
-	.devices = pci_device_ids_nvidia,
-};
-
-static const unsigned short pci_device_ids_amd[] = {
-		0x9591, /* ATI Mobility Radeon HD 3650 Lenovo T500/W500 */
-		0x95c4, /* ATI Mobility Radeon HD 3470 Lenovo T400/R400 */
-		0 };
-
-static const struct pci_driver hybrid_peg_amd __pci_driver = {
-	.ops	 = &hybrid_graphics_ops,
-	.vendor	 = PCI_VENDOR_ID_ATI,
-	.devices = pci_device_ids_amd,
-};
diff --git a/src/mainboard/lenovo/t400/Kconfig b/src/mainboard/lenovo/t400/Kconfig
index a444bf8..d74a813 100644
--- a/src/mainboard/lenovo/t400/Kconfig
+++ b/src/mainboard/lenovo/t400/Kconfig
@@ -22,7 +22,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
 	select MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG
 	select INTEL_INT15
 	select SUPERIO_NSC_PC87382
-	select DRIVERS_LENOVO_HYBRID_GRAPHICS

 config MAINBOARD_DIR
 	string
diff --git a/src/mainboard/lenovo/t400/cmos.default b/src/mainboard/lenovo/t400/cmos.default
index 5cf3e63..ac9f96d 100644
--- a/src/mainboard/lenovo/t400/cmos.default
+++ b/src/mainboard/lenovo/t400/cmos.default
@@ -13,5 +13,3 @@ sticky_fn=Disable
 power_management_beeps=Enable
 low_battery_beep=Enable
 sata_mode=AHCI
-hybrid_graphics_mode=Integrated Only
-gfx_uma_size=32M
\ No newline at end of file
diff --git a/src/mainboard/lenovo/t400/cmos.layout b/src/mainboard/lenovo/t400/cmos.layout
index b4b7766..e1a088d 100644
--- a/src/mainboard/lenovo/t400/cmos.layout
+++ b/src/mainboard/lenovo/t400/cmos.layout
@@ -77,8 +77,7 @@ entries
 940         1       e       1        uwb

 # coreboot config options: northbridge
-944         2       e       12       hybrid_graphics_mode
-946         4       e       11       gfx_uma_size
+941         4       e       11       gfx_uma_size

 # coreboot config options: EC
 952         8       h       0        volume
diff --git a/src/mainboard/lenovo/t420/cmos.default b/src/mainboard/lenovo/t420/cmos.default
index 3a82c97..1b8e212 100644
--- a/src/mainboard/lenovo/t420/cmos.default
+++ b/src/mainboard/lenovo/t420/cmos.default
@@ -14,4 +14,3 @@ fn_ctrl_swap=Disable
 sticky_fn=Disable
 trackpoint=Enable
 hyper_threading=Enable
-hybrid_graphics_mode=Integrated Only
\ No newline at end of file
diff --git a/src/mainboard/lenovo/t420/cmos.layout b/src/mainboard/lenovo/t420/cmos.layout
index 58a4abe..bf0f195 100644
--- a/src/mainboard/lenovo/t420/cmos.layout
+++ b/src/mainboard/lenovo/t420/cmos.layout
@@ -77,8 +77,7 @@ entries

 # coreboot config options: northbridge
 432          3       e       11       gfx_uma_size
-435          2        e       12       hybrid_graphics_mode
-#437         3        r       0        unused
+#435          5       r       0        unused

 440          8       h       0        volume

@@ -136,8 +135,6 @@ enumerations
 11    4     160M
 11    5     192M
 11    6     224M
-12    0     Integrated Only
-12    1     Discrete Only

 # -----------------------------------------------------------------
 checksums
diff --git a/src/mainboard/lenovo/t420s/Kconfig b/src/mainboard/lenovo/t420s/Kconfig
index feacb51..935e659 100644
--- a/src/mainboard/lenovo/t420s/Kconfig
+++ b/src/mainboard/lenovo/t420s/Kconfig
@@ -18,7 +18,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
 	select INTEL_INT15
 	select SANDYBRIDGE_IVYBRIDGE_LVDS
 	select MAINBOARD_HAS_LPC_TPM
-	select DRIVERS_LENOVO_HYBRID_GRAPHICS

 	# Workaround for EC/KBC IRQ1.
 	select SERIRQ_CONTINUOUS_MODE
diff --git a/src/mainboard/lenovo/t420s/cmos.default b/src/mainboard/lenovo/t420s/cmos.default
index 3a82c97..1b8e212 100644
--- a/src/mainboard/lenovo/t420s/cmos.default
+++ b/src/mainboard/lenovo/t420s/cmos.default
@@ -14,4 +14,3 @@ fn_ctrl_swap=Disable
 sticky_fn=Disable
 trackpoint=Enable
 hyper_threading=Enable
-hybrid_graphics_mode=Integrated Only
\ No newline at end of file
diff --git a/src/mainboard/lenovo/t420s/cmos.layout b/src/mainboard/lenovo/t420s/cmos.layout
index 3521849..43628406 100644
--- a/src/mainboard/lenovo/t420s/cmos.layout
+++ b/src/mainboard/lenovo/t420s/cmos.layout
@@ -77,8 +77,7 @@ entries

 # coreboot config options: northbridge
 432          3       e       11       gfx_uma_size
-435          2       e       12       hybrid_graphics_mode
-#437         3       r       0        unused
+#435         5       r       0        unused

 440          8       h       0        volume

@@ -136,8 +135,6 @@ enumerations
 11    4     160M
 11    5     192M
 11    6     224M
-12    0     Integrated Only
-12    1     Discrete Only

 # -----------------------------------------------------------------
 checksums
diff --git a/src/mainboard/lenovo/t520/Kconfig b/src/mainboard/lenovo/t520/Kconfig
index ee5dd81..c70581a 100644
--- a/src/mainboard/lenovo/t520/Kconfig
+++ b/src/mainboard/lenovo/t520/Kconfig
@@ -18,7 +18,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
 	select INTEL_INT15
 	select SANDYBRIDGE_IVYBRIDGE_LVDS
 	select MAINBOARD_HAS_LPC_TPM
-	select DRIVERS_LENOVO_HYBRID_GRAPHICS

 	# Workaround for EC/KBC IRQ1.
 	select SERIRQ_CONTINUOUS_MODE
diff --git a/src/mainboard/lenovo/t520/cmos.default b/src/mainboard/lenovo/t520/cmos.default
index ad7dcf5..00e8863 100644
--- a/src/mainboard/lenovo/t520/cmos.default
+++ b/src/mainboard/lenovo/t520/cmos.default
@@ -15,4 +15,3 @@ sticky_fn=Disable
 trackpoint=Enable
 hyper_threading=Enable
 backlight=Both
-hybrid_graphics_mode=Integrated Only
\ No newline at end of file
diff --git a/src/mainboard/lenovo/t520/cmos.layout b/src/mainboard/lenovo/t520/cmos.layout
index 044c310..2cf3629 100644
--- a/src/mainboard/lenovo/t520/cmos.layout
+++ b/src/mainboard/lenovo/t520/cmos.layout
@@ -77,8 +77,7 @@ entries

 # coreboot config options: northbridge
 432         3        e      11        gfx_uma_size
-435         2        e       12       hybrid_graphics_mode
-#437        3        r       0        unused
+#435        5        r       0        unused
 440         8        h       0        volume

 # SandyBridge MRC Scrambler Seed values
@@ -135,8 +134,6 @@ enumerations
 11    4	    160M
 11    5	    192M
 11    6	    224M
-12    0     Integrated Only
-12    1     Discrete Only
 # -----------------------------------------------------------------
 checksums

diff --git a/src/mainboard/lenovo/t530/Kconfig b/src/mainboard/lenovo/t530/Kconfig
index 76147fc..030c01f 100644
--- a/src/mainboard/lenovo/t530/Kconfig
+++ b/src/mainboard/lenovo/t530/Kconfig
@@ -21,7 +21,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
 	select SANDYBRIDGE_IVYBRIDGE_LVDS
 	select ENABLE_VMX
 	select MAINBOARD_HAS_LPC_TPM
-	select DRIVERS_LENOVO_HYBRID_GRAPHICS

 	# Workaround for EC/KBC IRQ1.
 	select SERIRQ_CONTINUOUS_MODE
diff --git a/src/mainboard/lenovo/t530/cmos.default b/src/mainboard/lenovo/t530/cmos.default
index ad7dcf5..00e8863 100644
--- a/src/mainboard/lenovo/t530/cmos.default
+++ b/src/mainboard/lenovo/t530/cmos.default
@@ -15,4 +15,3 @@ sticky_fn=Disable
 trackpoint=Enable
 hyper_threading=Enable
 backlight=Both
-hybrid_graphics_mode=Integrated Only
\ No newline at end of file
diff --git a/src/mainboard/lenovo/t530/cmos.layout b/src/mainboard/lenovo/t530/cmos.layout
index 0e28bdd..e21c197 100644
--- a/src/mainboard/lenovo/t530/cmos.layout
+++ b/src/mainboard/lenovo/t530/cmos.layout
@@ -77,8 +77,7 @@ entries

 # coreboot config options: northbridge
 432         3        e      11        gfx_uma_size
-435         2        e       12       hybrid_graphics_mode
-#437        3        r       0        unused
+#435        5        r       0        unused

 440          8       h       0        volume

@@ -136,9 +135,6 @@ enumerations
 11    4	    160M
 11    5	    192M
 11    6	    224M
-12    0     Integrated Only
-12    1     Discrete Only
-
 # -----------------------------------------------------------------
 checksums

diff --git a/src/southbridge/intel/i82801ix/Kconfig b/src/southbridge/intel/i82801ix/Kconfig
index b3e5069..2822774 100644
--- a/src/southbridge/intel/i82801ix/Kconfig
+++ b/src/southbridge/intel/i82801ix/Kconfig
@@ -23,7 +23,6 @@ config SOUTHBRIDGE_INTEL_I82801IX
 	select USE_WATCHDOG_ON_BOOT
 	select HAVE_SMI_HANDLER
 	select HAVE_USBDEBUG_OPTIONS
-	select SOUTHBRIDGE_INTEL_COMMON_GPIO

 if SOUTHBRIDGE_INTEL_I82801IX

--
2.9.2

From 90f5f34629ff88506bb803988da1552f3373d4f0 Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Thu, 4 Aug 2016 11:01:53 +0200
Subject: [PATCH 2/3] Revert "Revert "mainboard/lenovo/t400: Add initial hybrid
 graphics support""

This reverts commit 14d1a93e444b91311eeed2a25953bf6c0779cdcb.

Change-Id: I965ea55bddb7cf919e7b02ecf8e160c9ad3ea3d4

diff --git a/src/mainboard/lenovo/t400/cmos.default b/src/mainboard/lenovo/t400/cmos.default
index ac9f96d..98ce970 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 e1a088d..b4b7766 100644
--- a/src/mainboard/lenovo/t400/cmos.layout
+++ b/src/mainboard/lenovo/t400/cmos.layout
@@ -77,7 +77,8 @@ entries
 940         1       e       1        uwb

 # coreboot config options: northbridge
-941         4       e       11       gfx_uma_size
+944         2       e       12       hybrid_graphics_mode
+946         4       e       11       gfx_uma_size

 # coreboot config options: EC
 952         8       h       0        volume
diff --git a/src/mainboard/lenovo/t400/romstage.c b/src/mainboard/lenovo/t400/romstage.c
index f518775..fcc545b 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@raptorengineeringinc.com>, Raptor Engineering
  * Copyright (C) 2012 secunet Security Networks AG
  *
  * This program is free software; you can redistribute it and/or
@@ -34,6 +35,118 @@
 #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
+
+#define HYBRID_GRAPHICS_INT_CLAIM_VGA 0x2
+#define HYBRID_GRAPHICS_SEC_VGA_EN 0x2
+
+static void hybrid_graphics_configure_switchable_graphics(bool enable)
+{
+	uint32_t tmp;
+
+	if (enable) {
+		/* Disable integrated graphics legacy VGA cycles */
+		tmp = pci_read_config16(MCH_DEV, D0F0_GGC);
+		pci_write_config16(MCH_DEV, D0F0_GGC, tmp | HYBRID_GRAPHICS_INT_CLAIM_VGA);
+
+		/* Enable secondary VGA controller */
+		tmp = pci_read_config16(MCH_DEV, D0F0_DEVEN);
+		pci_write_config16(MCH_DEV, D0F0_DEVEN, tmp | HYBRID_GRAPHICS_SEC_VGA_EN);
+	}
+	else {
+		/* Enable integrated graphics legacy VGA cycles */
+		tmp = pci_read_config16(MCH_DEV, D0F0_GGC);
+		pci_write_config16(MCH_DEV, D0F0_GGC, tmp & ~HYBRID_GRAPHICS_INT_CLAIM_VGA);
+
+		/* Disable secondary VGA controller */
+		tmp = pci_read_config16(MCH_DEV, D0F0_DEVEN);
+		pci_write_config16(MCH_DEV, D0F0_DEVEN, tmp & ~HYBRID_GRAPHICS_SEC_VGA_EN);
+	}
+}
+
+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;
+
+	/* Disable switchable graphics */
+	hybrid_graphics_configure_switchable_graphics(false);
+
+	/* 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;
+
+	/* Disable switchable graphics */
+	hybrid_graphics_configure_switchable_graphics(false);
+
+	/* 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_dual_graphics(void)
+{
+	/* Enable switchable graphics */
+	hybrid_graphics_configure_switchable_graphics(true);
+}
+
 static void default_southbridge_gpio_setup(void)
 {
 	outl(0x197e23fe, DEFAULT_GPIOBASE + GP_IO_USE_SEL);
@@ -95,6 +208,31 @@ void mainboard_romstage_entry(unsigned long bist)

 	default_southbridge_gpio_setup();

+	uint8_t hybrid_graphics_mode = HYBRID_GRAPHICS_INTEGRATED_ONLY;
+	get_option(&hybrid_graphics_mode, "hybrid_graphics_mode");
+
+	/* Set up hybrid graphics */
+	hybrid_graphics_set_up_gpio();
+	if (hybrid_graphics_installed()) {
+		/* Select appropriate hybrid graphics device */
+		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_switch_to_integrated_graphics();
+			/* Switchable graphics are fully enabled after raminit */
+			/* FIXME
+			 * Enabling switchable graphics prevents bootup!
+			 * Debug and fix appropriately...
+			 */
+	}
+	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);

@@ -174,6 +312,11 @@ void mainboard_romstage_entry(unsigned long bist)
 	outl(inl(DEFAULT_GPIOBASE + 0x38) & ~0x400, DEFAULT_GPIOBASE + 0x38);

 	cbmem_initted = !cbmem_recovery(s3resume);
+
+	if (hybrid_graphics_installed())
+		if (hybrid_graphics_mode == HYBRID_GRAPHICS_SWITCHABLE)
+			hybrid_graphics_switch_to_dual_graphics();
+
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
 	 * this is not a resume. In that case we just create the cbmem toc.
--
2.9.2


code:
From 873402fb594f06e748563ebf3abc7970613b9bda Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Mon, 8 Aug 2016 23:55:13 +0200
Subject: [PATCH] make 256M vram the default for gm45 laptops

Change-Id: Id213807d1ed3260846118f69b459bcad7a146c30

diff --git a/src/mainboard/lenovo/t400/cmos.default b/src/mainboard/lenovo/t400/cmos.default
index 98ce970..90d796f 100644
--- a/src/mainboard/lenovo/t400/cmos.default
+++ b/src/mainboard/lenovo/t400/cmos.default
@@ -13,4 +13,5 @@ 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
+hybrid_graphics_mode=Integrated Only
+gfx_uma_size=256M
\ No newline at end of file
diff --git a/src/mainboard/lenovo/x200/cmos.default b/src/mainboard/lenovo/x200/cmos.default
index 1d7b420..ec7ab46 100644
--- a/src/mainboard/lenovo/x200/cmos.default
+++ b/src/mainboard/lenovo/x200/cmos.default
@@ -13,4 +13,4 @@ sticky_fn=Disable
 power_management_beeps=Enable
 low_battery_beep=Enable
 sata_mode=AHCI
-gfx_uma_size=32M
\ No newline at end of file
+gfx_uma_size=256M
\ No newline at end of file
--
2.9.2

license: mit


code:
From 99b8fb271fd244d8e349ca956819c7e1b3420d80 Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Mon, 8 Aug 2016 21:51:34 +0200
Subject: [PATCH] hardcode use on intel integrated graphic device on t400

Change-Id: I2ff2d93b024866063715d26aedf510a9753a5445
---
 src/mainboard/lenovo/t400/romstage.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/mainboard/lenovo/t400/romstage.c b/src/mainboard/lenovo/t400/romstage.c
index 147131f..1316d69 100644
--- a/src/mainboard/lenovo/t400/romstage.c
+++ b/src/mainboard/lenovo/t400/romstage.c
@@ -208,7 +208,8 @@ void main(unsigned long bist)
 	default_southbridge_gpio_setup();

 	uint8_t hybrid_graphics_mode = HYBRID_GRAPHICS_INTEGRATED_ONLY;
-	get_option(&hybrid_graphics_mode, "hybrid_graphics_mode");
+	/* hardcode use of integrated graphic device for libreboot */
+	/* get_option(&hybrid_graphics_mode, "hybrid_graphics_mode"); */

 	/* Set up hybrid graphics */
 	hybrid_graphics_set_up_gpio();
--
2.9.2


code:
# NOTE: merged upstream already
printf "mainboard/lenovo/t400: Add initial hybrid graphics support\n"
git am "../resources/libreboot/patch/misc/0001-mainboard-lenovo-t400-Add-initial-hybrid-graphics-su.patch"
# git fetch http://review.coreboot.org/coreboot refs/changes/19/9319/18 && git cherry-pick FETCH_HEAD

printf "NOTFORMERGE: lenovo/t400: hard-code enable integrated-only video\n"
git am "../resources/libreboot/patch/misc/0002-NOTFORMERGE-lenovo-t400-hard-code-enable-integrated-.patch"
# git fetch http://review.coreboot.org/coreboot refs/changes/50/10550/1 && git cherry-pick FETCH_HEAD


code:
# NOTE: remove this when updating coreboot. This has been merged upstream
printf "ThinkPad T500 (depends on T400 patch)\n"
git am "../resources/libreboot/patch/misc/0008-lenovo-t500-Add-clone-of-Lenovo-T400.patch"
# git fetch http://review.coreboot.org/coreboot refs/changes/45/10545/1 && git cherry-pick FETCH_HEAD


code:
# NOTE: remove this when updating to the latest version of coreboot. this patch
# makes the patch below redundant: https://review.coreboot.org/#/c/12814/
printf "northbridge/gm45/raminit.c: enable GS45 high-perf (i.e. add X200S support to libreboot)\n"
git am "../resources/libreboot/patch/misc/0006-northbridge-gm45-raminit.c-enable-GS45-high-performa.patch"
# git fetch http://review.coreboot.org/coreboot refs/changes/35/11135/3 && git cherry-pick FETCH_HEAD


code:
From 63db6e96d846b8cab2df30afdccc6b6b18232e33 Mon Sep 17 00:00:00 2001
From: Leah Rowe <info@minifree.org>
Date: Mon, 13 Oct 2014 00:14:53 +0100
Subject: [PATCH] NOTFORMERGE: ec/lenovo/h8:
 wlan/trackpoint/touchpad/bluetooth/wwan

Permanently enable them.

Change-Id: Ic76ab9ab9c865f30312378e18af58bece6c3260a
Signed-off-by: Leah Rowe <info@minifree.org>
---
 src/ec/lenovo/h8/h8.c     | 21 +++++++++++----------
 src/ec/lenovo/pmh7/pmh7.c | 11 ++++-------
 2 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/src/ec/lenovo/h8/h8.c b/src/ec/lenovo/h8/h8.c
index 943bdd4..32285ac 100644
--- a/src/ec/lenovo/h8/h8.c
+++ b/src/ec/lenovo/h8/h8.c
@@ -252,9 +252,11 @@ static void h8_enable(struct device *dev)

 	ec_write(H8_FAN_CONTROL, H8_FAN_CONTROL_AUTO);

-	if (get_option(&val, "wlan") != CB_SUCCESS)
-		val = 1;
-	h8_wlan_enable(val);
+	// Permanently enable wifi
+	// Intel wifi could be a security risk because it uses firmware. Wlan chip has DMA
+	// and could leak data over a side-channel. Using another manufacturer is recommended.
+	// see http://libreboot.org/docs/index.html#recommended_wifi
+	h8_wlan_enable(1);

 	h8_trackpoint_enable(1);
 	h8_usb_power_enable(1);
@@ -262,14 +264,13 @@ static void h8_enable(struct device *dev)
 	if (get_option(&val, "volume") == CB_SUCCESS && !acpi_is_wakeup_s3())
 		ec_write(H8_VOLUME_CONTROL, val);

-	if (get_option(&val, "bluetooth") != CB_SUCCESS)
-		val = 1;
-	h8_bluetooth_enable(val);
-
-	if (get_option(&val, "wwan") != CB_SUCCESS)
-		val = 1;
+	// Permanently enable bluetooth.
+	// NOTE: bluetooth is a potential security risk. Physical removal of the bluetooth module is recommended.
+	h8_bluetooth_enable(1);

-	h8_wwan_enable(val);
+	// Permanently enable wwan.
+	// NOTE: wwan is a security risk (remove access plus DMA). Physical removal of both the wwan and sim card is recommended.
+	h8_wwan_enable(1);

 	if (conf->has_uwb) {
 		if (get_option(&val, "uwb") != CB_SUCCESS)
diff --git a/src/ec/lenovo/pmh7/pmh7.c b/src/ec/lenovo/pmh7/pmh7.c
index b2c3c08..1570cd6 100644
--- a/src/ec/lenovo/pmh7/pmh7.c
+++ b/src/ec/lenovo/pmh7/pmh7.c
@@ -102,7 +102,6 @@ static void enable_dev(struct device *dev)
 {
 	struct ec_lenovo_pmh7_config *conf = dev->chip_info;
 	struct resource *resource;
-	u8 val;

 	resource = new_resource(dev, EC_LENOVO_PMH7_INDEX);
 	resource->flags = IORESOURCE_IO | IORESOURCE_FIXED;
@@ -114,13 +113,11 @@ static void enable_dev(struct device *dev)
 	pmh7_backlight_enable(conf->backlight_enable);
 	pmh7_dock_event_enable(conf->dock_event_enable);

-	if (get_option(&val, "touchpad") != CB_SUCCESS)
-		val = 1;
-	pmh7_touchpad_enable(val);
+	// Permanently enable touchpad
+	pmh7_touchpad_enable(1);

-	if (get_option(&val, "trackpoint") != CB_SUCCESS)
-		val = 1;
-	pmh7_trackpoint_enable(val);
+	// Permanently enable trackpoint
+	pmh7_trackpoint_enable(1);
 }

 struct chip_operations ec_lenovo_pmh7_ops = {
--
1.9.1


code:
From c63113e56ad2d5f6b318a837e4345e0e962a5c1b Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Wed, 4 May 2016 22:49:07 +0200
Subject: [PATCH 1/1] add acpi c3 / cpu  c4 state for gm45 thinpads

---
 src/mainboard/lenovo/t400/cstates.c | 5 +++++
 src/mainboard/lenovo/x200/cstates.c | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/src/mainboard/lenovo/t400/cstates.c b/src/mainboard/lenovo/t400/cstates.c
index 827f76e..7d92d6f 100644
--- a/src/mainboard/lenovo/t400/cstates.c
+++ b/src/mainboard/lenovo/t400/cstates.c
@@ -27,6 +27,11 @@ static acpi_cstate_t cst_entries[] = {
 		/* acpi C2 / cpu C2 */
 		2, 0x01,  500,
 		{ ACPI_ADDRESS_SPACE_FIXED, 1, 2, { 1 }, 0x10, 0 }
+	},
+	{
+	        /* acpi C3 / cpu C4 */
+		3, 0x02,  300,
+		{ ACPI_ADDRESS_SPACE_FIXED, 1, 2, { 1 }, 0x30, 0 }
 	},
 };

diff --git a/src/mainboard/lenovo/x200/cstates.c b/src/mainboard/lenovo/x200/cstates.c
index 827f76e..7d92d6f 100644
--- a/src/mainboard/lenovo/x200/cstates.c
+++ b/src/mainboard/lenovo/x200/cstates.c
@@ -27,6 +27,11 @@ static acpi_cstate_t cst_entries[] = {
 		/* acpi C2 / cpu C2 */
 		2, 0x01,  500,
 		{ ACPI_ADDRESS_SPACE_FIXED, 1, 2, { 1 }, 0x10, 0 }
+	},
+	{
+	        /* acpi C3 / cpu C4 */
+		3, 0x02,  300,
+		{ ACPI_ADDRESS_SPACE_FIXED, 1, 2, { 1 }, 0x30, 0 }
 	},
 };

--
2.8.2


code:
From 79f4b168666e484191ed3196dffe691953ee783b Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Mon, 15 Aug 2016 00:04:34 +0200
Subject: [PATCH] gm45/gma.c: clean up some registers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

According to "G45: Volume 3: Display Register
Intel ® 965G Express Chipset Family and Intel ®
G35 Express Chipset Graphics Controller" some registries
are set incorrectly in gm45/gma.c.

Some values are changed after comparing them with the values
the i915 linux kernel (3.13 was used) module sets while modesetting.
The values were obtained using 'intel_reg' from intel-gpu-tools,
during a normal boot and with 'nomodeset' as a kernel argument.

Some registers that don't exist on gm45 are set in gma.c, which is
probably the result of copying code from a more recent intel
northbridge.

The result is that that gm45 laptops with wxga displays still work as
before. Laptops with wxga+ displays previously did not display anything
and now have a horizontal 20% strip of working display.

TEST: build with native graphic init and flash on a gm45 target, like
lenovo x200.

Change-Id: If66b60c7189997c558270f9e474851fe7e2219f1
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
---
 src/northbridge/intel/gm45/gma.c | 110 +++++++--------------------------------
 1 file changed, 18 insertions(+), 92 deletions(-)

diff --git a/src/northbridge/intel/gm45/gma.c b/src/northbridge/intel/gm45/gma.c
index a89f9bb..b02c89b 100644
--- a/src/northbridge/intel/gm45/gma.c
+++ b/src/northbridge/intel/gm45/gma.c
@@ -47,60 +47,6 @@ void gtt_write(u32 reg, u32 data)
 	write32(res2mmio(gtt_res, reg, 0), data);
 }

-static void power_port(u8 *mmio)
-{
-	read32(mmio + 0x00061100); // = 0x00000000
-	write32(mmio + 0x00061100, 0x00000000);
-	write32(mmio + 0x00061100, 0x00010000);
-	read32(mmio + 0x00061100); // = 0x00010000
-	read32(mmio + 0x00061100); // = 0x00010000
-	read32(mmio + 0x00061100); // = 0x00000000
-	write32(mmio + 0x00061100, 0x00000000);
-	read32(mmio + 0x00061100); // = 0x00000000
-	read32(mmio + 0x00064200); // = 0x0000001c
-	write32(mmio + 0x00064210, 0x8004003e);
-	write32(mmio + 0x00064214, 0x80060002);
-	write32(mmio + 0x00064218, 0x01000000);
-	read32(mmio + 0x00064210); // = 0x5144003e
-	write32(mmio + 0x00064210, 0x5344003e);
-	read32(mmio + 0x00064210); // = 0x0144003e
-	write32(mmio + 0x00064210, 0x8074003e);
-	read32(mmio + 0x00064210); // = 0x5144003e
-	read32(mmio + 0x00064210); // = 0x5144003e
-	write32(mmio + 0x00064210, 0x5344003e);
-	read32(mmio + 0x00064210); // = 0x0144003e
-	write32(mmio + 0x00064210, 0x8074003e);
-	read32(mmio + 0x00064210); // = 0x5144003e
-	read32(mmio + 0x00064210); // = 0x5144003e
-	write32(mmio + 0x00064210, 0x5344003e);
-	read32(mmio + 0x00064210); // = 0x0144003e
-	write32(mmio + 0x00064210, 0x8074003e);
-	read32(mmio + 0x00064210); // = 0x5144003e
-	read32(mmio + 0x00064210); // = 0x5144003e
-	write32(mmio + 0x00064210, 0x5344003e);
-	write32(mmio + 0x00064f00, 0x0100030c);
-	write32(mmio + 0x00064f04, 0x00b8230c);
-	write32(mmio + 0x00064f08, 0x06f8930c);
-	write32(mmio + 0x00064f0c, 0x09f8e38e);
-	write32(mmio + 0x00064f10, 0x00b8030c);
-	write32(mmio + 0x00064f14, 0x0b78830c);
-	write32(mmio + 0x00064f18, 0x0ff8d3cf);
-	write32(mmio + 0x00064f1c, 0x01e8030c);
-	write32(mmio + 0x00064f20, 0x0ff863cf);
-	write32(mmio + 0x00064f24, 0x0ff803cf);
-	write32(mmio + 0x000c4030, 0x00001000);
-	read32(mmio + 0x00044000); // = 0x00000000
-	write32(mmio + 0x00044030, 0x00001000);
-	read32(mmio + 0x00061150); // = 0x0000001c
-	write32(mmio + 0x00061150, 0x0000089c);
-	write32(mmio + 0x000fcc00, 0x01986f00);
-	write32(mmio + 0x000fcc0c, 0x01986f00);
-	write32(mmio + 0x000fcc18, 0x01986f00);
-	write32(mmio + 0x000fcc24, 0x01986f00);
-	read32(mmio + 0x00044000); // = 0x00000000
-	read32(mmio + LVDS); // = 0x40000002
-}
-
 static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 			   u8 *mmio, u32 physbase, u16 piobase, u32 lfb)
 {
@@ -150,8 +96,6 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 	for (i = 0; i <= 0x18; i++)
 		vga_cr_write(i, cr[i]);

-	power_port(mmio);
-
 	intel_gmbus_read_edid(mmio + GMBUS0, 3, 0x50, edid_data, 128);
 	decode_edid(edid_data,
 		    sizeof(edid_data), &edid);
@@ -277,28 +221,32 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 		(hpolarity << 20) | (vpolarity << 21)
 		| (mode->lvds_dual_channel ? LVDS_CLOCK_B_POWERUP_ALL
 		   | LVDS_CLOCK_BOTH_POWERUP_ALL : 0)
-		| LVDS_BORDER_ENABLE | LVDS_CLOCK_A_POWERUP_ALL);
+		| LVDS_ENABLE_DITHER
+		| LVDS_CLOCK_A_POWERUP_ALL
+		| LVDS_PIPE(0));
 	mdelay(1);
 	write32(mmio + PP_CONTROL, PANEL_UNLOCK_REGS
 		| (read32(mmio + PP_CONTROL) & ~PANEL_UNLOCK_MASK));
 	write32(mmio + FP0(0),
 		((pixel_n - 2) << 16)
-		| ((pixel_m1 - 2) << 8) | pixel_m2);
+		| ((pixel_m1 - 2) << 8) | (pixel_m2 - 2));
 	write32(mmio + DPLL(0),
 		DPLL_VCO_ENABLE | DPLLB_MODE_LVDS
+		| DPLL_VGA_MODE_DIS
 		| (mode->lvds_dual_channel ? DPLLB_LVDS_P2_CLOCK_DIV_7
 		   : DPLLB_LVDS_P2_CLOCK_DIV_14)
 		| (0x10000 << (pixel_p1 - 1))
 		| ((info->gfx.use_spread_spectrum_clock ? 3 : 0) << 13)
-		| (0x1 << (pixel_p1 - 1)));
+		| (6 << 9));
 	mdelay(1);
 	write32(mmio + DPLL(0),
 		DPLL_VCO_ENABLE | DPLLB_MODE_LVDS
+		| DPLL_VGA_MODE_DIS
 		| (mode->lvds_dual_channel ? DPLLB_LVDS_P2_CLOCK_DIV_7
 		   : DPLLB_LVDS_P2_CLOCK_DIV_14)
 		| (0x10000 << (pixel_p1 - 1))
 		| ((info->gfx.use_spread_spectrum_clock ? 3 : 0) << 13)
-		| (0x1 << (pixel_p1 - 1)));
+		| (6 << 9));
 	/* Re-lock the registers.  */
 	write32(mmio + PP_CONTROL,
 		(read32(mmio + PP_CONTROL) & ~PANEL_UNLOCK_MASK));
@@ -307,7 +255,9 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 		(hpolarity << 20) | (vpolarity << 21)
 		| (mode->lvds_dual_channel ? LVDS_CLOCK_B_POWERUP_ALL
 		   | LVDS_CLOCK_BOTH_POWERUP_ALL : 0)
-		| LVDS_BORDER_ENABLE | LVDS_CLOCK_A_POWERUP_ALL);
+		| LVDS_CLOCK_A_POWERUP_ALL
+		| LVDS_ENABLE_DITHER
+		| LVDS_PIPE(0));

 	write32(mmio + HTOTAL(0),
 		((hactive + right_border + hblank - 1) << 16)
@@ -324,7 +274,7 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 	write32(mmio + VBLANK(0), ((vactive + bottom_border + vblank - 1) << 16)
 		| (vactive + bottom_border - 1));
 	write32(mmio + VSYNC(0),
-		(vactive + bottom_border + vfront_porch + vsync - 1)
+		((vactive + bottom_border + vfront_porch + vsync - 1) << 16)
 		| (vactive + bottom_border + vfront_porch - 1));

 	write32(mmio + PIPECONF(0), PIPECONF_DISABLE);
@@ -335,7 +285,7 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 			| (vactive - 1));
 		write32(mmio + PF_CTL(0), 0);
 		write32(mmio + PF_WIN_SZ(0), 0);
-		write32(mmio + PFIT_CONTROL, 0x20000000);
+		write32(mmio + PFIT_CONTROL, 0);
 	} else {
 		write32(mmio + PIPESRC(0), (639 << 16) | 399);
 		write32(mmio + PF_CTL(0), PF_ENABLE | PF_FILTER_MED_3x3);
@@ -362,7 +312,7 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 	write32(mmio + PIPECONF(0), PIPECONF_ENABLE | PIPECONF_BPP_6 | PIPECONF_DITHER_EN);

 	if (IS_ENABLED(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE)) {
-		write32(mmio + VGACNTRL, 0xc4008e | VGA_DISP_DISABLE);
+		write32(mmio + VGACNTRL, VGA_DISP_DISABLE);
 		write32(mmio + DSPCNTR(0), DISPLAY_PLANE_ENABLE
 			| DISPPLANE_BGRX888);
 		mdelay(1);
@@ -370,37 +320,13 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 		write32(mmio + VGACNTRL, 0xc4008e);
 	}

-	write32(mmio + TRANS_HTOTAL(0),
-		((hactive + right_border + hblank - 1) << 16)
-		| (hactive - 1));
-	write32(mmio + TRANS_HBLANK(0),
-		((hactive + right_border + hblank - 1) << 16)
-		| (hactive + right_border - 1));
-	write32(mmio + TRANS_HSYNC(0),
-		((hactive + right_border + hfront_porch + hsync - 1) << 16)
-		| (hactive + right_border + hfront_porch - 1));
-
-	write32(mmio + TRANS_VTOTAL(0),
-		((vactive + bottom_border + vblank - 1) << 16)
-		| (vactive - 1));
-	write32(mmio + TRANS_VBLANK(0),
-		((vactive + bottom_border + vblank - 1) << 16)
-		| (vactive + bottom_border - 1));
-	write32(mmio + TRANS_VSYNC(0),
-		(vactive + bottom_border + vfront_porch + vsync - 1)
-		| (vactive + bottom_border + vfront_porch - 1));
-
-	write32(mmio + 0x00060100, 0xb01c4000);
-	write32(mmio + 0x000f000c, 0xb01a2050);
-	mdelay(1);
-	write32(mmio + TRANSCONF(0), TRANS_ENABLE | TRANS_6BPC
-		);
-	write32(mmio + LVDS,
-		LVDS_PORT_ENABLE
+	write32(mmio + LVDS, LVDS_PORT_ENABLE
 		| (hpolarity << 20) | (vpolarity << 21)
 		| (mode->lvds_dual_channel ? LVDS_CLOCK_B_POWERUP_ALL
 		   | LVDS_CLOCK_BOTH_POWERUP_ALL : 0)
-		| LVDS_BORDER_ENABLE | LVDS_CLOCK_A_POWERUP_ALL);
+		| LVDS_CLOCK_A_POWERUP_ALL
+		| LVDS_ENABLE_DITHER
+		| LVDS_PIPE(0));

 	write32(mmio + PP_CONTROL, PANEL_POWER_ON | PANEL_POWER_RESET);

--
2.9.3


code:
From c98d8745d4dca650709e76269cf014e5ffbc1443 Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Tue, 9 Aug 2016 00:54:37 +0200
Subject: [PATCH] set default vram to 256M

Change-Id: Ife906c47f32493d9a647a4f12f25982623eba189
---
 src/mainboard/lenovo/t400/cmos.default | 2 +-
 src/mainboard/lenovo/x200/cmos.default | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/mainboard/lenovo/t400/cmos.default b/src/mainboard/lenovo/t400/cmos.default
index 5cf3e63..90d796f 100644
--- a/src/mainboard/lenovo/t400/cmos.default
+++ b/src/mainboard/lenovo/t400/cmos.default
@@ -14,4 +14,4 @@ power_management_beeps=Enable
 low_battery_beep=Enable
 sata_mode=AHCI
 hybrid_graphics_mode=Integrated Only
-gfx_uma_size=32M
\ No newline at end of file
+gfx_uma_size=256M
\ No newline at end of file
diff --git a/src/mainboard/lenovo/x200/cmos.default b/src/mainboard/lenovo/x200/cmos.default
index 1d7b420..ec7ab46 100644
--- a/src/mainboard/lenovo/x200/cmos.default
+++ b/src/mainboard/lenovo/x200/cmos.default
@@ -13,4 +13,4 @@ sticky_fn=Disable
 power_management_beeps=Enable
 low_battery_beep=Enable
 sata_mode=AHCI
-gfx_uma_size=32M
\ No newline at end of file
+gfx_uma_size=256M
\ No newline at end of file
--
2.9.2


code:
From 388f9dbe66f6834013d478eeffe154d59ca6c239 Mon Sep 17 00:00:00 2001
From: Leah Rowe <info@minifree.org>
Date: Tue, 8 Mar 2016 07:21:33 +0000
Subject: [PATCH] HOTFIX: AMD fam10h/fam15h: don't use microcode updates

There were build issues in libreboot. We don't use microcode updates anyway.
When selecting no microcode updates in menuconfig, build failed because
coreboot for these boards was still trying to add microcode.
---
 src/cpu/Makefile.inc                           | 34 +-------------------------
 src/cpu/amd/family_10h-family_15h/Kconfig      |  1 -
 src/cpu/amd/family_10h-family_15h/Makefile.inc | 10 --------
 3 files changed, 1 insertion(+), 44 deletions(-)

diff --git a/src/cpu/Makefile.inc b/src/cpu/Makefile.inc
index 046c418..ef0e236 100644
--- a/src/cpu/Makefile.inc
+++ b/src/cpu/Makefile.inc
@@ -17,36 +17,4 @@ $(eval $(call create_class_compiler,cpu_microcode,x86_32))
 ## Rules for building the microcode blob in CBFS
 ################################################################################

-ifneq ($(CONFIG_CPU_MICROCODE_MULTIPLE_FILES), y)
-cbfs-files-$(CONFIG_CPU_MICROCODE_CBFS_GENERATE)  += cpu_microcode_blob.bin
-endif
-
-ifeq ($(CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER),y)
-cbfs-files-y  += cpu_microcode_blob.bin
-cpu_microcode_blob.bin-file = $(objgenerated)/microcode.bin
-
-$(objgenerated)/microcode.bin:
-	echo "   util/scripts/ucode_h_to_bin.sh $(objgenerated)/microcode.bin \"$(CONFIG_CPU_MICROCODE_HEADER_FILES)\""
-	util/scripts/ucode_h_to_bin.sh $(objgenerated)/microcode.bin $(CONFIG_CPU_MICROCODE_HEADER_FILES)
-endif
-
-# We just mash all microcode binaries together into one binary to rule them all.
-# This approach assumes that the microcode binaries are properly padded, and
-# their headers specify the correct size. This works fairly well on isolatied
-# updates, such as Intel and some AMD microcode, but won't work very well if the
-# updates are wrapped in a container, like AMD's microcode update container. If
-# there is only one microcode binary (i.e. one container), then we don't have
-# this issue, and this rule will continue to work.
-$(obj)/cpu_microcode_blob.bin: $$(cpu_microcode_bins)
-	@printf "    MICROCODE  $(subst $(obj)/,,$(@))\n"
-	@echo $(cpu_microcode_bins)
-	cat /dev/null $+ > $@
-
-cpu_microcode_blob.bin-file ?= $(obj)/cpu_microcode_blob.bin
-cpu_microcode_blob.bin-type := microcode
-
-ifneq ($(CONFIG_CPU_MICROCODE_CBFS_LOC),)
-cpu_microcode_blob.bin-position := $(CONFIG_CPU_MICROCODE_CBFS_LOC)
-else
-cpu_microcode_blob.bin-align := 16
-endif
+# What? Nope! We don't do that in libreboot.
diff --git a/src/cpu/amd/family_10h-family_15h/Kconfig b/src/cpu/amd/family_10h-family_15h/Kconfig
index 14ab1cd..3f873a1 100644
--- a/src/cpu/amd/family_10h-family_15h/Kconfig
+++ b/src/cpu/amd/family_10h-family_15h/Kconfig
@@ -11,7 +11,6 @@ config CPU_AMD_MODEL_10XXX
 	select UDELAY_LAPIC
 	select HAVE_MONOTONIC_TIMER
 	select SUPPORT_CPU_UCODE_IN_CBFS
-	select CPU_MICROCODE_MULTIPLE_FILES

 if CPU_AMD_MODEL_10XXX

diff --git a/src/cpu/amd/family_10h-family_15h/Makefile.inc b/src/cpu/amd/family_10h-family_15h/Makefile.inc
index f10f732..a295475 100644
--- a/src/cpu/amd/family_10h-family_15h/Makefile.inc
+++ b/src/cpu/amd/family_10h-family_15h/Makefile.inc
@@ -9,13 +9,3 @@ romstage-y += ram_calc.c
 ramstage-y += ram_calc.c
 ramstage-y += monotonic_timer.c
 ramstage-$(CONFIG_HAVE_ACPI_TABLES) += powernow_acpi.c
-
-# Microcode for Family 10h, 11h, 12h, and 14h
-cbfs-files-$(CONFIG_CPU_MICROCODE_MULTIPLE_FILES) += microcode_amd.bin
-microcode_amd.bin-file := 3rdparty/blobs/cpu/amd/family_10h-family_14h/microcode_amd.bin
-microcode_amd.bin-type := microcode
-
-# Microcode for Family 15h
-cbfs-files-$(CONFIG_CPU_MICROCODE_MULTIPLE_FILES) += microcode_amd_fam15h.bin
-microcode_amd_fam15h.bin-file := 3rdparty/blobs/cpu/amd/family_15h/microcode_amd_fam15h.bin
-microcode_amd_fam15h.bin-type := microcode
--
1.9.1


code:
diff --git a/util/crossgcc/buildgcc b/util/crossgcc/buildgcc
index 97c38b8d95..d6b11ed0a6 100755
--- a/util/crossgcc/buildgcc
+++ b/util/crossgcc/buildgcc
@@ -270,18 +270,6 @@ check_cc() {
 	fi
 }

-check_sum() {
-	test -z "$CHECKSUM" || \
-	test "$(cat sum/$1.cksum 2>/dev/null | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@')" = \
-	"$($CHECKSUM tarballs/$1 2>/dev/null | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@')"
-}
-
-compute_sum() {
-	test ! -f sum/$1.cksum && test -f tarballs/$1 && \
-	(test -z "$CHECKSUM" || $CHECKSUM tarballs/$1 > sum/$1.cksum ) && \
-	printf "(checksum created. ${RED}Note. Please upload sum/$1.cksum if the corresponding archive is upgraded.)${NC}"
-}
-
 download_showing_percentage() {
 	url=$1
 	printf " ..${red}  0%%"
@@ -293,12 +281,13 @@ download_showing_percentage() {

 download() {
 	package=$1
-	archive="$(eval echo \$$package"_ARCHIVE")"
+	archive="$package"_ARCHIVE
+	archive="${!archive}"

 	FILE=$(basename $archive)
 	printf " * $FILE "

-	if test -f tarballs/$FILE && check_sum $FILE ; then
+	if test -f tarballs/$FILE; then
 		printf "(cached)"
 	else
 		printf "(downloading from $archive)"
@@ -306,7 +295,6 @@ download() {
 		cd tarballs
 		download_showing_percentage $archive
 		cd ..
-		compute_sum $FILE
 	fi

 	if [ ! -f tarballs/$FILE ]; then
@@ -316,9 +304,100 @@ download() {
 	printf "\n"
 }

+# Compute the hash of the package given in $1, and print it raw (just the
+# hexadecimal hash).
+compute_hash() {
+	package=$1
+	archive="$package"_ARCHIVE
+	archive="${!archive}"
+	file="$(basename "$archive")"
+
+	if test -z "$CHECKSUM"; then
+		echo "${RED}\$CHECKSUM program missing. This is bad.${NC}" 1>&2
+		exit 1
+	fi
+
+	$CHECKSUM "tarballs/$file" 2>/dev/null | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@'
+}
+
+error_hash_missing() {
+	package="$1"
+	archive="$package"_ARCHIVE
+	archive="${!archive}"
+	file="$(basename "$archive")"
+
+	fullhashfile="util/crossgcc/sum/$file.cksum"
+	printf "${RED}hash file missing:${NC}\n\n" 1>&2
+	printf "Please verify util/crossgcc/tarball/$file carefully\n" 1>&2
+	printf "(using PGP if possible), and then rename\n" 1>&2
+	printf "        ${CYAN}${fullhashfile}.calc${NC}\n" 1>&2
+	printf "     to ${CYAN}${fullhashfile}${NC}\n\n" 1>&2
+
+	exit 1
+}
+
+# Read the known hash file of the package given in $1, and print it raw.
+get_known_hash() {
+	package=$1
+	archive="$package"_ARCHIVE
+	archive="${!archive}"
+	file="$(basename "$archive")"
+	hashfile="sum/$file.cksum"
+
+	if [ ! -f "$hashfile" ]; then
+		calc_hash="$(compute_hash "$package")" || exit 1
+		echo "$calc_hash  tarballs/$file" > "${hashfile}.calc"
+
+		error_hash_missing "$package"
+		exit 1
+	fi
+
+	cat "$hashfile" | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@'
+}
+
+error_hash_mismatch() {
+	package=$1
+	known_hash="$2"
+	computed_hash="$3"
+	archive="$package"_ARCHIVE
+	archive="${!archive}"
+	file="$(basename "$archive")"
+
+	printf "${RED}hash mismatch:${NC}\n\n"
+	printf "             expected (known) hash: $known_hash\n"
+	printf "calculated hash of downloaded file: $computed_hash\n\n"
+
+	printf "If you think this is due to a network error, please delete\n"
+	printf "  ${CYAN}util/crossgcc/tarballs/$file${NC}\n"
+	printf "and try again. If the problem persists, it may be due to an\n"
+	printf "administration error on the file server, or you might be\n"
+	printf "subject to a Man-in-the-Middle attack\n\n"
+
+	exit 1
+}
+
+# verify_hash - Check that the hash of the file given in $1 matches the known
+# hash; Bail out on mismatch or missing hash file.
+verify_hash() {
+	package=$1
+	archive="$package"_ARCHIVE
+	archive="${!archive}"
+
+	known_hash="$(get_known_hash "$package")" || exit "$?"
+	computed_hash="$(compute_hash "$package")" || exit "$?"
+
+	if [ "$known_hash" != "$computed_hash" ]; then
+		error_hash_mismatch "$package" "$known_hash" "$computed_hash"
+		exit 1
+	fi
+
+	printf "${GREEN}hash verified ("$known_hash")${NC}\n"
+}
+
 unpack_and_patch() {
 	package=$1
-	archive="$(eval echo \$$package"_ARCHIVE")"
+	archive="$package"_ARCHIVE
+	archive="${!archive}"
 	dir="$(eval echo \$$package"_DIR")"
 	test -d ${dir} && test -f ${dir}/.unpack_success || (
 		printf " * $(basename $archive)\n"
@@ -963,10 +1042,11 @@ export PATH=$DESTDIR$TARGETDIR/bin:$PATH

 # Download, unpack, patch and build all packages

-printf "Downloading tarballs ... \n"
+printf "Downloading and verifying tarballs... \n"
 mkdir -p tarballs
 for P in $PACKAGES; do
-	download $P
+	  download "$P" || exit "$?"
+    verify_hash "$P" || exit "$P"
 done
 printf "Downloaded tarballs ... ${green}ok${NC}\n"


code:
From ea0c2d76c4f16eccaafcb2c0741f76825505bafc Mon Sep 17 00:00:00 2001
From: Nico Huber <nico.huber@secunet.com>
Date: Thu, 22 Dec 2016 16:05:54 +0100
Subject: [PATCH] DONOTMERGE buildgcc: Build GMP `--with-pic` if GCC defaults to `-pie`

Change-Id: I5f3185af9c8d599379a628e18724b217b88be974
Signed-off-by: Nico Huber <nico.huber@secunet.com>
---

diff --git a/util/crossgcc/buildgcc b/util/crossgcc/buildgcc
index 97c38b8..4eefd43 100755
--- a/util/crossgcc/buildgcc
+++ b/util/crossgcc/buildgcc
@@ -515,6 +515,13 @@
 }

 build_GMP() {
+	# Check if GCC enables `-pie` by default (likely on Debian Stretch).
+	# We have to use `--with-pic` then.
+	if "${CC}" -dumpspecs 2>/dev/null | grep -q '[{;][[:space:]]*:-pie\>'
+	then
+		OPTIONS="$OPTIONS --with-pic"
+	fi
+
 	CC="$CC" ../${GMP_DIR}/configure --disable-shared --enable-fat \
 		--prefix=$TARGETDIR $OPTIONS \
 		|| touch .failed


code:
--- Makefile	2015-11-18 23:49:40.900093793 +0100
+++ Makefile.new	2015-11-19 00:08:37.392634002 +0100
@@ -15,3 +15,3 @@
 CFLAGS= -Wall -march=i486 -m32 -O1 -fomit-frame-pointer -fno-builtin \
-	-ffreestanding -fPIC $(SMP_FL) -fno-stack-protector
+	-ffreestanding -fPIC $(SMP_FL) -fno-stack-protector -fgnu89-inline

@@ -23,3 +23,2 @@
 all: clean memtest.bin memtest
-		 scp memtest.bin root@192.168.0.12:/srv/tftp/mt86plus


code:
--- config.h	2015-11-18 23:49:27.696700200 +0100
+++ config.h.new	2015-11-19 00:08:55.799401157 +0100
@@ -19,3 +19,3 @@
 /* BEEP_MODE - Beep on error. Default off, Change to 1 to enable */
-#define BEEP_MODE 0
+#define BEEP_MODE 1

@@ -37,3 +37,3 @@
 /* SERIAL_BAUD_RATE - Baud rate for the serial console */
-#define SERIAL_BAUD_RATE 9600
+#define SERIAL_BAUD_RATE 115200


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in bucts
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of libreboot_src or libreboot git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# clean bucts
# --------------------------------------------------------

printf "Cleaning the previous build of bucts\n"

cd "bucts/"
make clean

printf "\n\n"

# done. go back to main directory.
cd "../"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in coreboot
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#       Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# clean coreboot utilities (dependencies for 'build'):

printf "Cleaning the previous build of coreboot and its utilities\n"

# clean coreboot and crossgcc (source archives preserved)
for payload in coreboot/*; do
	for board in "${payload}/"*; do

        # Clean coreboot, of course
		make -C "${board}/" distclean

		# Clean its utilities as well
		for util in {cbfs,ifd,nvram}tool cbmem; do
			make -C "${board}/util/${util}/" clean
		done
		make -C "${board}/payloads/libpayload/" distclean

        rm -f "${board}/util/crossgcc"
	done
done

printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in coreboot
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#       Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

make -C "crossgcc/" crossgcc-clean


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in flashrom
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#       Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

printf "Cleaning the previous build of flashrom\n"

# clean flashrom
make -C flashrom clean
rm -f "flashrom/flashrom_lenovobios_sst"
rm -f "flashrom/flashrom_lenovobios_macronix"

printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in GRUB
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#       Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

printf "Cleaning the previous build of GRUB\n"
# clean GURB
[ -d grub/Makefile ] && make -C grub distclean

# Also clean SeaBIOS
./oldbuild clean seabios

printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in i945pwm
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of libreboot_src or libreboot git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# clean i945-pwm utility
# --------------------------------------------------------------------

printf "Cleaning the previous build of i945-pwm\n"
cd "resources/utilities/i945-pwm/"
make clean
cd "../../../"
printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in ich9deblob
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of libreboot_src or libreboot git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# clean ich9deblob utility
# --------------------------------------------------------------------

printf "Cleaning the previous build of ich9deblob\n"
cd "resources/utilities/ich9deblob/"
make clean
cd "../../../"
printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in memtest86+
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#       Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

printf "Cleaning the previous build of MemTest86+\n"

# clean MemTest86+
make -C memtest86plus clean

printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: delete the ROM images
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#       Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# Delete the ROM images
rm -Rf "bin/"

printf "Deleted the bin/ directory containing the ROM images.\n\n"


code:
#!/usr/bin/env bash

#  helper script: clean the dependencies that were built in seabios
#
#	Copyright (C) 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the current working directory is the root
# of libreboot_src or libreboot git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# clean bucts
# --------------------------------------------------------

printf "Cleaning the previous build of seabios\n"

(
cd "seabios/"
rm -f "out/bios.bin.vga.elf"
make distclean
)


code:
#!/usr/bin/env bash

#
#  helper script: run "make menuconfig" on config(s) to modify them
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

payload="grub"
configpath="resources/libreboot/config/${payload}"

hackconfig () {
	board="${1}"
    cbrevision="$(cat ${configpath}/${board}/cbrevision)"
    vbootrevision="$(cat ${configpath}/${board}/vbootrevision)"
(
    cd "coreboot/${cbrevision}/${cbrevision}/"
    git checkout ${payload}_${board}
    (
        cd "3rdparty/vboot/"
        git checkout ${payload}_${board}
    )

	printf "Modifying config for %s (%s payload)\n" "${board}" "${payload}"
	sleep 2

	if [ ! -d "../../../${configpath}/${board}/" ]; then
		printf "build/config/grubmodify WARNING: config '%s' does not exist. Skipping.\n" "${board}"
        git checkout master
        (
            cd "3rdparty/vboot/"
            git checkout master
        )
		return
	fi

	mv "../../../${configpath}/${board}/config" ".config"
	make menuconfig
	mv ".config" "../../../${configpath}/${board}/config"

    git checkout master
    (
        cd "3rdparty/vboot/"
        git checkout master
    )
)
}

if [ $# -lt 1 ]; then
	for config in ${configpath}/*; do hackconfig "${config##*/}"; done
else
	for config in "${@}"; do hackconfig "${config}"; done
fi


code:
#!/usr/bin/env bash

#
#  helper script: run "make menuconfig" on config(s) to replace them
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

payload="grub"
configpath="resources/libreboot/config/${payload}"

hackconfig () {
	board="${1}"
    cbrevision="$(cat ${configpath}/${board}/cbrevision)"
    vbootrevision="$(cat ${configpath}/${board}/vbootrevision)"
(
    cd "coreboot/${cbrevision}/${cbrevision}/"
    git checkout ${payload}_${board}
    (
        cd "3rdparty/vboot/"
        git checkout ${payload}_${board}
    )

	printf "Replacing or creating new config for %s (%s payload)\n" "${board}" "${payload}"
	sleep 2

	make menuconfig

	[ ! -d "../../../${configpath}/${board}/" ] && mkdir -p "../../../${configpath}/${board}/"
	mv ".config" "../../../${configpath}/${board}/config"

    git checkout master
    (
        cd "3rdparty/vboot/"
        git checkout master
    )
)
}

if [ $# -lt 1 ]; then
	for config in ${configpath}/*; do hackconfig "${config##*/}"; done
else
	for config in "${@}"; do hackconfig "${config}"; done
fi


code:
#!/usr/bin/env bash

#
#  helper script: run "make oldconfig" on all coreboot config files
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

payload="grub"
configpath="resources/libreboot/config/${payload}"

hackconfig () {
	board="${1}"
    cbrevision="$(cat ${configpath}/${board}/cbrevision)"
    vbootrevision="$(cat ${configpath}/${board}/vbootrevision)"
(
    cd "coreboot/${cbrevision}/${cbrevision}/"
    git checkout ${payload}_${board}
    (
        cd "3rdparty/vboot/"
        git checkout ${payload}_${board}
    )

	printf "Updating config for %s (%s payload)\n" "${board}" "${payload}"
	sleep 2

	if [ ! -d "../../../${configpath}/${board}/" ]; then
		printf "build/config/grubupdate WARNING: config '%s' does not exist. Skipping.\n" "${board}"
        git checkout master
        (
            cd "3rdparty/vboot/"
            git checkout master
        )
		return
	fi

	mv "../../../${configpath}/${board}/config" ".config"
	make oldconfig
	mv ".config" "../../../${configpath}/${board}/config"

    git checkout master
    (
        cd "3rdparty/vboot/"
        git checkout master
    )
)
}

if [ $# -lt 1 ]; then
	for config in ${configpath}/*; do hackconfig "${config##*/}"; done
else
	for config in "${@}"; do hackconfig "${config}"; done
fi


code:
#!/usr/bin/env bash

#
#  helper script: update the seabios config
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

(
cd "seabios/"

for cfgtype in config config_vga; do

    printf "doing config %s\n" "${cfgtype}"
    sleep 2

    if [ -f "../resources/seabios/config/${cfgtype}" ]; then
    	cp "../resources/seabios/config/${cfgtype}" ".config"
    fi

    make menuconfig

    mv ".config" "../resources/seabios/config/${cfgtype}"

done
)


code:
#!/usr/bin/env bash

#
#  helper script: run "make menuconfig" on config(s) to modify them
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

payload="seabios"
configpath="resources/libreboot/config/${payload}"

hackconfig () {
	board="${1}"
    cbrevision="$(cat ${configpath}/${board}/cbrevision)"
    vbootrevision="$(cat ${configpath}/${board}/vbootrevision)"
(
    cd "coreboot/${cbrevision}/${cbrevision}/"
    git checkout ${payload}_${board}
    (
        cd "3rdparty/vboot/"
        git checkout ${payload}_${board}
    )

	printf "Modifying config for %s (%s payload)\n" "${board}" "${payload}"
	sleep 2

	if [ ! -d "../../../${configpath}/${board}/" ]; then
		printf "build/config/seabiosmodify WARNING: config '%s' does not exist. Skipping.\n" "${board}"
        git checkout master
        (
            cd "3rdparty/vboot/"
            git checkout master
        )
		return
	fi

	mv "../../../${configpath}/${board}/config" ".config"
	make menuconfig
	mv ".config" "../../../${configpath}/${board}/config"

    git checkout master
    (
        cd "3rdparty/vboot/"
        git checkout master
    )
)
}

if [ $# -lt 1 ]; then
	for config in ${configpath}/*; do hackconfig "${config##*/}"; done
else
	for config in "${@}"; do hackconfig "${config}"; done
fi


code:
#!/usr/bin/env bash

#
#  helper script: run "make menuconfig" on config(s) to replace them
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

payload="seabios"
configpath="resources/libreboot/config/${payload}"

hackconfig () {
	board="${1}"
    cbrevision="$(cat ${configpath}/${board}/cbrevision)"
    vbootrevision="$(cat ${configpath}/${board}/vbootrevision)"
(
    cd "coreboot/${cbrevision}/${cbrevision}/"
    git checkout ${payload}_${board}
    (
        cd "3rdparty/vboot/"
        git checkout ${payload}_${board}
    )

	printf "Replacing or creating new config for %s (%s payload)\n" "${board}" "${payload}"
	sleep 2

	make menuconfig

	[ ! -d "../../../${configpath}/${board}/" ] && mkdir -p "../../../${configpath}/${board}/"
	mv ".config" "../../../${configpath}/${board}/config"

    git checkout master
    (
        cd "3rdparty/vboot/"
        git checkout master
    )
)
}

if [ $# -lt 1 ]; then
	for config in ${configpath}/*; do hackconfig "${config##*/}"; done
else
	for config in "${@}"; do hackconfig "${config}"; done
fi


code:
#!/usr/bin/env bash

#
#  helper script: run "make oldconfig" on all coreboot config files
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

payload="seabios"
configpath="resources/libreboot/config/${payload}"

hackconfig () {
	board="${1}"
    cbrevision="$(cat ${configpath}/${board}/cbrevision)"
    vbootrevision="$(cat ${configpath}/${board}/vbootrevision)"
(
    cd "coreboot/${cbrevision}/${cbrevision}/"
    git checkout ${payload}_${board}
    (
        cd "3rdparty/vboot/"
        git checkout ${payload}_${board}
    )

	printf "Updating config for %s (%s payload)\n" "${board}" "${payload}"
	sleep 2

	if [ ! -d "../../../${configpath}/${board}/" ]; then
		printf "build/config/seabiosupdate WARNING: config '%s' does not exist. Skipping.\n" "${board}"
        git checkout master
        (
            cd "3rdparty/vboot/"
            git checkout master
        )
		return
	fi

	mv "../../../${configpath}/${board}/config" ".config"
	make oldconfig
	mv ".config" "../../../${configpath}/${board}/config"

    git checkout master
    (
        cd "3rdparty/vboot/"
        git checkout master
    )
)
}

if [ $# -lt 1 ]; then
	for config in ${configpath}/*; do hackconfig "${config##*/}"; done
else
	for config in "${@}"; do hackconfig "${config}"; done
fi


code:
#!/usr/bin/env bash

#
#  helper script: update the seabios config
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

(
cd seabios/

for cfgtype in config config_vga; do

    printf "doing config %s\n" "${cfgtype}"
    sleep 2

    if [ -f ../resources/seabios/config/${cfgtype} ]; then
	    cp ../resources/seabios/config/${cfgtype} .config
    	make oldconfig
    	mv .config ../resources/seabios/config/${cfgtype}
    fi

done
)


code:
#!/usr/bin/env bash

#  helper script: installs build dependencies for Parabola

# this script is based on the script for Trisquel 7
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Klemens Nanni <klemens@posteo.de>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

if [ $EUID -ne 0 ]; then
   printf "This script must be run as root\n"
   exit 1
fi

# Duplications are intentional. Please do not re-factor.
#
# This is so that they can moved to separate scripts.
#

pacman -S --needed wget

# For downloading source code
# ------------------------------------------------------------

printf "Source Code: In order to download the it, git is needed\n"
pacman -S --needed git

# For building the documentation
# ------------------------------------------------------------

pacman -S --needed pandoc texi2html

# For building source code:
# ------------------------------------------------------------

printf "Building Source Code: development packages\n"
pacman -S --needed base-devel libstdc++5

pacman -S arm-none-eabi-gcc

pacman -S --needed libpciaccess

[ "$(uname -i)" = x86_64 ] || [ "$(uname -m)" = x86_64 ]
arch=${?}

# For cross-compiling i686 target on x86_64 host.
if [ "${arch}" -eq 0 ]; then
	printf "Cross-Compiling: You are running on 64-bit architecture, however 32-bit libraries are needed\n"
	pacman -Sl multilib &>/dev/null || (printf "You must enable the multilib repository in /etc/pacman.conf first\n"; exit 1)
	pacman -S --needed gcc-multilib gcc-libs-multilib lib32-libltdl lib32-libpciaccess lib32-libstdc++5 lib32-glibc lib32-fakeroot
fi

# Memtest86+ build dependencies
# ------------------------------------------------------------

# pacman -S --needed base-devel

# i945-pwm build dependencies
# ------------------------------------------------------------

# pacman -S base-devel

# Coreboot build dependencies (also requires build-essential and git)
# ------------------------------------------------------------

printf "Coreboot: Ncurses for menuconfig and a few other tools\n"
pacman -S ncurses doxygen iasl gdb flex bison
# pacman -S git base-devel

# For cross-compiling i686 target on x86_64 host.
if [ "${arch}" -eq 0 ]; then
	printf "Cross-Compiling: You are running on 64-bit architecture, however 32-bit libraries are needed\n"
	pacman -S --needed lib32-ncurses
fi

# GRUB2 build dependencies (also requires build-essential, bison and flex)
# pacman -S --needed base-devel bison flex

printf "GRUB: Fonts, (crypto) filesystem support, automake, etc.\n"
pacman -S --needed autogen m4 autoconf help2man freetype2 automake fuse fuse-exfat xz gawk device-mapper libtool python
pacman -S --needed bdf-unifont # trying this, otherwise there was an error. I'll try AUR if this won't work.

# BucTS build dependencies (external script)
# ------------------------------------------------------------

# pacman -S --needed base-devel

# Flashrom build dependencies (also requires build-essential)
# ------------------------------------------------------------

printf "Flashrom: Your external programmer will be most probably using PCI bus, FTDI chips need additional libraries\n"
pacman -S --needed pciutils zlib libftdi libftdi-compat
# pacman -S --needed base-devel


code:
#!/usr/bin/env bash

# for_trisquel7 script: installs build dependencies for Trisquel 7
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

if [ $EUID -ne 0 ]; then
   printf "This script must be run as root\n"
   exit 1
fi

# Duplications are intentional. Please do not re-factor.
#
# This is so that they can moved to separate scripts.
#

apt-get -y install wget

# For downloading source code
# ------------------------------------------------------------

apt-get -y install git

# For building the documentation
# ------------------------------------------------------------

apt-get -y install pandoc texi2html texinfo texlive

# For building source code:
# ------------------------------------------------------------

apt-get -y install build-essential

# for cross-compiling ARM binaries
apt-get -y install gcc-arm-linux-gnueabi || printf "debian stretch ftw\n"

[ "$(uname -i)" = x86_64 ] || [ "$(uname -m)" = x86_64 ]
arch=${?}

# For cross-compiling i686 target on x86_64 host.
if [ "${arch}" -eq 0 ];	then
	apt-get -y install gcc-multilib libc6-i386 libc6-dev-i386
	apt-get -y install lib32stdc++6 g++-multilib dh-autoreconf
	# recommended, but not sure what for:
	apt-get -y install lib32tinfo-dev texi2html
fi

# Memtest86+ build dependencies
# ------------------------------------------------------------

apt-get -y install build-essential

# i945-pwm build dependencies
# ------------------------------------------------------------

apt-get -y install build-essential

# Coreboot build dependencies (also requires build-essential and git)
# ------------------------------------------------------------

apt-get -y install libncurses5-dev doxygen iasl gdb flex bison build-essential git libssl-dev

# For cross-compiling i686 target on x86_64 host.
[ "${arch}" -eq 0 ] && apt-get -y install lib32ncurses5-dev

# GRUB build dependencies (also requires build-essential, bison and flex)
# ------------------------------------------------------------

apt-get -y install ttf-unifont libopts25 libselinux1-dev autogen m4 autoconf help2man libopts25-dev libfont-freetype-perl automake autotools-dev build-essential bison flex libfuse-dev liblzma-dev gawk libdevmapper-dev libtool libfreetype6-dev

# BucTS build dependencies (external script)
# ------------------------------------------------------------

apt-get -y install build-essential

# Flashrom build dependencies (also requires build-essential)
# ------------------------------------------------------------

apt-get -y install libpci-dev pciutils zlib1g-dev libftdi-dev build-essential libusb-1.0-0-dev libusb-1.0

# For cross-compiling i686 target on x86_64 host.
[ "${arch}" -eq 0 ] && apt-get -y install lib32z1-dev


code:
#!/usr/bin/env bash

#  helper script: builds bucts source code
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
if [ -z ${NPROC+x} ]; then
    cores="$(nproc)"
else
    case ${NPROC} in
        ''|*[!0-9]*)
            printf "value '%s' for NPROC is invalid. non-numeric. Exiting.\n" "${NPROC}"
            exit 1
            ;;
    esac
    cores="${NPROC}"
fi

# Build BUC.TS utility (needed for flashing ROM images on X60/T60 while Lenovo BIOS is running)
# --------------------------------------------------------------------

printf "Building bucts\n"

cd "bucts/"

buildtype="unknown"
if (( $# != 1 )); then
	buildtype="dynamic"
else
	buildtype="static"
fi

if [ "${buildtype}" = "static" ]; then
	patch "Makefile" < "../resources/bucts/patch/staticlink.diff"
fi

make clean
make -j${cores}

if [ "${buildtype}" = "static" ]; then
	patch "Makefile" -R < "../resources/bucts/patch/staticlink.diff"
fi

# done. go back to main directory
cd "../"

printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: builds the dependencies that coreboot needs before building a ROM image
#
#	Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
HOMEDIR=$(pwd)

# Build utilities needed in coreboot directory
# --------------------------------------------------------------------

printf "Building the utilities in coreboot\n"

# build coreboot utilities (in each revision) and
# create symlinks to the crossgcc archive
for payload in $HOMEDIR/coreboot/*; do
	for board in "${payload}/"*; do

	# cbfstool, cbmem, nvramtool
	for util in {cbfs,nvram}tool cbmem; do
        if [ "${util}" = "cbfstool" ]; then
            sed -i '/.*fmd_scanner.o.*-Wno-unused-function$/ s/$/ -Wno-sign-compare/'  "${board}"/util/cbfstool/Makefile.inc
        fi
		make -BC "${board}/util/${util}"
	done
	# create symlink to crossgcc
	(

	ln -fs $HOMEDIR/crossgcc/util/crossgcc/ ${board}/util/crossgcc
	)

	done
done

for payloads in $HOMEDIR/resources/libreboot/config/*; do

	if [ ! -d "${payloads}/" ]; then
		continue
	fi

	payload="${payloads##*/}"

	for boardconfig in $HOMEDIR/resources/libreboot/config/${payload}/*; do

		if [ ! -d "${boardconfig}/" ]; then
			continue
		fi

		boardname="${boardconfig##*/}"
		cbrevision=$(cat "${boardconfig}/cbrevision")
		vbootrevision=$(cat "${boardconfig}/vbootrevision")

		reused_coreboot_patches="$HOMEDIR/resources/libreboot/patch/coreboot/${cbrevision}/${payload}/${boardname}/reused.list"
		reused_vboot_patches="$HOMEDIR/resources/libreboot/patch/vboot/${vbootrevision}/${payload}/${boardname}/reused.list"
		for reused_patches in "${reused_coreboot_patches}" "${reused_vboot_patches}"; do
			if [ -f "${reused_patches}" ]; then
				for patch in $(cat "${reused_patches}"); do
					if [ ! -f "./${patch}" ]; then
						printf "%s listed in %s does not exist\n" "${patch}" "${reused_patches}"
						exit 1
					fi
				done
			fi
		done

	done
done

# sanity check (check for invalid paths in the reused.list patch lists before proceeding)
# in ascending filename order, apply patches from a directory
apply_patches_from_directory() {
	patch_directory="${1}" # directory containing the patch files

	if [ -d "${patch_directory}" ]; then
		for patch in ${patch_directory}/*.patch;  do

			if [ "${patch##*/}" = "*.patch" ]; then # oh so ugly
				continue # ugly ugly ugly ugly ugly
			fi # most hideous thing you've ever seen

			git am "${patch}" || continue
		done
	fi
}
# files listed in the file (if found) are absolute paths, relative to the root of the libreboot src directory
# the file lists patches patches that should be applied
apply_patches_from_file() {
	patch_list="${1}" # file listing the paths to all the patches
	libreboot_src_root="${2}" # path to the root of the libreboot_src directory

	if [ -f "${patch_list}" ]; then
		for patchname in $(cat "${patch_list}"); do
			git am "${libreboot_src_root}/${patchname}" || continue
		done
	fi
}

create_branch() {
	branchname="${1}"
    git branch ${branchname}
    git checkout ${branchname}
    git checkout master
}

# use git-init on everything
# this is so that we can then apply patche
# for these revisions of vboot and coreboot
for i in $HOMEDIR/coreboot/*; do
    if [ ! -d "${i}/" ]; then
        continue
    fi
    for revision in ${i}/*; do
        if [ ! -d "${revision}/" ]; then
            continue
        fi
        (
        cd "${revision}/"
        rm -rf .git
        git init
        git add -A .
        git commit -m "coreboot revision ${revision##*/}"
        cd "3rdparty/vboot/"
        rm -rf .git
        git init
        git add -A .
        git commit -m "coreboot revision ${revision##*/}"
        )
    done
done

for payloads in $HOMEDIR/resources/libreboot/config/*; do

	if [ ! -d "${payloads}/" ]; then
		continue
	fi

	payload="${payloads##*/}"

	for boardconfig in $HOMEDIR/resources/libreboot/config/${payload}/*; do

		if [ ! -d "${boardconfig}/" ]; then
			continue
		fi

		boardname="${boardconfig##*/}"
		cbrevision=$(cat "${boardconfig}/cbrevision")
		vbootrevision=$(cat "${boardconfig}/vbootrevision")
        branchname="${payload}_${boardname}"

        # the same vboot revision is always used for coreboot revision,
        # so we don't need to wworry about checking for that here

		# patch that version
		(

			cd "$HOMEDIR/coreboot/${cbrevision}/${cbrevision}/"
			create_branch ${branchname}

            git checkout ${branchname}

			# apply patches (coreboot, common to all systems using this revision)
			apply_patches_from_directory "$HOMEDIR/resources/libreboot/patch/common/coreboot/${cbrevision}"
			# apply patches re-used from other boards, before applying main patches (common patches for similar boards)
			apply_patches_from_file "$HOMEDIR/resources/libreboot/patch/coreboot/${cbrevision}/${payload}/${boardname}/reused.list" ../../..
			# apply patches (coreboot, machine-specific for this revision)
			apply_patches_from_directory "$HOMEDIR/resources/libreboot/patch/coreboot/${cbrevision}/${payload}/${boardname}"

            git checkout master

			cd "3rdparty/vboot/"
			# reset to known revision (vboot)
			create_branch ${branchname}

            git checkout ${branchname}

			# apply patches (vboot, common to all systems using this revision)
			apply_patches_from_directory "$HOMEDIR/resources/libreboot/patch/common/vboot/${vbootrevision}"
			# apply patches re-used from other boards, before applying main patches (common patches for similar boards)
			apply_patches_from_file "$HOMEDIR/resources/libreboot/patch/vboot/${vbootrevision}/${payload}/${boardname}/reused.list" ../../../../..
			# apply patches (vboot, machine-specific for this revision)
			apply_patches_from_directory "$HOMEDIR/resources/libreboot/patch/vboot/${vbootrevision}/${payload}/${boardname}"

            git checkout master

		)
	done
done


code:
#!/usr/bin/env bash

#  helper script: builds crossgcc, needed by coreboot's build system
#
#	Copyright (C) 2016 Leah Rowe <info@minifree.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

if [ -z ${NPROC+x} ]; then
    cores="$(nproc)"
else
    case ${NPROC} in
        ''|*[!0-9]*)
            printf "value '%s' for NPROC is invalid. non-numeric. Exiting.\n" "${NPROC}"
            exit 1
            ;;
    esac
    cores="${NPROC}"
fi

(
cd "crossgcc/"
for architecture in i386 arm; do
    make crossgcc-${architecture} CPUS=${cores}
done
)


code:
#!/usr/bin/env bash

#  helper script: builds flashrom source code
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
if [ -z ${NPROC+x} ]; then
    cores="$(nproc)"
else
    case ${NPROC} in
        ''|*[!0-9]*)
            printf "value '%s' for NPROC is invalid. non-numeric. Exiting.\n" "${NPROC}"
            exit 1
            ;;
    esac
    cores="${NPROC}"
fi

# Build "flashrom" (utility for flashing/dumping ROMs)
# --------------------------------------------------------------------

printf "Building flashrom\n"

cd "flashrom/"

make clean
if (( $# != 1 )); then
	make -j${cores}
else
	if [ "${1}" = "static" ]; then
		make SHARED=0 CC='gcc -static' -j${cores} CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no
	else
		make -j${cores} CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no
	fi
fi

mv "flashrom" "flashrom_normal"

# build patched binaries for MX25L1605D and SST25VF016B flash chips
# - these patches are needed for initial installation on an X60 or T60
# - these patches are for people who have lenovo bios running
for patchname in "lenovobios_macronix" "lenovobios_sst"
do
	# first remove the existing build
	rm -f "flashrom_${patchname}"

	# backup the unpatched flashchips.c (it will be patched)
	cp "flashchips.c" "flashchips.c_"
	# patch flashchips.c
	patch "flashchips.c" < "../resources/flashrom/patch/${patchname}.diff"

	make clean
	if (( $# != 1 )); then
		make -j${cores} CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no
	else
		if [ "${1}" = "static" ]; then
			make SHARED=0 CC='gcc -static' -j${cores} CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no
		else
			make -j${cores} CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no
		fi
	fi

	# Rename the binary based on the patch name
	mv "flashrom" "flashrom_${patchname}"

	# restore unpatched flashchips.c
	rm -f "flashchips.c"
	mv "flashchips.c_" "flashchips.c"
done

mv "flashrom_normal" "flashrom"

cd "../"


code:
#!/usr/bin/env bash

#  helper script: builds GRUB2 source code
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#   Copyright (C) 2015, 2016 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of git or release archive

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
if [ -z ${NPROC+x} ]; then
    cores="$(nproc)"
else
    case ${NPROC} in
        ''|*[!0-9]*)
            printf "value '%s' for NPROC is invalid. non-numeric. Exiting.\n" "${NPROC}"
            exit 1
            ;;
    esac
    cores="${NPROC}"
fi

# Build GRUB2 as coreboot payload

printf "Building GRUB\n"

# use a subshell to not end up in grub/ in case of build issues
(
cd grub/

# clean up first
[ -d Makefile ] && make distclean

# build
./autogen.sh
./configure --with-platform=coreboot
make -j${cores}
)

# Also build SeaBIOS, which we use with GRUB to make SeaGRUB
./oldbuild module seabios


code:
#!/usr/bin/env bash

#  helper script: builds i945-pwm source code
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# Build i945-pwm utility
# --------------------------------------------------------------------

printf "Building i945-pwm\n"

cd "resources/utilities/i945-pwm/"

make clean
# build it
make

# done. go back to main directory
cd "../../../"

printf "\n\n"


code:
#!/usr/bin/env bash

#  helper script: builds ich9deblob source code
#
#	Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
#
#    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, either version 3 of the License, or
#    (at your option) any later version.
#
#    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, see <http://www.gnu.org/licenses/>.
#

# This script assumes that the working directory is the root
# of libreboot_src or git

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

# Build ich9deblob utility
# --------------------------------------------------------------------

printf "Building ich9deblob\n"

cd "resources/utilities/ich9deblob/"

# clean it first
make clean

# build ich9deblob
make

# done. go back to main directory
cd "../../../"

printf "\n\n"