code:
From 44423cb3e0118b04739f89409e71a0ed1622ccd2 Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Sat, 27 Aug 2016 01:09:19 +0200
Subject: [PATCH 2/2] nb/gm45/gma.c: enable VESA framebuffer mode on VGA output

This implements "Keep VESA framebuffer" behavior on VGA output of gm45.
This patch reuses Linux code to compute vga divisors.

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

diff --git a/src/northbridge/intel/gm45/gma.c b/src/northbridge/intel/gm45/gma.c
index 74c9bc3..efaa210 100644
--- a/src/northbridge/intel/gm45/gma.c
+++ b/src/northbridge/intel/gm45/gma.c
@@ -25,6 +25,7 @@
 #include <cpu/x86/msr.h>
 #include <cpu/x86/mtrr.h>
 #include <kconfig.h>
+#include <commonlib/helpers.h>

 #include "drivers/intel/gma/i915_reg.h"
 #include "chip.h"
@@ -35,6 +36,8 @@
 #include <pc80/vga.h>
 #include <pc80/vga_io.h>

+#define BASE_FREQUECY 96000
+
 static struct resource *gtt_res = NULL;

 u32 gtt_read(u32 reg)
@@ -345,14 +348,38 @@ static void gma_init_lvds(const struct northbridge_intel_gm45_config *info,
 }

 static void gma_init_vga(const struct northbridge_intel_gm45_config *info,
-			   u8 *mmio)
+			 u8 *mmio, u32 physbase, u16 piobase, u32 lfb)
 {

 	int i;
-	u32 hactive, vactive;
+	u8 edid_data[128];
+	struct edid edid;
+	struct edid_mode *mode;
+	u32 hactive, vactive, right_border, bottom_border;
+	int hpolarity, vpolarity;
+	u32 vsync, hsync, vblank, hblank, hfront_porch, vfront_porch;
+	u32 target_frequency;
+	u32 smallest_err = 0xffffffff;
+	u32 pixel_p1 = 1;
+	u32 pixel_n = 1;
+	u32 pixel_m1 = 1;
+	u32 pixel_m2 = 1;
+	u32 link_frequency = info->gfx.link_frequency_270_mhz ? 270000 : 162000;
+	u32 data_m1;
+	u32 data_n1 = 0x00800000;
+	u32 link_m1;
+	u32 link_n1 = 0x00040000;
+

 	vga_gr_write(0x18, 0);

+	/* Setup GTT.  */
+	for (i = 0; i < 0x2000; i++) {
+		outl((i << 2) | 1, piobase);
+		outl(physbase + (i << 12) + 1, piobase + 4);
+	}
+
+
 	write32(mmio + VGA0, 0x31108);
 	write32(mmio + VGA1, 0x31406);

@@ -363,8 +390,7 @@ static void gma_init_vga(const struct northbridge_intel_gm45_config *info,
 			| ADPA_USE_VGA_HVPOLARITY
 			| ADPA_VSYNC_CNTL_ENABLE
 			| ADPA_HSYNC_CNTL_ENABLE
-			| ADPA_DPMS_ON
-			);
+			| ADPA_DPMS_ON);

 	write32(mmio + 0x7041c, 0x0);
 	write32(mmio + DPLL_MD(0), 0x3);
