TianoCore EDK2 master
Loading...
Searching...
No Matches
PciSegmentLib.c
Go to the documentation of this file.
1
10#include <Base.h>
11#include <Library/BaseLib.h>
12#include <Library/DebugLib.h>
13#include <Library/PciLib.h>
15
25#define ASSERT_INVALID_PCI_SEGMENT_ADDRESS(A, M) \
26 ASSERT (((A) & (0xfffffffff0000000ULL | (M))) == 0)
27
33#define PCI_SEGMENT_TO_PCI_ADDRESS(A) ((UINTN) (UINT32) A)
34
53RETURN_STATUS
54EFIAPI
56 IN UINTN Address
57 )
58{
61}
62
76UINT8
77EFIAPI
79 IN UINT64 Address
80 )
81{
83
84 return PciRead8 (PCI_SEGMENT_TO_PCI_ADDRESS (Address));
85}
86
101UINT8
102EFIAPI
104 IN UINT64 Address,
105 IN UINT8 Value
106 )
107{
109
110 return PciWrite8 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), Value);
111}
112
130UINT8
131EFIAPI
133 IN UINT64 Address,
134 IN UINT8 OrData
135 )
136{
137 return PciWrite8 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), (UINT8)(PciSegmentRead8 (Address) | OrData));
138}
139
156UINT8
157EFIAPI
159 IN UINT64 Address,
160 IN UINT8 AndData
161 )
162{
163 return PciSegmentWrite8 (Address, (UINT8)(PciSegmentRead8 (Address) & AndData));
164}
165
186UINT8
187EFIAPI
189 IN UINT64 Address,
190 IN UINT8 AndData,
191 IN UINT8 OrData
192 )
193{
194 return PciSegmentWrite8 (Address, (UINT8)((PciSegmentRead8 (Address) & AndData) | OrData));
195}
196
218UINT8
219EFIAPI
221 IN UINT64 Address,
222 IN UINTN StartBit,
223 IN UINTN EndBit
224 )
225{
226 return BitFieldRead8 (PciSegmentRead8 (Address), StartBit, EndBit);
227}
228
253UINT8
254EFIAPI
256 IN UINT64 Address,
257 IN UINTN StartBit,
258 IN UINTN EndBit,
259 IN UINT8 Value
260 )
261{
262 return PciSegmentWrite8 (
263 Address,
264 BitFieldWrite8 (PciSegmentRead8 (Address), StartBit, EndBit, Value)
265 );
266}
267
295UINT8
296EFIAPI
298 IN UINT64 Address,
299 IN UINTN StartBit,
300 IN UINTN EndBit,
301 IN UINT8 OrData
302 )
303{
304 return PciSegmentWrite8 (
305 Address,
306 BitFieldOr8 (PciSegmentRead8 (Address), StartBit, EndBit, OrData)
307 );
308}
309
337UINT8
338EFIAPI
340 IN UINT64 Address,
341 IN UINTN StartBit,
342 IN UINTN EndBit,
343 IN UINT8 AndData
344 )
345{
346 return PciSegmentWrite8 (
347 Address,
348 BitFieldAnd8 (PciSegmentRead8 (Address), StartBit, EndBit, AndData)
349 );
350}
351
382UINT8
383EFIAPI
385 IN UINT64 Address,
386 IN UINTN StartBit,
387 IN UINTN EndBit,
388 IN UINT8 AndData,
389 IN UINT8 OrData
390 )
391{
392 return PciSegmentWrite8 (
393 Address,
394 BitFieldAndThenOr8 (PciSegmentRead8 (Address), StartBit, EndBit, AndData, OrData)
395 );
396}
397
412UINT16
413EFIAPI
415 IN UINT64 Address
416 )
417{
419
420 return PciRead16 (PCI_SEGMENT_TO_PCI_ADDRESS (Address));
421}
422
438UINT16
439EFIAPI
441 IN UINT64 Address,
442 IN UINT16 Value
443 )
444{
446
447 return PciWrite16 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), Value);
448}
449
470UINT16
471EFIAPI
473 IN UINT64 Address,
474 IN UINT16 OrData
475 )
476{
477 return PciSegmentWrite16 (Address, (UINT16)(PciSegmentRead16 (Address) | OrData));
478}
479
498UINT16
499EFIAPI
501 IN UINT64 Address,
502 IN UINT16 AndData
503 )
504{
505 return PciSegmentWrite16 (Address, (UINT16)(PciSegmentRead16 (Address) & AndData));
506}
507
529UINT16
530EFIAPI
532 IN UINT64 Address,
533 IN UINT16 AndData,
534 IN UINT16 OrData
535 )
536{
537 return PciSegmentWrite16 (Address, (UINT16)((PciSegmentRead16 (Address) & AndData) | OrData));
538}
539
562UINT16
563EFIAPI
565 IN UINT64 Address,
566 IN UINTN StartBit,
567 IN UINTN EndBit
568 )
569{
570 return BitFieldRead16 (PciSegmentRead16 (Address), StartBit, EndBit);
571}
572
598UINT16
599EFIAPI
601 IN UINT64 Address,
602 IN UINTN StartBit,
603 IN UINTN EndBit,
604 IN UINT16 Value
605 )
606{
607 return PciSegmentWrite16 (
608 Address,
609 BitFieldWrite16 (PciSegmentRead16 (Address), StartBit, EndBit, Value)
610 );
611}
612
641UINT16
642EFIAPI
644 IN UINT64 Address,
645 IN UINTN StartBit,
646 IN UINTN EndBit,
647 IN UINT16 OrData
648 )
649{
650 return PciSegmentWrite16 (
651 Address,
652 BitFieldOr16 (PciSegmentRead16 (Address), StartBit, EndBit, OrData)
653 );
654}
655
684UINT16
685EFIAPI
687 IN UINT64 Address,
688 IN UINTN StartBit,
689 IN UINTN EndBit,
690 IN UINT16 AndData
691 )
692{
693 return PciSegmentWrite16 (
694 Address,
695 BitFieldAnd16 (PciSegmentRead16 (Address), StartBit, EndBit, AndData)
696 );
697}
698
730UINT16
731EFIAPI
733 IN UINT64 Address,
734 IN UINTN StartBit,
735 IN UINTN EndBit,
736 IN UINT16 AndData,
737 IN UINT16 OrData
738 )
739{
740 return PciSegmentWrite16 (
741 Address,
742 BitFieldAndThenOr16 (PciSegmentRead16 (Address), StartBit, EndBit, AndData, OrData)
743 );
744}
745
760UINT32
761EFIAPI
763 IN UINT64 Address
764 )
765{
767
768 return PciRead32 (PCI_SEGMENT_TO_PCI_ADDRESS (Address));
769}
770
786UINT32
787EFIAPI
789 IN UINT64 Address,
790 IN UINT32 Value
791 )
792{
794
795 return PciWrite32 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), Value);
796}
797
816UINT32
817EFIAPI
819 IN UINT64 Address,
820 IN UINT32 OrData
821 )
822{
823 return PciSegmentWrite32 (Address, PciSegmentRead32 (Address) | OrData);
824}
825
844UINT32
845EFIAPI
847 IN UINT64 Address,
848 IN UINT32 AndData
849 )
850{
851 return PciSegmentWrite32 (Address, PciSegmentRead32 (Address) & AndData);
852}
853
875UINT32
876EFIAPI
878 IN UINT64 Address,
879 IN UINT32 AndData,
880 IN UINT32 OrData
881 )
882{
883 return PciSegmentWrite32 (Address, (PciSegmentRead32 (Address) & AndData) | OrData);
884}
885
908UINT32
909EFIAPI
911 IN UINT64 Address,
912 IN UINTN StartBit,
913 IN UINTN EndBit
914 )
915{
916 return BitFieldRead32 (PciSegmentRead32 (Address), StartBit, EndBit);
917}
918
944UINT32
945EFIAPI
947 IN UINT64 Address,
948 IN UINTN StartBit,
949 IN UINTN EndBit,
950 IN UINT32 Value
951 )
952{
953 return PciSegmentWrite32 (
954 Address,
955 BitFieldWrite32 (PciSegmentRead32 (Address), StartBit, EndBit, Value)
956 );
957}
958
986UINT32
987EFIAPI
989 IN UINT64 Address,
990 IN UINTN StartBit,
991 IN UINTN EndBit,
992 IN UINT32 OrData
993 )
994{
995 return PciSegmentWrite32 (
996 Address,
997 BitFieldOr32 (PciSegmentRead32 (Address), StartBit, EndBit, OrData)
998 );
999}
1000
1028UINT32
1029EFIAPI
1031 IN UINT64 Address,
1032 IN UINTN StartBit,
1033 IN UINTN EndBit,
1034 IN UINT32 AndData
1035 )
1036{
1037 return PciSegmentWrite32 (
1038 Address,
1039 BitFieldAnd32 (PciSegmentRead32 (Address), StartBit, EndBit, AndData)
1040 );
1041}
1042
1074UINT32
1075EFIAPI
1077 IN UINT64 Address,
1078 IN UINTN StartBit,
1079 IN UINTN EndBit,
1080 IN UINT32 AndData,
1081 IN UINT32 OrData
1082 )
1083{
1084 return PciSegmentWrite32 (
1085 Address,
1086 BitFieldAndThenOr32 (PciSegmentRead32 (Address), StartBit, EndBit, AndData, OrData)
1087 );
1088}
1089
1113UINTN
1114EFIAPI
1116 IN UINT64 StartAddress,
1117 IN UINTN Size,
1118 OUT VOID *Buffer
1119 )
1120{
1121 UINTN ReturnValue;
1122
1123 ASSERT_INVALID_PCI_SEGMENT_ADDRESS (StartAddress, 0);
1124 ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
1125
1126 if (Size == 0) {
1127 return Size;
1128 }
1129
1130 ASSERT (Buffer != NULL);
1131
1132 //
1133 // Save Size for return
1134 //
1135 ReturnValue = Size;
1136
1137 if ((StartAddress & BIT0) != 0) {
1138 //
1139 // Read a byte if StartAddress is byte aligned
1140 //
1141 *(volatile UINT8 *)Buffer = PciSegmentRead8 (StartAddress);
1142 StartAddress += sizeof (UINT8);
1143 Size -= sizeof (UINT8);
1144 Buffer = (UINT8 *)Buffer + 1;
1145 }
1146
1147 if ((Size >= sizeof (UINT16)) && ((StartAddress & BIT1) != 0)) {
1148 //
1149 // Read a word if StartAddress is word aligned
1150 //
1151 WriteUnaligned16 (Buffer, PciSegmentRead16 (StartAddress));
1152 StartAddress += sizeof (UINT16);
1153 Size -= sizeof (UINT16);
1154 Buffer = (UINT16 *)Buffer + 1;
1155 }
1156
1157 while (Size >= sizeof (UINT32)) {
1158 //
1159 // Read as many double words as possible
1160 //
1161 WriteUnaligned32 (Buffer, PciSegmentRead32 (StartAddress));
1162 StartAddress += sizeof (UINT32);
1163 Size -= sizeof (UINT32);
1164 Buffer = (UINT32 *)Buffer + 1;
1165 }
1166
1167 if (Size >= sizeof (UINT16)) {
1168 //
1169 // Read the last remaining word if exist
1170 //
1171 WriteUnaligned16 (Buffer, PciSegmentRead16 (StartAddress));
1172 StartAddress += sizeof (UINT16);
1173 Size -= sizeof (UINT16);
1174 Buffer = (UINT16 *)Buffer + 1;
1175 }
1176
1177 if (Size >= sizeof (UINT8)) {
1178 //
1179 // Read the last remaining byte if exist
1180 //
1181 *(volatile UINT8 *)Buffer = PciSegmentRead8 (StartAddress);
1182 }
1183
1184 return ReturnValue;
1185}
1186
1211UINTN
1212EFIAPI
1214 IN UINT64 StartAddress,
1215 IN UINTN Size,
1216 IN VOID *Buffer
1217 )
1218{
1219 UINTN ReturnValue;
1220
1221 ASSERT_INVALID_PCI_SEGMENT_ADDRESS (StartAddress, 0);
1222 ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
1223
1224 if (Size == 0) {
1225 return 0;
1226 }
1227
1228 ASSERT (Buffer != NULL);
1229
1230 //
1231 // Save Size for return
1232 //
1233 ReturnValue = Size;
1234
1235 if ((StartAddress & BIT0) != 0) {
1236 //
1237 // Write a byte if StartAddress is byte aligned
1238 //
1239 PciSegmentWrite8 (StartAddress, *(UINT8 *)Buffer);
1240 StartAddress += sizeof (UINT8);
1241 Size -= sizeof (UINT8);
1242 Buffer = (UINT8 *)Buffer + 1;
1243 }
1244
1245 if ((Size >= sizeof (UINT16)) && ((StartAddress & BIT1) != 0)) {
1246 //
1247 // Write a word if StartAddress is word aligned
1248 //
1249 PciSegmentWrite16 (StartAddress, ReadUnaligned16 (Buffer));
1250 StartAddress += sizeof (UINT16);
1251 Size -= sizeof (UINT16);
1252 Buffer = (UINT16 *)Buffer + 1;
1253 }
1254
1255 while (Size >= sizeof (UINT32)) {
1256 //
1257 // Write as many double words as possible
1258 //
1259 PciSegmentWrite32 (StartAddress, ReadUnaligned32 (Buffer));
1260 StartAddress += sizeof (UINT32);
1261 Size -= sizeof (UINT32);
1262 Buffer = (UINT32 *)Buffer + 1;
1263 }
1264
1265 if (Size >= sizeof (UINT16)) {
1266 //
1267 // Write the last remaining word if exist
1268 //
1269 PciSegmentWrite16 (StartAddress, ReadUnaligned16 (Buffer));
1270 StartAddress += sizeof (UINT16);
1271 Size -= sizeof (UINT16);
1272 Buffer = (UINT16 *)Buffer + 1;
1273 }
1274
1275 if (Size >= sizeof (UINT8)) {
1276 //
1277 // Write the last remaining byte if exist
1278 //
1279 PciSegmentWrite8 (StartAddress, *(UINT8 *)Buffer);
1280 }
1281
1282 return ReturnValue;
1283}
UINT64 UINTN
UINT32 EFIAPI BitFieldAnd32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 AndData)
Definition: BitField.c:639
UINT16 EFIAPI BitFieldAnd16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 AndData)
Definition: BitField.c:447
UINT8 EFIAPI BitFieldAndThenOr8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 AndData, IN UINT8 OrData)
Definition: BitField.c:296
UINT32 EFIAPI BitFieldAndThenOr32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 AndData, IN UINT32 OrData)
Definition: BitField.c:680
UINT32 EFIAPI BitFieldWrite32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 Value)
Definition: BitField.c:563
UINT16 EFIAPI BitFieldAndThenOr16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 AndData, IN UINT16 OrData)
Definition: BitField.c:488
UINT32 EFIAPI BitFieldOr32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 OrData)
Definition: BitField.c:601
UINT16 EFIAPI ReadUnaligned16(IN CONST UINT16 *Buffer)
Definition: Unaligned.c:29
UINT8 EFIAPI BitFieldWrite8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 Value)
Definition: BitField.c:179
UINT8 EFIAPI BitFieldRead8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit)
Definition: BitField.c:143
UINT8 EFIAPI BitFieldAnd8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 AndData)
Definition: BitField.c:255
UINT32 EFIAPI WriteUnaligned32(OUT UINT32 *Buffer, IN UINT32 Value)
Definition: Unaligned.c:177
UINT16 EFIAPI BitFieldWrite16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 Value)
Definition: BitField.c:371
UINT16 EFIAPI WriteUnaligned16(OUT UINT16 *Buffer, IN UINT16 Value)
Definition: Unaligned.c:61
UINT16 EFIAPI BitFieldOr16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 OrData)
Definition: BitField.c:409
UINT16 EFIAPI BitFieldRead16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit)
Definition: BitField.c:335
UINT8 EFIAPI BitFieldOr8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 OrData)
Definition: BitField.c:217
UINT32 EFIAPI BitFieldRead32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit)
Definition: BitField.c:527
UINT32 EFIAPI ReadUnaligned32(IN CONST UINT32 *Buffer)
Definition: Unaligned.c:145
UINT8 EFIAPI PciSegmentRead8(IN UINT64 Address)
Definition: PciSegmentLib.c:78
UINT32 EFIAPI PciSegmentAnd32(IN UINT64 Address, IN UINT32 AndData)
UINT16 EFIAPI PciSegmentWrite16(IN UINT64 Address, IN UINT16 Value)
UINT16 EFIAPI PciSegmentBitFieldAnd16(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 AndData)
UINT32 EFIAPI PciSegmentWrite32(IN UINT64 Address, IN UINT32 Value)
UINT8 EFIAPI PciSegmentBitFieldOr8(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 OrData)
UINT16 EFIAPI PciSegmentBitFieldOr16(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 OrData)
UINTN EFIAPI PciSegmentReadBuffer(IN UINT64 StartAddress, IN UINTN Size, OUT VOID *Buffer)
UINT8 EFIAPI PciSegmentBitFieldAnd8(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 AndData)
UINT16 EFIAPI PciSegmentAnd16(IN UINT64 Address, IN UINT16 AndData)
UINT16 EFIAPI PciSegmentRead16(IN UINT64 Address)
RETURN_STATUS EFIAPI PciSegmentRegisterForRuntimeAccess(IN UINTN Address)
Definition: PciSegmentLib.c:55
UINT32 EFIAPI PciSegmentBitFieldWrite32(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 Value)
UINT8 EFIAPI PciSegmentBitFieldWrite8(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 Value)
UINT16 EFIAPI PciSegmentOr16(IN UINT64 Address, IN UINT16 OrData)
UINT32 EFIAPI PciSegmentBitFieldAndThenOr32(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 AndData, IN UINT32 OrData)
UINT8 EFIAPI PciSegmentBitFieldRead8(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit)
UINT8 EFIAPI PciSegmentOr8(IN UINT64 Address, IN UINT8 OrData)
UINT16 EFIAPI PciSegmentBitFieldAndThenOr16(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 AndData, IN UINT16 OrData)
UINT16 EFIAPI PciSegmentBitFieldRead16(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit)
#define PCI_SEGMENT_TO_PCI_ADDRESS(A)
Definition: PciSegmentLib.c:33
UINT32 EFIAPI PciSegmentAndThenOr32(IN UINT64 Address, IN UINT32 AndData, IN UINT32 OrData)
UINT32 EFIAPI PciSegmentRead32(IN UINT64 Address)
UINT8 EFIAPI PciSegmentAnd8(IN UINT64 Address, IN UINT8 AndData)
UINT8 EFIAPI PciSegmentBitFieldAndThenOr8(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 AndData, IN UINT8 OrData)
UINT32 EFIAPI PciSegmentBitFieldOr32(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 OrData)
UINT16 EFIAPI PciSegmentAndThenOr16(IN UINT64 Address, IN UINT16 AndData, IN UINT16 OrData)
UINT32 EFIAPI PciSegmentBitFieldAnd32(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 AndData)
UINT8 EFIAPI PciSegmentAndThenOr8(IN UINT64 Address, IN UINT8 AndData, IN UINT8 OrData)
#define ASSERT_INVALID_PCI_SEGMENT_ADDRESS(A, M)
Definition: PciSegmentLib.c:25
UINT16 EFIAPI PciSegmentBitFieldWrite16(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 Value)
UINT8 EFIAPI PciSegmentWrite8(IN UINT64 Address, IN UINT8 Value)
UINT32 EFIAPI PciSegmentBitFieldRead32(IN UINT64 Address, IN UINTN StartBit, IN UINTN EndBit)
UINTN EFIAPI PciSegmentWriteBuffer(IN UINT64 StartAddress, IN UINTN Size, IN VOID *Buffer)
UINT32 EFIAPI PciSegmentOr32(IN UINT64 Address, IN UINT32 OrData)
#define NULL
Definition: Base.h:319
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
UINT32 EFIAPI PciRead32(IN UINTN Address)
Definition: PciLib.c:739
RETURN_STATUS EFIAPI PciRegisterForRuntimeAccess(IN UINTN Address)
Definition: PciLib.c:38
UINT8 EFIAPI PciRead8(IN UINTN Address)
Definition: PciLib.c:62
UINT32 EFIAPI PciWrite32(IN UINTN Address, IN UINT32 Value)
Definition: PciLib.c:765
UINT8 EFIAPI PciWrite8(IN UINTN Address, IN UINT8 Value)
Definition: PciLib.c:87
UINT16 EFIAPI PciWrite16(IN UINTN Address, IN UINT16 Value)
Definition: PciLib.c:422
UINT16 EFIAPI PciRead16(IN UINTN Address)
Definition: PciLib.c:396