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 <cpu/x86/msr.h>
5 #include <fsp/util.h>
6 #include <intelblocks/cpulib.h>
7 #include <soc/iomap.h>
8 #include <soc/msr.h>
9 #include <soc/pci_devs.h>
10 #include <soc/romstage.h>
11 #include <soc/soc_chip.h>
12 
13 static void cpu_flex_override(FSP_M_CONFIG *m_cfg)
14 {
15  msr_t flex_ratio;
16  m_cfg->CpuRatioOverride = 1;
17  /*
18  * Set cpuratio to that value set in bootblock, This will ensure FSPM
19  * knows the intended flex ratio.
20  */
21  flex_ratio = rdmsr(MSR_FLEX_RATIO);
22  m_cfg->CpuRatio = (flex_ratio.lo >> 8) & 0xff;
23 }
24 
25 static void soc_peg_init_params(FSP_M_CONFIG *m_cfg,
26  FSP_M_TEST_CONFIG *m_t_cfg,
27  const struct soc_intel_skylake_config *config)
28 {
29  /*
30  * To enable or disable the corresponding PEG root port you need to
31  * add to the devicetree.cb:
32  *
33  * device pci 01.0 on end # enable PEG0 root port
34  * device pci 01.1 off end # do not configure PEG1
35  *
36  * If PEG port is not defined in the device tree, it will be disabled
37  * in FSP
38  */
39  m_cfg->Peg0Enable = is_devfn_enabled(SA_DEVFN_PEG0);
40  if (m_cfg->Peg0Enable) {
41  m_cfg->Peg0Enable = 2;
42  m_cfg->Peg0MaxLinkWidth = config->Peg0MaxLinkWidth;
43  /* Use maximum possible link speed */
44  m_cfg->Peg0MaxLinkSpeed = 0;
45  /* Power down unused lanes based on the max possible width */
46  m_cfg->Peg0PowerDownUnusedLanes = 1;
47  /* Set [Auto] for options to enable equalization methods */
48  m_t_cfg->Peg0Gen3EqPh2Enable = 2;
49  m_t_cfg->Peg0Gen3EqPh3Method = 0;
50  }
51 
52  m_cfg->Peg1Enable = is_devfn_enabled(SA_DEVFN_PEG1);
53  if (m_cfg->Peg1Enable) {
54  m_cfg->Peg1Enable = 2;
55  m_cfg->Peg1MaxLinkWidth = config->Peg1MaxLinkWidth;
56  m_cfg->Peg1MaxLinkSpeed = 0;
57  m_cfg->Peg1PowerDownUnusedLanes = 1;
58  m_t_cfg->Peg1Gen3EqPh2Enable = 2;
59  m_t_cfg->Peg1Gen3EqPh3Method = 0;
60  }
61 
62  m_cfg->Peg2Enable = is_devfn_enabled(SA_DEVFN_PEG2);
63  if (m_cfg->Peg2Enable) {
64  m_cfg->Peg2Enable = 2;
65  m_cfg->Peg2MaxLinkWidth = config->Peg2MaxLinkWidth;
66  m_cfg->Peg2MaxLinkSpeed = 0;
67  m_cfg->Peg2PowerDownUnusedLanes = 1;
68  m_t_cfg->Peg2Gen3EqPh2Enable = 2;
69  m_t_cfg->Peg2Gen3EqPh3Method = 0;
70  }
71 }
72 
74  const struct soc_intel_skylake_config *config)
75 {
76  int i;
77  uint32_t mask = 0;
78 
79  m_cfg->MmioSize = 0x800; /* 2GB in MB */
80  m_cfg->TsegSize = CONFIG_SMM_TSEG_SIZE;
81  m_cfg->IedSize = CONFIG_IED_REGION_SIZE;
82  m_cfg->ProbelessTrace = 0;
83  m_cfg->SaGv = config->SaGv;
84  if (CONFIG(SKYLAKE_SOC_PCH_H))
85  m_cfg->UserBd = BOARD_TYPE_DESKTOP;
86  else
87  m_cfg->UserBd = BOARD_TYPE_ULT_ULX;
88  m_cfg->RMT = config->RMT;
89  m_cfg->CmdTriStateDis = config->CmdTriStateDis;
90  m_cfg->DdrFreqLimit = 0;
91  m_cfg->VmxEnable = CONFIG(ENABLE_VMX);
92  m_cfg->PrmrrSize = get_valid_prmrr_size();
93  for (i = 0; i < ARRAY_SIZE(config->PcieRpEnable); i++) {
94  if (config->PcieRpEnable[i])
95  mask |= (1<<i);
96  }
97  m_cfg->PcieRpEnableMask = mask;
98 
99  cpu_flex_override(m_cfg);
100 
101  /* HPET BDF already handled in coreboot code, so tell FSP to ignore UPDs */
102  m_cfg->PchHpetBdfValid = 0;
103 
104  m_cfg->HyperThreading = CONFIG(FSP_HYPERTHREADING);
105 }
106 
108  const struct soc_intel_skylake_config *config)
109 {
110  m_cfg->InternalGfx = !CONFIG(SOC_INTEL_DISABLE_IGD) && is_devfn_enabled(SA_DEVFN_IGD);
111 
112  /*
113  * If iGPU is enabled, set IGD stolen size to 64MB. The FBC
114  * hardware for skylake does not have access to the bios
115  * reserved range so it always assumes 8MB is used and so the
116  * kernel will avoid the last 8MB of the stolen window. With
117  * the default stolen size of 32MB(-8MB) there is not enough
118  * space for FBC to work with a high resolution panel.
119  *
120  * If disabled, don't reserve memory for it.
121  */
122  m_cfg->IgdDvmt50PreAlloc = m_cfg->InternalGfx ? 2 : 0;
123 
124  m_cfg->PrimaryDisplay = config->PrimaryDisplay;
125 }
126 
128 {
129  const struct soc_intel_skylake_config *config;
130  FSP_M_CONFIG *m_cfg = &mupd->FspmConfig;
131  FSP_M_TEST_CONFIG *m_t_cfg = &mupd->FspmTestConfig;
132 
133  config = config_of_soc();
134 
136  soc_peg_init_params(m_cfg, m_t_cfg, config);
137 
138  /* Skip creating Management Engine MBP HOB */
139  m_t_cfg->SkipMbpHob = 0x01;
140 
141  /* Enable DMI Virtual Channel for ME */
142  m_t_cfg->DmiVcm = 0x01;
143 
144  /* Enable Sending DID to ME */
145  m_t_cfg->SendDidMsg = 0x01;
146  m_t_cfg->DidInitStat = 0x01;
147 
148  /* DCI and TraceHub configs */
149  m_t_cfg->PchDciEn = config->PchDciEn;
150 
151  m_cfg->EnableTraceHub = is_devfn_enabled(PCH_DEVFN_TRACEHUB);
152  m_cfg->TraceHubMemReg0Size = config->TraceHubMemReg0Size;
153  m_cfg->TraceHubMemReg1Size = config->TraceHubMemReg1Size;
154 
155  /* Enable SMBus controller */
156  m_cfg->SmbusEnable = is_devfn_enabled(PCH_DEVFN_SMBUS);
157 
158  /* Set primary graphic device */
160  m_t_cfg->SkipExtGfxScan = config->SkipExtGfxScan;
161 
163 }
164 
166  struct mma_config_param *mma_cfg)
167 {
168  /* Boot media is memory mapped for Skylake and Kabylake (SPI). */
169  assert(CONFIG(BOOT_DEVICE_MEMORY_MAPPED));
170 
171  memory_cfg->MmaTestContentPtr = (uintptr_t)mma_cfg->test_content;
172  memory_cfg->MmaTestContentSize = mma_cfg->test_content_size;
173  memory_cfg->MmaTestConfigPtr = (uintptr_t)mma_cfg->test_param;
174  memory_cfg->MmaTestConfigSize = mma_cfg->test_param_size;
175  memory_cfg->MrcFastBoot = 0x00;
176  memory_cfg->SaGv = 0x02;
177 }
__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
#define assert(statement)
Definition: assert.h:74
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define MSR_FLEX_RATIO
Definition: haswell.h:47
int get_valid_prmrr_size(void)
Definition: cpulib.c:397
bool is_devfn_enabled(unsigned int devfn)
Definition: device_const.c:382
@ 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
#define config_of_soc()
Definition: device.h:394
unsigned int version[2]
Definition: edid.c:55
enum board_config config
Definition: memory.c:448
static void soc_peg_init_params(FSP_M_CONFIG *m_cfg, FSP_M_TEST_CONFIG *m_t_cfg, const struct soc_intel_skylake_config *config)
Definition: fsp_params.c:25
static void cpu_flex_override(FSP_M_CONFIG *m_cfg)
Definition: fsp_params.c:13
static void soc_primary_gfx_config_params(FSP_M_CONFIG *m_cfg, const struct soc_intel_skylake_config *config)
Definition: fsp_params.c:107
void soc_update_memory_params_for_mma(FSP_M_CONFIG *memory_cfg, struct mma_config_param *mma_cfg)
Definition: fsp_params.c:165
static void soc_memory_init_params(FSP_M_CONFIG *m_cfg, const struct soc_intel_skylake_config *config)
Definition: fsp_params.c:73
#define PCH_DEVFN_TRACEHUB
Definition: pci_devs.h:222
#define PCH_DEVFN_SMBUS
Definition: pci_devs.h:219
#define SA_DEVFN_IGD
Definition: pci_devs.h:32
@ BOARD_TYPE_ULT_ULX
Definition: romstage.h:16
@ BOARD_TYPE_DESKTOP
Definition: romstage.h:15
#define SA_DEVFN_PEG1
Definition: pci_devs.h:27
#define SA_DEVFN_PEG0
Definition: pci_devs.h:26
#define SA_DEVFN_PEG2
Definition: pci_devs.h:28
static const int mask[4]
Definition: gpio.c:308
unsigned int uint32_t
Definition: stdint.h:14
unsigned long uintptr_t
Definition: stdint.h:21
void * test_content
Definition: mma.h:9
void * test_param
Definition: mma.h:11
size_t test_param_size
Definition: mma.h:12
size_t test_content_size
Definition: mma.h:10
unsigned int lo
Definition: msr.h:111