@@ -382,95 +408,234 @@ static void gma_init_vga(const struct northbridge_intel_gm45_config *info,
 	for (i = 0; i <= 0x18; i++)
 		vga_cr_write(i, cr[i]);

+	udelay(1);
+
+	intel_gmbus_read_edid(mmio + GMBUS0, 2, 0x50, edid_data, 128);
+	intel_gmbus_stop(mmio + GMBUS0);
+	decode_edid(edid_data,
+		    sizeof(edid_data), &edid);
+	mode = &edid.mode;
+
+
 	/* Disable screen memory to prevent garbage from appearing.  */
 	vga_sr_write(1, vga_sr_read(1) | 0x20);

-	hactive = 640;
-	vactive = 400;
+	hactive = edid.x_resolution;
+	vactive = edid.y_resolution;
+	right_border = mode->hborder;
+	bottom_border = mode->vborder;
+	hpolarity = (mode->phsync == '-');
+	vpolarity = (mode->pvsync == '-');
+	vsync = mode->vspw;
+	hsync = mode->hspw;
+	vblank = mode->vbl;
+	hblank = mode->hbl;
+	hfront_porch = mode->hso;
+	vfront_porch = mode->vso;
+	target_frequency = mode->pixel_clock;
+
+	if (IS_ENABLED(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE)) {
+		vga_sr_write(1, 1);
+		vga_sr_write(0x2, 0xf);
+		vga_sr_write(0x3, 0x0);
+		vga_sr_write(0x4, 0xe);
+		vga_gr_write(0, 0x0);
+		vga_gr_write(1, 0x0);
+		vga_gr_write(2, 0x0);
+		vga_gr_write(3, 0x0);
+		vga_gr_write(4, 0x0);
+		vga_gr_write(5, 0x0);
+		vga_gr_write(6, 0x5);
+		vga_gr_write(7, 0xf);
+		vga_gr_write(0x10, 0x1);
+		vga_gr_write(0x11, 0);
+
+		edid.bytes_per_line = (edid.bytes_per_line + 63) & ~63;
+
+		write32(mmio + DSPCNTR(0), DISPLAY_PLANE_ENABLE
+			| DISPPLANE_BGRX888);
+		write32(mmio + DSPADDR(0), 0);
+		write32(mmio + DSPSTRIDE(0), edid.bytes_per_line);
+		write32(mmio + DSPSURF(0), 0);
+		for (i = 0; i < 0x100; i++)
+			write32(mmio + LGC_PALETTE(0) + 4 * i, i * 0x010101);
+	} else {
+		vga_textmode_init();
+	}
+
+	u32 candn, candm1, candm2, candp1;
+	for (candn = 1; candn <= 4; candn++) {
+		for (candm1 = 23; candm1 >= 17; candm1--) {
+			for (candm2 = 11; candm2 >= 5; candm2--) {
+				for (candp1 = 8; candp1 >= 1; candp1--) {
+					u32 m = 5 * (candm1 + 2) + (candm2 + 2);
+					u32 p = candp1 * 10; /* 10 == p2 */
+					u32 vco = DIV_ROUND_CLOSEST(BASE_FREQUECY * m, candn + 2);
+					u32 dot = DIV_ROUND_CLOSEST(vco, p);
+					u32 this_err = ABS(dot - target_frequency);
+					if (this_err < smallest_err) {
+						smallest_err= this_err;
+						pixel_n = candn;
+						pixel_m1 = candm1;
+						pixel_m2 = candm2;
+						pixel_p1 = candp1;
+					}
+				}
+			}
+		}
+	}
+
+	if (smallest_err == 0xffffffff) {
+		printk(BIOS_ERR, "Couldn't find GFX clock divisors\n");
+		return;
+	}
+
+	link_m1 = ((uint64_t)link_n1 * mode->pixel_clock) / link_frequency;
+	data_m1 = ((uint64_t)data_n1 * 18 * mode->pixel_clock)
+		/ (link_frequency * 8 * 4);
+
+	printk(BIOS_INFO, "bringing up panel at resolution %d x %d\n",
+	       hactive, vactive);
+	printk(BIOS_DEBUG, "Borders %d x %d\n",
+	       right_border, bottom_border);
+	printk(BIOS_DEBUG, "Blank %d x %d\n",
+	       hblank, vblank);
+	printk(BIOS_DEBUG, "Sync %d x %d\n",
+	       hsync, vsync);
+	printk(BIOS_DEBUG, "Front porch %d x %d\n",
+	       hfront_porch, vfront_porch);
+	printk(BIOS_DEBUG, (info->gfx.use_spread_spectrum_clock
+			    ? "Spread spectrum clock\n" : "DREF clock\n"));
+	printk(BIOS_DEBUG, "Polarities %d, %d\n",
+	       hpolarity, vpolarity);
+	printk(BIOS_DEBUG, "Data M1=%d, N1=%d\n",
+	       data_m1, data_n1);
+	printk(BIOS_DEBUG, "Link frequency %d kHz\n",
+	       link_frequency);
+	printk(BIOS_DEBUG, "Link M1=%d, N1=%d\n",
+	       link_m1, link_n1);
+	printk(BIOS_DEBUG, "Pixel N=%d, M1=%d, M2=%d, P1=%d\n",
+	       pixel_n, pixel_m1, pixel_m2, pixel_p1);
+	printk(BIOS_DEBUG, "Pixel clock %d kHz\n",
+		BASE_FREQUECY * (5 * (pixel_m1 + 2) + (pixel_m2 + 2) / (pixel_n + 2)
+		/ (pixel_p1 * 10)));

 	mdelay(1);
-	write32(mmio + FP0(0), 0x31108);
-	write32(mmio + DPLL(0),
-		DPLL_VCO_ENABLE | DPLLB_MODE_DAC_SERIAL
-		| DPLL_DAC_SERIAL_P2_CLOCK_DIV_10
-		| 0x10601
-		);
+	write32(mmio + FP0(0), (pixel_n << 16)
+		| (pixel_m1 << 8) | pixel_m2);
+	write32(mmio + DPLL(0), DPLL_VCO_ENABLE
+		| DPLL_VGA_MODE_DIS | DPLLB_MODE_DAC_SERIAL
+		| (0x10000 << (pixel_p1 - 1))
+		| (6 << 9));
+
 	mdelay(1);
-	write32(mmio + DPLL(0),
-		DPLL_VCO_ENABLE | DPLLB_MODE_DAC_SERIAL
-		| DPLL_DAC_SERIAL_P2_CLOCK_DIV_10
-		| 0x10601
-		);
+	write32(mmio + DPLL(0), DPLL_VCO_ENABLE
+		| DPLL_VGA_MODE_DIS | DPLLB_MODE_DAC_SERIAL
+		| (0x10000 << (pixel_p1 - 1))
+		| (6 << 9));

 	write32(mmio + ADPA, ADPA_DAC_ENABLE
 			| ADPA_PIPE_A_SELECT
 			| ADPA_CRT_HOTPLUG_MONITOR_COLOR
 			| ADPA_CRT_HOTPLUG_ENABLE
-			| ADPA_USE_VGA_HVPOLARITY
 			| ADPA_VSYNC_CNTL_ENABLE
 			| ADPA_HSYNC_CNTL_ENABLE
 			| ADPA_DPMS_ON
-			);
+			| (vpolarity ? ADPA_VSYNC_ACTIVE_LOW :
+			   ADPA_VSYNC_ACTIVE_HIGH)
+			| (hpolarity ? ADPA_HSYNC_ACTIVE_LOW :
+			   ADPA_HSYNC_ACTIVE_HIGH));

 	write32(mmio + HTOTAL(0),
-		((hactive - 1) << 16)
+		((hactive + right_border + hblank - 1) << 16)
 		| (hactive - 1));
 	write32(mmio + HBLANK(0),
-		((hactive - 1) << 16)
-		| (hactive - 1));
+		((hactive + right_border + hblank - 1) << 16)
+		| (hactive + right_border - 1));
 	write32(mmio + HSYNC(0),
-		((hactive - 1) << 16)
-		| (hactive - 1));
+		((hactive + right_border + hfront_porch + hsync - 1) << 16)
+		| (hactive + right_border + hfront_porch - 1));

