coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
fsp_params.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <assert.h>
4 #include <device/pci_def.h>
5 #include <device/pci.h>
6 #include <cpu/x86/msr.h>
7 #include <console/console.h>
8 #include <fsp/util.h>
9 #include <intelblocks/cpulib.h>
10 #include <intelblocks/pmclib.h>
11 #include <soc/iomap.h>
12 #include <soc/msr.h>
13 #include <soc/pci_devs.h>
14 #include <soc/romstage.h>
15 #include <types.h>
16 
17 #include "../chip.h"
18 
20 {
21  const struct device *dev = pcidev_path_on_root(PCH_DEVFN_LPC);
22  assert(dev != NULL);
23  const config_t *config = config_of(dev);
24  FSP_M_CONFIG *m_cfg = &mupd->FspmConfig;
25  FSP_M_TEST_CONFIG *tconfig = &mupd->FspmTestConfig;
26  unsigned int i;
27  uint32_t mask = 0;
28 
29  /*
30  * Probe for no IGD and disable InternalGfx and panel power to prevent a
31  * crash in FSP-M.
32  */
34  const bool igd_on = !CONFIG(SOC_INTEL_DISABLE_IGD) && dev && dev->enabled;
35  if (igd_on && pci_read_config16(SA_DEV_IGD, PCI_VENDOR_ID) != 0xffff) {
36  /* Set IGD stolen size to 64MB. */
37  m_cfg->InternalGfx = 1;
38  m_cfg->IgdDvmt50PreAlloc = 2;
39  } else {
40  m_cfg->InternalGfx = 0;
41  m_cfg->IgdDvmt50PreAlloc = 0;
42  tconfig->PanelPowerEnable = 0;
43  }
44  m_cfg->TsegSize = CONFIG_SMM_TSEG_SIZE;
45  m_cfg->IedSize = CONFIG_IED_REGION_SIZE;
46  m_cfg->SaGv = config->SaGv;
47  if (CONFIG(SOC_INTEL_CANNONLAKE_PCH_H))
48  m_cfg->UserBd = BOARD_TYPE_DESKTOP;
49  else
50  m_cfg->UserBd = BOARD_TYPE_ULT_ULX;
51  m_cfg->RMT = config->RMT;
52 
53  for (i = 0; i < ARRAY_SIZE(config->PcieRpEnable); i++) {
54  if (config->PcieRpEnable[i])
55  mask |= (1 << i);
56  }
57  m_cfg->PcieRpEnableMask = mask;
58  m_cfg->PrmrrSize = get_valid_prmrr_size();
59  m_cfg->EnableC6Dram = config->enable_c6dram;
60 #if CONFIG(SOC_INTEL_COMETLAKE)
61  m_cfg->SerialIoUartDebugControllerNumber = CONFIG_UART_FOR_CONSOLE;
62  memcpy(tconfig->PcieRpHotPlug, config->PcieRpHotPlug, sizeof(tconfig->PcieRpHotPlug));
63 #else
64  m_cfg->PcdSerialIoUartNumber = CONFIG_UART_FOR_CONSOLE;
65 #endif
66  /*
67  * PcdDebugInterfaceFlags
68  * This config will allow coreboot to pass information to the FSP
69  * regarding which debug interface is being used.
70  * Debug Interfaces:
71  * BIT0-RAM, BIT1-Legacy Uart BIT3-USB3, BIT4-LPSS Uart, BIT5-TraceHub
72  * BIT2 - Not used.
73  */
74  m_cfg->PcdDebugInterfaceFlags =
75  CONFIG(DRIVERS_UART_8250IO) ? 0x02 : 0x10;
76 
77  /* Change VmxEnable UPD value according to ENABLE_VMX Kconfig */
78  m_cfg->VmxEnable = CONFIG(ENABLE_VMX);
79 
80  m_cfg->SkipMpInit = !CONFIG(USE_INTEL_FSP_MP_INIT);
81 
82  if (config->cpu_ratio_override) {
83  m_cfg->CpuRatio = config->cpu_ratio_override;
84  } else {
85  /* Set CpuRatio to match existing MSR value */
86  msr_t flex_ratio;
87  flex_ratio = rdmsr(MSR_FLEX_RATIO);
88  m_cfg->CpuRatio = (flex_ratio.lo >> 8) & 0xff;
89  }
90 
92  /* If ISH is enabled, enable ISH elements */
93  if (!dev)
94  m_cfg->PchIshEnable = 0;
95  else
96  m_cfg->PchIshEnable = dev->enabled;
97 
98  /* If HDA is enabled, enable HDA elements */
100  if (!dev)
101  m_cfg->PchHdaEnable = 0;
102  else
103  m_cfg->PchHdaEnable = dev->enabled;
104 
105  /* Enable IPU only if the device is enabled */
106  m_cfg->SaIpuEnable = 0;
108  if (dev)
109  m_cfg->SaIpuEnable = dev->enabled;
110 
111  /* SATA Gen3 strength */
112  for (i = 0; i < SOC_INTEL_CML_SATA_DEV_MAX; i++) {
113  if (config->sata_port[i].RxGen3EqBoostMagEnable) {
114  m_cfg->PchSataHsioRxGen3EqBoostMagEnable[i] =
115  config->sata_port[i].RxGen3EqBoostMagEnable;
116  m_cfg->PchSataHsioRxGen3EqBoostMag[i] =
117  config->sata_port[i].RxGen3EqBoostMag;
118  }
119  if (config->sata_port[i].TxGen3DownscaleAmpEnable) {
120  m_cfg->PchSataHsioTxGen3DownscaleAmpEnable[i] =
121  config->sata_port[i].TxGen3DownscaleAmpEnable;
122  m_cfg->PchSataHsioTxGen3DownscaleAmp[i] =
123  config->sata_port[i].TxGen3DownscaleAmp;
124  }
125  if (config->sata_port[i].TxGen3DeEmphEnable) {
126  m_cfg->PchSataHsioTxGen3DeEmphEnable[i] =
127  config->sata_port[i].TxGen3DeEmphEnable;
128  m_cfg->PchSataHsioTxGen3DeEmph[i] =
129  config->sata_port[i].TxGen3DeEmph;
130  }
131  }
132 #if !CONFIG(SOC_INTEL_COMETLAKE)
133  if (config->DisableHeciRetry)
134  tconfig->DisableHeciRetry = config->DisableHeciRetry;
135 #endif
136 
137  /* Enable SMBus controller based on config */
139  if (!dev)
140  m_cfg->SmbusEnable = 0;
141  else
142  m_cfg->SmbusEnable = dev->enabled;
143 
144  /* Set debug probe type */
145  m_cfg->PlatformDebugConsent =
146  CONFIG_SOC_INTEL_CANNONLAKE_DEBUG_CONSENT;
147 
148  /* Configure VT-d */
149  tconfig->VtdDisable = 0;
150 
151  /* Set HECI1 PCI BAR address */
152  m_cfg->Heci1BarAddress = HECI1_BASE_ADDRESS;
153 
155 }
156 
158 {
159  printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
160 }
__weak void mainboard_memory_init_params(FSPM_UPD *memupd)
Definition: fsp_params.c:389
void platform_fsp_memory_init_params_cb(FSPM_UPD *mupd, uint32_t version)
Definition: fsp_params.c:361
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
#define assert(statement)
Definition: assert.h:74
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
#define MSR_FLEX_RATIO
Definition: haswell.h:47
int get_valid_prmrr_size(void)
Definition: cpulib.c:397
DEVTREE_CONST struct device * pcidev_path_on_root(pci_devfn_t devfn)
Definition: device_const.c:255
@ CONFIG
Definition: dsi_common.h:201
#define FSP_M_CONFIG
Definition: fsp_upd.h:8
static __always_inline msr_t rdmsr(unsigned int index)
Definition: msr.h:146
static DEVTREE_CONST void * config_of(const struct device *dev)
Definition: device.h:382
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
#define HECI1_BASE_ADDRESS
Definition: iomap.h:77
unsigned int version[2]
Definition: edid.c:55
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
enum board_config config
Definition: memory.c:448
#define PCI_VENDOR_ID
Definition: pci_def.h:8
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
#define SA_DEVFN_IPU
Definition: pci_devs.h:40
#define SA_DEV_IGD
Definition: pci_devs.h:33
#define PCH_DEVFN_HDA
Definition: pci_devs.h:218
#define PCH_DEVFN_SMBUS
Definition: pci_devs.h:219
#define SA_DEVFN_IGD
Definition: pci_devs.h:32
#define PCH_DEVFN_ISH
Definition: pci_devs.h:106
@ BOARD_TYPE_ULT_ULX
Definition: romstage.h:16
@ BOARD_TYPE_DESKTOP
Definition: romstage.h:15
#define PCH_DEVFN_LPC
Definition: pci_devs.h:156
#define SOC_INTEL_CML_SATA_DEV_MAX
Definition: chip.h:29
static const int mask[4]
Definition: gpio.c:308
#define NULL
Definition: stddef.h:19
unsigned int uint32_t
Definition: stdint.h:14
Definition: device.h:107
unsigned int enabled
Definition: device.h:122
unsigned int lo
Definition: msr.h:111