summaryrefslogtreecommitdiff
path: root/Core/EM/CSM/thunk/BlockIo/CsmEdd.h
blob: 4743f81aff4ff6712a62d492678060dab7304e1b (plain)
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
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2010, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**           5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093      **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************

//**********************************************************************
// $Header: /Alaska/SOURCE/Modules/CSM/Generic/Thunk/INT13/CsmEdd.h 8     9/09/15 11:46a Olegi $
//
// $Revision: 8 $
//
// $Date: 9/09/15 11:46a $
//**********************************************************************
// Revision History
// ----------------
// $Log: /Alaska/SOURCE/Modules/CSM/Generic/Thunk/INT13/CsmEdd.h $
// 
// 8     9/09/15 11:46a Olegi
// [TAG]  		EIP237391
// [Description]  	Aptio4 CSM: CsmBlockIo drive handle is lost
// 
// 7     1/12/10 11:50a Olegi
// Copyright message updated.
// 
// 6     4/27/07 5:14p Olegi
// CSM.CHM file preparation.
//
// 5     3/13/06 2:38p Felixp
//
// 4     10/13/05 6:21p Olegi
//
// 3     4/20/05 4:54p Andriyn
// USB_DEVICE_PATH is in core now
//
// 2     3/04/05 1:45p Mandal
//
// 1     2/15/05 11:00a Olegi
// Initial VSS check-in.
//
//
//**********************************************************************
//**********************************************************************
//<AMI_FHDR_START>
//
// Name:            CsmEdd.h
//
// Description:     EDD support definitions file
//
//<AMI_FHDR_END>
//**********************************************************************

#ifndef _CSM_EDD_H_
#define _CSM_EDD_H_

#pragma pack(1)

typedef struct {
    UINT8   Bus;
    UINT8   Device;
    UINT8   Function;
    UINT8   Controller;
    UINT32  Reserved;
} EDD_PCI;

typedef struct {
    UINT16  Base;
    UINT16  Reserved;
    UINT32  Reserved2;
} EDD_LEGACY;

typedef union {
    EDD_PCI     Pci;
    EDD_LEGACY  Legacy;
} EDD_INTERFACE_PATH;

typedef struct {
    UINT8   Master;
    UINT8   Reserved[15];
} EDD_ATA;

typedef struct {
    UINT8   Master;
    UINT8   Lun;
    UINT8   Reserved[14];
} EDD_ATAPI;

typedef struct {
    UINT16  TargetId;
    UINT64  Lun;
    UINT8   Reserved[6];
} EDD_SCSI;

typedef struct {
    UINT64   SerialNumber;
    UINT64   Reserved;
} EDD_USB;

typedef struct {
    UINT64  Guid;
    UINT64  Reserved;
} EDD_1394;

typedef struct {
    UINT64  Wwn;
    UINT64  Lun;
} EDD_FIBRE;

typedef union {
    EDD_ATA     Ata;
    EDD_ATAPI   Atapi;
    EDD_SCSI    Scsi;
    EDD_USB     Usb;
    EDD_1394    FireWire;
    EDD_FIBRE   FibreChannel;
} EDD_DEVICE_PATH;

typedef struct _UNKNOWN_VENDOR_DEVICE_PATH {
  VENDOR_DEVICE_PATH              DevicePath;
  UINT8                           LegacyDriveLetter;
} UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;

//typedef struct _CONTROLLER_DEVICE_PATH {
//  EFI_DEVICE_PATH_PROTOCOL        Header;
//  UINT32                          Controller;
//} CONTROLLER_DEVICE_PATH;

//typedef struct _ATAPI_DEVICE_PATH {
//  EFI_DEVICE_PATH_PROTOCOL        Header;
//  UINT8                           Channel;
//  UINT8                           Device;
//  UINT16                          Lun;
//} ATAPI_DEVICE_PATH;

//typedef struct _SCSI_DEVICE_PATH {
//  EFI_DEVICE_PATH_PROTOCOL        Header;
//  UINT16                          TargetId;
//  UINT16                          Lun;
//} SCSI_DEVICE_PATH;

//typedef struct _FIBRE_CHANNEL_DEVICE_PATH {
//  EFI_DEVICE_PATH_PROTOCOL        Header;
//  UINT32                          Reserved;
//  UINT64                          WorldWideNumber;
//  UINT64                          Lun;
//} FIBRECHANNEL_DEVICE_PATH;

//typedef struct _F1394_DEVICE_PATH {
//  EFI_DEVICE_PATH_PROTOCOL        Header;
//  UINT32                          Reserved;
//  UINT64                          _1394Guid;
//} F1394_DEVICE_PATH;
/* AndriyN : must belong to DevicePath.h
typedef struct _USB_DEVICE_PATH {
    EFI_DEVICE_PATH_PROTOCOL      Header;
    UINT8                                   ParentPortNumber;
    UINT8                                   InterfaceNumber;
} USB_DEVICE_PATH;
*/

