summaryrefslogtreecommitdiff
path: root/Include/PCI.h
blob: 9afa536c5bb9ecb4786f18fe843112bdf624da9c (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
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2005, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**             6145-F Northbelt Pkwy, Norcross, GA 30071            **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************

//**********************************************************************
// $Header: /Alaska/BIN/Core/Include/PCI.h 13    8/17/11 12:21p Yakovlevs $
//
// $Revision: 13 $
//
// $Date: 8/17/11 12:21p $
//
//**********************************************************************
// Revision History
// ----------------
//$Log: /Alaska/BIN/Core/Include/PCI.h $
// 
// 13    8/17/11 12:21p Yakovlevs
// [TAG]  		EIP67406
// [Category]  	Bug Fix
// [Symptom]  	LEGACY_OPT_ROM_HEADER structure doesn't match to PCI
// specification
// [RootCause]  	Typo
// [Solution]  	Correct the typo
// [Files]  		Pci.h
// 
// 12    8/07/09 2:57p Rameshr
// Sd card definition added
// 
// 11    7/17/07 5:01p Yakovlevs
// Common PCI Header Offset Definitions added
// 
// 10    7/17/07 5:00p Yakovlevs
// 
// 9     3/15/07 3:10p Yakovlevs
// Changed PCI_PME register block Field NAMES; made all data pack(1) here
// 
// 8     3/15/07 3:09p Yakovlevs
// File Headr updated
//
//**********************************************************************

#ifndef _PCI22_H
#define _PCI22_H

#ifdef __cplusplus
extern "C" {
#endif

#include <Efi.h>

#define PCI_MAX_SEGMENT 	255

#define PCI_MAX_BUS     	255

#define PCI_MAX_DEVICE  	31
#define PCI_MAX_FUNC    	7

#define PCI_DEV_ROM_BAR		0x30
#define PCI_P2P_ROM_BAR 	0x38

#define MAX_PCI_BAR			6

#define P2P_BRG_MEM_GRA 	0xFFFFF //naturally, P2P Brg MMIO aligned to the 1M boundary
#define P2P_BRG_IO_GRA		0xFFF	//naturally, P2P Brg IO aligned to the 4k boundary

//Here comes some Common PCI Header Offset Definitions.
#define PCI_VID             0x0000        // Vendor ID Register
#define PCI_DID             0x0002        // Device ID Register
#define PCI_CMD             0x0004        // PCI Command Register
#define PCI_STS             0x0006        // PCI Status Register
#define PCI_RID             0x0008        // Revision ID Register
#define PCI_IFT             0x0009        // Interface Type
#define PCI_SCC             0x000A        // Sub Class Code Register
#define PCI_BCC             0x000B        // Base Class Code Register
#define PCI_CLS             0x000C        // Cache Line Size
#define PCI_PMLT            0x000D        // Primary Master Latency Timer
#define PCI_HDR             0x000E        // Header Type Register
#define PCI_BIST            0x000F        // Built in Self Test Register
#define PCI_BAR0            0x0010        // Base Address Register 0
#define PCI_BAR1            0x0014        // Base Address Register 1
#define PCI_BAR2            0x0018        // Base Address Register 2
#define PCI_PBUS            0x0018        // Primary Bus Number Register
#define PCI_SBUS            0x0019        // Secondary Bus Number Register
#define PCI_SUBUS           0x001A        // Subordinate Bus Number Register
#define PCI_SMLT            0x001B        // Secondary Master Latency Timer
#define PCI_BAR3            0x001C        // Base Address Register 3
#define PCI_IOBASE          0x001C        // I/O base Register
#define PCI_IOLIMIT         0x001D        // I/O Limit Register
#define PCI_SECSTATUS       0x001E        // Secondary Status Register
#define PCI_BAR4            0x0020        // Base Address Register 4
#define PCI_MEMBASE         0x0020        // Memory Base Register
#define PCI_MEMLIMIT        0x0022        // Memory Limit Register
#define PCI_BAR5            0x0024        // Base Address Register 5
#define PCI_PRE_MEMBASE     0x0024        // Prefetchable memory Base register
#define PCI_PRE_MEMLIMIT    0x0026        // Prefetchable memory Limit register
#define PCI_PRE_MEMBASE_U   0x0028        // Prefetchable memory base upper 32 bits
#define PCI_PRE_MEMLIMIT_U  0x002C        // Prefetchable memory limit upper 32 bits
#define PCI_SVID            0x002C        // Subsystem Vendor ID
#define PCI_SID             0x002E        // Subsystem ID
#define PCI_IOBASE_U        0x0030        // I/O base Upper Register
#define PCI_IOLIMIT_U       0x0032        // I/O Limit Upper Register
#define PCI_CAPP            0x0034        // Capabilities Pointer
#define PCI_EROM            0x0038        // Expansion ROM Base Address
#define PCI_INTLINE         0x003C        // Interrupt Line Register
#define PCI_INTPIN          0x003D        // Interrupt Pin Register
#define PCI_MAXGNT          0x003E        // Max Grant Register
#define PCI_BRIDGE_CNTL     0x003E        // Bridge Control Register
#define PCI_MAXLAT          0x003F        // Max Latency Register

// Command
#define PCI_VGA_PALETTE_SNOOP_DISABLED   0x20

#pragma pack(push, 1)

//Common part of PCI Devices
typedef struct {
    UINT16      VendorId;
    UINT16      DeviceId;
    UINT16      CmmandReg;
    UINT16      StatusReg;
    UINT8       RevisionID;
    UINT8       ClassCode[3];
    UINT8       CacheLineSize;
    UINT8       LatencyTmr;
    UINT8       HeaderType;
    UINT8       BIST;
} PCI_COMMON_REG;

//Standard PCI Device
typedef struct {
    UINT32      Bar[6];
    UINT32      CardBusCISPtr;
    UINT16      SubsystemVendorID;
    UINT16      SubsystemID;
    UINT32      ExpansionRomBar;
    UINT8       CapabilityPtr;
    UINT8       Reserved[7];
    UINT8       InterruptLine;
    UINT8       InterruptPin;
    UINT8       MinGnt;
    UINT8       MaxLat;
} PCI_DEVICE_REG;

typedef struct {
    PCI_COMMON_REG		Header;
    PCI_DEVICE_REG		Device;
} PCI_STD_DEVICE;

//PCI 2 PCI Bridge
typedef struct {
    UINT32      Bar[2];
    UINT8       PrimaryBus;
    UINT8       SecondaryBus;
    UINT8       SubordinateBus;
    UINT8       SecondaryLatencyTimer;
    UINT8       IoBase;
    UINT8       IoLimit;
    UINT16      SecondaryStatus;
    UINT16      MemoryBase;
    UINT16      MemoryLimit;
    UINT16      PfMemoryBase;
    UINT16      PfMemoryLimit;
    UINT32      PfBaseUpper32;
    UINT32      PfLimitUpper32;
    UINT16      IoBaseUpper16;
    UINT16      IoLimitUpper16;
    UINT8       CapabilityPtr;
    UINT8       Reserved[3];
    UINT32      ExpansionRomBAR;
    UINT8       InterruptLine;
    UINT8       InterruptPin;
    UINT16      BridgeControl;
} PCI_P2P_BRG_REG;

typedef struct {
    PCI_COMMON_REG		Header;
    PCI_P2P_BRG_REG     Bridge;
} PCI_P2P_BRIDGE;

//PCI 2 CardBUS BRIDGE
typedef struct {
  UINT32        CardBusSocketReg;          // Cardus Socket/ExCA Base
                                           //Address Register
  UINT8			CapabilityPtr;
  UINT8         Reserved;
  UINT16        SecondaryStatus;           // Secondary Status
  UINT8         PciBusNumber;              // PCI Bus Number
  UINT8         CardBusBusNumber;          // CardBus Bus Number
  UINT8         SubordinateBusNumber;      // Subordinate Bus Number
  UINT8         CardBusLatencyTimer;       // CardBus Latency Timer
  UINT32        MemoryBase0;               // Memory Base Register 0
  UINT32        MemoryLimit0;              // Memory Limit Register 0
  UINT32        MemoryBase1;
  UINT32        MemoryLimit1;
  UINT32        IoBase0;
  UINT32        IoLimit0;                  // I/O Base Register 0
  UINT32        IoBase1;                   // I/O Limit Register 0
  UINT32        IoLimit1;
  UINT8         InterruptLine;             // Interrupt Line
  UINT8         InterruptPin;              // Interrupt Pin
  UINT16        BridgeControl;             // Bridge Control
} PCI_P2C_BRG_REG;

typedef struct {
    PCI_COMMON_REG		Header;
    PCI_P2C_BRG_REG     Bridge;
} PCI_P2C_BRIDGE;


// Definitions of PCI class bytes and manipulation macros.
#define PCI_CL_OLD						0x00
#define PCI_CL_OLD_SCL_VGA				0x01

#define PCI_CL_MASS_STOR				0x01
#define PCI_CL_MASS_STOR_SCL_SCSI		0x00
#define PCI_CL_MASS_STOR_SCL_IDE		0x01
#define PCI_CL_MASS_STOR_SCL_FDC		0x02
#define PCI_CL_MASS_STOR_SCL_IPI		0x03
#define PCI_CL_MASS_STOR_SCL_RAID		0x04
#define PCI_CL_MASS_STOR_SCL_OTHER		0x80

#define PCI_CL_NETWORK					0x02
#define PCI_CL_NETWORK_SCL_ETHERNET		0x00
#define PCI_CL_NETWORK_SCL_TOK_RING		0x01
#define PCI_CL_NETWORK_SCL_FDDI			0x02
#define PCI_CL_NETWORK_SCL_ATM			0x03
#define PCI_CL_NETWORK_SCL_ISDN			0x04
#define PCI_CL_NETWORK_SCL_OTHER		0x80

#define PCI_CL_DISPLAY					0x03
#define PCI_CL_DISPLAY_SCL_VGA          0x00
#define PCI_CL_DISPLAY_SCL_XGA          0x01
#define PCI_CL_DISPLAY_SCL_3D           0x02
#define PCI_CL_DISPLAY_SCL_OTHER        0x80

#define PCI_CL_MMEDIA					0x04
#define PCI_CL_MMEDIA_SCL_VIDEO			0x00
#define PCI_CL_MMEDIA_SCL_AUDIO			0x01
#define PCI_CL_MMEDIA_SCL_PHONE			0x02
#define PCI_CL_MMEDIA_SCL_OTHER			0x80

#define PCI_CL_MEMORY					0x05
#define PCI_CL_MEMORY_SCL_RAM			0x00
#define PCI_CL_MEMORY_SCL_FLASH			0x01
#define PCI_CL_MEMORY_SCL_OTHER			0x80

#define PCI_CL_BRIDGE					0x06
#define PCI_CL_BRIDGE_SCL_HOST          0x00
#define PCI_CL_BRIDGE_SCL_ISA           0x01
#define PCI_CL_BRIDGE_SCL_EISA          0x02
#define PCI_CL_BRIDGE_SCL_MCA           0x03
#define PCI_CL_BRIDGE_SCL_P2P           0x04
#define PCI_CL_BRIDGE_SCL_PCMCIA        0x05
#define PCI_CL_BRIDGE_SCL_NUBUS         0x06
#define PCI_CL_BRIDGE_SCL_CARDBUS       0x07
#define PCI_CL_BRIDGE_SCL_RACEWAY       0x08
#define PCI_CL_BRIDGE_SCL_OTHER			0x80

#define PCI_CL_COMM						0x07
#define PCI_CL_COMM_CSL_SERIAL			0x00
#define PCI_CL_COMM_CSL_PARALLEL		0x01
#define PCI_CL_COMM_CSL_MULTISERIAL		0x02
#define PCI_CL_COMM_CSL_MODEM			0x03
#define PCI_CL_COMM_CSL_OTHER			0x80

#define PCI_CL_SYSTEM_PERIPHERALS		0x08
#define PCI_CL_SYSTEM_PERIPHERALS_SCL_SD	0x05

#define PCI_CL_SER_BUS	                0x0C
#define PCI_CL_SER_BUS_SCL_FIREWIRE     0x00
#define PCI_CL_SER_BUS_SCL_ACCESS       0x01
#define PCI_CL_SER_BUS_SCL_SSA          0x02
#define PCI_CL_SER_BUS_SCL_USB          0x03
#define PCI_CL_SER_BUS_SCL_FIBCHAN		0x04
#define PCI_CL_SER_BUS_SCL_SMB          0x05

#define PCI_CL_I2O		                0x0E
//TODO //TODO //TODO //TODO //TODO //TODO 
//Some Class codes are missing I just don't need them for PCI BUS Driver
//to reflect the spec and mantain accuracy it has to be enterted.

#define HDR_TYPE_DEVICE		            0x00
#define HDR_TYPE_P2P_BRG				0x01
#define HDR_TYPE_P2C_BRG				0x02

#define HDR_TYPE_MULTIFUNC				0x80

#define PCI_MAX_BAR_NO					6
#define PCI_MAX_CFG_OFFS				0x100


#define PCI_COMMAND_REGISTER_OFFSET        0x04
#define PCI_STATUS_REGISTER_OFFSET         0x06
#define PCI_BRIDGE_CONTROL_REGISTER_OFFSET 0x3E
#define PCI_BRIDGE_STATUS_REGISTER_OFFSET  0x1E

#define PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET      0x18
#define PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET    0x19
#define PCI_BRIDGE_SUBORDINATE_BUS_REGISTER_OFFSET  0x1a

typedef struct {
    UINT8   Register;
    UINT8   Function;
    UINT8   Device;
    UINT8   Bus;
    UINT8   Reserved[4];
} EFI_PCI_ADDR;

typedef struct {
    UINT32  Reg     : 8;
    UINT32  Func    : 3;
    UINT32  Dev     : 5;
    UINT32  Bus     : 8;
    UINT32  Reserved: 7;
    UINT32  Enable  : 1;
} PCI_CONFIG_ACCESS_CF8;


#define PCI_REV_ID_OFFSET						0x08
#define PCI_PI_OFFSET							0x09

// Following are the PCI-CARDBUS bridge control bit     
#define PCI_STD_OPT_ROM_SIGNATURE				0xaa55
#define PCI_EFI_OPT_ROM_SIGNATURE				0x0EF1
#define PCI_CODE_TYPE_PCAT_IMAGE				0x00
#define PCI_CODE_TYPE_EFI_IMAGE					0x03
#define PCI_EFI_OPT_ROM_SIGNATURE_COMPRESSED    0x0001

// Following are the PCI-COMMAND REG control bit     
#define PCI_CMD_IO_SPACE                        0x0001
#define PCI_CMD_MEMORY_SPACE                    0x0002
#define PCI_CMD_BUS_MASTER                      0x0004
#define PCI_CMD_SPECIAL_CYCLE                   0x0008
#define PCI_CMD_MEMORY_WRITE_AND_INVALIDATE     0x0010
#define PCI_CMD_VGA_PALETTE_SNOOP               0x0020
#define PCI_CMD_PARITY_ERROR_RESPOND            0x0040
#define PCI_CMD_STEPPING_CONTROL                0x0080
#define PCI_CMD_SERR                            0x0100
#define PCI_CMD_FAST_BACK_TO_BACK               0x0200
#define PCI_CMD_INTERRUPT_DISABLE               0x0400

typedef union {
	UINT16 		CMD_REG_ALL;
	struct{
		UINT16	IO_SPACE 		: 1; //bit0
		UINT16	MEM_SPACE 		: 1; //bit1
		UINT16	BUS_MASTER		: 1; //bit2
		UINT16	SP_CYCLE		: 1; //bit3
		UINT16	MEM_WI_EN		: 1; //bit4
		UINT16	VGA_PALETTE		: 1; //bit5
		UINT16	PARITY_ERR		: 1; //bit6
		UINT16	STEP_CTR		: 1; //bit7
		UINT16	SERR_ENA		: 1; //bit8
		UINT16	FAST_B2B_ENA	: 1; //bit9
		UINT16	reserved		: 6; //bit10-15
	};
} PCI_CMD_REG_BITS;

// Following are the PCI-2-PCI  bridge control bit     
#define P2P_BRG_CONTROL_PARITY_ERROR_RESPONSE    0x0001
#define P2P_BRG_CONTROL_SERR                     0x0002
#define P2P_BRG_CONTROL_ISA                      0x0004
#define P2P_BRG_CONTROL_VGA                      0x0008
#define P2P_BRG_CONTROL_VGA_16                   0x0010
#define P2P_BRG_CONTROL_MASTER_ABORT             0x0020
#define P2P_BRG_CONTROL_RESET_SECONDARY_BUS      0x0040
#define P2P_BRG_CONTROL_FAST_BACK_TO_BACK        0x0080
#define P2P_BRG_CONTROL_PRIMARY_DISCARD_TIMER    0x0100
#define P2P_BRG_CONTROL_SECONDARY_DISCARD_TIMER  0x0200
#define P2P_BRG_CONTROL_TIMER_STATUS             0x0400
#define P2P_BRG_CONTROL_DISCARD_TIMER_SERR       0x0800
                                                       
// Following are the PCI-2-CARDBUS bridge control bit     
#define P2C_BRG_CONTROL_IREQINT_ENABLE           0x0080
#define P2C_BRG_CONTROL_RANGE0_MEMORY_TYPE       0x0100
#define P2C_BRG_CONTROL_RANGE1_MEMORY_TYPE       0x0200
#define P2C_BRG_CONTROL_WRITE_POSTING_ENABLE     0x0400
                                                       
// Following are the PCI status control bit             
#define PCI_STS_CAPABILITY                       0x0010
#define PCI_STS_66MZ_CAPABLE                     0x0020
#define PCI_STS_FAST_BACK_TO_BACK				 0x0080
#define PCI_STS_MASTER_DATA_PARITY_ERROR         0x0100
 

#define EFI_PCI_CAPABILITY_PTR                          0x34
#define EFI_PCI_CARDBUS_BRIDGE_CAPABILITY_PTR           0x14

//Some signature definitions
#define PCI_OPT_ROM_SIG		0xAA55			
#define PCI_OPT_ROM_EFISIG	0x0EF1
#define PCI_PCIR_SIG		0x52494350 		//"PCIR"

//EFI subsystem definitions
#define EFI_IMAGE_BS_DRIVER	11
#define EFI_IMAGE_RT_DRIVER 12

typedef struct {
    UINT16          Signature;              // 0xaa55
    UINT8           Reserved[0x16];
    UINT16          PcirOffset;
} PCI_STD_OPT_ROM_HEADER;

typedef struct {
    UINT16          Signature;              // 0xaa55
    UINT16          InitializationSize;
    UINT32          EfiSignature;           // 0x0EF1
    UINT16          EfiSubsystem;
    UINT16          EfiMachineType;
    UINT16          CompressionType;
    UINT8           Reserved[8];
    UINT16          EfiImageOffset;
    UINT16          PcirOffset;
} PCI_EFI_OPT_ROM_HEADER;

typedef struct {
    UINT16          Signature;              // 0xaa55
    UINT8           Size512;
    UINT8           Reserved[0x15];
    UINT16          PcirOffset;
} LEGACY_OPT_ROM_HEADER;

typedef union {
	UINT8                           *Raw;
	PCI_STD_OPT_ROM_HEADER          *Generic;
	PCI_EFI_OPT_ROM_HEADER			*Efi;
	LEGACY_OPT_ROM_HEADER			*PcAt;
}EFI_PCI_ROM_HEADER;


typedef struct {
    UINT32          Signature;              // "PCIR"
    UINT16          VendorId;
    UINT16          DeviceId;
    UINT16          Reserved0;
    UINT16          Length;
    UINT8           Revision;
    UINT8           ClassCode[3];
    UINT16          ImageLength;
    UINT16          CodeRevision;
    UINT8           CodeType;
    UINT8           Indicator;
    UINT16          Reserved1;
} PCI_DATA_STRUCTURE;



// PCI Capability List IDs and records                                                        
#define PCI_CAP_ID_PMI			0x01
#define PCI_CAP_ID_AGP			0x02
#define PCI_CAP_ID_VPD			0x03
#define PCI_CAP_ID_SLOTID		0x04
#define PCI_CAP_ID_MSI			0x05
#define PCI_CAP_ID_HOTSWAP		0x06
#define PCI_CAP_ID_PCIX			0x07
#define PCI_CAP_ID_PCIEXP		0x10
#define PCI_CAP_ID_HOTPLUG		0x0C		

typedef union {
	UINT16			CAP_HDR;
    struct {
		UINT8		CapabilityID;
   		UINT8		NextItemPtr;
	};
} EFI_PCI_CAPABILITY_HDR;

// Capability EFI_PCI_CAPABILITY_ID_PMI
//Derfinitions for Power Management Interface
typedef union _PCI_PM_CAP_REG {
	UINT16		PMI_CAP_REG;
	struct {
		UINT16	Version 	: 	3; 	//16,17,18
		UINT16  PmeClock	: 	1; 	//19
		UINT16	Reserved	:	1;	//20
		UINT16  DevSpecInit	:	1;	//21
		UINT16	AuxCurrent	:	3;	//22,23,24 
		UINT16	D1Support	:	1;	//25
		UINT16	D2Support	:	1;	//26
		UINT16	PmeSupport	:	5;	//27,28,29,30,31
	};
} PCI_PM_CAP_REG;

//Power Mamagement Control/Status Reg
typedef union _PCI_PM_CTRSTS_REG {
	UINT16		PMI_CTRSTS_REG;
	struct {
		UINT16	PowerState 	: 	2; 	//00,01
		UINT16	Reserved	:	6;	//02,03,04,05,06,07
		UINT16  PmeEnable	:	1;	//08
		UINT16	DataSelect	:	4;	//09,10,11,12 
		UINT16	DataScale	:	2;	//13,14
		UINT16	PmeStatus	:	1;	//15
	};
} PCI_PM_CTRSTS_REG;

typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    PCI_PM_CAP_REG         	PmCapReg;
    PCI_PM_CTRSTS_REG		PmStaCtlReg;
    UINT8                   BridgeExtention;
    UINT8                   Data;
} EFI_PCI_CAPABILITY_PMI;

// Capability EFI_PCI_CAPABILITY_ID_AGP
typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT8                   Rev;
    UINT8                   Reserved;
    UINT32                  Status;
    UINT32                  Command;
} EFI_PCI_CAPABILITY_AGP;


