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