hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
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
/** @file
  UBA IIO Config Library Header File.
 
  @copyright
  Copyright 2012 - 2021 Intel Corporation. <BR>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
 
#ifndef _UBA_IIO_CONFIG_LIB_H
#define _UBA_IIO_CONFIG_LIB_H
 
#include <Base.h>
#include <Uefi.h>
 
#include <IioPlatformData.h>
 
#define PLATFORM_IIO_CONFIG_UPDATE_SIGNATURE  SIGNATURE_32 ('P', 'I', 'I', 'O')
#define PLATFORM_IIO_CONFIG_UPDATE_VERSION      01
#define PLATFORM_IIO_CONFIG_UPDATE_VERSION_2    02
#define PLATFORM_IIO_CONFIG_UPDATE_VERSION_3    03
#define PLATFORM_IIO_CONFIG_UPDATE_VERSION_UNSUPPORTED   0x20
 
// {EB35ED63-EACA-4e29-9516-7EDF1F818837}
#define   PLATFORM_IIO_CONFIG_DATA_GUID \
{ 0xeb35ed63, 0xeaca, 0x4e29, { 0x95, 0x16, 0x7e, 0xdf, 0x1f, 0x81, 0x88, 0x37 } }
 
// {3093F83B-5934-473e-8523-24BF297EE684}
#define   PLATFORM_IIO_CONFIG_DATA_GUID_1 \
{ 0x3093f83b, 0x5934, 0x473e, { 0x85, 0x23, 0x24, 0xbf, 0x29, 0x7e, 0xe6, 0x84 } }
 
// {1C5267A4-634B-4bf2-BFF8-9A1164E6D198}
#define   PLATFORM_IIO_CONFIG_DATA_GUID_2 \
{ 0x1c5267a4, 0x634b, 0x4bf2, { 0xbf, 0xf8, 0x9a, 0x11, 0x64, 0xe6, 0xd1, 0x98 } }
 
// {1E486CCA-048E-4702-B28C-0B677201683A}
#define   PLATFORM_IIO_CONFIG_DATA_GUID_3 \
{ 0x1e486cca, 0x48e, 0x4702, { 0xb2, 0x8c, 0xb, 0x67, 0x72, 0x1, 0x68, 0x3a } }
 
// {6FE6C559-4F35-4111-98E1-332A251512F3}
#define   PLATFORM_IIO_CONFIG_DATA_DXE_GUID \
{ 0x6fe6c559, 0x4f35, 0x4111, { 0x98, 0xe1, 0x33, 0x2a, 0x25, 0x15, 0x12, 0xf3 } }
 
// {0F722F2A-650F-448a-ABB7-04EECD75BB30}
#define   PLATFORM_IIO_CONFIG_DATA_DXE_GUID_1 \
{ 0xf722f2a, 0x650f, 0x448a, { 0xab, 0xb7, 0x4, 0xee, 0xcd, 0x75, 0xbb, 0x30 } }
 
// {EBD11A00-8C5C-4f71-BB9E-5394032B01F4}
#define   PLATFORM_IIO_CONFIG_DATA_DXE_GUID_2 \
{ 0xebd11a00, 0x8c5c, 0x4f71, { 0xbb, 0x9e, 0x53, 0x94, 0x3, 0x2b, 0x1, 0xf4 } }
 
// {123BD082-3201-465c-B139-0CB8C77208F8}
#define   PLATFORM_IIO_CONFIG_DATA_DXE_GUID_3 \
{ 0x123bd082, 0x3201, 0x465c, { 0xb1, 0x39, 0xc, 0xb8, 0xc7, 0x72, 0x8, 0xf8 } }
 
#define ENABLE            1
#define DISABLE           0
#define NO_SLT_IMP        0xFF
#define SLT_IMP           1
#define HIDE              1
#define NOT_HIDE          0
#define VPP_PORT_MAX      0xFF
#define VPP_ADDR_MAX      0xFF
#define PWR_VAL_MAX       0xFF
#define PWR_SCL_MAX       0xFF
#define SMB_ADDR_MAX      0xFF
#define SMB_DATA_MAX      0xFF
#define NO_BIF_INPUT      0xFF
#define NOT_EXIST         0xFF
 
typedef
EFI_STATUS
(*IIO_VAR_UPDATE_CALLBACK) (
  IN  IIO_GLOBALS             *IioGlobalData
);
 
typedef struct _PLATFORM_IIO_BIFURCATION_ENTRY {
  UINT8 Socket;
  UINT8 IouNumber;
  UINT8 Bifurcation;
} IIO_BIFURCATION_DATA_ENTRY;
 
typedef struct _PLATFORM_IIO_BIFURCATION_ENTRY_EX {
  UINT8 Socket;
  UINT8 IouNumber;
  UINT8 Bifurcation;
  UINT8 ExtnCardSMBusPort;      //SMBus Port for the PCIe extension card - use to dynamically determine PCIe bifurcation
  UINT8 ExtnCardSMBusAddress;   //SMBus address for the PCIe extension card - use to dynamically determine PCIe bifurcation
  UINT8 MuxSMBusAddress;        // SMBus address for the Mux - used to communicate to different group of devices
  UINT8 MuxSMBusChannel;        // SMBus channel for the Mux - used to select the channel that will be used to communicate to the different group of devices.
} IIO_BIFURCATION_DATA_ENTRY_EX;
 
typedef struct _PLATFORM_IIO_SLOT_ENTRY {
  UINT8   PortIndex;
  UINT16  SlotNumber;     // 0xff if slot not implemented , Slot number if slot implemented
  BOOLEAN InterLockPresent;
  UINT8   SlotPowerLimitScale;
  UINT8   SlotPowerLimitValue;
  BOOLEAN HotPlugCapable;
  UINT8   VppPort;        // 0xff if Vpp not enabled
  UINT8   VppAddress;
  BOOLEAN PcieSSDCapable;
  UINT8   PcieSSDVppPort; // 0xff if Vpp not enabled
  UINT8   PcieSSDVppAddress;
  BOOLEAN Hidden;
} IIO_SLOT_CONFIG_DATA_ENTRY;
 
typedef struct _PLATFORM_IIO_SLOT_ENTRY_EX {
  UINT8   PortIndex;          //( {1,2,3,4} = {1A,,1B,,1C,1D} ), ( {5,6,7,8} = {2A,2B,2C,2D} ), ( {9,10,11,12} = {3A,3B,3C,3D}),...
  UINT16  SlotNumber;         // 0xff if slot not implemented , Slot number if slot implemented
  BOOLEAN InterLockPresent;   // Yes / No
  UINT8   SlotPowerLimitScale;
  UINT8   SlotPowerLimitValue;
  BOOLEAN HotPlugCapable;     // Yes / No
  UINT8   VppPort;            // 0xff if Vpp not enabled
  UINT8   VppAddress;
  BOOLEAN PcieSSDCapable;     // Yes / No
  UINT8   PcieSSDVppPort;     // 0xff if Vpp not enabled
  UINT8   PcieSSDVppAddress;  // 0xff if Vpp not enabled
  BOOLEAN Hidden;             // deprecate this as it should be purely based on bifurcation
 
  BOOLEAN CommonClock;         // Yes / No - whether the both side of the link are in same clock domain or not
  BOOLEAN SRIS;                // Yes / No - in case of distinct clocking whether the separate ref. clk supports SSC or not
  BOOLEAN UplinkPortConnected; // Yes / No - indicate the PCIe RP is connected to Uplink port of another chip
  BOOLEAN RetimerConnected;    // Yes / No - BIOS would have overhead to bifurcate the retimers explicitly
  UINT8   RetimerSMBusAddress; // SMBus address to read the retimer status and bifurcate if required
  UINT8   RetimerSMBusChannel; // SMBus Mux channel to read the retimer status and bifurcate if required
  UINT8   RetimerWidth;        // Retimer width to determine adjacent Retimers for the same PCIe slot
  UINT8   MuxSMBusAddress;     // SMBus address for the Mux - used to communicate to different group of devices
  UINT8   MuxSMBusChannel;     // SMBus channel for the Mux - used to select the channel that will be used to communicate to the different group of devices.
 
  BOOLEAN ExtensionCardSupport;   // Yes / No, any PCIe Port extension card which are supported in board thro' SMBus address (typically BW5)
  UINT8   ExtnCardSMBusPort;      //SMBus Port for the PCIe extension card - use to dynamically determine PCIe bifurcation
  UINT8   ExtnCardSMBusAddress;   //SMBus address for the PCIe extension card - use to dynamically determine PCIe bifurcation
  BOOLEAN ExtnCardRetimerSupport; //yes - retimer on this PCIe extension card (BW5), or No
  UINT8   ExtnCardRetimerSMBusAddress; // SMBus address to read the retimer status and bifurcate if required
  UINT8   ExtnCardRetimerWidth;   // use to determine adjacent Retimers to the x16 PCIe slot on which this Riser is mounted
  BOOLEAN ExtnCardHotPlugCapable; // yes / No, independent of board, indicates slot in which this PCIe extn. Card is mounted
  UINT8   ExtnCardHPVppPort;      // 0xff if VPP not enabled
  UINT8   ExtnCardHPVppAddress;   // 0xff if VPP not enabled
 
  UINT8   RetimerConnectCount;    // number of Retimers (1 or 2) intercepted between the PCIe port and the slot device. Retimer may appear  mutually exclusive.
} IIO_SLOT_CONFIG_DATA_ENTRY_EX;
 
 
typedef struct _PLATFORM_IIO_CONFIG_UPDATE_TABLE {
  UINT32                            Signature;
  UINT32                            Version;
  IIO_BIFURCATION_DATA_ENTRY        *IioBifurcationTablePtr;
  UINTN                             IioBifurcationTableSize;
  IIO_VAR_UPDATE_CALLBACK           CallUpdate;
  IIO_SLOT_CONFIG_DATA_ENTRY        *IioSlotTablePtr;
  UINTN                             IioSlotTableSize;
} PLATFORM_IIO_CONFIG_UPDATE_TABLE;
 
typedef struct _PLATFORM_IIO_CONFIG_UPDATE_TABLE_EX {
  UINT32                            Signature;
  UINT32                            Version;
  IIO_BIFURCATION_DATA_ENTRY_EX     *IioBifurcationTablePtr;
  UINTN                             IioBifurcationTableSize;
  IIO_VAR_UPDATE_CALLBACK           CallUpdate;
  IIO_SLOT_CONFIG_DATA_ENTRY_EX     *IioSlotTablePtr;
  UINTN                             IioSlotTableSize;
} PLATFORM_IIO_CONFIG_UPDATE_TABLE_EX;
 
typedef  struct {
  UINT8 MuxSmbAddress;
  UINT8 MuxSmbChannel;
  UINT8 SmbAddress0;
  UINT8 SmbAddress1;
  UINT8 RegOffset;
  UINT8 RegValue;
} MUX_SMB_ADDR;
 
typedef struct _PLATFORM_IIO_CONFIG_UPDATE_TABLE_3 {
  UINT32                            Signature;
  UINT32                            Version;
  IIO_BIFURCATION_DATA_ENTRY_EX     *IioBifurcationTablePtr;
  UINTN                             IioBifurcationTableSize;
  IIO_VAR_UPDATE_CALLBACK           CallUpdate;
  IIO_SLOT_CONFIG_DATA_ENTRY_EX     *IioSlotTablePtr;
  UINTN                             IioSlotTableSize;
  MUX_SMB_ADDR                      *RetimerInitTablePtr;
} PLATFORM_IIO_CONFIG_UPDATE_TABLE_3;
 
typedef struct {
  UINT8     PortHide[8];
} PCIE_PORT_HIDE_TABLE;
 
EFI_STATUS
PlatformIioConfigInit (
  IN OUT IIO_BIFURCATION_DATA_ENTRY    **BifurcationTable,
  IN OUT UINT8                         *BifurcationEntries,
  IN OUT IIO_SLOT_CONFIG_DATA_ENTRY    **SlotTable,
  IN OUT UINT8                         *SlotEntries
);
 
EFI_STATUS
PlatformIioConfigInit2 (
  IN     UINT8                         SkuPersonalityType,
  IN OUT IIO_BIFURCATION_DATA_ENTRY    **BifurcationTable,
  IN OUT UINT8                         *BifurcationEntries,
  IN OUT IIO_SLOT_CONFIG_DATA_ENTRY    **SlotTable,
  IN OUT UINT8                         *SlotEntries
);
 
EFI_STATUS
PlatformUpdateIioConfig (
  IN  IIO_GLOBALS             *IioGlobalData
);
 
EFI_STATUS
PlatformUpdateIioConfig_EX (
  IN  IIO_GLOBALS             *IioGlobalData
);
 
STATIC  EFI_GUID gPlatformIioConfigDataGuid = PLATFORM_IIO_CONFIG_DATA_GUID;
STATIC  EFI_GUID gPlatformIioConfigDataGuid_1 = PLATFORM_IIO_CONFIG_DATA_GUID_1;
STATIC  EFI_GUID gPlatformIioConfigDataGuid_2 = PLATFORM_IIO_CONFIG_DATA_GUID_2;
STATIC  EFI_GUID gPlatformIioConfigDataGuid_3 = PLATFORM_IIO_CONFIG_DATA_GUID_3;
 
STATIC  EFI_GUID gPlatformIioConfigDataDxeGuid = PLATFORM_IIO_CONFIG_DATA_DXE_GUID;
STATIC  EFI_GUID gPlatformIioConfigDataDxeGuid_1 = PLATFORM_IIO_CONFIG_DATA_DXE_GUID_1;
STATIC  EFI_GUID gPlatformIioConfigDataDxeGuid_2 = PLATFORM_IIO_CONFIG_DATA_DXE_GUID_2;
STATIC  EFI_GUID gPlatformIioConfigDataDxeGuid_3 = PLATFORM_IIO_CONFIG_DATA_DXE_GUID_3;
 
#endif //_UBA_IIO_CONFIG_LIB_H