hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
/** @file
  This file is SampleCode of the library for Intel PCH PEI Policy initialization.
 
 
  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
 
#include "PeiPchPolicyUpdate.h"
#include <Library/BaseMemoryLib.h>
#include <Library/HdaVerbTableLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/HobLib.h>
#include <Guid/GlobalVariable.h>
#include <Library/PchGbeLib.h>
#include <Library/PchInfoLib.h>
#include <Library/PchPcrLib.h>
#include <Library/PchHsioLib.h>
#include <Library/PchSerialIoLib.h>
#include <Library/PchPcieRpLib.h>
#include <GpioConfig.h>
#include <GpioPinsSklH.h>
#include <Library/DebugLib.h>
#include <Library/PchGbeLib.h>
#include <PcieDeviceOverrideTable.h>
 
CONST UINT8 mPchSerialIoDevMode[PCH_MAX_SERIALIO_CONTROLLERS] = {
  1 /* I2C0 */,  1 /* I2C1 */,  0 /* I2C2 */, 0 /* I2C3  */, 0 /* I2C4  */, 0 /* I2C5  */,
  0 /* SPI0 */,  0 /* SPI1 */,  0 /* SPI2 */, 1 /* UART0 */, 0 /* UART1 */, 3 /* UART2 */
};
 
CONST UINT8 mPchLpSerialIoDevMode[PCH_MAX_SERIALIO_CONTROLLERS] = {
  1 /* I2C0 */,  1 /* I2C1 */,  0 /* I2C2 */, 0 /* I2C3  */, 0 /* I2C4  */, 0 /* I2C5  */,
  0 /* SPI0 */,  0 /* SPI1 */,  0 /* SPI2 */, 0 /* UART0 */, 0 /* UART1 */, 0 /* UART2 */
};
 