-	write32(mmio + VTOTAL(0), ((vactive - 1) << 16)
-		| (vactive - 1));
-	write32(mmio + VBLANK(0), ((vactive - 1) << 16)
+	write32(mmio + VTOTAL(0), ((vactive + bottom_border + vblank - 1) << 16)
 		| (vactive - 1));
+	write32(mmio + VBLANK(0), ((vactive + bottom_border + vblank - 1) << 16)
+		| (vactive + bottom_border - 1));
 	write32(mmio + VSYNC(0),
-		((vactive - 1) << 16)
-		| (vactive - 1));
+		((vactive + bottom_border + vfront_porch + vsync - 1) << 16)
+		| (vactive + bottom_border + vfront_porch - 1));

 	write32(mmio + PIPECONF(0), PIPECONF_DISABLE);

 	write32(mmio + PF_WIN_POS(0), 0);
-
-	write32(mmio + PIPESRC(0), (639 << 16) | 399);
-	write32(mmio + PF_CTL(0), PF_ENABLE | PF_FILTER_MED_3x3);
-	write32(mmio + PF_WIN_SZ(0), vactive | (hactive << 16));
-	write32(mmio + PFIT_CONTROL, 0xa0000000);
+	if (IS_ENABLED(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE)) {
+		write32(mmio + PIPESRC(0), ((hactive - 1) << 16)
+			| (vactive - 1));
+		write32(mmio + PF_CTL(0), 0);
+		write32(mmio + PF_WIN_SZ(0), 0);
+		write32(mmio + PFIT_CONTROL, 0);
+	} else {
+		write32(mmio + PIPESRC(0), (639 << 16) | 399);
+		write32(mmio + PF_CTL(0), PF_ENABLE | PF_FILTER_MED_3x3);
+		write32(mmio + PF_WIN_SZ(0), vactive | (hactive << 16));
+		write32(mmio + PFIT_CONTROL, 0x80000000);
+	}

 	mdelay(1);

