soc/intel: Add Intel Xeon Scalable Processor support

This patch adds support for Intel Xeon-SP.

This patch is developed and verified with Skylake Scalable
Processor, which is a processor in Xeon-SP family. The code
is expected to be reusable for future geneations of Xeon-SP
processors, and will be updated with smaller targeted
patches accordingly, to add support for additional Xeon-SP
processors, to add features, and to improve the code base.

The Skylake-SP FSP is based on FSP 2.0. The FSP is a
proof-of-concept build. The binary is not shared in public,
when this patch is upstreamed.

Signed-off-by: Jonathan Zhang <jonzhang@fb.com>
Signed-off-by: Reddy Chagam <anjaneya.chagam@intel.com>
Tested-by: johnny_lin@wiwynn.com
Change-Id: Idc9c3bee17caf8b4841f0bc190cb1aa9d38fc23e
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38548
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: David Hendricks <david.hendricks@gmail.com>
This commit is contained in:
Jonathan Zhang 2020-01-16 11:16:45 -08:00 committed by Patrick Georgi
parent e425a09d6a
commit 8f89549d3c
36 changed files with 5497 additions and 1 deletions

View File

@ -56,7 +56,7 @@ config FSP_USE_REPO
depends on SOC_INTEL_APOLLOLAKE || SOC_INTEL_SKYLAKE || \
SOC_INTEL_KABYLAKE || SOC_INTEL_COFFEELAKE || \
SOC_INTEL_ICELAKE || SOC_INTEL_WHISKEYLAKE || \
SOC_INTEL_DENVERTON_NS
SOC_INTEL_DENVERTON_NS || SOC_INTEL_XEON_SP
help
When selecting this option, the SoC must set FSP_HEADER_PATH
and FSP_FD_PATH correctly so FSP splitting works.

View File

@ -9,6 +9,7 @@ source "src/soc/intel/quark/Kconfig"
source "src/soc/intel/skylake/Kconfig"
source "src/soc/intel/icelake/Kconfig"
source "src/soc/intel/tigerlake/Kconfig"
source "src/soc/intel/xeon_sp/Kconfig"
# Load common config
source "src/soc/intel/common/Kconfig"

View File

@ -0,0 +1,134 @@
##
## This file is part of the coreboot project.
##
## Copyright (C) 2019 - 2020 Intel Corporation
## Copyright (C) 2019 - 2020 Facebook Inc
##
## 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.
##
config SOC_INTEL_XEON_SP
bool
help
Intel Xeon SP support
if SOC_INTEL_XEON_SP
config CPU_SPECIFIC_OPTIONS
def_bool y
select ARCH_BOOTBLOCK_X86_32
select ARCH_RAMSTAGE_X86_32
select ARCH_ROMSTAGE_X86_32
select ARCH_VERSTAGE_X86_32
select BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY if BOOT_DEVICE_SPI_FLASH
select BOOT_DEVICE_SUPPORTS_WRITES
select POSTCAR_CONSOLE
select SOC_INTEL_COMMON
select SOC_INTEL_COMMON_RESET
select PLATFORM_USES_FSP2_0
select FSP_PLATFORM_MEMORY_SETTINGS_VERSIONS
select FSP_T_XIP
select FSP_M_XIP
select FSP_USE_REPO
select POSTCAR_STAGE
select IOAPIC
select PARALLEL_MP
select SMP
select INTEL_DESCRIPTOR_MODE_CAPABLE
select COMMON_FADT
select SOC_INTEL_COMMON_BLOCK
select SOC_INTEL_COMMON_BLOCK_CPU
select SOC_INTEL_COMMON_BLOCK_TIMER
select SOC_INTEL_COMMON_BLOCK_LPC
select SOC_INTEL_COMMON_BLOCK_RTC
select SOC_INTEL_COMMON_BLOCK_SPI
select SOC_INTEL_COMMON_BLOCK_FAST_SPI
select SOC_INTEL_COMMON_BLOCK_PCR
select TSC_MONOTONIC_TIMER
select UDELAY_TSC
select SUPPORT_CPU_UCODE_IN_CBFS
select CPU_INTEL_FIRMWARE_INTERFACE_TABLE
config MAINBOARD_USES_FSP2_0
bool
default y
config USE_FSP2_0_DRIVER
def_bool y
depends on MAINBOARD_USES_FSP2_0
select PLATFORM_USES_FSP2_0
select UDK_2015_BINDING
select POSTCAR_CONSOLE
select POSTCAR_STAGE
# Fake FSP binary is used, as the current FSP binary for SKX-SP
# is an engineering build. It is not available to the public
# for now.
config FSP_FD_PATH
string "Location of FSP binary"
depends on FSP_USE_REPO
default "3rdparty/fsp/KabylakeFspBinPkg/Fsp.fd"
config FSP_HEADER_PATH
string "Location of FSP headers"
depends on MAINBOARD_USES_FSP2_0
default "src/vendorcode/intel/fsp/fsp2_0/skylake_sp"
config MAX_SOCKET
int
default 2
# For 2S config, the number of cpus could be as high as
# 2 threads * 20 cores * 2 sockets
config MAX_CPUS
int
default 80
config PCR_BASE_ADDRESS
hex
default 0xfd000000
help
This option allows you to select MMIO Base Address of sideband bus.
config DCACHE_RAM_BASE
hex
default 0xfe800000
config DCACHE_RAM_SIZE
hex
default 0x200000
config DCACHE_BSP_STACK_SIZE
hex
default 0x10000
config MMCONF_BASE_ADDRESS
hex
default 0x80000000
config CPU_MICROCODE_CBFS_LOC
hex
default 0xfff0fdc0
config CPU_MICROCODE_CBFS_LEN
hex
default 0x7C00
config C_ENV_BOOTBLOCK_SIZE
hex
default 0xC000
config HEAP_SIZE
hex
default 0x80000
endif ## SOC_INTEL_XEON_SP

View File

@ -0,0 +1,59 @@
##
## This file is part of the coreboot project.
##
## Copyright (C) 2019 - 2020 Intel Corporation
## Copyright (C) 2019 - 2020 Facebook Inc
##
## 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.
##
ifeq ($(CONFIG_SOC_INTEL_XEON_SP),y)
subdirs-y += ../../../cpu/intel/microcode
subdirs-y += ../../../cpu/intel/turbo
subdirs-y += ../../../cpu/x86/lapic
subdirs-y += ../../../cpu/x86/mtrr
subdirs-y += ../../../cpu/x86/tsc
subdirs-y += ../../../cpu/x86/cache
subdirs-$(CONFIG_HAVE_SMI_HANDLER) += ../../../cpu/x86/smm
bootblock-y += bootblock/bootblock.c
bootblock-y += spi.c
postcar-y += soc_util.c
postcar-y += spi.c
romstage-y += soc_util.c
romstage-y += reset.c
romstage-y += romstage.c
romstage-y += soc_util.c
romstage-y += spi.c
romstage-y += hob_display.c
romstage-$(CONFIG_DISPLAY_UPD_DATA) += upd_display.c
romstage-$(CONFIG_DISPLAY_HOBS) += hob_display.c
ramstage-y += soc_util.c
ramstage-y += uncore.c
ramstage-y += reset.c
ramstage-y += chip.c
ramstage-y += soc_util.c
ramstage-y += lpc.c
ramstage-y += cpu.c
ramstage-y += spi.c
ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi.c
ramstage-$(CONFIG_DISPLAY_UPD_DATA) += upd_display.c
ramstage-$(CONFIG_DISPLAY_HOBS) += hob_display.c
ramstage-y += hob_display.c
CPPFLAGS_common += -I$(src)/soc/intel/xeon_sp/include
CPPFLAGS_common += -I$(CONFIG_FSP_HEADER_PATH)
endif ## CONFIG_SOC_INTEL_XEON_SP

1017
src/soc/intel/xeon_sp/acpi.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2013 Google Inc.
* Copyright (C) 2014 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
/* Global Variables */
Name(\PICM, 0) // IOAPIC/8259
/*
* Global ACPI memory region. This region is used for passing information
* between coreboot (aka "the system bios"), ACPI, and the SMI handler.
* Since we don't know where this will end up in memory at ACPI compile time,
* we have to fix it up in coreboot's ACPI creation phase.
*/
External(NVSA)
OperationRegion (GNVS, SystemMemory, NVSA, 0x2000)
Field (GNVS, ByteAcc, NoLock, Preserve)
{
/* Miscellaneous */
OSYS, 16, // 0x00 - Operating System
SMIF, 8, // 0x02 - SMI function
PRM0, 8, // 0x03 - SMI function parameter
PRM1, 8, // 0x04 - SMI function parameter
SCIF, 8, // 0x05 - SCI function
PRM2, 8, // 0x06 - SCI function parameter
PRM3, 8, // 0x07 - SCI function parameter
LCKF, 8, // 0x08 - Global Lock function for EC
PRM4, 8, // 0x09 - Lock function parameter
PRM5, 8, // 0x0a - Lock function parameter
P80D, 32, // 0x0b - Debug port (IO 0x80) value
LIDS, 8, // 0x0f - LID state (open = 1)
PWRS, 8, // 0x10 - Power State (AC = 1)
PCNT, 8, // 0x11 - Processor count
TPMP, 8, // 0x12 - TPM Present and Enabled
TLVL, 8, // 0x13 - Throttle Level
PPCM, 8, // 0x14 - Maximum P-state usable by OS
PM1I, 64, // 0x15 - PM1 wake status bit
GPEI, 64, // 0x1D - GPE wake status bit
U2WE, 16, // 0x25 - USB2 Wake Enable Bitmap
U3WE, 8, // 0x27 - USB3 Wake Enable Bitmap
/* Device Config */
Offset (0x30),
S5U0, 8, // 0x30 - Enable USB0 in S5
S5U1, 8, // 0x31 - Enable USB1 in S5
S3U0, 8, // 0x32 - Enable USB0 in S3
S3U1, 8, // 0x33 - Enable USB1 in S3
TACT, 8, // 0x34 - Thermal Active trip point
TPSV, 8, // 0x35 - Thermal Passive trip point
TCRT, 8, // 0x36 - Thermal Critical trip point
DPTE, 8, // 0x37 - Enable DPTF
/* Base addresses */
Offset (0x50),
CMEM, 32, // 0x50 - CBMEM TOC
TOLM, 32, // 0x54 - Top of Low Memory
CBMC, 32, // 0x58 - coreboot mem console pointer
MMOB, 32, // 0x5C - MMIO Base Low Base
MMOL, 32, // 0x60 - MMIO Base Low Limit
MMHB, 64, // 0x64 - MMIO Base High Base
MMHL, 64, // 0x6C - MMIO Base High Limit
TSGB, 32, // 0x74 - TSEG Base
TSSZ, 32, // 0x78 - TSEG Size
}

View File