/**
  Performs FSP PCH PEI Policy initialization.
 
  @param[in][out]  FspsUpd             Pointer to FSP UPD Data.
 
  @retval          EFI_SUCCESS         FSP UPD Data is updated.
  @retval          EFI_NOT_FOUND       Fail to locate required PPI.
  @retval          Other               FSP UPD Data update process fail.
**/
EFI_STATUS
EFIAPI
PeiFspPchPolicyUpdate (
  IN OUT FSPS_UPD    *FspsUpd
  )
{
  UINT32                    Index;
  UINT32                    Length;
 
  FspsUpd->FspsConfig.PchPcieDeviceOverrideTablePtr = (UINT32) mPcieDeviceTable;
 
  FspsUpd->FspsConfig.PchPmSlpS3MinAssert       = 0;
  FspsUpd->FspsConfig.PchPmSlpS4MinAssert       = 0;
  FspsUpd->FspsConfig.PchPmSlpSusMinAssert      = 0;
  FspsUpd->FspsConfig.PchPmSlpAMinAssert        = 0;
  FspsUpd->FspsConfig.PchPmLpcClockRun          = 1;
  FspsUpd->FspsConfig.EnableTcoTimer            = 0;
  FspsUpd->FspsConfig.Enable8254ClockGating     = 0;
  FspsUpd->FspsConfig.Enable8254ClockGatingOnS3 = 0;
 
  FspsUpd->FspsConfig.ScsEmmcEnabled      = 1;
  FspsUpd->FspsConfig.ScsEmmcHs400Enabled = 1;
  FspsUpd->FspsConfig.ScsSdCardEnabled    = 0;
  FspsUpd->FspsConfig.ScsUfsEnabled       = 0;
 
  FspsUpd->FspsConfig.SataPwrOptEnable    = 1;
 
  FspsUpd->FspsConfig.GpioIrqRoute        = 14;
  FspsUpd->FspsConfig.SciIrqSelect        = 9;
  FspsUpd->FspsConfig.TcoIrqEnable        = 0;
  FspsUpd->FspsConfig.TcoIrqSelect        = 9;
 
  AddPlatformVerbTables (
    PchHdaCodecPlatformOnboard,
    &(FspsUpd->FspsConfig.PchHdaVerbTableEntryNum),
    &(FspsUpd->FspsConfig.PchHdaVerbTablePtr)
    );
 
DEBUG_CODE_BEGIN();
  if (
    (FixedPcdGet8 (PcdSerialIoUartDebugEnable) == 1) &&
    FspsUpd->FspsConfig.SerialIoDevMode[PchSerialIoIndexUart0 + PcdGet8 (PcdSerialIoUartNumber)] == PchSerialIoDisabled
    ) {
    FspsUpd->FspsConfig.SerialIoDevMode[PchSerialIoIndexUart0 + PcdGet8 (PcdSerialIoUartNumber)] = PchSerialIoHidden;
  }
  FspsUpd->FspsConfig.SerialIoDebugUartNumber = PcdGet8 (PcdSerialIoUartNumber);
  FspsUpd->FspsConfig.SerialIoEnableDebugUartAfterPost = TRUE;
  FspsUpd->FspsConfig.SerialIoUartHwFlowCtrl[PcdGet8 (PcdSerialIoUartNumber)] = 0;
DEBUG_CODE_END();
 
  //
  // SerialIo config
  //
  if (IsPchLp()) {
    CopyMem (&FspsUpd->FspsConfig.SerialIoDevMode, mPchLpSerialIoDevMode, PCH_MAX_SERIALIO_CONTROLLERS);
  } else {
    CopyMem (&FspsUpd->FspsConfig.SerialIoDevMode, mPchSerialIoDevMode, PCH_MAX_SERIALIO_CONTROLLERS);
  }
 
  // Set debug UART in PCI mode
  FspsUpd->FspsConfig.SerialIoDevMode[PCH_MAX_SERIALIO_I2C_CONTROLLERS + PCH_MAX_SERIALIO_SPI_CONTROLLERS + 2] = 1;
 
  FspsUpd->FspsConfig.SerialIoSpiCsPolarity[0]              = 1;
  FspsUpd->FspsConfig.SerialIoSpiCsPolarity[1]              = 0;
  FspsUpd->FspsConfig.SerialIoSpiCsPolarity[2]              = 0;
  FspsUpd->FspsConfig.SerialIoUartHwFlowCtrl[0]             = 1;
  FspsUpd->FspsConfig.SerialIoUartHwFlowCtrl[1]             = 1;
  FspsUpd->FspsConfig.SerialIoUartHwFlowCtrl[2]             = 1;
  FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[0]      = 1;
  FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[1]      = 1;
  FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[2]      = 1;
  FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[3]      = 1;
  FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[4]      = 1;
  FspsUpd->FspsConfig.PchSerialIoI2cPadsTermination[5]      = 1;
 
  //
  // USB config
  //
  FspsUpd->FspsConfig.XdciEnable                            = FALSE;
  FspsUpd->FspsConfig.PchEnableComplianceMode               = FALSE;
  FspsUpd->FspsConfig.UsbPdoProgramming                     = TRUE;
  FspsUpd->FspsConfig.PchUsbOverCurrentEnable               = TRUE;
  FspsUpd->FspsConfig.PchUsb2PhySusPgEnable                 = TRUE;
  FspsUpd->FspsTestConfig.PchXhciOcLock                     = TRUE;
 
  Length = GetPchXhciMaxUsb2PortNum ();
  for (Index = 0; Index < Length; Index++) {
    FspsUpd->FspsConfig.PortUsb20Enable[Index]              = TRUE;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[Index]           = UsbOverCurrentPinMax;
    FspsUpd->FspsConfig.Usb2AfePetxiset[Index]              = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[Index]                = 5;
    FspsUpd->FspsConfig.Usb2AfePredeemp[Index]              = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[Index]             = 0;
  }
 
  Length = GetPchXhciMaxUsb3PortNum ();
  for (Index = 0; Index < Length; Index++) {
    FspsUpd->FspsConfig.PortUsb30Enable[Index]              = TRUE;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[Index]           = UsbOverCurrentPinMax;
    FspsUpd->FspsConfig.Usb3HsioTxDeEmphEnable[Index]       = 0;
    FspsUpd->FspsConfig.Usb3HsioTxDeEmph[Index]             = 0;
    FspsUpd->FspsConfig.Usb3HsioTxDownscaleAmpEnable[Index] = 0;
    FspsUpd->FspsConfig.Usb3HsioTxDownscaleAmp[Index]       = 0;
    FspsUpd->FspsConfig.PchUsbHsioRxTuningEnable[Index]     = 0;
    FspsUpd->FspsConfig.PchUsbHsioRxTuningParameters[Index] = 3;
    FspsUpd->FspsConfig.PchUsbHsioFilterSel[Index]          = 0;
  }
 
  if (IsPchLp()) {
    FspsUpd->FspsConfig.Usb2OverCurrentPin[0]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[1]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[2]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[3]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[4]               = UsbOverCurrentPin3;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[5]               = UsbOverCurrentPin3;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[6]               = UsbOverCurrentPin3;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[7]               = UsbOverCurrentPin3;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[8]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[9]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[10]              = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[11]              = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[12]              = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[13]              = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[14]              = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[15]              = UsbOverCurrentPinSkip;
 
    FspsUpd->FspsConfig.Usb3OverCurrentPin[0]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[1]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[2]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[3]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[4]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[5]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[6]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[7]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[8]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[9]               = UsbOverCurrentPinSkip;
 
    Length = GetPchUsb2MaxPhysicalPortNum ();
    for (Index = 0; Index < Length; Index++) {
      FspsUpd->FspsConfig.Usb2AfePetxiset[Index]              = 6;
      FspsUpd->FspsConfig.Usb2AfeTxiset[Index]                = 0;
      FspsUpd->FspsConfig.Usb2AfePredeemp[Index]              = 3;
      FspsUpd->FspsConfig.Usb2AfePehalfbit[Index]             = 0;
    }
  } else {
    FspsUpd->FspsConfig.Usb2OverCurrentPin[0]               = UsbOverCurrentPin4;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[1]               = UsbOverCurrentPin0;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[2]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[3]               = UsbOverCurrentPin5;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[4]               = UsbOverCurrentPin5;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[5]               = UsbOverCurrentPin0;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[6]               = UsbOverCurrentPin1;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[7]               = UsbOverCurrentPin1;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[8]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[9]               = UsbOverCurrentPin3;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[10]              = UsbOverCurrentPin3;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[11]              = UsbOverCurrentPin6;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[12]              = UsbOverCurrentPin6;
    FspsUpd->FspsConfig.Usb2OverCurrentPin[13]              = UsbOverCurrentPin0;
 
    FspsUpd->FspsConfig.Usb3OverCurrentPin[0]               = UsbOverCurrentPin4;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[1]               = UsbOverCurrentPin0;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[2]               = UsbOverCurrentPin2;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[3]               = UsbOverCurrentPin5;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[4]               = UsbOverCurrentPin5;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[5]               = UsbOverCurrentPin0;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[6]               = UsbOverCurrentPin1;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[7]               = UsbOverCurrentPin1;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[8]               = UsbOverCurrentPinSkip;
    FspsUpd->FspsConfig.Usb3OverCurrentPin[9]               = UsbOverCurrentPin3;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[0]                  = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[0]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[0]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[0]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[1]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[1]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[1]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[1]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[2]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[2]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[2]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[2]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[3]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[3]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[3]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[3]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[4]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[4]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[4]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[4]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[5]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[5]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[5]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[5]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[6]                  = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[6]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[6]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[6]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[7]                  = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[7]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[7]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[7]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[8]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[8]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[8]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[8]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[9]                  = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[9]                    = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[9]                  = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[9]                 = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[10]                 = 6;
    FspsUpd->FspsConfig.Usb2AfeTxiset[10]                   = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[10]                 = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[10]                = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[11]                 = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[11]                   = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[11]                 = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[11]                = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[12]                 = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[12]                   = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[12]                 = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[12]                = 0;
 
    FspsUpd->FspsConfig.Usb2AfePetxiset[13]                 = 7;
    FspsUpd->FspsConfig.Usb2AfeTxiset[13]                   = 0;
    FspsUpd->FspsConfig.Usb2AfePredeemp[13]                 = 3;
    FspsUpd->FspsConfig.Usb2AfePehalfbit[13]                = 0;
  }
 
  FspsUpd->FspsConfig.PcieSwEqCoeffListCm[0]                = 4;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCp[0]                = 8;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCm[1]                = 6;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCp[1]                = 2;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCm[2]                = 8;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCp[2]                = 6;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCm[3]                = 10;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCp[3]                = 8;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCm[4]                = 12;
  FspsUpd->FspsConfig.PcieSwEqCoeffListCp[4]                = 2;
 
  return EFI_SUCCESS;
}