+	write32(mmio + PIPE_DATA_M1(0), 0x7e000000 | data_m1);
+	write32(mmio + PIPE_DATA_N1(0), data_n1);
+	write32(mmio + PIPE_LINK_M1(0), link_m1);
+	write32(mmio + PIPE_LINK_N1(0), link_n1);
+
 	write32(mmio + 0x000f000c, 0x00002040);
 	mdelay(1);
 	write32(mmio + 0x000f000c, 0x00002050);
 	write32(mmio + 0x00060100, 0x00044000);
 	mdelay(1);
+	write32(mmio + PIPECONF(0), PIPECONF_BPP_6);
+	write32(mmio + 0x000f0008, 0x00000040);
+	write32(mmio + 0x000f000c, 0x00022050);
+	write32(mmio + PIPECONF(0), PIPECONF_BPP_6 | PIPECONF_DITHER_EN);
 	write32(mmio + PIPECONF(0), PIPECONF_ENABLE
 			| PIPECONF_BPP_6 | PIPECONF_DITHER_EN);

-	write32(mmio + VGACNTRL, 0x0);
-	write32(mmio + DSPCNTR(0), DISPLAY_PLANE_ENABLE | DISPPLANE_BGRX888);
-	mdelay(1);
+	if (IS_ENABLED(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE)) {
+		write32(mmio + VGACNTRL, VGA_DISP_DISABLE);
+		write32(mmio + DSPCNTR(0), DISPLAY_PLANE_ENABLE
+			| DISPPLANE_BGRX888);
+		mdelay(1);
+	} else {
+		write32(mmio + VGACNTRL, 0xc4008e);
+	}

 	write32(mmio + ADPA, ADPA_DAC_ENABLE
 			| ADPA_PIPE_A_SELECT
 			| ADPA_CRT_HOTPLUG_MONITOR_COLOR
 			| ADPA_CRT_HOTPLUG_ENABLE
-			| ADPA_USE_VGA_HVPOLARITY
 			| ADPA_VSYNC_CNTL_ENABLE
 			| ADPA_HSYNC_CNTL_ENABLE
 			| ADPA_DPMS_ON
-			);
+			| (vpolarity ? ADPA_VSYNC_ACTIVE_LOW :
+			   ADPA_VSYNC_ACTIVE_HIGH)
+			| (hpolarity ? ADPA_HSYNC_ACTIVE_LOW :
+			   ADPA_HSYNC_ACTIVE_HIGH));

