summaryrefslogtreecommitdiffstats
path: root/MdePkg/Include/IndustryStandard/Pci22.h
blob: d083bc259d9613af2ab8c211f7e5ae1ead7c5733 (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
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
/** @file
  Support for PCI 2.2 standard.

  This file includes the definitions in the following specifications,
    PCI Local Bus Specification, 2.2
    PCI-to-PCI Bridge Architecture Specification, Revision 1.2
    PC Card Standard, 8.0
    PCI Power Management Interface Specification, Revision 1.2

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  Copyright (c) 2014 - 2015, Hewlett-Packard Development Company, L.P.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _PCI22_H_
#define _PCI22_H_

#define PCI_MAX_BUS     255
#define PCI_MAX_DEVICE  31
#define PCI_MAX_FUNC    7

#pragma pack(1)

///
/// Common header region in PCI Configuration Space
/// Section 6.1, PCI Local Bus Specification, 2.2
///
typedef struct {
  UINT16    VendorId;
  UINT16    DeviceId;
  UINT16    Command;
  UINT16    Status;
  UINT8     RevisionID;
  UINT8     ClassCode[3];
  UINT8     CacheLineSize;
  UINT8     LatencyTimer;
  UINT8     HeaderType;
  UINT8     BIST;
} PCI_DEVICE_INDEPENDENT_REGION;

///
/// PCI Device header region in PCI Configuration Space
/// Section 6.1, PCI Local Bus Specification, 2.2
///
typedef struct {
  UINT32    Bar[6];
  UINT32    CISPtr;
  UINT16    SubsystemVendorID;
  UINT16    SubsystemID;
  UINT32    ExpansionRomBar;
  UINT8     CapabilityPtr;
  UINT8     Reserved1[3];
  UINT32    Reserved2;
  UINT8     InterruptLine;
  UINT8     InterruptPin;
  UINT8     MinGnt;
  UINT8     MaxLat;
} PCI_DEVICE_HEADER_TYPE_REGION;

///
/// PCI Device Configuration Space
/// Section 6.1, PCI Local Bus Specification, 2.2
///
typedef struct {
  PCI_DEVICE_INDEPENDENT_REGION    Hdr;
  PCI_DEVICE_HEADER_TYPE_REGION    Device;
} PCI_TYPE00;

///
/// PCI-PCI Bridge header region in PCI Configuration Space
/// Section 3.2, PCI-PCI Bridge Architecture, Version 1.2
///
typedef struct {
  UINT32    Bar[2];
  UINT8     PrimaryBus;
  UINT8     SecondaryBus;
  UINT8     SubordinateBus;
  UINT8     SecondaryLatencyTimer;
  UINT8     IoBase;
  UINT8     IoLimit;
  UINT16    SecondaryStatus;
  UINT16    MemoryBase;
  UINT16    MemoryLimit;
  UINT16    PrefetchableMemoryBase;
  UINT16    PrefetchableMemoryLimit;
  UINT32    PrefetchableBaseUpper32;
  UINT32    PrefetchableLimitUpper32;
  UINT16    IoBaseUpper16;
  UINT16    IoLimitUpper16;
  UINT8     CapabilityPtr;
  UINT8     Reserved[3];
  UINT32    ExpansionRomBAR;
  UINT8     InterruptLine;
  UINT8     InterruptPin;
  UINT16    BridgeControl;
} PCI_BRIDGE_CONTROL_REGISTER;

///
/// PCI-to-PCI Bridge Configuration Space
/// Section 3.2, PCI-PCI Bridge Architecture, Version 1.2
///
typedef struct {
  PCI_DEVICE_INDEPENDENT_REGION    Hdr;
  PCI_BRIDGE_CONTROL_REGISTER      Bridge;
} PCI_TYPE01;

typedef union {
  PCI_TYPE00    Device;
  PCI_TYPE01    Bridge;
} PCI_TYPE_GENERIC;

///
/// CardBus Controller Configuration Space,
/// Section 4.5.1, PC Card Standard. 8.0
///
typedef struct {
  UINT32    CardBusSocketReg;   ///< Cardbus Socket/ExCA Base
  UINT8     Cap_Ptr;
  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_CARDBUS_CONTROL_REGISTER;

//
// Definitions of PCI class bytes and manipulation macros.
//
#define PCI_CLASS_OLD          0x00
#define   PCI_CLASS_OLD_OTHER  0x00
#define   PCI_CLASS_OLD_VGA    0x01

#define PCI_CLASS_MASS_STORAGE           0x01
#define   PCI_CLASS_MASS_STORAGE_SCSI    0x00
#define   PCI_CLASS_MASS_STORAGE_IDE     0x01
#define   PCI_CLASS_MASS_STORAGE_FLOPPY  0x02
#define   PCI_CLASS_MASS_STORAGE_IPI     0x03
#define   PCI_CLASS_MASS_STORAGE_RAID    0x04
#define   PCI_CLASS_MASS_STORAGE_OTHER   0x80

#define PCI_CLASS_NETWORK              0x02
#define   PCI_CLASS_NETWORK_ETHERNET   0x00
#define   PCI_CLASS_NETWORK_TOKENRING  0x01
#define   PCI_CLASS_NETWORK_FDDI       0x02
#define   PCI_CLASS_NETWORK_ATM        0x03
#define   PCI_CLASS_NETWORK_ISDN       0x04
#define   PCI_CLASS_NETWORK_OTHER      0x80

#define PCI_CLASS_DISPLAY          0x03
#define   PCI_CLASS_DISPLAY_VGA    0x00
#define     PCI_IF_VGA_VGA         0x00
#define     PCI_IF_VGA_8514        0x01
#define   PCI_CLASS_DISPLAY_XGA    0x01
#define   PCI_CLASS_DISPLAY_3D     0x02
#define   PCI_CLASS_DISPLAY_OTHER  0x80

#define PCI_CLASS_MEDIA              0x04
#define   PCI_CLASS_MEDIA_VIDEO      0x00
#define   PCI_CLASS_MEDIA_AUDIO      0x01
#define   PCI_CLASS_MEDIA_TELEPHONE  0x02
#define   PCI_CLASS_MEDIA_OTHER      0x80

#define PCI_CLASS_MEMORY_CONTROLLER  0x05
#define   PCI_CLASS_MEMORY_RAM       0x00
#define   PCI_CLASS_MEMORY_FLASH     0x01
#define   PCI_CLASS_MEMORY_OTHER     0x80

#define PCI_CLASS_BRIDGE                   0x06
#define   PCI_CLASS_BRIDGE_HOST            0x00
#define   PCI_CLASS_BRIDGE_ISA             0x01
#define   PCI_CLASS_BRIDGE_EISA            0x02
#define   PCI_CLASS_BRIDGE_MCA             0x03
#define   PCI_CLASS_BRIDGE_P2P             0x04
#define     PCI_IF_BRIDGE_P2P              0x00
#define     PCI_IF_BRIDGE_P2P_SUBTRACTIVE  0x01
#define   PCI_CLASS_BRIDGE_PCMCIA          0x05
#define   PCI_CLASS_BRIDGE_NUBUS           0x06
#define   PCI_CLASS_BRIDGE_CARDBUS         0x07
#define   PCI_CLASS_BRIDGE_RACEWAY         0x08
#define   PCI_CLASS_BRIDGE_OTHER           0x80
#define   PCI_CLASS_BRIDGE_ISA_PDECODE     0x80

#define PCI_CLASS_SCC                    0x07///< Simple communications controllers
#define   PCI_SUBCLASS_SERIAL            0x00
#define     PCI_IF_GENERIC_XT            0x00
#define     PCI_IF_16450                 0x01
#define     PCI_IF_16550                 0x02
#define     PCI_IF_16650                 0x03
#define     PCI_IF_16750                 0x04
#define     PCI_IF_16850                 0x05
#define     PCI_IF_16950                 0x06
#define   PCI_SUBCLASS_PARALLEL          0x01
#define     PCI_IF_PARALLEL_PORT         0x00
#define     PCI_IF_BI_DIR_PARALLEL_PORT  0x01
#define     PCI_IF_ECP_PARALLEL_PORT     0x02
#define     PCI_IF_1284_CONTROLLER       0x03
#define     PCI_IF_1284_DEVICE           0xFE
#define   PCI_SUBCLASS_MULTIPORT_SERIAL  0x02
#define   PCI_SUBCLASS_MODEM             0x03
#define     PCI_IF_GENERIC_MODEM         0x00
#define     PCI_IF_16450_MODEM           0x01
#define     PCI_IF_16550_MODEM           0x02
#define     PCI_IF_16650_MODEM           0x03
#define     PCI_IF_16750_MODEM           0x04
#define   PCI_SUBCLASS_SCC_OTHER         0x80

#define PCI_CLASS_SYSTEM_PERIPHERAL      0x08
#define   PCI_SUBCLASS_PIC               0x00
#define     PCI_IF_8259_PIC              0x00
#define     PCI_IF_ISA_PIC               0x01
#define     PCI_IF_EISA_PIC              0x02
#define     PCI_IF_APIC_CONTROLLER       0x10   ///< I/O APIC interrupt controller , 32 byte none-prefetchable memory.
#define     PCI_IF_APIC_CONTROLLER2      0x20
#define   PCI_SUBCLASS_DMA               0x01
#define     PCI_IF_8237_DMA              0x00
#define     PCI_IF_ISA_DMA               0x01
#define     PCI_IF_EISA_DMA              0x02
#define   PCI_SUBCLASS_TIMER             0x02
#define     PCI_IF_8254_TIMER            0x00
#define     PCI_IF_ISA_TIMER             0x01
#define     PCI_IF_EISA_TIMER            0x02
#define   PCI_SUBCLASS_RTC               0x03
#define     PCI_IF_GENERIC_RTC           0x00
#define     PCI_IF_ISA_RTC               0x01
#define   PCI_SUBCLASS_PNP_CONTROLLER    0x04   ///< HotPlug Controller
#define   PCI_SUBCLASS_PERIPHERAL_OTHER  0x80

#define PCI_CLASS_INPUT_DEVICE           0x09
#define   PCI_SUBCLASS_KEYBOARD          0x00
#define   PCI_SUBCLASS_PEN               0x01
#define   PCI_SUBCLASS_MOUSE_CONTROLLER  0x02
#define   PCI_SUBCLASS_SCAN_CONTROLLER   0x03
#define   PCI_SUBCLASS_GAMEPORT          0x04
#define     PCI_IF_GAMEPORT              0x00
#define     PCI_IF_GAMEPORT1             0x10
#define   PCI_SUBCLASS_INPUT_OTHER       0x80

#define PCI_CLASS_DOCKING_STATION       0x0A
#define   PCI_SUBCLASS_DOCKING_GENERIC  0x00
#define   PCI_SUBCLASS_DOCKING_OTHER    0x80

#define PCI_CLASS_PROCESSOR          0x0B
#define   PCI_SUBCLASS_PROC_386      0x00
#define   PCI_SUBCLASS_PROC_486      0x01
#define   PCI_SUBCLASS_PROC_PENTIUM  0x02
#define   PCI_SUBCLASS_PROC_ALPHA    0x10
#define   PCI_SUBCLASS_PROC_POWERPC  0x20
#define   PCI_SUBCLASS_PROC_MIPS     0x30
#define   PCI_SUBCLASS_PROC_CO_PORC  0x40    ///< Co-Processor

#define PCI_CLASS_SERIAL                 0x0C
#define   PCI_CLASS_SERIAL_FIREWIRE      0x00
#define     PCI_IF_1394                  0x00
#define     PCI_IF_1394_OPEN_HCI         0x10
#define   PCI_CLASS_SERIAL_ACCESS_BUS    0x01
#define   PCI_CLASS_SERIAL_SSA           0x02
#define   PCI_CLASS_SERIAL_USB           0x03
#define     PCI_IF_UHCI                  0x00
#define     PCI_IF_OHCI                  0x10
#define     PCI_IF_USB_OTHER             0x80
#define     PCI_IF_USB_DEVICE            0xFE
#define   PCI_CLASS_SERIAL_FIBRECHANNEL  0x04
#define   PCI_CLASS_SERIAL_SMB           0x05

#define PCI_CLASS_WIRELESS             0x0D
#define   PCI_SUBCLASS_IRDA            0x00
#define   PCI_SUBCLASS_IR              0x01
#define   PCI_SUBCLASS_RF              0x10
#define   PCI_SUBCLASS_WIRELESS_OTHER  0x80

#define PCI_CLASS_INTELLIGENT_IO  0x0E

#define PCI_CLASS_SATELLITE   0x0F
#define   PCI_SUBCLASS_TV     0x01
#define   PCI_SUBCLASS_AUDIO  0x02
#define   PCI_SUBCLASS_VOICE  0x03
#define   PCI_SUBCLASS_DATA   0x04

#define PCI_SECURITY_CONTROLLER        0x10  ///< Encryption and decryption controller
#define   PCI_SUBCLASS_NET_COMPUT      0x00
#define   PCI_SUBCLASS_ENTERTAINMENT   0x10
#define   PCI_SUBCLASS_SECURITY_OTHER  0x80

#define PCI_CLASS_DPIO             0x11
#define   PCI_SUBCLASS_DPIO        0x00
#define   PCI_SUBCLASS_DPIO_OTHER  0x80

/**
  Macro that checks whether the Base Class code of device matched.

  @param  _p      Specified device.
  @param  c       Base Class code needs matching.

  @retval TRUE    Base Class code matches the specified device.
  @retval FALSE   Base Class code doesn't match the specified device.

**/
#define IS_CLASS1(_p, c)  ((_p)->Hdr.ClassCode[2] == (c))

/**
  Macro that checks whether the Base Class code and Sub-Class code of device matched.

  @param  _p      Specified device.
  @param  c       Base Class code needs matching.
  @param  s       Sub-Class code needs matching.

  @retval TRUE    Base Class code and Sub-Class code match the specified device.
  @retval FALSE   Base Class code and Sub-Class code don't match the specified device.

**/
#define IS_CLASS2(_p, c, s)  (IS_CLASS1 (_p, c) && ((_p)->Hdr.ClassCode[1] == (s)))

/**
  Macro that checks whether the Base Class code, Sub-Class code and Interface code of device matched.

  @param  _p      Specified device.
  @param  c       Base Class code needs matching.
  @param  s       Sub-Class code needs matching.
  @param  p       Interface code needs matching.

  @retval TRUE    Base Class code, Sub-Class code and Interface code match the specified device.
  @retval FALSE   Base Class code, Sub-Class code and Interface code don't match the specified device.

**/
#define IS_CLASS3(_p, c, s, p)  (IS_CLASS2 (_p, c, s) && ((_p)->Hdr.ClassCode[0] == (p)))

/**
  Macro that checks whether device is a display controller.

  @param  _p      Specified device.

  @retval TRUE    Device is a display controller.
  @retval FALSE   Device is not a display controller.

**/
#define IS_PCI_DISPLAY(_p)  IS_CLASS1 (_p, PCI_CLASS_DISPLAY)

/**
  Macro that checks whether device is a VGA-compatible controller.

  @param  _p      Specified device.

  @retval TRUE    Device is a VGA-compatible controller.
  @retval FALSE   Device is not a VGA-compatible controller.

**/
#define IS_PCI_VGA(_p)  IS_CLASS3 (_p, PCI_CLASS_DISPLAY, PCI_CLASS_DISPLAY_VGA, PCI_IF_VGA_VGA)

/**
  Macro that checks whether device is an 8514-compatible controller.

  @param  _p      Specified device.

  @retval TRUE    Device is an 8514-compatible controller.
  @retval FALSE   Device is not an 8514-compatible controller.

**/
#define IS_PCI_8514(_p)  IS_CLASS3 (_p, PCI_CLASS_DISPLAY, PCI_CLASS_DISPLAY_VGA, PCI_IF_VGA_8514)

/**
  Macro that checks whether device is built before the Class Code field was defined.

  @param  _p      Specified device.

  @retval TRUE    Device is an old device.
  @retval FALSE   Device is not an old device.

**/
#define IS_PCI_OLD(_p)  IS_CLASS1 (_p, PCI_CLASS_OLD)

/**
  Macro that checks whether device is a VGA-compatible device built before the Class Code field was defined.

  @param  _p      Specified device.

  @retval TRUE    Device is an old VGA-compatible device.
  @retval FALSE   Device is not an old VGA-compatible device.

**/
#define IS_PCI_OLD_VGA(_p)  IS_CLASS2 (_p, PCI_CLASS_OLD, PCI_CLASS_OLD_VGA)

/**
  Macro that checks whether device is an IDE controller.

  @param  _p      Specified device.

  @retval TRUE    Device is an IDE controller.
  @retval FALSE   Device is not an IDE controller.

**/
#define IS_PCI_IDE(_p)  IS_CLASS2 (_p, PCI_CLASS_MASS_STORAGE, PCI_CLASS_MASS_STORAGE_IDE)

/**
  Macro that checks whether device is a SCSI bus controller.

  @param  _p      Specified device.

  @retval TRUE    Device is a SCSI bus controller.
  @retval FALSE   Device is not a SCSI bus controller.

**/
#define IS_PCI_SCSI(_p)  IS_CLASS2 (_p, PCI_CLASS_MASS_STORAGE, PCI_CLASS_MASS_STORAGE_SCSI)

/**
  Macro that checks whether device is a RAID controller.

  @param  _p      Specified device.

  @retval TRUE    Device is a RAID controller.
  @retval FALSE   Device is not a RAID controller.

**/
#define IS_PCI_RAID(_p)  IS_CLASS2 (_p, PCI_CLASS_MASS_STORAGE, PCI_CLASS_MASS_STORAGE_RAID)

/**
  Macro that checks whether device is an ISA bridge.

  @param  _p      Specified device.

  @retval TRUE    Device is an ISA bridge.
  @retval FALSE   Device is not an ISA bridge.

**/
#define IS_PCI_LPC(_p)  IS_CLASS2 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA)

/**
  Macro that checks whether device is a PCI-to-PCI bridge.

  @param  _p      Specified device.

  @retval TRUE    Device is a PCI-to-PCI bridge.
  @retval FALSE   Device is not a PCI-to-PCI bridge.

**/
#define IS_PCI_P2P(_p)  IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_P2P, PCI_IF_BRIDGE_P2P)

/**
  Macro that checks whether device is a Subtractive Decode PCI-to-PCI bridge.

  @param  _p      Specified device.

  @retval TRUE    Device is a Subtractive Decode PCI-to-PCI bridge.
  @retval FALSE   Device is not a Subtractive Decode PCI-to-PCI bridge.

**/
#define IS_PCI_P2P_SUB(_p)  IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_P2P, PCI_IF_BRIDGE_P2P_SUBTRACTIVE)

/**
  Macro that checks whether device is a 16550-compatible serial controller.

  @param  _p      Specified device.

  @retval TRUE    Device is a 16550-compatible serial controller.
  @retval FALSE   Device is not a 16550-compatible serial controller.

**/
#define IS_PCI_16550_SERIAL(_p)  IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)

/**
  Macro that checks whether device is a Universal Serial Bus controller.

  @param  _p      Specified device.

  @retval TRUE    Device is a Universal Serial Bus controller.
  @retval FALSE   Device is not a Universal Serial Bus controller.

**/
#define IS_PCI_USB(_p)  IS_CLASS2 (_p, PCI_CLASS_SERIAL, PCI_CLASS_SERIAL_USB)

//
// the definition of Header Type
//
#define HEADER_TYPE_DEVICE             0x00
#define HEADER_TYPE_PCI_TO_PCI_BRIDGE  0x01
#define HEADER_TYPE_CARDBUS_BRIDGE     0x02
#define HEADER_TYPE_MULTI_FUNCTION     0x80
//
// Mask of Header type
//
#define HEADER_LAYOUT_CODE  0x7f

/**
  Macro that checks whether device is a PCI-PCI bridge.

  @param  _p      Specified device.

  @retval TRUE    Device is a PCI-PCI bridge.
  @retval FALSE   Device is not a PCI-PCI bridge.

**/
#define IS_PCI_BRIDGE(_p)  (((_p)->Hdr.HeaderType & HEADER_LAYOUT_CODE) == (HEADER_TYPE_PCI_TO_PCI_BRIDGE))

/**
  Macro that checks whether device is a CardBus bridge.

  @param  _p      Specified device.

  @retval TRUE    Device is a CardBus bridge.
  @retval FALSE   Device is not a CardBus bridge.

**/
#define IS_CARDBUS_BRIDGE(_p)  (((_p)->Hdr.HeaderType & HEADER_LAYOUT_CODE) == (HEADER_TYPE_CARDBUS_BRIDGE))

/**
  Macro that checks whether device is a multiple functions device.

  @param  _p      Specified device.

  @retval TRUE    Device is a multiple functions device.
  @retval FALSE   Device is not a multiple functions device.

**/
#define IS_PCI_MULTI_FUNC(_p)  ((_p)->Hdr.HeaderType & HEADER_TYPE_MULTI_FUNCTION)

///
/// Rom Base Address in Bridge, defined in PCI-to-PCI Bridge Architecture Specification,
///
#define PCI_BRIDGE_ROMBAR  0x38

#define PCI_MAX_BAR            0x0006
#define PCI_MAX_CONFIG_OFFSET  0x0100

#define PCI_VENDOR_ID_OFFSET            0x00
#define PCI_DEVICE_ID_OFFSET            0x02
#define PCI_COMMAND_OFFSET              0x04
#define PCI_PRIMARY_STATUS_OFFSET       0x06
#define PCI_REVISION_ID_OFFSET          0x08
#define PCI_CLASSCODE_OFFSET            0x09
#define PCI_CACHELINE_SIZE_OFFSET       0x0C
#define PCI_LATENCY_TIMER_OFFSET        0x0D
#define PCI_HEADER_TYPE_OFFSET          0x0E
#define PCI_BIST_OFFSET                 0x0F
#define PCI_BASE_ADDRESSREG_OFFSET      0x10
#define PCI_CARDBUS_CIS_OFFSET          0x28
#define PCI_SVID_OFFSET                 0x2C             ///< SubSystem Vendor id
#define PCI_SUBSYSTEM_VENDOR_ID_OFFSET  0x2C
#define PCI_SID_OFFSET                  0x2E             ///< SubSystem ID
#define PCI_SUBSYSTEM_ID_OFFSET         0x2E
#define PCI_EXPANSION_ROM_BASE          0x30
#define PCI_CAPBILITY_POINTER_OFFSET    0x34
#define PCI_INT_LINE_OFFSET             0x3C             ///< Interrupt Line Register
#define PCI_INT_PIN_OFFSET              0x3D             ///< Interrupt Pin Register
#define PCI_MAXGNT_OFFSET               0x3E             ///< Max Grant Register
#define PCI_MAXLAT_OFFSET               0x3F             ///< Max Latency Register

//
// defined in PCI-to-PCI Bridge Architecture Specification
//
#define PCI_BRIDGE_PRIMARY_BUS_REGISTER_OFFSET      0x18
#define PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET    0x19
#define PCI_BRIDGE_SUBORDINATE_BUS_REGISTER_OFFSET  0x1a
#define PCI_BRIDGE_SECONDARY_LATENCY_TIMER_OFFSET   0x1b
#define PCI_BRIDGE_STATUS_REGISTER_OFFSET           0x1E
#define PCI_BRIDGE_CONTROL_REGISTER_OFFSET          0x3E

///
/// Interrupt Line "Unknown" or "No connection" value defined for x86 based system
///
#define PCI_INT_LINE_UNKNOWN  0xFF

///
/// PCI Access Data Format
///
typedef union {
  struct {
    UINT32    Reg      : 8;
    UINT32    Func     : 3;
    UINT32    Dev      : 5;
    UINT32    Bus      : 8;
    UINT32    Reserved : 7;
    UINT32    Enable   : 1;
  } Bits;
  UINT32    Uint32;
} PCI_CONFIG_ACCESS_CF8;

#pragma pack()

#define EFI_PCI_COMMAND_IO_SPACE                     BIT0      ///< 0x0001
#define EFI_PCI_COMMAND_MEMORY_SPACE                 BIT1      ///< 0x0002
#define EFI_PCI_COMMAND_BUS_MASTER                   BIT2      ///< 0x0004
#define EFI_PCI_COMMAND_SPECIAL_CYCLE                BIT3      ///< 0x0008
#define EFI_PCI_COMMAND_MEMORY_WRITE_AND_INVALIDATE  BIT4      ///< 0x0010
#define EFI_PCI_COMMAND_VGA_PALETTE_SNOOP            BIT5      ///< 0x0020
#define EFI_PCI_COMMAND_PARITY_ERROR_RESPOND         BIT6      ///< 0x0040
#define EFI_PCI_COMMAND_STEPPING_CONTROL             BIT7      ///< 0x0080
#define EFI_PCI_COMMAND_SERR                         BIT8      ///< 0x0100
#define EFI_PCI_COMMAND_FAST_BACK_TO_BACK            BIT9      ///< 0x0200

//
// defined in PCI-to-PCI Bridge Architecture Specification
//
#define EFI_PCI_BRIDGE_CONTROL_PARITY_ERROR_RESPONSE    BIT0   ///< 0x0001
#define EFI_PCI_BRIDGE_CONTROL_SERR                     BIT1   ///< 0x0002
#define EFI_PCI_BRIDGE_CONTROL_ISA                      BIT2   ///< 0x0004
#define EFI_PCI_BRIDGE_CONTROL_VGA                      BIT3   ///< 0x0008
#define EFI_PCI_BRIDGE_CONTROL_VGA_16                   BIT4   ///< 0x0010
#define EFI_PCI_BRIDGE_CONTROL_MASTER_ABORT             BIT5   ///< 0x0020
#define EFI_PCI_BRIDGE_CONTROL_RESET_SECONDARY_BUS      BIT6   ///< 0x0040
#define EFI_PCI_BRIDGE_CONTROL_FAST_BACK_TO_BACK        BIT7   ///< 0x0080
#define EFI_PCI_BRIDGE_CONTROL_PRIMARY_DISCARD_TIMER    BIT8   ///< 0x0100
#define EFI_PCI_BRIDGE_CONTROL_SECONDARY_DISCARD_TIMER  BIT9   ///< 0x0200
#define EFI_PCI_BRIDGE_CONTROL_TIMER_STATUS             BIT10  ///< 0x0400
#define EFI_PCI_BRIDGE_CONTROL_DISCARD_TIMER_SERR       BIT11  ///< 0x0800

//
// Following are the PCI-CARDBUS bridge control bit, defined in PC Card Standard
//
#define EFI_PCI_BRIDGE_CONTROL_IREQINT_ENABLE        BIT7      ///< 0x0080
#define EFI_PCI_BRIDGE_CONTROL_RANGE0_MEMORY_TYPE    BIT8      ///< 0x0100
#define EFI_PCI_BRIDGE_CONTROL_RANGE1_MEMORY_TYPE    BIT9      ///< 0x0200
#define EFI_PCI_BRIDGE_CONTROL_WRITE_POSTING_ENABLE  BIT10     ///< 0x0400

//
// Following are the PCI status control bit
//
#define EFI_PCI_STATUS_CAPABILITY          BIT4                ///< 0x0010
#define EFI_PCI_STATUS_66MZ_CAPABLE        BIT5                ///< 0x0020
#define EFI_PCI_FAST_BACK_TO_BACK_CAPABLE  BIT7                ///< 0x0080
#define EFI_PCI_MASTER_DATA_PARITY_ERROR   BIT8                ///< 0x0100

///
/// defined in PC Card Standard
///
#define EFI_PCI_CARDBUS_BRIDGE_CAPABILITY_PTR  0x14

#pragma pack(1)
//
// PCI Capability List IDs and records
//
#define EFI_PCI_CAPABILITY_ID_PMI      0x01
#define EFI_PCI_CAPABILITY_ID_AGP      0x02
#define EFI_PCI_CAPABILITY_ID_VPD      0x03
#define EFI_PCI_CAPABILITY_ID_SLOTID   0x04
#define EFI_PCI_CAPABILITY_ID_MSI      0x05
#define EFI_PCI_CAPABILITY_ID_HOTPLUG  0x06
#define EFI_PCI_CAPABILITY_ID_SHPC     0x0C

///
/// Capabilities List Header
/// Section 6.7, PCI Local Bus Specification, 2.2
///
typedef struct {
  UINT8    CapabilityID;
  UINT8    NextItemPtr;
} EFI_PCI_CAPABILITY_HDR;

///
/// PMC - Power Management Capabilities
/// Section 3.2.3, PCI Power Management Interface Specification, Revision 1.2
///
typedef union {
  struct {
    UINT16    Version                      : 3;
    UINT16    PmeClock                     : 1;
    UINT16    Reserved                     : 1;
    UINT16    DeviceSpecificInitialization : 1;
    UINT16    AuxCurrent                   : 3;
    UINT16    D1Support                    : 1;
    UINT16    D2Support                    : 1;
    UINT16    PmeSupport                   : 5;
  } Bits;
  UINT16    Data;
} EFI_PCI_PMC;

#define EFI_PCI_PMC_D3_COLD_MASK  (BIT15)

///
/// PMCSR - Power Management Control/Status
/// Section 3.2.4, PCI Power Management Interface Specification, Revision 1.2
///
typedef union {
  struct {
    UINT16    PowerState            : 2;
    UINT16    ReservedForPciExpress : 1;
    UINT16    NoSoftReset           : 1;
    UINT16    Reserved              : 4;
    UINT16    PmeEnable             : 1;
    UINT16    DataSelect            : 4;
    UINT16    DataScale             : 2;
    UINT16    PmeStatus             : 1;
  } Bits;
  UINT16    Data;
} EFI_PCI_PMCSR;

#define PCI_POWER_STATE_D0      0
#define PCI_POWER_STATE_D1      1
#define PCI_POWER_STATE_D2      2
#define PCI_POWER_STATE_D3_HOT  3

///
/// PMCSR_BSE - PMCSR PCI-to-PCI Bridge Support Extensions
/// Section 3.2.5, PCI Power Management Interface Specification, Revision 1.2
///
typedef union {
  struct {
    UINT8    Reserved             : 6;
    UINT8    B2B3                 : 1;
    UINT8    BusPowerClockControl : 1;
  } Bits;
  UINT8    Uint8;
} EFI_PCI_PMCSR_BSE;

///
/// Power Management Register Block Definition
/// Section 3.2, PCI Power Management Interface Specification, Revision 1.2
///
typedef struct {
  EFI_PCI_CAPABILITY_HDR    Hdr;
  EFI_PCI_PMC               PMC;
  EFI_PCI_PMCSR             PMCSR;
  EFI_PCI_PMCSR_BSE         BridgeExtention;
  UINT8                     Data;
} EFI_PCI_CAPABILITY_PMI;

///
/// A.G.P Capability
/// Section 6.1.4, Accelerated Graphics Port Interface Specification, Revision 1.0
///
typedef struct {
  EFI_PCI_CAPABILITY_HDR    Hdr;
  UINT8                     Rev;
  UINT8                     Reserved;
  UINT32                    Status;
  UINT32                    Command;
} EFI_PCI_CAPABILITY_AGP;

///
/// VPD Capability Structure
/// Appendix I, PCI Local Bus Specification, 2.2
///
typedef struct {
  EFI_PCI_CAPABILITY_HDR    Hdr;
  UINT16                    AddrReg;
  UINT32                    DataReg;
} EFI_PCI_CAPABILITY_VPD;

///
/// Slot Numbering Capabilities Register
/// Section 3.2.6, PCI-to-PCI Bridge Architecture Specification, Revision 1.2
///
typedef struct {
  EFI_PCI_CAPABILITY_HDR    Hdr;
  UINT8                     ExpnsSlotReg;
  UINT8                     ChassisNo;
} EFI_PCI_CAPABILITY_SLOTID;

///
/// Message Capability Structure for 32-bit Message Address
/// Section 6.8.1, PCI Local Bus Specification, 2.2
///
typedef struct {
  EFI_PCI_CAPABILITY_HDR    Hdr;
  UINT16                    MsgCtrlReg;
  UINT32                    MsgAddrReg;
  UINT16                    MsgDataReg;
} EFI_PCI_CAPABILITY_MSI32;

///
/// Message Capability Structure for 64-bit Message Address
/// Section 6.8.1, PCI Local Bus Specification, 2.2
///
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,
/// CompactPCI Hot Swap Specification PICMG 2.1, R1.0
///
typedef struct {
  EFI_PCI_CAPABILITY_HDR    Hdr;
  ///
  /// not finished - fields need to go here
  ///
} EFI_PCI_CAPABILITY_HOTPLUG;

#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

///
/// EFI PCI Option ROM definitions
///
#define EFI_ROOT_BRIDGE_LIST                       'eprb'
#define EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE  0x0EF1       ///< defined in UEFI Spec.

#define PCI_EXPANSION_ROM_HEADER_SIGNATURE       0xaa55
#define PCI_DATA_STRUCTURE_SIGNATURE             SIGNATURE_32 ('P', 'C', 'I', 'R')
#define PCI_CODE_TYPE_PCAT_IMAGE                 0x00
#define EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED  0x0001         ///< defined in UEFI spec.

///
/// Standard PCI Expansion ROM Header
/// Section 13.4.2, Unified Extensible Firmware Interface Specification, Version 2.1
///
typedef struct {
  UINT16    Signature;  ///< 0xaa55
  UINT8     Reserved[0x16];
  UINT16    PcirOffset;
} PCI_EXPANSION_ROM_HEADER;

///
/// Legacy ROM Header Extensions
/// Section 6.3.3.1, PCI Local Bus Specification, 2.2
///
typedef struct {
  UINT16    Signature;  ///< 0xaa55
  UINT8     Size512;
  UINT8     InitEntryPoint[3];
  UINT8     Reserved[0x12];
  UINT16    PcirOffset;
} EFI_LEGACY_EXPANSION_ROM_HEADER;

///
/// PCI Data Structure Format
/// Section 6.3.1.2, PCI Local Bus Specification, 2.2
///
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;

///
/// EFI PCI Expansion ROM Header
/// Section 13.4.2, Unified Extensible Firmware Interface Specification, Version 2.1
///
typedef struct {
  UINT16    Signature;  ///< 0xaa55
  UINT16    InitializationSize;
  UINT32    EfiSignature; ///< 0x0EF1
  UINT16    EfiSubsystem;
  UINT16    EfiMachineType;
  UINT16    CompressionType;
  UINT8     Reserved[8];
  UINT16    EfiImageHeaderOffset;
  UINT16    PcirOffset;
} EFI_PCI_EXPANSION_ROM_HEADER;

typedef union {
  UINT8                              *Raw;
  PCI_EXPANSION_ROM_HEADER           *Generic;
  EFI_PCI_EXPANSION_ROM_HEADER       *Efi;
  EFI_LEGACY_EXPANSION_ROM_HEADER    *PcAt;
} EFI_PCI_ROM_HEADER;

#pragma pack()

#endif