// Capability EFI_PCI_CAPABILITY_ID_VPD
//Vital Poroduct Data
typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT16                  AddrReg;
    UINT32                  DataReg;
} EFI_PCI_CAPABILITY_VPD;


// Capability EFI_PCI_CAPABILITY_ID_SLOTID
typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT8                   ExpnsSlotReg;
    UINT8                   ChassisNo;
} EFI_PCI_CAPABILITY_SLOTID;


// Capability EFI_PCI_CAPABILITY_ID_MSI
typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT16                  MsgCtrlReg;
    UINT32                  MsgAddrReg;
    UINT16                  MsgDataReg;
} EFI_PCI_CAPABILITY_MSI32;

typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT16                  MsgCtrlReg;
    UINT32                  MsgAddrRegLsdw;
    UINT32                  MsgAddrRegMsdw;
    UINT16                  MsgDataReg;
} EFI_PCI_CAPABILITY_MSI64;


// Capability EFI_PCI_CAPABILITY_ID_HOTPLUG
typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    // not finished - fields need to go here
} EFI_PCI_CAPABILITY_HOTPLUG;


// Capability EFI_PCI_CAPABILITY_ID_PCIX
typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT16                  CommandReg;
    UINT32                  StatusReg;
} EFI_PCI_CAPABILITY_PCIX;