-	vga_textmode_init();
+	write32(mmio + PP_CONTROL, PANEL_POWER_ON | PANEL_POWER_RESET);

-	/* Enable screen memory.  */
+	/* Enable screen memory. */
 	vga_sr_write(1, vga_sr_read(1) & ~0x20);

 	/* Clear interrupts. */
 	write32(mmio + DEIIR, 0xffffffff);
 	write32(mmio + SDEIIR, 0xffffffff);
+
+	if (IS_ENABLED(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE)) {
+		memset((void *) lfb, 0,
+			edid.x_resolution * edid.y_resolution * 4);
+		set_vbe_mode_info_valid(&edid, lfb);
+	}
+
+
 }

 /* compare the header of the vga edid header */
@@ -480,6 +645,7 @@ static u8 vga_connected(u8 *mmio)
 	u8 vga_edid[128];
 	u8 header[8] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00};
 	intel_gmbus_read_edid(mmio + GMBUS0, 2, 0x50, vga_edid, 128);
+	intel_gmbus_stop(mmio + GMBUS0);
 	for (int i = 0; i < 8; i++) {
 		if (vga_edid[i] != header[i]) {
 			printk(BIOS_DEBUG, "VGA not connected. Using LVDS display\n");
@@ -566,7 +732,8 @@ static void gma_func0_init(struct device *dev)
 			       "Initializing VGA without OPROM. MMIO 0x%llx\n",
 			       gtt_res->base);
 			if (vga_connected(res2mmio(gtt_res, 0, 0)))
-				gma_init_vga(conf, res2mmio(gtt_res, 0, 0));
+				gma_init_vga(conf, res2mmio(gtt_res, 0, 0),
+					physbase, pio_res->base, lfb_res->base);
 			else
 				gma_init_lvds(conf, res2mmio(gtt_res, 0, 0),
 					physbase, pio_res->base, lfb_res->base);
--
2.9.3


code:
From d7fe366539f2a492b4a64030618506690bfbb232 Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Thu, 8 Sep 2016 22:21:54 +0200
Subject: [PATCH] gm45/gma.c: use correct id string for fake VBT

The correct id string for gm45 is "$VBT CANTIGA        ".
This can be found in the gm45 option rom:
"strings vbios.bin | grep VBT".

Change-Id: Icd67a87dac774b4b3c211511c784c4fb4e2ea97c
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
---
 src/northbridge/intel/gm45/gma.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/northbridge/intel/gm45/gma.c b/src/northbridge/intel/gm45/gma.c
index d5f6471..19bd944 100644
--- a/src/northbridge/intel/gm45/gma.c
+++ b/src/northbridge/intel/gm45/gma.c
@@ -425,7 +425,7 @@ static void gma_func0_init(struct device *dev)

 		/* Linux relies on VBT for panel info.  */
 		generate_fake_intel_oprom(&conf->gfx, dev,
-					  "$VBT IRONLAKE-MOBILE");
+					  "$VBT CANTIGA        ");
 	}
 }

--
2.9.3

repo_name: zyliwax/libreboot

license: mit


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:
From 51dc727c71bbb10519a670b83b67a84f704e003a Mon Sep 17 00:00:00 2001
From: Arthur Heymans <arthur@aheymans.xyz>
Date: Mon, 22 Aug 2016 17:58:46 +0200
Subject: [PATCH 1/2] gm45/gma.c: use screen on vga connector if connected

The intel x4x and gm45 have very similar integrated graphic devices.
Currently the x4x native graphic init enables VGA, while gm45 can output
on LVDS.

This patch reuses the x4x graphic initialisation code
to enable output on VGA in gm45 in a way that the behavior is similar to vbios:
If no VGA display is connected the internal LVDS screen is used.
If an external screen is detected on the VGA port it will be used instead.

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

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

-static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
+static void gma_init_lvds(const struct northbridge_intel_gm45_config *info,
 			   u8 *mmio, u32 physbase, u16 piobase, u32 lfb)
 {

@@ -101,7 +101,7 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 		    sizeof(edid_data), &edid);
 	mode = &edid.mode;

