blob: 113501034e799e93c301eefda4a1bcbe0df54754 [file] [log] [blame]
Vishal Bhoj82c80712015-12-15 21:13:33 +05301/** @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
26Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
27This program and the accompanying materials
28are licensed and made available under the terms and conditions of the BSD License
29which accompanies this distribution. The full text of the license may be found at
30http://opensource.org/licenses/bsd-license.php
31
32THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
33WITHOUT 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**/
84RETURN_STATUS
85EFIAPI
86PciSegmentRegisterForRuntimeAccess (
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**/
103UINT8
104EFIAPI
105PciSegmentRead8 (
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**/
123UINT8
124EFIAPI
125PciSegmentWrite8 (
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**/
147UINT8
148EFIAPI
149PciSegmentOr8 (
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**/
170UINT8
171EFIAPI
172PciSegmentAnd8 (
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**/
197UINT8
198EFIAPI
199PciSegmentAndThenOr8 (
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**/
226UINT8
227EFIAPI
228PciSegmentBitFieldRead8 (
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**/
258UINT8
259EFIAPI
260PciSegmentBitFieldWrite8 (
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**/
294UINT8
295EFIAPI
296PciSegmentBitFieldOr8 (
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**/
330UINT8
331EFIAPI
332PciSegmentBitFieldAnd8 (
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**/
370UINT8
371EFIAPI
372PciSegmentBitFieldAndThenOr8 (
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**/
394UINT16
395EFIAPI
396PciSegmentRead16 (
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**/
415UINT16
416EFIAPI
417PciSegmentWrite16 (
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**/
443UINT16
444EFIAPI
445PciSegmentOr16 (
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**/
468UINT16
469EFIAPI
470PciSegmentAnd16 (
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**/
496UINT16
497EFIAPI
498PciSegmentAndThenOr16 (
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**/
526UINT16
527EFIAPI
528PciSegmentBitFieldRead16 (
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**/
559UINT16
560EFIAPI
561PciSegmentBitFieldWrite16 (
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**/
590UINT16
591EFIAPI
592PciSegmentBitFieldOr16 (
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**/
627UINT16
628EFIAPI
629PciSegmentBitFieldAnd16 (
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**/
667UINT16
668EFIAPI
669PciSegmentBitFieldAndThenOr16 (
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**/
691UINT32
692EFIAPI
693PciSegmentRead32 (
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**/
712UINT32
713EFIAPI
714PciSegmentWrite32 (
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**/
737UINT32
738EFIAPI
739PciSegmentOr32 (
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**/
762UINT32
763EFIAPI
764PciSegmentAnd32 (
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**/
790UINT32
791EFIAPI
792PciSegmentAndThenOr32 (
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**/
820UINT32
821EFIAPI
822PciSegmentBitFieldRead32 (
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**/
853UINT32
854EFIAPI
855PciSegmentBitFieldWrite32 (
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**/
889UINT32
890EFIAPI
891PciSegmentBitFieldOr32 (
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**/
925UINT32
926EFIAPI
927PciSegmentBitFieldAnd32 (
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**/
965UINT32
966EFIAPI
967PciSegmentBitFieldAndThenOr32 (
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**/
998UINTN
999EFIAPI
1000PciSegmentReadBuffer (
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**/
1030UINTN
1031EFIAPI
1032PciSegmentWriteBuffer (
1033 IN UINT64 StartAddress,
1034 IN UINTN Size,
1035 IN VOID *Buffer
1036 );
1037
1038#endif