]> git.proxmox.com Git - mirror_edk2.git/blob - OptionRomPkg/UndiRuntimeDxe/Undi32.h
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / OptionRomPkg / UndiRuntimeDxe / Undi32.h
1 /** @file
2 EFI internal structures for the EFI UNDI driver.
3
4 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #ifndef _UNDI_32_H_
10 #define _UNDI_32_H_
11
12 #include <Uefi.h>
13
14 #include <Guid/EventGroup.h>
15 #include <Protocol/PciIo.h>
16 #include <Protocol/NetworkInterfaceIdentifier.h>
17 #include <Protocol/DevicePath.h>
18 #include <Protocol/AdapterInformation.h>
19
20 #include <Library/UefiDriverEntryPoint.h>
21 #include <Library/UefiRuntimeLib.h>
22 #include <Library/DebugLib.h>
23 #include <Library/BaseMemoryLib.h>
24 #include <Library/UefiBootServicesTableLib.h>
25 #include <Library/UefiLib.h>
26 #include <Library/BaseLib.h>
27 #include <Library/DevicePathLib.h>
28 #include <Library/MemoryAllocationLib.h>
29
30 #include <IndustryStandard/Pci.h>
31
32
33 #include "E100b.h"
34
35 extern EFI_DRIVER_BINDING_PROTOCOL gUndiDriverBinding;
36 extern EFI_COMPONENT_NAME_PROTOCOL gUndiComponentName;
37 extern EFI_COMPONENT_NAME2_PROTOCOL gUndiComponentName2;
38
39 #define MAX_NIC_INTERFACES 16
40
41 #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION_31 0x00010001
42 #define PXE_ROMID_MINORVER_31 0x10
43 #define PXE_STATFLAGS_DB_WRITE_TRUNCATED 0x2000
44
45 //
46 // UNDI_CALL_TABLE.state can have the following values
47 //
48 #define DONT_CHECK -1
49 #define ANY_STATE -1
50 #define MUST_BE_STARTED 1
51 #define MUST_BE_INITIALIZED 2
52
53 #define UNDI_DEV_SIGNATURE SIGNATURE_32('u','n','d','i')
54 #define UNDI_DEV_FROM_THIS(a) CR(a, UNDI32_DEV, NIIProtocol_31, UNDI_DEV_SIGNATURE)
55 #define UNDI_DEV_FROM_NIC(a) CR(a, UNDI32_DEV, NicInfo, UNDI_DEV_SIGNATURE)
56 #define UNDI_DEV_FROM_AIP(a) CR(a, UNDI32_DEV, Aip, UNDI_DEV_SIGNATURE)
57
58 typedef struct {
59 UINTN Signature;
60 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL NIIProtocol_31;
61 EFI_ADAPTER_INFORMATION_PROTOCOL Aip;
62 EFI_HANDLE DeviceHandle;
63 EFI_DEVICE_PATH_PROTOCOL *Undi32BaseDevPath;
64 EFI_DEVICE_PATH_PROTOCOL *Undi32DevPath;
65 NIC_DATA_INSTANCE NicInfo;
66 } UNDI32_DEV;
67
68 typedef struct {
69 UINT16 cpbsize;
70 UINT16 dbsize;
71 UINT16 opflags;
72 UINT16 state;
73 VOID (*api_ptr)();
74 } UNDI_CALL_TABLE;
75
76 typedef VOID (*ptr)(VOID);
77 typedef VOID (*bsptr_30)(UINTN);
78 typedef VOID (*virtphys_30)(UINT64, UINT64);
79 typedef VOID (*block_30)(UINT32);
80 typedef VOID (*mem_io_30)(UINT8, UINT8, UINT64, UINT64);
81
82 typedef VOID (*bsptr)(UINT64, UINTN);
83 typedef VOID (*virtphys)(UINT64, UINT64, UINT64);
84 typedef VOID (*block)(UINT64, UINT32);
85 typedef VOID (*mem_io)(UINT64, UINT8, UINT8, UINT64, UINT64);
86
87 typedef VOID (*map_mem)(UINT64, UINT64, UINT32, UINT32, UINT64);
88 typedef VOID (*unmap_mem)(UINT64, UINT64, UINT32, UINT32, UINT64);
89 typedef VOID (*sync_mem)(UINT64, UINT64, UINT32, UINT32, UINT64);
90
91 extern UNDI_CALL_TABLE api_table[];
92 extern PXE_SW_UNDI *pxe_31; // !pxe structure for 3.1 drivers
93 extern UNDI32_DEV *UNDI32DeviceList[MAX_NIC_INTERFACES];
94
95 //
96 // functions defined in e100b.c
97 //
98 UINT8 InByte (NIC_DATA_INSTANCE *AdapterInfo, UINT32 Port);
99 UINT16 InWord (NIC_DATA_INSTANCE *AdapterInfo, UINT32 Port);
100 UINT32 InLong (NIC_DATA_INSTANCE *AdapterInfo, UINT32 Port);
101 VOID OutByte (NIC_DATA_INSTANCE *AdapterInfo, UINT8 Data, UINT32 Port);
102 VOID OutWord (NIC_DATA_INSTANCE *AdapterInfo, UINT16 Data, UINT32 Port);
103 VOID OutLong (NIC_DATA_INSTANCE *AdapterInfo, UINT32 Data, UINT32 Port);
104
105 UINTN E100bInit (NIC_DATA_INSTANCE *AdapterInfo);
106 UINTN E100bReset (NIC_DATA_INSTANCE *AdapterInfo, INT32 OpFlags);
107 UINTN E100bShutdown (NIC_DATA_INSTANCE *AdapterInfo);
108 UINTN E100bTransmit (NIC_DATA_INSTANCE *AdapterInfo, UINT64 cpb, UINT16 opflags);
109 UINTN E100bReceive (NIC_DATA_INSTANCE *AdapterInfo, UINT64 cpb, UINT64 db);
110 UINTN E100bSetfilter (NIC_DATA_INSTANCE *AdapterInfo, UINT16 New_filter,
111 UINT64 cpb, UINT32 cpbsize);
112 UINTN E100bStatistics(NIC_DATA_INSTANCE *AdapterInfo, UINT64 db, UINT16 dbsize);
113 UINT8 E100bSetupIAAddr (NIC_DATA_INSTANCE *AdapterInfo);
114 UINT8 E100bSetInterruptState (NIC_DATA_INSTANCE *AdapterInfo);
115
116 UINT8 E100bGetEepromAddrLen (NIC_DATA_INSTANCE *AdapterInfo);
117 UINT16 E100bReadEeprom (NIC_DATA_INSTANCE *AdapterInfo, INT32 Location, UINT8 address_len);
118 INT16 E100bReadEepromAndStationAddress (NIC_DATA_INSTANCE *AdapterInfo);
119
120 UINT16 next(UINT16);
121 UINT8 SetupCBlink (NIC_DATA_INSTANCE *AdapterInfo);
122 VOID SetFreeCB (NIC_DATA_INSTANCE *AdapterInfo,TxCB *);
123 TxCB *GetFreeCB (NIC_DATA_INSTANCE *AdapterInfo);
124 UINT16 CheckCBList (NIC_DATA_INSTANCE *AdapterInfo);
125
126 UINT8 SelectiveReset (NIC_DATA_INSTANCE *AdapterInfo);
127 UINT16 InitializeChip (NIC_DATA_INSTANCE *AdapterInfo);
128 UINT8 SetupReceiveQueues (NIC_DATA_INSTANCE *AdapterInfo);
129 VOID Recycle_RFD (NIC_DATA_INSTANCE *AdapterInfo, UINT16);
130 VOID XmitWaitForCompletion (NIC_DATA_INSTANCE *AdapterInfo);
131 INT8 CommandWaitForCompletion (TxCB *cmd_ptr, NIC_DATA_INSTANCE *AdapterInfo);
132
133 BOOLEAN PhyDetect (NIC_DATA_INSTANCE *AdapterInfo);
134 VOID PhyReset (NIC_DATA_INSTANCE *AdapterInfo);
135 VOID
136 MdiWrite (
137 IN NIC_DATA_INSTANCE *AdapterInfo,
138 IN UINT8 RegAddress,
139 IN UINT8 PhyAddress,
140 IN UINT16 DataValue
141 );
142
143 VOID
144 MdiRead(
145 IN NIC_DATA_INSTANCE *AdapterInfo,
146 IN UINT8 RegAddress,
147 IN UINT8 PhyAddress,
148 IN OUT UINT16 *DataValue
149 );
150
151 BOOLEAN SetupPhy (NIC_DATA_INSTANCE *AdapterInfo);
152 VOID FindPhySpeedAndDpx (NIC_DATA_INSTANCE *AdapterInfo, UINT32 PhyId);
153
154
155
156 //
157 // functions defined in init.c
158 //
159 EFI_STATUS
160 InstallConfigTable (
161 IN VOID
162 );
163
164 EFI_STATUS
165 EFIAPI
166 InitializeUNDIDriver (
167 IN EFI_HANDLE ImageHandle,
168 IN EFI_SYSTEM_TABLE *SystemTable
169 );
170
171 VOID
172 UNDI_notify_virtual (
173 EFI_EVENT event,
174 VOID *context
175 );
176
177 EFI_STATUS
178 EFIAPI
179 UndiDriverSupported (
180 IN EFI_DRIVER_BINDING_PROTOCOL *This,
181 IN EFI_HANDLE Controller,
182 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
183 );
184
185 EFI_STATUS
186 EFIAPI
187 UndiDriverStart (
188 IN EFI_DRIVER_BINDING_PROTOCOL *This,
189 IN EFI_HANDLE Controller,
190 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
191 );
192
193 EFI_STATUS
194 EFIAPI
195 UndiDriverStop (
196 IN EFI_DRIVER_BINDING_PROTOCOL *This,
197 IN EFI_HANDLE Controller,
198 IN UINTN NumberOfChildren,
199 IN EFI_HANDLE *ChildHandleBuffer
200 );
201
202 EFI_STATUS
203 AppendMac2DevPath (
204 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevPtr,
205 IN EFI_DEVICE_PATH_PROTOCOL *BaseDevPtr,
206 IN NIC_DATA_INSTANCE *AdapterInfo
207 );
208
209 VOID
210 TmpDelay (
211 IN UINT64 UnqId,
212 IN UINTN MicroSeconds
213 );
214
215 VOID
216 TmpMemIo (
217 IN UINT64 UnqId,
218 IN UINT8 ReadWrite,
219 IN UINT8 Len,
220 IN UINT64 Port,
221 IN UINT64 BufAddr
222 );
223
224 //
225 // functions defined in decode.c
226 //
227 VOID
228 UNDI_GetState (
229 IN PXE_CDB *CdbPtr,
230 IN NIC_DATA_INSTANCE *AdapterInfo
231 );
232
233 VOID
234 UNDI_Start (
235 IN PXE_CDB *CdbPtr,
236 IN NIC_DATA_INSTANCE *AdapterInfo
237 );
238
239 VOID
240 UNDI_Stop (
241 IN PXE_CDB *CdbPtr,
242 IN NIC_DATA_INSTANCE *AdapterInfo
243 );
244
245 VOID
246 UNDI_GetInitInfo (
247 IN PXE_CDB *CdbPtr,
248 IN NIC_DATA_INSTANCE *AdapterInfo
249 );
250
251 VOID
252 UNDI_GetConfigInfo (
253 IN PXE_CDB *CdbPtr,
254 IN NIC_DATA_INSTANCE *AdapterInfo
255 );
256
257 VOID
258 UNDI_Initialize (
259 IN PXE_CDB *CdbPtr,
260 NIC_DATA_INSTANCE *AdapterInfo
261 );
262
263 VOID
264 UNDI_Reset (
265 IN PXE_CDB *CdbPtr,
266 IN NIC_DATA_INSTANCE *AdapterInfo
267 );
268
269 VOID
270 UNDI_Shutdown (
271 IN PXE_CDB *CdbPtr,
272 IN NIC_DATA_INSTANCE *AdapterInfo
273 );
274
275 VOID
276 UNDI_Interrupt (
277 IN PXE_CDB *CdbPtr,
278 IN NIC_DATA_INSTANCE *AdapterInfo
279 );
280
281 VOID
282 UNDI_RecFilter (
283 IN PXE_CDB *CdbPtr,
284 IN NIC_DATA_INSTANCE *AdapterInfo
285 );
286
287 VOID
288 UNDI_StnAddr (
289 IN PXE_CDB *CdbPtr,
290 IN NIC_DATA_INSTANCE *AdapterInfo
291 );
292
293 VOID
294 UNDI_Statistics (
295 IN PXE_CDB *CdbPtr,
296 IN NIC_DATA_INSTANCE *AdapterInfo
297 );
298
299 VOID
300 UNDI_ip2mac (
301 IN PXE_CDB *CdbPtr,
302 IN NIC_DATA_INSTANCE *AdapterInfo
303 );
304
305 VOID
306 UNDI_NVData (
307 IN PXE_CDB *CdbPtr,
308 IN NIC_DATA_INSTANCE *AdapterInfo
309 );
310
311 VOID
312 UNDI_Status (
313 IN PXE_CDB *CdbPtr,
314 IN NIC_DATA_INSTANCE *AdapterInfo
315 );
316
317 VOID
318 UNDI_FillHeader (
319 IN PXE_CDB *CdbPtr,
320 IN NIC_DATA_INSTANCE *AdapterInfo
321 );
322
323 VOID
324 UNDI_Transmit (
325 IN PXE_CDB *CdbPtr,
326 IN NIC_DATA_INSTANCE *AdapterInfo
327 );
328
329 VOID
330 UNDI_Receive (
331 IN PXE_CDB *CdbPtr,
332 IN NIC_DATA_INSTANCE *AdapterInfo
333 );
334
335 VOID EFIAPI UNDI_APIEntry_new(UINT64);
336 VOID UNDI_APIEntry_Common(UINT64);
337
338 PXE_IPV4 convert_mcip(PXE_MAC_ADDR *);
339 INT32 validate_mcip (PXE_MAC_ADDR *MCastAddr);
340
341 VOID PxeStructInit (PXE_SW_UNDI *PxePtr);
342 VOID PxeUpdate (NIC_DATA_INSTANCE *NicPtr, PXE_SW_UNDI *PxePtr);
343
344 //
345 // functions defined in UndiAipImpl.c
346 //
347
348 /**
349 Returns the current state information for the adapter.
350
351 This function returns information of type InformationType from the adapter.
352 If an adapter does not support the requested informational type, then
353 EFI_UNSUPPORTED is returned.
354
355 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
356 @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock.
357 @param[out] InforamtionBlock The service returns a pointer to the buffer with the InformationBlock
358 structure which contains details about the data specific to InformationType.
359 @param[out] InforamtionBlockSize The driver returns the size of the InformationBlock in bytes.
360
361 @retval EFI_SUCCESS The InformationType information was retrieved.
362 @retval EFI_UNSUPPORTED The InformationType is not known.
363 @retval EFI_DEVICE_ERROR The device reported an error.
364 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
365 @retval EFI_INVALID_PARAMETER This is NULL.
366 @retval EFI_INVALID_PARAMETER InformationBlock is NULL.
367 @retval EFI_INVALID_PARAMETER InformationBlockSize is NULL.
368
369 **/
370 EFI_STATUS
371 EFIAPI
372 UndiAipGetInfo (
373 IN EFI_ADAPTER_INFORMATION_PROTOCOL *This,
374 IN EFI_GUID *InformationType,
375 OUT VOID **InformationBlock,
376 OUT UINTN *InformationBlockSize
377 );
378
379 /**
380 Sets state information for an adapter.
381
382 This function sends information of type InformationType for an adapter.
383 If an adapter does not support the requested information type, then EFI_UNSUPPORTED
384 is returned.
385
386 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
387 @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock.
388 @param[in] InforamtionBlock A pointer to the InformationBlock structure which contains details
389 about the data specific to InformationType.
390 @param[in] InforamtionBlockSize The size of the InformationBlock in bytes.
391
392 @retval EFI_SUCCESS The information was received and interpreted successfully.
393 @retval EFI_UNSUPPORTED The InformationType is not known.
394 @retval EFI_DEVICE_ERROR The device reported an error.
395 @retval EFI_INVALID_PARAMETER This is NULL.
396 @retval EFI_INVALID_PARAMETER InformationBlock is NULL.
397 @retval EFI_WRITE_PROTECTED The InformationType cannot be modified using EFI_ADAPTER_INFO_SET_INFO().
398
399 **/
400 EFI_STATUS
401 EFIAPI
402 UndiAipSetInfo (
403 IN EFI_ADAPTER_INFORMATION_PROTOCOL *This,
404 IN EFI_GUID *InformationType,
405 IN VOID *InformationBlock,
406 IN UINTN InformationBlockSize
407 );
408
409 /**
410 Get a list of supported information types for this instance of the protocol.
411
412 This function returns a list of InformationType GUIDs that are supported on an
413 adapter with this instance of EFI_ADAPTER_INFORMATION_PROTOCOL. The list is returned
414 in InfoTypesBuffer, and the number of GUID pointers in InfoTypesBuffer is returned in
415 InfoTypesBufferCount.
416
417 @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance.
418 @param[out] InfoTypesBuffer A pointer to the list of InformationType GUID pointers that are supported
419 by This.
420 @param[out] InfoTypesBufferCount A pointer to the number of GUID pointers present in InfoTypesBuffer.
421
422 @retval EFI_SUCCESS The list of information type GUIDs that are supported on this adapter was
423 returned in InfoTypesBuffer. The number of information type GUIDs was
424 returned in InfoTypesBufferCount.
425 @retval EFI_INVALID_PARAMETER This is NULL.
426 @retval EFI_INVALID_PARAMETER InfoTypesBuffer is NULL.
427 @retval EFI_INVALID_PARAMETER InfoTypesBufferCount is NULL.
428 @retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the results.
429
430 **/
431 EFI_STATUS
432 EFIAPI
433 UndiAipGetSupportedTypes (
434 IN EFI_ADAPTER_INFORMATION_PROTOCOL *This,
435 OUT EFI_GUID **InfoTypesBuffer,
436 OUT UINTN *InfoTypesBufferCount
437 );
438
439 #endif