• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Provides services to access PCI Configuration Space on a platform with multiple PCI segments.
3 
4   The PCI Segment Library function provide services to read, write, and modify the PCI configuration
5   registers on PCI root bridges on any supported PCI segment.  These library services take a single
6   address parameter that encodes the PCI Segment, PCI Bus, PCI Device, PCI Function, and PCI Register.
7   The layout of this address parameter is as follows:
8 
9             PCI Register: Bits 0..11
10             PCI Function  Bits 12..14
11             PCI Device  Bits 15..19
12             PCI Bus Bits 20..27
13             Reserved  Bits 28..31.  Must be 0.
14             PCI Segment Bits 32..47
15             Reserved  Bits 48..63.  Must be 0.
16 
17   | Reserved (MBZ) | Segment | Reserved (MBZ) |     Bus     | Device | Function | Register |
18   63             48  47    32  31           28 27         20 19    15 14      12 11         0
19 
20   These functions perform PCI configuration cycles using the default PCI configuration access
21   method.  This may use I/O ports 0xCF8 and 0xCFC to perform PCI configuration accesses, or it
22   may use MMIO registers relative to the PcdPciExpressBaseAddress, or it may use some alternate
23   access method.  Modules will typically use the PCI Segment Library for its PCI configuration
24   accesses when PCI Segments other than Segment #0 must be accessed.
25 
26 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
27 This program and the accompanying materials
28 are licensed and made available under the terms and conditions of the BSD License
29 which accompanies this distribution.  The full text of the license may be found at
30 http://opensource.org/licenses/bsd-license.php
31 
32 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
33 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
34 
35 **/
36 
37 #ifndef __PCI_SEGMENT_LIB__
38 #define __PCI_SEGMENT_LIB__
39 
40 
41 /**
42   Macro that converts PCI Segment, PCI Bus, PCI Device, PCI Function,
43   and PCI Register to an address that can be passed to the PCI Segment Library functions.
44 
45   Computes an address that is compatible with the PCI Segment Library functions.
46   The unused upper bits of Segment, Bus, Device, Function,
47   and Register are stripped prior to the generation of the address.
48 
49   @param  Segment   PCI Segment number.  Range 0..65535.
50   @param  Bus       PCI Bus number.  Range 0..255.
51   @param  Device    PCI Device number.  Range 0..31.
52   @param  Function  PCI Function number.  Range 0..7.
53   @param  Register  PCI Register number.  Range 0..255 for PCI.  Range 0..4095 for PCI Express.
54 
55   @return The address that is compatible with the PCI Segment Library functions.
56 
57 **/
58 #define PCI_SEGMENT_LIB_ADDRESS(Segment,Bus,Device,Function,Register) \
59   ( ((Register) & 0xfff)              | \
60     (((Function) & 0x07) << 12)       | \
61     (((Device) & 0x1f) << 15)         | \
62     (((Bus) & 0xff) << 20)            | \
63     (LShiftU64((Segment) & 0xffff, 32)) \
64   )
65 
66 /**
67   Register a PCI device so PCI configuration registers may be accessed after
68   SetVirtualAddressMap().
69 
70   If any reserved bits in Address are set, then ASSERT().
71 
72   @param  Address Address that encodes the PCI Bus, Device, Function and
73                   Register.
74 
75   @retval RETURN_SUCCESS           The PCI device was registered for runtime access.
76   @retval RETURN_UNSUPPORTED       An attempt was made to call this function
77                                    after ExitBootServices().
78   @retval RETURN_UNSUPPORTED       The resources required to access the PCI device
79                                    at runtime could not be mapped.
80   @retval RETURN_OUT_OF_RESOURCES  There are not enough resources available to
81                                    complete the registration.
82 
83 **/
84 RETURN_STATUS
85 EFIAPI
86 PciSegmentRegisterForRuntimeAccess (
87   IN UINTN  Address
88   );
89 
90 /**
91   Reads an 8-bit PCI configuration register.
92 
93   Reads and returns the 8-bit PCI configuration register specified by Address.
94   This function must guarantee that all PCI read and write operations are serialized.
95 
96   If any reserved bits in Address are set, then ASSERT().
97 
98   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
99 
100   @return The 8-bit PCI configuration register specified by Address.
101 
102 **/
103 UINT8
104 EFIAPI
105 PciSegmentRead8 (
106   IN UINT64                    Address
107   );
108 
109 /**
110   Writes an 8-bit PCI configuration register.
111 
112   Writes the 8-bit PCI configuration register specified by Address with the value specified by Value.
113   Value is returned.  This function must guarantee that all PCI read and write operations are serialized.
114 
115   If any reserved bits in Address are set, then ASSERT().
116 
117   @param  Address     Address that encodes the PCI Segment, Bus, Device, Function, and Register.
118   @param  Value       The value to write.
119 
120   @return The value written to the PCI configuration register.
121 
122 **/
123 UINT8
124 EFIAPI
125 PciSegmentWrite8 (
126   IN UINT64                    Address,
127   IN UINT8                     Value
128   );
129 
130 /**
131   Performs a bitwise OR of an 8-bit PCI configuration register with an 8-bit value.
132 
133   Reads the 8-bit PCI configuration register specified by Address,
134   performs a bitwise OR between the read result and the value specified by OrData,
135   and writes the result to the 8-bit PCI configuration register specified by Address.
136   The value written to the PCI configuration register is returned.
137   This function must guarantee that all PCI read and write operations are serialized.
138 
139   If any reserved bits in Address are set, then ASSERT().
140 
141   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
142   @param  OrData    The value to OR with the PCI configuration register.
143 
144   @return The value written to the PCI configuration register.
145 
146 **/
147 UINT8
148 EFIAPI
149 PciSegmentOr8 (
150   IN UINT64                    Address,
151   IN UINT8                     OrData
152   );
153 
154 /**
155   Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit value.
156 
157   Reads the 8-bit PCI configuration register specified by Address,
158   performs a bitwise AND between the read result and the value specified by AndData,
159   and writes the result to the 8-bit PCI configuration register specified by Address.
160   The value written to the PCI configuration register is returned.
161   This function must guarantee that all PCI read and write operations are serialized.
162   If any reserved bits in Address are set, then ASSERT().
163 
164   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
165   @param  AndData   The value to AND with the PCI configuration register.
166 
167   @return The value written to the PCI configuration register.
168 
169 **/
170 UINT8
171 EFIAPI
172 PciSegmentAnd8 (
173   IN UINT64                    Address,
174   IN UINT8                     AndData
175   );
176 
177 /**
178   Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit value,
179   followed a  bitwise OR with another 8-bit value.
180 
181   Reads the 8-bit PCI configuration register specified by Address,
182   performs a bitwise AND between the read result and the value specified by AndData,
183   performs a bitwise OR between the result of the AND operation and the value specified by OrData,
184   and writes the result to the 8-bit PCI configuration register specified by Address.
185   The value written to the PCI configuration register is returned.
186   This function must guarantee that all PCI read and write operations are serialized.
187 
188   If any reserved bits in Address are set, then ASSERT().
189 
190   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
191   @param  AndData    The value to AND with the PCI configuration register.
192   @param  OrData    The value to OR with the PCI configuration register.
193 
194   @return The value written to the PCI configuration register.
195 
196 **/
197 UINT8
198 EFIAPI
199 PciSegmentAndThenOr8 (
200   IN UINT64                    Address,
201   IN UINT8                     AndData,
202   IN UINT8                     OrData
203   );
204 
205 /**
206   Reads a bit field of a PCI configuration register.
207 
208   Reads the bit field in an 8-bit PCI configuration register. The bit field is
209   specified by the StartBit and the EndBit. The value of the bit field is
210   returned.
211 
212   If any reserved bits in Address are set, then ASSERT().
213   If StartBit is greater than 7, then ASSERT().
214   If EndBit is greater than 7, then ASSERT().
215   If EndBit is less than StartBit, then ASSERT().
216 
217   @param  Address   PCI configuration register to read.
218   @param  StartBit  The ordinal of the least significant bit in the bit field.
219                     Range 0..7.
220   @param  EndBit    The ordinal of the most significant bit in the bit field.
221                     Range 0..7.
222 
223   @return The value of the bit field read from the PCI configuration register.
224 
225 **/
226 UINT8
227 EFIAPI
228 PciSegmentBitFieldRead8 (
229   IN UINT64                    Address,
230   IN UINTN                     StartBit,
231   IN UINTN                     EndBit
232   );
233 
234 /**
235   Writes a bit field to a PCI configuration register.
236 
237   Writes Value to the bit field of the PCI configuration register. The bit
238   field is specified by the StartBit and the EndBit. All other bits in the
239   destination PCI configuration register are preserved. The new value of the
240   8-bit register is returned.
241 
242   If any reserved bits in Address are set, then ASSERT().
243   If StartBit is greater than 7, then ASSERT().
244   If EndBit is greater than 7, then ASSERT().
245   If EndBit is less than StartBit, then ASSERT().
246   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
247 
248   @param  Address   PCI configuration register to write.
249   @param  StartBit  The ordinal of the least significant bit in the bit field.
250                     Range 0..7.
251   @param  EndBit    The ordinal of the most significant bit in the bit field.
252                     Range 0..7.
253   @param  Value     New value of the bit field.
254 
255   @return The value written back to the PCI configuration register.
256 
257 **/
258 UINT8
259 EFIAPI
260 PciSegmentBitFieldWrite8 (
261   IN UINT64                    Address,
262   IN UINTN                     StartBit,
263   IN UINTN                     EndBit,
264   IN UINT8                     Value
265   );
266 
267 /**
268   Reads a bit field in an 8-bit PCI configuration, performs a bitwise OR, and
269   writes the result back to the bit field in the 8-bit port.
270 
271   Reads the 8-bit PCI configuration register specified by Address, performs a
272   bitwise OR between the read result and the value specified by
273   OrData, and writes the result to the 8-bit PCI configuration register
274   specified by Address. The value written to the PCI configuration register is
275   returned. This function must guarantee that all PCI read and write operations
276   are serialized. Extra left bits in OrData are stripped.
277 
278   If any reserved bits in Address are set, then ASSERT().
279   If StartBit is greater than 7, then ASSERT().
280   If EndBit is greater than 7, then ASSERT().
281   If EndBit is less than StartBit, then ASSERT().
282   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
283 
284   @param  Address   PCI configuration register to write.
285   @param  StartBit  The ordinal of the least significant bit in the bit field.
286                     Range 0..7.
287   @param  EndBit    The ordinal of the most significant bit in the bit field.
288                     Range 0..7.
289   @param  OrData    The value to OR with the PCI configuration register.
290 
291   @return The value written back to the PCI configuration register.
292 
293 **/
294 UINT8
295 EFIAPI
296 PciSegmentBitFieldOr8 (
297   IN UINT64                    Address,
298   IN UINTN                     StartBit,
299   IN UINTN                     EndBit,
300   IN UINT8                     OrData
301   );
302 
303 /**
304   Reads a bit field in an 8-bit PCI configuration register, performs a bitwise
305   AND, and writes the result back to the bit field in the 8-bit register.
306 
307   Reads the 8-bit PCI configuration register specified by Address, performs a
308   bitwise AND between the read result and the value specified by AndData, and
309   writes the result to the 8-bit PCI configuration register specified by
310   Address. The value written to the PCI configuration register is returned.
311   This function must guarantee that all PCI read and write operations are
312   serialized. Extra left bits in AndData are stripped.
313 
314   If any reserved bits in Address are set, then ASSERT().
315   If StartBit is greater than 7, then ASSERT().
316   If EndBit is greater than 7, then ASSERT().
317   If EndBit is less than StartBit, then ASSERT().
318   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
319 
320   @param  Address   PCI configuration register to write.
321   @param  StartBit  The ordinal of the least significant bit in the bit field.
322                     Range 0..7.
323   @param  EndBit    The ordinal of the most significant bit in the bit field.
324                     Range 0..7.
325   @param  AndData   The value to AND with the PCI configuration register.
326 
327   @return The value written back to the PCI configuration register.
328 
329 **/
330 UINT8
331 EFIAPI
332 PciSegmentBitFieldAnd8 (
333   IN UINT64                    Address,
334   IN UINTN                     StartBit,
335   IN UINTN                     EndBit,
336   IN UINT8                     AndData
337   );
338 
339 /**
340   Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
341   bitwise OR, and writes the result back to the bit field in the
342   8-bit port.
343 
344   Reads the 8-bit PCI configuration register specified by Address, performs a
345   bitwise AND followed by a bitwise OR between the read result and
346   the value specified by AndData, and writes the result to the 8-bit PCI
347   configuration register specified by Address. The value written to the PCI
348   configuration register is returned. This function must guarantee that all PCI
349   read and write operations are serialized. Extra left bits in both AndData and
350   OrData are stripped.
351 
352   If any reserved bits in Address are set, then ASSERT().
353   If StartBit is greater than 7, then ASSERT().
354   If EndBit is greater than 7, then ASSERT().
355   If EndBit is less than StartBit, then ASSERT().
356   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
357   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
358 
359   @param  Address   PCI configuration register to write.
360   @param  StartBit  The ordinal of the least significant bit in the bit field.
361                     Range 0..7.
362   @param  EndBit    The ordinal of the most significant bit in the bit field.
363                     Range 0..7.
364   @param  AndData   The value to AND with the PCI configuration register.
365   @param  OrData    The value to OR with the result of the AND operation.
366 
367   @return The value written back to the PCI configuration register.
368 
369 **/
370 UINT8
371 EFIAPI
372 PciSegmentBitFieldAndThenOr8 (
373   IN UINT64                    Address,
374   IN UINTN                     StartBit,
375   IN UINTN                     EndBit,
376   IN UINT8                     AndData,
377   IN UINT8                     OrData
378   );
379 
380 /**
381   Reads a 16-bit PCI configuration register.
382 
383   Reads and returns the 16-bit PCI configuration register specified by Address.
384   This function must guarantee that all PCI read and write operations are serialized.
385 
386   If any reserved bits in Address are set, then ASSERT().
387   If Address is not aligned on a 16-bit boundary, then ASSERT().
388 
389   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
390 
391   @return The 16-bit PCI configuration register specified by Address.
392 
393 **/
394 UINT16
395 EFIAPI
396 PciSegmentRead16 (
397   IN UINT64                    Address
398   );
399 
400 /**
401   Writes a 16-bit PCI configuration register.
402 
403   Writes the 16-bit PCI configuration register specified by Address with the value specified by Value.
404   Value is returned.  This function must guarantee that all PCI read and write operations are serialized.
405 
406   If any reserved bits in Address are set, then ASSERT().
407   If Address is not aligned on a 16-bit boundary, then ASSERT().
408 
409   @param  Address     Address that encodes the PCI Segment, Bus, Device, Function, and Register.
410   @param  Value       The value to write.
411 
412   @return The parameter of Value.
413 
414 **/
415 UINT16
416 EFIAPI
417 PciSegmentWrite16 (
418   IN UINT64                    Address,
419   IN UINT16                    Value
420   );
421 
422 /**
423   Performs a bitwise OR of a 16-bit PCI configuration register with
424   a 16-bit value.
425 
426   Reads the 16-bit PCI configuration register specified by Address, performs a
427   bitwise OR between the read result and the value specified by
428   OrData, and writes the result to the 16-bit PCI configuration register
429   specified by Address. The value written to the PCI configuration register is
430   returned. This function must guarantee that all PCI read and write operations
431   are serialized.
432 
433   If any reserved bits in Address are set, then ASSERT().
434   If Address is not aligned on a 16-bit boundary, then ASSERT().
435 
436   @param  Address Address that encodes the PCI Segment, Bus, Device, Function and
437                   Register.
438   @param  OrData  The value to OR with the PCI configuration register.
439 
440   @return The value written back to the PCI configuration register.
441 
442 **/
443 UINT16
444 EFIAPI
445 PciSegmentOr16 (
446   IN UINT64                    Address,
447   IN UINT16                    OrData
448   );
449 
450 /**
451   Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit value.
452 
453   Reads the 16-bit PCI configuration register specified by Address,
454   performs a bitwise AND between the read result and the value specified by AndData,
455   and writes the result to the 16-bit PCI configuration register specified by Address.
456   The value written to the PCI configuration register is returned.
457   This function must guarantee that all PCI read and write operations are serialized.
458 
459   If any reserved bits in Address are set, then ASSERT().
460   If Address is not aligned on a 16-bit boundary, then ASSERT().
461 
462   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
463   @param  AndData   The value to AND with the PCI configuration register.
464 
465   @return The value written to the PCI configuration register.
466 
467 **/
468 UINT16
469 EFIAPI
470 PciSegmentAnd16 (
471   IN UINT64                    Address,
472   IN UINT16                    AndData
473   );
474 
475 /**
476   Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit value,
477   followed a  bitwise OR with another 16-bit value.
478 
479   Reads the 16-bit PCI configuration register specified by Address,
480   performs a bitwise AND between the read result and the value specified by AndData,
481   performs a bitwise OR between the result of the AND operation and the value specified by OrData,
482   and writes the result to the 16-bit PCI configuration register specified by Address.
483   The value written to the PCI configuration register is returned.
484   This function must guarantee that all PCI read and write operations are serialized.
485 
486   If any reserved bits in Address are set, then ASSERT().
487   If Address is not aligned on a 16-bit boundary, then ASSERT().
488 
489   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
490   @param  AndData    The value to AND with the PCI configuration register.
491   @param  OrData    The value to OR with the PCI configuration register.
492 
493   @return The value written to the PCI configuration register.
494 
495 **/
496 UINT16
497 EFIAPI
498 PciSegmentAndThenOr16 (
499   IN UINT64                    Address,
500   IN UINT16                    AndData,
501   IN UINT16                    OrData
502   );
503 
504 /**
505   Reads a bit field of a PCI configuration register.
506 
507   Reads the bit field in a 16-bit PCI configuration register. The bit field is
508   specified by the StartBit and the EndBit. The value of the bit field is
509   returned.
510 
511   If any reserved bits in Address are set, then ASSERT().
512   If Address is not aligned on a 16-bit boundary, then ASSERT().
513   If StartBit is greater than 15, then ASSERT().
514   If EndBit is greater than 15, then ASSERT().
515   If EndBit is less than StartBit, then ASSERT().
516 
517   @param  Address   PCI configuration register to read.
518   @param  StartBit  The ordinal of the least significant bit in the bit field.
519                     Range 0..15.
520   @param  EndBit    The ordinal of the most significant bit in the bit field.
521                     Range 0..15.
522 
523   @return The value of the bit field read from the PCI configuration register.
524 
525 **/
526 UINT16
527 EFIAPI
528 PciSegmentBitFieldRead16 (
529   IN UINT64                    Address,
530   IN UINTN                     StartBit,
531   IN UINTN                     EndBit
532   );
533 
534 /**
535   Writes a bit field to a PCI configuration register.
536 
537   Writes Value to the bit field of the PCI configuration register. The bit
538   field is specified by the StartBit and the EndBit. All other bits in the
539   destination PCI configuration register are preserved. The new value of the
540   16-bit register is returned.
541 
542   If any reserved bits in Address are set, then ASSERT().
543   If Address is not aligned on a 16-bit boundary, then ASSERT().
544   If StartBit is greater than 15, then ASSERT().
545   If EndBit is greater than 15, then ASSERT().
546   If EndBit is less than StartBit, then ASSERT().
547   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
548 
549   @param  Address   PCI configuration register to write.
550   @param  StartBit  The ordinal of the least significant bit in the bit field.
551                     Range 0..15.
552   @param  EndBit    The ordinal of the most significant bit in the bit field.
553                     Range 0..15.
554   @param  Value     New value of the bit field.
555 
556   @return The value written back to the PCI configuration register.
557 
558 **/
559 UINT16
560 EFIAPI
561 PciSegmentBitFieldWrite16 (
562   IN UINT64                    Address,
563   IN UINTN                     StartBit,
564   IN UINTN                     EndBit,
565   IN UINT16                    Value
566   );
567 
568 /**
569   Reads the 16-bit PCI configuration register specified by Address,
570   performs a bitwise OR between the read result and the value specified by OrData,
571   and writes the result to the 16-bit PCI configuration register specified by Address.
572 
573   If any reserved bits in Address are set, then ASSERT().
574   If Address is not aligned on a 16-bit boundary, then ASSERT().
575   If StartBit is greater than 15, then ASSERT().
576   If EndBit is greater than 15, then ASSERT().
577   If EndBit is less than StartBit, then ASSERT().
578   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
579 
580   @param  Address   PCI configuration register to write.
581   @param  StartBit  The ordinal of the least significant bit in the bit field.
582                     Range 0..15.
583   @param  EndBit    The ordinal of the most significant bit in the bit field.
584                     Range 0..15.
585   @param  OrData    The value to OR with the PCI configuration register.
586 
587   @return The value written back to the PCI configuration register.
588 
589 **/
590 UINT16
591 EFIAPI
592 PciSegmentBitFieldOr16 (
593   IN UINT64                    Address,
594   IN UINTN                     StartBit,
595   IN UINTN                     EndBit,
596   IN UINT16                    OrData
597   );
598 
599 /**
600   Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR,
601   and writes the result back to the bit field in the 16-bit port.
602 
603   Reads the 16-bit PCI configuration register specified by Address,
604   performs a bitwise OR between the read result and the value specified by OrData,
605   and writes the result to the 16-bit PCI configuration register specified by Address.
606   The value written to the PCI configuration register is returned.
607   This function must guarantee that all PCI read and write operations are serialized.
608   Extra left bits in OrData are stripped.
609 
610   If any reserved bits in Address are set, then ASSERT().
611   If Address is not aligned on a 16-bit boundary, then ASSERT().
612   If StartBit is greater than 7, then ASSERT().
613   If EndBit is greater than 7, then ASSERT().
614   If EndBit is less than StartBit, then ASSERT().
615   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
616 
617   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
618   @param  StartBit  The ordinal of the least significant bit in the bit field.
619                     The ordinal of the least significant bit in a byte is bit 0.
620   @param  EndBit    The ordinal of the most significant bit in the bit field.
621                     The ordinal of the most significant bit in a byte is bit 7.
622   @param  AndData   The value to AND with the read value from the PCI configuration register.
623 
624   @return The value written to the PCI configuration register.
625 
626 **/
627 UINT16
628 EFIAPI
629 PciSegmentBitFieldAnd16 (
630   IN UINT64                    Address,
631   IN UINTN                     StartBit,
632   IN UINTN                     EndBit,
633   IN UINT16                    AndData
634   );
635 
636 /**
637   Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
638   bitwise OR, and writes the result back to the bit field in the
639   16-bit port.
640 
641   Reads the 16-bit PCI configuration register specified by Address, performs a
642   bitwise AND followed by a bitwise OR between the read result and
643   the value specified by AndData, and writes the result to the 16-bit PCI
644   configuration register specified by Address. The value written to the PCI
645   configuration register is returned. This function must guarantee that all PCI
646   read and write operations are serialized. Extra left bits in both AndData and
647   OrData are stripped.
648 
649   If any reserved bits in Address are set, then ASSERT().
650   If StartBit is greater than 15, then ASSERT().
651   If EndBit is greater than 15, then ASSERT().
652   If EndBit is less than StartBit, then ASSERT().
653   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
654   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
655 
656   @param  Address   PCI configuration register to write.
657   @param  StartBit  The ordinal of the least significant bit in the bit field.
658                     Range 0..15.
659   @param  EndBit    The ordinal of the most significant bit in the bit field.
660                     Range 0..15.
661   @param  AndData   The value to AND with the PCI configuration register.
662   @param  OrData    The value to OR with the result of the AND operation.
663 
664   @return The value written back to the PCI configuration register.
665 
666 **/
667 UINT16
668 EFIAPI
669 PciSegmentBitFieldAndThenOr16 (
670   IN UINT64                    Address,
671   IN UINTN                     StartBit,
672   IN UINTN                     EndBit,
673   IN UINT16                    AndData,
674   IN UINT16                    OrData
675   );
676 
677 /**
678   Reads a 32-bit PCI configuration register.
679 
680   Reads and returns the 32-bit PCI configuration register specified by Address.
681   This function must guarantee that all PCI read and write operations are serialized.
682 
683   If any reserved bits in Address are set, then ASSERT().
684   If Address is not aligned on a 32-bit boundary, then ASSERT().
685 
686   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
687 
688   @return The 32-bit PCI configuration register specified by Address.
689 
690 **/
691 UINT32
692 EFIAPI
693 PciSegmentRead32 (
694   IN UINT64                    Address
695   );
696 
697 /**
698   Writes a 32-bit PCI configuration register.
699 
700   Writes the 32-bit PCI configuration register specified by Address with the value specified by Value.
701   Value is returned.  This function must guarantee that all PCI read and write operations are serialized.
702 
703   If any reserved bits in Address are set, then ASSERT().
704   If Address is not aligned on a 32-bit boundary, then ASSERT().
705 
706   @param  Address     Address that encodes the PCI Segment, Bus, Device, Function, and Register.
707   @param  Value       The value to write.
708 
709   @return The parameter of Value.
710 
711 **/
712 UINT32
713 EFIAPI
714 PciSegmentWrite32 (
715   IN UINT64                    Address,
716   IN UINT32                    Value
717   );
718 
719 /**
720   Performs a bitwise OR of a 32-bit PCI configuration register with a 32-bit value.
721 
722   Reads the 32-bit PCI configuration register specified by Address,
723   performs a bitwise OR between the read result and the value specified by OrData,
724   and writes the result to the 32-bit PCI configuration register specified by Address.
725   The value written to the PCI configuration register is returned.
726   This function must guarantee that all PCI read and write operations are serialized.
727 
728   If any reserved bits in Address are set, then ASSERT().
729   If Address is not aligned on a 32-bit boundary, then ASSERT().
730 
731   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
732   @param  OrData    The value to OR with the PCI configuration register.
733 
734   @return The value written to the PCI configuration register.
735 
736 **/
737 UINT32
738 EFIAPI
739 PciSegmentOr32 (
740   IN UINT64                    Address,
741   IN UINT32                    OrData
742   );
743 
744 /**
745   Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit value.
746 
747   Reads the 32-bit PCI configuration register specified by Address,
748   performs a bitwise AND between the read result and the value specified by AndData,
749   and writes the result to the 32-bit PCI configuration register specified by Address.
750   The value written to the PCI configuration register is returned.
751   This function must guarantee that all PCI read and write operations are serialized.
752 
753   If any reserved bits in Address are set, then ASSERT().
754   If Address is not aligned on a 32-bit boundary, then ASSERT().
755 
756   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
757   @param  AndData   The value to AND with the PCI configuration register.
758 
759   @return The value written to the PCI configuration register.
760 
761 **/
762 UINT32
763 EFIAPI
764 PciSegmentAnd32 (
765   IN UINT64                    Address,
766   IN UINT32                    AndData
767   );
768 
769 /**
770   Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit value,
771   followed a  bitwise OR with another 32-bit value.
772 
773   Reads the 32-bit PCI configuration register specified by Address,
774   performs a bitwise AND between the read result and the value specified by AndData,
775   performs a bitwise OR between the result of the AND operation and the value specified by OrData,
776   and writes the result to the 32-bit PCI configuration register specified by Address.
777   The value written to the PCI configuration register is returned.
778   This function must guarantee that all PCI read and write operations are serialized.
779 
780   If any reserved bits in Address are set, then ASSERT().
781   If Address is not aligned on a 32-bit boundary, then ASSERT().
782 
783   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.
784   @param  AndData   The value to AND with the PCI configuration register.
785   @param  OrData    The value to OR with the PCI configuration register.
786 
787   @return The value written to the PCI configuration register.
788 
789 **/
790 UINT32
791 EFIAPI
792 PciSegmentAndThenOr32 (
793   IN UINT64                    Address,
794   IN UINT32                    AndData,
795   IN UINT32                    OrData
796   );
797 
798 /**
799   Reads a bit field of a PCI configuration register.
800 
801   Reads the bit field in a 32-bit PCI configuration register. The bit field is
802   specified by the StartBit and the EndBit. The value of the bit field is
803   returned.
804 
805   If any reserved bits in Address are set, then ASSERT().
806   If Address is not aligned on a 32-bit boundary, then ASSERT().
807   If StartBit is greater than 31, then ASSERT().
808   If EndBit is greater than 31, then ASSERT().
809   If EndBit is less than StartBit, then ASSERT().
810 
811   @param  Address   PCI configuration register to read.
812   @param  StartBit  The ordinal of the least significant bit in the bit field.
813                     Range 0..31.
814   @param  EndBit    The ordinal of the most significant bit in the bit field.
815                     Range 0..31.
816 
817   @return The value of the bit field read from the PCI configuration register.
818 
819 **/
820 UINT32
821 EFIAPI
822 PciSegmentBitFieldRead32 (
823   IN UINT64                    Address,
824   IN UINTN                     StartBit,
825   IN UINTN                     EndBit
826   );
827 
828 /**
829   Writes a bit field to a PCI configuration register.
830 
831   Writes Value to the bit field of the PCI configuration register. The bit
832   field is specified by the StartBit and the EndBit. All other bits in the
833   destination PCI configuration register are preserved. The new value of the
834   32-bit register is returned.
835 
836   If any reserved bits in Address are set, then ASSERT().
837   If Address is not aligned on a 32-bit boundary, then ASSERT().
838   If StartBit is greater than 31, then ASSERT().
839   If EndBit is greater than 31, then ASSERT().
840   If EndBit is less than StartBit, then ASSERT().
841   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
842 
843   @param  Address   PCI configuration register to write.
844   @param  StartBit  The ordinal of the least significant bit in the bit field.
845                     Range 0..31.
846   @param  EndBit    The ordinal of the most significant bit in the bit field.
847                     Range 0..31.
848   @param  Value     New value of the bit field.
849 
850   @return The value written back to the PCI configuration register.
851 
852 **/
853 UINT32
854 EFIAPI
855 PciSegmentBitFieldWrite32 (
856   IN UINT64                    Address,
857   IN UINTN                     StartBit,
858   IN UINTN                     EndBit,
859   IN UINT32                    Value
860   );
861 
862 /**
863   Reads a bit field in a 32-bit PCI configuration, performs a bitwise OR, and
864   writes the result back to the bit field in the 32-bit port.
865 
866   Reads the 32-bit PCI configuration register specified by Address, performs a
867   bitwise OR between the read result and the value specified by
868   OrData, and writes the result to the 32-bit PCI configuration register
869   specified by Address. The value written to the PCI configuration register is
870   returned. This function must guarantee that all PCI read and write operations
871   are serialized. Extra left bits in OrData are stripped.
872 
873   If any reserved bits in Address are set, then ASSERT().
874   If StartBit is greater than 31, then ASSERT().
875   If EndBit is greater than 31, then ASSERT().
876   If EndBit is less than StartBit, then ASSERT().
877   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
878 
879   @param  Address   PCI configuration register to write.
880   @param  StartBit  The ordinal of the least significant bit in the bit field.
881                     Range 0..31.
882   @param  EndBit    The ordinal of the most significant bit in the bit field.
883                     Range 0..31.
884   @param  OrData    The value to OR with the PCI configuration register.
885 
886   @return The value written back to the PCI configuration register.
887 
888 **/
889 UINT32
890 EFIAPI
891 PciSegmentBitFieldOr32 (
892   IN UINT64                    Address,
893   IN UINTN                     StartBit,
894   IN UINTN                     EndBit,
895   IN UINT32                    OrData
896   );
897 
898 /**
899   Reads a bit field in a 32-bit PCI configuration register, performs a bitwise
900   AND, and writes the result back to the bit field in the 32-bit register.
901 
902 
903   Reads the 32-bit PCI configuration register specified by Address, performs a bitwise
904   AND between the read result and the value specified by AndData, and writes the result
905   to the 32-bit PCI configuration register specified by Address. The value written to
906   the PCI configuration register is returned.  This function must guarantee that all PCI
907   read and write operations are serialized.  Extra left bits in AndData are stripped.
908   If any reserved bits in Address are set, then ASSERT().
909   If Address is not aligned on a 32-bit boundary, then ASSERT().
910   If StartBit is greater than 31, then ASSERT().
911   If EndBit is greater than 31, then ASSERT().
912   If EndBit is less than StartBit, then ASSERT().
913   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
914 
915   @param  Address   PCI configuration register to write.
916   @param  StartBit  The ordinal of the least significant bit in the bit field.
917                     Range 0..31.
918   @param  EndBit    The ordinal of the most significant bit in the bit field.
919                     Range 0..31.
920   @param  AndData   The value to AND with the PCI configuration register.
921 
922   @return The value written back to the PCI configuration register.
923 
924 **/
925 UINT32
926 EFIAPI
927 PciSegmentBitFieldAnd32 (
928   IN UINT64                    Address,
929   IN UINTN                     StartBit,
930   IN UINTN                     EndBit,
931   IN UINT32                    AndData
932   );
933 
934 /**
935   Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
936   bitwise OR, and writes the result back to the bit field in the
937   32-bit port.
938 
939   Reads the 32-bit PCI configuration register specified by Address, performs a
940   bitwise AND followed by a bitwise OR between the read result and
941   the value specified by AndData, and writes the result to the 32-bit PCI
942   configuration register specified by Address. The value written to the PCI
943   configuration register is returned. This function must guarantee that all PCI
944   read and write operations are serialized. Extra left bits in both AndData and
945   OrData are stripped.
946 
947   If any reserved bits in Address are set, then ASSERT().
948   If StartBit is greater than 31, then ASSERT().
949   If EndBit is greater than 31, then ASSERT().
950   If EndBit is less than StartBit, then ASSERT().
951   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
952   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
953 
954   @param  Address   PCI configuration register to write.
955   @param  StartBit  The ordinal of the least significant bit in the bit field.
956                     Range 0..31.
957   @param  EndBit    The ordinal of the most significant bit in the bit field.
958                     Range 0..31.
959   @param  AndData   The value to AND with the PCI configuration register.
960   @param  OrData    The value to OR with the result of the AND operation.
961 
962   @return The value written back to the PCI configuration register.
963 
964 **/
965 UINT32
966 EFIAPI
967 PciSegmentBitFieldAndThenOr32 (
968   IN UINT64                    Address,
969   IN UINTN                     StartBit,
970   IN UINTN                     EndBit,
971   IN UINT32                    AndData,
972   IN UINT32                    OrData
973   );
974 
975 /**
976   Reads a range of PCI configuration registers into a caller supplied buffer.
977 
978   Reads the range of PCI configuration registers specified by StartAddress and
979   Size into the buffer specified by Buffer. This function only allows the PCI
980   configuration registers from a single PCI function to be read. Size is
981   returned. When possible 32-bit PCI configuration read cycles are used to read
982   from StartAdress to StartAddress + Size. Due to alignment restrictions, 8-bit
983   and 16-bit PCI configuration read cycles may be used at the beginning and the
984   end of the range.
985 
986   If any reserved bits in StartAddress are set, then ASSERT().
987   If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
988   If Size > 0 and Buffer is NULL, then ASSERT().
989 
990   @param  StartAddress  Starting address that encodes the PCI Segment, Bus, Device,
991                         Function and Register.
992   @param  Size          Size in bytes of the transfer.
993   @param  Buffer        Pointer to a buffer receiving the data read.
994 
995   @return Size
996 
997 **/
998 UINTN
999 EFIAPI
1000 PciSegmentReadBuffer (
1001   IN  UINT64                   StartAddress,
1002   IN  UINTN                    Size,
1003   OUT VOID                     *Buffer
1004   );
1005 
1006 /**
1007   Copies the data in a caller supplied buffer to a specified range of PCI
1008   configuration space.
1009 
1010   Writes the range of PCI configuration registers specified by StartAddress and
1011   Size from the buffer specified by Buffer. This function only allows the PCI
1012   configuration registers from a single PCI function to be written. Size is
1013   returned. When possible 32-bit PCI configuration write cycles are used to
1014   write from StartAdress to StartAddress + Size. Due to alignment restrictions,
1015   8-bit and 16-bit PCI configuration write cycles may be used at the beginning
1016   and the end of the range.
1017 
1018   If any reserved bits in StartAddress are set, then ASSERT().
1019   If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
1020   If Size > 0 and Buffer is NULL, then ASSERT().
1021 
1022   @param  StartAddress  Starting address that encodes the PCI Segment, Bus, Device,
1023                         Function and Register.
1024   @param  Size          Size in bytes of the transfer.
1025   @param  Buffer        Pointer to a buffer containing the data to write.
1026 
1027   @return The parameter of Size.
1028 
1029 **/
1030 UINTN
1031 EFIAPI
1032 PciSegmentWriteBuffer (
1033   IN UINT64                    StartAddress,
1034   IN UINTN                     Size,
1035   IN VOID                      *Buffer
1036   );
1037 
1038 #endif
1039