From 9cb2da45d8240de73b2a8677f9874ca947d03c11 Mon Sep 17 00:00:00 2001 From: Bill XIE Date: Fri, 2 Nov 2018 19:24:42 +0800 Subject: [PATCH] mb/lenovo/x220: Add x1 as a variant ThinkPad X1 ( https://www.thinkwiki.org/wiki/Category:X1 ) is nearly a clone of X220, with additional USB3 controller on pci-e (as i7 variant of x220), and a powered ESATA port wired to ata4 (Linux' annotation). Documentation added. Tested: - CPU i5-2520M - Slotted DIMM 8GiB - Camera - Mini pci-e on wlan slot - Msata on wwan slot - On board SDHCI connected to pci-e - USB3 controller connected to pci-e - NVRAM options for North and South bridges - S3 - TPM1 on LPC - Linux 4.9.110-3 within Debian GNU/Linux stable, loaded from SeaBIOS, or Linux payload (Heads) Not tested: - Fingerprint reader on USB2 - Onboard USB2 interfaces (wlan slot, wwan slot) Change-Id: Ibbc45f22c63b77ac95c188db825d0d7e2b03d2d1 Signed-off-by: Bill XIE Reviewed-on: https://review.coreboot.org/c/29434 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- Documentation/mainboard/index.md | 3 + Documentation/mainboard/lenovo/t4xx_series.md | 2 + .../mainboard/lenovo/thinkpad_hmm.md | 6 + Documentation/mainboard/lenovo/x1.md | 24 ++ .../mainboard/lenovo/x1_flash_ic.jpg | Bin 0 -> 55560 bytes Documentation/mainboard/lenovo/x2xx_series.md | 12 + src/mainboard/lenovo/x220/Kconfig | 22 +- src/mainboard/lenovo/x220/Kconfig.name | 3 + src/mainboard/lenovo/x220/Makefile.inc | 3 +- src/mainboard/lenovo/x220/devicetree.cb | 2 - src/mainboard/lenovo/x220/romstage.c | 17 -- .../lenovo/x220/variants/x1/data.vbt | Bin 0 -> 3985 bytes src/mainboard/lenovo/x220/variants/x1/gpio.c | 221 ++++++++++++++++++ .../lenovo/x220/variants/x1/overridetree.cb | 85 +++++++ .../lenovo/x220/variants/x1/romstage.c | 35 +++ .../lenovo/x220/{ => variants/x220}/data.vbt | Bin .../lenovo/x220/{ => variants/x220}/gpio.c | 0 .../lenovo/x220/variants/x220/overridetree.cb | 12 + .../lenovo/x220/variants/x220/romstage.c | 35 +++ 19 files changed, 458 insertions(+), 24 deletions(-) create mode 100644 Documentation/mainboard/lenovo/thinkpad_hmm.md create mode 100644 Documentation/mainboard/lenovo/x1.md create mode 100644 Documentation/mainboard/lenovo/x1_flash_ic.jpg create mode 100644 Documentation/mainboard/lenovo/x2xx_series.md create mode 100644 src/mainboard/lenovo/x220/variants/x1/data.vbt create mode 100644 src/mainboard/lenovo/x220/variants/x1/gpio.c create mode 100644 src/mainboard/lenovo/x220/variants/x1/overridetree.cb create mode 100644 src/mainboard/lenovo/x220/variants/x1/romstage.c rename src/mainboard/lenovo/x220/{ => variants/x220}/data.vbt (100%) rename src/mainboard/lenovo/x220/{ => variants/x220}/gpio.c (100%) create mode 100644 src/mainboard/lenovo/x220/variants/x220/overridetree.cb create mode 100644 src/mainboard/lenovo/x220/variants/x220/romstage.c diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index 4e2b742045..93ee828a0a 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -48,12 +48,15 @@ The boards in this section are not real mainboards, but emulators. ## Lenovo +- [Hardware Maintenance Manual of ThinkPads](lenovo/thinkpad_hmm.md) - [T4xx common](lenovo/t4xx_series.md) +- [X2xx common](lenovo/x2xx_series.md) ### Sandy Bridge series - [T420](lenovo/t420.md) - [T420 / T520 / X220 / T420s / W520 common](lenovo/xx20_series.md) +- [x1](lenovo/x1.md) ### Ivy Bridge series diff --git a/Documentation/mainboard/lenovo/t4xx_series.md b/Documentation/mainboard/lenovo/t4xx_series.md index 3ca70470a1..88b503eae1 100644 --- a/Documentation/mainboard/lenovo/t4xx_series.md +++ b/Documentation/mainboard/lenovo/t4xx_series.md @@ -3,6 +3,8 @@ A skilled engineer takes around 40 minutes to disassemble, flash and reassemble the whole device. +Read their [Hardware Maintenance Manual](thinkpad_hmm.md) for detailed steps. + ## Steps to access the flash IC * Unplug the main battery diff --git a/Documentation/mainboard/lenovo/thinkpad_hmm.md b/Documentation/mainboard/lenovo/thinkpad_hmm.md new file mode 100644 index 0000000000..2283832a91 --- /dev/null +++ b/Documentation/mainboard/lenovo/thinkpad_hmm.md @@ -0,0 +1,6 @@ +# Obtain Hardware Maintenance Manual of ThinkPads + +You are suggested obtain the "Hardware Maintenance Manual" for your corresponding +model as a guidance. Some can be found from [Hardware Specifications of ThinkWiki]. + +[Hardware Specifications of ThinkWiki]: https://www.thinkwiki.org/wiki/Hardware_Specifications diff --git a/Documentation/mainboard/lenovo/x1.md b/Documentation/mainboard/lenovo/x1.md new file mode 100644 index 0000000000..cb9248a4e4 --- /dev/null +++ b/Documentation/mainboard/lenovo/x1.md @@ -0,0 +1,24 @@ +# Lenovo X1 + +## Flashing instructions + +![x1_flash_ic](x1_flash_ic.jpg) + +You have to remove the keyboard in order to access the flash IC (the chip +inside the red circle on the picture above), as it is under the wider +cable (already detached from MB in the picture) connecting the keyboard +to the mainboard. + +The flash IC can be a SOIC-8 one or a WSON-8 one, and may be covered with +a piece of insulation tape. + +For more details have a look at [T420 / T520 / X220 / T420s / W520 common] and + +```eval_rst +:doc:`../../flash_tutorial/ext_power` +``` + +Steps to access the flash IC are described here [X2xx series]. + +[X2xx series]: x2xx_series.md +[T420 / T520 / X220 / T420s / W520 common]: xx20_series.md diff --git a/Documentation/mainboard/lenovo/x1_flash_ic.jpg b/Documentation/mainboard/lenovo/x1_flash_ic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d0b9f72764fcdd55e151b2790901f97588096a3 GIT binary patch literal 55560 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
} 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 NM~D*PF@#(h|JmW_(}Ms2 literal 0 HcmV?d00001 diff --git a/Documentation/mainboard/lenovo/x2xx_series.md b/Documentation/mainboard/lenovo/x2xx_series.md new file mode 100644 index 0000000000..424fc37ec4 --- /dev/null +++ b/Documentation/mainboard/lenovo/x2xx_series.md @@ -0,0 +1,12 @@ +# Lenovo x2xx series disassembly instructions + +Removing the keyboard and palmrest would allow you to access the flash chip. + +Read their [Hardware Maintenance Manual](thinkpad_hmm.md) for detailed steps. + +## Steps to access the flash IC + +* Unplug the main battery +* Remove the keyboard +* Remove the palmrest + diff --git a/src/mainboard/lenovo/x220/Kconfig b/src/mainboard/lenovo/x220/Kconfig index 0f7cbe7bee..f8f7055de8 100644 --- a/src/mainboard/lenovo/x220/Kconfig +++ b/src/mainboard/lenovo/x220/Kconfig @@ -1,4 +1,4 @@ -if BOARD_LENOVO_X220 || BOARD_LENOVO_X220I +if BOARD_LENOVO_X220 || BOARD_LENOVO_X220I || BOARD_LENOVO_X1 config BOARD_SPECIFIC_OPTIONS def_bool y @@ -29,9 +29,21 @@ config MAINBOARD_DIR string default lenovo/x220 +config VARIANT_DIR + string + default "x220" if BOARD_LENOVO_X220 || BOARD_LENOVO_X220I + default "x1" if BOARD_LENOVO_X1 + + config MAINBOARD_PART_NUMBER string - default "ThinkPad X220" + default "ThinkPad X220" if BOARD_LENOVO_X220 + default "ThinkPad X220i" if BOARD_LENOVO_X220I + default "ThinkPad X1" if BOARD_LENOVO_X1 + +config OVERRIDE_DEVICETREE + string + default "variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" config MAX_CPUS int @@ -48,6 +60,7 @@ config DRAM_RESET_GATE_GPIO config VGA_BIOS_FILE string default "pci8086,0116.rom" if BOARD_LENOVO_X220I + # FIXME: x1 with i3 cpu may also use "pci8086,0116.rom" default "pci8086,0126.rom" config VGA_BIOS_ID @@ -61,6 +74,7 @@ config MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID config MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID hex - default 0x21db + default 0x21db if BOARD_LENOVO_X220 || BOARD_LENOVO_X220I + default 0x21e8 if BOARD_LENOVO_X1 -endif # BOARD_LENOVO_X220 || BOARD_LENOVO_X220I +endif # BOARD_LENOVO_X220 || BOARD_LENOVO_X220I || BOARD_LENOVO_X1 diff --git a/src/mainboard/lenovo/x220/Kconfig.name b/src/mainboard/lenovo/x220/Kconfig.name index 0f9d3fcfb7..988ac4fb55 100644 --- a/src/mainboard/lenovo/x220/Kconfig.name +++ b/src/mainboard/lenovo/x220/Kconfig.name @@ -3,3 +3,6 @@ config BOARD_LENOVO_X220 config BOARD_LENOVO_X220I bool "ThinkPad X220i" + +config BOARD_LENOVO_X1 + bool "ThinkPad X1" diff --git a/src/mainboard/lenovo/x220/Makefile.inc b/src/mainboard/lenovo/x220/Makefile.inc index 2dab9507f1..2c52c21d33 100644 --- a/src/mainboard/lenovo/x220/Makefile.inc +++ b/src/mainboard/lenovo/x220/Makefile.inc @@ -14,6 +14,7 @@ ## smm-$(CONFIG_HAVE_SMI_HANDLER) += smihandler.c -romstage-y += gpio.c +romstage-y += variants/$(VARIANT_DIR)/gpio.c +romstage-y += variants/$(VARIANT_DIR)/romstage.c ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads diff --git a/src/mainboard/lenovo/x220/devicetree.cb b/src/mainboard/lenovo/x220/devicetree.cb index 969ae3857b..2a1507cd9a 100644 --- a/src/mainboard/lenovo/x220/devicetree.cb +++ b/src/mainboard/lenovo/x220/devicetree.cb @@ -159,8 +159,6 @@ chip northbridge/intel/sandybridge register "event7_enable" = "0x81" register "event8_enable" = "0x7b" register "event9_enable" = "0xff" - register "eventa_enable" = "0x01" - register "eventb_enable" = "0xf0" register "eventc_enable" = "0xff" register "eventd_enable" = "0xff" register "evente_enable" = "0x0d" diff --git a/src/mainboard/lenovo/x220/romstage.c b/src/mainboard/lenovo/x220/romstage.c index 3429aad6b6..62b887e688 100644 --- a/src/mainboard/lenovo/x220/romstage.c +++ b/src/mainboard/lenovo/x220/romstage.c @@ -98,23 +98,6 @@ void mainboard_fill_pei_data(struct pei_data *pei_data) *pei_data = pei_data_template; } -const struct southbridge_usb_port mainboard_usb_ports[] = { - { 1, 0, 0 }, - { 1, 1, 1 }, - { 1, 1, 3 }, - { 1, 1, 3 }, - { 1, 1, -1 }, - { 1, 1, -1 }, - { 1, 0, 2 }, - { 1, 0, 2 }, - { 1, 1, 6 }, - { 1, 1, 5 }, - { 1, 1, 6 }, - { 1, 1, 6 }, - { 1, 1, 7 }, - { 1, 1, 6 }, -}; - void mainboard_get_spd(spd_raw_data *spd, bool id_only) { read_spd (&spd[0], 0x50, id_only); diff --git a/src/mainboard/lenovo/x220/variants/x1/data.vbt b/src/mainboard/lenovo/x220/variants/x1/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..63350f1ec5ad2954dac39600621a6e68c9c5a60d GIT binary patch literal 3985 zcmdT`eQXp}5TCu>z1@4e+g`UI*CNeO6t399_JCSz3486e^q{oY51K+Ww0NhI6sQFh z5)&3|0z^ZOXb2jj=O0GHABu^I8WXJ_(Has%FflP9rY6Ry|A_G`;>S5}cdsQD$|Y#j zx%_tKX5ahmy!U2i_m+W{e(Z~PCAPHmCKK!1>NX*!!GaT|chYsXv?ROxwk6{I@og=g z-K`t(S-1&?OaJ%=AT0={5wjZaNbcI38Hx7R^bPMyAJ{&&BYj^6H|^fOVs)H764n|;<@F?N9qQV8mgf9p`5meQL zMJj`3gnGiAgbqS4;V#0xg#CoWgvSUc2|2(d5{MK1#6<H*8PM$0`<)e9^4 zPxVwTwFgfXJRR$7Yx~)lZBG16Q-x)5^%rzQYr(s4jAJW(%4WHM{*ERO8 zhF@#uuNsqeyiGUP>TJD^J9YD*&W`E$l5W1OvvWFrr<)>u(iphPFxw2)ZQwq`JYujD z2EJ;T9~$gq1Aj40t%S`lF_vGFoWPXelu?S&L8@aqyr$I(I_dLDtq>+1EL}#gfKNhB z7N-`4)uC!{QB`#Iem)>o&Gi{_rASqEGe(_x(+mOHFA{w~2GL`%+!)>qT?QTl*E|N% zjiG7bz-S6g3vmtH`W)3|1GI(< z;I>k|IELBf#uJbCrGUE_+Koa;32T|9862db?0tbY~}+R3cjS}Bxb z_Tk|b+1yZNm2IKlSSTN)Y{*@OqZG4>XtR?WJ-dV$mh)Kv#2{zg7oMJz$NhYmYZXt` z#v&NL zsf1h#7g)O0%4fOzAZFb!1Km*?-F%q4HUmvg + +static const struct pch_gpio_set1 pch_gpio_set1_mode = { + .gpio0 = GPIO_MODE_GPIO, + .gpio1 = GPIO_MODE_GPIO, + .gpio2 = GPIO_MODE_GPIO, + .gpio3 = GPIO_MODE_GPIO, + .gpio4 = GPIO_MODE_GPIO, + .gpio5 = GPIO_MODE_GPIO, + .gpio6 = GPIO_MODE_GPIO, + .gpio7 = GPIO_MODE_GPIO, + .gpio8 = GPIO_MODE_GPIO, + .gpio9 = GPIO_MODE_NATIVE, + .gpio10 = GPIO_MODE_GPIO, + .gpio11 = GPIO_MODE_NATIVE, + .gpio12 = GPIO_MODE_NATIVE, + .gpio13 = GPIO_MODE_GPIO, + .gpio14 = GPIO_MODE_NATIVE, + .gpio15 = GPIO_MODE_GPIO, + .gpio16 = GPIO_MODE_NATIVE, + .gpio17 = GPIO_MODE_GPIO, + .gpio18 = GPIO_MODE_NATIVE, + .gpio19 = GPIO_MODE_NATIVE, + .gpio20 = GPIO_MODE_NATIVE, + .gpio21 = GPIO_MODE_GPIO, + .gpio22 = GPIO_MODE_GPIO, + .gpio23 = GPIO_MODE_NATIVE, + .gpio24 = GPIO_MODE_GPIO, + .gpio25 = GPIO_MODE_GPIO, + .gpio26 = GPIO_MODE_NATIVE, + .gpio27 = GPIO_MODE_GPIO, + .gpio28 = GPIO_MODE_GPIO, + .gpio29 = GPIO_MODE_GPIO, + .gpio30 = GPIO_MODE_NATIVE, + .gpio31 = GPIO_MODE_GPIO, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_direction = { + .gpio0 = GPIO_DIR_INPUT, + .gpio1 = GPIO_DIR_INPUT, + .gpio2 = GPIO_DIR_INPUT, + .gpio3 = GPIO_DIR_INPUT, + .gpio4 = GPIO_DIR_INPUT, + .gpio5 = GPIO_DIR_INPUT, + .gpio6 = GPIO_DIR_INPUT, + .gpio7 = GPIO_DIR_INPUT, + .gpio8 = GPIO_DIR_OUTPUT, + .gpio10 = GPIO_DIR_OUTPUT, + .gpio13 = GPIO_DIR_INPUT, + .gpio15 = GPIO_DIR_OUTPUT, + .gpio17 = GPIO_DIR_INPUT, + .gpio21 = GPIO_DIR_INPUT, + .gpio22 = GPIO_DIR_OUTPUT, + .gpio24 = GPIO_DIR_OUTPUT, + .gpio25 = GPIO_DIR_INPUT, + .gpio27 = GPIO_DIR_INPUT, + .gpio28 = GPIO_DIR_OUTPUT, + .gpio29 = GPIO_DIR_OUTPUT, + .gpio31 = GPIO_DIR_INPUT, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_level = { + .gpio8 = GPIO_LEVEL_HIGH, + .gpio10 = GPIO_LEVEL_HIGH, + .gpio15 = GPIO_LEVEL_LOW, + .gpio22 = GPIO_LEVEL_HIGH, + .gpio24 = GPIO_LEVEL_LOW, + .gpio28 = GPIO_LEVEL_LOW, + .gpio29 = GPIO_LEVEL_HIGH, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_reset = { + .gpio24 = GPIO_RESET_RSMRST, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_invert = { + .gpio0 = GPIO_INVERT, + .gpio1 = GPIO_INVERT, + .gpio6 = GPIO_INVERT, + .gpio7 = GPIO_INVERT, + .gpio13 = GPIO_INVERT, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_blink = { +}; + +static const struct pch_gpio_set2 pch_gpio_set2_mode = { + .gpio32 = GPIO_MODE_NATIVE, + .gpio33 = GPIO_MODE_GPIO, + .gpio34 = GPIO_MODE_GPIO, + .gpio35 = GPIO_MODE_GPIO, + .gpio36 = GPIO_MODE_GPIO, + .gpio37 = GPIO_MODE_NATIVE, + .gpio38 = GPIO_MODE_GPIO, + .gpio39 = GPIO_MODE_GPIO, + .gpio40 = GPIO_MODE_NATIVE, + .gpio41 = GPIO_MODE_NATIVE, + .gpio42 = GPIO_MODE_GPIO, + .gpio43 = GPIO_MODE_NATIVE, + .gpio44 = GPIO_MODE_NATIVE, + .gpio45 = GPIO_MODE_NATIVE, + .gpio46 = GPIO_MODE_NATIVE, + .gpio47 = GPIO_MODE_NATIVE, + .gpio48 = GPIO_MODE_GPIO, + .gpio49 = GPIO_MODE_GPIO, + .gpio50 = GPIO_MODE_GPIO, + .gpio51 = GPIO_MODE_GPIO, + .gpio52 = GPIO_MODE_GPIO, + .gpio53 = GPIO_MODE_GPIO, + .gpio54 = GPIO_MODE_GPIO, + .gpio55 = GPIO_MODE_GPIO, + .gpio56 = GPIO_MODE_NATIVE, + .gpio57 = GPIO_MODE_GPIO, + .gpio58 = GPIO_MODE_NATIVE, + .gpio59 = GPIO_MODE_NATIVE, + .gpio60 = GPIO_MODE_NATIVE, + .gpio61 = GPIO_MODE_NATIVE, + .gpio62 = GPIO_MODE_NATIVE, + .gpio63 = GPIO_MODE_NATIVE, +}; + +static const struct pch_gpio_set2 pch_gpio_set2_direction = { + .gpio33 = GPIO_DIR_OUTPUT, + .gpio34 = GPIO_DIR_INPUT, + .gpio35 = GPIO_DIR_OUTPUT, + .gpio36 = GPIO_DIR_INPUT, + .gpio38 = GPIO_DIR_INPUT, + .gpio39 = GPIO_DIR_INPUT, + .gpio42 = GPIO_DIR_OUTPUT, + .gpio48 = GPIO_DIR_INPUT, + .gpio49 = GPIO_DIR_INPUT, + .gpio50 = GPIO_DIR_INPUT, + .gpio51 = GPIO_DIR_OUTPUT, + .gpio52 = GPIO_DIR_OUTPUT, + .gpio53 = GPIO_DIR_OUTPUT, + .gpio54 = GPIO_DIR_INPUT, + .gpio55 = GPIO_DIR_OUTPUT, + .gpio57 = GPIO_DIR_INPUT, +}; + +static const struct pch_gpio_set2 pch_gpio_set2_level = { + .gpio33 = GPIO_LEVEL_HIGH, + .gpio35 = GPIO_LEVEL_LOW, + .gpio42 = GPIO_LEVEL_HIGH, + .gpio51 = GPIO_LEVEL_HIGH, + .gpio52 = GPIO_LEVEL_HIGH, + .gpio53 = GPIO_LEVEL_HIGH, + .gpio55 = GPIO_LEVEL_HIGH, +}; + +static const struct pch_gpio_set2 pch_gpio_set2_reset = { +}; + +static const struct pch_gpio_set3 pch_gpio_set3_mode = { + .gpio64 = GPIO_MODE_NATIVE, + .gpio65 = GPIO_MODE_NATIVE, + .gpio66 = GPIO_MODE_NATIVE, + .gpio67 = GPIO_MODE_NATIVE, + .gpio68 = GPIO_MODE_GPIO, + .gpio69 = GPIO_MODE_GPIO, + .gpio70 = GPIO_MODE_GPIO, + .gpio71 = GPIO_MODE_GPIO, + .gpio72 = GPIO_MODE_NATIVE, + .gpio73 = GPIO_MODE_NATIVE, + .gpio74 = GPIO_MODE_NATIVE, + .gpio75 = GPIO_MODE_NATIVE, +}; + +static const struct pch_gpio_set3 pch_gpio_set3_direction = { + .gpio68 = GPIO_DIR_INPUT, + .gpio69 = GPIO_DIR_INPUT, + .gpio70 = GPIO_DIR_INPUT, + .gpio71 = GPIO_DIR_INPUT, +}; + +static const struct pch_gpio_set3 pch_gpio_set3_level = { +}; + +static const struct pch_gpio_set3 pch_gpio_set3_reset = { +}; + +const struct pch_gpio_map mainboard_gpio_map = { + .set1 = { + .mode = &pch_gpio_set1_mode, + .direction = &pch_gpio_set1_direction, + .level = &pch_gpio_set1_level, + .blink = &pch_gpio_set1_blink, + .invert = &pch_gpio_set1_invert, + .reset = &pch_gpio_set1_reset, + }, + .set2 = { + .mode = &pch_gpio_set2_mode, + .direction = &pch_gpio_set2_direction, + .level = &pch_gpio_set2_level, + .reset = &pch_gpio_set2_reset, + }, + .set3 = { + .mode = &pch_gpio_set3_mode, + .direction = &pch_gpio_set3_direction, + .level = &pch_gpio_set3_level, + .reset = &pch_gpio_set3_reset, + }, +}; diff --git a/src/mainboard/lenovo/x220/variants/x1/overridetree.cb b/src/mainboard/lenovo/x220/variants/x1/overridetree.cb new file mode 100644 index 0000000000..54f6485d25 --- /dev/null +++ b/src/mainboard/lenovo/x220/variants/x1/overridetree.cb @@ -0,0 +1,85 @@ +chip northbridge/intel/sandybridge + + register "gpu_dp_b_hotplug" = "0x04" + register "gpu_dp_c_hotplug" = "0x04" + register "gpu_dp_d_hotplug" = "0x04" + register "gpu_panel_power_cycle_delay" = "3" + register "gpu_panel_power_up_delay" = "250" # T1+T2: 25ms + register "gpu_panel_power_down_delay" = "250" # T5+T6: 35ms + register "gpu_panel_power_backlight_on_delay" = "2500" # T3: 250ms + register "gpu_panel_power_backlight_off_delay" = "2500" # T4: 250ms + + register "gpu_cpu_backlight" = "0x1312" + register "gpu_pch_backlight" = "0x13121312" + + device domain 0 on + device pci 00.0 on + subsystemid 0x17aa 0x21e8 + end # host bridge + device pci 02.0 on + subsystemid 0x17aa 0x21e8 + end # vga controller + + chip southbridge/intel/bd82x6x # Intel Series 6 Cougar Point PCH + # Enable SATA ports 0 (HDD bay) & 2 (msata) & 3 (esatap) + register "sata_port_map" = "0x1d" + # X1 does not have ExpressCard slot + register "pcie_hotplug_map" = "{ 0, 0, 0, 0, 0, 0, 0, 0 }" + + device pci 1a.0 on + subsystemid 0x17aa 0x21e8 + end # USB2 EHCI #2 + device pci 1b.0 on + subsystemid 0x17aa 0x21e8 + end # High Definition Audio + device pci 1c.0 off end # PCIe Port #1 + device pci 1c.1 on + subsystemid 0x17aa 0x21e8 + end # PCIe Port #2 (wlan) + device pci 1c.2 off end # PCIe Port #3 + device pci 1c.3 off end # PCIe Port #4 + device pci 1c.4 on + subsystemid 0x17aa 0x21e8 + chip drivers/ricoh/rce822 # Ricoh cardreader + device pci 00.0 on + subsystemid 0x17aa 0x21e8 + end + end + end # PCIe Port #5 (SD) + device pci 1c.5 off end # PCIe Port #6 + device pci 1c.6 on + subsystemid 0x17aa 0x21e8 + end # PCIe Port #7 + device pci 1c.7 off end # PCIe Port #8 + device pci 1d.0 on + subsystemid 0x17aa 0x21e8 + end # USB2 EHCI #1 + device pci 1e.0 off end # PCI bridge + device pci 1f.0 on #LPC bridge + subsystemid 0x17aa 0x21e8 + chip ec/lenovo/h8 + register "config2" = "0xe0" + register "config3" = "0xc0" + + register "beepmask0" = "0xfe" + register "beepmask1" = "0x96" + + register "event5_enable" = "0x3c" + register "evente_enable" = "0x3d" + + # BDC detection is broken on this board: + register "has_bdc_detection" = "0" + end + end # LPC bridge + device pci 1f.2 on + subsystemid 0x17aa 0x21e8 + end # SATA Controller 1 + device pci 1f.3 on + subsystemid 0x17aa 0x21e8 + end # SMBus + device pci 1f.6 on + subsystemid 0x17aa 0x21e8 + end # Thermal + end + end +end diff --git a/src/mainboard/lenovo/x220/variants/x1/romstage.c b/src/mainboard/lenovo/x220/variants/x1/romstage.c new file mode 100644 index 0000000000..a1932cc8e2 --- /dev/null +++ b/src/mainboard/lenovo/x220/variants/x1/romstage.c @@ -0,0 +1,35 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2010 coresystems GmbH + * Copyright (C) 2011 The ChromiumOS Authors. All rights reserved. + * Copyright (C) 2014 Vladimir Serbinenko + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include + +const struct southbridge_usb_port mainboard_usb_ports[] = { + { 1, 1, 0 }, + { 1, 1, 1 }, + { 1, 1, 3 }, + { 1, 0, 3 }, + { 1, 0, 3 }, + { 1, 1, 3 }, + { 0, 0, 3 }, + { 0, 0, 3 }, + { 1, 1, 4 }, + { 1, 1, 5 }, + { 1, 0, 7 }, + { 1, 1, 7 }, + { 1, 1, 7 }, + { 1, 0, 7 }, +}; diff --git a/src/mainboard/lenovo/x220/data.vbt b/src/mainboard/lenovo/x220/variants/x220/data.vbt similarity index 100% rename from src/mainboard/lenovo/x220/data.vbt rename to src/mainboard/lenovo/x220/variants/x220/data.vbt diff --git a/src/mainboard/lenovo/x220/gpio.c b/src/mainboard/lenovo/x220/variants/x220/gpio.c similarity index 100% rename from src/mainboard/lenovo/x220/gpio.c rename to src/mainboard/lenovo/x220/variants/x220/gpio.c diff --git a/src/mainboard/lenovo/x220/variants/x220/overridetree.cb b/src/mainboard/lenovo/x220/variants/x220/overridetree.cb new file mode 100644 index 0000000000..604eadf2a9 --- /dev/null +++ b/src/mainboard/lenovo/x220/variants/x220/overridetree.cb @@ -0,0 +1,12 @@ +chip northbridge/intel/sandybridge + device domain 0 on + chip southbridge/intel/bd82x6x # Intel Series 6 Cougar Point PCH + device pci 1f.0 on #LPC bridge + chip ec/lenovo/h8 + register "eventa_enable" = "0x01" + register "eventb_enable" = "0xf0" + end + end # LPC bridge + end + end +end diff --git a/src/mainboard/lenovo/x220/variants/x220/romstage.c b/src/mainboard/lenovo/x220/variants/x220/romstage.c new file mode 100644 index 0000000000..88a93961df --- /dev/null +++ b/src/mainboard/lenovo/x220/variants/x220/romstage.c @@ -0,0 +1,35 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2010 coresystems GmbH + * Copyright (C) 2011 The ChromiumOS Authors. All rights reserved. + * Copyright (C) 2014 Vladimir Serbinenko + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include + +const struct southbridge_usb_port mainboard_usb_ports[] = { + { 1, 0, 0 }, + { 1, 1, 1 }, + { 1, 1, 3 }, + { 1, 1, 3 }, + { 1, 1, -1 }, + { 1, 1, -1 }, + { 1, 0, 2 }, + { 1, 0, 2 }, + { 1, 1, 6 }, + { 1, 1, 5 }, + { 1, 1, 6 }, + { 1, 1, 6 }, + { 1, 1, 7 }, + { 1, 1, 6 }, +};