1 /** @file
2 PCI Library functions that use
3 (a) I/O ports 0xCF8 and 0xCFC to perform PCI Configuration cycles, layering
4 on top of one PCI CF8 Library instance; or
5 (b) PCI Library functions that use the 256 MB PCI Express MMIO window to
6 perform PCI Configuration cycles, layering on PCI Express Library.
7
8 The decision is made in the entry point function, based on the OVMF platform
9 type, and then adhered to during the lifetime of the client module.
10
11 Copyright (C) 2016, Red Hat, Inc.
12
13 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
14 This program and the accompanying materials
15 are licensed and made available under the terms and conditions of the BSD License
16 which accompanies this distribution. The full text of the license may be found at
17 http://opensource.org/licenses/bsd-license.php.
18
19 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
20 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21
22 **/
23
24
25 #include <Base.h>
26
27 #include <IndustryStandard/Q35MchIch9.h>
28
29 #include <Library/PciLib.h>
30 #include <Library/PciCf8Lib.h>
31 #include <Library/PciExpressLib.h>
32 #include <Library/PcdLib.h>
33
34 STATIC BOOLEAN mRunningOnQ35;
35
36 RETURN_STATUS
37 EFIAPI
InitializeConfigAccessMethod(VOID)38 InitializeConfigAccessMethod (
39 VOID
40 )
41 {
42 mRunningOnQ35 = (PcdGet16 (PcdOvmfHostBridgePciDevId) ==
43 INTEL_Q35_MCH_DEVICE_ID);
44 return RETURN_SUCCESS;
45 }
46
47 /**
48 Registers a PCI device so PCI configuration registers may be accessed after
49 SetVirtualAddressMap().
50
51 Registers the PCI device specified by Address so all the PCI configuration registers
52 associated with that PCI device may be accessed after SetVirtualAddressMap() is called.
53
54 If Address > 0x0FFFFFFF, then ASSERT().
55
56 @param Address The address that encodes the PCI Bus, Device, Function and
57 Register.
58
59 @retval RETURN_SUCCESS The PCI device was registered for runtime access.
60 @retval RETURN_UNSUPPORTED An attempt was made to call this function
61 after ExitBootServices().
62 @retval RETURN_UNSUPPORTED The resources required to access the PCI device
63 at runtime could not be mapped.
64 @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to
65 complete the registration.
66
67 **/
68 RETURN_STATUS
69 EFIAPI
PciRegisterForRuntimeAccess(IN UINTN Address)70 PciRegisterForRuntimeAccess (
71 IN UINTN Address
72 )
73 {
74 return mRunningOnQ35 ?
75 PciExpressRegisterForRuntimeAccess (Address) :
76 PciCf8RegisterForRuntimeAccess (Address);
77 }
78
79 /**
80 Reads an 8-bit PCI configuration register.
81
82 Reads and returns the 8-bit PCI configuration register specified by Address.
83 This function must guarantee that all PCI read and write operations are
84 serialized.
85
86 If Address > 0x0FFFFFFF, then ASSERT().
87
88 @param Address The address that encodes the PCI Bus, Device, Function and
89 Register.
90
91 @return The read value from the PCI configuration register.
92
93 **/
94 UINT8
95 EFIAPI
PciRead8(IN UINTN Address)96 PciRead8 (
97 IN UINTN Address
98 )
99 {
100 return mRunningOnQ35 ?
101 PciExpressRead8 (Address) :
102 PciCf8Read8 (Address);
103 }
104
105 /**
106 Writes an 8-bit PCI configuration register.
107
108 Writes the 8-bit PCI configuration register specified by Address with the
109 value specified by Value. Value is returned. This function must guarantee
110 that all PCI read and write operations are serialized.
111
112 If Address > 0x0FFFFFFF, then ASSERT().
113
114 @param Address The address that encodes the PCI Bus, Device, Function and
115 Register.
116 @param Value The value to write.
117
118 @return The value written to the PCI configuration register.
119
120 **/
121 UINT8
122 EFIAPI
PciWrite8(IN UINTN Address,IN UINT8 Value)123 PciWrite8 (
124 IN UINTN Address,
125 IN UINT8 Value
126 )
127 {
128 return mRunningOnQ35 ?
129 PciExpressWrite8 (Address, Value) :
130 PciCf8Write8 (Address, Value);
131 }
132
133 /**
134 Performs a bitwise OR of an 8-bit PCI configuration register with
135 an 8-bit value.
136
137 Reads the 8-bit PCI configuration register specified by Address, performs a
138 bitwise OR between the read result and the value specified by
139 OrData, and writes the result to the 8-bit PCI configuration register
140 specified by Address. The value written to the PCI configuration register is
141 returned. This function must guarantee that all PCI read and write operations
142 are serialized.
143
144 If Address > 0x0FFFFFFF, then ASSERT().
145
146 @param Address The address that encodes the PCI Bus, Device, Function and
147 Register.
148 @param OrData The value to OR with the PCI configuration register.
149
150 @return The value written back to the PCI configuration register.
151
152 **/
153 UINT8
154 EFIAPI
PciOr8(IN UINTN Address,IN UINT8 OrData)155 PciOr8 (
156 IN UINTN Address,
157 IN UINT8 OrData
158 )
159 {
160 return mRunningOnQ35 ?
161 PciExpressOr8 (Address, OrData) :
162 PciCf8Or8 (Address, OrData);
163 }
164
165 /**
166 Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit
167 value.
168
169 Reads the 8-bit PCI configuration register specified by Address, performs a
170 bitwise AND between the read result and the value specified by AndData, and
171 writes the result to the 8-bit PCI configuration register specified by
172 Address. The value written to the PCI configuration register is returned.
173 This function must guarantee that all PCI read and write operations are
174 serialized.
175
176 If Address > 0x0FFFFFFF, then ASSERT().
177
178 @param Address The address that encodes the PCI Bus, Device, Function and
179 Register.
180 @param AndData The value to AND with the PCI configuration register.
181
182 @return The value written back to the PCI configuration register.
183
184 **/
185 UINT8
186 EFIAPI
PciAnd8(IN UINTN Address,IN UINT8 AndData)187 PciAnd8 (
188 IN UINTN Address,
189 IN UINT8 AndData
190 )
191 {
192 return mRunningOnQ35 ?
193 PciExpressAnd8 (Address, AndData) :
194 PciCf8And8 (Address, AndData);
195 }
196
197 /**
198 Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit
199 value, followed a bitwise OR with another 8-bit value.
200
201 Reads the 8-bit PCI configuration register specified by Address, performs a
202 bitwise AND between the read result and the value specified by AndData,
203 performs a bitwise OR between the result of the AND operation and
204 the value specified by OrData, and writes the result to the 8-bit PCI
205 configuration register specified by Address. The value written to the PCI
206 configuration register is returned. This function must guarantee that all PCI
207 read and write operations are serialized.
208
209 If Address > 0x0FFFFFFF, then ASSERT().
210
211 @param Address The address that encodes the PCI Bus, Device, Function and
212 Register.
213 @param AndData The value to AND with the PCI configuration register.
214 @param OrData The value to OR with the result of the AND operation.
215
216 @return The value written back to the PCI configuration register.
217
218 **/
219 UINT8
220 EFIAPI
PciAndThenOr8(IN UINTN Address,IN UINT8 AndData,IN UINT8 OrData)221 PciAndThenOr8 (
222 IN UINTN Address,
223 IN UINT8 AndData,
224 IN UINT8 OrData
225 )
226 {
227 return mRunningOnQ35 ?
228 PciExpressAndThenOr8 (Address, AndData, OrData) :
229 PciCf8AndThenOr8 (Address, AndData, OrData);
230 }
231
232 /**
233 Reads a bit field of a PCI configuration register.
234
235 Reads the bit field in an 8-bit PCI configuration register. The bit field is
236 specified by the StartBit and the EndBit. The value of the bit field is
237 returned.
238
239 If Address > 0x0FFFFFFF, then ASSERT().
240 If StartBit is greater than 7, then ASSERT().
241 If EndBit is greater than 7, then ASSERT().
242 If EndBit is less than StartBit, then ASSERT().
243
244 @param Address The PCI configuration register to read.
245 @param StartBit The ordinal of the least significant bit in the bit field.
246 Range 0..7.
247 @param EndBit The ordinal of the most significant bit in the bit field.
248 Range 0..7.
249
250 @return The value of the bit field read from the PCI configuration register.
251
252 **/
253 UINT8
254 EFIAPI
PciBitFieldRead8(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit)255 PciBitFieldRead8 (
256 IN UINTN Address,
257 IN UINTN StartBit,
258 IN UINTN EndBit
259 )
260 {
261 return mRunningOnQ35 ?
262 PciExpressBitFieldRead8 (Address, StartBit, EndBit) :
263 PciCf8BitFieldRead8 (Address, StartBit, EndBit);
264 }
265
266 /**
267 Writes a bit field to a PCI configuration register.
268
269 Writes Value to the bit field of the PCI configuration register. The bit
270 field is specified by the StartBit and the EndBit. All other bits in the
271 destination PCI configuration register are preserved. The new value of the
272 8-bit register is returned.
273
274 If Address > 0x0FFFFFFF, then ASSERT().
275 If StartBit is greater than 7, then ASSERT().
276 If EndBit is greater than 7, then ASSERT().
277 If EndBit is less than StartBit, then ASSERT().
278 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
279
280 @param Address The PCI configuration register to write.
281 @param StartBit The ordinal of the least significant bit in the bit field.
282 Range 0..7.
283 @param EndBit The ordinal of the most significant bit in the bit field.
284 Range 0..7.
285 @param Value The new value of the bit field.
286
287 @return The value written back to the PCI configuration register.
288
289 **/
290 UINT8
291 EFIAPI
PciBitFieldWrite8(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT8 Value)292 PciBitFieldWrite8 (
293 IN UINTN Address,
294 IN UINTN StartBit,
295 IN UINTN EndBit,
296 IN UINT8 Value
297 )
298 {
299 return mRunningOnQ35 ?
300 PciExpressBitFieldWrite8 (Address, StartBit, EndBit, Value) :
301 PciCf8BitFieldWrite8 (Address, StartBit, EndBit, Value);
302 }
303
304 /**
305 Reads a bit field in an 8-bit PCI configuration, performs a bitwise OR, and
306 writes the result back to the bit field in the 8-bit port.
307
308 Reads the 8-bit PCI configuration register specified by Address, performs a
309 bitwise OR between the read result and the value specified by
310 OrData, and writes the result to the 8-bit PCI configuration register
311 specified by Address. The value written to the PCI configuration register is
312 returned. This function must guarantee that all PCI read and write operations
313 are serialized. Extra left bits in OrData are stripped.
314
315 If Address > 0x0FFFFFFF, then ASSERT().
316 If StartBit is greater than 7, then ASSERT().
317 If EndBit is greater than 7, then ASSERT().
318 If EndBit is less than StartBit, then ASSERT().
319 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
320
321 @param Address The PCI configuration register to write.
322 @param StartBit The ordinal of the least significant bit in the bit field.
323 Range 0..7.
324 @param EndBit The ordinal of the most significant bit in the bit field.
325 Range 0..7.
326 @param OrData The value to OR with the PCI configuration register.
327
328 @return The value written back to the PCI configuration register.
329
330 **/
331 UINT8
332 EFIAPI
PciBitFieldOr8(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT8 OrData)333 PciBitFieldOr8 (
334 IN UINTN Address,
335 IN UINTN StartBit,
336 IN UINTN EndBit,
337 IN UINT8 OrData
338 )
339 {
340 return mRunningOnQ35 ?
341 PciExpressBitFieldOr8 (Address, StartBit, EndBit, OrData) :
342 PciCf8BitFieldOr8 (Address, StartBit, EndBit, OrData);
343 }
344
345 /**
346 Reads a bit field in an 8-bit PCI configuration register, performs a bitwise
347 AND, and writes the result back to the bit field in the 8-bit register.
348
349 Reads the 8-bit PCI configuration register specified by Address, performs a
350 bitwise AND between the read result and the value specified by AndData, and
351 writes the result to the 8-bit PCI configuration register specified by
352 Address. The value written to the PCI configuration register is returned.
353 This function must guarantee that all PCI read and write operations are
354 serialized. Extra left bits in AndData are stripped.
355
356 If Address > 0x0FFFFFFF, then ASSERT().
357 If StartBit is greater than 7, then ASSERT().
358 If EndBit is greater than 7, then ASSERT().
359 If EndBit is less than StartBit, then ASSERT().
360 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
361
362 @param Address The PCI configuration register to write.
363 @param StartBit The ordinal of the least significant bit in the bit field.
364 Range 0..7.
365 @param EndBit The ordinal of the most significant bit in the bit field.
366 Range 0..7.
367 @param AndData The value to AND with the PCI configuration register.
368
369 @return The value written back to the PCI configuration register.
370
371 **/
372 UINT8
373 EFIAPI
PciBitFieldAnd8(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT8 AndData)374 PciBitFieldAnd8 (
375 IN UINTN Address,
376 IN UINTN StartBit,
377 IN UINTN EndBit,
378 IN UINT8 AndData
379 )
380 {
381 return mRunningOnQ35 ?
382 PciExpressBitFieldAnd8 (Address, StartBit, EndBit, AndData) :
383 PciCf8BitFieldAnd8 (Address, StartBit, EndBit, AndData);
384 }
385
386 /**
387 Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
388 bitwise OR, and writes the result back to the bit field in the
389 8-bit port.
390
391 Reads the 8-bit PCI configuration register specified by Address, performs a
392 bitwise AND followed by a bitwise OR between the read result and
393 the value specified by AndData, and writes the result to the 8-bit PCI
394 configuration register specified by Address. The value written to the PCI
395 configuration register is returned. This function must guarantee that all PCI
396 read and write operations are serialized. Extra left bits in both AndData and
397 OrData are stripped.
398
399 If Address > 0x0FFFFFFF, then ASSERT().
400 If StartBit is greater than 7, then ASSERT().
401 If EndBit is greater than 7, then ASSERT().
402 If EndBit is less than StartBit, then ASSERT().
403 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
404 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
405
406 @param Address The PCI configuration register to write.
407 @param StartBit The ordinal of the least significant bit in the bit field.
408 Range 0..7.
409 @param EndBit The ordinal of the most significant bit in the bit field.
410 Range 0..7.
411 @param AndData The value to AND with the PCI configuration register.
412 @param OrData The value to OR with the result of the AND operation.
413
414 @return The value written back to the PCI configuration register.
415
416 **/
417 UINT8
418 EFIAPI
PciBitFieldAndThenOr8(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT8 AndData,IN UINT8 OrData)419 PciBitFieldAndThenOr8 (
420 IN UINTN Address,
421 IN UINTN StartBit,
422 IN UINTN EndBit,
423 IN UINT8 AndData,
424 IN UINT8 OrData
425 )
426 {
427 return mRunningOnQ35 ?
428 PciExpressBitFieldAndThenOr8 (Address, StartBit, EndBit, AndData, OrData) :
429 PciCf8BitFieldAndThenOr8 (Address, StartBit, EndBit, AndData, OrData);
430 }
431
432 /**
433 Reads a 16-bit PCI configuration register.
434
435 Reads and returns the 16-bit PCI configuration register specified by Address.
436 This function must guarantee that all PCI read and write operations are
437 serialized.
438
439 If Address > 0x0FFFFFFF, then ASSERT().
440 If Address is not aligned on a 16-bit boundary, then ASSERT().
441
442 @param Address The address that encodes the PCI Bus, Device, Function and
443 Register.
444
445 @return The read value from the PCI configuration register.
446
447 **/
448 UINT16
449 EFIAPI
PciRead16(IN UINTN Address)450 PciRead16 (
451 IN UINTN Address
452 )
453 {
454 return mRunningOnQ35 ?
455 PciExpressRead16 (Address) :
456 PciCf8Read16 (Address);
457 }
458
459 /**
460 Writes a 16-bit PCI configuration register.
461
462 Writes the 16-bit PCI configuration register specified by Address with the
463 value specified by Value. Value is returned. This function must guarantee
464 that all PCI read and write operations are serialized.
465
466 If Address > 0x0FFFFFFF, then ASSERT().
467 If Address is not aligned on a 16-bit boundary, then ASSERT().
468
469 @param Address The address that encodes the PCI Bus, Device, Function and
470 Register.
471 @param Value The value to write.
472
473 @return The value written to the PCI configuration register.
474
475 **/
476 UINT16
477 EFIAPI
PciWrite16(IN UINTN Address,IN UINT16 Value)478 PciWrite16 (
479 IN UINTN Address,
480 IN UINT16 Value
481 )
482 {
483 return mRunningOnQ35 ?
484 PciExpressWrite16 (Address, Value) :
485 PciCf8Write16 (Address, Value);
486 }
487
488 /**
489 Performs a bitwise OR of a 16-bit PCI configuration register with
490 a 16-bit value.
491
492 Reads the 16-bit PCI configuration register specified by Address, performs a
493 bitwise OR between the read result and the value specified by
494 OrData, and writes the result to the 16-bit PCI configuration register
495 specified by Address. The value written to the PCI configuration register is
496 returned. This function must guarantee that all PCI read and write operations
497 are serialized.
498
499 If Address > 0x0FFFFFFF, then ASSERT().
500 If Address is not aligned on a 16-bit boundary, then ASSERT().
501
502 @param Address The address that encodes the PCI Bus, Device, Function and
503 Register.
504 @param OrData The value to OR with the PCI configuration register.
505
506 @return The value written back to the PCI configuration register.
507
508 **/
509 UINT16
510 EFIAPI
PciOr16(IN UINTN Address,IN UINT16 OrData)511 PciOr16 (
512 IN UINTN Address,
513 IN UINT16 OrData
514 )
515 {
516 return mRunningOnQ35 ?
517 PciExpressOr16 (Address, OrData) :
518 PciCf8Or16 (Address, OrData);
519 }
520
521 /**
522 Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit
523 value.
524
525 Reads the 16-bit PCI configuration register specified by Address, performs a
526 bitwise AND between the read result and the value specified by AndData, and
527 writes the result to the 16-bit PCI configuration register specified by
528 Address. The value written to the PCI configuration register is returned.
529 This function must guarantee that all PCI read and write operations are
530 serialized.
531
532 If Address > 0x0FFFFFFF, then ASSERT().
533 If Address is not aligned on a 16-bit boundary, then ASSERT().
534
535 @param Address The address that encodes the PCI Bus, Device, Function and
536 Register.
537 @param AndData The value to AND with the PCI configuration register.
538
539 @return The value written back to the PCI configuration register.
540
541 **/
542 UINT16
543 EFIAPI
PciAnd16(IN UINTN Address,IN UINT16 AndData)544 PciAnd16 (
545 IN UINTN Address,
546 IN UINT16 AndData
547 )
548 {
549 return mRunningOnQ35 ?
550 PciExpressAnd16 (Address, AndData) :
551 PciCf8And16 (Address, AndData);
552 }
553
554 /**
555 Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit
556 value, followed a bitwise OR with another 16-bit value.
557
558 Reads the 16-bit PCI configuration register specified by Address, performs a
559 bitwise AND between the read result and the value specified by AndData,
560 performs a bitwise OR between the result of the AND operation and
561 the value specified by OrData, and writes the result to the 16-bit PCI
562 configuration register specified by Address. The value written to the PCI
563 configuration register is returned. This function must guarantee that all PCI
564 read and write operations are serialized.
565
566 If Address > 0x0FFFFFFF, then ASSERT().
567 If Address is not aligned on a 16-bit boundary, then ASSERT().
568
569 @param Address The address that encodes the PCI Bus, Device, Function and
570 Register.
571 @param AndData The value to AND with the PCI configuration register.
572 @param OrData The value to OR with the result of the AND operation.
573
574 @return The value written back to the PCI configuration register.
575
576 **/
577 UINT16
578 EFIAPI
PciAndThenOr16(IN UINTN Address,IN UINT16 AndData,IN UINT16 OrData)579 PciAndThenOr16 (
580 IN UINTN Address,
581 IN UINT16 AndData,
582 IN UINT16 OrData
583 )
584 {
585 return mRunningOnQ35 ?
586 PciExpressAndThenOr16 (Address, AndData, OrData) :
587 PciCf8AndThenOr16 (Address, AndData, OrData);
588 }
589
590 /**
591 Reads a bit field of a PCI configuration register.
592
593 Reads the bit field in a 16-bit PCI configuration register. The bit field is
594 specified by the StartBit and the EndBit. The value of the bit field is
595 returned.
596
597 If Address > 0x0FFFFFFF, then ASSERT().
598 If Address is not aligned on a 16-bit boundary, then ASSERT().
599 If StartBit is greater than 15, then ASSERT().
600 If EndBit is greater than 15, then ASSERT().
601 If EndBit is less than StartBit, then ASSERT().
602
603 @param Address The PCI configuration register to read.
604 @param StartBit The ordinal of the least significant bit in the bit field.
605 Range 0..15.
606 @param EndBit The ordinal of the most significant bit in the bit field.
607 Range 0..15.
608
609 @return The value of the bit field read from the PCI configuration register.
610
611 **/
612 UINT16
613 EFIAPI
PciBitFieldRead16(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit)614 PciBitFieldRead16 (
615 IN UINTN Address,
616 IN UINTN StartBit,
617 IN UINTN EndBit
618 )
619 {
620 return mRunningOnQ35 ?
621 PciExpressBitFieldRead16 (Address, StartBit, EndBit) :
622 PciCf8BitFieldRead16 (Address, StartBit, EndBit);
623 }
624
625 /**
626 Writes a bit field to a PCI configuration register.
627
628 Writes Value to the bit field of the PCI configuration register. The bit
629 field is specified by the StartBit and the EndBit. All other bits in the
630 destination PCI configuration register are preserved. The new value of the
631 16-bit register is returned.
632
633 If Address > 0x0FFFFFFF, then ASSERT().
634 If Address is not aligned on a 16-bit boundary, then ASSERT().
635 If StartBit is greater than 15, then ASSERT().
636 If EndBit is greater than 15, then ASSERT().
637 If EndBit is less than StartBit, then ASSERT().
638 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
639
640 @param Address The PCI configuration register to write.
641 @param StartBit The ordinal of the least significant bit in the bit field.
642 Range 0..15.
643 @param EndBit The ordinal of the most significant bit in the bit field.
644 Range 0..15.
645 @param Value The new value of the bit field.
646
647 @return The value written back to the PCI configuration register.
648
649 **/
650 UINT16
651 EFIAPI
PciBitFieldWrite16(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT16 Value)652 PciBitFieldWrite16 (
653 IN UINTN Address,
654 IN UINTN StartBit,
655 IN UINTN EndBit,
656 IN UINT16 Value
657 )
658 {
659 return mRunningOnQ35 ?
660 PciExpressBitFieldWrite16 (Address, StartBit, EndBit, Value) :
661 PciCf8BitFieldWrite16 (Address, StartBit, EndBit, Value);
662 }
663
664 /**
665 Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR, and
666 writes the result back to the bit field in the 16-bit port.
667
668 Reads the 16-bit PCI configuration register specified by Address, performs a
669 bitwise OR between the read result and the value specified by
670 OrData, and writes the result to the 16-bit PCI configuration register
671 specified by Address. The value written to the PCI configuration register is
672 returned. This function must guarantee that all PCI read and write operations
673 are serialized. Extra left bits in OrData are stripped.
674
675 If Address > 0x0FFFFFFF, then ASSERT().
676 If Address is not aligned on a 16-bit boundary, then ASSERT().
677 If StartBit is greater than 15, then ASSERT().
678 If EndBit is greater than 15, then ASSERT().
679 If EndBit is less than StartBit, then ASSERT().
680 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
681
682 @param Address The PCI configuration register to write.
683 @param StartBit The ordinal of the least significant bit in the bit field.
684 Range 0..15.
685 @param EndBit The ordinal of the most significant bit in the bit field.
686 Range 0..15.
687 @param OrData The value to OR with the PCI configuration register.
688
689 @return The value written back to the PCI configuration register.
690
691 **/
692 UINT16
693 EFIAPI
PciBitFieldOr16(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT16 OrData)694 PciBitFieldOr16 (
695 IN UINTN Address,
696 IN UINTN StartBit,
697 IN UINTN EndBit,
698 IN UINT16 OrData
699 )
700 {
701 return mRunningOnQ35 ?
702 PciExpressBitFieldOr16 (Address, StartBit, EndBit, OrData) :
703 PciCf8BitFieldOr16 (Address, StartBit, EndBit, OrData);
704 }
705
706 /**
707 Reads a bit field in a 16-bit PCI configuration register, performs a bitwise
708 AND, and writes the result back to the bit field in the 16-bit register.
709
710 Reads the 16-bit PCI configuration register specified by Address, performs a
711 bitwise AND between the read result and the value specified by AndData, and
712 writes the result to the 16-bit PCI configuration register specified by
713 Address. The value written to the PCI configuration register is returned.
714 This function must guarantee that all PCI read and write operations are
715 serialized. Extra left bits in AndData are stripped.
716
717 If Address > 0x0FFFFFFF, then ASSERT().
718 If Address is not aligned on a 16-bit boundary, then ASSERT().
719 If StartBit is greater than 15, then ASSERT().
720 If EndBit is greater than 15, then ASSERT().
721 If EndBit is less than StartBit, then ASSERT().
722 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
723
724 @param Address The PCI configuration register to write.
725 @param StartBit The ordinal of the least significant bit in the bit field.
726 Range 0..15.
727 @param EndBit The ordinal of the most significant bit in the bit field.
728 Range 0..15.
729 @param AndData The value to AND with the PCI configuration register.
730
731 @return The value written back to the PCI configuration register.
732
733 **/
734 UINT16
735 EFIAPI
PciBitFieldAnd16(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT16 AndData)736 PciBitFieldAnd16 (
737 IN UINTN Address,
738 IN UINTN StartBit,
739 IN UINTN EndBit,
740 IN UINT16 AndData
741 )
742 {
743 return mRunningOnQ35 ?
744 PciExpressBitFieldAnd16 (Address, StartBit, EndBit, AndData) :
745 PciCf8BitFieldAnd16 (Address, StartBit, EndBit, AndData);
746 }
747
748 /**
749 Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
750 bitwise OR, and writes the result back to the bit field in the
751 16-bit port.
752
753 Reads the 16-bit PCI configuration register specified by Address, performs a
754 bitwise AND followed by a bitwise OR between the read result and
755 the value specified by AndData, and writes the result to the 16-bit PCI
756 configuration register specified by Address. The value written to the PCI
757 configuration register is returned. This function must guarantee that all PCI
758 read and write operations are serialized. Extra left bits in both AndData and
759 OrData are stripped.
760
761 If Address > 0x0FFFFFFF, then ASSERT().
762 If Address is not aligned on a 16-bit boundary, then ASSERT().
763 If StartBit is greater than 15, then ASSERT().
764 If EndBit is greater than 15, then ASSERT().
765 If EndBit is less than StartBit, then ASSERT().
766 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
767 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
768
769 @param Address The PCI configuration register to write.
770 @param StartBit The ordinal of the least significant bit in the bit field.
771 Range 0..15.
772 @param EndBit The ordinal of the most significant bit in the bit field.
773 Range 0..15.
774 @param AndData The value to AND with the PCI configuration register.
775 @param OrData The value to OR with the result of the AND operation.
776
777 @return The value written back to the PCI configuration register.
778
779 **/
780 UINT16
781 EFIAPI
PciBitFieldAndThenOr16(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT16 AndData,IN UINT16 OrData)782 PciBitFieldAndThenOr16 (
783 IN UINTN Address,
784 IN UINTN StartBit,
785 IN UINTN EndBit,
786 IN UINT16 AndData,
787 IN UINT16 OrData
788 )
789 {
790 return mRunningOnQ35 ?
791 PciExpressBitFieldAndThenOr16 (Address, StartBit, EndBit, AndData, OrData) :
792 PciCf8BitFieldAndThenOr16 (Address, StartBit, EndBit, AndData, OrData);
793 }
794
795 /**
796 Reads a 32-bit PCI configuration register.
797
798 Reads and returns the 32-bit PCI configuration register specified by Address.
799 This function must guarantee that all PCI read and write operations are
800 serialized.
801
802 If Address > 0x0FFFFFFF, then ASSERT().
803 If Address is not aligned on a 32-bit boundary, then ASSERT().
804
805 @param Address The address that encodes the PCI Bus, Device, Function and
806 Register.
807
808 @return The read value from the PCI configuration register.
809
810 **/
811 UINT32
812 EFIAPI
PciRead32(IN UINTN Address)813 PciRead32 (
814 IN UINTN Address
815 )
816 {
817 return mRunningOnQ35 ?
818 PciExpressRead32 (Address) :
819 PciCf8Read32 (Address);
820 }
821
822 /**
823 Writes a 32-bit PCI configuration register.
824
825 Writes the 32-bit PCI configuration register specified by Address with the
826 value specified by Value. Value is returned. This function must guarantee
827 that all PCI read and write operations are serialized.
828
829 If Address > 0x0FFFFFFF, then ASSERT().
830 If Address is not aligned on a 32-bit boundary, then ASSERT().
831
832 @param Address The address that encodes the PCI Bus, Device, Function and
833 Register.
834 @param Value The value to write.
835
836 @return The value written to the PCI configuration register.
837
838 **/
839 UINT32
840 EFIAPI
PciWrite32(IN UINTN Address,IN UINT32 Value)841 PciWrite32 (
842 IN UINTN Address,
843 IN UINT32 Value
844 )
845 {
846 return mRunningOnQ35 ?
847 PciExpressWrite32 (Address, Value) :
848 PciCf8Write32 (Address, Value);
849 }
850
851 /**
852 Performs a bitwise OR of a 32-bit PCI configuration register with
853 a 32-bit value.
854
855 Reads the 32-bit PCI configuration register specified by Address, performs a
856 bitwise OR between the read result and the value specified by
857 OrData, and writes the result to the 32-bit PCI configuration register
858 specified by Address. The value written to the PCI configuration register is
859 returned. This function must guarantee that all PCI read and write operations
860 are serialized.
861
862 If Address > 0x0FFFFFFF, then ASSERT().
863 If Address is not aligned on a 32-bit boundary, then ASSERT().
864
865 @param Address The address that encodes the PCI Bus, Device, Function and
866 Register.
867 @param OrData The value to OR with the PCI configuration register.
868
869 @return The value written back to the PCI configuration register.
870
871 **/
872 UINT32
873 EFIAPI
PciOr32(IN UINTN Address,IN UINT32 OrData)874 PciOr32 (
875 IN UINTN Address,
876 IN UINT32 OrData
877 )
878 {
879 return mRunningOnQ35 ?
880 PciExpressOr32 (Address, OrData) :
881 PciCf8Or32 (Address, OrData);
882 }
883
884 /**
885 Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit
886 value.
887
888 Reads the 32-bit PCI configuration register specified by Address, performs a
889 bitwise AND between the read result and the value specified by AndData, and
890 writes the result to the 32-bit PCI configuration register specified by
891 Address. The value written to the PCI configuration register is returned.
892 This function must guarantee that all PCI read and write operations are
893 serialized.
894
895 If Address > 0x0FFFFFFF, then ASSERT().
896 If Address is not aligned on a 32-bit boundary, then ASSERT().
897
898 @param Address The address that encodes the PCI Bus, Device, Function and
899 Register.
900 @param AndData The value to AND with the PCI configuration register.
901
902 @return The value written back to the PCI configuration register.
903
904 **/
905 UINT32
906 EFIAPI
PciAnd32(IN UINTN Address,IN UINT32 AndData)907 PciAnd32 (
908 IN UINTN Address,
909 IN UINT32 AndData
910 )
911 {
912 return mRunningOnQ35 ?
913 PciExpressAnd32 (Address, AndData) :
914 PciCf8And32 (Address, AndData);
915 }
916
917 /**
918 Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit
919 value, followed a bitwise OR with another 32-bit value.
920
921 Reads the 32-bit PCI configuration register specified by Address, performs a
922 bitwise AND between the read result and the value specified by AndData,
923 performs a bitwise OR between the result of the AND operation and
924 the value specified by OrData, and writes the result to the 32-bit PCI
925 configuration register specified by Address. The value written to the PCI
926 configuration register is returned. This function must guarantee that all PCI
927 read and write operations are serialized.
928
929 If Address > 0x0FFFFFFF, then ASSERT().
930 If Address is not aligned on a 32-bit boundary, then ASSERT().
931
932 @param Address The address that encodes the PCI Bus, Device, Function and
933 Register.
934 @param AndData The value to AND with the PCI configuration register.
935 @param OrData The value to OR with the result of the AND operation.
936
937 @return The value written back to the PCI configuration register.
938
939 **/
940 UINT32
941 EFIAPI
PciAndThenOr32(IN UINTN Address,IN UINT32 AndData,IN UINT32 OrData)942 PciAndThenOr32 (
943 IN UINTN Address,
944 IN UINT32 AndData,
945 IN UINT32 OrData
946 )
947 {
948 return mRunningOnQ35 ?
949 PciExpressAndThenOr32 (Address, AndData, OrData) :
950 PciCf8AndThenOr32 (Address, AndData, OrData);
951 }
952
953 /**
954 Reads a bit field of a PCI configuration register.
955
956 Reads the bit field in a 32-bit PCI configuration register. The bit field is
957 specified by the StartBit and the EndBit. The value of the bit field is
958 returned.
959
960 If Address > 0x0FFFFFFF, then ASSERT().
961 If Address is not aligned on a 32-bit boundary, then ASSERT().
962 If StartBit is greater than 31, then ASSERT().
963 If EndBit is greater than 31, then ASSERT().
964 If EndBit is less than StartBit, then ASSERT().
965
966 @param Address The PCI configuration register to read.
967 @param StartBit The ordinal of the least significant bit in the bit field.
968 Range 0..31.
969 @param EndBit The ordinal of the most significant bit in the bit field.
970 Range 0..31.
971
972 @return The value of the bit field read from the PCI configuration register.
973
974 **/
975 UINT32
976 EFIAPI
PciBitFieldRead32(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit)977 PciBitFieldRead32 (
978 IN UINTN Address,
979 IN UINTN StartBit,
980 IN UINTN EndBit
981 )
982 {
983 return mRunningOnQ35 ?
984 PciExpressBitFieldRead32 (Address, StartBit, EndBit) :
985 PciCf8BitFieldRead32 (Address, StartBit, EndBit);
986 }
987
988 /**
989 Writes a bit field to a PCI configuration register.
990
991 Writes Value to the bit field of the PCI configuration register. The bit
992 field is specified by the StartBit and the EndBit. All other bits in the
993 destination PCI configuration register are preserved. The new value of the
994 32-bit register is returned.
995
996 If Address > 0x0FFFFFFF, then ASSERT().
997 If Address is not aligned on a 32-bit boundary, then ASSERT().
998 If StartBit is greater than 31, then ASSERT().
999 If EndBit is greater than 31, then ASSERT().
1000 If EndBit is less than StartBit, then ASSERT().
1001 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1002
1003 @param Address The PCI configuration register to write.
1004 @param StartBit The ordinal of the least significant bit in the bit field.
1005 Range 0..31.
1006 @param EndBit The ordinal of the most significant bit in the bit field.
1007 Range 0..31.
1008 @param Value The new value of the bit field.
1009
1010 @return The value written back to the PCI configuration register.
1011
1012 **/
1013 UINT32
1014 EFIAPI
PciBitFieldWrite32(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT32 Value)1015 PciBitFieldWrite32 (
1016 IN UINTN Address,
1017 IN UINTN StartBit,
1018 IN UINTN EndBit,
1019 IN UINT32 Value
1020 )
1021 {
1022 return mRunningOnQ35 ?
1023 PciExpressBitFieldWrite32 (Address, StartBit, EndBit, Value) :
1024 PciCf8BitFieldWrite32 (Address, StartBit, EndBit, Value);
1025 }
1026
1027 /**
1028 Reads a bit field in a 32-bit PCI configuration, performs a bitwise OR, and
1029 writes the result back to the bit field in the 32-bit port.
1030
1031 Reads the 32-bit PCI configuration register specified by Address, performs a
1032 bitwise OR between the read result and the value specified by
1033 OrData, and writes the result to the 32-bit PCI configuration register
1034 specified by Address. The value written to the PCI configuration register is
1035 returned. This function must guarantee that all PCI read and write operations
1036 are serialized. Extra left bits in OrData are stripped.
1037
1038 If Address > 0x0FFFFFFF, then ASSERT().
1039 If Address is not aligned on a 32-bit boundary, then ASSERT().
1040 If StartBit is greater than 31, then ASSERT().
1041 If EndBit is greater than 31, then ASSERT().
1042 If EndBit is less than StartBit, then ASSERT().
1043 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1044
1045 @param Address The PCI configuration register to write.
1046 @param StartBit The ordinal of the least significant bit in the bit field.
1047 Range 0..31.
1048 @param EndBit The ordinal of the most significant bit in the bit field.
1049 Range 0..31.
1050 @param OrData The value to OR with the PCI configuration register.
1051
1052 @return The value written back to the PCI configuration register.
1053
1054 **/
1055 UINT32
1056 EFIAPI
PciBitFieldOr32(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT32 OrData)1057 PciBitFieldOr32 (
1058 IN UINTN Address,
1059 IN UINTN StartBit,
1060 IN UINTN EndBit,
1061 IN UINT32 OrData
1062 )
1063 {
1064 return mRunningOnQ35 ?
1065 PciExpressBitFieldOr32 (Address, StartBit, EndBit, OrData) :
1066 PciCf8BitFieldOr32 (Address, StartBit, EndBit, OrData);
1067 }
1068
1069 /**
1070 Reads a bit field in a 32-bit PCI configuration register, performs a bitwise
1071 AND, and writes the result back to the bit field in the 32-bit register.
1072
1073 Reads the 32-bit PCI configuration register specified by Address, performs a
1074 bitwise AND between the read result and the value specified by AndData, and
1075 writes the result to the 32-bit PCI configuration register specified by
1076 Address. The value written to the PCI configuration register is returned.
1077 This function must guarantee that all PCI read and write operations are
1078 serialized. Extra left bits in AndData are stripped.
1079
1080 If Address > 0x0FFFFFFF, then ASSERT().
1081 If Address is not aligned on a 32-bit boundary, then ASSERT().
1082 If StartBit is greater than 31, then ASSERT().
1083 If EndBit is greater than 31, then ASSERT().
1084 If EndBit is less than StartBit, then ASSERT().
1085 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1086
1087 @param Address The PCI configuration register to write.
1088 @param StartBit The ordinal of the least significant bit in the bit field.
1089 Range 0..31.
1090 @param EndBit The ordinal of the most significant bit in the bit field.
1091 Range 0..31.
1092 @param AndData The value to AND with the PCI configuration register.
1093
1094 @return The value written back to the PCI configuration register.
1095
1096 **/
1097 UINT32
1098 EFIAPI
PciBitFieldAnd32(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT32 AndData)1099 PciBitFieldAnd32 (
1100 IN UINTN Address,
1101 IN UINTN StartBit,
1102 IN UINTN EndBit,
1103 IN UINT32 AndData
1104 )
1105 {
1106 return mRunningOnQ35 ?
1107 PciExpressBitFieldAnd32 (Address, StartBit, EndBit, AndData) :
1108 PciCf8BitFieldAnd32 (Address, StartBit, EndBit, AndData);
1109 }
1110
1111 /**
1112 Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
1113 bitwise OR, and writes the result back to the bit field in the
1114 32-bit port.
1115
1116 Reads the 32-bit PCI configuration register specified by Address, performs a
1117 bitwise AND followed by a bitwise OR between the read result and
1118 the value specified by AndData, and writes the result to the 32-bit PCI
1119 configuration register specified by Address. The value written to the PCI
1120 configuration register is returned. This function must guarantee that all PCI
1121 read and write operations are serialized. Extra left bits in both AndData and
1122 OrData are stripped.
1123
1124 If Address > 0x0FFFFFFF, then ASSERT().
1125 If Address is not aligned on a 32-bit boundary, then ASSERT().
1126 If StartBit is greater than 31, then ASSERT().
1127 If EndBit is greater than 31, then ASSERT().
1128 If EndBit is less than StartBit, then ASSERT().
1129 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1130 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1131
1132 @param Address The PCI configuration register to write.
1133 @param StartBit The ordinal of the least significant bit in the bit field.
1134 Range 0..31.
1135 @param EndBit The ordinal of the most significant bit in the bit field.
1136 Range 0..31.
1137 @param AndData The value to AND with the PCI configuration register.
1138 @param OrData The value to OR with the result of the AND operation.
1139
1140 @return The value written back to the PCI configuration register.
1141
1142 **/
1143 UINT32
1144 EFIAPI
PciBitFieldAndThenOr32(IN UINTN Address,IN UINTN StartBit,IN UINTN EndBit,IN UINT32 AndData,IN UINT32 OrData)1145 PciBitFieldAndThenOr32 (
1146 IN UINTN Address,
1147 IN UINTN StartBit,
1148 IN UINTN EndBit,
1149 IN UINT32 AndData,
1150 IN UINT32 OrData
1151 )
1152 {
1153 return mRunningOnQ35 ?
1154 PciExpressBitFieldAndThenOr32 (Address, StartBit, EndBit, AndData, OrData) :
1155 PciCf8BitFieldAndThenOr32 (Address, StartBit, EndBit, AndData, OrData);
1156 }
1157
1158 /**
1159 Reads a range of PCI configuration registers into a caller supplied buffer.
1160
1161 Reads the range of PCI configuration registers specified by StartAddress and
1162 Size into the buffer specified by Buffer. This function only allows the PCI
1163 configuration registers from a single PCI function to be read. Size is
1164 returned. When possible 32-bit PCI configuration read cycles are used to read
1165 from StartAdress to StartAddress + Size. Due to alignment restrictions, 8-bit
1166 and 16-bit PCI configuration read cycles may be used at the beginning and the
1167 end of the range.
1168
1169 If StartAddress > 0x0FFFFFFF, then ASSERT().
1170 If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
1171 If Size > 0 and Buffer is NULL, then ASSERT().
1172
1173 @param StartAddress The starting address that encodes the PCI Bus, Device,
1174 Function and Register.
1175 @param Size The size in bytes of the transfer.
1176 @param Buffer The pointer to a buffer receiving the data read.
1177
1178 @return Size
1179
1180 **/
1181 UINTN
1182 EFIAPI
PciReadBuffer(IN UINTN StartAddress,IN UINTN Size,OUT VOID * Buffer)1183 PciReadBuffer (
1184 IN UINTN StartAddress,
1185 IN UINTN Size,
1186 OUT VOID *Buffer
1187 )
1188 {
1189 return mRunningOnQ35 ?
1190 PciExpressReadBuffer (StartAddress, Size, Buffer) :
1191 PciCf8ReadBuffer (StartAddress, Size, Buffer);
1192 }
1193
1194 /**
1195 Copies the data in a caller supplied buffer to a specified range of PCI
1196 configuration space.
1197
1198 Writes the range of PCI configuration registers specified by StartAddress and
1199 Size from the buffer specified by Buffer. This function only allows the PCI
1200 configuration registers from a single PCI function to be written. Size is
1201 returned. When possible 32-bit PCI configuration write cycles are used to
1202 write from StartAdress to StartAddress + Size. Due to alignment restrictions,
1203 8-bit and 16-bit PCI configuration write cycles may be used at the beginning
1204 and the end of the range.
1205
1206 If StartAddress > 0x0FFFFFFF, then ASSERT().
1207 If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
1208 If Size > 0 and Buffer is NULL, then ASSERT().
1209
1210 @param StartAddress The starting address that encodes the PCI Bus, Device,
1211 Function and Register.
1212 @param Size The size in bytes of the transfer.
1213 @param Buffer The pointer to a buffer containing the data to write.
1214
1215 @return Size written to StartAddress.
1216
1217 **/
1218 UINTN
1219 EFIAPI
PciWriteBuffer(IN UINTN StartAddress,IN UINTN Size,IN VOID * Buffer)1220 PciWriteBuffer (
1221 IN UINTN StartAddress,
1222 IN UINTN Size,
1223 IN VOID *Buffer
1224 )
1225 {
1226 return mRunningOnQ35 ?
1227 PciExpressWriteBuffer (StartAddress, Size, Buffer) :
1228 PciCf8WriteBuffer (StartAddress, Size, Buffer);
1229 }
1230