typedef struct {
    EFI_PCI_CAPABILITY_HDR  Hdr;
    UINT16                  SecStatusReg;
    UINT32                  StatusReg;
    UINT32                  SplitTransCtrlRegUp;
    UINT32                  SplitTransCtrlRegDn;
} EFI_PCI_CAPABILITY_PCIX_BRDG;

#pragma pack (pop)


#define DEVICE_ID_NOCARE        0xFFFF

#define PCI_ACPI_UNUSED         0
#define PCI_BAR_NOCHANGE        0
#define PCI_BAR_OLD_ALIGN       0xFFFFFFFFFFFFFFFF 
#define PCI_BAR_EVEN_ALIGN      0xFFFFFFFFFFFFFFFE       
#define PCI_BAR_SQUAD_ALIGN     0xFFFFFFFFFFFFFFFD  
#define PCI_BAR_DQUAD_ALIGN     0xFFFFFFFFFFFFFFFC


#define PCI_BAR_IDX0            0x00
#define PCI_BAR_IDX1            0x01
#define PCI_BAR_IDX2            0x02
#define PCI_BAR_IDX3            0x03
#define PCI_BAR_IDX4            0x04
#define PCI_BAR_IDX5            0x05
#define PCI_BAR_ALL             0xFF


/****** DO NOT WRITE BELOW THIS LINE *******/
#ifdef __cplusplus
}
#endif

#endif
//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2005, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**             6145-F Northbelt Pkwy, Norcross, GA 30071            **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************