-	/* Disable screen memory to prevent garbage from appearing.  */
+	/* Disable screen memory to prevent garbage from appearing. */
 	vga_sr_write(1, vga_sr_read(1) | 0x20);

 	hactive = edid.x_resolution;
@@ -344,6 +344,152 @@ static void intel_gma_init(const struct northbridge_intel_gm45_config *info,
 	}
 }

+static void gma_init_vga(const struct northbridge_intel_gm45_config *info,
+			   u8 *mmio)
+{
+
+	int i;
+	u32 hactive, vactive;
+
+	vga_gr_write(0x18, 0);
+
+	write32(mmio + VGA0, 0x31108);
+	write32(mmio + VGA1, 0x31406);
+
+	write32(mmio + ADPA, ADPA_DAC_ENABLE
+			| ADPA_PIPE_A_SELECT
+			| ADPA_CRT_HOTPLUG_MONITOR_COLOR
+			| ADPA_CRT_HOTPLUG_ENABLE
+			| ADPA_USE_VGA_HVPOLARITY
+			| ADPA_VSYNC_CNTL_ENABLE
+			| ADPA_HSYNC_CNTL_ENABLE
+			| ADPA_DPMS_ON
+			);
+
+	write32(mmio + 0x7041c, 0x0);
+	write32(mmio + DPLL_MD(0), 0x3);
+	write32(mmio + DPLL_MD(1), 0x3);
+
+	vga_misc_write(0x67);
+
+	const u8 cr[] = { 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
+		    0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
+		    0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96, 0xb9, 0xa3,
+		    0xff
+	};
+	vga_cr_write(0x11, 0);
+
+	for (i = 0; i <= 0x18; i++)
+		vga_cr_write(i, cr[i]);
+
+	/* Disable screen memory to prevent garbage from appearing.  */
+	vga_sr_write(1, vga_sr_read(1) | 0x20);
+
+	hactive = 640;
+	vactive = 400;
+
+	mdelay(1);
+	write32(mmio + FP0(0), 0x31108);
+	write32(mmio + DPLL(0),
+		DPLL_VCO_ENABLE | DPLLB_MODE_DAC_SERIAL
+		| DPLL_DAC_SERIAL_P2_CLOCK_DIV_10
+		| 0x10601
+		);
+	mdelay(1);
+	write32(mmio + DPLL(0),
+		DPLL_VCO_ENABLE | DPLLB_MODE_DAC_SERIAL
+		| DPLL_DAC_SERIAL_P2_CLOCK_DIV_10
+		| 0x10601
+		);
+
+	write32(mmio + ADPA, ADPA_DAC_ENABLE
+			| ADPA_PIPE_A_SELECT
+			| ADPA_CRT_HOTPLUG_MONITOR_COLOR
+			| ADPA_CRT_HOTPLUG_ENABLE
+			| ADPA_USE_VGA_HVPOLARITY
+			| ADPA_VSYNC_CNTL_ENABLE
+			| ADPA_HSYNC_CNTL_ENABLE
+			| ADPA_DPMS_ON
+			);
+
+	write32(mmio + HTOTAL(0),
+		((hactive - 1) << 16)
+		| (hactive - 1));
+	write32(mmio + HBLANK(0),
+		((hactive - 1) << 16)
+		| (hactive - 1));
+	write32(mmio + HSYNC(0),
+		((hactive - 1) << 16)
+		| (hactive - 1));
+
+	write32(mmio + VTOTAL(0), ((vactive - 1) << 16)
+		| (vactive - 1));
+	write32(mmio + VBLANK(0), ((vactive - 1) << 16)
+		| (vactive - 1));
+	write32(mmio + VSYNC(0),
+		((vactive - 1) << 16)
+		| (vactive - 1));
+
+	write32(mmio + PIPECONF(0), PIPECONF_DISABLE);
+
+	write32(mmio + PF_WIN_POS(0), 0);
+
+	write32(mmio + PIPESRC(0), (639 << 16) | 399);
+	write32(mmio + PF_CTL(0), PF_ENABLE | PF_FILTER_MED_3x3);
+	write32(mmio + PF_WIN_SZ(0), vactive | (hactive << 16));
+	write32(mmio + PFIT_CONTROL, 0xa0000000);
+
+	mdelay(1);
+
+	write32(mmio + 0x000f000c, 0x00002040);
+	mdelay(1);
+	write32(mmio + 0x000f000c, 0x00002050);
+	write32(mmio + 0x00060100, 0x00044000);
+	mdelay(1);
+	write32(mmio + PIPECONF(0), PIPECONF_ENABLE
+			| PIPECONF_BPP_6 | PIPECONF_DITHER_EN);
+
+	write32(mmio + VGACNTRL, 0x0);
+	write32(mmio + DSPCNTR(0), DISPLAY_PLANE_ENABLE | DISPPLANE_BGRX888);
+	mdelay(1);
+
+	write32(mmio + ADPA, ADPA_DAC_ENABLE
+			| ADPA_PIPE_A_SELECT
+			| ADPA_CRT_HOTPLUG_MONITOR_COLOR
+			| ADPA_CRT_HOTPLUG_ENABLE
+			| ADPA_USE_VGA_HVPOLARITY
+			| ADPA_VSYNC_CNTL_ENABLE
+			| ADPA_HSYNC_CNTL_ENABLE
+			| ADPA_DPMS_ON
+			);
+
+	vga_textmode_init();
+
+	/* Enable screen memory.  */
+	vga_sr_write(1, vga_sr_read(1) & ~0x20);
+
+	/* Clear interrupts. */
+	write32(mmio + DEIIR, 0xffffffff);
+	write32(mmio + SDEIIR, 0xffffffff);
+}
+
+/* compare the header of the vga edid header */
+/* if vga is not connected it should not have a correct header */
+static u8 vga_connected(u8 *mmio)
+{
+	u8 vga_edid[128];
+	u8 header[8] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00};
+	intel_gmbus_read_edid(mmio + GMBUS0, 2, 0x50, vga_edid, 128);
+	for (int i = 0; i < 8; i++) {
+		if (vga_edid[i] != header[i]) {
+			printk(BIOS_DEBUG, "VGA not connected. Using LVDS display\n");
+			return 0;
+		}
+	}
+	printk(BIOS_SPEW, "VGA display connected\n");
+	return 1;
+}
+
 static void gma_pm_init_post_vbios(struct device *const dev)
 {
 	const struct northbridge_intel_gm45_config *const conf = dev->chip_info;
@@ -419,8 +565,11 @@ static void gma_func0_init(struct device *dev)
 			printk(BIOS_SPEW,
 			       "Initializing VGA without OPROM. MMIO 0x%llx\n",
 			       gtt_res->base);
-			intel_gma_init(conf, res2mmio(gtt_res, 0, 0), physbase,
-				       pio_res->base, lfb_res->base);
+			if (vga_connected(res2mmio(gtt_res, 0, 0)))
+				gma_init_vga(conf, res2mmio(gtt_res, 0, 0));
+			else
+				gma_init_lvds(conf, res2mmio(gtt_res, 0, 0),
+					physbase, pio_res->base, lfb_res->base);
 		}

 		/* Linux relies on VBT for panel info.  */
