From a70493d5b2edadc221f59582aaaba96c72e304fc Mon Sep 17 00:00:00 2001 From: Joel Linn Date: Sat, 2 Mar 2024 13:59:52 +0100 Subject: [PATCH] mb/hp: Add Pro 3500 series (Sandy/Ivy Bridge) This is another readily available (used market) system. Based on autoport. * All peripherals should work. * Automatic fan control as well as S3 are working. * The board was tested to boot Linux and Windows. EHCI debug is untested. * When using MrChromebox edk2 with secure boot build in, the board will hang on each boot for about 20 seconds before continuing. There are some quirks for doing the first flash, see the documentation. Change-Id: Idf793fe915096cf2553572964faec5c7f8526b9a Signed-off-by: Joel Linn Reviewed-on: https://review.coreboot.org/c/coreboot/+/81368 Tested-by: build bot (Jenkins) Reviewed-by: Nico Huber Reviewed-by: Angel Pons Reviewed-by: Felix Singer --- Documentation/mainboard/hp/pro_3500_series.md | 103 ++++++++++ .../mainboard/hp/pro_3500_series_flash.avif | Bin 0 -> 38286 bytes .../mainboard/hp/pro_3500_series_jumper.avif | Bin 0 -> 35758 bytes Documentation/mainboard/index.md | 1 + src/mainboard/hp/pro_3500_series/Kconfig | 37 ++++ src/mainboard/hp/pro_3500_series/Kconfig.name | 4 + src/mainboard/hp/pro_3500_series/Makefile.mk | 12 ++ src/mainboard/hp/pro_3500_series/acpi/ec.asl | 3 + .../hp/pro_3500_series/acpi/platform.asl | 10 + .../hp/pro_3500_series/acpi/superio.asl | 18 ++ .../hp/pro_3500_series/acpi_tables.c | 10 + .../hp/pro_3500_series/board_info.txt | 6 + .../hp/pro_3500_series/common_defines.h | 12 ++ src/mainboard/hp/pro_3500_series/data.vbt | Bin 0 -> 7168 bytes .../hp/pro_3500_series/devicetree.cb | 95 +++++++++ src/mainboard/hp/pro_3500_series/dsdt.asl | 30 +++ src/mainboard/hp/pro_3500_series/early_init.c | 40 ++++ .../hp/pro_3500_series/gma-mainboard.ads | 16 ++ src/mainboard/hp/pro_3500_series/gpio.c | 189 ++++++++++++++++++ src/mainboard/hp/pro_3500_series/hda_verb.c | 25 +++ src/mainboard/hp/pro_3500_series/led.c | 17 ++ src/mainboard/hp/pro_3500_series/led.h | 17 ++ src/mainboard/hp/pro_3500_series/mainboard.c | 33 +++ src/mainboard/hp/pro_3500_series/smihandler.c | 31 +++ 24 files changed, 709 insertions(+) create mode 100644 Documentation/mainboard/hp/pro_3500_series.md create mode 100644 Documentation/mainboard/hp/pro_3500_series_flash.avif create mode 100644 Documentation/mainboard/hp/pro_3500_series_jumper.avif create mode 100644 src/mainboard/hp/pro_3500_series/Kconfig create mode 100644 src/mainboard/hp/pro_3500_series/Kconfig.name create mode 100644 src/mainboard/hp/pro_3500_series/Makefile.mk create mode 100644 src/mainboard/hp/pro_3500_series/acpi/ec.asl create mode 100644 src/mainboard/hp/pro_3500_series/acpi/platform.asl create mode 100644 src/mainboard/hp/pro_3500_series/acpi/superio.asl create mode 100644 src/mainboard/hp/pro_3500_series/acpi_tables.c create mode 100644 src/mainboard/hp/pro_3500_series/board_info.txt create mode 100644 src/mainboard/hp/pro_3500_series/common_defines.h create mode 100644 src/mainboard/hp/pro_3500_series/data.vbt create mode 100644 src/mainboard/hp/pro_3500_series/devicetree.cb create mode 100644 src/mainboard/hp/pro_3500_series/dsdt.asl create mode 100644 src/mainboard/hp/pro_3500_series/early_init.c create mode 100644 src/mainboard/hp/pro_3500_series/gma-mainboard.ads create mode 100644 src/mainboard/hp/pro_3500_series/gpio.c create mode 100644 src/mainboard/hp/pro_3500_series/hda_verb.c create mode 100644 src/mainboard/hp/pro_3500_series/led.c create mode 100644 src/mainboard/hp/pro_3500_series/led.h create mode 100644 src/mainboard/hp/pro_3500_series/mainboard.c create mode 100644 src/mainboard/hp/pro_3500_series/smihandler.c diff --git a/Documentation/mainboard/hp/pro_3500_series.md b/Documentation/mainboard/hp/pro_3500_series.md new file mode 100644 index 0000000000..241b5677af --- /dev/null +++ b/Documentation/mainboard/hp/pro_3500_series.md @@ -0,0 +1,103 @@ +# HP Pro 3500 Series + +This page describes how to run coreboot on the [Pro 3500 Series] +desktop from [HP]. + +## State + +All peripherals should work. Automatic fan control as well as S3 are +working. The board was tested to boot Linux and Windows. EHCI debug +is untested. When using MrChromebox edk2 with secure boot build in, the +board will hang on each boot for about 20 seconds before continuing. +With disabled ME, the SuperIO will not get CPU temperatures via PECI and +therefore the automatic fan control will not increase the fan speed. + +## Flashing coreboot + +```{eval_rst} ++---------------------+-------------------------+ +| Type | Value | ++=====================+=========================+ +| Socketed flash | No | ++---------------------+-------------------------+ +| Model | W25Q64FVSIG | ++---------------------+-------------------------+ +| Size | 8 MiB | ++---------------------+-------------------------+ +| In circuit flashing | Yes | ++---------------------+-------------------------+ +| Package | SOIC-8 | ++---------------------+-------------------------+ +| Write protection | See below | ++---------------------+-------------------------+ +| Dual BIOS feature | No | ++---------------------+-------------------------+ +| Internal flashing | Yes | ++---------------------+-------------------------+ +``` + +### Flash layout +The original layout of the flash should look like this: +``` +00000000:00000fff fd +00400000:007fffff bios +00001000:003fffff me +00fff000:00000fff gbe +00fff000:00000fff pd +``` + +### Internal programming + +The SPI flash can be accessed using [flashrom] (although it reports as +"N25Q064..3E", it works fine). + +With a missing FDO jumper, `fd` region is read-only, `bios` region is +read-write and `me` region is locked. Vendor firmware will additionally +protect the flash chip. After shorting the FDO jumper (E2) full +read-write access is granted. + +Do **NOT shutdown** the operating system **after flashing** coreboot +from the vendor firmware! This will brick your device because the bios +region will be modified on shutdown. Cut the AC power or do a restart +from the OS. + +**Position of FDO jumper (E2) close to the F_USB3** +![][pro_3500_jumper] + +[pro_3500_jumper]: pro_3500_series_jumper.avif + +### External programming + +External programming with an SPI adapter and [flashrom] does work, but +it powers the whole southbridge complex. The average current will be +400mA but spikes may be higher. Connect the power to the flash or the +programming header next to the flash otherwise programming is unstable. +The supply needs to quickly reach 3V3 or else the chip is also unstable +until cleanly power cycled. + +**Position of SOIC-8 flash and pin-header near ATX power connector** +![][pro_3500_flash] + +[pro_3500_flash]: pro_3500_series_flash.avif + +## Technology + +```{eval_rst} ++------------------+--------------------------------------------------+ +| Northbridge | :doc:`../../northbridge/intel/sandybridge/index` | ++------------------+--------------------------------------------------+ +| Southbridge | bd82x6x (bd82h61) | ++------------------+--------------------------------------------------+ +| CPU | model_206ax | ++------------------+--------------------------------------------------+ +| SuperIO | IT8779E (identifies as IT8772F via register) | ++------------------+--------------------------------------------------+ +| EC | Fixed function as part of SuperIO | ++------------------+--------------------------------------------------+ +| Coprocessor | Intel ME | ++------------------+--------------------------------------------------+ +``` + +[Pro 3500 Series]: https://support.hp.com/us-en/document/c03364089 +[HP]: https://www.hp.com/ +[flashrom]: https://flashrom.org/Flashrom diff --git a/Documentation/mainboard/hp/pro_3500_series_flash.avif b/Documentation/mainboard/hp/pro_3500_series_flash.avif new file mode 100644 index 0000000000000000000000000000000000000000..764feb1ad5fe4756340a989ef3d9b9c0b5457498 GIT binary patch literal 38286 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 literal 0 HcmV?d00001 diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index 6178738645..7559628f2e 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -127,6 +127,7 @@ GA-H61M-S2PV Compaq 8200 Elite SFF Compaq Elite 8300 USDT +Pro 3500 Series Z220 Workstation SFF ``` diff --git a/src/mainboard/hp/pro_3500_series/Kconfig b/src/mainboard/hp/pro_3500_series/Kconfig new file mode 100644 index 0000000000..ab77654b39 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/Kconfig @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +if BOARD_HP_PRO_3500_SERIES + +config BOARD_SPECIFIC_OPTIONS + def_bool y + select BOARD_ROMSIZE_KB_8192 + select HAVE_ACPI_RESUME + select HAVE_ACPI_TABLES + select INTEL_GMA_HAVE_VBT + select MAINBOARD_HAS_LIBGFXINIT + select MAINBOARD_USES_IFD_GBE_REGION + select NORTHBRIDGE_INTEL_SANDYBRIDGE + select NO_UART_ON_SUPERIO + select SERIRQ_CONTINUOUS_MODE + select SOUTHBRIDGE_INTEL_BD82X6X + select SUPERIO_ITE_IT8772F + select USE_NATIVE_RAMINIT + +config CBFS_SIZE + default 0x400000 + +config MAINBOARD_DIR + default "hp/pro_3500_series" + +config MAINBOARD_PART_NUMBER + default "Pro 3500 Series" + +config VGA_BIOS_ID + default "8086,0152" + +config DRAM_RESET_GATE_GPIO + default 60 + +config USBDEBUG_HCD_INDEX + default 2 +endif diff --git a/src/mainboard/hp/pro_3500_series/Kconfig.name b/src/mainboard/hp/pro_3500_series/Kconfig.name new file mode 100644 index 0000000000..fd1222c68a --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/Kconfig.name @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +config BOARD_HP_PRO_3500_SERIES + bool "Pro 3500 Series" diff --git a/src/mainboard/hp/pro_3500_series/Makefile.mk b/src/mainboard/hp/pro_3500_series/Makefile.mk new file mode 100644 index 0000000000..6554ed5e8c --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/Makefile.mk @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +bootblock-y += early_init.c +bootblock-y += gpio.c +bootblock-y += led.c + +romstage-y += early_init.c +romstage-y += gpio.c + +ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads + +smm-y += led.c diff --git a/src/mainboard/hp/pro_3500_series/acpi/ec.asl b/src/mainboard/hp/pro_3500_series/acpi/ec.asl new file mode 100644 index 0000000000..16990d45f4 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/acpi/ec.asl @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: CC-PDDC */ + +/* Please update the license if adding licensable material. */ diff --git a/src/mainboard/hp/pro_3500_series/acpi/platform.asl b/src/mainboard/hp/pro_3500_series/acpi/platform.asl new file mode 100644 index 0000000000..aff432b6f4 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/acpi/platform.asl @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +Method(_WAK, 1) +{ + Return(Package() {0, 0}) +} + +Method(_PTS, 1) +{ +} diff --git a/src/mainboard/hp/pro_3500_series/acpi/superio.asl b/src/mainboard/hp/pro_3500_series/acpi/superio.asl new file mode 100644 index 0000000000..829a391d27 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/acpi/superio.asl @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +/* Values should match those defined in devicetree.cb */ + +#undef SIO_ENABLE_FDC0 // pnp 2e.0: Disable Floppy Controller +#undef SIO_ENABLE_COM1 // pnp 2e.1: Disable Serial Port 1 +#undef SIO_ENABLE_PS2K // pnp 2e.5: Disable PS/2 Keyboard +#undef SIO_ENABLE_PS2M // pnp 2e.6: Disable PS/2 Mouse +#undef SIO_ENABLE_INFR // pnp 2e.a: Disable Consumer IR + +#define SIO_ENABLE_ENVC // pnp 2e.4: Enable Environmental Controller +#define SIO_ENVC_IO0 0xa30 // pnp 2e.4: io 0x60 +#define SIO_ENVC_IO1 0xa20 // pnp 2e.4: io 0x62 +#define SIO_ENABLE_GPIO // pnp 2e.7: Enable GPIO +#define SIO_GPIO_IO0 0x0 // pnp 2e.7: io 0x60 +#define SIO_GPIO_IO1 0xa00 // pnp 2e.7: io 0x62 + +#include diff --git a/src/mainboard/hp/pro_3500_series/acpi_tables.c b/src/mainboard/hp/pro_3500_series/acpi_tables.c new file mode 100644 index 0000000000..230584ee4a --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/acpi_tables.c @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +void mainboard_fill_gnvs(struct global_nvs *gnvs) +{ + gnvs->tcrt = 100; + gnvs->tpsv = 90; +} diff --git a/src/mainboard/hp/pro_3500_series/board_info.txt b/src/mainboard/hp/pro_3500_series/board_info.txt new file mode 100644 index 0000000000..178039429c --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/board_info.txt @@ -0,0 +1,6 @@ +Category: desktop +ROM package: SOIC-8 +ROM protocol: SPI +ROM socketed: n +Flashrom support: y +Release year: 2012 diff --git a/src/mainboard/hp/pro_3500_series/common_defines.h b/src/mainboard/hp/pro_3500_series/common_defines.h new file mode 100644 index 0000000000..e3c25ca442 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/common_defines.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __MAINBOARD_COMMON_DEFINES_H +#define __MAINBOARD_COMMON_DEFINES_H + +#include + +#define IT8772F_BASE 0x2e +#define EC_DEV PNP_DEV(IT8772F_BASE, IT8772F_EC) +#define GPIO_DEV PNP_DEV(IT8772F_BASE, IT8772F_GPIO) + +#endif /* __MAINBOARD_COMMON_DEFINES_H */ diff --git a/src/mainboard/hp/pro_3500_series/data.vbt b/src/mainboard/hp/pro_3500_series/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..7309d99cc52bb94dd2f7d4b783f31b9b42517882 GIT binary patch literal 7168 zcmeHKZ){Ul6hF6p{dfD`*1b*W>R8T@KsVU-R>m@ysjpo(*HN}^ElnjxHfUiaV~p}A zkcca~2*!j|V-OKdqX|Ji5k8sd2R`Xy)GWjpWBfpf9}FRe55z=*)bn0nH((2Ej6_U& zUw-eLdwSn*_x|oV_r0x&2Vxi<477&gf#zUubaQMdk^}{wul$JO3%Kjqv<`n z#}A^nrxAUMqBIj>8|qWWo_*=57W7X{;D|Qn0FI;%q|%2|$rg!g1XsW=Fb2#5w&N;e zfBC>+XQEx`x2s+|TA1KxY6HWdph`^WWkOO=LriUC7#7qu0&Wn{1ty7^1b~M7lts;_ zSh1n*2yk^ATrT1LYM{Wa?-+nZ`#}JP?p{e-0#_)wPzzkq5#2J$R zK*I-mOLQLB0HF>PUwcPqSGO7n_Vo{hBO|eRV%y7^IkPs(~6OP$9oFKeI_>gdcaGCHW;VZ&VgzJQxgg*#i=fDXy zgnELP;3ISs`UnxiHbRmxNw6M*yLnRvY`RJrX4tBN1(yJ)8XpWH7+Gyx!szGoj#29R=z4s2 z{;8IaPkM8nhlUJI(x?X1=F2Qot28^`GUVMqz+_23dcgdXMdx9LVtn2%J3y?40jhkn zy?aK~pV|tLKT+WT_K{^9{Ap>1%D2H$IOFD7|4qlCpFJfrRxND4Eb7@;e6;3cuzCs| zTX!+|u>CK8S+SXNz^oUuT`L>CDKixS;l9ZB$k=3RVsLD4s>II9en{4W>W8(8`(#If z%&j!RnPE^=WvaRmslU*AtDmyOuRP{-@+W7gmbpr>}2(m=@o=3<(|*i zb-<5~Oct-La@j{$7oMpvCE|6Hs0Wt(BaQEY`CSKo?vTH6@E;s_$03WHui)6t*NJ?s zh+$EFMdafmo)YDp$S;aGC(74Fep5tQlGjMQMZ%aQ?~?eGgr_C>g2XRNQqwIVW4gvN zRg|BU1@^Q^yO=PEy1mU@WG$8J=$)~6`II zHZ9MvxDvF4E+j8~+z1*&_aj%axN@{Y(BG`$5sRlJh9fxaajCBP+S3Y1Kix`XSX`?b zgZ^bDs@6*-%wchDYo)6nIbz&Wijun;;unXZUg^skd*LP}v-+V+Qz=DB<3tLCFH}|#@yWS%xWd_!OD3C zGdT4*sMb;#lqPj{bS9~|hmG%NT7?<(SETq4b5duJ^f`b9OIXDX59A`aQW2G&g;iv! z9(5%<^?Z1AZJN3=?){z3YNB~zFU(L`n1dax%hyGt3ZogQ9(B2@7UlphouR}x)&FML z`u$)XaIJ&H#erG+s(mc?{6lTSQ}9+FsTl$eTOmUK>uzAD;Wz#0DhOV_mlY^0P*$L< XKv{vZ0%Zlt3X~NnD^OP8Nmt-+M + +DefinitionBlock( + "dsdt.aml", + "DSDT", + ACPI_DSDT_REV_2, + OEM_ID, + ACPI_TABLE_CREATOR, + 0x20141018 +) +{ + #include + #include "acpi/platform.asl" + #include + #include + #include + #include + + Device (\_SB.PCI0) + { + #include + #include + #include + } +} diff --git a/src/mainboard/hp/pro_3500_series/early_init.c b/src/mainboard/hp/pro_3500_series/early_init.c new file mode 100644 index 0000000000..fbf73cfbf8 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/early_init.c @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include "common_defines.h" +#include "led.h" + +const struct southbridge_usb_port mainboard_usb_ports[] = { + { 1, 6, 0 }, + { 1, 6, 0 }, + { 1, 6, 1 }, + { 1, 9, 1 }, + { 1, 10, 2 }, + { 1, 11, 2 }, + { 1, 6, 3 }, + { 1, 6, 3 }, + { 1, 6, 4 }, + { 1, 12, 4 }, + { 1, 6, 6 }, + { 1, 11, 5 }, + { 1, 6, 5 }, + { 1, 6, 6 }, +}; + +void bootblock_mainboard_early_init(void) +{ + pci_write_config16(PCH_LPC_DEV, LPC_EN, CNF1_LPC_EN | KBC_LPC_EN); + + /* Early SuperIO setup */ + ite_conf_clkin(GPIO_DEV, ITE_UART_CLK_PREDIVIDE_24); + /* Clear when resuming from S3: */ + ite_disable_3vsbsw(GPIO_DEV); + ite_disable_pme_out(EC_DEV); + ite_ac_resume_southbridge(EC_DEV); + + set_power_led(LED_WHITE); +} diff --git a/src/mainboard/hp/pro_3500_series/gma-mainboard.ads b/src/mainboard/hp/pro_3500_series/gma-mainboard.ads new file mode 100644 index 0000000000..c9e4326924 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/gma-mainboard.ads @@ -0,0 +1,16 @@ +-- 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 := + (HDMI1, + Analog, + others => Disabled); + +end GMA.Mainboard; diff --git a/src/mainboard/hp/pro_3500_series/gpio.c b/src/mainboard/hp/pro_3500_series/gpio.c new file mode 100644 index 0000000000..3ab365fbf2 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/gpio.c @@ -0,0 +1,189 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +static const struct pch_gpio_set1 pch_gpio_set1_mode = { + .gpio0 = GPIO_MODE_GPIO, + .gpio1 = GPIO_MODE_GPIO, + .gpio2 = GPIO_MODE_NATIVE, + .gpio3 = GPIO_MODE_NATIVE, + .gpio4 = GPIO_MODE_NATIVE, + .gpio5 = GPIO_MODE_NATIVE, + .gpio6 = GPIO_MODE_GPIO, + .gpio7 = GPIO_MODE_GPIO, + .gpio8 = GPIO_MODE_GPIO, + .gpio9 = GPIO_MODE_NATIVE, + .gpio10 = GPIO_MODE_NATIVE, + .gpio11 = GPIO_MODE_NATIVE, + .gpio12 = GPIO_MODE_GPIO, + .gpio13 = GPIO_MODE_GPIO, + .gpio14 = GPIO_MODE_NATIVE, + .gpio15 = GPIO_MODE_GPIO, + .gpio16 = GPIO_MODE_GPIO, + .gpio17 = GPIO_MODE_GPIO, + .gpio18 = GPIO_MODE_NATIVE, + .gpio19 = GPIO_MODE_NATIVE, + .gpio20 = GPIO_MODE_NATIVE, + .gpio21 = GPIO_MODE_NATIVE, + .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_NATIVE, + .gpio31 = GPIO_MODE_GPIO, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_direction = { + .gpio0 = GPIO_DIR_INPUT, + .gpio1 = GPIO_DIR_INPUT, + .gpio6 = GPIO_DIR_INPUT, + .gpio7 = GPIO_DIR_INPUT, + .gpio8 = GPIO_DIR_OUTPUT, + .gpio12 = GPIO_DIR_OUTPUT, + .gpio13 = GPIO_DIR_INPUT, + .gpio15 = GPIO_DIR_OUTPUT, + .gpio16 = GPIO_DIR_INPUT, + .gpio17 = GPIO_DIR_INPUT, + .gpio22 = GPIO_DIR_INPUT, + .gpio24 = GPIO_DIR_OUTPUT, + .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, + .gpio12 = GPIO_LEVEL_HIGH, + .gpio15 = GPIO_LEVEL_LOW, + .gpio24 = GPIO_LEVEL_LOW, + .gpio28 = GPIO_LEVEL_LOW, + .gpio29 = GPIO_LEVEL_HIGH, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_reset = { +}; + +static const struct pch_gpio_set1 pch_gpio_set1_invert = { +}; + +static const struct pch_gpio_set1 pch_gpio_set1_blink = { +}; + +static const struct pch_gpio_set2 pch_gpio_set2_mode = { + .gpio32 = GPIO_MODE_GPIO, + .gpio33 = GPIO_MODE_GPIO, + .gpio34 = GPIO_MODE_GPIO, + .gpio35 = GPIO_MODE_NATIVE, + .gpio36 = GPIO_MODE_GPIO, + .gpio37 = GPIO_MODE_GPIO, + .gpio38 = GPIO_MODE_GPIO, + .gpio39 = GPIO_MODE_NATIVE, + .gpio40 = GPIO_MODE_NATIVE, + .gpio41 = GPIO_MODE_NATIVE, + .gpio42 = GPIO_MODE_NATIVE, + .gpio43 = GPIO_MODE_GPIO, + .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_NATIVE, + .gpio51 = GPIO_MODE_NATIVE, + .gpio52 = GPIO_MODE_NATIVE, + .gpio53 = GPIO_MODE_NATIVE, + .gpio54 = GPIO_MODE_NATIVE, + .gpio55 = GPIO_MODE_NATIVE, + .gpio56 = GPIO_MODE_NATIVE, + .gpio57 = GPIO_MODE_GPIO, + .gpio58 = GPIO_MODE_NATIVE, + .gpio59 = GPIO_MODE_NATIVE, + .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 = { + .gpio32 = GPIO_DIR_OUTPUT, + .gpio33 = GPIO_DIR_OUTPUT, + .gpio34 = GPIO_DIR_INPUT, + .gpio36 = GPIO_DIR_INPUT, + .gpio37 = GPIO_DIR_INPUT, + .gpio38 = GPIO_DIR_INPUT, + .gpio43 = GPIO_DIR_INPUT, + .gpio48 = GPIO_DIR_INPUT, + .gpio49 = GPIO_DIR_OUTPUT, + .gpio57 = GPIO_DIR_OUTPUT, + .gpio60 = GPIO_DIR_OUTPUT, + .gpio61 = GPIO_DIR_OUTPUT, +}; + +static const struct pch_gpio_set2 pch_gpio_set2_level = { + .gpio32 = GPIO_LEVEL_HIGH, + .gpio33 = GPIO_LEVEL_HIGH, + .gpio49 = GPIO_LEVEL_HIGH, + .gpio57 = GPIO_LEVEL_HIGH, + .gpio60 = GPIO_LEVEL_LOW, + .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_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, + .gpio72 = 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/hp/pro_3500_series/hda_verb.c b/src/mainboard/hp/pro_3500_series/hda_verb.c new file mode 100644 index 0000000000..4b3104e052 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/hda_verb.c @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +const u32 cim_verb_data[] = { + 0x10ec0662, /* Codec Vendor / Device ID: Realtek */ + 0x103c2abf, /* Subsystem ID */ + 11, /* Number of 4 dword sets */ + AZALIA_SUBVENDOR(0, 0x103c2abf), + AZALIA_PIN_CFG(0, 0x14, 0x01014010), + AZALIA_PIN_CFG(0, 0x15, 0x411111f0), + AZALIA_PIN_CFG(0, 0x16, 0x411111f0), + AZALIA_PIN_CFG(0, 0x18, 0x01a19830), + AZALIA_PIN_CFG(0, 0x19, 0x02a19831), + AZALIA_PIN_CFG(0, 0x1a, 0x0181303f), + AZALIA_PIN_CFG(0, 0x1b, 0x0221401f), + AZALIA_PIN_CFG(0, 0x1c, 0x411111f0), + AZALIA_PIN_CFG(0, 0x1d, 0x4004c601), + AZALIA_PIN_CFG(0, 0x1e, 0x411111f0), + +}; + +const u32 pc_beep_verbs[0] = {}; + +AZALIA_ARRAY_SIZES; diff --git a/src/mainboard/hp/pro_3500_series/led.c b/src/mainboard/hp/pro_3500_series/led.c new file mode 100644 index 0000000000..073f5f501f --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/led.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include "common_defines.h" +#include "led.h" + +void set_power_led(int state) +{ + // Board has a dual color LED + it8772f_gpio_setup( + GPIO_DEV, + 2, /* set */ + 0xf3 | LED_BOTH, /* select, 0xf3 is default */ + state, /* polarity */ + 0x00, /* pullup */ + LED_BOTH, /* output */ + 0x00); /* enable */ +} diff --git a/src/mainboard/hp/pro_3500_series/led.h b/src/mainboard/hp/pro_3500_series/led.h new file mode 100644 index 0000000000..b0e7595f11 --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/led.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __MAINBOARD_LED_H +#define __MAINBOARD_LED_H + +#ifndef __ACPI__ +void set_power_led(int state); + +enum { + LED_WHITE = 1 << 2, // GPIO 22 + LED_YELLOW = 1 << 3, // GPIO 23 + LED_BOTH = LED_WHITE | LED_YELLOW, + LED_OFF = LED_BOTH +}; +#endif + +#endif /* __MAINBOARD_LED_H */ diff --git a/src/mainboard/hp/pro_3500_series/mainboard.c b/src/mainboard/hp/pro_3500_series/mainboard.c new file mode 100644 index 0000000000..a3b7504e7f --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/mainboard.c @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include + +static u8 cpu_get_temp_offset(void) +{ + msr_t msr = rdmsr(MSR_TEMPERATURE_TARGET); + u8 tj_max = (msr.lo >> 16) & 0xFF; + u8 tcc_offset = (msr.lo >> 24) & 0xf; + + msr = rdmsr(MSR_PLATFORM_INFO); + if (msr.lo & (1 << 30)) { + return tj_max - tcc_offset; + } else { + return tj_max; + } +} + +static void mainboard_enable(struct device *dev) +{ + /* Set PECI TMPIN 3 offset to TJ_MAX temperature */ + struct superio_ite_it8772f_config *const config = __pnp_002e_04->chip_info; + if (config) + config->ec.tmpin[2].offset = cpu_get_temp_offset(); +} + +struct chip_operations mainboard_ops = { + .enable_dev = mainboard_enable, +}; diff --git a/src/mainboard/hp/pro_3500_series/smihandler.c b/src/mainboard/hp/pro_3500_series/smihandler.c new file mode 100644 index 0000000000..a11db5dacb --- /dev/null +++ b/src/mainboard/hp/pro_3500_series/smihandler.c @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include "common_defines.h" +#include "led.h" + +/* Change power led state based on sleep type. */ +void mainboard_smi_sleep(u8 slp_typ) +{ + printk(BIOS_DEBUG, "SMI: sleep S%d\n", slp_typ); + switch (slp_typ) { + case ACPI_S3: + /* + * Vendor firmware also only enables this when entering sleep. + * This saves some power when entering S5 via shutdown. + */ + ite_enable_3vsbsw(GPIO_DEV); + set_power_led(LED_YELLOW); + break; + case ACPI_S4: + /* Without 3vsbsw enabled the LED will be off in any case */ + case ACPI_S5: + set_power_led(LED_OFF); + break; + default: + break; + } +}