From 1bda1c356a7423cfaf5271597180bd4383662a9b Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Fri, 10 Apr 2020 23:40:00 +0800 Subject: [PATCH] mainboard: Add HP EliteBook 2560p Most of the code is generated by autoport. The laptop works well under coreboot with SeaBIOS 1.13.0 payload, running Arch Linux with kernel 5.4.39 and 5.6.11. Change-Id: I126916e201fb8e4b9067f2dececebfb5bae6df73 Signed-off-by: Iru Cai Reviewed-on: https://review.coreboot.org/c/coreboot/+/41159 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons --- Documentation/mainboard/hp/2560p.md | 99 ++++++++ Documentation/mainboard/hp/2560p_flash.webp | Bin 0 -> 27184 bytes Documentation/mainboard/index.md | 1 + src/mainboard/hp/snb_ivb_laptops/Kconfig | 3 + src/mainboard/hp/snb_ivb_laptops/Kconfig.name | 12 + .../variants/2560p/board_info.txt | 7 + .../snb_ivb_laptops/variants/2560p/data.vbt | Bin 0 -> 3985 bytes .../variants/2560p/early_init.c | 40 ++++ .../variants/2560p/gma-mainboard.ads | 18 ++ .../hp/snb_ivb_laptops/variants/2560p/gpio.c | 224 ++++++++++++++++++ .../snb_ivb_laptops/variants/2560p/hda_verb.c | 38 +++ .../variants/2560p/overridetree.cb | 52 ++++ 12 files changed, 494 insertions(+) create mode 100644 Documentation/mainboard/hp/2560p.md create mode 100644 Documentation/mainboard/hp/2560p_flash.webp create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/board_info.txt create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/data.vbt create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/early_init.c create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/gma-mainboard.ads create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/gpio.c create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/hda_verb.c create mode 100644 src/mainboard/hp/snb_ivb_laptops/variants/2560p/overridetree.cb diff --git a/Documentation/mainboard/hp/2560p.md b/Documentation/mainboard/hp/2560p.md new file mode 100644 index 0000000000..0b51a89e38 --- /dev/null +++ b/Documentation/mainboard/hp/2560p.md @@ -0,0 +1,99 @@ +# HP EliteBook 2560p + +This page is about the notebook [HP EliteBook 2560p]. + +## Release status + +HP EliteBook 2560p was released in 2011 and is now end of life. +It can be bought from a secondhand market like Taobao or eBay. + +## Required proprietary blobs + +The following blobs are required to operate the hardware: +1. EC firmware +2. Intel ME firmware + +EC firmware can be retrieved from the HP firmware update image, or the firmware +backup of the laptop. EC Firmware is part of the coreboot build process. +The guide on extracting EC firmware and using it to build coreboot is in +document [HP Laptops with KBC1126 Embedded Controller](hp_kbc1126_laptops). + +Intel ME firmware is in the flash chip. It is not needed when building coreboot. + +## Programming + +The flash chip is located between the memory slots and the PCH, +covered by the base enclosure, which needs to be removed according to +the [Maintenance and Service Guide] to access the flash chip. An SPI +flash programmer using 3.3V voltage such as a ch341a programmer, and +an SOIC-8 clip can be used to read and flash the chip in-circuit. + +Pin 1 of the flash chip is at the side near the PCH. + +![Flash Chip in 2560p](2560p_flash.webp) + +For more details have a look at the general [flashing tutorial]. + +## Debugging + +The board can be debugged with EHCI debug. The EHCI debug port is the back +bottom USB port. + +Schematic of this laptop can be found on [Lab One]. + +## Test status + +### Known issues + +- GRUB payload freezes if at_keyboard module is in the GRUB image + ([bug #141]) + +### Untested + +- Optical Drive +- VGA +- Fingerprint Reader +- Modem + +### Working + +- Integrated graphics init with libgfxinit +- SATA +- Audio: speaker and microphone +- Ethernet +- WLAN +- WWAN +- Bluetooth +- ExpressCard +- SD Card Reader +- SmartCard Reader +- eSATA +- USB +- DisplayPort +- Keyboard, touchpad and trackpoint +- EC ACPI support and thermal control +- Dock: all USB ports, DisplayPort, eSATA +- TPM +- Internal flashing when IFD is unlocked +- Using `me_cleaner` + + +## Technology + +```eval_rst ++------------------+--------------------------------------------------+ +| CPU | Intel Sandy/Ivy Bridge (FCPGA988) | ++------------------+--------------------------------------------------+ +| PCH | Intel Cougar Point QM67 | ++------------------+--------------------------------------------------+ +| EC | SMSC KBC1126 | ++------------------+--------------------------------------------------+ +| Coprocessor | Intel Management Engine | ++------------------+--------------------------------------------------+ +``` + +[HP EliteBook 2560p]: https://support.hp.com/us-en/product/hp-elitebook-2560p-notebook-pc/5071201 +[Maintenance and Service Guide]: http://h10032.www1.hp.com/ctg/Manual/c03011618 +[flashing tutorial]: ../../flash_tutorial/ext_power.md +[Lab One]: https://www.laboneinside.com/hp-elitebook-2560p-schematic-diagram/ +[bug #141]: https://ticket.coreboot.org/issues/141 diff --git a/Documentation/mainboard/hp/2560p_flash.webp b/Documentation/mainboard/hp/2560p_flash.webp new file mode 100644 index 0000000000000000000000000000000000000000..8583fa0845d959b8ed52834ad4bd809cb5494571 GIT binary patch literal 27184 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 Do1h*6 literal 0 HcmV?d00001 diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index 3a7dd31742..7507a15bcb 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -59,6 +59,7 @@ The boards in this section are not real mainboards, but emulators. ### EliteBook series - [HP Laptops with KBC1126 EC](hp/hp_kbc1126_laptops.md) +- [EliteBook 2560p](hp/2560p.md) - [EliteBook 8760w](hp/8760w.md) ## Intel diff --git a/src/mainboard/hp/snb_ivb_laptops/Kconfig b/src/mainboard/hp/snb_ivb_laptops/Kconfig index 2409348115..82fd948278 100644 --- a/src/mainboard/hp/snb_ivb_laptops/Kconfig +++ b/src/mainboard/hp/snb_ivb_laptops/Kconfig @@ -20,6 +20,7 @@ config MAINBOARD_DIR config VARIANT_DIR string + default "2560p" if BOARD_HP_2560P default "2570p" if BOARD_HP_2570P default "2760p" if BOARD_HP_2760P default "8460p" if BOARD_HP_8460P @@ -30,6 +31,7 @@ config VARIANT_DIR config MAINBOARD_PART_NUMBER string + default "EliteBook 2560p" if BOARD_HP_2560P default "EliteBook 2570p" if BOARD_HP_2570P default "EliteBook 2760p" if BOARD_HP_2760P default "EliteBook 8460p" if BOARD_HP_8460P @@ -54,6 +56,7 @@ config VGA_BIOS_ID config USBDEBUG_HCD_INDEX int + default 1 if BOARD_HP_2560P default 2 if BOARD_HP_2570P default 1 if BOARD_HP_2760P default 1 if BOARD_HP_8460P diff --git a/src/mainboard/hp/snb_ivb_laptops/Kconfig.name b/src/mainboard/hp/snb_ivb_laptops/Kconfig.name index c01555fd13..fb8e547d66 100644 --- a/src/mainboard/hp/snb_ivb_laptops/Kconfig.name +++ b/src/mainboard/hp/snb_ivb_laptops/Kconfig.name @@ -1,5 +1,17 @@ ## SPDX-License-Identifier: GPL-2.0-only +config BOARD_HP_2560P + bool "EliteBook 2560p" + + select BOARD_HP_SNB_IVB_LAPTOPS + select BOARD_ROMSIZE_KB_8192 + select GFX_GMA_PANEL_1_ON_LVDS + select INTEL_GMA_HAVE_VBT + select INTEL_INT15 + select MAINBOARD_HAS_LIBGFXINIT + select MAINBOARD_USES_IFD_GBE_REGION + select SOUTHBRIDGE_INTEL_BD82X6X + config BOARD_HP_2570P bool "EliteBook 2570p" diff --git a/src/mainboard/hp/snb_ivb_laptops/variants/2560p/board_info.txt b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/board_info.txt new file mode 100644 index 0000000000..a3e8a7be06 --- /dev/null +++ b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/board_info.txt @@ -0,0 +1,7 @@ +Category: laptop +Board URL: https://support.hp.com/us-en/product/hp-elitebook-2560p-notebook-pc/5071201 +ROM protocol: SPI +ROM package: SOIC-8 +ROM socketed: y +Flashrom support: n +Release year: 2011 diff --git a/src/mainboard/hp/snb_ivb_laptops/variants/2560p/data.vbt b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..ee23b34f79f27e8eb0e98bb915e4c9c4b1376354 GIT binary patch literal 3985 zcmdT`Z){Ul6hE);z4q<)y|sJePgh_$8w9$s!CS#OafH`yj19)t{b88|!aCZ)l8(-9 z=$4pJa0wWclxPSVqVto64~mJ2F(wA}gEJ(CV8SOpU}8}DB1SY3fqLHSYl|C$24a-k z{@%Iw-1E*m=iYP9y({{Hz1S1zXnro(-PXKibM1D-2xxH9RYuRbE!fuCv!^-G8`u+U z?`+zJ@4_MoyY5~Gh;W>$`0F%(+kx?D%-3Dj6Fv}`983&H_C;}fd~i4x#ZXfl2KMfa z#-fSvcr=1NeOm%(s8m?+;BYL09S27SqlpdJGd?+ieZ~wLDr>d6wSJBMb#)4B(4O(v zt>1tc43CkH_|Ommo5G3l;b;Pb@%T74508z;!jl+??TaUd$M=s|jx@zbClkZ__K%~l zsS5p?rq$A89hxR%Q#>)chTe%`w;?lz-O;gV;)Q5rjlvWLaGsY04uBKE#pxV(#}Be3 z_#|wV^dgB{Az-thivlMi4xnCvTtLTJ3+M)$!r26X3JEIR)}$#!JpSG>2yl4-+#!Q! z3OE2n>T}@ckc|(5MHSTUxiahq`9 zCd;=xdl*Tl9S*pg{?-HOw6xLql72%l7KUpkYP431wwsjaL)N&LsIh?k);OJJ7l7hA z)6(fDz32QIDw5=c72Ig}!-=EI44P|6>fI|~6B7>>$i12E%+`?Q=jh`L$feLp6@bUa zDaBN~1K`KQ3J+=CUt9#->*7xMMXUwaaiDnn*IJQLaSCtlDR6_4(3}Jy0Tm%mATL0m z;rvaS|CL9ZD#?FNmGc#YEGR{AnWb@lYZkl>c5i0d(Kw&je>t;g8(GDhr9{eALv5-U zpuHuuClo#qjdg@aq6H2Xw?d>0^Z=~XJjd!Y{(7`(INb%Bu8o#vIOXrJow(ZNU8(n< z&T?8e>Du5qzpkIpay&k$Kg4I&TdqGO8v74GJuYSD8};l)G!U=M2W4=Jer1s25Hi0R z(5+t$m+yHEElXzLqJt4`a>q*lpFP8`LYmJ*>oR6aW{P$GrK&f8|Gfy8FtwJkry1^M zYMil2hVL--BgQ^s_&rm9W9$yY$qqa5J*WDqlYQmHpPlMoPA1B@ zT2?p8Y>SK|vU*5nugLhJtbQT03o`yHt2|w46kMmMn-$in;6X(_s<4v^exj(~DC|20 z|5Q|GFag{;F%Yf{q#-f~?-tFTZ!2r0UzQUypl3h~0% zn4BIxx12Oo=i)(3nFpRcEl$mfhx>W)R@L;yuBl2b^ycE61|FQI4Z6J$4O+E6GcXm= zJY814k{3M4riQsOc|RNG#H6XgJl838umCTvdto|+i#1tm%6pNbd^A_G!HkCo=ca8# z((`;nt=?ao-wPgG880NTKRhq0bQnlN>44i^lDC1*d&7nT51S`OY;_py9W!)MKAU-N iy&|$~|6cy%^lKKvYb~^RZFB?Q0U?M$4R;ED;{OJ&3W@Uo literal 0 HcmV?d00001 diff --git a/src/mainboard/hp/snb_ivb_laptops/variants/2560p/early_init.c b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/early_init.c new file mode 100644 index 0000000000..29e9e0f827 --- /dev/null +++ b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/early_init.c @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include +#include +#include +#include + +const struct southbridge_usb_port mainboard_usb_ports[] = { + { 1, 1, 0 }, /* back bottom USB port, USB debug */ + { 1, 1, 0 }, /* back upper USB port */ + { 1, 1, 1 }, /* eSATA */ + { 1, 1, 1 }, /* webcam */ + { 1, 0, 2 }, + { 1, 0, 2 }, /* bluetooth */ + { 1, 0, 3 }, + { 1, 0, 3 }, /* smartcard */ + { 1, 1, 4 }, /* fingerprint reader */ + { 1, 1, 4 }, /* WWAN */ + { 0, 0, 5 }, + { 1, 0, 5 }, /* docking */ + { 0, 0, 6 }, + { 0, 0, 6 }, +}; + +void bootblock_mainboard_early_init(void) +{ + kbc1126_enter_conf(); + kbc1126_mailbox_init(); + kbc1126_kbc_init(); + kbc1126_ec_init(); + kbc1126_pm1_init(); + kbc1126_exit_conf(); + kbc1126_disable4e(); +} + +void mainboard_get_spd(spd_raw_data *spd, bool id_only) +{ + read_spd(&spd[0], 0x50, id_only); + read_spd(&spd[2], 0x52, id_only); +} diff --git a/src/mainboard/hp/snb_ivb_laptops/variants/2560p/gma-mainboard.ads b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/gma-mainboard.ads new file mode 100644 index 0000000000..21de0db952 --- /dev/null +++ b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/gma-mainboard.ads @@ -0,0 +1,18 @@ +-- SPDX-License-Identifier: GPL-2.0-or-later + +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 := + (DP1, -- both on board and dock DP are DP1/HDMI1 + HDMI1, + Analog, + LVDS, + others => Disabled); + +end GMA.Mainboard; diff --git a/src/mainboard/hp/snb_ivb_laptops/variants/2560p/gpio.c b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/gpio.c new file mode 100644 index 0000000000..30fd1f76e9 --- /dev/null +++ b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/gpio.c @@ -0,0 +1,224 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include + +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_NATIVE, + .gpio6 = GPIO_MODE_GPIO, + .gpio7 = GPIO_MODE_GPIO, + .gpio8 = GPIO_MODE_GPIO, + .gpio9 = GPIO_MODE_NATIVE, + .gpio10 = GPIO_MODE_GPIO, + .gpio11 = GPIO_MODE_GPIO, + .gpio12 = GPIO_MODE_NATIVE, + .gpio13 = GPIO_MODE_GPIO, + .gpio14 = GPIO_MODE_GPIO, + .gpio15 = GPIO_MODE_GPIO, + .gpio16 = GPIO_MODE_GPIO, + .gpio17 = GPIO_MODE_GPIO, + .gpio18 = GPIO_MODE_GPIO, + .gpio19 = GPIO_MODE_NATIVE, + .gpio20 = GPIO_MODE_NATIVE, + .gpio21 = GPIO_MODE_GPIO, + .gpio22 = GPIO_MODE_GPIO, + .gpio23 = GPIO_MODE_GPIO, + .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_NATIVE, + .gpio31 = GPIO_MODE_NATIVE, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_direction = { + .gpio0 = GPIO_DIR_OUTPUT, + .gpio1 = GPIO_DIR_INPUT, + .gpio2 = GPIO_DIR_INPUT, + .gpio3 = GPIO_DIR_INPUT, + .gpio4 = GPIO_DIR_INPUT, + .gpio6 = GPIO_DIR_INPUT, + .gpio7 = GPIO_DIR_INPUT, + .gpio8 = GPIO_DIR_INPUT, + .gpio10 = GPIO_DIR_INPUT, + .gpio11 = GPIO_DIR_OUTPUT, + .gpio13 = GPIO_DIR_INPUT, + .gpio14 = GPIO_DIR_INPUT, + .gpio15 = GPIO_DIR_INPUT, + .gpio16 = GPIO_DIR_INPUT, + .gpio17 = GPIO_DIR_OUTPUT, + .gpio18 = GPIO_DIR_INPUT, + .gpio21 = GPIO_DIR_INPUT, + .gpio22 = GPIO_DIR_OUTPUT, + .gpio23 = GPIO_DIR_INPUT, + .gpio24 = GPIO_DIR_OUTPUT, + .gpio27 = GPIO_DIR_OUTPUT, + .gpio28 = GPIO_DIR_OUTPUT, + .gpio29 = GPIO_DIR_OUTPUT, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_level = { + .gpio0 = GPIO_LEVEL_LOW, + .gpio11 = GPIO_LEVEL_LOW, + .gpio17 = GPIO_LEVEL_HIGH, + .gpio22 = GPIO_LEVEL_HIGH, + .gpio24 = GPIO_LEVEL_HIGH, + .gpio27 = 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, + .gpio30 = GPIO_RESET_RSMRST, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_invert = { + .gpio1 = GPIO_INVERT, + .gpio3 = GPIO_INVERT, + .gpio6 = GPIO_INVERT, + .gpio7 = GPIO_INVERT, + .gpio10 = GPIO_INVERT, + .gpio13 = GPIO_INVERT, + .gpio14 = 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_GPIO, + .gpio38 = GPIO_MODE_GPIO, + .gpio39 = GPIO_MODE_GPIO, + .gpio40 = GPIO_MODE_NATIVE, + .gpio41 = GPIO_MODE_NATIVE, + .gpio42 = GPIO_MODE_NATIVE, + .gpio43 = GPIO_MODE_NATIVE, + .gpio44 = GPIO_MODE_GPIO, + .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_GPIO, + .gpio60 = GPIO_MODE_GPIO, + .gpio61 = GPIO_MODE_GPIO, + .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_OUTPUT, + .gpio37 = GPIO_DIR_OUTPUT, + .gpio38 = GPIO_DIR_INPUT, + .gpio39 = GPIO_DIR_INPUT, + .gpio44 = GPIO_DIR_INPUT, + .gpio48 = GPIO_DIR_INPUT, + .gpio49 = GPIO_DIR_OUTPUT, + .gpio50 = GPIO_DIR_INPUT, + .gpio51 = GPIO_DIR_INPUT, + .gpio52 = GPIO_DIR_INPUT, + .gpio53 = GPIO_DIR_OUTPUT, + .gpio54 = GPIO_DIR_INPUT, + .gpio55 = GPIO_DIR_INPUT, + .gpio57 = GPIO_DIR_OUTPUT, + .gpio59 = GPIO_DIR_INPUT, + .gpio60 = GPIO_DIR_OUTPUT, + .gpio61 = GPIO_DIR_OUTPUT, +}; + +static const struct pch_gpio_set2 pch_gpio_set2_level = { + .gpio33 = GPIO_LEVEL_LOW, + .gpio35 = GPIO_LEVEL_LOW, + .gpio36 = GPIO_LEVEL_LOW, + .gpio37 = GPIO_LEVEL_LOW, + .gpio49 = GPIO_LEVEL_LOW, + .gpio53 = GPIO_LEVEL_HIGH, + .gpio57 = GPIO_LEVEL_HIGH, + .gpio60 = GPIO_LEVEL_HIGH, + .gpio61 = 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_GPIO, + .gpio73 = GPIO_MODE_NATIVE, + .gpio74 = GPIO_MODE_GPIO, + .gpio75 = GPIO_MODE_NATIVE, +}; + +static const struct pch_gpio_set3 pch_gpio_set3_direction = { + .gpio68 = GPIO_DIR_OUTPUT, + .gpio69 = GPIO_DIR_INPUT, + .gpio70 = GPIO_DIR_OUTPUT, + .gpio71 = GPIO_DIR_OUTPUT, + .gpio72 = GPIO_DIR_OUTPUT, + .gpio74 = GPIO_DIR_OUTPUT, +}; + +static const struct pch_gpio_set3 pch_gpio_set3_level = { + .gpio68 = GPIO_LEVEL_HIGH, + .gpio70 = GPIO_LEVEL_HIGH, + .gpio71 = GPIO_LEVEL_HIGH, + .gpio72 = GPIO_LEVEL_LOW, + .gpio74 = GPIO_LEVEL_HIGH, +}; + +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/hp/snb_ivb_laptops/variants/2560p/hda_verb.c b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/hda_verb.c new file mode 100644 index 0000000000..eba1fb9729 --- /dev/null +++ b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/hda_verb.c @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include + +const u32 cim_verb_data[] = { + 0x111d7605, /* Codec Vendor / Device ID: IDT */ + 0x103c162b, /* Subsystem ID */ + 11, /* Number of 4 dword sets */ + AZALIA_SUBVENDOR(0, 0x103c162b), + AZALIA_PIN_CFG(0, 0x0a, 0x40f000f0), + AZALIA_PIN_CFG(0, 0x0b, 0x0421401f), + AZALIA_PIN_CFG(0, 0x0c, 0x04a11020), + AZALIA_PIN_CFG(0, 0x0d, 0x90170110), + AZALIA_PIN_CFG(0, 0x0e, 0x40f000f0), + AZALIA_PIN_CFG(0, 0x0f, 0x40f000f0), + AZALIA_PIN_CFG(0, 0x10, 0x40f000f0), + AZALIA_PIN_CFG(0, 0x11, 0x90a60130), + AZALIA_PIN_CFG(0, 0x1f, 0x40f000f0), + AZALIA_PIN_CFG(0, 0x20, 0x40f000f0), + + 0x11c11040, /* Codec Vendor / Device ID: LSI */ + 0x103c3066, /* Subsystem ID */ + 1, /* Number of 4 dword sets */ + AZALIA_SUBVENDOR(1, 0x103c3066), + + 0x80862805, /* Codec Vendor / Device ID: Intel */ + 0x80860101, /* Subsystem ID */ + 4, /* Number of 4 dword sets */ + AZALIA_SUBVENDOR(3, 0x80860101), + AZALIA_PIN_CFG(3, 0x05, 0x18560010), + AZALIA_PIN_CFG(3, 0x06, 0x58560020), + AZALIA_PIN_CFG(3, 0x07, 0x18560030), + +}; + +const u32 pc_beep_verbs[0] = {}; + +AZALIA_ARRAY_SIZES; diff --git a/src/mainboard/hp/snb_ivb_laptops/variants/2560p/overridetree.cb b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/overridetree.cb new file mode 100644 index 0000000000..d69a21e9a1 --- /dev/null +++ b/src/mainboard/hp/snb_ivb_laptops/variants/2560p/overridetree.cb @@ -0,0 +1,52 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +chip northbridge/intel/sandybridge + register "gpu_cpu_backlight" = "0x00000155" + register "gpu_pch_backlight" = "0x02880288" + + device domain 0 on + subsystemid 0x103c 0x162b inherit + + device pci 01.0 off end # PEG + device pci 02.0 on end # iGPU + + chip southbridge/intel/bd82x6x # Intel Series 6 Cougar Point PCH + # mailbox at 0x200/0x201 and PM1 at 0x220 + register "gen1_dec" = "0x007c0201" + register "gen2_dec" = "0x000c0101" + register "gen3_dec" = "0x00fcfe01" + register "gen4_dec" = "0x000402e9" + register "gpi6_routing" = "2" + register "pcie_hotplug_map" = "{ 0, 1, 0, 0, 0, 0, 0, 0 }" + # HDD(0), ODD(1), eSATA(4), dock eSATA(5) + register "sata_port_map" = "0x33" + + device pci 1c.0 off end # PCIe Port #1 + device pci 1c.1 on # PCIe Port #2, ExpressCard + smbios_slot_desc "SlotTypePcmcia" "SlotLengthShort" + "ExpressCard Slot" "SlotDataBusWidth1X" + end + device pci 1c.2 on end # PCIe Port #3, SD/MMC Host Controller + device pci 1c.3 on # PCIe Port #4, WLAN + smbios_slot_desc "SlotTypePciExpressMini52pinWithoutBSKO" + "SlotLengthShort" "Mini PCIe" "SlotDataBusWidth1X" + end + device pci 1c.4 off end # PCIe Port #5 + device pci 1c.5 off end # PCIe Port #6 + device pci 1c.6 on # PCIe Port #7, WWAN + smbios_slot_desc "SlotTypePciExpressMini52pinWithoutBSKO" + "SlotLengthLong" "Mini PCIe" "SlotDataBusWidth1X" + end + device pci 1c.7 off end # PCIe Port #8 + device pci 1f.0 on # LPC bridge + chip ec/hp/kbc1126 + register "ec_data_port" = "0x60" + register "ec_cmd_port" = "0x64" + register "ec_ctrl_reg" = "0xca" + register "ec_fan_ctrl_value" = "0x6b" + device pnp ff.1 off end + end + end + end + end +end