From d00febc99bd83be74e6f1d2386e36eea5051578b Mon Sep 17 00:00:00 2001 From: Bill XIE Date: Thu, 26 Aug 2021 19:12:13 +0800 Subject: [PATCH] mb/supermicro: Add X9SAE and X9SAE-V Mainboard information can be found in the included documentation. Change-Id: I9dfc58bb99e14cd9dac2ac53afc0ea11d2252aa9 Signed-off-by: Bill XIE Reviewed-on: https://review.coreboot.org/c/coreboot/+/57191 Tested-by: build bot (Jenkins) Reviewed-by: Felix Held --- Documentation/mainboard/supermicro/x9sae.jpg | Bin 0 -> 47848 bytes Documentation/mainboard/supermicro/x9sae.md | 108 ++++++++++ src/mainboard/supermicro/x9sae/Kconfig | 31 +++ src/mainboard/supermicro/x9sae/Kconfig.name | 2 + src/mainboard/supermicro/x9sae/Makefile.inc | 8 + src/mainboard/supermicro/x9sae/acpi/ec.asl | 0 src/mainboard/supermicro/x9sae/acpi/pci.asl | 51 +++++ .../supermicro/x9sae/acpi/platform.asl | 10 + .../supermicro/x9sae/acpi/superio.asl | 0 src/mainboard/supermicro/x9sae/board_info.txt | 7 + src/mainboard/supermicro/x9sae/cmos.default | 6 + src/mainboard/supermicro/x9sae/cmos.layout | 86 ++++++++ src/mainboard/supermicro/x9sae/data.vbt | Bin 0 -> 3902 bytes src/mainboard/supermicro/x9sae/devicetree.cb | 125 ++++++++++++ src/mainboard/supermicro/x9sae/dsdt.asl | 29 +++ src/mainboard/supermicro/x9sae/early_init.c | 62 ++++++ .../supermicro/x9sae/gma-mainboard.ads | 17 ++ src/mainboard/supermicro/x9sae/gpio.c | 190 ++++++++++++++++++ src/mainboard/supermicro/x9sae/hda_verb.c | 37 ++++ src/mainboard/supermicro/x9sae/mainboard.c | 17 ++ 20 files changed, 786 insertions(+) create mode 100644 Documentation/mainboard/supermicro/x9sae.jpg create mode 100644 Documentation/mainboard/supermicro/x9sae.md create mode 100644 src/mainboard/supermicro/x9sae/Kconfig create mode 100644 src/mainboard/supermicro/x9sae/Kconfig.name create mode 100644 src/mainboard/supermicro/x9sae/Makefile.inc create mode 100644 src/mainboard/supermicro/x9sae/acpi/ec.asl create mode 100644 src/mainboard/supermicro/x9sae/acpi/pci.asl create mode 100644 src/mainboard/supermicro/x9sae/acpi/platform.asl create mode 100644 src/mainboard/supermicro/x9sae/acpi/superio.asl create mode 100644 src/mainboard/supermicro/x9sae/board_info.txt create mode 100644 src/mainboard/supermicro/x9sae/cmos.default create mode 100644 src/mainboard/supermicro/x9sae/cmos.layout create mode 100644 src/mainboard/supermicro/x9sae/data.vbt create mode 100644 src/mainboard/supermicro/x9sae/devicetree.cb create mode 100644 src/mainboard/supermicro/x9sae/dsdt.asl create mode 100644 src/mainboard/supermicro/x9sae/early_init.c create mode 100644 src/mainboard/supermicro/x9sae/gma-mainboard.ads create mode 100644 src/mainboard/supermicro/x9sae/gpio.c create mode 100644 src/mainboard/supermicro/x9sae/hda_verb.c create mode 100644 src/mainboard/supermicro/x9sae/mainboard.c diff --git a/Documentation/mainboard/supermicro/x9sae.jpg b/Documentation/mainboard/supermicro/x9sae.jpg new file mode 100644 index 0000000000000000000000000000000000000000..def99e1774e7ac14b59024e8d47fe7305a03483c GIT binary patch literal 47848 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�^WtJ)u5#`y3 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 WjGULwPruGjzs^QRLy&*>KmXY|eV3~M literal 0 HcmV?d00001 diff --git a/Documentation/mainboard/supermicro/x9sae.md b/Documentation/mainboard/supermicro/x9sae.md new file mode 100644 index 0000000000..ddc5ac7bca --- /dev/null +++ b/Documentation/mainboard/supermicro/x9sae.md @@ -0,0 +1,108 @@ +# Supermicro X9SAE and X9SAE-V + +This page describes how to run coreboot on the Supermicro [X9SAE] and [X9SAE-V] + +## Flashing coreboot + +```eval_rst ++---------------------+----------------+ +| Type | Value | ++=====================+================+ +| Socketed flash | occasionally | ++---------------------+----------------+ +| Model | W25Q128FVSG | ++---------------------+----------------+ +| Size | 16 MiB | ++---------------------+----------------+ +| Package | SOIC-8 | ++---------------------+----------------+ +| Write protection | no | ++---------------------+----------------+ +| Dual BIOS feature | no | ++---------------------+----------------+ +| Internal flashing | yes | ++---------------------+----------------+ +``` + +The flash IC is located between the PCH and the front panel connector, +(circled) sometimes it is socketed. +![](x9sae.jpg) + +### How to flash + +Unlike ordinary desktop boards, the BIOS version 2.00 of X9SAE-V does not +apply any write protection, so the main SPI flash can be accessed using +[flashrom], and the whole flash is writable. + +Note: If you are going to modify the ME region via internal programming, you had +better disable ME functionalities as much as possible in the vendor firmware +first, otherwise ME may write something back and break the firmware you write. + +The following command may be used to flash coreboot. (To do so, linux kernel +could be started with `iomem=relaxed` or unload the `lpc_ich` kernel module) + +Now you can [flash internally](/flash_tutorial/int_flashrom.md). It is +recommended to flash only the `bios` region (use `--ifd -i bios -N` flashrom +arguments), in order to minimize the chances of messing something up in the +beginning. + +The flash chip is a SOIC-8 SPI flash, and may be socketed, so it's also easy +to do in-system programming, or remove and flash externally if it is socketed. + +## Difference between X9SAE and X9SAE-V +On X9SAE PCI-E slot 4 is absent. Lane 9~16 of PCI-E slot 6 on X9SAE are wired +to slot 4 on X9SAE-V. Unlike ASUS P8C WS, there is no dynamic switch on X9SAE-V, +so on X9SAE-V slot 6 can work as x8 at most. + +On X9SAE-V device pci 01.1 appears even if not defined in devicetree.cb, so it +seems that it shall not appear on X9SAE even if it is defined. + +## Working (on my X9SAE-V) +- Intel Xeon E3-1225 V2 with 4 M391B1G73BH0-YK0 UDIMMs, ECC confirmed active +- PS/2 keyboard with SeaBIOS 1.14.0 and Debian GNU/Linux with kernel 5.10.46 +- Use PS/2 keyboard and mouse simutaneously with a PS/2 Y-cable +- Both Onboard NIC +- S3 Suspend to RAM +- USB2 on rear and front panel connectors +- USB3 +- Integrated SATA +- CPU Temp sensors (tested PSensor on GNU/Linux) +- LPC TPM on TPM-header (tested tpm-tools with TPM 1.2 Infineon SLB9635TT12) +- Native raminit +- Integrated graphics with libgfxinit +- Nvidia Quadro 600 in all PCIe-16x slots +- Compex WLM200NX (Qualcomm Atheros AR9220) in PCI slot +- Debug output from serial port + +## Untested + +- EHCI debugging +- S/PDIF audio +- PS/2 mouse + +## Technology + +```eval_rst ++------------------+--------------------------------------------------+ +| Northbridge | :doc:`../../northbridge/intel/sandybridge/index` | ++------------------+--------------------------------------------------+ +| Southbridge | bd82x6x | ++------------------+--------------------------------------------------+ +| CPU | model_206ax | ++------------------+--------------------------------------------------+ +| Super I/O | Nuvoton NCT6776F | ++------------------+--------------------------------------------------+ +| EC | None | ++------------------+--------------------------------------------------+ +| Coprocessor | Intel Management Engine | ++------------------+--------------------------------------------------+ +``` + +## Extra resources + +- [Flash chip datasheet][W25Q128FVSG] + +[X9SAE]: https://www.supermicro.com/products/motherboard/xeon/c216/x9sae.cfm +[X9SAE-V]: https://www.supermicro.com/products/motherboard/xeon/c216/x9sae-v.cfm +[W25Q128FVSG]: https://static.chipdip.ru/lib/093/DOC001093213.pdf +[flashrom]: https://flashrom.org/Flashrom diff --git a/src/mainboard/supermicro/x9sae/Kconfig b/src/mainboard/supermicro/x9sae/Kconfig new file mode 100644 index 0000000000..4afe85e6aa --- /dev/null +++ b/src/mainboard/supermicro/x9sae/Kconfig @@ -0,0 +1,31 @@ +## SPDX-License-Identifier: GPL-2.0-only + +if BOARD_SUPERMICRO_X9SAE + +config BOARD_SPECIFIC_OPTIONS + def_bool y + select BOARD_ROMSIZE_KB_16384 + select HAVE_ACPI_RESUME + select HAVE_ACPI_TABLES + select HAVE_CMOS_DEFAULT + select HAVE_OPTION_TABLE + select INTEL_GMA_HAVE_VBT + select INTEL_INT15 + select MAINBOARD_HAS_LIBGFXINIT + select MAINBOARD_HAS_LPC_TPM + select MAINBOARD_USES_IFD_GBE_REGION + select NORTHBRIDGE_INTEL_SANDYBRIDGE + select SERIRQ_CONTINUOUS_MODE + select SOUTHBRIDGE_INTEL_C216 + select SUPERIO_NUVOTON_NCT6776 + select USE_NATIVE_RAMINIT + +config MAINBOARD_DIR + string + default "supermicro/x9sae" + +config MAINBOARD_PART_NUMBER + string + default "X9SAE" + +endif diff --git a/src/mainboard/supermicro/x9sae/Kconfig.name b/src/mainboard/supermicro/x9sae/Kconfig.name new file mode 100644 index 0000000000..566dce82ef --- /dev/null +++ b/src/mainboard/supermicro/x9sae/Kconfig.name @@ -0,0 +1,2 @@ +config BOARD_SUPERMICRO_X9SAE + bool "X9SAE" diff --git a/src/mainboard/supermicro/x9sae/Makefile.inc b/src/mainboard/supermicro/x9sae/Makefile.inc new file mode 100644 index 0000000000..5310efd914 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/Makefile.inc @@ -0,0 +1,8 @@ +## SPDX-License-Identifier: GPL-2.0-only + +bootblock-y += early_init.c +bootblock-y += gpio.c +romstage-y += early_init.c +romstage-y += gpio.c +ramstage-y += hda_verb.c +ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads diff --git a/src/mainboard/supermicro/x9sae/acpi/ec.asl b/src/mainboard/supermicro/x9sae/acpi/ec.asl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/mainboard/supermicro/x9sae/acpi/pci.asl b/src/mainboard/supermicro/x9sae/acpi/pci.asl new file mode 100644 index 0000000000..72b497c2ef --- /dev/null +++ b/src/mainboard/supermicro/x9sae/acpi/pci.asl @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +// Intel PCI to PCI bridge 0:1e.0 + +Device (PCIB) +{ + Name (_ADR, 0x001E0000) // _ADR: Address + Name (_PRW, Package(){ 13, 4 }) // Power Resources for Wake + + Method (_PRT) // _PRT: PCI Interrupt Routing Table + { + If (PICM) { + Return (Package() { + Package() { 0x0001ffff, 0, 0, 0x16 }, + Package() { 0x0001ffff, 1, 0, 0x15 }, + Package() { 0x0001ffff, 2, 0, 0x14 }, + Package() { 0x0001ffff, 3, 0, 0x13 }, + Package() { 0x0002ffff, 0, 0, 0x12 }, + Package() { 0x0002ffff, 1, 0, 0x13 }, + Package() { 0x0002ffff, 2, 0, 0x11 }, + Package() { 0x0002ffff, 3, 0, 0x10 }, + Package() { 0x0003ffff, 0, 0, 0x13 }, + Package() { 0x0003ffff, 1, 0, 0x12 }, + Package() { 0x0003ffff, 2, 0, 0x15 }, + Package() { 0x0003ffff, 3, 0, 0x16 }, + Package() { 0x0000ffff, 0, 0, 0x10 }, + Package() { 0x0000ffff, 1, 0, 0x11 }, + Package() { 0x0000ffff, 2, 0, 0x12 }, + Package() { 0x0000ffff, 3, 0, 0x13 }, + }) + } + Return (Package() { + Package() { 0x0001ffff, 0, \_SB.PCI0.LPCB.LNKG, 0 }, + Package() { 0x0001ffff, 1, \_SB.PCI0.LPCB.LNKF, 0 }, + Package() { 0x0001ffff, 2, \_SB.PCI0.LPCB.LNKE, 0 }, + Package() { 0x0001ffff, 3, \_SB.PCI0.LPCB.LNKH, 0 }, + Package() { 0x0002ffff, 0, \_SB.PCI0.LPCB.LNKC, 0 }, + Package() { 0x0002ffff, 1, \_SB.PCI0.LPCB.LNKD, 0 }, + Package() { 0x0002ffff, 2, \_SB.PCI0.LPCB.LNKB, 0 }, + Package() { 0x0002ffff, 3, \_SB.PCI0.LPCB.LNKA, 0 }, + Package() { 0x0003ffff, 0, \_SB.PCI0.LPCB.LNKD, 0 }, + Package() { 0x0003ffff, 1, \_SB.PCI0.LPCB.LNKC, 0 }, + Package() { 0x0003ffff, 2, \_SB.PCI0.LPCB.LNKF, 0 }, + Package() { 0x0003ffff, 3, \_SB.PCI0.LPCB.LNKG, 0 }, + Package() { 0x0000ffff, 0, \_SB.PCI0.LPCB.LNKA, 0 }, + Package() { 0x0000ffff, 1, \_SB.PCI0.LPCB.LNKB, 0 }, + Package() { 0x0000ffff, 2, \_SB.PCI0.LPCB.LNKC, 0 }, + Package() { 0x0000ffff, 3, \_SB.PCI0.LPCB.LNKD, 0 }, + }) + } +} diff --git a/src/mainboard/supermicro/x9sae/acpi/platform.asl b/src/mainboard/supermicro/x9sae/acpi/platform.asl new file mode 100644 index 0000000000..aff432b6f4 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/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/supermicro/x9sae/acpi/superio.asl b/src/mainboard/supermicro/x9sae/acpi/superio.asl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/mainboard/supermicro/x9sae/board_info.txt b/src/mainboard/supermicro/x9sae/board_info.txt new file mode 100644 index 0000000000..3ff778f304 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/board_info.txt @@ -0,0 +1,7 @@ +Category: desktop +Board URL: https://www.supermicro.com/products/motherboard/xeon/c216/x9sae.cfm +ROM package: SOIC-8 +ROM protocol: SPI +ROM socketed: Occasionally +Flashrom support: y +Release year: 2012 diff --git a/src/mainboard/supermicro/x9sae/cmos.default b/src/mainboard/supermicro/x9sae/cmos.default new file mode 100644 index 0000000000..c7aa6208f4 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/cmos.default @@ -0,0 +1,6 @@ +boot_option=Fallback +debug_level=Debug +nmi=Disable +power_on_after_fail=Disable +sata_mode=AHCI +gfx_uma_size=64M diff --git a/src/mainboard/supermicro/x9sae/cmos.layout b/src/mainboard/supermicro/x9sae/cmos.layout new file mode 100644 index 0000000000..0f9de5ed18 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/cmos.layout @@ -0,0 +1,86 @@ +## SPDX-License-Identifier: GPL-2.0-only + +# ----------------------------------------------------------------- +entries + +# ----------------------------------------------------------------- +0 120 r 0 reserved_memory + +# ----------------------------------------------------------------- +# RTC_BOOT_BYTE (coreboot hardcoded) +384 1 e 2 boot_option +388 4 h 0 reboot_counter + +# ----------------------------------------------------------------- +# coreboot config options: console +395 4 e 3 debug_level + +# coreboot config options: southbridge +408 1 e 1 nmi + +409 2 e 4 power_on_after_fail +411 2 e 5 sata_mode + +# coreboot config options: northbridge +416 5 e 6 gfx_uma_size + +# coreboot config options: check sums +984 16 h 0 check_sum + +# ----------------------------------------------------------------- + +enumerations +#ID value text + +# Generic on/off enum +1 0 Disable +1 1 Enable + +# boot_option +2 0 Fallback +2 1 Normal + +# debug_level +3 0 Emergency +3 1 Alert +3 2 Critical +3 3 Error +3 4 Warning +3 5 Notice +3 6 Info +3 7 Debug +3 8 Spew + +# power_on_after_fail +4 0 Disable +4 1 Enable +4 2 Keep + +# sata_mode +5 0 AHCI +5 1 Compatible +5 2 Legacy + +# gfx_uma_size (Intel IGP Video RAM size) +6 0 32M +6 1 64M +6 2 96M +6 3 128M +6 4 160M +6 5 192M +6 6 224M +6 7 256M +6 8 288M +6 9 320M +6 10 352M +6 11 384M +6 12 416M +6 13 448M +6 14 480M +6 15 512M +6 16 1024M + +# ----------------------------------------------------------------- +checksums + +checksum 392 423 984 diff --git a/src/mainboard/supermicro/x9sae/data.vbt b/src/mainboard/supermicro/x9sae/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..1a0d23319edd6b20106d328e2b01ed233f76c36d GIT binary patch literal 3902 zcmdT{Z)jUp6hAlbz5Ka(uT5X;n#Qi&&atIk|GZ|kmQwX4O>5I-ZQ5iZ4smIh><@HZ zm;GS_XQLK35hRMtIj01LG52Zglb|2=Ns6eHAtK_3Is71F$UY3gF&EE$@1+~7v_Txs z`}o~+?&-O|+>R9ts_MJf0Wv^pl|a|#ry?_lveW*F78akJ$sC)??al1Yc1Dg^8jB4?Sa9dg z>~uCac_^D<@#J$s#%UEAI=pu}!$uG9o66?;80SK7*45pyxtlR@iA}A=vU|-mV?*`TA;h9x36Chg@=YmqOplYGPV7M{41}%Ht&Nw1;EV`f?XBS zASU?XxL|`5LN9C*i}0J>2?2)+VMG$K2XWj%;RNDs#0QA;h)aks5MLsGKwLxIK>UsX zCk2YALo^}$hybD=F@%UAwj(l#8HD{X+$q`e;4q?plXz z&m1`V%f<)gfBBa+TQCO%qnMq%Y>cMOR{=zaVmo4!Gui3U$$i-h2lc~{X#hP48#M39 z9+S+gwZiFf&~$CK*0eO8?>u^S+_ynboi1C3pVhUgiveA~T()@q&@(5P!IXREBrq;{ z)JVZdPt@%EH3A?v_@M!A( zqm-s7dzq>QO3zSsnW|SP{fRQ0Tdi}`CN~Sa)ufxI-RyO@dfH7tcC!Vy`lFlv;$~D< z8)dpdW>HyvQKoxj_Li&`WqLtoi?Vu6rZ;4!D(ZTLb|@^NsJj$8tFTjwdS0QI6s7g1 zn73Ue`5Mem%mQal##2n$WJBH}9+Xn`Mto;1-##Xel}t=X*;Z#LRx{{IH8Ov`&I)PI zoDJiJP3Cvg>I};(fhV+?ydZ(d8Twb;#q!GGgk!%;Tw^XQ(X+T#Ue+-`DZ z49jbkGZ&C6V0KoV+j&P1;bwItwpGvS3`gxRgrb@KQ&i znD#a48nbStrk**m;4)4#@2F%K{{DP%_Tm%B(8^~4AcIse-a&Fvny(-q&a@O4$LH5+ zvG?nj7zA*09V1x@gVw4qq~|l5cijBC;%g8v9XZ24%t?bmF&QLQ!7i@*pcrHInyd}* zSwUGhgLpl$&X^*Fd&ob8l z9Nr^rZ({+hg#?5C$^>6t+PO|JQ9Jr{GuNFAbi6 AGynhq literal 0 HcmV?d00001 diff --git a/src/mainboard/supermicro/x9sae/devicetree.cb b/src/mainboard/supermicro/x9sae/devicetree.cb new file mode 100644 index 0000000000..05a187eaad --- /dev/null +++ b/src/mainboard/supermicro/x9sae/devicetree.cb @@ -0,0 +1,125 @@ +## SPDX-License-Identifier: GPL-2.0-only + +chip northbridge/intel/sandybridge + register "gfx" = "GMA_STATIC_DISPLAYS(0)" + register "gpu_dp_b_hotplug" = "4" + register "gpu_dp_c_hotplug" = "4" + register "gpu_dp_d_hotplug" = "4" + register "gpu_panel_power_cycle_delay" = "4" + device cpu_cluster 0 on + chip cpu/intel/model_206ax + register "acpi_c1" = "1" + register "acpi_c2" = "3" + register "acpi_c3" = "5" + device lapic 0 on end + device lapic 0xacac off end + end + end + device domain 0 on + subsystemid 0x15d9 0x0644 inherit + + device pci 00.0 on end # Host bridge + device pci 01.0 on end # CPU1 SLOT6 (x8 or x16) + device pci 01.1 on end # CPU1 SLOT4 (electrical x8 in x16 if present) + device pci 02.0 on end # iGPU + device pci 06.0 on end # CPU1 SLOT7 (electrical x4 in x8) + + chip southbridge/intel/bd82x6x + register "gen1_dec" = "0x00fc0a01" # NCT6776 SuperIO (0x0a00-0aff) + register "sata_interface_speed_support" = "0x3" + register "sata_port_map" = "0x3f" + register "spi_lvscc" = "0x2005" + register "spi_uvscc" = "0x2005" + register "superspeed_capable_ports" = "0x0000000f" + register "xhci_overcurrent_mapping" = "0x00000c03" + register "xhci_switchable_ports" = "0x0000000f" + + device pci 14.0 on end # xHCI + device pci 16.0 on end # MEI #1 + device pci 16.1 off end # MEI #2 + device pci 16.2 off end # ME IDE-R + device pci 16.3 off end # ME KT + device pci 19.0 on end # Intel GbE LAN1 + device pci 1a.0 on end # EHCI #2 + device pci 1b.0 on end # HD Audio + + device pci 1c.0 on end # RP #1 PCH SLOT2 + device pci 1c.1 off end # RP #2 + device pci 1c.2 off end # RP #3 + device pci 1c.3 off end # RP #4 + device pci 1c.4 on end # RP #5 PCH SLOT3 + device pci 1c.5 off end # RP #6 + device pci 1c.6 on end # RP #7 PCH SLOT5 + device pci 1c.7 on # RP #8 + device pci 00.0 on end # 574 GbE LAN2 + end + + device pci 1d.0 on end # EHCI #1 + device pci 1e.0 on end # PCI bridge + device pci 1f.0 on # LPC bridge + chip superio/nuvoton/nct6776 + device pnp 2e.0 off end # Floppy + device pnp 2e.1 off end # Parallel port + device pnp 2e.2 on # COM1 + io 0x60 = 0x3f8 + irq 0x70 = 4 + end + device pnp 2e.3 on # COM2, IR + io 0x60 = 0x2f8 + irq 0x70 = 3 + end + device pnp 2e.5 on # Keyboard + io 0x60 = 0x060 + io 0x62 = 0x064 + irq 0x70 = 1 + irq 0x72 = 12 + end + device pnp 2e.6 off end # CIR + device pnp 2e.7 off end # GPIO6 + device pnp 2e.107 off end # GPIO7 + device pnp 2e.207 off end # GPIO8 + device pnp 2e.307 off end # GPIO9 + device pnp 2e.8 off end # WDT + device pnp 2e.108 on end # GPIO0 + device pnp 2e.208 off end # GPIOA + device pnp 2e.308 on # GPIOBASE + io 0x60 = 0xa00 + end + device pnp 2e.109 off end # GPIO1 + device pnp 2e.209 on end # GPIO2 + device pnp 2e.309 off end # GPIO3 + device pnp 2e.409 off end # GPIO4 + device pnp 2e.509 off end # GPIO5 + device pnp 2e.609 off end # GPIO6 + device pnp 2e.709 off end # GPIO7 + device pnp 2e.a on # ACPI + irq 0xe0 = 0 + irq 0xe4 = 0x60 + irq 0xe6 = 0x4c + irq 0xe7 = 0x10 + irq 0xf2 = 0x5d + end + device pnp 2e.b on # HWM, front panel LED + io 0x60 = 0xa30 + io 0x62 = 0xa80 + irq 0x70 = 0 + irq 0xf8 = 0x43 + end + device pnp 2e.d off end # VID + device pnp 2e.e off end # CIR WAKE-UP + device pnp 2e.f off end # GPIO + device pnp 2e.14 off end # SVID + device pnp 2e.16 off end # Deep sleep + device pnp 2e.17 off end # GPIOA + end + chip drivers/pc80/tpm + device pnp c31.0 on end # TPM + end + end + device pci 1f.2 on end # SATA (AHCI) + device pci 1f.3 on end # SMBus + device pci 1f.5 off end # SATA (Legacy) + device pci 1f.6 off end # Thermal + end + end +end diff --git a/src/mainboard/supermicro/x9sae/dsdt.asl b/src/mainboard/supermicro/x9sae/dsdt.asl new file mode 100644 index 0000000000..77577de2ac --- /dev/null +++ b/src/mainboard/supermicro/x9sae/dsdt.asl @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + + +#include + +DefinitionBlock( + "dsdt.aml", + "DSDT", + ACPI_DSDT_REV_2, + OEM_ID, + ACPI_TABLE_CREATOR, + 0x20141018 /* OEM revision */ +) +{ + #include + #include "acpi/platform.asl" + #include + #include + #include + #include + + Device (\_SB.PCI0) + { + #include + #include + #include + #include "acpi/pci.asl" + } +} diff --git a/src/mainboard/supermicro/x9sae/early_init.c b/src/mainboard/supermicro/x9sae/early_init.c new file mode 100644 index 0000000000..7e032120bc --- /dev/null +++ b/src/mainboard/supermicro/x9sae/early_init.c @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include + +#define GLOBAL_DEV PNP_DEV(0x2e, 0) +#define SERIAL_DEV PNP_DEV(0x2e, NCT6776_SP1) +#define ACPI_DEV PNP_DEV(0x2e, NCT6776_ACPI) + +const struct southbridge_usb_port mainboard_usb_ports[] = { + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 1 }, + { 1, 0, 1 }, + { 1, 0, 2 }, + { 1, 0, 2 }, + { 1, 0, 3 }, + { 1, 0, 3 }, + { 1, 0, 4 }, + { 1, 0, 4 }, + { 1, 0, 6 }, + { 1, 0, 5 }, + { 1, 0, 5 }, + { 1, 0, 6 }, +}; + +void bootblock_mainboard_early_init(void) +{ + nuvoton_pnp_enter_conf_state(GLOBAL_DEV); + + /* Select SIO pin states */ + pnp_write_config(GLOBAL_DEV, 0x1a, 0xc8); + pnp_write_config(GLOBAL_DEV, 0x1b, 0x6d); + pnp_write_config(GLOBAL_DEV, 0x1c, 0x83); + pnp_write_config(GLOBAL_DEV, 0x24, 0x24); + pnp_write_config(GLOBAL_DEV, 0x2a, 0x00); + pnp_write_config(GLOBAL_DEV, 0x2b, 0x02); + pnp_write_config(GLOBAL_DEV, 0x2c, 0x80); + + /* Power RAM in S3 */ + pnp_set_logical_device(ACPI_DEV); + pnp_write_config(ACPI_DEV, 0xe4, 0x10); + + pnp_set_logical_device(SERIAL_DEV); + + nuvoton_pnp_exit_conf_state(GLOBAL_DEV); + + /* Enable UART */ + nuvoton_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE); +} + +void mainboard_get_spd(spd_raw_data *spd, bool id_only) +{ + read_spd(&spd[0], 0x50, id_only); + read_spd(&spd[1], 0x51, id_only); + read_spd(&spd[2], 0x52, id_only); + read_spd(&spd[3], 0x53, id_only); +} diff --git a/src/mainboard/supermicro/x9sae/gma-mainboard.ads b/src/mainboard/supermicro/x9sae/gma-mainboard.ads new file mode 100644 index 0000000000..8b07c07695 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/gma-mainboard.ads @@ -0,0 +1,17 @@ +-- 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, + HDMI2, + Analog, + others => Disabled); + +end GMA.Mainboard; diff --git a/src/mainboard/supermicro/x9sae/gpio.c b/src/mainboard/supermicro/x9sae/gpio.c new file mode 100644 index 0000000000..6cb163f34d --- /dev/null +++ b/src/mainboard/supermicro/x9sae/gpio.c @@ -0,0 +1,190 @@ +/* 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_NATIVE, + .gpio13 = GPIO_MODE_GPIO, + .gpio14 = GPIO_MODE_GPIO, + .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_GPIO, + .gpio22 = GPIO_MODE_NATIVE, + .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_INPUT, + .gpio13 = GPIO_DIR_INPUT, + .gpio14 = GPIO_DIR_OUTPUT, + .gpio15 = GPIO_DIR_INPUT, + .gpio16 = GPIO_DIR_INPUT, + .gpio17 = GPIO_DIR_INPUT, + .gpio21 = GPIO_DIR_OUTPUT, + .gpio24 = GPIO_DIR_OUTPUT, + .gpio27 = GPIO_DIR_OUTPUT, + .gpio28 = GPIO_DIR_OUTPUT, + .gpio29 = GPIO_DIR_OUTPUT, + .gpio31 = GPIO_DIR_INPUT, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_level = { + .gpio14 = GPIO_LEVEL_LOW, + .gpio21 = GPIO_LEVEL_HIGH, + .gpio24 = GPIO_LEVEL_HIGH, + .gpio27 = GPIO_LEVEL_HIGH, + .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 = { + .gpio0 = GPIO_INVERT, + .gpio1 = GPIO_INVERT, + .gpio8 = GPIO_INVERT, + .gpio13 = GPIO_INVERT, +}; + +static const struct pch_gpio_set1 pch_gpio_set1_blink = { +}; + +static const struct pch_gpio_set2 pch_gpio_set2_mode = { + .gpio32 = GPIO_MODE_GPIO, + .gpio33 = GPIO_MODE_GPIO, + .gpio34 = GPIO_MODE_GPIO, + .gpio35 = GPIO_MODE_GPIO, + .gpio36 = GPIO_MODE_NATIVE, + .gpio37 = GPIO_MODE_NATIVE, + .gpio38 = GPIO_MODE_NATIVE, + .gpio39 = GPIO_MODE_NATIVE, + .gpio40 = GPIO_MODE_NATIVE, + .gpio41 = GPIO_MODE_NATIVE, + .gpio42 = GPIO_MODE_NATIVE, + .gpio43 = GPIO_MODE_NATIVE, + .gpio44 = GPIO_MODE_GPIO, + .gpio45 = GPIO_MODE_GPIO, + .gpio46 = GPIO_MODE_GPIO, + .gpio47 = GPIO_MODE_NATIVE, + .gpio48 = GPIO_MODE_NATIVE, + .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_NATIVE, + .gpio61 = GPIO_MODE_NATIVE, + .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, + .gpio35 = GPIO_DIR_OUTPUT, + .gpio44 = GPIO_DIR_OUTPUT, + .gpio45 = GPIO_DIR_OUTPUT, + .gpio46 = GPIO_DIR_OUTPUT, + .gpio49 = GPIO_DIR_INPUT, + .gpio57 = GPIO_DIR_INPUT, +}; + +static const struct pch_gpio_set2 pch_gpio_set2_level = { + .gpio32 = GPIO_LEVEL_HIGH, + .gpio33 = GPIO_LEVEL_HIGH, + .gpio35 = GPIO_LEVEL_HIGH, + .gpio44 = GPIO_LEVEL_HIGH, + .gpio45 = GPIO_LEVEL_HIGH, + .gpio46 = 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/supermicro/x9sae/hda_verb.c b/src/mainboard/supermicro/x9sae/hda_verb.c new file mode 100644 index 0000000000..5feb74172f --- /dev/null +++ b/src/mainboard/supermicro/x9sae/hda_verb.c @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +const u32 cim_verb_data[] = { + 0x10ec0889, /* Codec Vendor / Device ID: Realtek */ + 0x15d90644, /* Subsystem ID */ + 15, /* Number of 4 dword sets */ + AZALIA_SUBVENDOR(0, 0x15d90644), + AZALIA_PIN_CFG(0, 0x11, 0x18561120), + AZALIA_PIN_CFG(0, 0x12, 0x411111f0), + AZALIA_PIN_CFG(0, 0x14, 0x01014010), + AZALIA_PIN_CFG(0, 0x15, 0x01011012), + AZALIA_PIN_CFG(0, 0x16, 0x01016011), + AZALIA_PIN_CFG(0, 0x17, 0x411111f0), + AZALIA_PIN_CFG(0, 0x18, 0x01a19840), + AZALIA_PIN_CFG(0, 0x19, 0x02a19841), + AZALIA_PIN_CFG(0, 0x1a, 0x0181344f), + AZALIA_PIN_CFG(0, 0x1b, 0x0221401f), + AZALIA_PIN_CFG(0, 0x1c, 0x411111f0), + AZALIA_PIN_CFG(0, 0x1d, 0x4007e619), + AZALIA_PIN_CFG(0, 0x1e, 0x01452130), + AZALIA_PIN_CFG(0, 0x1f, 0x01c41150), + + 0x80862806, /* Codec Vendor / Device ID: Intel */ + 0x80860101, /* Subsystem ID */ + 4, /* Number of 4 dword sets */ + AZALIA_SUBVENDOR(3, 0x80860101), + AZALIA_PIN_CFG(3, 0x05, 0x58560010), + AZALIA_PIN_CFG(3, 0x06, 0x18560020), + AZALIA_PIN_CFG(3, 0x07, 0x18560030), + +}; + +const u32 pc_beep_verbs[0] = {}; + +AZALIA_ARRAY_SIZES; diff --git a/src/mainboard/supermicro/x9sae/mainboard.c b/src/mainboard/supermicro/x9sae/mainboard.c new file mode 100644 index 0000000000..4322c1e019 --- /dev/null +++ b/src/mainboard/supermicro/x9sae/mainboard.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +static void mainboard_enable(struct device *dev) +{ + /* FIXME: fix these values. */ + install_intel_vga_int15_handler(GMA_INT15_ACTIVE_LFP_INT_LVDS, + GMA_INT15_PANEL_FIT_DEFAULT, + GMA_INT15_BOOT_DISPLAY_DEFAULT, 0); +} + +struct chip_operations mainboard_ops = { + .enable_dev = mainboard_enable, +};