--
2.9.3


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:
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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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:
#!/bin/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"


code:
#!/bin/bash

#  helper script: builds memtest86+ 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

# Build MemTest86+ payload
# --------------------------------------------------------------------

printf "Building MemTest86+\n"

make -BC memtest86plus


code:
#!/bin/bash

#  helper script: builds SeaBIOS source code
#
#	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 working directory is the root
# of libreboot_src or git

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

# Build SeaBIOS
# ---------------------------------------------------------------------

printf "Building SeaBIOS\n"

cd seabios/

cp ../resources/seabios/config/config .config

# clean it first
[[ -f Makefile ]] && make clean

# build SeaBIOS
make

mv "out/bios.bin.elf" ../

printf "\n\n"

rm -f .config

make distclean

cp ../resources/seabios/config/config_vga .config

make
rm -f .config

mv out/bios.bin.elf out/bios.bin.vga.elf
mv ../bios.bin.elf out/

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

# ------------------- DONE ----------------------


code:
#!/bin/bash

#
#  helper script: generate the ROM image release archives
#
#	Copyright (C) 2015 Leah Rowe <info@minifree.org>
#	Copyright (C) 2015 Patrick "P. J." McDermott <pj@pehjota.net>
#
#    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 [ ! -d bin/ ]; then
	printf "build/release/roms: no bin/ directory exists. (you haven't built any images)\n"
	exit 1