// Union of all possible device paths
typedef union {
  EFI_DEVICE_PATH_PROTOCOL             DevPath;
  PCI_DEVICE_PATH                      Pci;
//  PCCARD_DEVICE_PATH                   PcCard;
//  MEMMAP_DEVICE_PATH                   MemMap;
  VENDOR_DEVICE_PATH                   Vendor;
  UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    UnknownVendor;
  CONTROLLER_DEVICE_PATH               Controller;
//  ACPI_HID_DEVICE_PATH                 Acpi;
  ACPI_HID_DEVICE_PATH                     Acpi;
  ATAPI_DEVICE_PATH                    Atapi;
  SCSI_DEVICE_PATH                     Scsi;
  FIBRECHANNEL_DEVICE_PATH            FibreChannel;
  F1394_DEVICE_PATH                    F1394;
  USB_DEVICE_PATH                      Usb;
  USB_CLASS_DEVICE_PATH                UsbClass;
  I20_DEVICE_PATH                      I20;
//  MAC_ADDR_DEVICE_PATH                 MacAddr;
  IPv4_DEVICE_PATH                     Ipv4;
  IPv6_DEVICE_PATH                     Ipv6;
  INFINIBAND_DEVICE_PATH               InfiniBand;
  UART_DEVICE_PATH                     Uart;
  HARDDRIVE_DEVICE_PATH                HardDrive;
  CDROM_DEVICE_PATH                    CD;
//  FILEPATH_DEVICE_PATH                 FilePath;
//  MEDIA_PROTOCOL_DEVICE_PATH           MediaProtocol;
//  BBS_BBS_DEVICE_PATH                  Bbs;
} EFI_DEV_PATH;

#define HARDWARE_DEVICE_PATH      0x01
#define HW_VENDOR_DP              0x04
#define MESSAGING_DEVICE_PATH     0x03
#define MSG_ATAPI_DP              0x01
#define HW_CONTROLLER_DP          0x05
#define MSG_SCSI_DP               0x02
#define MSG_1394_DP               0x04
#define MSG_FIBRECHANNEL_DP       0x03

typedef struct {
    UINT16              StructureSize;
    UINT16              Flags;
    UINT32              MaxCylinders;
    UINT32              MaxHeads;
    UINT32              SectorsPerTrack;
    UINT64              PhysicalSectors;
    UINT16              BytesPerSector;
    UINT32              FDPT;
    UINT16              Key;
    UINT8               DevicePathLength;
    UINT8               Reserved1;
    UINT16              Reserved2;
    CHAR8               HostBusType[4];
    CHAR8               InterfaceType[8];
    EDD_INTERFACE_PATH  InterfacePath;
    EDD_DEVICE_PATH     DevicePath;
    UINT8               Reserved3;
    UINT8               Checksum;
} EDD_DRIVE_PARAMETERS;

// Flag definitions for above
#define EDD_GEOMETRY_VALID          0x02
#define EDD_DEVICE_REMOVABLE        0x04
#define EDD_WRITE_VERIFY_SUPPORTED  0x08
#define EDD_DEVICE_CHANGE           0x10
#define EDD_DEVICE_LOCKABLE         0x20

// For WIN98 limitation
#define EDD_DEVICE_GEOMETRY_MAX     0x40


//<AMI_SHDR_START>
//----------------------------------------------------------------------------
// Name:    EDD_DEVICE_ADDRESS_PACKET
//
// Description:  Device address packet used during EDD data transfers
//
// Fields:
//  PacketSizeInBytes   UINT8   Packet size in bytes
//  Zero                UINT8
//  NumberOfBlocks      UINT8   # of blocks to transfer
//  Zero2               UINT8
//  SegOffset           UINT32  Data address below 1MB
//  LBA                 UINT64  Device Logical Block Address
//  TransferBuffer      UINT64  Transfer Buffer
//  ExtendedBlockCount  UINT32  Transferred blocks counter
//  Zero3               UINT32
//
//----------------------------------------------------------------------------
//<AMI_SHDR_END>

typedef struct {
    UINT8   PacketSizeInBytes; // 0x18
    UINT8   Zero;
    UINT8   NumberOfBlocks; // Max 0x7f
    UINT8   Zero2;
    UINT32  SegOffset;
    UINT64  LBA;
    UINT64  TransferBuffer;
    UINT32  ExtendedBlockCount; // Max 0xffffffff
    UINT32  Zero3;
} EDD_DEVICE_ADDRESS_PACKET;

#define UNKNOWN_DEVICE_GUID \
  { 0xcf31fac5, 0xc24e, 0x11d2,  0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b  }

#define EDD_VERSION_30  0x30

// Int 13 Error Messages
#define ERR_PASS                   0x00
#define ERR_WRITE_PROTECTED        0x03
#define ERR_SECTOR_NOT_FOUND       0x04
#define ERR_RESET_FAILED           0x05
#define ERR_DISK_CHANGED           0x06
#define ERR_DRIVE_DOES_NOT_EXIST   0x07
#define ERR_DMA_ERROR              0x08
#define ERR_DATA_BOUNADRY_ERROR    0x09
#define ERR_BAD_SECTOR             0x0a
#define ERR_BAD_TRACK              0x0b
#define ERR_MEDIA_TYPE_NOT_FOUND   0x0c
#define ERR_INVALID_FORMAT         0x0d
#define ERR_ECC_ERROR              0x10
#define ERR_ECC_CORRECTED_ERROR    0x11
#define ERR_HARD_DRIVE_FAILURE     0x20
#define ERR_SEEK_FAILED            0x40
#define ERR_DRIVE_TIMEOUT          0x80
#define ERR_DRIVE_NOT_READY        0xaa
#define ERR_UNDEFINED_ERROR        0xbb
#define ERR_WRITE_FAULT            0xcc
#define ERR_SENSE_FAILED           0xff

