From b165c4a46f003b396a2bbad9f9077f5d498ecbbf Mon Sep 17 00:00:00 2001 From: Nicolas Reinecke Date: Sat, 4 Jul 2015 23:37:06 +0200 Subject: [PATCH] mainboard/lenovo/t410: Add new port The port is based on the x201 / t410s. 2537-vg5 / i5, no discrete gpu Tested and working: * Native raminit * Native gfxinit * Booting Seabios 1.12.1 * Booting from EHCI * Running GNU/Linux 5.0.0 * No errors in dmesg * EHCI debug on the devices left side, bottom-right * Keyboard * Fn keys (Mute, Volume, Mic) * Touchpad * TPM * Wifi * Sound * USB * Ethernet * S3 resume * VBOOT Testing in progress. Untested: * VGA * Displayport * Docking station Bugs: * AC adapter can't be read from ACPI * TPM not working with VBOOT and C_ENV BB Details for flashing externally: 1. Disconnect all power 2. Connect the external flasher 3. Connect the power cord (This fixes internal power control) 4. Remove the power cord Change-Id: Id9d872e643dd242e925bfb46d18076e6ad100995 Signed-off-by: Nicolas Reinecke Signed-off-by: Patrick Rudolph Reviewed-on: https://review.coreboot.org/c/coreboot/+/11791 Tested-by: build bot (Jenkins) Reviewed-by: Arthur Heymans --- Documentation/mainboard/index.md | 8 + Documentation/mainboard/lenovo/t410.md | 44 ++++ .../mainboard/lenovo/t410_chip_location.jpg | Bin 0 -> 57410 bytes src/mainboard/lenovo/t410/Kconfig | 69 +++++ src/mainboard/lenovo/t410/Kconfig.name | 2 + src/mainboard/lenovo/t410/Makefile.inc | 24 ++ src/mainboard/lenovo/t410/acpi/dock.asl | 72 ++++++ src/mainboard/lenovo/t410/acpi/ec.asl | 20 ++ src/mainboard/lenovo/t410/acpi/gpe.asl | 26 ++ src/mainboard/lenovo/t410/acpi/platform.asl | 52 ++++ src/mainboard/lenovo/t410/acpi/superio.asl | 1 + src/mainboard/lenovo/t410/acpi_tables.c | 28 +++ src/mainboard/lenovo/t410/board_info.txt | 5 + src/mainboard/lenovo/t410/cmos.default | 17 ++ src/mainboard/lenovo/t410/cmos.layout | 130 ++++++++++ src/mainboard/lenovo/t410/data.vbt | Bin 0 -> 3982 bytes src/mainboard/lenovo/t410/devicetree.cb | 198 +++++++++++++++ src/mainboard/lenovo/t410/dock.c | 57 +++++ src/mainboard/lenovo/t410/dock.h | 22 ++ src/mainboard/lenovo/t410/dsdt.asl | 95 +++++++ src/mainboard/lenovo/t410/early_init.c | 25 ++ src/mainboard/lenovo/t410/gma-mainboard.ads | 30 +++ src/mainboard/lenovo/t410/gpio.c | 235 ++++++++++++++++++ src/mainboard/lenovo/t410/hda_verb.c | 49 ++++ src/mainboard/lenovo/t410/mainboard.c | 32 +++ src/mainboard/lenovo/t410/romstage.c | 75 ++++++ src/mainboard/lenovo/t410/smihandler.c | 110 ++++++++ src/mainboard/lenovo/t410/thermal.h | 26 ++ src/mainboard/lenovo/t410/vboot-rwa.fmd | 31 +++ 29 files changed, 1483 insertions(+) create mode 100644 Documentation/mainboard/lenovo/t410.md create mode 100644 Documentation/mainboard/lenovo/t410_chip_location.jpg create mode 100644 src/mainboard/lenovo/t410/Kconfig create mode 100644 src/mainboard/lenovo/t410/Kconfig.name create mode 100644 src/mainboard/lenovo/t410/Makefile.inc create mode 100644 src/mainboard/lenovo/t410/acpi/dock.asl create mode 100644 src/mainboard/lenovo/t410/acpi/ec.asl create mode 100644 src/mainboard/lenovo/t410/acpi/gpe.asl create mode 100644 src/mainboard/lenovo/t410/acpi/platform.asl create mode 100644 src/mainboard/lenovo/t410/acpi/superio.asl create mode 100644 src/mainboard/lenovo/t410/acpi_tables.c create mode 100644 src/mainboard/lenovo/t410/board_info.txt create mode 100644 src/mainboard/lenovo/t410/cmos.default create mode 100644 src/mainboard/lenovo/t410/cmos.layout create mode 100644 src/mainboard/lenovo/t410/data.vbt create mode 100644 src/mainboard/lenovo/t410/devicetree.cb create mode 100644 src/mainboard/lenovo/t410/dock.c create mode 100644 src/mainboard/lenovo/t410/dock.h create mode 100644 src/mainboard/lenovo/t410/dsdt.asl create mode 100644 src/mainboard/lenovo/t410/early_init.c create mode 100644 src/mainboard/lenovo/t410/gma-mainboard.ads create mode 100644 src/mainboard/lenovo/t410/gpio.c create mode 100644 src/mainboard/lenovo/t410/hda_verb.c create mode 100644 src/mainboard/lenovo/t410/mainboard.c create mode 100644 src/mainboard/lenovo/t410/romstage.c create mode 100644 src/mainboard/lenovo/t410/smihandler.c create mode 100644 src/mainboard/lenovo/t410/thermal.h create mode 100644 src/mainboard/lenovo/t410/vboot-rwa.fmd diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index 8318975747..c9204f6df7 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -68,6 +68,10 @@ The boards in this section are not real mainboards, but emulators. - [T4xx common](lenovo/t4xx_series.md) - [X2xx common](lenovo/x2xx_series.md) +### Nehalem series + +- [T410](lenovo/t410.md) + ### Sandy Bridge series - [T420](lenovo/t420.md) @@ -82,6 +86,10 @@ The boards in this section are not real mainboards, but emulators. - [T430 / T530 / X230 / W530 common](lenovo/xx30_series.md) - [T431s](lenovo/t431s.md) +## Portwell + +- [PQ7-M107](portwell/pq7-m107.md) + ## MSI - [MS-7707](msi/ms7707/ms7707.md) diff --git a/Documentation/mainboard/lenovo/t410.md b/Documentation/mainboard/lenovo/t410.md new file mode 100644 index 0000000000..980c9590a9 --- /dev/null +++ b/Documentation/mainboard/lenovo/t410.md @@ -0,0 +1,44 @@ +# Lenovo T410 + +## Known issues +* Dock has wrong ACPI ID (causes "AC adapter state cannot be read" in Linux) +* TPM not working with VBOOT and C_ENV bootblock (works without C_ENV BB) + +## Flashing instructions +```eval_rst ++---------------------+--------------------------------+ +| Type | Value | ++=====================+================================+ +| Socketed flash | no | ++---------------------+--------------------------------+ +| Size | 8 MiB | ++---------------------+--------------------------------+ +| In circuit flashing | Only in S3/WoL | ++---------------------+--------------------------------+ +| Package | SOIC-8 | ++---------------------+--------------------------------+ +| Write protection | No | ++---------------------+--------------------------------+ +| Dual BIOS feature | No | ++---------------------+--------------------------------+ +| Internal flashing | Yes | ++---------------------+--------------------------------+ +``` + +The flash IC is located at the bottom center of the mainboard. Sadly, +access to the IC is blocked by the magnesum frame, so you need to disassemble +the entire laptop and remove the mainboard. + +Below is a picture of IC on the mainboard, with the pinouts labeled. + +![t410_chip_location](t410_chip_location.jpg) + +The chip will either be a Macronix MX25L6405D or a Winbond W25Q64CVSIG. +Do not rely on dots painted in the corner of the chip (such as the blue dot +pictured) to orient the pins! + +[Flashing tutorial](../../flash_tutorial/no_ext_power.md) + +Steps to access the flash IC are described here [T4xx series]. + +[T4xx series]: t4xx_series.md diff --git a/Documentation/mainboard/lenovo/t410_chip_location.jpg b/Documentation/mainboard/lenovo/t410_chip_location.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96bbbcbbe94f1aa09c9e363b8e00664b6ae32a9e GIT binary patch literal 57410 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 QR|h + * + * 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. + */ + +Scope (\_SB) +{ + Device(DOCK) + { + Name(_HID, "ACPI0003") + Name(_UID, 0x00) + Name(_PCL, Package() { \_SB } ) + + Method(_DCK, 1, NotSerialized) + { + if (Arg0) { + /* connect dock */ + Store (1, \GP28) + Store (1, \_SB.PCI0.LPCB.EC.DKR1) + Store (1, \_SB.PCI0.LPCB.EC.DKR2) + Store (1, \_SB.PCI0.LPCB.EC.DKR3) + } else { + /* disconnect dock */ + Store (0, \GP28) + Store (0, \_SB.PCI0.LPCB.EC.DKR1) + Store (0, \_SB.PCI0.LPCB.EC.DKR2) + Store (0, \_SB.PCI0.LPCB.EC.DKR3) + } + Xor(Arg0, \_SB.PCI0.LPCB.EC.DKR1, Local0) + Return (Local0) + } + + Method(_STA, 0, NotSerialized) + { + Return (\_SB.PCI0.LPCB.EC.DKR1) + } + } +} + +Scope(\_SB.PCI0.LPCB.EC) +{ + Method(_Q18, 0, NotSerialized) + { + Notify(\_SB.DOCK, 3) + } + + Method(_Q45, 0, NotSerialized) + { + Notify(\_SB.DOCK, 3) + } + + Method(_Q58, 0, NotSerialized) + { + Notify(\_SB.DOCK, 0) + } + + Method(_Q37, 0, NotSerialized) + { + Notify(\_SB.DOCK, 0) + } +} diff --git a/src/mainboard/lenovo/t410/acpi/ec.asl b/src/mainboard/lenovo/t410/acpi/ec.asl new file mode 100644 index 0000000000..c00121bab5 --- /dev/null +++ b/src/mainboard/lenovo/t410/acpi/ec.asl @@ -0,0 +1,20 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (c) 2011 Sven Schnelle + * + * 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 + +#define H8_BAT_THRESHOLDS_BIT7 +#include diff --git a/src/mainboard/lenovo/t410/acpi/gpe.asl b/src/mainboard/lenovo/t410/acpi/gpe.asl new file mode 100644 index 0000000000..5c900ca3a9 --- /dev/null +++ b/src/mainboard/lenovo/t410/acpi/gpe.asl @@ -0,0 +1,26 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (c) 2011 Sven Schnelle + * + * 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. + */ + +Scope (\_GPE) +{ + Method(_L18, 0, NotSerialized) + { + /* Read EC register to clear wake status */ + Store(\_SB.PCI0.LPCB.EC.WAKE, Local0) + /* So that we don't get a warning that Local0 is unused. */ + Increment (Local0) + } +} diff --git a/src/mainboard/lenovo/t410/acpi/platform.asl b/src/mainboard/lenovo/t410/acpi/platform.asl new file mode 100644 index 0000000000..c2cb94c242 --- /dev/null +++ b/src/mainboard/lenovo/t410/acpi/platform.asl @@ -0,0 +1,52 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2009 coresystems GmbH + * + * 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. + */ + +/* The _PTS method (Prepare To Sleep) is called before the OS is + * entering a sleep state. The sleep state number is passed in Arg0 + */ + +Method(_PTS,1) +{ + \_SB.PCI0.LPCB.EC.MUTE(1) + \_SB.PCI0.LPCB.EC.USBP(0) + \_SB.PCI0.LPCB.EC.RADI(0) +} + +/* The _WAK method is called on system wakeup */ + +Method(_WAK,1) +{ + /* Wake the HKEY to init BT/WWAN */ + \_SB.PCI0.LPCB.EC.HKEY.WAKE (Arg0) + + /* Not implemented. */ + Return(Package(){0,0}) +} + +Method(UCMS, 1, Serialized) +{ + Switch(ToInteger(Arg0)) + { + Case (0x0c) /* Turn on ThinkLight */ + { + \_SB.PCI0.LPCB.EC.LGHT(1) + } + Case (0x0d) /* Turn off ThinkLight */ + { + \_SB.PCI0.LPCB.EC.LGHT(0) + } + } +} diff --git a/src/mainboard/lenovo/t410/acpi/superio.asl b/src/mainboard/lenovo/t410/acpi/superio.asl new file mode 100644 index 0000000000..f2b35ba9c1 --- /dev/null +++ b/src/mainboard/lenovo/t410/acpi/superio.asl @@ -0,0 +1 @@ +#include diff --git a/src/mainboard/lenovo/t410/acpi_tables.c b/src/mainboard/lenovo/t410/acpi_tables.c new file mode 100644 index 0000000000..2a8d9350e9 --- /dev/null +++ b/src/mainboard/lenovo/t410/acpi_tables.c @@ -0,0 +1,28 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2009 coresystems GmbH + * Copyright (C) 2013 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 +#include "thermal.h" + +void acpi_create_gnvs(global_nvs_t *gnvs) +{ + gnvs->tcrt = CRITICAL_TEMPERATURE; + gnvs->tpsv = PASSIVE_TEMPERATURE; + + /* the lid is open by default. */ + gnvs->lids = 1; +} diff --git a/src/mainboard/lenovo/t410/board_info.txt b/src/mainboard/lenovo/t410/board_info.txt new file mode 100644 index 0000000000..2d10440511 --- /dev/null +++ b/src/mainboard/lenovo/t410/board_info.txt @@ -0,0 +1,5 @@ +Category: laptop +ROM package: SOIC-8 / WSON-8 +ROM protocol: SPI +ROM socketed: n +Flashrom support: n diff --git a/src/mainboard/lenovo/t410/cmos.default b/src/mainboard/lenovo/t410/cmos.default new file mode 100644 index 0000000000..5fbc86f742 --- /dev/null +++ b/src/mainboard/lenovo/t410/cmos.default @@ -0,0 +1,17 @@ +boot_option=Fallback +debug_level=Debug +power_on_after_fail=Disable +nmi=Enable +first_battery=Primary +bluetooth=Enable +wwan=Enable +wlan=Enable +touchpad=Enable +trackpoint=Enable +fn_ctrl_swap=Disable +sticky_fn=Disable +power_management_beeps=Enable +low_battery_beep=Enable +sata_mode=AHCI +hybrid_graphics_mode=Integrated Only +usb_always_on=Disable diff --git a/src/mainboard/lenovo/t410/cmos.layout b/src/mainboard/lenovo/t410/cmos.layout new file mode 100644 index 0000000000..5c7defa839 --- /dev/null +++ b/src/mainboard/lenovo/t410/cmos.layout @@ -0,0 +1,130 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2007-2008 coresystems GmbH +## Copyright (C) 2013 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. +## + +# ----------------------------------------------------------------- +entries + +# ----------------------------------------------------------------- +# Status Register A +# ----------------------------------------------------------------- +# Status Register B +# ----------------------------------------------------------------- +# Status Register C +#96 4 r 0 status_c_rsvd +#100 1 r 0 uf_flag +#101 1 r 0 af_flag +#102 1 r 0 pf_flag +#103 1 r 0 irqf_flag +# ----------------------------------------------------------------- +# Status Register D +#104 7 r 0 status_d_rsvd +#111 1 r 0 valid_cmos_ram +# ----------------------------------------------------------------- +# Diagnostic Status Register +#112 8 r 0 diag_rsvd1 + +# ----------------------------------------------------------------- +0 120 r 0 reserved_memory +#120 264 r 0 unused + +# ----------------------------------------------------------------- +# RTC_BOOT_BYTE (coreboot hardcoded) +384 1 e 4 boot_option +388 4 h 0 reboot_counter +#390 2 r 0 unused? + +# ----------------------------------------------------------------- +# coreboot config options: console +#392 3 r 0 unused +395 4 e 6 debug_level +#399 1 r 0 unused + +#400 8 r 0 reserved for century byte + +# coreboot config options: southbridge +408 1 e 1 nmi +409 2 e 7 power_on_after_fail + +# coreboot config options: EC +411 1 e 8 first_battery +412 1 e 1 bluetooth +413 1 e 1 wwan +414 1 e 1 touchpad +415 1 e 1 wlan +416 1 e 1 trackpoint +417 1 e 1 fn_ctrl_swap +418 1 e 1 sticky_fn +419 1 e 1 power_management_beeps +420 1 e 1 low_battery_beep +421 1 e 9 sata_mode +422 2 e 11 usb_always_on +#423 1 r 1 unused + +# coreboot config options: northbridge +424 3 e 10 gfx_uma_size +#427 5 r 0 unused +432 2 e 12 hybrid_graphics_mode + +# VBOOT +448 128 r 0 vbnv + +# coreboot config options: check sums +984 16 h 0 check_sum +#1000 24 r 0 amd_reserved + +# ----------------------------------------------------------------- + +enumerations + +#ID value text +1 0 Disable +1 1 Enable +2 0 Enable +2 1 Disable +4 0 Fallback +4 1 Normal +6 0 Emergency +6 1 Alert +6 2 Critical +6 3 Error +6 4 Warning +6 5 Notice +6 6 Info +6 7 Debug +6 8 Spew +7 0 Disable +7 1 Enable +7 2 Keep +8 0 Secondary +8 1 Primary +9 0 AHCI +9 1 Compatible +10 0 32M +10 1 48M +10 2 64M +10 3 128M +10 5 96M +10 6 160M +11 0 Disable +11 1 AC and battery +11 2 AC only +12 0 Integrated Only +12 1 Discrete Only + +# ----------------------------------------------------------------- +checksums + +checksum 392 447 984 diff --git a/src/mainboard/lenovo/t410/data.vbt b/src/mainboard/lenovo/t410/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..908234e9aa5ea001f2a8d15cf06c7033ee3a65b4 GIT binary patch literal 3982 zcmd5;U2Gf07Cz%$d)MRL*x9t;xX=z>%${0ORC385=pUC6_|+(?MO7bFBiK}b9xKouZB70PmEc9)no zf2cxY>@#!b%$aY_%sFRfui2X&W%=RaU?H=+fBT+dHecwU1QSk&AIAFPlFb)K4&*YU znFHBEv2Qm!1DC;_;l-~3CJ71aNi&(s_2pUq=ybUfAMVIkj~%T{+*@XQjvYK)DYFue zWey!GSIX6i>GC8S*?Vh-aZH_NPaLjHvcVHa4wkFEj02%IOLTX3bu(sm??`s-NSX-~ z`9$vxiQYs)r@8*V;+|5zkQvPv2U&5LQgmYm59$zWSz(%;!}vck;wf-ZjsfUvK43QfTc#jrxPE7T&2R* z5n#aoSnBVgOcJaolHr}Zag;D2o&8b)@N-s)5Jos-U7(->aO*%}g!wqbE>H*p1h`x= z3G>zxt1&KJu`th~l{79%LBhSrSAd!9PWAMrt!!@Rz^+1Rcy#aB{@ZI0Kl12I3>II< zmBp5Y1%hiKCcGWk4Ev-wJSO>|F7?1i(mZSlm@piO!V#oXNKYy%e4rTc1=0^le${}O zO5qx$PNW{BexxGOKBPlPCy-7eJ&yD=(sM{JA^j8S-$?&M`T*$@q%V=aMfw?u1Sy1& z0(Zc#wyy^0F)TIWwyjPJ5gAT*K<$hxKjX=T_S%(gD+(;y??=J5)tmWB);XCU56NN6 z%YfS!L@P-pw?B$4KfE!wZ`<@;pf!11vTgfq+Xnxb&*SD?Sxss9U75fJT-8#hJegv- zT+O#Y>`jY`Z8Hf`1c%`$Ih+-kmF-P7j)DpS`%}UB0cCuK3yjE@#)bY5S6K)lv89M5 z{;4ZHRMA>kH!Jx3)jukfE>IA&nyc}(6e4RWu(cGlR@lW)PfgFXpf12|py(3(EX}tB zfzIzd(7l(LM z<3ttkJ|nV=x%yD+(n5wN!rfc8jX~HK#7h+KKDY6PymrI$5Qs@ONDD+sTOpV;7dAwq z11T8$oU2Io90s?No^PFl#8{NEaXup4jmg6#CH*{u`ViY<4%AW(rjwDNq`f6BZ2#QI zWxKf<;v!LbDvM(BASvuD9Vks4EmsC7j+EEgxqJX7+ri4fwPy5`YjD)u2G0(GX_-@P z4*ceqcig`)6uZ_Md)AW-++vvrXOosS=SiY*NS(w-kx$W5C;i-Gf+KbD)SxWD{fDyl zIJCog{Ix@!Fbod6*7JaQJ==*n$fG#oW}0aj0ZLPn8seyjJGs8ud(km19VDtX6i;(rv;r= zbz?@Sr*-y*ZoH$@4|VpFZm2EPXwkQwllj$NYsC;lN2*l~{u?|Gn%hRO^@q3O)%|g> zR%Z)WM%3}Eos-y{I!WAk;7`J82$Dc(gc)Yl6)axc@H>JJ&kKvz@XtsbAuXB9+Tb8O zwYBlY(98zYWGUG3AI!_Bc{XKn0MfREu>39@gxRf)+R#i)Aee6&^8{4wDMW54VWK@AYL6a!Fd3u zlWgvEHFvt3J2y0U+%RzfZfqXuY3|(A)Jd4lon{LX%@!n@El4z5kZ86b;aYIr1Ox^@ d!_VYboqCtx-TK8Pd9%)+<*(m}pCHSW-vGe0sa*g7 literal 0 HcmV?d00001 diff --git a/src/mainboard/lenovo/t410/devicetree.cb b/src/mainboard/lenovo/t410/devicetree.cb new file mode 100644 index 0000000000..808e05759e --- /dev/null +++ b/src/mainboard/lenovo/t410/devicetree.cb @@ -0,0 +1,198 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2007-2009 coresystems GmbH +## Copyright (C) 2011 Sven Schnelle +## +## 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. +## + +chip northbridge/intel/nehalem + # IGD Displays + register "gfx.ndid" = "3" + register "gfx.did" = "{ 0x80000100, 0x80000240, 0x80000410 }" + + # Enable DisplayPort Hotplug with 6ms pulse + register "gpu_dp_d_hotplug" = "0x06" + + # Enable Panel as LVDS and configure power delays + register "gpu_panel_port_select" = "0" # LVDS + register "gpu_panel_power_cycle_delay" = "1" + register "gpu_panel_power_up_delay" = "1" + register "gpu_panel_power_down_delay" = "600" + register "gpu_panel_power_backlight_on_delay" = "0" + register "gpu_panel_power_backlight_off_delay" = "0" + register "gpu_cpu_backlight" = "0x58d" + register "gpu_pch_backlight" = "0x061a061a" + register "gfx.use_spread_spectrum_clock" = "1" + register "gfx.link_frequency_270_mhz" = "1" + + device cpu_cluster 0 on + chip cpu/intel/model_2065x + device lapic 0 on end + end + end + + register "pci_mmio_size" = "2048" + + device domain 0 on + device pci 00.0 on # Host bridge + subsystemid 0x17aa 0x2193 + end + device pci 01.0 on end # PEG + device pci 02.0 on # VGA controller + subsystemid 0x17aa 0x215a + end + chip southbridge/intel/ibexpeak + # GPI routing + # 0 No effect (default) + # 1 SMI# (if corresponding ALT_GPI_SMI_EN bit is also set) + # 2 SCI (if corresponding GPIO_EN bit is also set) + register "gpi1_routing" = "2" + register "gpi13_routing" = "2" + + # 0:HDD Bay 1:ODD Bay 4:eSATA Combo Connector + register "sata_port_map" = "0x13" + + register "gpe0_en" = "0x20022046" + register "alt_gp_smi_en" = "0x0000" + register "gen1_dec" = "0x7c1601" # EC + register "gen2_dec" = "0x0c15e1" # PMH7 + register "gen3_dec" = "0x1c1681" # EC ? + register "gen4_dec" = "0x040069" # ? + + register "c2_latency" = "1" + register "docking_supported" = "1" + + register "pcie_hotplug_map" = "{ 0, 0, 0, 1, 0, 0, 0, 0 }" + + device pci 16.0 off end # MEI + device pci 16.2 on # IDE/SATA + subsystemid 0x17aa 0x2161 + end + + device pci 19.0 on # Ethernet + subsystemid 0x17aa 0x2153 + end + + device pci 1a.0 on # USB2 EHCI + subsystemid 0x17aa 0x2163 + end + + device pci 1b.0 on # Audio Controller + subsystemid 0x17aa 0x215e + end + + device pci 1c.0 on end # PCIe Port #1 (wlan) + device pci 1c.1 off end # PCIe Port #2 (wwan) + device pci 1c.2 off end # PCIe Port #3 (wusb) + device pci 1c.3 on end # PCIe Port #4 (ExpressCard) + device pci 1c.4 on + subsystemid 0x17aa 0x2133 + chip drivers/ricoh/rce822 + register "sdwppol" = "1" + register "disable_mask" = "0x87" + device pci 00.0 on + subsystemid 0x17aa 0x2134 + end + end + end # PCIe Port #5 (Ricoh SD & FW) + device pci 1c.5 off end # PCIe Port #6 + device pci 1c.6 off end # PCIe Port #7 + device pci 1c.7 off end # PCIe Port #8 Intel Gigabit Ethernet PHY (not PCIe) + + device pci 1d.0 on # USB2 EHCI + subsystemid 0x17aa 0x2163 + end + device pci 1f.0 on # PCI-LPC bridge + subsystemid 0x17aa 0x2166 + chip drivers/pc80/tpm + device pnp 0c31.0 on end + end + chip ec/lenovo/pmh7 + device pnp ff.1 on end # dummy + register "backlight_enable" = "0x01" + register "dock_event_enable" = "0x01" + end + chip ec/lenovo/h8 + device pnp ff.2 on # dummy + io 0x60 = 0x62 + io 0x62 = 0x66 + io 0x64 = 0x1600 + io 0x66 = 0x1604 + end + + register "config0" = "0xa6" + register "config1" = "0x05" + register "config2" = "0xa0" + register "config3" = "0xe0" + + register "beepmask0" = "0xfe" + register "beepmask1" = "0x96" + register "has_power_management_beeps" = "1" + + register "event2_enable" = "0xff" + register "event3_enable" = "0xff" + register "event4_enable" = "0xf4" + register "event5_enable" = "0x3c" + register "event6_enable" = "0x87" + register "event7_enable" = "0x89" + register "event8_enable" = "0x7b" + register "event9_enable" = "0xff" + register "eventa_enable" = "0x83" + register "eventb_enable" = "0x00" + register "eventc_enable" = "0xff" + register "eventd_enable" = "0xff" + register "evente_enable" = "0x2d" + end + chip drivers/lenovo/hybrid_graphics + device pnp ff.f on end # dummy + + register "detect_gpio" = "21" + + register "has_panel_hybrid_gpio" = "1" + register "panel_hybrid_gpio" = "52" + register "panel_integrated_lvl" = "1" + + register "has_backlight_gpio" = "1" + register "backlight_gpio" = "50" + register "backlight_integrated_lvl" = "0" + + register "has_dgpu_power_gpio" = "1" + register "dgpu_power_gpio" = "49" + register "dgpu_power_off_lvl" = "0" + + register "has_thinker1" = "1" + end + end + device pci 1f.2 on # IDE/SATA + subsystemid 0x17aa 0x2168 + end + device pci 1f.3 on # SMBUS + subsystemid 0x17aa 0x2167 + # eeprom, 8 virtual devices, same chip + chip drivers/i2c/at24rf08c + device i2c 54 on end + device i2c 55 on end + device i2c 56 on end + device i2c 57 on end + device i2c 5c on end + device i2c 5d on end + device i2c 5e on end + device i2c 5f on end + end + end + device pci 1f.6 on # Thermal Subsystem + subsystemid 0x17aa 0x2190 + end + end + end +end diff --git a/src/mainboard/lenovo/t410/dock.c b/src/mainboard/lenovo/t410/dock.c new file mode 100644 index 0000000000..6b6b206498 --- /dev/null +++ b/src/mainboard/lenovo/t410/dock.c @@ -0,0 +1,57 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2011 Sven Schnelle + * Copyright (C) 2013 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 +#include +#include +#include "dock.h" +#include +#include +#include +#include + +void h8_mainboard_init_dock(void) +{ + if (dock_present()) { + printk(BIOS_DEBUG, "dock is connected\n"); + dock_connect(); + } else + printk(BIOS_DEBUG, "dock is not connected\n"); +} + +void dock_connect(void) +{ + /* UNTESTED */ + ec_set_bit(0x02, 0); + ec_set_bit(0x1a, 0); + ec_set_bit(0xfe, 4); +} + +void dock_disconnect(void) +{ + /* UNTESTED */ + ec_clr_bit(0x02, 0); + ec_clr_bit(0x1a, 0); + ec_clr_bit(0xfe, 4); +} + +int dock_present(void) +{ + const int gpio_num_array[] = {3, 4, 5, -1}; + + return get_gpios(gpio_num_array) != 7; +} diff --git a/src/mainboard/lenovo/t410/dock.h b/src/mainboard/lenovo/t410/dock.h new file mode 100644 index 0000000000..4cd8c857a8 --- /dev/null +++ b/src/mainboard/lenovo/t410/dock.h @@ -0,0 +1,22 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2011 Sven Schnelle + * + * 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. + */ + +#ifndef THINKPAD_X201_DOCK_H +#define THINKPAD_X201_DOCK_H + +void dock_connect(void); +void dock_disconnect(void); +int dock_present(void); +#endif diff --git a/src/mainboard/lenovo/t410/dsdt.asl b/src/mainboard/lenovo/t410/dsdt.asl new file mode 100644 index 0000000000..08e21225ca --- /dev/null +++ b/src/mainboard/lenovo/t410/dsdt.asl @@ -0,0 +1,95 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2009 coresystems GmbH + * + * 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. + */ + +#define THINKPAD_EC_GPE 17 +#define BRIGHTNESS_UP \_SB.PCI0.GFX0.INCB +#define BRIGHTNESS_DOWN \_SB.PCI0.GFX0.DECB +#define ACPI_VIDEO_DEVICE \_SB.PCI0.GFX0 +#define EC_LENOVO_H8_ME_WORKAROUND 1 + +#include +DefinitionBlock( + "dsdt.aml", + "DSDT", + 0x02, /* DSDT revision: ACPI v2.0 and up */ + OEM_ID, + ACPI_TABLE_CREATOR, + 0x20130325 /* OEM revision */ +) +{ + #include + + /* Some generic macros */ + #include "acpi/platform.asl" + + /* global NVS and variables */ + #include + + /* General Purpose Events */ + #include "acpi/gpe.asl" + + #include + + Scope (\_SB) { + Device (PCI0) + { + #include + #include + + #include + } + Device (UNCR) + { + Name (_BBN, 0xFF) + Name (_ADR, 0x00) + Name (RID, 0x00) + Name (_HID, EisaId ("PNP0A03")) + Name (_CRS, ResourceTemplate () + { + WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode, + 0x0000, /* Granularity */ + 0x00FF, /* Range Minimum */ + 0x00FF, /* Range Maximum */ + 0x0000, /* Translation Offset */ + 0x0001, /* Length */ + ,, ) + }) + Device (SAD) + { + Name (_ADR, 0x01) + Name (RID, 0x00) + OperationRegion (SADC, PCI_Config, 0x00, 0x0100) + Field (SADC, DWordAcc, NoLock, Preserve) + { + Offset (0x40), + PAM0, 8, + PAM1, 8, + PAM2, 8, + PAM3, 8, + PAM4, 8, + PAM5, 8, + PAM6, 8 + } + } + } + } + + /* Chipset specific sleep states */ + #include + + /* Dock support code */ + #include "acpi/dock.asl" +} diff --git a/src/mainboard/lenovo/t410/early_init.c b/src/mainboard/lenovo/t410/early_init.c new file mode 100644 index 0000000000..63bbe92f1b --- /dev/null +++ b/src/mainboard/lenovo/t410/early_init.c @@ -0,0 +1,25 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Patrick Rudolph + * + * 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 +#include + +#include +void bootblock_mainboard_early_init(void) +{ + /* Enable USB Power. We need to do it early for usbdebug to work. */ + ec_set_bit(0x3b, 4); +} diff --git a/src/mainboard/lenovo/t410/gma-mainboard.ads b/src/mainboard/lenovo/t410/gma-mainboard.ads new file mode 100644 index 0000000000..9c2a3cb369 --- /dev/null +++ b/src/mainboard/lenovo/t410/gma-mainboard.ads @@ -0,0 +1,30 @@ +-- +-- This file is part of the coreboot project. +-- +-- 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 2 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. +-- + +with HW.GFX.GMA; +with HW.GFX.GMA.Display_Probing; + +use HW.GFX.GMA; +use HW.GFX.GMA.Display_Probing; + +private package GMA.Mainboard is + + ports : constant Port_List := + (DP2, -- DP++ connector on the dock + HDMI2, + Analog, + Internal, + others => Disabled); + +end GMA.Mainboard; diff --git a/src/mainboard/lenovo/t410/gpio.c b/src/mainboard/lenovo/t410/gpio.c new file mode 100644 index 0000000000..26b27a7f0c --- /dev/null +++ b/src/mainboard/lenovo/t410/gpio.c @@ -0,0 +1,235 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 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 pch_gpio_set1 pch_gpio_set1_mode = { + .gpio0 = GPIO_MODE_GPIO, + .gpio1 = GPIO_MODE_GPIO, + .gpio2 = GPIO_MODE_GPIO, + .gpio3 = GPIO_MODE_GPIO, /* DOCK0 */ + .gpio4 = GPIO_MODE_GPIO, /* DOCK1 */ + .gpio5 = GPIO_MODE_GPIO, /* DOCK2 */ + .gpio6 = GPIO_MODE_GPIO, + .gpio7 = GPIO_MODE_GPIO, /* -SC_DTCT */ + .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_GPIO, /* -1394_DTCT */ + .gpio17 = GPIO_MODE_GPIO, /* DGFX_PWRGD */ + .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_NATIVE, + .gpio26 = GPIO_MODE_NATIVE, + .gpio27 = GPIO_MODE_GPIO, + .gpio28 = GPIO_MODE_GPIO, + .gpio29 = GPIO_MODE_GPIO, + .gpio30 = GPIO_MODE_GPIO, + .gpio31 = GPIO_MODE_NATIVE, +}; + +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, + .gpio16 = GPIO_DIR_INPUT, + .gpio17 = GPIO_DIR_INPUT, + .gpio21 = GPIO_DIR_INPUT, + .gpio22 = GPIO_DIR_OUTPUT, + .gpio24 = GPIO_DIR_OUTPUT, + .gpio27 = GPIO_DIR_OUTPUT, + .gpio28 = GPIO_DIR_OUTPUT, + .gpio29 = GPIO_DIR_OUTPUT, + .gpio30 = GPIO_DIR_OUTPUT, +}; + +const struct pch_gpio_set1 pch_gpio_set1_level = { + .gpio8 = GPIO_LEVEL_HIGH, + .gpio9 = GPIO_LEVEL_HIGH, + .gpio10 = GPIO_LEVEL_HIGH, + .gpio11 = GPIO_LEVEL_HIGH, + .gpio12 = GPIO_LEVEL_HIGH, + .gpio14 = GPIO_LEVEL_HIGH, + .gpio15 = GPIO_LEVEL_HIGH, + .gpio18 = GPIO_LEVEL_LOW, + .gpio19 = GPIO_LEVEL_LOW, + .gpio20 = GPIO_LEVEL_HIGH, + .gpio22 = GPIO_LEVEL_LOW, + .gpio23 = GPIO_LEVEL_HIGH, + .gpio24 = GPIO_LEVEL_HIGH, + .gpio25 = GPIO_LEVEL_HIGH, + .gpio26 = GPIO_LEVEL_HIGH, + .gpio27 = GPIO_LEVEL_HIGH, + .gpio28 = GPIO_LEVEL_HIGH, + .gpio29 = GPIO_LEVEL_HIGH, + .gpio30 = GPIO_LEVEL_HIGH, + .gpio31 = GPIO_LEVEL_LOW, +}; + +const struct pch_gpio_set1 pch_gpio_set1_reset = { + .gpio24 = GPIO_RESET_RSMRST, + .gpio30 = GPIO_RESET_RSMRST, +}; + +const struct pch_gpio_set1 pch_gpio_set1_blink = { + .gpio18 = GPIO_NO_BLINK, +}; + +const struct pch_gpio_set1 pch_gpio_set1_invert = { + .gpio0 = GPIO_INVERT, + .gpio1 = GPIO_INVERT, + .gpio13 = GPIO_INVERT, +}; + +const struct pch_gpio_set2 pch_gpio_set2_mode = { + .gpio32 = GPIO_MODE_NATIVE, + .gpio33 = GPIO_MODE_NATIVE, + .gpio34 = GPIO_MODE_NATIVE, + .gpio35 = GPIO_MODE_NATIVE, + .gpio36 = GPIO_MODE_GPIO, /* PLANARID0 */ + .gpio37 = GPIO_MODE_GPIO, /* PLANARID1 */ + .gpio38 = GPIO_MODE_GPIO, /* PLANARID2 */ + .gpio39 = GPIO_MODE_GPIO, /* PLANARID3 */ + .gpio40 = GPIO_MODE_NATIVE, + .gpio41 = GPIO_MODE_GPIO, /* -MDC_KILL */ + .gpio42 = GPIO_MODE_GPIO, /* SMB_3B_EN */ + .gpio43 = GPIO_MODE_NATIVE, + .gpio44 = GPIO_MODE_NATIVE, + .gpio45 = GPIO_MODE_NATIVE, + .gpio46 = GPIO_MODE_NATIVE, + .gpio47 = GPIO_MODE_NATIVE, + .gpio48 = GPIO_MODE_GPIO, /* -BDC_PRESENCE */ + .gpio49 = GPIO_MODE_GPIO, /* GFX_PWR_EN_D */ + .gpio50 = GPIO_MODE_GPIO, /* BKLT_CTRL_SEL */ + .gpio51 = GPIO_MODE_NATIVE, + .gpio52 = GPIO_MODE_GPIO, /* DISCRETE_ENABLE */ + .gpio53 = GPIO_MODE_GPIO, + .gpio54 = GPIO_MODE_GPIO, /* DDC_MUX_SEL */ + .gpio55 = GPIO_MODE_NATIVE, + .gpio56 = GPIO_MODE_NATIVE, + .gpio57 = GPIO_MODE_GPIO, /* -DEBUGCARD */ + .gpio58 = GPIO_MODE_NATIVE, + .gpio59 = GPIO_MODE_NATIVE, + .gpio60 = GPIO_MODE_NATIVE, + .gpio61 = GPIO_MODE_NATIVE, + .gpio62 = GPIO_MODE_NATIVE, + .gpio63 = GPIO_MODE_NATIVE, +}; + +const struct pch_gpio_set2 pch_gpio_set2_direction = { + .gpio36 = GPIO_DIR_INPUT, + .gpio37 = GPIO_DIR_INPUT, + .gpio38 = GPIO_DIR_INPUT, + .gpio39 = GPIO_DIR_INPUT, + .gpio41 = GPIO_DIR_OUTPUT, + .gpio42 = GPIO_DIR_OUTPUT, + .gpio48 = GPIO_DIR_INPUT, + .gpio49 = GPIO_DIR_OUTPUT, + .gpio50 = GPIO_DIR_OUTPUT, + .gpio52 = GPIO_DIR_OUTPUT, + .gpio53 = GPIO_DIR_OUTPUT, + .gpio54 = GPIO_DIR_OUTPUT, + .gpio57 = GPIO_DIR_INPUT, +}; + +const struct pch_gpio_set2 pch_gpio_set2_level = { + .gpio32 = GPIO_LEVEL_HIGH, + .gpio33 = GPIO_LEVEL_HIGH, + .gpio34 = GPIO_LEVEL_HIGH, + .gpio35 = GPIO_LEVEL_HIGH, + .gpio40 = GPIO_LEVEL_HIGH, + .gpio41 = GPIO_LEVEL_HIGH, + .gpio42 = GPIO_LEVEL_HIGH, + .gpio43 = GPIO_LEVEL_HIGH, + .gpio44 = GPIO_LEVEL_LOW, + .gpio45 = GPIO_LEVEL_HIGH, + .gpio46 = GPIO_LEVEL_HIGH, + .gpio47 = GPIO_LEVEL_HIGH, + .gpio49 = GPIO_LEVEL_LOW, + .gpio50 = GPIO_LEVEL_LOW, + .gpio51 = GPIO_LEVEL_HIGH, + .gpio52 = GPIO_LEVEL_LOW, + .gpio53 = GPIO_LEVEL_HIGH, + .gpio54 = GPIO_LEVEL_HIGH, + .gpio55 = GPIO_LEVEL_HIGH, + .gpio56 = GPIO_LEVEL_HIGH, + .gpio58 = GPIO_LEVEL_HIGH, + .gpio59 = GPIO_LEVEL_HIGH, + .gpio60 = GPIO_LEVEL_HIGH, + .gpio61 = GPIO_LEVEL_HIGH, + .gpio62 = GPIO_LEVEL_LOW, + .gpio63 = GPIO_LEVEL_HIGH, +}; + +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_NATIVE, + .gpio69 = GPIO_MODE_NATIVE, + .gpio70 = GPIO_MODE_NATIVE, + .gpio71 = GPIO_MODE_NATIVE, + .gpio72 = GPIO_MODE_NATIVE, + .gpio73 = GPIO_MODE_NATIVE, + .gpio74 = GPIO_MODE_NATIVE, + .gpio75 = GPIO_MODE_NATIVE, +}; + +const struct pch_gpio_set3 pch_gpio_set3_direction = { +}; + +const struct pch_gpio_set3 pch_gpio_set3_level = { +}; + +const struct pch_gpio_map mainboard_gpio_map = { + .set1 = { + .mode = &pch_gpio_set1_mode, + .direction = &pch_gpio_set1_direction, + .level = &pch_gpio_set1_level, + .reset = &pch_gpio_set1_reset, + .blink = &pch_gpio_set1_blink, + .invert = &pch_gpio_set1_invert, + }, + .set2 = { + .mode = &pch_gpio_set2_mode, + .direction = &pch_gpio_set2_direction, + .level = &pch_gpio_set2_level, + }, + .set3 = { + .mode = &pch_gpio_set3_mode, + .direction = &pch_gpio_set3_direction, + .level = &pch_gpio_set3_level, + }, +}; diff --git a/src/mainboard/lenovo/t410/hda_verb.c b/src/mainboard/lenovo/t410/hda_verb.c new file mode 100644 index 0000000000..752e5da67b --- /dev/null +++ b/src/mainboard/lenovo/t410/hda_verb.c @@ -0,0 +1,49 @@ +/* + * This file is part of the coreboot project. + * + * 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, + * 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. + */ + +#include + +const u32 cim_verb_data[] = { + /* coreboot specific header */ + 0x14F15069, /* Codec Vendor / Device ID: Conexant CX20585 */ + 0x17AA214C, /* Subsystem ID */ + 0x0000000B, /* Number of 4 dword sets */ + + AZALIA_SUBVENDOR(0x0, 0x17AA214C), + AZALIA_PIN_CFG(0x0, 0x19, 0x042110F0), + AZALIA_PIN_CFG(0x0, 0x1A, 0x61A190F0), + AZALIA_PIN_CFG(0x0, 0x1B, 0x04A110F0), + AZALIA_PIN_CFG(0x0, 0x1C, 0x612140F0), + AZALIA_PIN_CFG(0x0, 0x1D, 0x40F001F0), + AZALIA_PIN_CFG(0x0, 0x1E, 0x40F001F0), + AZALIA_PIN_CFG(0x0, 0x1F, 0x901701F0), + AZALIA_PIN_CFG(0x0, 0x20, 0x40F001F0), + AZALIA_PIN_CFG(0x0, 0x22, 0x40F001F0), + AZALIA_PIN_CFG(0x0, 0x23, 0x90A601F0), + + 0x80862804, /* Codec Vendor / Device ID: Intel Ibexpeak HDMI. */ + 0x17AA21B5, /* Subsystem ID */ + 0x00000004, /* Number of 4 dword sets */ + + AZALIA_SUBVENDOR(0x3, 0x17AA21B5), + AZALIA_PIN_CFG(0x3, 0x04, 0x18560010), + AZALIA_PIN_CFG(0x3, 0x05, 0x18560020), + AZALIA_PIN_CFG(0x3, 0x06, 0x18560030), +}; + +const u32 pc_beep_verbs[0] = {}; + +AZALIA_ARRAY_SIZES; diff --git a/src/mainboard/lenovo/t410/mainboard.c b/src/mainboard/lenovo/t410/mainboard.c new file mode 100644 index 0000000000..23b68fabc2 --- /dev/null +++ b/src/mainboard/lenovo/t410/mainboard.c @@ -0,0 +1,32 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2009 coresystems GmbH + * Copyright (C) 2011 Sven Schnelle + * Copyright (C) 2013 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 +#include +#include + +static void mainboard_enable(struct device *dev) +{ + install_intel_vga_int15_handler(GMA_INT15_ACTIVE_LFP_INT_LVDS, + GMA_INT15_PANEL_FIT_DEFAULT, + GMA_INT15_BOOT_DISPLAY_LFP, 2); +} + +struct chip_operations mainboard_ops = { + .enable_dev = mainboard_enable, +}; diff --git a/src/mainboard/lenovo/t410/romstage.c b/src/mainboard/lenovo/t410/romstage.c new file mode 100644 index 0000000000..7c796de8ee --- /dev/null +++ b/src/mainboard/lenovo/t410/romstage.c @@ -0,0 +1,75 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2009 coresystems GmbH + * Copyright (C) 2011 Sven Schnelle + * Copyright (C) 2013 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 +#include +#include +#include +#include + +const struct southbridge_usb_port mainboard_usb_ports[] = { + /* Enabled, Current table lookup index, OC map */ + { 1, IF1_557, 0 }, + { 1, IF1_55F, 1 }, + { 1, IF1_74B, 3 }, + { 1, IF1_14B, 3 }, + { 1, IF1_14B, 3 }, + { 1, IF1_74B, 3 }, + { 1, IF1_74B, 3 }, + { 1, IF1_74B, 3 }, + { 1, IF1_55F, 4 }, + { 1, IF1_55F, 5 }, + { 1, IF1_74B, 7 }, + { 1, IF1_74B, 7 }, + { 1, IF1_557, 7 }, + { 1, IF1_55F, 7 }, +}; + +static void hybrid_graphics_init(void) +{ + bool peg, igd; + u32 reg32; + + early_hybrid_graphics(&igd, &peg); + + /* Hide disabled devices */ + reg32 = pci_read_config32(PCI_DEV(0, 0, 0), D0F0_DEVEN); + reg32 &= ~(DEVEN_PEG10 | DEVEN_IGD); + + if (peg) + reg32 |= DEVEN_PEG10; + + if (igd) + reg32 |= DEVEN_IGD; + else + /* Disable IGD VGA decode, no GTT or GFX stolen */ + pci_write_config16(PCI_DEV(0, 0, 0), D0F0_GGC, 2); + + pci_write_config32(PCI_DEV(0, 0, 0), D0F0_DEVEN, reg32); +} + +void mainboard_pre_raminit(void) +{ + hybrid_graphics_init(); +} + +void mainboard_get_spd_map(u8 *spd_addrmap) +{ + spd_addrmap[0] = 0x50; + spd_addrmap[2] = 0x52; +} diff --git a/src/mainboard/lenovo/t410/smihandler.c b/src/mainboard/lenovo/t410/smihandler.c new file mode 100644 index 0000000000..91cb0ce2d6 --- /dev/null +++ b/src/mainboard/lenovo/t410/smihandler.c @@ -0,0 +1,110 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2008-2009 coresystems GmbH + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include "dock.h" + +#define GPE_EC_SCI 1 +#define GPE_EC_WAKE 13 + +static void mainboard_smi_handle_ec_sci(void) +{ + u8 status = inb(EC_SC); + u8 event; + + if (!(status & EC_SCI_EVT)) + return; + + event = ec_query(); + printk(BIOS_DEBUG, "EC event %02x\n", event); + + switch (event) { + case 0x18: + /* Fn-F9 key */ + case 0x27: + /* Power loss */ + case 0x50: + /* Undock Key */ + ec_clr_bit(0x03, 2); + dock_disconnect(); + break; + case 0x37: + case 0x58: + /* Dock Event */ + ec_clr_bit(0x03, 2); + mdelay(250); + dock_connect(); + ec_set_bit(0x03, 2); + /* set dock LED to indicate status */ + ec_write(0x0c, 0x09); + ec_write(0x0c, 0x88); + break; + default: + break; + } +} + +void mainboard_smi_gpi(u32 gpi_sts) +{ + if (gpi_sts & (1 << GPE_EC_SCI)) + mainboard_smi_handle_ec_sci(); +} + +int mainboard_smi_apmc(u8 data) +{ + switch (data) { + case APM_CNT_ACPI_ENABLE: + /* use 0x1600/0x1604 to prevent races with userspace */ + ec_set_ports(0x1604, 0x1600); + /* route H8SCI to SCI */ + gpi_route_interrupt(GPE_EC_SCI, GPI_IS_SCI); + /* discard all events, and enable attention */ + ec_write(0x80, 0x01); + break; + case APM_CNT_ACPI_DISABLE: + /* we have to use port 0x62/0x66, as 0x1600/0x1604 doesn't + provide a EC query function */ + ec_set_ports(0x66, 0x62); + /* route H8SCI# to SMI */ + gpi_route_interrupt(GPE_EC_SCI, GPI_IS_SMI); + /* discard all events, and enable attention */ + ec_write(0x80, 0x01); + break; + default: + break; + } + return 0; +} + +void mainboard_smi_sleep(u8 slp_typ) +{ + if (slp_typ == 3) { + u8 ec_wake = ec_read(0x32); + /* If EC wake events are enabled, enable wake on EC WAKE GPE. */ + if (ec_wake & 0x14) { + /* Redirect EC WAKE GPE to SCI. */ + gpi_route_interrupt(GPE_EC_WAKE, GPI_IS_SCI); + } + } +} diff --git a/src/mainboard/lenovo/t410/thermal.h b/src/mainboard/lenovo/t410/thermal.h new file mode 100644 index 0000000000..d8c94805b8 --- /dev/null +++ b/src/mainboard/lenovo/t410/thermal.h @@ -0,0 +1,26 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2016 Patrick Rudolph + * + * 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. + */ + +#ifndef MAINBOARD_THERMAL_H +#define MAINBOARD_THERMAL_H + +/* Temperature which OS will shutdown at */ +#define CRITICAL_TEMPERATURE 100 + +/* Temperature which OS will throttle CPU */ +#define PASSIVE_TEMPERATURE 90 + +#endif /* MAINBOARD_THERMAL_H */ diff --git a/src/mainboard/lenovo/t410/vboot-rwa.fmd b/src/mainboard/lenovo/t410/vboot-rwa.fmd new file mode 100644 index 0000000000..8f50d33fbb --- /dev/null +++ b/src/mainboard/lenovo/t410/vboot-rwa.fmd @@ -0,0 +1,31 @@ +FLASH@0xff800000 0x800000 { + SI_ALL@0x0 0x500000 { + SI_DESC@0x0 0x1000 + SI_GBE@0x1000 0x2000 + SI_ME@0x3000 0x4ed000 + } + SI_BIOS@0x500000 0x300000 { + RW_SECTION_A 0x180000 { + VBLOCK_A 0x10000 + FW_MAIN_A(CBFS) + RW_FWID_A 0x40 + } + UNIFIED_MRC_CACHE 0x20000 { + RECOVERY_MRC_CACHE 0x10000 + RW_MRC_CACHE 0x10000 + } + RW_VPD(PRESERVE) 0x1000 + SMMSTORE(PRESERVE) 0x40000 + + WP_RO { + RO_VPD(PRESERVE) 0x1000 + RO_SECTION 0x11e000 { + FMAP 0x800 + RO_FRID 0x40 + RO_PADDING 0x7c0 + GBB 0x1e000 + COREBOOT(CBFS) + } + } + } +}