coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
chip.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <arch/ioapic.h>
4 #include <console/console.h>
5 #include <console/debug.h>
6 #include <cpu/x86/mp.h>
7 #include <device/pci.h>
8 #include <device/pci_ids.h>
9 #include <intelblocks/acpi.h>
10 #include <intelblocks/gpio.h>
11 #include <intelblocks/lpc_lib.h>
12 #include <intelblocks/p2sb.h>
13 #include <soc/acpi.h>
14 #include <soc/chip_common.h>
15 #include <soc/cpu.h>
16 #include <soc/pch.h>
17 #include <soc/ramstage.h>
18 #include <soc/p2sb.h>
19 #include <soc/soc_util.h>
20 #include <soc/util.h>
21 #include <soc/pci_devs.h>
22 
23 /* UPD parameters to be initialized before SiliconInit */
25 {
27 }
28 
29 #if CONFIG(HAVE_ACPI_TABLES)
30 const char *soc_acpi_name(const struct device *dev)
31 {
32  if (dev->path.type == DEVICE_PATH_DOMAIN)
33  return "PC00";
34  return NULL;
35 }
36 #endif
37 
38 static struct device_operations pci_domain_ops = {
40  .set_resources = &xeonsp_pci_domain_set_resources,
41  .scan_bus = &xeonsp_pci_domain_scan_bus,
42 #if CONFIG(HAVE_ACPI_TABLES)
43  .write_acpi_tables = &northbridge_write_acpi_tables,
44  .acpi_name = soc_acpi_name
45 #endif
46 };
47 
48 static struct device_operations cpu_bus_ops = {
50  .set_resources = noop_set_resources,
51  .init = cpx_init_cpus,
52  .acpi_fill_ssdt = generate_cpu_entries,
53 };
54 
55 struct pci_operations soc_pci_ops = {
56  .set_subsystem = pci_dev_set_subsystem,
57 };
58 
59 static void chip_enable_dev(struct device *dev)
60 {
61  /* Set the operations if it is a special bus type */
62  if (dev->path.type == DEVICE_PATH_DOMAIN) {
63  dev->ops = &pci_domain_ops;
64  attach_iio_stacks(dev);
65  } else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
66  dev->ops = &cpu_bus_ops;
67  } else if (dev->path.type == DEVICE_PATH_GPIO) {
68  block_gpio_enable(dev);
69  }
70 }
71 
72 static void iio_write_mask(u16 bus, u16 dev, u8 func)
73 {
74  pci_devfn_t device = PCI_DEV(bus, dev, func);
78 
82 }
83 
84 static void iio_dmi_en_masks(void)
85 {
87  u32 val;
92 
96 }
97 
98 static void iio_enable_masks(void)
99 {
100  struct iiostack_resource iio = {0};
101  get_iiostack_info(&iio);
102  int i, k;
103  for (i = 0; i < iio.no_of_stacks; i++) {
104  const STACK_RES *st = &iio.res[i];
105  if (st->BusBase > 0 && st->BusBase != 0xff) {
106  for (k = 0; k < DEVICES_PER_IIO_STACK; k++) {
107  printk(BIOS_DEBUG, "%s: bus:%x dev:%x func:%x\n", __func__,
108  st->BusBase, k, 0);
109  iio_write_mask(st->BusBase, k, 0);
110  }
111  }
112  }
114 }
115 
116 static void set_pcu_locks(void)
117 {
118  for (uint32_t socket = 0; socket < soc_get_num_cpus(); ++socket) {
120 
121  /* configure PCU_CR0_FUN csrs */
122  const struct device *cr0_dev = PCU_DEV_CR0(bus);
126 
127 
128  /* configure PCU_CR1_FUN csrs */
129  const struct device *cr1_dev = PCU_DEV_CR1(bus);
131 
132  /* configure PCU_CR2_FUN csrs */
133  const struct device *cr2_dev = PCU_DEV_CR2(bus);
136 
137  /* configure PCU_CR3_FUN csrs */
138  const struct device *cr3_dev = PCU_DEV_CR3(bus);
141  }
142 
143 }
144 
145 static void set_imc_locks(void)
146 {
147  struct device *dev = 0;
148  while ((dev = dev_find_device(PCI_VID_INTEL, IMC_M2MEM_DEVID, dev)))
150 }
151 
152 static void set_upi_locks(void)
153 {
154  struct device *dev = 0;
155  while ((dev = dev_find_device(PCI_VID_INTEL, UPI_LL_CR_DEVID, dev)))
157 }
158 
159 static void chip_final(void *data)
160 {
161  /* Lock SBI */
163 
164  /* LOCK PAM */
165  pci_or_config32(pcidev_path_on_root(PCI_DEVFN(0, 0)), 0x80, 1 << 0);
166 
167  set_pcu_locks();
168  set_imc_locks();
169  set_upi_locks();
170 
171  p2sb_hide();
174 }
175 
176 static void chip_init(void *data)
177 {
178  printk(BIOS_DEBUG, "coreboot: calling fsp_silicon_init\n");
182  pch_lock_dmictl();
183  p2sb_unhide();
184 }
185 
187  CHIP_NAME("Intel Cooper Lake-SP")
188  .enable_dev = chip_enable_dev,
189  .init = chip_init,
190  .final = chip_final,
191 };
void xeonsp_pci_domain_scan_bus(struct device *dev)
Definition: chip_common.c:87
void xeonsp_pci_domain_set_resources(struct device *dev)
Definition: chip_common.c:465
void attach_iio_stacks(struct device *dev)
Definition: chip_common.c:489
void p2sb_hide(void)
Definition: p2sb.c:83
void p2sb_unhide(void)
Definition: p2sb.c:78
enum fch_io_device device
Definition: fch.c:74
#define printk(level,...)
Definition: stdlib.h:16
void generate_cpu_entries(const struct device *device)
Definition: acpi.c:334
DEVTREE_CONST struct device * pcidev_path_on_root(pci_devfn_t devfn)
Definition: device_const.c:255
struct device * dev_find_device(u16 vendor, u16 device, struct device *from)
Find a device of a given vendor and type.
Definition: device_util.c:42
void fsp_silicon_init(void)
Definition: silicon_init.c:242
void block_gpio_enable(struct device *dev)
Definition: gpio_dev.c:24
#define CHIP_NAME(X)
Definition: device.h:32
static void noop_read_resources(struct device *dev)
Standard device operations function pointers shims.
Definition: device.h:73
static void noop_set_resources(struct device *dev)
Definition: device.h:74
static __always_inline void pci_or_config32(const struct device *dev, u16 reg, u32 ormask)
Definition: pci_ops.h:191
uint32_t get_socket_stack_busno(uint32_t socket, uint32_t stack)
Definition: soc_util.c:33
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
unsigned long northbridge_write_acpi_tables(struct device *device, unsigned long start)
#define P2SBC
Definition: p2sblib.h:10
@ DEVICE_PATH_GPIO
Definition: path.h:22
@ DEVICE_PATH_CPU_CLUSTER
Definition: path.h:14
@ DEVICE_PATH_DOMAIN
Definition: path.h:13
#define PCI_DEVFN(slot, func)
Definition: pci_def.h:548
void pci_dev_set_subsystem(struct device *dev, unsigned int vendor, unsigned int device)
Definition: pci_device.c:791
void pci_domain_read_resources(struct device *dev)
Definition: pci_device.c:547
#define PCI_VID_INTEL
Definition: pci_ids.h:2157
static __always_inline uint32_t pci_s_read_config32(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:92
static __always_inline void pci_s_write_config32(pci_devfn_t dev, uint16_t reg, uint32_t value)
Definition: pci_io_cfg.h:110
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
u32 pci_devfn_t
Definition: pci_type.h:8
struct device_operations cpu_bus_ops
Definition: chip.c:22
const char * soc_acpi_name(const struct device *dev)
Definition: chip.c:31
#define PCH_DEV_P2SB
Definition: pci_devs.h:225
void platform_fsp_silicon_init_params_cb(FSPS_UPD *silupd)
Definition: chip.c:628
__weak void mainboard_silicon_init_params(FSP_S_CONFIG *silconfig)
Definition: chip.c:875
struct pci_operations soc_pci_ops
Definition: chip.c:51
static void pch_enable_ioapic(struct device *dev)
Definition: lpc.c:26
static void set_imc_locks(void)
Definition: chip.c:145
static void set_pcu_locks(void)
Definition: chip.c:116
static void iio_write_mask(u16 bus, u16 dev, u8 func)
Definition: chip.c:72
static void iio_dmi_en_masks(void)
Definition: chip.c:84
static struct device_operations pci_domain_ops
Definition: chip.c:38
struct chip_operations soc_intel_xeon_sp_cpx_ops
Definition: chip.c:186
static void set_upi_locks(void)
Definition: chip.c:152
static void chip_final(void *data)
Definition: chip.c:159
static void iio_enable_masks(void)
Definition: chip.c:98
static void chip_enable_dev(struct device *dev)
Definition: chip.c:59
static void chip_init(void *data)
Definition: chip.c:176
void cpx_init_cpus(struct device *dev)
Definition: cpu.c:209
#define ECRC_ERR
Definition: pci_devs.h:174
#define PCU_DEV_CR3(bus)
Definition: pci_devs.h:75
#define RCVD_PCIE_UR_STS_MASK
Definition: pci_devs.h:160
#define PCU_CR3_FLEX_RATIO
Definition: pci_devs.h:78
#define RCVD_PCIE_CA_STS_MASK
Definition: pci_devs.h:159
#define FLOW_CNTR
Definition: pci_devs.h:177
#define PCU_DEV_CR2(bus)
Definition: pci_devs.h:67
#define P_STATE_LIMITS_LOCK
Definition: pci_devs.h:32
#define IIO_XPUNCCERRMSK_REG
Definition: pci_devs.h:157
#define PCU_DEV_CR0(bus)
Definition: pci_devs.h:27
#define DEVICES_PER_IIO_STACK
Definition: pci_devs.h:162
#define PCU_CR0_P_STATE_LIMITS
Definition: pci_devs.h:31
#define PCU_CR2_DRAM_PLANE_POWER_LIMIT
Definition: pci_devs.h:71
#define SAPMCTL_LOCK_MASK
Definition: pci_devs.h:64
#define RP_UNCERRMSK
Definition: pci_devs.h:154
#define PCU_CR0_PACKAGE_RAPL_LIMIT_UPR
Definition: pci_devs.h:34
#define DMI_DEV
Definition: pci_devs.h:169
#define UNSUPPORTED_REQ_ERR_MSK
Definition: pci_devs.h:156
#define POISON_TLP
Definition: pci_devs.h:178
#define SENT_PCIE_UNSUPP_MASK
Definition: pci_devs.h:158
#define TURBO_ACTIVATION_RATIO_LOCK
Definition: pci_devs.h:30
#define PCU_DEV_CR1(bus)
Definition: pci_devs.h:40
#define DRAM_POWER_INFO_LOCK_UPR
Definition: pci_devs.h:70
#define KTIMISCMODLCK_LOCK
Definition: pci_devs.h:131
#define IMC_M2MEM_TIMEOUT
Definition: pci_devs.h:124
#define DMI_UNCERRMSK
Definition: pci_devs.h:173
#define DMI_FUNC
Definition: pci_devs.h:170
#define UPI_LL_CR_DEVID
Definition: pci_devs.h:129
#define PKG_PWR_LIM_LOCK_UPR
Definition: pci_devs.h:35
#define PCU_CR1_SAPMCTL
Definition: pci_devs.h:63
#define PCU_CR0_TURBO_ACTIVATION_RATIO
Definition: pci_devs.h:29
#define PCU_CR2_DRAM_POWER_INFO_UPR
Definition: pci_devs.h:69
#define SURPRISE_DWN_ERR_MSK
Definition: pci_devs.h:155
#define DLL_PRT_ERR
Definition: pci_devs.h:179
#define PCU_CR3_CONFIG_TDP_CONTROL
Definition: pci_devs.h:76
#define UPI_LL_CR_KTIMISCMODLCK
Definition: pci_devs.h:130
#define DMI_BUS_INDEX
Definition: pci_devs.h:168
#define IMC_M2MEM_DEVID
Definition: pci_devs.h:123
#define OC_LOCK
Definition: pci_devs.h:79
#define RCV_BUF_OVRFLOW
Definition: pci_devs.h:176
#define PP_PWR_LIM_LOCK
Definition: pci_devs.h:72
#define TDP_LOCK
Definition: pci_devs.h:77
#define MLFRMD_TLP
Definition: pci_devs.h:175
#define PCU_IIO_STACK
Definition: pci_devs.h:23
#define TIMEOUT_LOCK
Definition: pci_devs.h:125
void pch_lock_dmictl(void)
Definition: pch.c:71
void override_hpet_ioapic_bdf(void)
Definition: pch.c:54
void get_iiostack_info(struct iiostack_resource *info)
Definition: util.c:103
void set_bios_init_completion(void)
unsigned int soc_get_num_cpus(void)
Definition: util.c:120
#define NULL
Definition: stddef.h:19
unsigned int uint32_t
Definition: stdint.h:14
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
Definition: device.h:76
void(* read_resources)(struct device *dev)
Definition: device.h:39
enum device_path_type type
Definition: path.h:114
Definition: device.h:107
struct device_path path
Definition: device.h:115
struct device_operations * ops
Definition: device.h:143
STACK_RES res[CONFIG_MAX_SOCKET *MAX_IIO_STACK]
Definition: util.h:21
uint8_t no_of_stacks
Definition: util.h:20
u8 val
Definition: sys.c:300
#define SBILOCK
Definition: p2sb.h:16