#define MAX_EDD11_XFER  0xfe00

// PCI classes not defined in PCI.h
#define PCI_BASE_CLASS_INTELLIGENT  0x0e
#define PCI_SUB_CLASS_INTELLIGENT   0x00

#define EFI_SEGMENT(_Adr) (UINT16)((UINT16) (((UINTN)(_Adr)) >> 4) & 0xf000)
#define EFI_OFFSET(_Adr)  (UINT16)(((UINT16)((UINTN)_Adr)) & 0xffff)

#pragma pack()

// Local data structures

//<AMI_SHDR_START>
//----------------------------------------------------------------------------
// Name:    CSM_LEGACY_DRIVE
//
// Description:  Hard drive data structure
//
// Fields:
//  Letter          CHAR8   Drive letter
//  Number          UINT8   INT13 drive handle
//  EddVersion      UINT8   EDD version supported by the drive
//  ExtendedInt13   BOOLEAN Extended INT13 support status
//  DriveLockingAndEjecting BOOLEAN Locking/Ejecting support
//  Edd             BOOLEAN EDD support status
//  Extensions64Bit BOOLEAN 64 bit extension support
//  ParametersValid BOOLEAN Valid parameters (Parameters field) indicator
//  ErrorCode       UINT8   Error code field
//  FdptPointer     VOID*   Pointer to FDPT
//  Floppy          BOOLEAN Device-is-a-floppy indicator
//  AtapiFloppy     BOOLEAN Device-is-an-ATAPI-floppy indicator
//  MaxHead         UINT8   Number of heads
//  MaxSector       UINT8   Number of sectors
//  MaxCylinder     UINT16  Number of cylinders
//  Pad             UINT16
//  Parameters      EDD_DRIVE_PARAMETERS    EDD drive parameters
//
//----------------------------------------------------------------------------
//<AMI_SHDR_END>

typedef struct {
    CHAR8                   Letter;
    UINT8                   Number;
    UINT8                   EddVersion;
    BOOLEAN                 ExtendedInt13;
    BOOLEAN                 DriveLockingAndEjecting;
    BOOLEAN                 Edd;
    BOOLEAN                 Extensions64Bit;
    BOOLEAN                 ParametersValid;
    UINT8                   ErrorCode;
    VOID                    *FdptPointer;
    BOOLEAN                 Floppy;
    BOOLEAN                 AtapiFloppy;
    UINT8                   MaxHead;
    UINT8                   MaxSector;
    UINT16                  MaxCylinder;
    UINT16                  Pad;
    EDD_DRIVE_PARAMETERS    Parameters;
} CSM_LEGACY_DRIVE;


//<AMI_SHDR_START>
//----------------------------------------------------------------------------
// Name:    CSM_BLOCK_IO_DEV
//
// Description:  CSM BlockIo device properies
//
// Fields:
//  BlockIo     EFI_BLOCK_IO_PROTOCOL       BlockIo protocol instance
//  Handle      EFI_HANDLE                  EFI device handle
//  ControllerHandle    EFI_HANDLE          EFI controller handle
//  BlockMedia  EFI_BLOCK_IO_MEDIA          BlockIo device media
//  DevicePath  EFI_DEVICE_PATH_PROTOCOL*   Device path
//  PciIo       EFI_PCI_IO_PROTOCOL*        Device PciIo
//  LegacyBios  EFI_LEGACY_BIOS_PROTOCOL*   Legacy Bios instance pointer
//  Drive       CSM_LEGACY_DRIVE            Drive data pointer
//  HwInt       UINT8                       Hardware interrupt used by this device
//  HwIntHandler    UINT32                  Storage for the original HW interrupt
//
// Referrals:   CSM_LEGACY_DRIVE
//
//----------------------------------------------------------------------------
//<AMI_SHDR_END>

typedef struct {
    EFI_BLOCK_IO_PROTOCOL       BlockIo;
    EFI_HANDLE                  Handle;
    EFI_HANDLE                  ControllerHandle;
    EFI_BLOCK_IO_MEDIA          BlockMedia;
    EFI_DEVICE_PATH_PROTOCOL    *DevicePath;
    EFI_PCI_IO_PROTOCOL         *PciIo;
    EFI_LEGACY_BIOS_PROTOCOL    *LegacyBios;
    CSM_LEGACY_DRIVE            Drive;
    UINT8                       HwInt;
    UINT32                      HwIntHandler;
    EFI_EVENT                   Legacy2EfiEvent;
    UINT16                      BcvSegment;
    UINT16                      BcvOffset;
} CSM_BLOCK_IO_DEV;

#endif

//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2010, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**           5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093      **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************