@ -0,0 +1,92 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#define MAKE_IIO_DEV(id,rt) \
Device (PC##id) \
{ \
Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) \
Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) \
Name (_UID, 0x##id) \
Method (_PRT, 0, NotSerialized) \
{ \
If (PICM) \
{ \
Return (\_SB_.AR##rt) \
} \
Return (\_SB_.PR##rt) \
} \
External(\_SB.RT##id) \
Method (_CRS, 0, NotSerialized) \
{ \
Return (\_SB.RT##id) \
} \
Name (SUPP, 0x00) \
Name (CTRL, 0x00) \
Name (_PXM, 0x00) /* _PXM: Device Proximity */ \
Method (_OSC, 4, NotSerialized) \
{ \
CreateDWordField (Arg3, 0x00, CDW1) \
If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */)) \
{ \
CreateDWordField (Arg3, 0x04, CDW2) \
If ((Arg2 > 0x02)) \
{ \
CreateDWordField (Arg3, 0x08, CDW3) \
} \
SUPP = CDW2 \
CTRL = CDW3 \
If ((AHPE || ((SUPP & 0x16) != 0x16))) \
{ \
CTRL &= 0x1E \
Sleep (0x03E8) \
} \
/* Never allow SHPC (no SHPC controller in system) */ \
CTRL &= 0x1D \
/* Disable Native PCIe AER handling from OS */ \
CTRL &= 0x17 \
If ((Arg1 != One)) /* unknown revision */ \
{ \
CDW1 |= 0x08 \
} \
If ((CDW3 != CTRL)) /* capabilities bits were masked */ \
{ \
CDW1 |= 0x10 \
} \
CDW3 = CTRL \
Return (Arg3) \
} \
Else \
{ \
/* indicate unrecognized UUID */ \
CDW1 |= 0x04 \
IO80 = 0xEE \
Return (Arg3) \
} \
} \
}
MAKE_IIO_DEV(00, 00)
MAKE_IIO_DEV(01, 10)
MAKE_IIO_DEV(02, 20)
MAKE_IIO_DEV(03, 28)
#if MAX_SOCKET > 1
MAKE_IIO_DEV(06, 40)
MAKE_IIO_DEV(07, 50)
MAKE_IIO_DEV(08, 60)
MAKE_IIO_DEV(09, 68)
#endif

View File

@ -0,0 +1,113 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2007-2009 coresystems GmbH
* Copyright (C) 2014 Google Inc.
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc.
*
* 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.
*/
/*
* Refer to Intel® C620 Series Chipset Platform Controller Hub EDS section 20.11
* CONFIG_PCR_BASE_ADDRESS 0xfd000000 0x3100
* (0xfd000000 | ((uint8_t)(0xC4) << 16) | (uint16_t)(0x3100) = 0xFDC43100
*
* PIRQ routing control is in PCR ITSS region.
*/
OperationRegion (ITSS, SystemMemory,
Add (PCR_ITSS_PIRQA_ROUT,
Add (CONFIG_PCR_BASE_ADDRESS,
ShiftLeft (PID_ITSS, PCR_PORTID_SHIFT))), 8)
Field (ITSS, ByteAcc, NoLock, Preserve)
{
PIRA, 8, /* PIRQA Routing Control */
PIRB, 8, /* PIRQB Routing Control */
PIRC, 8, /* PIRQC Routing Control */
PIRD, 8, /* PIRQD Routing Control */
PIRE, 8, /* PIRQE Routing Control */
PIRF, 8, /* PIRQF Routing Control */
PIRG, 8, /* PIRQG Routing Control */
PIRH, 8, /* PIRQH Routing Control */
}
Name (IREN, 0x80) /* Interrupt Routing Enable */
Name (IREM, 0x0f) /* Interrupt Routing Mask */
Name (PRSA, ResourceTemplate ()
{
IRQ (Level, ActiveLow, Shared, )
{3,4,5,6,7,10,11,12,14,15}
})
Alias (PRSA, PRSB)
Name (PRSC, ResourceTemplate ()
{
IRQ (Level, ActiveLow, Shared, )
{3,4,5,6,10,11,12,14,15}
})
Alias (PRSC, PRSD)
Alias (PRSA, PRSE)
Alias (PRSA, PRSF)
Alias (PRSA, PRSG)
Alias (PRSA, PRSH)
#define MAKE_LINK_DEV(id,uid) \
Device (LNK##id) \
{ \
Name (_HID, EISAID ("PNP0C0F")) \
Name (_UID, ##uid) \
Method (_PRS, 0, NotSerialized) \
{ \
Return (PRS##id) \
} \
Method (_CRS, 0, Serialized) \
{ \
Name (RTLA, ResourceTemplate () \
{ \
IRQ (Level, ActiveLow, Shared) {} \
}) \
CreateWordField (RTLA, 1, IRQ0) \
Store (Zero, IRQ0) \
\
/* Set the bit from PIRQ Routing Register */ \
ShiftLeft (1, And (^^PIR##id, ^^IREM), IRQ0) \
Return (RTLA) \
} \
Method (_SRS, 1, Serialized) \
{ \
CreateWordField (Arg0, 1, IRQ0) \
FindSetRightBit (IRQ0, Local0) \
Decrement (Local0) \
Store (Local0, ^^PIR##id) \
} \
Method (_STA, 0, Serialized) \
{ \
If (And (^^PIR##id, ^^IREN)) { \
Return (0x9) \
} Else { \
Return (0xb) \
} \
} \
Method (_DIS, 0, Serialized) \
{ \
Or (^^PIR##id, ^^IREN, ^^PIR##id) \
} \
}
MAKE_LINK_DEV(A,1)
MAKE_LINK_DEV(B,2)
MAKE_LINK_DEV(C,3)
MAKE_LINK_DEV(D,4)
MAKE_LINK_DEV(E,5)
MAKE_LINK_DEV(F,6)
MAKE_LINK_DEV(G,7)
MAKE_LINK_DEV(H,8)

View File

@ -0,0 +1,48 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc.
*
* 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.
*/
#include <intelblocks/itss.h>
#include <intelblocks/pcr.h>
#include <soc/iomap.h>
#include <soc/irq.h>
#include <soc/pcr_ids.h>
Scope(\)
{
// Private Chipset Register(PCR). Memory Mapped through ILB
OperationRegion(PCRR, SystemMemory, P2SB_BAR, 0x01000000)
Field(PCRR, DWordAcc, Lock, Preserve)
{
Offset (0xD03100), // Interrupt Routing Registers
PRTA, 8,
PRTB, 8,
PRTC, 8,
PRTD, 8,
PRTE, 8,
PRTF, 8,
PRTG, 8,
PRTH, 8,
}
}
Scope (_SB)
{
#include "pci_irq.asl"
#include "uncore_irq.asl"
#include "iiostack.asl"
}

View File

@ -0,0 +1,566 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc.
*
* 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.
*/
/*
* Uncore devices PCI interrupt routing packages.
* See ACPI spec 6.2.13 _PRT (PCI routing table) for details.
* The mapping fields ae Address, Pin, Source, Source Index.
*/
#define GEN_PCIE_LEGACY_IRQ() \
Package (0x04) { 0x0000FFFF, 0x00, LNKA, 0x00 }, \
Package (0x04) { 0x0001FFFF, 0x00, LNKA, 0x00 }, \
Package (0x04) { 0x0002FFFF, 0x00, LNKA, 0x00 }, \
Package (0x04) { 0x0003FFFF, 0x00, LNKA, 0x00 }
#define GEN_UNCORE_LEGACY_IRQ(dev) \
Package (0x04) { ##dev, 0x00, LNKA, 0x00 }, \
Package (0x04) { ##dev, 0x01, LNKB, 0x00 }, \
Package (0x04) { ##dev, 0x02, LNKC, 0x00 }, \
Package (0x04) { ##dev, 0x03, LNKD, 0x00 }
#define GEN_PCIE_IOAPIC_IRQ(irq) \
Package (0x04) { 0x0000FFFF, 0x00, 0x00, ##irq }, \
Package (0x04) { 0x0001FFFF, 0x00, 0x00, ##irq }, \
Package (0x04) { 0x0002FFFF, 0x00, 0x00, ##irq }, \
Package (0x04) { 0x0003FFFF, 0x00, 0x00, ##irq }
#define GEN_UNCORE_IOAPIC_IRQ(dev,irq1,irq2,irq3,irq4) \
Package (0x04) { ##dev, 0x00, 0x00, ##irq1 }, \
Package (0x04) { ##dev, 0x01, 0x00, ##irq2 }, \
Package (0x04) { ##dev, 0x02, 0x00, ##irq3 }, \
Package (0x04) { ##dev, 0x03, 0x00, ##irq4 }
// Socket 0, IIOStack 0 device legacy interrupt routing
Name (PR00, Package (0x28)
{
// [DMI0]: Legacy PCI Express Port 0
Package (0x04) { 0x0000FFFF, 0x00, LNKA, 0x00 },
// [CB0A]: CBDMA
// [CB0E]: CBDMA
Package (0x04) { 0x0004FFFF, 0x00, LNKA, 0x00 },
// [CB0B]: CBDMA
// [CB0F]: CBDMA
Package (0x04) { 0x0004FFFF, 0x01, LNKB, 0x00 },
// [CB0C]: CBDMA
// [CB0G]: CBDMA
Package (0x04) { 0x0004FFFF, 0x02, LNKC, 0x00 },
// [CB0D]: CBDMA
// [CB0H]: CBDMA
Package (0x04) { 0x0004FFFF, 0x03, LNKD, 0x00 },
// Uncore 0 UBOX Device
Package (0x04) { 0x0008FFFF, 0x00, LNKA, 0x00 },
Package (0x04) { 0x0008FFFF, 0x01, LNKB, 0x00 },
Package (0x04) { 0x0008FFFF, 0x02, LNKC, 0x00 },
Package (0x04) { 0x0008FFFF, 0x03, LNKD, 0x00 },
// [DISP]: Display Controller
Package (0x04) { 0x000FFFFF, 0x00, LNKA, 0x00 },
// [IHC1]: HECI #1
// [IHC3]: HECI #3
Package (0x04) { 0x0010FFFF, 0x00, LNKA, 0x00 },
// [IHC2]: HECI #2
Package (0x04) { 0x0010FFFF, 0x01, LNKB, 0x00 },
// [IIDR]: IDE-Redirection (IDE-R)
Package (0x04) { 0x0010FFFF, 0x02, LNKC, 0x00 },
// [IMKT]: Keyboard and Text (KT) Redirection
Package (0x04) { 0x0010FFFF, 0x03, LNKD, 0x00 },
// [SAT2]: sSATA Host controller 2 on PCH
Package (0x04) { 0x0011FFFF, 0x00, LNKA, 0x00 },
// // [XHCI]: xHCI controller 1 on PCH
Package (0x04) { 0x0014FFFF, 0x00, LNKA, 0x00 },
// [OTG0]: USB Device Controller (OTG) on PCH
Package (0x04) { 0x0014FFFF, 0x01, LNKB, 0x00 },
// [TERM]: Thermal Subsystem on PCH
Package (0x04) { 0x0014FFFF, 0x02, LNKC, 0x00 },
// [CAMR]: Camera IO Host Controller on PCH
Package (0x04) { 0x0014FFFF, 0x03, LNKD, 0x00 },
// [HEC1]: HECI #1 on PCH
// [HEC3]: HECI #3 on PCH
Package (0x04) { 0x0016FFFF, 0x00, LNKA, 0x00 },
// [HEC2]: HECI #2 on PCH
Package (0x04) { 0x0016FFFF, 0x01, LNKB, 0x00 },
// [IDER]: ME IDE redirect on PCH
Package (0x04) { 0x0016FFFF, 0x02, LNKC, 0x00 },
// [MEKT]: MEKT on PCH
Package (0x04) { 0x0016FFFF, 0x03, LNKD, 0x00 },
// [SAT1]: SATA controller 1 on PCH
Package (0x04) { 0x0017FFFF, 0x00, LNKA, 0x00 },
// [NAN1]: NAND Cycle Router on PCH
Package (0x04) { 0x0018FFFF, 0x00, LNKA, 0x00 },
// [RP17]: PCIE PCH Root Port #17
Package (0x04) { 0x001BFFFF, 0x00, LNKA, 0x00 },
// [RP18]: PCIE PCH Root Port #18
Package (0x04) { 0x001BFFFF, 0x01, LNKB, 0x00 },
// [RP19]: PCIE PCH Root Port #19
Package (0x04) { 0x001BFFFF, 0x02, LNKC, 0x00 },
// [RP20]: PCIE PCH Root Port #20
Package (0x04) { 0x001BFFFF, 0x03, LNKD, 0x00 },
// [RP01]: PCIE PCH Root Port #1
// [RP05]: PCIE PCH Root Port #5
Package (0x04) { 0x001CFFFF, 0x00, LNKA, 0x00 },
// [RP02]: PCIE PCH Root Port #2
// [RP06]: PCIE PCH Root Port #6
Package (0x04) { 0x001CFFFF, 0x01, LNKB, 0x00 },
// [RP03]: PCIE PCH Root Port #3
// [RP07]: PCIE PCH Root Port #7
Package (0x04) { 0x001CFFFF, 0x02, LNKC, 0x00 },
// [RP04]: PCIE PCH Root Port #4
// [RP08]: PCIE PCH Root Port #8
Package (0x04) { 0x001CFFFF, 0x03, LNKD, 0x00 },
// [RP09]: PCIE PCH Root Port #9
// [RP13]: PCIE PCH Root Port #13
Package (0x04) { 0x001DFFFF, 0x00, LNKA, 0x00 },
// [RP10]: PCIE PCH Root Port #10
// [RP14]: PCIE PCH Root Port #14
Package (0x04) { 0x001DFFFF, 0x01, LNKB, 0x00 },
// [RP11]: PCIE PCH Root Port #11
// [RP15]: PCIE PCH Root Port #15
Package (0x04) { 0x001DFFFF, 0x02, LNKC, 0x00 },
// [RP12]: PCIE PCH Root Port #12
// [RP16]: PCIE PCH Root Port #16
Package (0x04) { 0x001DFFFF, 0x03, LNKD, 0x00 },
// [UAR0]: UART #0 on PCH
Package (0x04) { 0x001EFFFF, 0x02, LNKC, 0x00 },
// [UAR1]: UART #1 on PCH
Package (0x04) { 0x001EFFFF, 0x03, LNKD, 0x00 },
// [CAVS]: HD Audio Subsystem Controller on PCH
// [SMBS]: SMBus controller on PCH
// [GBE1]: GbE Controller on PCH
// [NTPK]: Northpeak Controller on PCH
Package (0x04) { 0x001FFFFF, 0x00, LNKA, 0x00 },
})
// Socket 0, IIOStack 0 device IOAPIC interrupt routing
Name (AR00, Package (0x28)
{
// [DMI0]: Legacy PCI Express Port 0
Package (0x04) { 0x0000FFFF, 0x00, 0x00, 0x1F },
// [CB0A]: CB3DMA
// [CB0E]: CB3DMA
Package (0x04) { 0x0004FFFF, 0x00, 0x00, 0x1A },
// [CB0B]: CB3DMA
// [CB0F]: CB3DMA
Package (0x04) { 0x0004FFFF, 0x01, 0x00, 0x1B },
// [CB0C]: CB3DMA
// [CB0G]: CB3DMA
Package (0x04) { 0x0004FFFF, 0x02, 0x00, 0x1A },
// [CB0D]: CB3DMA
// [CB0H]: CB3DMA
Package (0x04) { 0x0004FFFF, 0x03, 0x00, 0x1B },
// [UBX0]: Uncore 0 UBOX Device
Package (0x04) { 0x0008FFFF, 0x00, 0x00, 0x18 },
Package (0x04) { 0x0008FFFF, 0x01, 0x00, 0x1C },
Package (0x04) { 0x0008FFFF, 0x02, 0x00, 0x1D },
Package (0x04) { 0x0008FFFF, 0x03, 0x00, 0x1E },
// [DISP]: Display Controller
Package (0x04) { 0x000FFFFF, 0x00, 0x00, 0x10 },
// [IHC1]: HECI #1
// [IHC3]: HECI #3
Package (0x04) { 0x0010FFFF, 0x00, 0x00, 0x10 },
// [IHC2]: HECI #2
Package (0x04) { 0x0010FFFF, 0x01, 0x00, 0x11 },
// [IIDR]: IDE-Redirection (IDE-R)
Package (0x04) { 0x0010FFFF, 0x02, 0x00, 0x12 },
// [IMKT]: Keyboard and Text (KT) Redirection
Package (0x04) { 0x0010FFFF, 0x03, 0x00, 0x13 },
// [SAT2]: sSATA Host controller 2 on PCH
Package (0x04) { 0x0011FFFF, 0x00, 0x00, 0x10 },
// [XHCI]: xHCI controller 1 on PCH
Package (0x04) { 0x0014FFFF, 0x00, 0x00, 0x10 },
// [OTG0]: USB Device Controller (OTG) on PCH
Package (0x04) { 0x0014FFFF, 0x01, 0x00, 0x11 },
// [TERM]: Thermal Subsystem on PCH
Package (0x04) { 0x0014FFFF, 0x02, 0x00, 0x12 },
// [CAMR]: Camera IO Host Controller on PCH
Package (0x04) { 0x0014FFFF, 0x03, 0x00, 0x13 },
// [HEC1]: HECI #1 on PCH
// [HEC3]: HECI #3 on PCH
Package (0x04) { 0x0016FFFF, 0x00, 0x00, 0x10 },
// [HEC2]: HECI #2 on PCH
Package (0x04) { 0x0016FFFF, 0x01, 0x00, 0x11 },
// [IDER]: ME IDE redirect on PCH
Package (0x04) { 0x0016FFFF, 0x02, 0x00, 0x12 },
// [MEKT]: MEKT on PCH
Package (0x04) { 0x0016FFFF, 0x03, 0x00, 0x13 },
// [SAT1]: SATA controller 1 on PCH
Package (0x04) { 0x0017FFFF, 0x00, 0x00, 0x10 },
// [NAN1]: NAND Cycle Router on PCH
Package (0x04) { 0x0018FFFF, 0x00, 0x00, 0x10 },
// [RP17]: PCIE PCH Root Port #17
Package (0x04) { 0x001BFFFF, 0x00, 0x00, 0x10 },
// [RP18]: PCIE PCH Root Port #18
Package (0x04) { 0x001BFFFF, 0x01, 0x00, 0x11 },
// [RP19]: PCIE PCH Root Port #19
Package (0x04) { 0x001BFFFF, 0x02, 0x00, 0x12 },
// [RP20]: PCIE PCH Root Port #20
Package (0x04) { 0x001BFFFF, 0x03, 0x00, 0x13 },
// [RP01]: PCIE PCH Root Port #1
// [RP05]: PCIE PCH Root Port #5
Package (0x04) { 0x001CFFFF, 0x00, 0x00, 0x10 },
// [RP02]: PCIE PCH Root Port #2
// [RP06]: PCIE PCH Root Port #6
Package (0x04) { 0x001CFFFF, 0x01, 0x00, 0x11 },
// [RP03]: PCIE PCH Root Port #3
// [RP07]: PCIE PCH Root Port #7
Package (0x04) { 0x001CFFFF, 0x02, 0x00, 0x12 },
// [RP04]: PCIE PCH Root Port #4
// [RP08]: PCIE PCH Root Port #8
Package (0x04) { 0x001CFFFF, 0x03, 0x00, 0x13 },
// [RP09]: PCIE PCH Root Port #9
// [RP13]: PCIE PCH Root Port #13
Package (0x04) { 0x001DFFFF, 0x00, 0x00, 0x10 },
// [RP10]: PCIE PCH Root Port #10
// [RP14]: PCIE PCH Root Port #14
Package (0x04) { 0x001DFFFF, 0x01, 0x00, 0x11 },
// [RP11]: PCIE PCH Root Port #11
// [RP15]: PCIE PCH Root Port #15
Package (0x04) { 0x001DFFFF, 0x02, 0x00, 0x12 },
// [RP12]: PCIE PCH Root Port #12
// [RP16]: PCIE PCH Root Port #16
Package (0x04) { 0x001DFFFF, 0x03, 0x00, 0x13 },
// [UAR0]: UART #0 on PCH
Package (0x04) { 0x001EFFFF, 0x02, 0x00, 0x16 },
// [UAR1]: UART #1 on PCH
Package (0x04) { 0x001EFFFF, 0x03, 0x00, 0x17 },
// [CAVS]: HD Audio Subsystem Controller on PCH
// [SMBS]: SMBus controller on PCH
// [GBE1]: GbE Controller on PCH
// [NTPK]: Northpeak Controller on PCH
Package (0x04) { 0x001FFFFF, 0x00, 0x00, 0x10 },
})
// Socket 0, IIOStack 1 device legacy interrupt routing
Name (PR10, Package (0x40)
{
// PCI Express Port 1A-1D
GEN_PCIE_LEGACY_IRQ(),
// Uncore CHAUTIL Devices
GEN_UNCORE_LEGACY_IRQ(0x0008FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0009FFFF),
GEN_UNCORE_LEGACY_IRQ(0x000AFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000BFFFF),
// Uncore CHASAD Devices
GEN_UNCORE_LEGACY_IRQ(0x000EFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000FFFFF),
GEN_UNCORE_LEGACY_IRQ(0x0010FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0011FFFF),
// Uncore CMSCHA Devices
GEN_UNCORE_LEGACY_IRQ(0x0014FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0015FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0016FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0017FFFF),
// Uncore CHASADALL Device
GEN_UNCORE_LEGACY_IRQ(0x001DFFFF),
// Uncore PCUCR Device
GEN_UNCORE_LEGACY_IRQ(0x001EFFFF),
// Uncore VCUCR Device
GEN_UNCORE_LEGACY_IRQ(0x001FFFFF)
})
// Socket 0, IIOStack 1 device IOAPIC interrupt routing
Name (AR10, Package (0x40)
{
// PCI Express Port 1A-1D
GEN_PCIE_IOAPIC_IRQ(0x27),
// Uncore CHAUTIL Devices
GEN_UNCORE_IOAPIC_IRQ(0x0008FFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x0009FFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x000AFFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x000BFFFF, 0x20, 0x24, 0x25, 0x26),
// Uncore CHASAD Devices
GEN_UNCORE_IOAPIC_IRQ(0x000EFFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x000FFFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x0010FFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x0011FFFF, 0x20, 0x24, 0x25, 0x26),
// Uncore CMSCHA Devices
GEN_UNCORE_IOAPIC_IRQ(0x0014FFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x0015FFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x0016FFFF, 0x20, 0x24, 0x25, 0x26),
GEN_UNCORE_IOAPIC_IRQ(0x0017FFFF, 0x20, 0x24, 0x25, 0x26),
// Uncore CHASADALL Device
GEN_UNCORE_IOAPIC_IRQ(0x001DFFFF, 0x20, 0x24, 0x25, 0x26),
// Uncore PCUCR Device
GEN_UNCORE_IOAPIC_IRQ(0x001EFFFF, 0x20, 0x24, 0x25, 0x26),
// Uncore VCUCR Device
GEN_UNCORE_IOAPIC_IRQ(0x001FFFFF, 0x20, 0x24, 0x25, 0x26)
})
// Socket 0, IIOStack 2 device legacy interrupt routing
Name (PR20, Package (0x24)
{
// PCI Express Port 2 on PC02
GEN_PCIE_LEGACY_IRQ(),
// Uncore M2MEM Devices
GEN_UNCORE_LEGACY_IRQ(0x0008FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0009FFFF),
// Uncore MCMAIN Device
GEN_UNCORE_LEGACY_IRQ(0x000AFFFF),
// Uncore MCDECS2 Device
GEN_UNCORE_LEGACY_IRQ(0x000BFFFF),
// Uncore MCMAIN Device
GEN_UNCORE_LEGACY_IRQ(0x000CFFFF),
// Uncore MCDECS Device
GEN_UNCORE_LEGACY_IRQ(0x000DFFFF),
// Uncore Unicast MC0 DDRIO0 Device
GEN_UNCORE_LEGACY_IRQ(0x0016FFFF),
// Uncore Unicast MC1 DDRIO0 Device
GEN_UNCORE_LEGACY_IRQ(0x0017FFFF)
})
// Socket 0, IIOStack 2 device IOAPIC interrupt routing
Name (AR20, Package (0x24)
{
// PCI Express Port 2 on PC02
GEN_PCIE_IOAPIC_IRQ(0x2F),
// Uncore M2MEM Devices
GEN_UNCORE_IOAPIC_IRQ(0x0008FFFF, 0x28, 0x2C, 0x2D, 0x2E),
GEN_UNCORE_IOAPIC_IRQ(0x0009FFFF, 0x28, 0x2C, 0x2D, 0x2E),
// Uncore MCMAIN Device
GEN_UNCORE_IOAPIC_IRQ(0x000AFFFF, 0x28, 0x2C, 0x2D, 0x2E),
// Uncore MCDECS2 Device
GEN_UNCORE_IOAPIC_IRQ(0x000BFFFF, 0x28, 0x2C, 0x2D, 0x2E),
// Uncore MCMAIN Device
GEN_UNCORE_IOAPIC_IRQ(0x000CFFFF, 0x28, 0x2C, 0x2D, 0x2E),
// Uncore MCDECS Device
GEN_UNCORE_IOAPIC_IRQ(0x000DFFFF, 0x28, 0x2C, 0x2D, 0x2E),
// Uncore Unicast MC0 DDRIO0 Device
GEN_UNCORE_IOAPIC_IRQ(0x0016FFFF, 0x28, 0x2C, 0x2D, 0x2E),
// Uncore Unicast MC1 DDRIO0 Device
GEN_UNCORE_IOAPIC_IRQ(0x0017FFFF, 0x28, 0x2C, 0x2D, 0x2E)
})
// Socket 0, IIOStack 3 device legacy interrupt routing
Name (PR28, Package (0x20)
{
// PCI Express Port 3 on PC03
GEN_PCIE_LEGACY_IRQ(),
// KTI Devices
GEN_UNCORE_LEGACY_IRQ(0x000EFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000FFFFF),
GEN_UNCORE_LEGACY_IRQ(0x0010FFFF),
// M3K Device
GEN_UNCORE_LEGACY_IRQ(0x0012FFFF),
// M2U Device
GEN_UNCORE_LEGACY_IRQ(0x0015FFFF),
// M2D Device
GEN_UNCORE_LEGACY_IRQ(0x0016FFFF),
// M20 Device
GEN_UNCORE_LEGACY_IRQ(0x0017FFFF)
})
// Socket 0, IIOStack 3 device IOAPIC interrupt routing
Name (AR28, Package (0x20)
{
// PCI Express Port 3 on PC03
GEN_PCIE_IOAPIC_IRQ(0x37),
// KTI Devices
GEN_UNCORE_IOAPIC_IRQ(0x000EFFFF, 0x30, 0x34, 0x35, 0x36),
GEN_UNCORE_IOAPIC_IRQ(0x000FFFFF, 0x30, 0x34, 0x35, 0x36),
GEN_UNCORE_IOAPIC_IRQ(0x0010FFFF, 0x30, 0x34, 0x35, 0x36),
// M3K Device
GEN_UNCORE_IOAPIC_IRQ(0x0012FFFF, 0x30, 0x34, 0x35, 0x36),
// M2U Device
GEN_UNCORE_IOAPIC_IRQ(0x0015FFFF, 0x30, 0x34, 0x35, 0x36),
// M2D Device
GEN_UNCORE_IOAPIC_IRQ(0x0016FFFF, 0x30, 0x34, 0x35, 0x36),
// M20 Device
GEN_UNCORE_IOAPIC_IRQ(0x0017FFFF, 0x30, 0x34, 0x35, 0x36)
})
// Socket 1, IIOStack 0 device legacy interrupt routing
Name (PR40, Package (0x09)
{
// DMI
Package (0x04) { 0x0000FFFF, 0x00, LNKA, 0x00 },
// CBDMA
GEN_UNCORE_LEGACY_IRQ(0x0004FFFF),
// Ubox
GEN_UNCORE_LEGACY_IRQ(0x0008FFFF)
})
// Socket 1, IIOStack 0 device IOAPIC interrupt routing
Name (AR40, Package (0x09)
{
// DMI
Package (0x04) { 0x0000FFFF, 0x00, 0x00, 0x4F },
// CBDMA
GEN_UNCORE_IOAPIC_IRQ(0x0004FFFF, 0x4A, 0x4B, 0x4A, 0x4B),
// Ubox
GEN_UNCORE_IOAPIC_IRQ(0x0008FFFF, 0x48, 0x4C, 0x4D, 0x4E),
})
// Socket 1, IIOStack 1 device legacy interrupt routing
Name (PR50, Package (0x40)
{
// PCI Express Port
GEN_PCIE_LEGACY_IRQ(),
// CHA Devices
GEN_UNCORE_LEGACY_IRQ(0x0008FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0009FFFF),
GEN_UNCORE_LEGACY_IRQ(0x000AFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000BFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000EFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000FFFFF),
GEN_UNCORE_LEGACY_IRQ(0x0010FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0011FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0014FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0015FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0016FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0017FFFF),
GEN_UNCORE_LEGACY_IRQ(0x001DFFFF),
// PCU Devices
GEN_UNCORE_LEGACY_IRQ(0x001EFFFF),
GEN_UNCORE_LEGACY_IRQ(0x001FFFFF)
})
// Socket 1, IIOStack 1 device IOAPIC interrupt routing
Name (AR50, Package (0x40)
{
// PCI Express Port
GEN_PCIE_IOAPIC_IRQ(0x57),
// CHA Devices
GEN_UNCORE_IOAPIC_IRQ(0x0008FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0009FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x000AFFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x000BFFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x000EFFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x000FFFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0010FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0011FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0014FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0015FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0016FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x0017FFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x001DFFFF, 0x50, 0x54, 0x55, 0x56),
// PCU Devices
GEN_UNCORE_IOAPIC_IRQ(0x001EFFFF, 0x50, 0x54, 0x55, 0x56),
GEN_UNCORE_IOAPIC_IRQ(0x001FFFFF, 0x50, 0x54, 0x55, 0x56)
})
// Socket 1, IIOStack 2 device legacy interrupt routing
Name (PR60, Package (0x24)
{
// PCI Express Port
GEN_PCIE_LEGACY_IRQ(),
// Integrated Memory Controller
GEN_UNCORE_LEGACY_IRQ(0x0008FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0009FFFF),
// Uncore Devices
GEN_UNCORE_LEGACY_IRQ(0x000AFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000BFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000CFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000DFFFF),
GEN_UNCORE_LEGACY_IRQ(0x0016FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0017FFFF)
})
// Socket 1, IIOStack 2 device IOAPIC interrupt routing
Name (AR60, Package (0x24)
{
// PCI Express Port
GEN_PCIE_IOAPIC_IRQ(0x5F),
// Integrated Memory Controller
GEN_UNCORE_IOAPIC_IRQ(0x0008FFFF, 0x58, 0x5C, 0x5D, 0x5E),
GEN_UNCORE_IOAPIC_IRQ(0x0009FFFF, 0x58, 0x5C, 0x5D, 0x5E),
// Uncore Devices
GEN_UNCORE_IOAPIC_IRQ(0x000AFFFF, 0x58, 0x5C, 0x5D, 0x5E),
GEN_UNCORE_IOAPIC_IRQ(0x000BFFFF, 0x58, 0x5C, 0x5D, 0x5E),
GEN_UNCORE_IOAPIC_IRQ(0x000CFFFF, 0x58, 0x5C, 0x5D, 0x5E),
GEN_UNCORE_IOAPIC_IRQ(0x000DFFFF, 0x58, 0x5C, 0x5D, 0x5E),
GEN_UNCORE_IOAPIC_IRQ(0x0016FFFF, 0x58, 0x5C, 0x5D, 0x5E),
GEN_UNCORE_IOAPIC_IRQ(0x0017FFFF, 0x58, 0x5C, 0x5D, 0x5E)
})
// Socket 1, IIOStack 3 device legacy interrupt routing
Name (PR68, Package (0x20)
{
// PCI Express Port
GEN_PCIE_LEGACY_IRQ(),
// Uncore Devices
GEN_UNCORE_LEGACY_IRQ(0x000EFFFF),
GEN_UNCORE_LEGACY_IRQ(0x000FFFFF),
GEN_UNCORE_LEGACY_IRQ(0x0010FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0012FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0015FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0016FFFF),
GEN_UNCORE_LEGACY_IRQ(0x0017FFFF)
})
// Socket 1, IIOStack 3 device legacy interrupt routing
Name (AR68, Package (0x20)
{
// PCI Express Port
GEN_PCIE_IOAPIC_IRQ(0x67),
// Uncore Devices
GEN_UNCORE_IOAPIC_IRQ(0x000EFFFF, 0x60, 0x64, 0x65, 0x66),
GEN_UNCORE_IOAPIC_IRQ(0x000FFFFF, 0x60, 0x64, 0x65, 0x66),
GEN_UNCORE_IOAPIC_IRQ(0x0010FFFF, 0x60, 0x64, 0x65, 0x66),
GEN_UNCORE_IOAPIC_IRQ(0x0012FFFF, 0x60, 0x64, 0x65, 0x66),
GEN_UNCORE_IOAPIC_IRQ(0x0015FFFF, 0x60, 0x64, 0x65, 0x66),
GEN_UNCORE_IOAPIC_IRQ(0x0016FFFF, 0x60, 0x64, 0x65, 0x66),
GEN_UNCORE_IOAPIC_IRQ(0x0017FFFF, 0x60, 0x64, 0x65, 0x66)
})

View File

@ -0,0 +1,61 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#include <bootblock_common.h>
#include <device/pci.h>
#include <FsptUpd.h>
#include <intelblocks/fast_spi.h>
#include <soc/iomap.h>
#include <console/console.h>
const FSPT_UPD temp_ram_init_params = {
.FspUpdHeader = {
.Signature = FSPT_UPD_SIGNATURE,
.Revision = 1,
.Reserved = {0},
},
.FsptCoreUpd = {
.MicrocodeRegionBase = (UINT32)CONFIG_CPU_MICROCODE_CBFS_LOC,
.MicrocodeRegionLength = (UINT32)CONFIG_CPU_MICROCODE_CBFS_LEN,
.CodeRegionBase = (uint32_t)(0x100000000ULL - CONFIG_ROM_SIZE),
.CodeRegionLength = (UINT32)CONFIG_ROM_SIZE,
.Reserved1 = {0},
},
.FsptConfig = {
.PcdFsptPort80RouteDisable = 0,
.ReservedTempRamInitUpd = {0},
},
.UnusedUpdSpace0 = {0},
.UpdTerminator = 0x55AA,
};
asmlinkage void bootblock_c_entry(uint64_t base_timestamp)
{
fast_spi_cache_bios_region();
bootblock_main_with_basetime(base_timestamp);
}
void bootblock_soc_early_init(void)
{
fast_spi_early_init(SPI_BASE_ADDRESS);
}
void bootblock_soc_init(void)
{
if (CONFIG(BOOTBLOCK_CONSOLE))
printk(BIOS_DEBUG, "FSP TempRamInit successful...\n");
}

View File

@ -0,0 +1,603 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc.
*
* 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.
*/
#include <cbfs.h>
#include <assert.h>
#include <device/pci.h>
#include <soc/acpi.h>
#include <soc/ramstage.h>
#include <soc/soc_util.h>
struct pci_resource {
struct device *dev;
struct resource *res;
struct pci_resource *next;
};
struct stack_dev_resource {
uint8_t align;
struct pci_resource *children;
struct stack_dev_resource *next;
};
static void assign_stack_resources(struct iiostack_resource *stack_list,
struct device *dev, struct resource *bridge);
static void xeonsp_pci_domain_scan_bus(struct device *dev)
{
DEV_FUNC_ENTER(dev);
struct bus *link = dev->link_list;
printk(BIOS_SPEW, "%s:%s scanning buses under device %s\n",
__FILE__, __func__, dev_path(dev));
while (link != NULL) {
if (link->secondary == 0) { // scan only PSTACK buses
struct device *d;
for (d = link->children; d; d = d->sibling)
pci_probe_dev(d, link, d->path.pci.devfn);
scan_bridges(link);
} else {
pci_scan_bus(link, PCI_DEVFN(0, 0), 0xff);
}
link = link->next;
}
DEV_FUNC_EXIT(dev);
}
static void xeonsp_pci_dev_iterator(struct bus *bus,
void (*dev_iterator)(struct device *, void *),
void (*res_iterator)(struct device *, struct resource *, void *),
void *data)
{
struct device *curdev;
struct resource *res;
/* Walk through all devices and find which resources they need. */
for (curdev = bus->children; curdev; curdev = curdev->sibling) {
struct bus *link;
if (!curdev->enabled)
continue;
if (!curdev->ops || !curdev->ops->read_resources) {
if (curdev->path.type != DEVICE_PATH_APIC)
printk(BIOS_ERR, "%s missing read_resources\n",
dev_path(curdev));
continue;
}
if (dev_iterator)
dev_iterator(curdev, data);
if (res_iterator) {
for (res = curdev->resource_list; res; res = res->next)
res_iterator(curdev, res, data);
}
/* Read in the resources behind the current device's links. */
for (link = curdev->link_list; link; link = link->next)
xeonsp_pci_dev_iterator(link, dev_iterator, res_iterator, data);
}
}
static void xeonsp_pci_dev_read_resources(struct device *dev, void *data)
{
post_log_path(dev);
dev->ops->read_resources(dev);
}
static void xeonsp_pci_dev_dummy_func(struct device *dev)
{
}
static void xeonsp_reset_pci_op(struct device *dev, void *data)
{
if (dev->ops)
dev->ops->read_resources = xeonsp_pci_dev_dummy_func;
}
static STACK_RES *find_stack_for_bus(struct iiostack_resource *info, uint8_t bus)
{
for (int i = 0; i < info->no_of_stacks; ++i) {
if (bus >= info->res[i].BusBase && bus <= info->res[i].BusLimit)
return &info->res[i];
}
return NULL;
}
static void add_res_to_stack(struct stack_dev_resource **root,
struct device *dev, struct resource *res)
{
struct stack_dev_resource *cur = *root;
while (cur) {
if (cur->align == res->align || cur->next == NULL) /* equal or last record */
break;
else if (cur->align > res->align) {
if (cur->next->align < res->align) /* need to insert new record here */
break;
cur = cur->next;
} else {
break;
}
}
struct stack_dev_resource *nr;
if (!cur || cur->align != res->align) { /* need to add new record */
nr = malloc(sizeof(struct stack_dev_resource));
if (nr == 0)
die("assign_resource_to_stack(): out of memory.\n");
memset(nr, 0, sizeof(struct stack_dev_resource));
nr->align = res->align;
if (!cur) {
*root = nr; /* head node */
} else if (cur->align > nr->align) {
if (cur->next == NULL) {
cur->next = nr;
} else {
nr->next = cur->next;
cur->next = nr;
}
} else { /* insert in the beginning */
nr->next = cur;
*root = nr;
}
} else {
nr = cur;
}
assert(nr != NULL && nr->align == res->align);
struct pci_resource *npr = malloc(sizeof(struct pci_resource));
if (npr == NULL)
die("%s: out of memory.\n", __func__);
npr->res = res;
npr->dev = dev;
npr->next = NULL;
if (nr->children == NULL) {
nr->children = npr;
} else {
struct pci_resource *pr = nr->children;
while (pr->next != NULL)
pr = pr->next;
pr->next = npr;
}
}
static void reserve_dev_resources(STACK_RES *stack, unsigned long res_type,
struct stack_dev_resource *res_root, struct resource *bridge)
{
uint8_t align;
uint64_t orig_base, base;
if (res_type & IORESOURCE_IO)
orig_base = stack->PciResourceIoBase;
else if ((res_type & IORESOURCE_MEM) && ((res_type & IORESOURCE_PCI64) ||
(!res_root && bridge && (bridge->flags & IORESOURCE_PREFETCH))))
orig_base = stack->PciResourceMem64Base;
else
orig_base = stack->PciResourceMem32Base;
align = 0;
base = orig_base;
int first = 1;
while (res_root) { /* loop through all devices grouped by alignment requirements */
struct pci_resource *pr = res_root->children;
while (pr) {
if (first) {
if (bridge) { /* takes highest alignment */
if (bridge->align < pr->res->align)
bridge->align = pr->res->align;
orig_base = ALIGN_UP(orig_base, 1 << bridge->align);
} else {
orig_base = ALIGN_UP(orig_base, 1 << pr->res->align);
}
base = orig_base;
if (bridge)
bridge->base = base;
pr->res->base = base;
first = 0;
} else {
pr->res->base = ALIGN_UP(base, 1 << pr->res->align);
}
pr->res->limit = pr->res->base + pr->res->size - 1;
base = pr->res->limit + 1;
pr->res->flags |= (IORESOURCE_ASSIGNED);
pr = pr->next;
}
res_root = res_root->next;
}
if (bridge) {
/* this bridge doesn't have any resources, will set it to default window */
if (first) {
orig_base = ALIGN_UP(orig_base, 1 << bridge->align);
bridge->base = orig_base;
base = orig_base + (1ULL << bridge->gran);
}
bridge->size = ALIGN_UP(base, 1 << bridge->align) - bridge->base;
bridge->limit = bridge->base + bridge->size - 1;
bridge->flags |= (IORESOURCE_ASSIGNED);
base = bridge->limit + 1;
}
/* update new limits */
if (res_type & IORESOURCE_IO)
stack->PciResourceIoBase = base;
else if ((res_type & IORESOURCE_MEM) && ((res_type & IORESOURCE_PCI64) ||
(!res_root && bridge && (bridge->flags & IORESOURCE_PREFETCH))))
stack->PciResourceMem64Base = base;
else
stack->PciResourceMem32Base = base;
}
static void reclaim_resource_mem(struct stack_dev_resource *res_root)
{
while (res_root) { /* loop through all devices grouped by alignment requirements */
/* free pci_resource */
struct pci_resource *pr = res_root->children;
while (pr) {
struct pci_resource *dpr = pr;
pr = pr->next;
free(dpr);
}
/* free stack_dev_resource */
struct stack_dev_resource *ddr = res_root;
res_root = res_root->next;
free(ddr);
}
}
static void assign_bridge_resources(struct iiostack_resource *stack_list,
struct device *dev, struct resource *bridge)
{
struct resource *res;
if (!dev->enabled)
return;
for (res = dev->resource_list; res; res = res->next) {
if (!(res->flags & IORESOURCE_BRIDGE) ||
(bridge && ((bridge->flags & (IORESOURCE_IO | IORESOURCE_MEM |
IORESOURCE_PREFETCH | IORESOURCE_PCI64)) !=
(res->flags & (IORESOURCE_IO | IORESOURCE_MEM |
IORESOURCE_PREFETCH | IORESOURCE_PCI64)))))
continue;
assign_stack_resources(stack_list, dev, res);
if (!bridge)
continue;
/* for 1st time update, overlading IORESOURCE_ASSIGNED */
if (!(bridge->flags & IORESOURCE_ASSIGNED)) {
bridge->base = res->base;
bridge->limit = res->limit;
bridge->flags |= (IORESOURCE_ASSIGNED);
} else {
/* update bridge range from child bridge range */
if (res->base < bridge->base)
bridge->base = res->base;
if (res->limit > bridge->limit)
bridge->limit = res->limit;
}
bridge->size = (bridge->limit - bridge->base + 1);
}
}
static void assign_stack_resources(struct iiostack_resource *stack_list,
struct device *dev, struct resource *bridge)
{
struct bus *bus;
/* Read in the resources behind the current device's links. */
for (bus = dev->link_list; bus; bus = bus->next) {
struct device *curdev;
STACK_RES *stack;
/* get IIO stack for this bus */
stack = find_stack_for_bus(stack_list, bus->secondary);
assert(stack != NULL);
/* Assign resources to bridge */
for (curdev = bus->children; curdev; curdev = curdev->sibling)
assign_bridge_resources(stack_list, curdev, bridge);
/* Pick non-bridged resources for resource allocation for each resource type */
unsigned long flags[5] = {IORESOURCE_IO, IORESOURCE_MEM,
(IORESOURCE_PCI64|IORESOURCE_MEM), (IORESOURCE_MEM|IORESOURCE_PREFETCH),
(IORESOURCE_PCI64|IORESOURCE_MEM|IORESOURCE_PREFETCH)};
uint8_t no_res_types = 5;
if (bridge) {
flags[0] = bridge->flags &
(IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH);
if ((bridge->flags & IORESOURCE_MEM) &&
(bridge->flags & IORESOURCE_PREFETCH))
flags[0] |= IORESOURCE_PCI64;
no_res_types = 1;
}
/* Process each resource type */
for (int rt = 0; rt < no_res_types; ++rt) {
struct stack_dev_resource *res_root = NULL;
for (curdev = bus->children; curdev; curdev = curdev->sibling) {
struct resource *res;
if (!curdev->enabled)
continue;
for (res = curdev->resource_list; res; res = res->next) {
if ((res->flags & IORESOURCE_BRIDGE) || (res->flags &
(IORESOURCE_STORED | IORESOURCE_RESERVE |
IORESOURCE_FIXED | IORESOURCE_ASSIGNED)
) || ((res->flags & (IORESOURCE_IO |
IORESOURCE_MEM | IORESOURCE_PCI64
| IORESOURCE_PREFETCH))
!= flags[rt]) || res->size == 0)
continue;
else
add_res_to_stack(&res_root, curdev, res);
}
}
/* Allocate resources and update bridge range */
if (res_root || (bridge && !(bridge->flags & IORESOURCE_ASSIGNED))) {
reserve_dev_resources(stack, flags[rt], res_root, bridge);
reclaim_resource_mem(res_root);
}
}
}
}
static void xeonsp_constrain_pci_resources(struct device *dev, struct resource *res, void *data)
{
STACK_RES *stack = (STACK_RES *) data;
if (!(res->flags & IORESOURCE_FIXED))
return;
uint64_t base, limit;
if (res->flags & IORESOURCE_IO) {
base = stack->PciResourceIoBase;
limit = stack->PciResourceIoLimit;
} else if ((res->flags & IORESOURCE_MEM) && (res->flags & IORESOURCE_PCI64)) {
base = stack->PciResourceMem64Base;
limit = stack->PciResourceMem64Limit;
} else {
base = stack->PciResourceMem32Base;
limit = stack->PciResourceMem32Limit;
}
if (((res->base + res->size - 1) < base) || (res->base > limit)) /* outside window */
return;
if (res->limit > limit) /* resource end is out of limit */
limit = res->base - 1;
else
base = res->base + res->size;
if (res->flags & IORESOURCE_IO) {
stack->PciResourceIoBase = base;
stack->PciResourceIoLimit = limit;
} else if ((res->flags & IORESOURCE_MEM) && (res->flags & IORESOURCE_PCI64)) {
stack->PciResourceMem64Base = base;
stack->PciResourceMem64Limit = limit;
} else {
stack->PciResourceMem32Base = base;
stack->PciResourceMem32Limit = limit;
}
}
static void xeonsp_pci_domain_read_resources(struct device *dev)
{
struct bus *link;
DEV_FUNC_ENTER(dev);
pci_domain_read_resources(dev);
/*
* Walk through all devices in this domain and read resources.
* Since there is no callback when read resource operation is
* complete for all devices, domain read resource function initiates
* read resources for all devices and swaps read resource operation
* with dummy function to avoid warning.
*/
for (link = dev->link_list; link; link = link->next)
xeonsp_pci_dev_iterator(link, xeonsp_pci_dev_read_resources, NULL, NULL);
for (link = dev->link_list; link; link = link->next)
xeonsp_pci_dev_iterator(link, xeonsp_reset_pci_op, NULL, NULL);
/*
* 1. group devices, resources for each stack
* 2. order resources in descending order of requested resource allocation sizes
*/
struct iiostack_resource stack_info = {0};
get_iiostack_info(&stack_info);
/* constrain stack window */
for (link = dev->link_list; link; link = link->next) {
STACK_RES *stack = find_stack_for_bus(&stack_info, link->secondary);
assert(stack != 0);
xeonsp_pci_dev_iterator(link, NULL, xeonsp_constrain_pci_resources, stack);
}
/* assign resources */
assign_stack_resources(&stack_info, dev, NULL);
DEV_FUNC_EXIT(dev);
}
static void reset_resource_to_unassigned(struct device *dev, struct resource *res, void *data)
{
if ((res->flags & (IORESOURCE_IO | IORESOURCE_MEM)) &&
!(res->flags & (IORESOURCE_FIXED | IORESOURCE_RESERVE))) {
res->flags &= ~IORESOURCE_ASSIGNED;
}
}
static void xeonsp_pci_domain_set_resources(struct device *dev)
{
DEV_FUNC_ENTER(dev);
print_resource_tree(dev, BIOS_SPEW, "Before xeonsp pci domain set resource");
/* reset bus 0 dev resource assignment - need to change them to FSP IIOStack window */
xeonsp_pci_dev_iterator(dev->link_list, NULL, reset_resource_to_unassigned, NULL);
/* update dev resources based on IIOStack IO/Mem32/Mem64 windows */
xeonsp_pci_domain_read_resources(dev);
struct bus *link = dev->link_list;
while (link != NULL) {
assign_resources(link);
link = link->next;
}
print_resource_tree(dev, BIOS_SPEW, "After xeonsp pci domain set resource");
DEV_FUNC_EXIT(dev);
}
static struct device_operations pci_domain_ops = {
.read_resources = &pci_domain_read_resources,
.set_resources = &xeonsp_pci_domain_set_resources,
.scan_bus = &xeonsp_pci_domain_scan_bus,
#if CONFIG(HAVE_ACPI_TABLES)
.write_acpi_tables = &northbridge_write_acpi_tables,
#endif
};
static struct device_operations cpu_bus_ops = {
.read_resources = DEVICE_NOOP,
.set_resources = DEVICE_NOOP,
.enable_resources = DEVICE_NOOP,
.init = xeon_sp_init_cpus,
.scan_bus = NULL,
#if CONFIG(HAVE_ACPI_TABLES)
/* defined in src/soc/intel/common/block/acpi/acpi.c */
.acpi_fill_ssdt_generator = generate_cpu_entries,
#endif
};
/* Attach IIO stack bus numbers with dummy device to PCI DOMAIN 0000 device */
static void attach_iio_stacks(struct device *dev)
{
struct bus *iiostack_bus;
struct device dummy;
struct iiostack_resource stack_info = {0};
DEV_FUNC_ENTER(dev);
get_iiostack_info(&stack_info);
for (int s = 0; s < stack_info.no_of_stacks; ++s) {
/* only non zero bus no. needs to be enumerated */
if (stack_info.res[s].BusBase == 0)
continue;
iiostack_bus = malloc(sizeof(struct bus));
if (iiostack_bus == NULL)
die("%s: out of memory.\n", __func__);
memset(iiostack_bus, 0, sizeof(*iiostack_bus));
memcpy(iiostack_bus, dev->bus, sizeof(*iiostack_bus));
iiostack_bus->secondary = stack_info.res[s].BusBase;
iiostack_bus->subordinate = stack_info.res[s].BusBase;
iiostack_bus->dev = NULL;
iiostack_bus->children = NULL;
iiostack_bus->next = NULL;
iiostack_bus->link_num = 1;
dummy.bus = iiostack_bus;
dummy.path.type = DEVICE_PATH_PCI;
dummy.path.pci.devfn = 0;
uint32_t id = pci_read_config32(&dummy, PCI_VENDOR_ID);
if (id == 0xffffffff)
printk(BIOS_WARNING, "IIO Stack device %s not visible\n",
dev_path(&dummy));
if (dev->link_list == NULL) {
dev->link_list = iiostack_bus;
} else {
struct bus *nlink = dev->link_list;
while (nlink->next != NULL)
nlink = nlink->next;
nlink->next = iiostack_bus;
}
}
DEV_FUNC_EXIT(dev);
}
static void soc_enable_dev(struct device *dev)
{
/* Set the operations if it is a special bus type */
if (dev->path.type == DEVICE_PATH_DOMAIN) {
dev->ops = &pci_domain_ops;
attach_iio_stacks(dev);
} else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
dev->ops = &cpu_bus_ops;
}
}
static void soc_init(void *data)
{
printk(BIOS_DEBUG, "coreboot: calling fsp_silicon_init\n");
fsp_silicon_init(false);
}
static void soc_final(void *data)
{
// Temp Fix - should be done by FSP, in 2S bios completion
// is not carried out on socket 2
set_bios_init_completion();
}
static void soc_silicon_init_params(FSPS_UPD *silupd)
{
}
void platform_fsp_silicon_init_params_cb(FSPS_UPD *silupd)
{
const struct microcode *microcode_file;
size_t microcode_len;
microcode_file = cbfs_boot_map_with_leak("cpu_microcode_blob.bin",
CBFS_TYPE_MICROCODE, &microcode_len);
if ((microcode_file != NULL) && (microcode_len != 0)) {
/* Update CPU Microcode patch base address/size */
silupd->FspsConfig.PcdCpuMicrocodePatchBase =
(uint32_t)microcode_file;
silupd->FspsConfig.PcdCpuMicrocodePatchSize =
(uint32_t)microcode_len;
}
soc_silicon_init_params(silupd);
mainboard_silicon_init_params(silupd);
}
struct chip_operations soc_intel_xeon_sp_ops = {
CHIP_NAME("Intel Xeon-SP SOC")
.enable_dev = soc_enable_dev,
.init = soc_init,
.final = soc_final
};
struct pci_operations soc_pci_ops = {
.set_subsystem = pci_dev_set_subsystem,
};

View File

@ -0,0 +1,87 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#ifndef _SOC_CHIP_H_
#define _SOC_CHIP_H_
#include <stdint.h>
#include <intelblocks/cfg.h>
#include <soc/irq.h>
struct soc_intel_xeon_sp_config {
/* Common struct containing soc config data required by common code */
struct soc_intel_common_config common_soc_config;
/**
* Interrupt Routing configuration
* If bit7 is 1, the interrupt is disabled.
*/
uint8_t pirqa_routing;
uint8_t pirqb_routing;
uint8_t pirqc_routing;
uint8_t pirqd_routing;
uint8_t pirqe_routing;
uint8_t pirqf_routing;
uint8_t pirqg_routing;
uint8_t pirqh_routing;
/**
* Device Interrupt Routing configuration
* Interrupt Pin x Route.
* 0h = PIRQA#
* 1h = PIRQB#
* 2h = PIRQC#
* 3h = PIRQD#
* 4h = PIRQE#
* 5h = PIRQF#
* 6h = PIRQG#
* 7h = PIRQH#
*/
uint16_t ir00_routing;
uint16_t ir01_routing;
uint16_t ir02_routing;
uint16_t ir03_routing;
uint16_t ir04_routing;
/**
* Device Interrupt Polarity Control
* ipc0 - IRQ-00-31 - 1: Active low to IOAPIC, 0: Active high to IOAPIC
* ipc1 - IRQ-32-63 - 1: Active low to IOAPIC, 0: Active high to IOAPIC
* ipc2 - IRQ-64-95 - 1: Active low to IOAPIC, 0: Active high to IOAPIC
* ipc3 - IRQ-96-119 - 1: Active low to IOAPIC, 0: Active high to IOAPIC
*/
uint32_t ipc0;
uint32_t ipc1;
uint32_t ipc2;
uint32_t ipc3;
uint64_t turbo_ratio_limit;
uint64_t turbo_ratio_limit_cores;
uint32_t pstate_req_ratio;
uint32_t vtd_support;
uint32_t coherency_support;
uint32_t ats_support;
};
extern struct chip_operations soc_intel_xeon_sp_ops;
typedef struct soc_intel_xeon_sp_config config_t;
#endif

260
src/soc/intel/xeon_sp/cpu.c Normal file
View File

@ -0,0 +1,260 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <console/console.h>
#include <intelblocks/cpulib.h>
#include <cpu/cpu.h>
#include <cpu/x86/mtrr.h>
#include <cpu/x86/mp.h>
#include <cpu/intel/turbo.h>
#include <soc/msr.h>
#include <soc/cpu.h>
#include <soc/soc_util.h>
#include <assert.h>
#include "chip.h"
static const config_t *chip_config = NULL;
static void xeon_configure_mca(void)
{
msr_t msr;
struct cpuid_result cpuid_regs;
/* Check feature flag in CPUID.(EAX=1):EDX[7]==1 MCE
* and CPUID.(EAX=1):EDX[14]==1 MCA*/
cpuid_regs = cpuid(1);
if ((cpuid_regs.edx & (1<<7 | 1<<14)) != (1<<7 | 1<<14))
return;
msr = rdmsr(IA32_MCG_CAP);
if (msr.lo & IA32_MCG_CAP_CTL_P_MASK) {
/* Enable all error logging */
msr.lo = msr.hi = 0xffffffff;
wrmsr(IA32_MCG_CTL, msr);
}
/* TODO(adurbin): This should only be done on a cold boot. Also, some
of these banks are core vs package scope. For now every CPU clears
every bank. */
mca_configure();
}
static void xeon_sp_core_init(struct device *cpu)
{
msr_t msr;
printk(BIOS_INFO, "%s dev: %s, cpu: %d, apic_id: 0x%x\n",
__func__, dev_path(cpu), cpu_index(), cpu->path.apic.apic_id);
assert(chip_config != NULL);
/* set MSR_PKG_CST_CONFIG_CONTROL - scope per core*/
msr.hi = 0;
msr.lo = (PKG_CSTATE_NO_LIMIT | IO_MWAIT_REDIRECTION_ENABLE | CFG_LOCK_ENABLE);
wrmsr(MSR_PKG_CST_CONFIG_CONTROL, msr);
/* set MSR_PMG_IO_CAPTURE_BASE - scope per core */
msr.hi = 0;
msr.lo = (LVL_2_BASE_ADDRESS | CST_RANGE_MAX_C6);
wrmsr(MSR_PMG_IO_CAPTURE_BASE, msr);
/* Enable Energy Perf Bias Access, Dynamic switching and lock MSR */
msr = rdmsr(MSR_POWER_CTL);
msr.lo |= (ENERGY_PERF_BIAS_ACCESS_ENABLE | PWR_PERF_TUNING_DYN_SWITCHING_ENABLE
| PROCHOT_LOCK_ENABLE);
wrmsr(MSR_POWER_CTL, msr);
/* Set P-State ratio */
msr = rdmsr(MSR_IA32_PERF_CTRL);
msr.lo &= ~PSTATE_REQ_MASK;
msr.lo |= (chip_config->pstate_req_ratio << PSTATE_REQ_SHIFT);
wrmsr(MSR_IA32_PERF_CTRL, msr);
/*
* Set HWP base feature, EPP reg enumeration, lock thermal and msr
* TODO: Set LOCK_MISC_PWR_MGMT_MSR, Unexpected Exception if you
* lock & issue wrmsr on every thread
* This is package level MSR. Need to check if it updates correctly on
* multi-socket platform.
*/
msr = rdmsr(MSR_MISC_PWR_MGMT);
if (!(msr.lo & LOCK_MISC_PWR_MGMT_MSR)) { /* if already locked skip update */
msr.lo = (HWP_ENUM_ENABLE | HWP_EPP_ENUM_ENABLE | LOCK_MISC_PWR_MGMT_MSR |
LOCK_THERM_INT);
wrmsr(MSR_MISC_PWR_MGMT, msr);
}
/* TODO MSR_VR_MISC_CONFIG */
/* Set current limit lock */
msr = rdmsr(MSR_VR_CURRENT_CONFIG);
msr.lo |= CURRENT_LIMIT_LOCK;
wrmsr(MSR_VR_CURRENT_CONFIG, msr);
/* Set Turbo Ratio Limits */
msr.lo = chip_config->turbo_ratio_limit & 0xffffffff;
msr.hi = (chip_config->turbo_ratio_limit >> 32) & 0xffffffff;
wrmsr(MSR_TURBO_RATIO_LIMIT, msr);
/* Set Turbo Ratio Limit Cores */
msr.lo = chip_config->turbo_ratio_limit_cores & 0xffffffff;
msr.hi = (chip_config->turbo_ratio_limit_cores >> 32) & 0xffffffff;
wrmsr(MSR_TURBO_RATIO_LIMIT_CORES, msr);
/* set Turbo Activation ratio */
msr.hi = 0;
msr = rdmsr(MSR_TURBO_ACTIVATION_RATIO);
msr.lo |= MAX_NON_TURBO_RATIO;
wrmsr(MSR_TURBO_ACTIVATION_RATIO, msr);
/* Enable Fast Strings */
msr = rdmsr(IA32_MISC_ENABLE);
msr.lo |= FAST_STRINGS_ENABLE_BIT;
wrmsr(IA32_MISC_ENABLE, msr);
/* Set energy policy */
msr_t msr1 = rdmsr(MSR_ENERGY_PERF_BIAS_CONFIG);
msr.lo = (msr1.lo & EPB_ENERGY_POLICY_MASK) >> EPB_ENERGY_POLICY_SHIFT;
msr.hi = 0;
wrmsr(MSR_IA32_ENERGY_PERF_BIAS, msr);
/* Enable Turbo */
enable_turbo();
/* Enable speed step. */
if (get_turbo_state() == TURBO_ENABLED) {
msr = rdmsr(IA32_MISC_ENABLE);
msr.lo |= SPEED_STEP_ENABLE_BIT;
wrmsr(IA32_MISC_ENABLE, msr);
}
/* Clear out pending MCEs */
xeon_configure_mca();
}
static struct device_operations cpu_dev_ops = {
.init = xeon_sp_core_init,
};
static const struct cpu_device_id cpu_table[] = {
/* Skylake-SP A0/A1 CPUID 0x506f0*/
{X86_VENDOR_INTEL, CPUID_SKYLAKE_SP_A0_A1},
/* Skylake-SP B0 CPUID 0x506f1*/
{X86_VENDOR_INTEL, CPUID_SKYLAKE_SP_B0},
/* Skylake-SP 4 CPUID 0x50654*/
{X86_VENDOR_INTEL, CPUID_SKYLAKE_SP_4},
{0, 0},
};
static const struct cpu_driver driver __cpu_driver = {
.ops = &cpu_dev_ops,
.id_table = cpu_table,
};
static void set_max_turbo_freq(void)
{
msr_t msr, perf_ctl;
FUNC_ENTER();
perf_ctl.hi = 0;
/* Check for configurable TDP option */
if (get_turbo_state() == TURBO_ENABLED) {
msr = rdmsr(MSR_TURBO_RATIO_LIMIT);
perf_ctl.lo = (msr.lo & 0xff) << 8;
} else if (cpu_config_tdp_levels()) {
/* Set to nominal TDP ratio */
msr = rdmsr(MSR_CONFIG_TDP_NOMINAL);
perf_ctl.lo = (msr.lo & 0xff) << 8;
} else {
/* Platform Info bits 15:8 give max ratio */
msr = rdmsr(MSR_PLATFORM_INFO);
perf_ctl.lo = msr.lo & 0xff00;
}
wrmsr(IA32_PERF_CTL, perf_ctl);
printk(BIOS_DEBUG, "cpu: frequency set to %d\n",
((perf_ctl.lo >> 8) & 0xff) * CPU_BCLK);
FUNC_EXIT();
}
/*
* Do essential initialization tasks before APs can be fired up
*
* Prevent race condition in MTRR solution. Enable MTRRs on the BSP. This
* creates the MTRR solution that the APs will use. Otherwise APs will try to
* apply the incomplete solution as the BSP is calculating it.
*/
static void pre_mp_init(void)
{
printk(BIOS_DEBUG, "%s: entry\n", __func__);
x86_setup_fixed_mtrrs();
}
static void post_mp_init(void)
{
/* Set Max Ratio */
set_max_turbo_freq();
/*
* TODO: Now that all APs have been relocated as well as the BSP let SMIs
* start flowing.
*/
}
/*
* CPU initialization recipe
*
* Note that no microcode update is passed to the init function. CSE updates
* the microcode on all cores before releasing them from reset. That means that
* the BSP and all APs will come up with the same microcode revision.
*/
static const struct mp_ops mp_ops = {
.pre_mp_init = pre_mp_init,
.get_cpu_count = get_platform_thread_count,
//.get_smm_info = get_smm_info, /* TODO */
.get_smm_info = NULL,
//.pre_mp_smm_init = southcluster_smm_clear_state, /* TODO */
.pre_mp_smm_init = NULL,
//.relocation_handler = relocation_handler, /* TODO */
.relocation_handler = NULL,
.post_mp_init = post_mp_init,
};
void xeon_sp_init_cpus(struct device *dev)
{
FUNC_ENTER();
/*
* This gets used in cpu device callback. Other than cpu 0,
* rest of the CPU devices do not have
* chip_info updated. Global chip_config is used as workaround
*/
chip_config = dev->chip_info;
config_reset_cpl3_csrs();
/* calls src/cpu/x86/mp_init.c */
if (mp_init_with_smm(dev->link_list, &mp_ops) < 0)
printk(BIOS_ERR, "MP initialization failure.\n");
/* update numa domain for all cpu devices */
xeonsp_init_cpu_config();
FUNC_EXIT();
}

View File

@ -0,0 +1,235 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <console/console.h>
#include <fsp/util.h>
#include <lib.h>
#include <assert.h>
#include <hob_iiouds.h>
#include <hob_memmap.h>
static const uint8_t fsp_hob_iio_uds_guid[16] = FSP_HOB_IIO_UNIVERSAL_DATA_GUID;
static const uint8_t fsp_hob_memmap_guid[16] = FSP_SYSTEM_MEMORYMAP_HOB_GUID;
struct guid_name_map {
const void *guid;
const char *name;
};
static const struct guid_name_map guid_names[] = {
{ fsp_hob_iio_uds_guid, "FSP_HOB_IIO_UNIVERSAL_DATA_GUID" },
{ fsp_hob_memmap_guid, "FSP_SYSTEM_MEMORYMAP_HOB_GUID" },
};
const char *soc_get_guid_name(const uint8_t *guid)
{
size_t index;
/* Compare the GUID values in this module */
for (index = 0; index < ARRAY_SIZE(guid_names); index++)
if (fsp_guid_compare(guid, guid_names[index].guid))
return guid_names[index].name;
return NULL;
}
void soc_display_hob(const struct hob_header *hob)
{
const struct hob_resource *res;
res = fsp_hob_header_to_resource(hob);
assert(res != NULL);
printk(BIOS_DEBUG, "\tResource type: 0x%x, attribute: 0x%x, addr: 0x%08llx, len: 0x%08llx\n",
res->type, res->attribute_type, res->addr, res->length);
printk(BIOS_DEBUG, "\tOwner GUID: ");
fsp_print_guid(res->owner_guid);
printk(BIOS_DEBUG, " (%s)\n", fsp_get_guid_name(res->owner_guid));
if (fsp_guid_compare(res->owner_guid, fsp_hob_iio_uds_guid) == 0)
soc_display_iio_universal_data_hob();
else if (fsp_guid_compare(res->owner_guid, fsp_hob_memmap_guid) == 0)
soc_display_memmap_hob();
else
hexdump(hob, hob->length);
}
void soc_display_memmap_hob(void)
{
size_t hob_size = 0;
const struct SystemMemoryMapHob *hob =
fsp_find_extension_hob_by_guid(fsp_hob_memmap_guid, &hob_size);
assert(hob != NULL && hob_size != 0);
printk(BIOS_DEBUG, "===================== MEMORY MAP HOB DATA =====================\n");
printk(BIOS_DEBUG, "hob: %p, hob_size: 0x%lx, SystemMemoryMapHob size: 0x%lx, "
"MAX_SOCKET: %d, SAD_RULES: %d\n",
hob, hob_size, sizeof(struct SystemMemoryMapHob), MAX_SOCKET, SAD_RULES);
printk(BIOS_DEBUG, "\tlowMemBase: 0x%x, lowMemSize: 0x%x, highMemBase: 0x%x, "
"highMemSize: 0x%x\n",
hob->lowMemBase, hob->lowMemSize, hob->highMemBase, hob->highMemSize);
printk(BIOS_DEBUG, "\tasilLoMemBase: 0x%x, asilHiMemBase: 0x%x, asilLoMemSize: 0x%x, "
"asilHiMemSize: 0x%x\n",
hob->lowMemBase, hob->lowMemSize, hob->highMemBase, hob->highMemSize);
printk(BIOS_DEBUG, "\tmemSize: 0x%x, memFreq: 0x%x, memMode: 0x%x, volMemMode: 0x%x, "
"DimmType: 0x%x, DramType: 0x%x\n",
hob->memSize, hob->memFreq, hob->memMode, hob->volMemMode,
hob->DimmType, hob->DramType);
printk(BIOS_DEBUG, "\tNumChPerMC: 0x%x, numberEntries: 0x%x, maxIMC: 0x%x, maxCh: 0x%x\n",
hob->NumChPerMC, hob->numberEntries, hob->maxIMC, hob->maxCh);
printk(BIOS_DEBUG, "\tSystemMemoryMapElement Entries: %d\n", hob->numberEntries);
for (int e = 0; e < hob->numberEntries; ++e) {
const struct SystemMemoryMapElement *mem_element = &hob->Element[e];
printk(BIOS_DEBUG, "\t\tmemory_map %d BaseAddress: 0x%x, ElementSize: 0x%x, Type: 0x%x\n",
e, mem_element->BaseAddress,
mem_element->ElementSize, mem_element->Type);
}
}
void soc_display_iio_universal_data_hob(void)
{
size_t hob_size = 0;
const IIO_UDS *hob = fsp_find_extension_hob_by_guid(fsp_hob_iio_uds_guid, &hob_size);
assert(hob != NULL && hob_size != 0);
printk(BIOS_DEBUG, "===================== IIO_UDS HOB DATA =====================\n");
printk(BIOS_DEBUG, "\t===================== SYSTEM STATUS =====================\n");
printk(BIOS_DEBUG, "\tcpuType: 0x%x\n", hob->SystemStatus.cpuType);
printk(BIOS_DEBUG, "\tcpuSubType: 0x%x\n", hob->SystemStatus.cpuSubType);
printk(BIOS_DEBUG, "\tSystemRasType: 0x%x\n", hob->SystemStatus.SystemRasType);
printk(BIOS_DEBUG, "\tnumCpus: 0x%x\n", hob->SystemStatus.numCpus);
for (int x = 0; x < MAX_SOCKET; ++x) {
printk(BIOS_DEBUG, "\tSocket %d FusedCores: 0x%x, ActiveCores: 0x%x, "
"MaxCoreToBusRatio: 0x%x, MinCoreToBusRatio: 0x%x\n",
x, hob->SystemStatus.FusedCores[x], hob->SystemStatus.ActiveCores[x],
hob->SystemStatus.MaxCoreToBusRatio[x],
hob->SystemStatus.MinCoreToBusRatio[x]);
}
printk(BIOS_DEBUG, "\tCurrentCoreToBusRatio: 0x%x\n",
hob->SystemStatus.CurrentCoreToBusRatio);
printk(BIOS_DEBUG, "\tIntelSpeedSelectCapable: 0x%x\n",
hob->SystemStatus.IntelSpeedSelectCapable);
printk(BIOS_DEBUG, "\tIssConfigTdpLevelInfo: 0x%x\n",
hob->SystemStatus.IssConfigTdpLevelInfo);
for (int x = 0; x < TDP_MAX_LEVEL; ++x) {
printk(BIOS_DEBUG, "\t\tTDL Level %d IssConfigTdpTdpInfo: 0x%x, "
"IssConfigTdpPowerInfo: 0x%x, IssConfigTdpCoreCount: 0x%x\n",
x, hob->SystemStatus.IssConfigTdpTdpInfo[x],
hob->SystemStatus.IssConfigTdpPowerInfo[x],
hob->SystemStatus.IssConfigTdpCoreCount[x]);
}
printk(BIOS_DEBUG, "\tsocketPresentBitMap: 0x%x\n",
hob->SystemStatus.socketPresentBitMap);
printk(BIOS_DEBUG, "\ttolmLimit: 0x%x\n", hob->SystemStatus.tolmLimit);
printk(BIOS_DEBUG, "\ttohmLimit: 0x%x\n", hob->SystemStatus.tohmLimit);
printk(BIOS_DEBUG, "\tmmCfgBase: 0x%x\n", hob->SystemStatus.mmCfgBase);
printk(BIOS_DEBUG, "\tnumChPerMC: 0x%x\n", hob->SystemStatus.numChPerMC);
printk(BIOS_DEBUG, "\tmaxCh: 0x%x\n", hob->SystemStatus.maxCh);
printk(BIOS_DEBUG, "\tmaxIMC: 0x%x\n", hob->SystemStatus.maxIMC);
printk(BIOS_DEBUG, "\t===================== PLATFORM DATA =====================\n");
printk(BIOS_DEBUG, "\tPlatGlobalIoBase: 0x%x\n", hob->PlatformData.PlatGlobalIoBase);
printk(BIOS_DEBUG, "\tPlatGlobalIoLimit: 0x%x\n", hob->PlatformData.PlatGlobalIoLimit);
printk(BIOS_DEBUG, "\tPlatGlobalMmiolBase: 0x%x\n",
hob->PlatformData.PlatGlobalMmiolBase);
printk(BIOS_DEBUG, "\tPlatGlobalMmiolLimit: 0x%x\n",
hob->PlatformData.PlatGlobalMmiolLimit);
printk(BIOS_DEBUG, "\tPlatGlobalMmiohBase: 0x%llx\n",
hob->PlatformData.PlatGlobalMmiohBase);
printk(BIOS_DEBUG, "\tPlatGlobalMmiohLimit: 0x%llx\n",
hob->PlatformData.PlatGlobalMmiohLimit);
printk(BIOS_DEBUG, "\tMemTsegSize: 0x%x\n", hob->PlatformData.MemTsegSize);
printk(BIOS_DEBUG, "\tMemIedSize: 0x%x\n", hob->PlatformData.MemIedSize);
printk(BIOS_DEBUG, "\tPciExpressBase: 0x%llx\n", hob->PlatformData.PciExpressBase);
printk(BIOS_DEBUG, "\tPciExpressSize: 0x%x\n", hob->PlatformData.PciExpressSize);
printk(BIOS_DEBUG, "\tMemTolm: 0x%x\n", hob->PlatformData.MemTolm);
printk(BIOS_DEBUG, "\tnumofIIO: 0x%x\n", hob->PlatformData.numofIIO);
printk(BIOS_DEBUG, "\tMaxBusNumber: 0x%x\n", hob->PlatformData.MaxBusNumber);
printk(BIOS_DEBUG, "\tIoGranularity: 0x%x\n", hob->PlatformData.IoGranularity);
printk(BIOS_DEBUG, "\tMmiolGranularity: 0x%x\n", hob->PlatformData.MmiolGranularity);
printk(BIOS_DEBUG, "\tMmiohGranularity: hi: 0x%x, lo:0x%x\n",
hob->PlatformData.MmiohGranularity.hi, hob->PlatformData.MmiohGranularity.lo);
for (int s = 0; s < hob->PlatformData.numofIIO; ++s) {
printk(BIOS_DEBUG, "\t============ Socket %d Info ================\n", s);
printk(BIOS_DEBUG, "\tSocketID: 0x%x\n",
hob->PlatformData.IIO_resource[s].SocketID);
printk(BIOS_DEBUG, "\tBusBase: 0x%x\n",
hob->PlatformData.IIO_resource[s].BusBase);
printk(BIOS_DEBUG, "\tBusLimit: 0x%x\n",
hob->PlatformData.IIO_resource[s].BusLimit);
printk(BIOS_DEBUG, "\tPciResourceIoBase: 0x%x\n",
hob->PlatformData.IIO_resource[s].PciResourceIoBase);
printk(BIOS_DEBUG, "\tPciResourceIoLimit: 0x%x\n",
hob->PlatformData.IIO_resource[s].PciResourceIoLimit);
printk(BIOS_DEBUG, "\tIoApicBase: 0x%x\n",
hob->PlatformData.IIO_resource[s].IoApicBase);
printk(BIOS_DEBUG, "\tIoApicLimit: 0x%x\n",
hob->PlatformData.IIO_resource[s].IoApicLimit);
printk(BIOS_DEBUG, "\tPciResourceMem32Base: 0x%x\n",
hob->PlatformData.IIO_resource[s].PciResourceMem32Base);
printk(BIOS_DEBUG, "\tPciResourceMem32Limit: 0x%x\n",
hob->PlatformData.IIO_resource[s].PciResourceMem32Limit);
printk(BIOS_DEBUG, "\tPciResourceMem64Base: 0x%llx\n",
hob->PlatformData.IIO_resource[s].PciResourceMem64Base);
printk(BIOS_DEBUG, "\tPciResourceMem64Limit: 0x%llx\n",
hob->PlatformData.IIO_resource[s].PciResourceMem64Limit);
printk(BIOS_DEBUG, "\t============ Stack Info ================\n");
for (int x = 0; x < MAX_IIO_STACK; ++x) {
const STACK_RES *ri = &hob->PlatformData.IIO_resource[s].StackRes[x];
printk(BIOS_DEBUG, "\t\t========== Stack %d ===============\n", x);
printk(BIOS_DEBUG, "\t\tBusBase: 0x%x\n", ri->BusBase);
printk(BIOS_DEBUG, "\t\tBusLimit: 0x%x\n", ri->BusLimit);
printk(BIOS_DEBUG, "\t\tPciResourceIoBase: 0x%x\n",
ri->PciResourceIoBase);
printk(BIOS_DEBUG, "\t\tPciResourceIoLimit: 0x%x\n",
ri->PciResourceIoLimit);
printk(BIOS_DEBUG, "\t\tIoApicBase: 0x%x\n", ri->IoApicBase);
printk(BIOS_DEBUG, "\t\tIoApicLimit: 0x%x\n", ri->IoApicLimit);
printk(BIOS_DEBUG, "\t\tPciResourceMem32Base: 0x%x\n",
ri->PciResourceMem32Base);
printk(BIOS_DEBUG, "\t\tPciResourceMem32Limit: 0x%x\n",
ri->PciResourceMem32Limit);
printk(BIOS_DEBUG, "\t\tPciResourceMem64Base: 0x%llx\n",
ri->PciResourceMem64Base);
printk(BIOS_DEBUG, "\t\tPciResourceMem64Limit: 0x%llx\n",
ri->PciResourceMem64Limit);
printk(BIOS_DEBUG, "\t\tVtdBarAddress: 0x%x\n", ri->VtdBarAddress);
}
printk(BIOS_DEBUG, "\t============ PcieInfo ================\n");
IIO_RESOURCE_INSTANCE iio_resource =
hob->PlatformData.IIO_resource[s];
for (int p = 0; p < NUMBER_PORTS_PER_SOCKET; ++p) {
printk(BIOS_DEBUG, "\t\tPort: %d, Device: 0x%x, Function: 0x%x\n",
p, iio_resource.PcieInfo.PortInfo[p].Device,
iio_resource.PcieInfo.PortInfo[p].Function);
}
}
printk(BIOS_DEBUG, "\t============ Bus Bases ===============\n");
for (int socket = 0; socket < MAX_SOCKET; ++socket) {
for (int stack = 0; stack < MAX_IIO_STACK; ++stack) {
printk(BIOS_DEBUG, "socket: %d, stack: %d, busno: 0x%x\n",
socket, stack,
hob->PlatformData.CpuQpiInfo[socket].StackBus[stack]);
}
}
}

View File

@ -0,0 +1,37 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_ACPI_H_
#define _SOC_ACPI_H_
#include <arch/acpi.h>
#include <soc/nvs.h>
#define MEM_BLK_COUNT 0x140
typedef struct {
uint8_t buf[32];
} MEM_BLK;
void acpi_create_serialio_ssdt(acpi_header_t *ssdt);
unsigned long acpi_madt_irq_overrides(unsigned long current);
void acpi_init_gnvs(global_nvs_t *gnvs);
unsigned long northbridge_write_acpi_tables(struct device *device,
unsigned long current, struct acpi_rsdp *rsdp);
void uncore_inject_dsdt(void);
void motherboard_fill_fadt(acpi_fadt_t *fadt);
#endif /* _SOC_ACPI_H_ */

View File

@ -0,0 +1,33 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_CPU_H_
#define _SOC_CPU_H_
#include <device/device.h>
/* SKXSP CPUID */
#define CPUID_SKYLAKE_SP_A0_A1 0x506f0
#define CPUID_SKYLAKE_SP_B0 0x506f1
#define CPUID_SKYLAKE_SP_4 0x50654
/* CPU bus clock is fixed at 100MHz */
#define CPU_BCLK 100
int get_cpu_count(void);
void xeon_sp_init_cpus(struct device *dev);
#endif

View File

@ -0,0 +1,299 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _GPIO_SOC_DEFS_H_
#define _GPIO_SOC_DEFS_H_
///
/// Skylake-SP chipset GPIO Groups
///
#define GPIO_SKL_H_GROUP_GPP_A 0x0100
#define GPIO_SKL_H_GROUP_GPP_B 0x0101
#define GPIO_SKL_H_GROUP_GPP_C 0x0102
#define GPIO_SKL_H_GROUP_GPP_D 0x0103
#define GPIO_SKL_H_GROUP_GPP_E 0x0104
#define GPIO_SKL_H_GROUP_GPP_F 0x0105
#define GPIO_SKL_H_GROUP_GPP_G 0x0106
#define GPIO_SKL_H_GROUP_GPP_H 0x0107
#define GPIO_SKL_H_GROUP_GPP_I 0x0108
#define GPIO_SKL_H_GROUP_GPP_J 0x0109
#define GPIO_SKL_H_GROUP_GPP_K 0x010A
#define GPIO_SKL_H_GROUP_GPP_L 0x010B
#define GPIO_SKL_H_GROUP_GPD 0x010C
///
/// SKL H GPIO pins
///
#define GPIO_SKL_H_GPP_A0 0x01000000
#define GPIO_SKL_H_GPP_A1 0x01000001
#define GPIO_SKL_H_GPP_A2 0x01000002
#define GPIO_SKL_H_GPP_A3 0x01000003
#define GPIO_SKL_H_GPP_A4 0x01000004
#define GPIO_SKL_H_GPP_A5 0x01000005
#define GPIO_SKL_H_GPP_A6 0x01000006
#define GPIO_SKL_H_GPP_A7 0x01000007
#define GPIO_SKL_H_GPP_A8 0x01000008
#define GPIO_SKL_H_GPP_A9 0x01000009
#define GPIO_SKL_H_GPP_A10 0x0100000A
#define GPIO_SKL_H_GPP_A11 0x0100000B
#define GPIO_SKL_H_GPP_A12 0x0100000C
#define GPIO_SKL_H_GPP_A13 0x0100000D
#define GPIO_SKL_H_GPP_A14 0x0100000E
#define GPIO_SKL_H_GPP_A15 0x0100000F
#define GPIO_SKL_H_GPP_A16 0x01000010
#define GPIO_SKL_H_GPP_A17 0x01000011
#define GPIO_SKL_H_GPP_A18 0x01000012
#define GPIO_SKL_H_GPP_A19 0x01000013
#define GPIO_SKL_H_GPP_A20 0x01000014
#define GPIO_SKL_H_GPP_A21 0x01000015
#define GPIO_SKL_H_GPP_A22 0x01000016
#define GPIO_SKL_H_GPP_A23 0x01000017
#define GPIO_SKL_H_GPP_B0 0x01010000
#define GPIO_SKL_H_GPP_B1 0x01010001
#define GPIO_SKL_H_GPP_B2 0x01010002
#define GPIO_SKL_H_GPP_B3 0x01010003
#define GPIO_SKL_H_GPP_B4 0x01010004
#define GPIO_SKL_H_GPP_B5 0x01010005
#define GPIO_SKL_H_GPP_B6 0x01010006
#define GPIO_SKL_H_GPP_B7 0x01010007
#define GPIO_SKL_H_GPP_B8 0x01010008
#define GPIO_SKL_H_GPP_B9 0x01010009
#define GPIO_SKL_H_GPP_B10 0x0101000A
#define GPIO_SKL_H_GPP_B11 0x0101000B
#define GPIO_SKL_H_GPP_B12 0x0101000C
#define GPIO_SKL_H_GPP_B13 0x0101000D
#define GPIO_SKL_H_GPP_B14 0x0101000E
#define GPIO_SKL_H_GPP_B15 0x0101000F
#define GPIO_SKL_H_GPP_B16 0x01010010
#define GPIO_SKL_H_GPP_B17 0x01010011
#define GPIO_SKL_H_GPP_B18 0x01010012
#define GPIO_SKL_H_GPP_B19 0x01010013
#define GPIO_SKL_H_GPP_B20 0x01010014
#define GPIO_SKL_H_GPP_B21 0x01010015
#define GPIO_SKL_H_GPP_B22 0x01010016
#define GPIO_SKL_H_GPP_B23 0x01010017
#define GPIO_SKL_H_GPP_C0 0x01020000
#define GPIO_SKL_H_GPP_C1 0x01020001
#define GPIO_SKL_H_GPP_C2 0x01020002
#define GPIO_SKL_H_GPP_C3 0x01020003
#define GPIO_SKL_H_GPP_C4 0x01020004
#define GPIO_SKL_H_GPP_C5 0x01020005
#define GPIO_SKL_H_GPP_C6 0x01020006
#define GPIO_SKL_H_GPP_C7 0x01020007
#define GPIO_SKL_H_GPP_C8 0x01020008
#define GPIO_SKL_H_GPP_C9 0x01020009
#define GPIO_SKL_H_GPP_C10 0x0102000A
#define GPIO_SKL_H_GPP_C11 0x0102000B
#define GPIO_SKL_H_GPP_C12 0x0102000C
#define GPIO_SKL_H_GPP_C13 0x0102000D
#define GPIO_SKL_H_GPP_C14 0x0102000E
#define GPIO_SKL_H_GPP_C15 0x0102000F
#define GPIO_SKL_H_GPP_C16 0x01020010
#define GPIO_SKL_H_GPP_C17 0x01020011
#define GPIO_SKL_H_GPP_C18 0x01020012
#define GPIO_SKL_H_GPP_C19 0x01020013
#define GPIO_SKL_H_GPP_C20 0x01020014
#define GPIO_SKL_H_GPP_C21 0x01020015
#define GPIO_SKL_H_GPP_C22 0x01020016
#define GPIO_SKL_H_GPP_C23 0x01020017
#define GPIO_SKL_H_GPP_D0 0x01030000
#define GPIO_SKL_H_GPP_D1 0x01030001
#define GPIO_SKL_H_GPP_D2 0x01030002
#define GPIO_SKL_H_GPP_D3 0x01030003
#define GPIO_SKL_H_GPP_D4 0x01030004
#define GPIO_SKL_H_GPP_D5 0x01030005
#define GPIO_SKL_H_GPP_D6 0x01030006
#define GPIO_SKL_H_GPP_D7 0x01030007
#define GPIO_SKL_H_GPP_D8 0x01030008
#define GPIO_SKL_H_GPP_D9 0x01030009
#define GPIO_SKL_H_GPP_D10 0x0103000A
#define GPIO_SKL_H_GPP_D11 0x0103000B
#define GPIO_SKL_H_GPP_D12 0x0103000C
#define GPIO_SKL_H_GPP_D13 0x0103000D
#define GPIO_SKL_H_GPP_D14 0x0103000E
#define GPIO_SKL_H_GPP_D15 0x0103000F
#define GPIO_SKL_H_GPP_D16 0x01030010
#define GPIO_SKL_H_GPP_D17 0x01030011
#define GPIO_SKL_H_GPP_D18 0x01030012
#define GPIO_SKL_H_GPP_D19 0x01030013
#define GPIO_SKL_H_GPP_D20 0x01030014
#define GPIO_SKL_H_GPP_D21 0x01030015
#define GPIO_SKL_H_GPP_D22 0x01030016
#define GPIO_SKL_H_GPP_D23 0x01030017
#define GPIO_SKL_H_GPP_E0 0x01040000
#define GPIO_SKL_H_GPP_E1 0x01040001
#define GPIO_SKL_H_GPP_E2 0x01040002
#define GPIO_SKL_H_GPP_E3 0x01040003
#define GPIO_SKL_H_GPP_E4 0x01040004
#define GPIO_SKL_H_GPP_E5 0x01040005
#define GPIO_SKL_H_GPP_E6 0x01040006
#define GPIO_SKL_H_GPP_E7 0x01040007
#define GPIO_SKL_H_GPP_E8 0x01040008
#define GPIO_SKL_H_GPP_E9 0x01040009
#define GPIO_SKL_H_GPP_E10 0x0104000A
#define GPIO_SKL_H_GPP_E11 0x0104000B
#define GPIO_SKL_H_GPP_E12 0x0104000C
#define GPIO_SKL_H_GPP_F0 0x01050000
#define GPIO_SKL_H_GPP_F1 0x01050001
#define GPIO_SKL_H_GPP_F2 0x01050002
#define GPIO_SKL_H_GPP_F3 0x01050003
#define GPIO_SKL_H_GPP_F4 0x01050004
#define GPIO_SKL_H_GPP_F5 0x01050005
#define GPIO_SKL_H_GPP_F6 0x01050006
#define GPIO_SKL_H_GPP_F7 0x01050007
#define GPIO_SKL_H_GPP_F8 0x01050008
#define GPIO_SKL_H_GPP_F9 0x01050009
#define GPIO_SKL_H_GPP_F10 0x0105000A
#define GPIO_SKL_H_GPP_F11 0x0105000B
#define GPIO_SKL_H_GPP_F12 0x0105000C
#define GPIO_SKL_H_GPP_F13 0x0105000D
#define GPIO_SKL_H_GPP_F14 0x0105000E
#define GPIO_SKL_H_GPP_F15 0x0105000F
#define GPIO_SKL_H_GPP_F16 0x01050010
#define GPIO_SKL_H_GPP_F17 0x01050011
#define GPIO_SKL_H_GPP_F18 0x01050012
#define GPIO_SKL_H_GPP_F19 0x01050013
#define GPIO_SKL_H_GPP_F20 0x01050014
#define GPIO_SKL_H_GPP_F21 0x01050015
#define GPIO_SKL_H_GPP_F22 0x01050016
#define GPIO_SKL_H_GPP_F23 0x01050017
#define GPIO_SKL_H_GPP_G0 0x01060000
#define GPIO_SKL_H_GPP_G1 0x01060001
#define GPIO_SKL_H_GPP_G2 0x01060002
#define GPIO_SKL_H_GPP_G3 0x01060003
#define GPIO_SKL_H_GPP_G4 0x01060004
#define GPIO_SKL_H_GPP_G5 0x01060005
#define GPIO_SKL_H_GPP_G6 0x01060006
#define GPIO_SKL_H_GPP_G7 0x01060007
#define GPIO_SKL_H_GPP_G8 0x01060008
#define GPIO_SKL_H_GPP_G9 0x01060009
#define GPIO_SKL_H_GPP_G10 0x0106000A
#define GPIO_SKL_H_GPP_G11 0x0106000B
#define GPIO_SKL_H_GPP_G12 0x0106000C
#define GPIO_SKL_H_GPP_G13 0x0106000D
#define GPIO_SKL_H_GPP_G14 0x0106000E
#define GPIO_SKL_H_GPP_G15 0x0106000F
#define GPIO_SKL_H_GPP_G16 0x01060010
#define GPIO_SKL_H_GPP_G17 0x01060011
#define GPIO_SKL_H_GPP_G18 0x01060012
#define GPIO_SKL_H_GPP_G19 0x01060013
#define GPIO_SKL_H_GPP_G20 0x01060014
#define GPIO_SKL_H_GPP_G21 0x01060015
#define GPIO_SKL_H_GPP_G22 0x01060016
#define GPIO_SKL_H_GPP_G23 0x01060017
#define GPIO_SKL_H_GPP_H0 0x01070000
#define GPIO_SKL_H_GPP_H1 0x01070001
#define GPIO_SKL_H_GPP_H2 0x01070002
#define GPIO_SKL_H_GPP_H3 0x01070003
#define GPIO_SKL_H_GPP_H4 0x01070004
#define GPIO_SKL_H_GPP_H5 0x01070005
#define GPIO_SKL_H_GPP_H6 0x01070006
#define GPIO_SKL_H_GPP_H7 0x01070007
#define GPIO_SKL_H_GPP_H8 0x01070008
#define GPIO_SKL_H_GPP_H9 0x01070009
#define GPIO_SKL_H_GPP_H10 0x0107000A
#define GPIO_SKL_H_GPP_H11 0x0107000B
#define GPIO_SKL_H_GPP_H12 0x0107000C
#define GPIO_SKL_H_GPP_H13 0x0107000D
#define GPIO_SKL_H_GPP_H14 0x0107000E
#define GPIO_SKL_H_GPP_H15 0x0107000F
#define GPIO_SKL_H_GPP_H16 0x01070010
#define GPIO_SKL_H_GPP_H17 0x01070011
#define GPIO_SKL_H_GPP_H18 0x01070012
#define GPIO_SKL_H_GPP_H19 0x01070013
#define GPIO_SKL_H_GPP_H20 0x01070014
#define GPIO_SKL_H_GPP_H21 0x01070015
#define GPIO_SKL_H_GPP_H22 0x01070016
#define GPIO_SKL_H_GPP_H23 0x01070017
#define GPIO_SKL_H_GPP_I0 0x01080000
#define GPIO_SKL_H_GPP_I1 0x01080001
#define GPIO_SKL_H_GPP_I2 0x01080002
#define GPIO_SKL_H_GPP_I3 0x01080003
#define GPIO_SKL_H_GPP_I4 0x01080004
#define GPIO_SKL_H_GPP_I5 0x01080005
#define GPIO_SKL_H_GPP_I6 0x01080006
#define GPIO_SKL_H_GPP_I7 0x01080007
#define GPIO_SKL_H_GPP_I8 0x01080008
#define GPIO_SKL_H_GPP_I9 0x01080009
#define GPIO_SKL_H_GPP_I10 0x0108000A
#define GPIO_SKL_H_GPP_J0 0x01090000
#define GPIO_SKL_H_GPP_J1 0x01090001
#define GPIO_SKL_H_GPP_J2 0x01090002
#define GPIO_SKL_H_GPP_J3 0x01090003
#define GPIO_SKL_H_GPP_J4 0x01090004
#define GPIO_SKL_H_GPP_J5 0x01090005
#define GPIO_SKL_H_GPP_J6 0x01090006
#define GPIO_SKL_H_GPP_J7 0x01090007
#define GPIO_SKL_H_GPP_J8 0x01090008
#define GPIO_SKL_H_GPP_J9 0x01090009
#define GPIO_SKL_H_GPP_J10 0x0109000A
#define GPIO_SKL_H_GPP_J11 0x0109000B
#define GPIO_SKL_H_GPP_J12 0x0109000C
#define GPIO_SKL_H_GPP_J13 0x0109000D
#define GPIO_SKL_H_GPP_J14 0x0109000E
#define GPIO_SKL_H_GPP_J15 0x0109000F
#define GPIO_SKL_H_GPP_J16 0x01090010
#define GPIO_SKL_H_GPP_J17 0x01090011
#define GPIO_SKL_H_GPP_J18 0x01090012
#define GPIO_SKL_H_GPP_J19 0x01090013
#define GPIO_SKL_H_GPP_J20 0x01090014
#define GPIO_SKL_H_GPP_J21 0x01090015
#define GPIO_SKL_H_GPP_J22 0x01090016
#define GPIO_SKL_H_GPP_J23 0x01090017
#define GPIO_SKL_H_GPP_K0 0x010A0000
#define GPIO_SKL_H_GPP_K1 0x010A0001
#define GPIO_SKL_H_GPP_K2 0x010A0002
#define GPIO_SKL_H_GPP_K3 0x010A0003
#define GPIO_SKL_H_GPP_K4 0x010A0004
#define GPIO_SKL_H_GPP_K5 0x010A0005
#define GPIO_SKL_H_GPP_K6 0x010A0006
#define GPIO_SKL_H_GPP_K7 0x010A0007
#define GPIO_SKL_H_GPP_K8 0x010A0008
#define GPIO_SKL_H_GPP_K9 0x010A0009
#define GPIO_SKL_H_GPP_K10 0x010A000A
#define GPIO_SKL_H_GPP_L2 0x010B0002
#define GPIO_SKL_H_GPP_L3 0x010B0003
#define GPIO_SKL_H_GPP_L4 0x010B0004
#define GPIO_SKL_H_GPP_L5 0x010B0005
#define GPIO_SKL_H_GPP_L6 0x010B0006
#define GPIO_SKL_H_GPP_L7 0x010B0007
#define GPIO_SKL_H_GPP_L8 0x010B0008
#define GPIO_SKL_H_GPP_L9 0x010B0009
#define GPIO_SKL_H_GPP_L10 0x010B000A
#define GPIO_SKL_H_GPP_L11 0x010B000B
#define GPIO_SKL_H_GPP_L12 0x010B000C
#define GPIO_SKL_H_GPP_L13 0x010B000D
#define GPIO_SKL_H_GPP_L14 0x010B000E
#define GPIO_SKL_H_GPP_L15 0x010B000F
#define GPIO_SKL_H_GPP_L16 0x010B0010
#define GPIO_SKL_H_GPP_L17 0x010B0011
#define GPIO_SKL_H_GPP_L18 0x010B0012
#define GPIO_SKL_H_GPP_L19 0x010B0013
#define GPIO_SKL_H_GPD0 0x010C0000
#define GPIO_SKL_H_GPD1 0x010C0001
#define GPIO_SKL_H_GPD2 0x010C0002
#define GPIO_SKL_H_GPD3 0x010C0003
#define GPIO_SKL_H_GPD4 0x010C0004
#define GPIO_SKL_H_GPD5 0x010C0005
#define GPIO_SKL_H_GPD6 0x010C0006
#define GPIO_SKL_H_GPD7 0x010C0007
#define GPIO_SKL_H_GPD8 0x010C0008
#define GPIO_SKL_H_GPD9 0x010C0009
#define GPIO_SKL_H_GPD10 0x010C000A
#define GPIO_SKL_H_GPD11 0x010C000B
#endif

View File

@ -0,0 +1,47 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_IOMAP_H_
#define _SOC_IOMAP_H_
#define MAP_ENTRY(reg_, is_64_, is_limit_, mask_bits_, desc_) \
{ \
.reg = reg_, .is_64_bit = is_64_, .is_limit = is_limit_, \
.mask_bits = mask_bits_, .description = desc_, \
}
#define MAP_ENTRY_BASE_64(reg_, desc_) MAP_ENTRY(reg_, 1, 0, 0, desc_)
#define MAP_ENTRY_LIMIT_64(reg_, mask_bits_, desc_) MAP_ENTRY(reg_, 1, 1, mask_bits_, desc_)
#define MAP_ENTRY_BASE_32(reg_, desc_) MAP_ENTRY(reg_, 0, 0, 0, desc_)
#define MAP_ENTRY_LIMIT_32(reg_, mask_bits_, desc_) MAP_ENTRY(reg_, 0, 1, mask_bits_, desc_)
// SPI BAR0 MMIO base address
#define SPI_BASE_ADDRESS 0xfe010000
#define SPI_BASE_SIZE 0x1000
#define ACPI_BASE_ADDRESS 0x500
/* Video RAM */
#define VGA_BASE_ADDRESS 0xa0000
#define VGA_BASE_SIZE 0x20000
/* High Performance Event Timer */
#define HPET_BASE_ADDRESS 0xfed00000
#define P2SB_BAR CONFIG_PCR_BASE_ADDRESS
#endif /* _SOC_IOMAP_H_ */

View File

@ -0,0 +1,23 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_IRQ_H_
#define _SOC_IRQ_H_
#define PCH_IRQ10 10
#define PCH_IRQ11 11
#endif /* _SOC_IRQ_H_ */

View File

@ -0,0 +1,113 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_MSR_H_
#define _SOC_MSR_H_
#include <intelblocks/msr.h>
#define IA32_MCG_CAP 0x179
#define IA32_MCG_CAP_COUNT_MASK 0xff
#define IA32_MCG_CAP_CTL_P_BIT 8
#define IA32_MCG_CAP_CTL_P_MASK (1 << IA32_MCG_CAP_CTL_P_BIT)
#define IA32_MCG_CTL 0x17b
/* IA32_MISC_ENABLE bits */
#define FAST_STRINGS_ENABLE_BIT (1 << 0)
#define SPEED_STEP_ENABLE_BIT (1 << 16)
#define MONIOR_ENABLE_BIT (1 << 18)
#define MSR_IA32_ENERGY_PERF_BIAS 0x1b0
/* MSR_PKG_CST_CONFIG_CONTROL bits */
#define MSR_PKG_CST_CONFIG_CONTROL 0xe2
#define PKG_CSTATE_LIMIT_SHIFT 0 /* 0:3 */
/* No package C-state limit. All C-States supported by the processor are available. */
#define PKG_CSTATE_LIMIT_MASK (0xf << PKG_CSTATE_LIMIT_SHIFT)
#define PKG_CSTATE_NO_LIMIT (0x7 << PKG_CSTATE_LIMIT_SHIFT)
#define IO_MWAIT_REDIRECTION_SHIFT 10
#define IO_MWAIT_REDIRECTION_ENABLE (1 << IO_MWAIT_REDIRECTION_SHIFT)
#define CFG_LOCK_SHIFT 15
#define CFG_LOCK_ENABLE (1 << CFG_LOCK_SHIFT)
/* MSR_PMG_IO_CAPTURE_BASE bits */
#define MSR_PMG_IO_CAPTURE_BASE 0xe4
#define LVL_2_BASE_ADDRESS_SHIFT 0 /* 15:0 bits */
#define LVL_2_BASE_ADDRESS (0x0514 << LVL_2_BASE_ADDRESS_SHIFT)
#define CST_RANGE_SHIFT 16 /* 18:16 bits */
#define CST_RANGE_MAX_C6 (0x1 << CST_RANGE_SHIFT)
/* MSR_POWER_CTL bits */
#define MSR_POWER_CTL 0x1fc
#define BIDIR_PROCHOT_ENABLE_SHIFT 0
#define BIDIR_PROCHOT_ENABLE (1 << BIDIR_PROCHOT_ENABLE_SHIFT)
#define FAST_BRK_SNP_ENABLE_SHIFT 3
#define FAST_BRK_SNP_ENABLE (1 << FAST_BRK_SNP_ENABLE_SHIFT)
#define FAST_BRK_INT_ENABLE_SHIFT 4
#define FAST_BRK_INT_ENABLE (1 << FAST_BRK_INT_ENABLE_SHIFT)
#define PHOLD_CST_PREVENTION_INIT_SHIFT 6
#define PHOLD_CST_PREVENTION_INIT_VALUE (1 << PHOLD_CST_PREVENTION_INIT_SHIFT)
#define ENERGY_PERF_BIAS_ACCESS_ENABLE_SHIFT 18
#define ENERGY_PERF_BIAS_ACCESS_ENABLE (1 << ENERGY_PERF_BIAS_ACCESS_ENABLE_SHIFT)
#define PROCHOT_OUTPUT_DISABLE_SHIFT 21
#define PROCHOT_OUTPUT_DISABLE (1 << PROCHOT_OUTPUT_DISABLE_SHIFT)
#define PWR_PERF_TUNING_DYN_SWITCHING_SHIFT 24
#define PWR_PERF_TUNING_DYN_SWITCHING_ENABLE (1 << PWR_PERF_TUNING_DYN_SWITCHING_SHIFT)
#define PROCHOT_LOCK_SHIFT 27
#define PROCHOT_LOCK_ENABLE (1 << PROCHOT_LOCK_SHIFT)
#define LTR_IIO_DISABLE_SHIFT 29
#define LTR_IIO_DISABLE (1 << LTR_IIO_DISABLE_SHIFT)
/* MSR_IA32_PERF_CTRL (0x199) bits */
#define MSR_IA32_PERF_CTRL 0x199
#define PSTATE_REQ_SHIFT 8 /* 8:14 bits */
#define PSTATE_REQ_MASK (0x7f << PSTATE_REQ_SHIFT)
#define PSTATE_REQ_RATIO (0xa << PSTATE_REQ_SHIFT)
/* MSR_MISC_PWR_MGMT bits */
#define MSR_MISC_PWR_MGMT 0x1aa
#define HWP_ENUM_SHIFT 6
#define HWP_ENUM_ENABLE (1 << HWP_ENUM_SHIFT)
#define HWP_EPP_SHIFT 12
#define HWP_EPP_ENUM_ENABLE (1 << HWP_EPP_SHIFT)
#define LOCK_MISC_PWR_MGMT_MSR_SHIFT 13
#define LOCK_MISC_PWR_MGMT_MSR (1 << LOCK_MISC_PWR_MGMT_MSR_SHIFT)
#define LOCK_THERM_INT_SHIFT 22
#define LOCK_THERM_INT (1 << LOCK_THERM_INT_SHIFT)
/* MSR_TURBO_RATIO_LIMIT bits */
#define MSR_TURBO_RATIO_LIMIT 0x1ad
/* MSR_TURBO_RATIO_LIMIT_CORES (0x1ae) */
#define MSR_TURBO_RATIO_LIMIT_CORES 0x1ae
/* MSR_VR_CURRENT_CONFIG bits */
#define MSR_VR_CURRENT_CONFIG 0x601
#define CURRENT_LIMIT_LOCK_SHIFT 31
#define CURRENT_LIMIT_LOCK (0x1 << CURRENT_LIMIT_LOCK_SHIFT)
/* MSR_TURBO_ACTIVATION_RATIO bits */
#define MSR_TURBO_ACTIVATION_RATIO 0x64c
#define MAX_NON_TURBO_RATIO_SHIFT 0
#define MAX_NON_TURBO_RATIO (0xff << MAX_NON_TURBO_RATIO_SHIFT)
/* MSR_ENERGY_PERF_BIAS_CONFIG bits */
#define MSR_ENERGY_PERF_BIAS_CONFIG 0xa01
#define EPB_ENERGY_POLICY_SHIFT 3
#define EPB_ENERGY_POLICY_MASK (0xf << EPB_ENERGY_POLICY_SHIFT)
#endif /* _SOC_MSR_H_ */

View File

@ -0,0 +1,33 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2008 - 2009 coresystems GmbH
* Copyright (C) 2011 Google Inc
* Copyright (C) 2014 - 2020 Intel Corporation.
*
* 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 _SOC_NVS_H_
#define _SOC_NVS_H_
#include <stdint.h>
/* TODO - this requires xeon sp, server board support */
/* NOTE: We do not use intelblocks/nvs.h since it includes
mostly client specific attributes */
typedef struct global_nvs_t {
uint8_t pcnt; /* 0x00 - Processor Count */
uint32_t cbmc; /* 0x01 - coreboot memconsole */
uint8_t rsvd3[251];
} __packed global_nvs_t;
#endif /* _SOC_NVS_H_ */

View File

@ -0,0 +1,186 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_PCI_DEVS_H_
#define _SOC_PCI_DEVS_H_
#include <device/pci_def.h>
#include <hob_iiouds.h>
#define dump_csr(fmt, dev, reg) \
printk(BIOS_SPEW, "%s%x:%x:%x reg: %s (0x%x), data: 0x%x\n", \
fmt, ((uint32_t)dev >> 20) & 0xfff, ((uint32_t)dev >> 15) & 0x1f, \
((uint32_t)dev >> 12) & 0x07, \
#reg, reg, pci_mmio_read_config32(dev, reg))
#define dump_csr64(fmt, dev, reg) \
printk(BIOS_SPEW, "%s%x:%x:%x reg: %s (0x%x), data: 0x%x%x\n", \
fmt, ((uint32_t)dev >> 20) & 0xfff, ((uint32_t)dev >> 15) & 0x1f, \
((uint32_t)dev >> 12) & 0x07, #reg, reg, \
pci_mmio_read_config32(dev, reg+4), pci_mmio_read_config32(dev, reg))
#define _SA_DEVFN(slot) PCI_DEVFN(SA_DEV_SLOT_ ## slot, 0)
#define _PCH_DEVFN(slot, func) PCI_DEVFN(PCH_DEV_SLOT_ ## slot, func)
#if !defined(__SIMPLE_DEVICE__)
#include <device/device.h>
#define _SA_DEV(slot) pcidev_path_on_root_debug(_SA_DEVFN(slot), __func__)
#define _PCH_DEV(slot, func) pcidev_path_on_root_debug(_PCH_DEVFN(slot, func), __func__)
#else
#include <arch/io.h>
#define _SA_DEV(slot) PCI_DEV(0, SA_DEV_SLOT_ ## slot, 0)
#define _PCH_DEV(slot, func) PCI_DEV(0, PCH_DEV_SLOT_ ## slot, func)
#endif
#define MMAP_VTD_CFG_REG_DEVID 0x2024
#define VTD_DEV 5
#define VTD_FUNC 0
#define VTD_TOLM_CSR 0xd0
#define VTD_TSEG_BASE_CSR 0xa8
#define VTD_TSEG_LIMIT_CSR 0xac
#define VTD_EXT_CAP_LOW 0x10
#define VTD_MMCFG_BASE_CSR 0x90
#define VTD_MMCFG_LIMIT_CSR 0x98
#define VTD_TOHM_CSR 0xd4
#define VTD_MMIOL_CSR 0xdc
#define VTD_ME_BASE_CSR 0xf0
#define VTD_ME_LIMIT_CSR 0xf8
#define VTD_VERSION 0x00
#define VTD_CAP 0x08
#define VTD_CAP_LOW 0x08
#define VTD_CAP_HIGH 0x0C
#define VTD_EXT_CAP_HIGH 0x14
#define SAD_ALL_DEV 29
#define SAD_ALL_FUNC 0
#define SAD_ALL_PAM0123_CSR 0x40
#define SAD_ALL_PAM456_CSR 0x44
#define PCU_IIO_STACK 1
#define PCU_DEV 30
#define PCU_CR1_FUN 1
#define PCU_CR0_FUN 0
#define PCU_CR0_PLATFORM_INFO 0xa8
#define PCU_CR0_P_STATE_LIMITS 0xd8
#define P_STATE_LIMITS_LOCK_SHIFT 31
#define P_STATE_LIMITS_LOCK (1 << P_STATE_LIMITS_LOCK_SHIFT)
#define PCU_CR0_TEMPERATURE_TARGET 0xe4
#define PCU_CR0_PACKAGE_RAPL_LIMIT 0xe8
#define PCU_CR0_CURRENT_CONFIG 0xf8
#define MAX_NON_TURBO_LIM_RATIO_SHIFT 8 /* 8:15 */
#define MAX_NON_TURBO_LIM_RATIO_MASK (0xff << MAX_NON_TURBO_LIM_RATIO_SHIFT)
#define PCU_CR1_BIOS_RESET_CPL_REG 0x94
#define RST_CPL1_MASK ((uint32_t)1 << 1)
#define RST_CPL2_MASK ((uint32_t)1 << 2)
#define RST_CPL3_MASK ((uint32_t)1 << 3)
#define RST_CPL4_MASK ((uint32_t)1 << 4)
#define PCODE_INIT_DONE1_MASK ((uint32_t)1 << 9)
#define PCODE_INIT_DONE2_MASK ((uint32_t)1 << 10)
#define PCODE_INIT_DONE3_MASK ((uint32_t)1 << 11)
#define PCODE_INIT_DONE4_MASK ((uint32_t)1 << 12)
#define PCU_CR1_BIOS_MB_DATA_REG 0x8c
#define PCU_CR1_BIOS_MB_INTERFACE_REG 0x90
#define BIOS_MB_RUN_BUSY_MASK ((uint32_t)1 << 31)
#define BIOS_MB_CMD_MASK ((uint32_t)0xff)
#define BIOS_CMD_READ_PCU_MISC_CFG 0x5
#define BIOS_CMD_WRITE_PCU_MISC_CFG 0x6
#define BIOS_ERR_INVALID_CMD 0x01
#define PCU_CR1_DESIRED_CORES_CFG2_REG 0xa0
#define PCU_CR1_DESIRED_CORES_CFG2_REG_LOCK_MASK ((uint32_t)1 << 31)
#define PCU_CR1_C2C3TT_REG 0xdc
#define PCU_CR1_PCIE_ILTR_OVRD 0xfc
#define PCU_CR1_SAPMCTL 0xb0
#define SAPMCTL_LOCK_SHIFT 31
#define SAPMCTL_LOCK_MASK (1 << SAPMCTL_LOCK_SHIFT)
#define PCU_CR1_MC_BIOS_REQ 0x98
#define PCU_CR2_FUN 2
#define PCU_CR2_PKG_CST_ENTRY_CRITERIA_MASK 0x8c
#define PCIE_IN_PKGCSTATE_L1_MASK 0xFFFFFF /* 23:0 bits */
#define PCU_CR2_PKG_CST_ENTRY_CRITERIA_MASK2 0x90
#define KTI_IN_PKGCSTATE_L1_MASK 0x7 /* 2:0 bits */
#define PCU_CR2_DYNAMIC_PERF_POWER_CTL 0xdc
#define UNCORE_PLIMIT_OVERRIDE_BIT 20
#define UNOCRE_PLIMIT_OVERRIDE_SHIFT (1 << UNCORE_PLIMIT_OVERRIDE_BIT)
#define PCU_CR2_PROCHOT_RESPONSE_RATIO_REG 0xb0
#define PROCHOT_RATIO 0xa /* bits 0:7 */
#define UBOX_DECS_BUS 0
#define UBOX_DECS_DEV 8
#define UBOX_DECS_FUNC 2
#define UBOX_DECS_CPUBUSNO_CSR 0xcc
#define CHA_UTIL_ALL_DEV 29
#define CHA_UTIL_ALL_FUNC 1
#define CHA_UTIL_ALL_MMCFG_CSR 0xc0
#define CBDMA_DEV_NUM 0x04
#define IIO_CBDMA_MMIO_SIZE 0x10000 //64kB for one CBDMA function
#define IIO_CBDMA_MMIO_ALIGNMENT 14 //2^14 - 16kB
#define VMD_DEV_NUM 5
#define VMD_FUNC_NUM 5
#define APIC_DEV_NUM 5
#define APIC_FUNC_NUM 0
#define PCH_IOAPIC_BUS_NUMBER 0xF0
#define PCH_IOAPIC_DEV_NUM 0x1F
#define PCH_IOAPIC_FUNC_NUM 0x00
// ================================== IOAPIC Definitions for DMAR/ACPI ====================
#define PCH_IOAPIC_ID 0x08
#define PC00_IOAPIC_ID 0x09
#define PC01_IOAPIC_ID 0x0A
#define PC02_IOAPIC_ID 0x0B
#define PC03_IOAPIC_ID 0x0C
#define PC04_IOAPIC_ID 0x0D
#define PC05_IOAPIC_ID 0x0E
#define PC06_IOAPIC_ID 0x0F
#define PC07_IOAPIC_ID 0x10
#define PC08_IOAPIC_ID 0x11
#define PC09_IOAPIC_ID 0x12
#define PC10_IOAPIC_ID 0x13
#define PC11_IOAPIC_ID 0x14
/* PCH Device info */
#define XHCI_BUS_NUMBER 0x0
#define PCH_DEV_SLOT_XHCI 0x14
#define XHCI_FUNC_NUM 0x0
#define HPET_BUS_NUM 0x0
#define HPET_DEV_NUM PCH_DEV_SLOT_LPC
#define HPET0_FUNC_NUM 0x00
#define PCH_DEV_SLOT_LPC 0x1f
#define PCH_DEVFN_LPC _PCH_DEVFN(LPC, 0)
#define PCH_DEVFN_P2SB _PCH_DEVFN(LPC, 1)
#define PCH_DEVFN_PMC _PCH_DEVFN(LPC, 2)
#define PCH_DEVFN_SPI _PCH_DEVFN(LPC, 5)
#define PCH_DEV_LPC _PCH_DEV(LPC, 0)
#define PCH_DEV_P2SB _PCH_DEV(LPC, 1)
#define PCH_DEV_PMC _PCH_DEV(LPC, 2)
#define PCH_DEV_SPI _PCH_DEV(LPC, 5)
#endif /* _SOC_PCI_DEVS_H_ */

View File

@ -0,0 +1,23 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _PCR_IDS_H_
#define _PCR_IDS_H_
#define PID_ITSS 0xC4
#define PID_RTC 0xC3
#endif /* _PCR_IDS_H_ */

View File

@ -0,0 +1,32 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2014 Google Inc.
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_PM_H_
#define _SOC_PM_H_
#include <soc/iomap.h>
#include <soc/pmc.h>
#define PM1_CNT 0x04
#define PM1_STS 0x00
#define PM1_TMR 0x08
#define PM2_CNT 0x50
#define GPE0_REG_MAX 4
#define GPE0_STS(x) (0x80 + (x * 4))
#endif

View File

@ -0,0 +1,34 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_PMC_H_
#define _SOC_PMC_H_
/* PCI Configuration Space (D31:F2): PMC */
#define PMC_ACPI_CNT 0x44
#define SCI_IRQ_SEL (7 << 0)
#define SCIS_IRQ9 0
#define SCIS_IRQ10 1
#define SCIS_IRQ11 2
#define SCIS_IRQ20 4
#define SCIS_IRQ21 5
#define SCIS_IRQ22 6
#define SCIS_IRQ23 7
#define SCI_IRQ_ADJUST 0
#endif

View File

@ -0,0 +1,30 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_RAMSTAGE_H_
#define _SOC_RAMSTAGE_H_
#include <device/device.h>
#include <fsp/api.h>
#include <fsp/util.h>
#include <memory_info.h>
void xeon_sp_init_cpus(struct device *dev);
void mainboard_silicon_init_params(FSPS_UPD *params);
extern struct pci_operations soc_pci_ops;
#endif

View File

@ -0,0 +1,26 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_ROMSTAGE_H_
#define _SOC_ROMSTAGE_H_
#include <fsp/api.h>
/* These functions are weak and can be overridden by a mainboard functions. */
void mainboard_memory_init_params(FSPM_UPD * mupd);
#endif /* _SOC_ROMSTAGE_H_ */

View File

@ -0,0 +1,80 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation.
*
* 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.
*/
#ifndef _SOC_UTIL_H_
#define _SOC_UTIL_H_
#include <hob_iiouds.h>
#include <hob_memmap.h>
#include <arch/acpi.h>
#define LOG_MEM_RESOURCE(type, dev, index, base_kb, size_kb) \
printk(BIOS_SPEW, "%s:%d res: %s, dev: %s, index: 0x%x, base: 0x%llx, " \
"end: 0x%llx, size_kb: 0x%llx\n", \
__func__, __LINE__, type, dev_path(dev), index, (base_kb << 10), \
(base_kb << 10) + (size_kb << 10) - 1, size_kb)
#define LOG_IO_RESOURCE(type, dev, index, base, size) \
printk(BIOS_SPEW, "%s:%d res: %s, dev: %s, index: 0x%x, base: 0x%llx, " \
"end: 0x%llx, size: 0x%llx\n", \
__func__, __LINE__, type, dev_path(dev), index, base, base + size - 1, size)
#define DEV_FUNC_ENTER(dev) \
printk(BIOS_SPEW, "%s:%s:%d: ENTER (dev: %s)\n", \
__FILE__, __func__, __LINE__, dev_path(dev))
#define DEV_FUNC_EXIT(dev) \
printk(BIOS_SPEW, "%s:%s:%d: EXIT (dev: %s)\n", __FILE__, \
__func__, __LINE__, dev_path(dev))
#define FUNC_ENTER() \
printk(BIOS_SPEW, "%s:%s:%d: ENTER\n", __FILE__, __func__, __LINE__)
#define FUNC_EXIT() \
printk(BIOS_SPEW, "%s:%s:%d: EXIT\n", __FILE__, __func__, __LINE__)
struct iiostack_resource {
uint8_t no_of_stacks;
STACK_RES res[CONFIG_MAX_SOCKET * MAX_IIO_STACK];
};
uintptr_t get_tolm(uint32_t bus);
void get_tseg_base_lim(uint32_t bus, uint32_t *base, uint32_t *limit);
uintptr_t get_cha_mmcfg_base(uint32_t bus);
uint32_t top_of_32bit_ram(void); // Top of 32bit usable memory
uint32_t pci_read_mmio_reg(int bus, uint32_t dev, uint32_t func, int offset);
void get_stack_busnos(uint32_t *bus);
void get_cpubusnos(uint32_t *bus0, uint32_t *bus1, uint32_t *bus2, uint32_t *bus3);
uint32_t get_socket_stack_busno(uint32_t socket, uint32_t stack);
void get_iiostack_info(struct iiostack_resource *info);
int get_threads_per_package(void);
int get_platform_thread_count(void);
void get_core_thread_bits(uint32_t *core_bits, uint32_t *thread_bits);
unsigned int get_srat_memory_entries(acpi_srat_mem_t *srat_mem);
void get_cpu_info_from_apicid(uint32_t apicid, uint32_t core_bits,
uint32_t thread_bits, uint8_t *package, uint8_t *core, uint8_t *thread);
void unlock_pam_regions(void);
void xeonsp_init_cpu_config(void);
void set_bios_init_completion(void);
void config_reset_cpl3_csrs(void);
#endif /* _SOC_UTIL_H_ */

View File

@ -0,0 +1,45 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <console/console.h>
#include <arch/ioapic.h>
#include <intelblocks/lpc_lib.h>
#include <soc/soc_util.h>
#include <soc/iomap.h>
static const struct lpc_mmio_range xeon_lpc_fixed_mmio_ranges[] = {
{ 0, 0 }
};
const struct lpc_mmio_range *soc_get_fixed_mmio_ranges(void)
{
return xeon_lpc_fixed_mmio_ranges;
}
void lpc_soc_init(struct device *dev)
{
printk(BIOS_SPEW, "pch: lpc_init\n");
/* FSP configures IOAPIC and PCHInterrupt Config */
printk(BIOS_SPEW, "IOAPICID 0x%x, 0x%x\n",
io_apic_read((void *)IO_APIC_ADDR, 0x00),
((io_apic_read((void *)IO_APIC_ADDR, 0x00) & 0x0f000000) >> 24));
}
void pch_lpc_soc_fill_io_resources(struct device *dev)
{
}

View File

@ -0,0 +1,24 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <console/console.h>
#include <fsp/util.h>
void chipset_handle_reset(uint32_t status)
{
die("Reset not implemented!\n");
}

View File

@ -0,0 +1,83 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <arch/romstage.h>
#include <cbmem.h>
#include <intelblocks/rtc.h>
#include <console/console.h>
#include <cpu/x86/mtrr.h>
#include <soc/romstage.h>
#include <soc/soc_util.h>
#include "chip.h"
asmlinkage void car_stage_entry(void)
{
struct postcar_frame pcf;
uintptr_t top_of_ram;
printk(BIOS_DEBUG, "FSP TempRamInit was successful...\n");
console_init();
rtc_init();
fsp_memory_init(false);
printk(BIOS_DEBUG, "coreboot fsp_memory_init finished...\n");
unlock_pam_regions();
if (postcar_frame_init(&pcf, 1 * KiB))
die("Unable to initialize postcar frame.\n");
/*
* We need to make sure ramstage will be run cached. At this point exact
* location of ramstage in cbmem is not known. Instruct postcar to cache
* 16 megs under cbmem top which is a safe bet to cover ramstage.
*/
top_of_ram = (uintptr_t)cbmem_top();
printk(BIOS_DEBUG, "top_of_ram: 0x%lx\n", top_of_ram);
postcar_frame_add_mtrr(&pcf, top_of_ram - 16 * MiB, 16 * MiB,
MTRR_TYPE_WRBACK);
/* Cache the memory-mapped boot media. */
postcar_frame_add_romcache(&pcf, MTRR_TYPE_WRPROT);
run_postcar_phase(&pcf);
}
static void soc_memory_init_params(FSP_M_CONFIG *m_cfg)
{
}
void platform_fsp_memory_init_params_cb(FSPM_UPD *mupd, uint32_t version)
{
const config_t *config = config_of_soc();
FSP_M_CONFIG *m_cfg = &mupd->FspmConfig;
mupd->FspmUpdVersion = FSP_UPD_VERSION;
// ErrorLevel - 0 (disable) to 8 (verbose)
m_cfg->PcdFspMrcDebugPrintErrorLevel = 0;
m_cfg->PcdFspKtiDebugPrintErrorLevel = 0;
soc_memory_init_params(m_cfg);
mainboard_memory_init_params(mupd);
m_cfg->VTdConfig.VTdSupport = config->vtd_support;
m_cfg->VTdConfig.CoherencySupport = config->coherency_support;
m_cfg->VTdConfig.ATS = config->ats_support;
}

View File

@ -0,0 +1,577 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <assert.h>
#include <commonlib/sort.h>
#include <console/console.h>
#include <cpu/cpu.h>
#include <cpu/x86/msr.h>
#include <delay.h>
#include <device/pci.h>
#include <hob_iiouds.h>
#include <intelblocks/cpulib.h>
#include <intelblocks/pcr.h>
#include <soc/iomap.h>
#include <soc/cpu.h>
#include <soc/msr.h>
#include <soc/pci_devs.h>
#include <soc/pcr_ids.h>
#include <soc/soc_util.h>
#include <stdlib.h>
#include <timer.h>
/*
* Get TOLM CSR B0:D5:F0:Offset_d0h
*/
uintptr_t get_tolm(uint32_t bus)
{
uint32_t w = pci_io_read_config32(PCI_DEV(bus, VTD_DEV, VTD_FUNC),
VTD_TOLM_CSR);
uintptr_t addr = w & 0xfc000000;
printk(BIOS_DEBUG, "VTD_TOLM_CSR 0x%x, addr: 0x%lx\n", w, addr);
return addr;
}
void get_tseg_base_lim(uint32_t bus, uint32_t *base, uint32_t *limit)
{
uint32_t w1 = pci_io_read_config32(PCI_DEV(bus, VTD_DEV, VTD_FUNC),
VTD_TSEG_BASE_CSR);
uint32_t wh = pci_io_read_config32(PCI_DEV(bus, VTD_DEV, VTD_FUNC),
VTD_TSEG_LIMIT_CSR);
*base = w1 & 0xfff00000;
*limit = wh & 0xfff00000;
}
/*
* Get MMCFG CSR B1:D29:F1:Offset_C0h
*/
uintptr_t get_cha_mmcfg_base(uint32_t bus)
{
uint32_t wl = pci_io_read_config32(PCI_DEV(bus, CHA_UTIL_ALL_DEV,
CHA_UTIL_ALL_FUNC), CHA_UTIL_ALL_MMCFG_CSR);
uint32_t wh = pci_io_read_config32(PCI_DEV(bus, CHA_UTIL_ALL_DEV,
CHA_UTIL_ALL_FUNC), CHA_UTIL_ALL_MMCFG_CSR + 4);
uintptr_t addr = ((((wh & 0x3fff) << 6) | ((wl >> 26) & 0x3f)) << 26);
printk(BIOS_DEBUG, "CHA_UTIL_ALL_MMCFG_CSR wl: 0x%x, wh: 0x%x, addr: 0x%lx\n",
wl, wh, addr);
return addr;
}
/*
* Get Socket 0 CPUBUSNO(0), CPUBUSNO(1) PCI bus numbers UBOX (B0:D8:F2:Offset_CCh)
* TODO: D0h
*/
void get_cpubusnos(uint32_t *bus0, uint32_t *bus1, uint32_t *bus2, uint32_t *bus3)
{
uint32_t bus = pci_io_read_config32(PCI_DEV(UBOX_DECS_BUS, UBOX_DECS_DEV,
UBOX_DECS_FUNC), UBOX_DECS_CPUBUSNO_CSR);
if (bus0)
*bus0 = (bus & 0xff);
if (bus1)
*bus1 = (bus >> 8) & 0xff;
if (bus2)
*bus2 = (bus >> 16) & 0xff;
if (bus3)
*bus3 = (bus >> 24) & 0xff;
}
uint32_t top_of_32bit_ram(void)
{
uintptr_t mmcfg, tolm;
uint32_t bus0 = 0, bus1 = 0;
uint32_t base = 0, limit = 0;
get_cpubusnos(&bus0, &bus1, NULL, NULL);
mmcfg = get_cha_mmcfg_base(bus1);
tolm = get_tolm(bus0);
printk(BIOS_DEBUG, "bus0: 0x%x, bus1: 0x%x, mmcfg: 0x%lx, tolm: 0x%lx\n",
bus0, bus1, mmcfg, tolm);
get_tseg_base_lim(bus0, &base, &limit);
printk(BIOS_DEBUG, "tseg base: 0x%x, limit: 0x%x\n", base, limit);
/* We will use TSEG base as the top of DRAM */
return base;
}
/*
* +-------------------------+ TOLM
* | System Management Mode |
* | code and data |
* | (TSEG) |
* +-------------------------+ SMM base (aligned)
* | |
* | Chipset Reserved Memory |
* | |
* +-------------------------+ top_of_ram (aligned)
* | |
* | CBMEM Root |
* | |
* +-------------------------+
* | |
* | FSP Reserved Memory |
* | |
* +-------------------------+
* | |
* | Various CBMEM Entries |
* | |
* +-------------------------+ top_of_stack (8 byte aligned)
* | |
* | stack (CBMEM Entry) |
* | |
* +-------------------------+
*/
uint32_t pci_read_mmio_reg(int bus, uint32_t dev, uint32_t func, int offset)
{
return pci_mmio_read_config32(PCI_DEV(bus, dev, func), offset);
}
uint32_t get_socket_stack_busno(uint32_t socket, uint32_t stack)
{
size_t hob_size;
const IIO_UDS *hob;
const uint8_t fsp_hob_iio_universal_data_guid[16] = FSP_HOB_IIO_UNIVERSAL_DATA_GUID;
assert(socket < MAX_SOCKET && stack < MAX_IIO_STACK);
hob = fsp_find_extension_hob_by_guid(fsp_hob_iio_universal_data_guid, &hob_size);
assert(hob != NULL && hob_size != 0);
return hob->PlatformData.CpuQpiInfo[socket].StackBus[stack];
}
/* bus needs to be of size 6 (MAX_IIO_STACK) */
void get_stack_busnos(uint32_t *bus)
{
uint32_t reg1, reg2;
reg1 = pci_mmio_read_config32(PCI_DEV(UBOX_DECS_BUS, UBOX_DECS_DEV, UBOX_DECS_FUNC),
0xcc);
reg2 = pci_mmio_read_config32(PCI_DEV(UBOX_DECS_BUS, UBOX_DECS_DEV, UBOX_DECS_FUNC),
0xd0);
for (int i = 0; i < 4; ++i)
bus[i] = ((reg1 >> (i * 8)) & 0xff);
for (int i = 0; i < 2; ++i)
bus[4+i] = ((reg2 >> (i * 8)) & 0xff);
}
void unlock_pam_regions(void)
{
uint32_t bus1 = 0;
uint32_t pam0123_unlock_dram = 0x33333330;
uint32_t pam456_unlock_dram = 0x00333333;
get_cpubusnos(NULL, &bus1, NULL, NULL);
pci_io_write_config32(PCI_DEV(bus1, SAD_ALL_DEV, SAD_ALL_FUNC),
SAD_ALL_PAM0123_CSR, pam0123_unlock_dram);
pci_io_write_config32(PCI_DEV(bus1, SAD_ALL_DEV, SAD_ALL_FUNC),
SAD_ALL_PAM456_CSR, pam456_unlock_dram);
uint32_t reg1 = pci_io_read_config32(PCI_DEV(bus1, SAD_ALL_DEV,
SAD_ALL_FUNC), SAD_ALL_PAM0123_CSR);
uint32_t reg2 = pci_io_read_config32(PCI_DEV(bus1, SAD_ALL_DEV,
SAD_ALL_FUNC), SAD_ALL_PAM456_CSR);
printk(BIOS_DEBUG, "%s:%s pam0123_csr: 0x%x, pam456_csr: 0x%x\n",
__FILE__, __func__, reg1, reg2);
}
/* return 1 if command timed out else 0 */
static uint32_t wait_for_bios_cmd_cpl(pci_devfn_t dev, uint32_t reg, uint32_t mask,
uint32_t target)
{
uint32_t max_delay = 5000; /* 5 seconds max */
uint32_t step_delay = 50; /* 50 us */
struct stopwatch sw;
stopwatch_init_msecs_expire(&sw, max_delay);
while ((pci_mmio_read_config32(dev, reg) & mask) != target) {
udelay(step_delay);
if (stopwatch_expired(&sw)) {
printk(BIOS_ERR, "%s timed out for dev: 0x%x, reg: 0x%x, "
"mask: 0x%x, target: 0x%x\n", __func__, dev, reg, mask, target);
return 1; /* timedout */
}
}
return 0; /* successful */
}
/* return 1 if command timed out else 0 */
static int set_bios_reset_cpl_for_package(uint32_t socket, uint32_t rst_cpl_mask,
uint32_t pcode_init_mask, uint32_t val)
{
uint32_t bus = get_socket_stack_busno(socket, PCU_IIO_STACK);
pci_devfn_t dev = PCI_DEV(bus, PCU_DEV, PCU_CR1_FUN);
uint32_t reg = pci_mmio_read_config32(dev, PCU_CR1_BIOS_RESET_CPL_REG);
reg &= (uint32_t) ~rst_cpl_mask;
reg |= rst_cpl_mask;
reg |= val;
/* update BIOS RESET completion bit */
pci_mmio_write_config32(dev, PCU_CR1_BIOS_RESET_CPL_REG, reg);
/* wait for PCU ack */
return wait_for_bios_cmd_cpl(dev, PCU_CR1_BIOS_RESET_CPL_REG, pcode_init_mask,
pcode_init_mask);
}
/* return 1 if command timed out else 0 */
static uint32_t write_bios_mailbox_cmd(pci_devfn_t dev, uint32_t command, uint32_t data)
{
/* verify bios is not in busy state */
if (wait_for_bios_cmd_cpl(dev, PCU_CR1_BIOS_MB_INTERFACE_REG, BIOS_MB_RUN_BUSY_MASK, 0))
return 1; /* timed out */
/* write data to data register */
printk(BIOS_SPEW, "%s - pci_mmio_write_config32 reg: 0x%x, data: 0x%x\n", __func__,
PCU_CR1_BIOS_MB_DATA_REG, data);
pci_mmio_write_config32(dev, PCU_CR1_BIOS_MB_DATA_REG, data);
/* write the command */
printk(BIOS_SPEW, "%s - pci_mmio_write_config32 reg: 0x%x, data: 0x%x\n", __func__,
PCU_CR1_BIOS_MB_INTERFACE_REG,
(uint32_t) (command | BIOS_MB_RUN_BUSY_MASK));
pci_mmio_write_config32(dev, PCU_CR1_BIOS_MB_INTERFACE_REG,
(uint32_t) (command | BIOS_MB_RUN_BUSY_MASK));
/* wait for completion or time out*/
return wait_for_bios_cmd_cpl(dev, PCU_CR1_BIOS_MB_INTERFACE_REG,
BIOS_MB_RUN_BUSY_MASK, 0);
}
void config_reset_cpl3_csrs(void)
{
uint32_t data, plat_info, max_min_turbo_limit_ratio;
for (uint32_t socket = 0; socket < MAX_SOCKET; ++socket) {
uint32_t bus = get_socket_stack_busno(socket, PCU_IIO_STACK);
/* configure PCU_CR0_FUN csrs */
pci_devfn_t cr0_dev = PCI_DEV(bus, PCU_DEV, PCU_CR0_FUN);
data = pci_mmio_read_config32(cr0_dev, PCU_CR0_P_STATE_LIMITS);
data |= P_STATE_LIMITS_LOCK;
pci_mmio_write_config32(cr0_dev, PCU_CR0_P_STATE_LIMITS, data);
plat_info = pci_mmio_read_config32(cr0_dev, PCU_CR0_PLATFORM_INFO);
dump_csr64("", cr0_dev, PCU_CR0_PLATFORM_INFO);
max_min_turbo_limit_ratio =
(plat_info & MAX_NON_TURBO_LIM_RATIO_MASK) >>
MAX_NON_TURBO_LIM_RATIO_SHIFT;
printk(BIOS_SPEW, "plat_info: 0x%x, max_min_turbo_limit_ratio: 0x%x\n",
plat_info, max_min_turbo_limit_ratio);
/* configure PCU_CR1_FUN csrs */
pci_devfn_t cr1_dev = PCI_DEV(bus, PCU_DEV, PCU_CR1_FUN);
data = pci_mmio_read_config32(cr1_dev, PCU_CR1_SAPMCTL);
/* clear bits 27:31 - FSP sets this with 0x7 which needs to be cleared */
data &= 0x0fffffff;
data |= SAPMCTL_LOCK_MASK;
pci_mmio_write_config32(cr1_dev, PCU_CR1_SAPMCTL, data);
/* configure PCU_CR1_FUN csrs */
pci_devfn_t cr2_dev = PCI_DEV(bus, PCU_DEV, PCU_CR2_FUN);
data = PCIE_IN_PKGCSTATE_L1_MASK;
pci_mmio_write_config32(cr2_dev, PCU_CR2_PKG_CST_ENTRY_CRITERIA_MASK, data);
data = KTI_IN_PKGCSTATE_L1_MASK;
pci_mmio_write_config32(cr2_dev, PCU_CR2_PKG_CST_ENTRY_CRITERIA_MASK2, data);
data = PROCHOT_RATIO;
printk(BIOS_SPEW, "PCU_CR2_PROCHOT_RESPONSE_RATIO_REG data: 0x%x\n", data);
pci_mmio_write_config32(cr2_dev, PCU_CR2_PROCHOT_RESPONSE_RATIO_REG, data);
dump_csr("", cr2_dev, PCU_CR2_PROCHOT_RESPONSE_RATIO_REG);
data = pci_mmio_read_config32(cr2_dev, PCU_CR2_DYNAMIC_PERF_POWER_CTL);
data |= UNOCRE_PLIMIT_OVERRIDE_SHIFT;
pci_mmio_write_config32(cr2_dev, PCU_CR2_DYNAMIC_PERF_POWER_CTL, data);
}
}
static void set_bios_init_completion_for_package(uint32_t socket)
{
uint32_t data;
uint32_t timedout;
uint32_t bus = get_socket_stack_busno(socket, PCU_IIO_STACK);
pci_devfn_t dev = PCI_DEV(bus, PCU_DEV, PCU_CR1_FUN);
/* read pcu config */
timedout = write_bios_mailbox_cmd(dev, BIOS_CMD_READ_PCU_MISC_CFG, 0);
if (timedout) {
/* 2nd try */
timedout = write_bios_mailbox_cmd(dev, BIOS_CMD_READ_PCU_MISC_CFG, 0);
if (timedout)
die("BIOS PCU Misc Config Read timed out.\n");
data = pci_mmio_read_config32(dev, PCU_CR1_BIOS_MB_DATA_REG);
printk(BIOS_SPEW, "%s - pci_mmio_read_config32 reg: 0x%x, data: 0x%x\n",
__func__, PCU_CR1_BIOS_MB_DATA_REG, data);
/* write PCU config */
timedout = write_bios_mailbox_cmd(dev, BIOS_CMD_WRITE_PCU_MISC_CFG, data);
if (timedout)
die("BIOS PCU Misc Config Write timed out.\n");
}
/* update RST_CPL3, PCODE_INIT_DONE3 */
timedout = set_bios_reset_cpl_for_package(socket, RST_CPL3_MASK,
PCODE_INIT_DONE3_MASK, RST_CPL3_MASK);
if (timedout)
die("BIOS RESET CPL3 timed out.\n");
/* update RST_CPL4, PCODE_INIT_DONE4 */
timedout = set_bios_reset_cpl_for_package(socket, RST_CPL4_MASK,
PCODE_INIT_DONE4_MASK, RST_CPL4_MASK);
if (timedout)
die("BIOS RESET CPL4 timed out.\n");
/* set CSR_DESIRED_CORES_CFG2 lock bit */
data = pci_mmio_read_config32(dev, PCU_CR1_DESIRED_CORES_CFG2_REG);
data |= PCU_CR1_DESIRED_CORES_CFG2_REG_LOCK_MASK;
printk(BIOS_SPEW, "%s - pci_mmio_write_config32 PCU_CR1_DESIRED_CORES_CFG2_REG 0x%x, data: 0x%x\n",
__func__, PCU_CR1_DESIRED_CORES_CFG2_REG, data);
pci_mmio_write_config32(dev, PCU_CR1_DESIRED_CORES_CFG2_REG, data);
}
void set_bios_init_completion(void)
{
uint32_t sbsp_socket_id = 0; /* TODO - this needs to be configurable */
for (uint32_t socket = 0; socket < MAX_SOCKET; ++socket) {
if (socket == sbsp_socket_id)
continue;
set_bios_init_completion_for_package(socket);
}
set_bios_init_completion_for_package(sbsp_socket_id);
}
void get_core_thread_bits(uint32_t *core_bits, uint32_t *thread_bits)
{
register int ecx;
struct cpuid_result cpuid_regs;
/* get max index of CPUID */
cpuid_regs = cpuid(0);
assert(cpuid_regs.eax >= 0xb); /* cpuid_regs.eax is max input value for cpuid */
*thread_bits = *core_bits = 0;
ecx = 0;
while (1) {
cpuid_regs = cpuid_ext(0xb, ecx);
if (ecx == 0) {
*thread_bits = (cpuid_regs.eax & 0x1f);
} else {
*core_bits = (cpuid_regs.eax & 0x1f) - *thread_bits;
break;
}
ecx++;
}
}
void get_cpu_info_from_apicid(uint32_t apicid, uint32_t core_bits, uint32_t thread_bits,
uint8_t *package, uint8_t *core, uint8_t *thread)
{
if (package != NULL)
*package = (apicid >> (thread_bits + core_bits));
if (core != NULL)
*core = (uint32_t)((apicid >> thread_bits) & ~((~0) << core_bits));
if (thread != NULL)
*thread = (uint32_t)(apicid & ~((~0) << thread_bits));
}
int get_cpu_count(void)
{
size_t hob_size;
const uint8_t fsp_hob_iio_universal_data_guid[16] = FSP_HOB_IIO_UNIVERSAL_DATA_GUID;
const IIO_UDS *hob;
/* these fields are incorrect - need debugging */
hob = fsp_find_extension_hob_by_guid(fsp_hob_iio_universal_data_guid, &hob_size);
assert(hob != NULL && hob_size != 0);
return hob->SystemStatus.numCpus;
}
int get_threads_per_package(void)
{
unsigned int core_count, thread_count;
cpu_read_topology(&core_count, &thread_count);
return thread_count;
}
int get_platform_thread_count(void)
{
return get_cpu_count() * get_threads_per_package();
}
void get_iiostack_info(struct iiostack_resource *info)
{
size_t hob_size;
const uint8_t fsp_hob_iio_universal_data_guid[16] = FSP_HOB_IIO_UNIVERSAL_DATA_GUID;
const IIO_UDS *hob;
hob = fsp_find_extension_hob_by_guid(
fsp_hob_iio_universal_data_guid, &hob_size);
assert(hob != NULL && hob_size != 0);
// copy IIO Stack info from FSP HOB
info->no_of_stacks = 0;
for (int s = 0; s < hob->PlatformData.numofIIO; ++s) {
for (int x = 0; x < MAX_IIO_STACK; ++x) {
const STACK_RES *ri = &hob->PlatformData.IIO_resource[s].StackRes[x];
// TODO: do we have situation with only bux 0 and one stack?
if (ri->BusBase >= ri->BusLimit)
continue;
assert(info->no_of_stacks < (CONFIG_MAX_SOCKET * MAX_IIO_STACK));
memcpy(&info->res[info->no_of_stacks++], ri, sizeof(STACK_RES));
}
}
}
#if ENV_RAMSTAGE
void xeonsp_init_cpu_config(void)
{
struct device *dev;
int apic_ids[CONFIG_MAX_CPUS] = {0}, apic_ids_by_thread[CONFIG_MAX_CPUS] = {0};
int num_apics = 0;
uint32_t core_bits, thread_bits;
unsigned int core_count, thread_count;
unsigned int num_cpus;
/* sort APIC ids in asending order to identify apicid ranges for
each numa domain
*/
for (dev = all_devices; dev; dev = dev->next) {
if ((dev->path.type != DEVICE_PATH_APIC) ||
(dev->bus->dev->path.type != DEVICE_PATH_CPU_CLUSTER)) {
continue;
}
if (!dev->enabled)
continue;
if (num_apics >= ARRAY_SIZE(apic_ids))
break;
apic_ids[num_apics++] = dev->path.apic.apic_id;
}
if (num_apics > 1)
bubblesort(apic_ids, num_apics, NUM_ASCENDING);
num_cpus = get_cpu_count();
cpu_read_topology(&core_count, &thread_count);
assert(num_apics == (num_cpus * thread_count));
/* sort them by thread i.e., all cores with thread 0 and then thread 1 */
int index = 0;
for (int id = 0; id < num_apics; ++id) {
int apic_id = apic_ids[id];
if (apic_id & 0x1) { /* 2nd thread */
apic_ids_by_thread[index + (num_apics/2) - 1] = apic_id;
} else { /* 1st thread */
apic_ids_by_thread[index++] = apic_id;
}
}
/* update apic_id, node_id in sorted order */
num_apics = 0;
get_core_thread_bits(&core_bits, &thread_bits);
for (dev = all_devices; dev; dev = dev->next) {
uint8_t package;
if ((dev->path.type != DEVICE_PATH_APIC) ||
(dev->bus->dev->path.type != DEVICE_PATH_CPU_CLUSTER)) {
continue;
}
if (!dev->enabled)
continue;
if (num_apics >= ARRAY_SIZE(apic_ids))
break;
dev->path.apic.apic_id = apic_ids_by_thread[num_apics];
get_cpu_info_from_apicid(dev->path.apic.apic_id, core_bits, thread_bits,
&package, NULL, NULL);
dev->path.apic.node_id = package;
printk(BIOS_DEBUG, "CPU %d apic_id: 0x%x (%d), node_id: 0x%x\n",
num_apics, dev->path.apic.apic_id,
dev->path.apic.apic_id, dev->path.apic.node_id);
++num_apics;
}
}
unsigned int get_srat_memory_entries(acpi_srat_mem_t *srat_mem)
{
const struct SystemMemoryMapHob *memory_map;
size_t hob_size;
const uint8_t mem_hob_guid[16] = FSP_SYSTEM_MEMORYMAP_HOB_GUID;
unsigned int mmap_index;
memory_map = fsp_find_extension_hob_by_guid(mem_hob_guid, &hob_size);
assert(memory_map != NULL && hob_size != 0);
printk(BIOS_DEBUG, "FSP_SYSTEM_MEMORYMAP_HOB_GUID hob_size: %ld\n", hob_size);
mmap_index = 0;
for (int e = 0; e < memory_map->numberEntries; ++e) {
const struct SystemMemoryMapElement *mem_element = &memory_map->Element[e];
uint64_t addr =
(uint64_t) ((uint64_t)mem_element->BaseAddress <<
MEM_ADDR_64MB_SHIFT_BITS);
uint64_t size =
(uint64_t) ((uint64_t)mem_element->ElementSize <<
MEM_ADDR_64MB_SHIFT_BITS);
printk(BIOS_DEBUG, "memory_map %d addr: 0x%llx, BaseAddress: 0x%x, size: 0x%llx, "
"ElementSize: 0x%x, reserved: %d\n",
e, addr, mem_element->BaseAddress, size,
mem_element->ElementSize, (mem_element->Type & MEM_TYPE_RESERVED));
assert(mmap_index < MAX_ACPI_MEMORY_AFFINITY_COUNT);
/* skip reserved memory region */
if (mem_element->Type & MEM_TYPE_RESERVED)
continue;
/* skip if this address is already added */
bool skip = false;
for (int idx = 0; idx < mmap_index; ++idx) {
uint64_t base_addr = ((uint64_t)srat_mem[idx].base_address_high << 32) +
srat_mem[idx].base_address_low;
if (addr == base_addr) {
skip = true;
break;
}
}
if (skip)
continue;
srat_mem[mmap_index].type = 1; /* Memory affinity structure */
srat_mem[mmap_index].length = sizeof(acpi_srat_mem_t);
srat_mem[mmap_index].base_address_low = (uint32_t) (addr & 0xffffffff);
srat_mem[mmap_index].base_address_high = (uint32_t) (addr >> 32);
srat_mem[mmap_index].length_low = (uint32_t) (size & 0xffffffff);
srat_mem[mmap_index].length_high = (uint32_t) (size >> 32);
srat_mem[mmap_index].proximity_domain = mem_element->SocketId;
srat_mem[mmap_index].flags = SRAT_ACPI_MEMORY_ENABLED;
if ((mem_element->Type & MEMTYPE_VOLATILE_MASK) == 0)
srat_mem[mmap_index].flags |= SRAT_ACPI_MEMORY_NONVOLATILE;
++mmap_index;
}
return mmap_index;
}
#endif

View File

@ -0,0 +1,28 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <intelblocks/spi.h>
#include <soc/pci_devs.h>
int spi_soc_devfn_to_bus(unsigned int devfn)
{
switch (devfn) {
case PCH_DEVFN_SPI:
return 0;
}
return -1;
}

View File

@ -0,0 +1,305 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <cbmem.h>
#include <console/console.h>
#include <cpu/x86/lapic.h>
#include <device/pci.h>
#include <device/pci_ids.h>
#include <soc/iomap.h>
#include <soc/pci_devs.h>
#include <soc/ramstage.h>
#include <soc/soc_util.h>
struct map_entry {
uint32_t reg;
int is_64_bit;
int is_limit;
int mask_bits;
const char *description;
};
enum {
TOHM_REG,
MMIOL_REG,
MMCFG_BASE_REG,
MMCFG_LIMIT_REG,
TOLM_REG,
ME_BASE_REG,
ME_LIMIT_REG,
TSEG_BASE_REG,
TSEG_LIMIT_REG,
/* Must be last. */
NUM_MAP_ENTRIES
};
static struct map_entry memory_map[NUM_MAP_ENTRIES] = {
[TOHM_REG] = MAP_ENTRY_LIMIT_64(VTD_TOHM_CSR, 26, "TOHM"),
[MMIOL_REG] = MAP_ENTRY_BASE_32(VTD_MMIOL_CSR, "MMIOL"),
[MMCFG_BASE_REG] = MAP_ENTRY_BASE_64(VTD_MMCFG_BASE_CSR, "MMCFG_BASE"),
[MMCFG_LIMIT_REG] = MAP_ENTRY_LIMIT_64(VTD_MMCFG_LIMIT_CSR, 26, "MMCFG_LIMIT"),
[TOLM_REG] = MAP_ENTRY_LIMIT_32(VTD_TOLM_CSR, 26, "TOLM"),
[ME_BASE_REG] = MAP_ENTRY_BASE_64(VTD_ME_BASE_CSR, "ME_BASE"),
[ME_LIMIT_REG] = MAP_ENTRY_LIMIT_64(VTD_ME_LIMIT_CSR, 19, "ME_LIMIT"),
[TSEG_BASE_REG] = MAP_ENTRY_BASE_32(VTD_TSEG_BASE_CSR, "TSEGMB_BASE"),
[TSEG_LIMIT_REG] = MAP_ENTRY_LIMIT_32(VTD_TSEG_LIMIT_CSR, 20, "TSEGMB_LIMIT"),
};
static void read_map_entry(struct device *dev, struct map_entry *entry,
uint64_t *result)
{
uint64_t value;
uint64_t mask;
/* All registers are on a 1MiB granularity. */
mask = ((1ULL << entry->mask_bits) - 1);
mask = ~mask;
value = 0;
if (entry->is_64_bit) {
value = pci_read_config32(dev, entry->reg + sizeof(uint32_t));
value <<= 32;
}
value |= (uint64_t)pci_read_config32(dev, entry->reg);
value &= mask;
if (entry->is_limit)
value |= ~mask;
*result = value;
}
static void mc_read_map_entries(struct device *dev, uint64_t *values)
{
int i;
for (i = 0; i < NUM_MAP_ENTRIES; i++)
read_map_entry(dev, &memory_map[i], &values[i]);
}
static void mc_report_map_entries(struct device *dev, uint64_t *values)
{
int i;
for (i = 0; i < NUM_MAP_ENTRIES; i++) {
printk(BIOS_DEBUG, "MC MAP: %s: 0x%llx\n",
memory_map[i].description, values[i]);
}
}
/*
* Host Memory Map:
*
* +--------------------------+ TOCM (2 pow 46 - 1)
* | Reserved |
* +--------------------------+
* | MMIOH (relocatable) |
* +--------------------------+
* | PCISeg |
* +--------------------------+ TOHM
* | High DRAM Memory |
* +--------------------------+ 4GiB (0x100000000)
* +--------------------------+ 0xFFFF_FFFF
* | Firmware |
* +--------------------------+ 0xFF00_0000
* | Reserved |
* +--------------------------+ 0xFEF0_0000
* | Local xAPIC |
* +--------------------------+ 0xFEE0_0000
* | HPET/LT/TPM/Others |
* +--------------------------+ 0xFED0_0000
* | I/O xAPIC |
* +--------------------------+ 0xFEC0_0000
* | Reserved |
* +--------------------------+ 0xFEB8_0000
* | Reserved |
* +--------------------------+ 0xFEB0_0000
* | Reserved |
* +--------------------------+ 0xFE00_0000
* | MMIOL (relocatable) |
* | P2SB PCR cfg BAR | (0xfd000000 - 0xfdffffff
* | BAR space | [mem 0x90000000-0xfcffffff] available for PCI devices
* +--------------------------+ 0x9000_0000
* |PCIe MMCFG (relocatable) | CONFIG_MMCONF_BASE_ADDRESS 64 or 256MB
* | | (0x80000000 - 0x8fffffff, 0x40000)
* +--------------------------+ TOLM
* | MEseg (relocatable) | 32, 64, 128 or 256 MB (0x78000000 - 0x7fffffff, 0x20000)
* +--------------------------+
* | Tseg (relocatable) | N x 8MB (0x70000000 - 0x77ffffff, 0x20000)
* +--------------------------+ cbmem_top
* | Reserved - CBMEM | (0x6fffe000 - 0x6fffffff, 0x2000)
* +--------------------------+
* | Reserved - FSP | (0x6fbfe000 - 0x6fffdfff, 0x400000)
* +--------------------------+ top_of_ram (0x6fbfdfff)
* | Low DRAM Memory |
* +--------------------------+ FFFFF (1MB)
* | E & F segments |
* +--------------------------+ E0000
* | C & D segments |
* +--------------------------+ C0000
* | VGA & SMM Memory |
* +--------------------------+ A0000
* | Conventional Memory |
* | (DOS Range) |
* +--------------------------+ 0
*/
static void mc_add_dram_resources(struct device *dev, int *res_count)
{
struct range_entry fsp_mem;
uint64_t base_kb;
uint64_t size_kb;
uint64_t top_of_ram;
uint64_t mc_values[NUM_MAP_ENTRIES];
struct resource *resource;
int index = *res_count;
fsp_find_reserved_memory(&fsp_mem);
/* Read in the MAP registers and report their values. */
mc_read_map_entries(dev, &mc_values[0]);
mc_report_map_entries(dev, &mc_values[0]);
top_of_ram = range_entry_base(&fsp_mem) - 1;
printk(BIOS_SPEW, "cbmem_top: 0x%lx, fsp range: [0x%llx - 0x%llx], top_of_ram: 0x%llx\n",
(uintptr_t) cbmem_top(), range_entry_base(&fsp_mem),
range_entry_end(&fsp_mem), top_of_ram);
/* Conventional Memory (DOS region, 0x0 to 0x9FFFF) */
base_kb = 0;
size_kb = (0xa0000 >> 10);
LOG_MEM_RESOURCE("legacy_ram", dev, index, base_kb, size_kb);
ram_resource(dev, index++, base_kb, size_kb);
/* 1MB -> top_of_ram i.e., fsp_mem_base+1*/
base_kb = (0x100000 >> 10);
size_kb = (top_of_ram - 0xfffff) >> 10;
LOG_MEM_RESOURCE("low_ram", dev, index, base_kb, size_kb);
ram_resource(dev, index++, base_kb, size_kb);
/*
* FSP meomoy, CBMem regions are already added as reserved
* Add TSEG and MESEG Regions as reserved memory
* src/drivers/intel/fsp2_0/memory_init.c sets CBMEM reserved size
* arch_upd->BootLoaderTolumSize = cbmem_overhead_size(); == 2 * CBMEM_ROOT_MIN_SIZE
* typically 0x2000
* Example config:
* FSP_RESERVED_MEMORY_RESOURCE_HOB
* FspReservedMemoryResource Base : 6FBFE000
* FspReservedMemoryResource Size : 400000
* FSP_BOOT_LOADER_TOLUM_HOB
* FspBootLoaderTolum Base : 6FFFE000
* FspBootLoaderTolum Size : 2000
*/
/* Mark TSEG/SMM region as reserved */
base_kb = (mc_values[TSEG_BASE_REG] >> 10);
size_kb = (mc_values[TSEG_LIMIT_REG] - mc_values[TSEG_BASE_REG] + 1) >> 10;
LOG_MEM_RESOURCE("mmio_tseg", dev, index, base_kb, size_kb);
reserved_ram_resource(dev, index++, base_kb, size_kb);
/* Mark region between TSEG - TOLM (eg. MESEG) as reserved */
if (mc_values[TSEG_LIMIT_REG] < mc_values[TOLM_REG]) {
base_kb = ((mc_values[TSEG_LIMIT_REG] + 1) >> 10);
size_kb = (mc_values[TOLM_REG] - mc_values[TSEG_LIMIT_REG]) >> 10;
LOG_MEM_RESOURCE("mmio_tolm", dev, index, base_kb, size_kb);
reserved_ram_resource(dev, index++, base_kb, size_kb);
}
/* 4GiB -> TOHM */
if (mc_values[TOHM_REG] > 0x100000000) {
base_kb = (0x100000000 >> 10);
size_kb = (mc_values[TOHM_REG] - 0x100000000 + 1) >> 10;
LOG_MEM_RESOURCE("high_ram", dev, index, base_kb, size_kb);
ram_resource(dev, index++, base_kb, size_kb);
}
/* add MMIO CFG resource */
resource = new_resource(dev, index++);
resource->base = (resource_t) mc_values[MMCFG_BASE_REG];
resource->size = (resource_t) (mc_values[MMCFG_LIMIT_REG] -
mc_values[MMCFG_BASE_REG] + 1);
resource->flags = IORESOURCE_MEM | IORESOURCE_RESERVE |
IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED;
LOG_MEM_RESOURCE("mmiocfg_res", dev, index-1, (resource->base >> 10),
(resource->size >> 10));
/* add Local APIC resource */
resource = new_resource(dev, index++);
resource->base = LAPIC_DEFAULT_BASE;
resource->size = 0x00001000;
resource->flags = IORESOURCE_MEM | IORESOURCE_RESERVE |
IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED;
LOG_MEM_RESOURCE("apic_res", dev, index-1, (resource->base >> 10),
(resource->size >> 10));
/*
* Add legacy region as reserved - 0xa000 - 1MB
* Reserve everything between A segment and 1MB:
*
* 0xa0000 - 0xbffff: legacy VGA
* 0xc0000 - 0xfffff: RAM
*/
base_kb = VGA_BASE_ADDRESS >> 10;
size_kb = VGA_BASE_SIZE >> 10;
LOG_MEM_RESOURCE("legacy_mmio", dev, index, base_kb, size_kb);
mmio_resource(dev, index++, base_kb, size_kb);
base_kb = (0xc0000 >> 10);
size_kb = (0x100000 - 0xc0000) >> 10;
LOG_MEM_RESOURCE("legacy_write_protect", dev, index, base_kb, size_kb);
reserved_ram_resource(dev, index++, base_kb, size_kb);
*res_count = index;
}
static void mmapvtd_read_resources(struct device *dev)
{
int index = 0;
/* Read standard PCI resources. */
pci_dev_read_resources(dev);
/* Calculate and add DRAM resources. */
mc_add_dram_resources(dev, &index);
}
static void mmapvtd_init(struct device *dev)
{
}
static struct device_operations mmapvtd_ops = {
.read_resources = mmapvtd_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = pci_dev_enable_resources,
.init = mmapvtd_init,
.ops_pci = &soc_pci_ops,
#if CONFIG(HAVE_ACPI_TABLES)
.acpi_inject_dsdt_generator = NULL,
#endif
};
static const unsigned short mmapvtd_ids[] = {
MMAP_VTD_CFG_REG_DEVID, /* Memory Map/Intel® VT-d Configuration Registers */
0
};
static const struct pci_driver mmapvtd_driver __pci_driver = {
.ops = &mmapvtd_ops,
.vendor = PCI_VENDOR_ID_INTEL,
.devices = mmapvtd_ids
};

View File

@ -0,0 +1,80 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2019 - 2020 Intel Corporation
* Copyright (C) 2019 - 2020 Facebook Inc
*
* 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.
*/
#include <console/console.h>
#include <fsp/util.h>
#include <lib.h>
#define DUMP_UPD(old, new, field) \
fsp_display_upd_value(#field, sizeof(old->field), old->field, new->field)
/* Display the UPD parameters for MemoryInit */
void soc_display_fspm_upd_params(
const FSPM_UPD *fspm_old_upd,
const FSPM_UPD *fspm_new_upd)
{
const FSP_M_CONFIG *new;
const FSP_M_CONFIG *old;
old = &fspm_old_upd->FspmConfig;
new = &fspm_new_upd->FspmConfig;
printk(BIOS_DEBUG, "UPD values for MemoryInit:\n");
DUMP_UPD(old, new, PcdFspMrcDebugPrintErrorLevel);
DUMP_UPD(old, new, PcdFspKtiDebugPrintErrorLevel);
DUMP_UPD(old, new, PcdHsuartDevice);
hexdump(fspm_new_upd, sizeof(*fspm_new_upd));
}
/* Display the UPD parameters for SiliconInit */
void soc_display_fsps_upd_params(
const FSPS_UPD *fsps_old_upd,
const FSPS_UPD *fsps_new_upd)
{
const FSPS_CONFIG *new;
const FSPS_CONFIG *old;
old = &fsps_old_upd->FspsConfig;
new = &fsps_new_upd->FspsConfig;
printk(BIOS_DEBUG, "UPD values for SiliconInit:\n");
DUMP_UPD(old, new, PcdBifurcationPcie0);
DUMP_UPD(old, new, PcdBifurcationPcie1);
DUMP_UPD(old, new, PcdActiveCoreCount);
DUMP_UPD(old, new, PcdCpuMicrocodePatchBase);
DUMP_UPD(old, new, PcdCpuMicrocodePatchSize);
DUMP_UPD(old, new, PcdEnablePcie0);
DUMP_UPD(old, new, PcdEnablePcie1);
DUMP_UPD(old, new, PcdEnableEmmc);
DUMP_UPD(old, new, PcdEnableGbE);
DUMP_UPD(old, new, PcdFiaMuxConfigRequestPtr);
DUMP_UPD(old, new, PcdPcieRootPort0DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort1DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort2DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort3DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort4DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort5DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort6DeEmphasis);
DUMP_UPD(old, new, PcdPcieRootPort7DeEmphasis);
DUMP_UPD(old, new, PcdEMMCDLLConfigPtr);
hexdump(fsps_new_upd, sizeof(*fsps_new_upd));
}