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
|
/** @file
Header file for PCH PCI Express helpers library
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _PCH_PCI_EXPRESS_HELPERS_LIB_H_
#define _PCH_PCI_EXPRESS_HELPERS_LIB_H_
#include <PchPolicyCommon.h>
typedef enum {
TpoScale2us,
TpoScale10us,
TpoScale100us,
TpoScaleMax
} T_PO_SCALE;
typedef struct {
UINT32 Value;
T_PO_SCALE Scale;
} T_POWER_ON;
//
// Function prototypes
//
T_POWER_ON GetTpoCapability (
UINTN DeviceBase,
UINT32 L1ssCapOffset
);
T_POWER_ON GetTpo (
UINTN DeviceBase,
UINT32 L1ssCapOffset
);
/*
Sets Tpower_on in a device
According to spec, Tpower_on can only be updated while L1_2 is disabled
@param[in] DeviceBase device base address
@param[in] L1ssCapOffset offset to L1substates capability in device's extended config space
@param[in] Tpo value to be programmed into Tpower_on
*/
VOID SetTpo (
UINTN DeviceBase,
UINT32 L1ssCapOffset,
T_POWER_ON Tpo
);
/*
Converts Tpower_on from value:scale notation to microseconds
*/
UINT32 TpoToUs (
T_POWER_ON Tpo
);
/**
Find the Offset to a given Capabilities ID
CAPID list:
0x01 = PCI Power Management Interface
0x04 = Slot Identification
0x05 = MSI Capability
0x10 = PCI Express Capability
@param[in] Bus Pci Bus Number
@param[in] Device Pci Device Number
@param[in] Function Pci Function Number
@param[in] CapId CAPID to search for
@retval 0 CAPID not found
@retval Other CAPID found, Offset of desired CAPID
**/
UINT8
PcieFindCapId (
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
IN UINT8 CapId
);
/**
Search and return the offset of desired Pci Express Capability ID
CAPID list:
0x0001 = Advanced Error Rreporting Capability
0x0002 = Virtual Channel Capability
0x0003 = Device Serial Number Capability
0x0004 = Power Budgeting Capability
@param[in] Bus Pci Bus Number
@param[in] Device Pci Device Number
@param[in] Function Pci Function Number
@param[in] CapId Extended CAPID to search for
@retval 0 CAPID not found
@retval Other CAPID found, Offset of desired CAPID
**/
UINT16
PcieFindExtendedCapId (
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
IN UINT16 CapId
);
/**
This returns ClkReq Number from Port Number
@param[in] PortIndex PCIe Port Number (Zero Base. Please use 23 for GBe)
@retval ClkReq Number
**/
UINT8
GetPortClkReqNumber (
IN UINT8 PortIndex
);
/**
Set Common clock to Root port and Endpoint PCI device
@param[in] Bus1 Root port Pci Bus Number
@param[in] Device1 Root port Pci Device Number
@param[in] Function1 Root port Pci Function Number
@param[in] Bus2 Endpoint Pci Bus Number
@param[in] Device2 Endpoint Pci Device Number
@exception EFI_UNSUPPORTED Unsupported operation.
@retval EFI_SUCCESS VC mapping correctly initialized
**/
EFI_STATUS
PcieSetCommonClock (
IN UINT8 Bus1,
IN UINT8 Device1,
IN UINT8 Function1,
IN UINT8 Bus2,
IN UINT8 Device2
);
/**
This function enables the CLKREQ# PM on all the end point functions
@param[in] Bus Pci Bus Number
@param[in] Device Pci Device Number
@param[in] RootDevice Rootport Device Number
@param[in] RootFunction Rootport Function Number
@retval None
**/
VOID
PcieSetClkreq (
IN UINT8 EndPointBus,
IN UINT8 EndPointDevice,
IN UINT8 RootDevice,
IN UINT8 RootFunction
);
/**
This function get or set the Max Payload Size on all the end point functions
@param[in] EndPointBus The Bus Number of the Endpoint
@param[in] EndPointDevice The Device Number of the Endpoint
@param[in] MaxPayload The Max Payolad Size of the root port
@param[in] Operation True: Set the Max Payload Size on all the end point functions
False: Get the Max Payload Size on all the end point functions
@retval EFI_SUCCESS Successfully completed.
**/
EFI_STATUS
PcieMaxPayloadSize (
IN UINT8 EndPointBus,
IN UINT8 EndPointDevice,
IN OUT UINT16 *MaxPayload,
IN BOOLEAN Operation
);
/**
This function disable the forwarding of EOI messages unless it discovers
an IOAPIC behind this root port.
@param[in] RootBus The Bus Number of the root port
@param[in] RootDevice The Device Number of the root port
@param[in] RootFunction The Function Number of the root port
@param[in] EndPointBus The Bus Number of the Endpoint
@param[in] EndPointDevice The Device Number of the Endpoint
@exception EFI_UNSUPPORTED Unsupported operation.
@retval EFI_SUCCESS Successfully completed.
**/
EFI_STATUS
PcieSetEoiFwdDisable (
IN UINT8 RootBus,
IN UINT8 RootDevice,
IN UINT8 RootFunction,
IN UINT8 EndPointBus,
IN UINT8 EndPointDevice
);
/**
Initializes the root port and its down stream devices
@param[in] RootPortBus Pci Bus Number of the root port
@param[in] RootPortDevice Pci Device Number of the root port
@param[in] RootPortFunc Pci Function Number of the root port
@param[in] TempBusNumberMin Minimal temp bus number that can be assigned to the root port (as secondary
bus number) and its down stream switches
@param[in] TempBusNumberMax Maximal temp bus number that can be assigned to the root port (as subordinate
bus number) and its down stream switches
@param[in] EnableCpm Enables Clock Power Management; even if disabled, CLKREQ# can still be used by L1 PM substates mechanism
@retval EFI_SUCCESS Successfully completed
@retval EFI_NOT_FOUND Can not find device.
**/
EFI_STATUS
PchPcieInitRootPortDownstreamDevices (
IN UINT8 RootPortBus,
IN UINT8 RootPortDevice,
IN UINT8 RootPortFunc,
IN UINT8 TempBusNumberMin,
IN UINT8 TempBusNumberMax,
IN BOOLEAN EnableCpm
);
/**
Get current PCIe link speed.
@param[in] RpBase Root Port base address
@return Link speed
**/
UINT32
GetLinkSpeed (
UINTN RpBase
);
/**
Get max PCIe link speed supported by the root port.
@param[in] RpBase Root Port base address
@return Max link speed
**/
UINT32
GetMaxLinkSpeed (
UINTN RpBase
);
/**
Get Pch Maximum Pcie Controller Number
@retval Pch Maximum Pcie Controller Number
**/
UINT8
EFIAPI
GetPchMaxPcieControllerNum (
VOID
);
/**
PCIe controller configuration.
**/
typedef enum {
Pcie4x1 = 0,
Pcie1x2_2x1 = 1,
Pcie2x2 = 2,
Pcie1x4 = 3
} PCIE_CONTROLLER_CONFIG;
/**
Returns the PCIe controller configuration (4x1, 1x2-2x1, 2x2, 1x4)
@param[in] ControllerIndex Number of PCIe controller (0 based)
@retval PCIe controller configuration
**/
PCIE_CONTROLLER_CONFIG
GetPcieControllerConfig (
IN UINT32 ControllerIndex
);
#endif // _PEI_DXE_SMM_PCH_PCI_EXPRESS_HELPERS_LIB_H_
|