fi

if [ -f "version" ]; then
	# _src release archive is being used
	version="$(cat version)"
	versiondate="$(cat versiondate)"
else
	# git repo is being used
	version="$(git describe --tags HEAD)"
	versiondate="$(git show -s --format=%ct)"
fi
versiondir="release/oldbuildsystem/${version}"
romdir="${versiondir}/rom"
distname="libreboot_${version}"

printf 'Building ROM image release archives for...\n'

cd "bin/"

for payload in *; do

	[ ! -d "../${romdir}/${payload}/" ] && mkdir -p "../${romdir}/${payload}/"

	cd "${payload}/"

	for board in *; do

		archivename="${distname}_${payload}_${board}"

		printf '...%s' "${payload}/${board}"

		# Delete the old archive
		rm -f "../../${romdir}/${payload}/${distname}_${board}.tar.xz"

		cp -R "${board}/" "${archivename}/"

		# this has to be done before generating
		# the "version" file
		if [ ! -f "version" ]; then
			# generate ChangeLog and NEWS files
			rm -f "ChangeLog" "NEWS"
			git log > "${archivename}/ChangeLog"
			cp "${archivename}/ChangeLog" "${archivename}/NEWS"
		else
			# building from release archive
			cp "ChangeLog" "${archivename}/"
			cp "NEWS" "${archivename}/"
		fi

        if [ -f "../../RELEASE" ]; then
            rm -f "${archivename}/ChangeLog"
            rm -f "${archivename}/NEWS"
            cp "../../RELEASE" "${archivename}/ChangeLog"
            cp "../../RELEASE" "${archivename}/NEWS"
        fi

		# Put the version string in the archive.
		printf '%s\n' "${version}" >"${archivename}/version"
		# Put the version date string in the archive
		printf '%s\n' "${versiondate}" >"${archivename}/versiondate"

		# Create the compressed archive.
		tar -c "${archivename}/" | xz -9e >"../../${romdir}/${payload}/${archivename}.tar.xz"

		rm -Rf "${archivename:?}/"

		printf ' OK\n'

	done

	cd "../"

done

cd "../"

printf 'ROM image release archives are stored in %s/\n' "${romdir}"


code:
#!/bin/bash

#
#  helper script: create sha512sum file for the current snapshot
#
#	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/>.
#

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

if [ -f "version" ]; then
	# _src release archive is being used
	version="$(cat version)"
	versiondate="$(cat versiondate)"
else
	# git repo is being used
	version="$(git describe --tags HEAD)"
	versiondate="$(git show -s --format=%ct)"
fi
versiondir="release/oldbuildsystem/${version}"
sha512filename="SHA512SUMS"
sha512filepath="${versiondir}/${sha512filename}"

if [ ! -d "${versiondir}/" ]; then

	printf "build/release/sha512sums: directory %s/ does not exist. You haven't generated any archives yet.\n" "${versiondir}"
	exit 1

fi

# delete the old file
rm -f "${sha512filepath}"

# create sha512sum file
printf "Creating list of SHA512 sums in %s...\n" "${sha512filepath}"
(cd "${versiondir}/" && for file in $(find -type f); do sha512sum "${file}" >> "${sha512filename}"; done)
printf "...done.\n"

printf "\n"