15UINTN mNumberOfPciRootBridges = 0;
46 PciRootBridgeIo =
NULL;
49 Status =
gBS->LocateHandleBuffer (
51 &gEfiPciRootBridgeIoProtocolGuid,
58 mNumberOfPciRootBridges = HandleCount;
61 ASSERT (mPciRootBridgeData !=
NULL);
67 for (Index = 0; Index < HandleCount; Index++) {
68 Status =
gBS->HandleProtocol (
70 &gEfiPciRootBridgeIoProtocolGuid,
71 (VOID **)&PciRootBridgeIo
75 mPciRootBridgeData[Index].PciRootBridgeIo = PciRootBridgeIo;
76 mPciRootBridgeData[Index].SegmentNumber = PciRootBridgeIo->SegmentNumber;
78 Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **)&Descriptors);
81 while (Descriptors->Desc != ACPI_END_TAG_DESCRIPTOR) {
82 if (Descriptors->ResType == ACPI_ADDRESS_SPACE_TYPE_BUS) {
83 mPciRootBridgeData[Index].MinBusNumber = Descriptors->AddrRangeMin;
84 mPciRootBridgeData[Index].MaxBusNumber = Descriptors->AddrRangeMax;
91 ASSERT (Descriptors->Desc != ACPI_END_TAG_DESCRIPTOR);
141 UINT64 SegmentNumber;
144 for (Index = 0; Index < mNumberOfPciRootBridges; Index++) {
149 if (SegmentNumber == mPciRootBridgeData[Index].SegmentNumber) {
154 if ((BusNumber >= mPciRootBridgeData[Index].MinBusNumber) && (BusNumber <= mPciRootBridgeData[Index].MaxBusNumber)) {
155 return mPciRootBridgeData[Index].PciRootBridgeIo;
188 if (PciRootBridgeIo ==
NULL) {
189 ASSERT (PciRootBridgeIo !=
NULL);
193 PciRootBridgeIo->Pci.
Read (
231 if (PciRootBridgeIo ==
NULL) {
232 ASSERT (PciRootBridgeIo !=
NULL);
236 PciRootBridgeIo->Pci.
Write (
1328 IN UINT64 StartAddress,
1336 ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
1342 ASSERT (Buffer !=
NULL);
1349 if ((StartAddress & BIT0) != 0) {
1354 StartAddress +=
sizeof (UINT8);
1355 Size -=
sizeof (UINT8);
1356 Buffer = (UINT8 *)Buffer + 1;
1359 if ((Size >=
sizeof (UINT16)) && ((StartAddress & BIT1) != 0)) {
1364 StartAddress +=
sizeof (UINT16);
1365 Size -=
sizeof (UINT16);
1366 Buffer = (UINT16 *)Buffer + 1;
1369 while (Size >=
sizeof (UINT32)) {
1374 StartAddress +=
sizeof (UINT32);
1375 Size -=
sizeof (UINT32);
1376 Buffer = (UINT32 *)Buffer + 1;
1379 if (Size >=
sizeof (UINT16)) {
1384 StartAddress +=
sizeof (UINT16);
1385 Size -=
sizeof (UINT16);
1386 Buffer = (UINT16 *)Buffer + 1;
1389 if (Size >=
sizeof (UINT8)) {
1426 IN UINT64 StartAddress,
1434 ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
1440 ASSERT (Buffer !=
NULL);
1447 if ((StartAddress & BIT0) != 0) {
1452 StartAddress +=
sizeof (UINT8);
1453 Size -=
sizeof (UINT8);
1454 Buffer = (UINT8 *)Buffer + 1;
1457 if ((Size >=
sizeof (UINT16)) && ((StartAddress & BIT1) != 0)) {
1462 StartAddress +=
sizeof (UINT16);
1463 Size -=
sizeof (UINT16);
1464 Buffer = (UINT16 *)Buffer + 1;
1467 while (Size >=
sizeof (UINT32)) {
1472 StartAddress +=
sizeof (UINT32);
1473 Size -=
sizeof (UINT32);
1474 Buffer = (UINT32 *)Buffer + 1;
1477 if (Size >=
sizeof (UINT16)) {
1482 StartAddress +=
sizeof (UINT16);
1483 Size -=
sizeof (UINT16);
1484 Buffer = (UINT16 *)Buffer + 1;
1487 if (Size >=
sizeof (UINT8)) {
PACKED struct @89 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
UINT32 EFIAPI BitFieldAnd32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 AndData)
UINT16 EFIAPI BitFieldAnd16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 AndData)
UINT8 EFIAPI BitFieldAndThenOr8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 AndData, IN UINT8 OrData)
UINT32 EFIAPI BitFieldAndThenOr32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 AndData, IN UINT32 OrData)
UINT32 EFIAPI BitFieldWrite32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 Value)
UINT16 EFIAPI BitFieldAndThenOr16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 AndData, IN UINT16 OrData)
UINT32 EFIAPI BitFieldOr32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 OrData)
UINT16 EFIAPI ReadUnaligned16(IN CONST UINT16 *Buffer)
UINT8 EFIAPI BitFieldWrite8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 Value)
UINT8 EFIAPI BitFieldRead8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit)
UINT8 EFIAPI BitFieldAnd8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 AndData)
UINT32 EFIAPI WriteUnaligned32(OUT UINT32 *Buffer, IN UINT32 Value)
UINT16 EFIAPI BitFieldWrite16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 Value)
UINT16 EFIAPI WriteUnaligned16(OUT UINT16 *Buffer, IN UINT16 Value)
UINT64 EFIAPI BitFieldRead64(IN UINT64 Operand, IN UINTN StartBit, IN UINTN EndBit)
UINT16 EFIAPI BitFieldOr16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT16 OrData)
UINT16 EFIAPI BitFieldRead16(IN UINT16 Operand, IN UINTN StartBit, IN UINTN EndBit)
UINT8 EFIAPI BitFieldOr8(IN UINT8 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT8 OrData)
UINT32 EFIAPI BitFieldRead32(IN UINT32 Operand, IN UINTN StartBit, IN UINTN EndBit)
UINT32 EFIAPI ReadUnaligned32(IN CONST UINT32 *Buffer)
UINT8 EFIAPI PciSegmentRead8(IN UINT64 Address)
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)
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)
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)
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)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define RETURN_UNSUPPORTED
#define ASSERT_EFI_ERROR(StatusParameter)
#define PCI_TO_PCI_ROOT_BRIDGE_IO_ADDRESS(A)
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * PciSegmentLibSearchForRootBridge(IN UINT64 Address)
EFI_STATUS EFIAPI PciSegmentLibConstructor(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS EFIAPI PciSegmentLibDestructor(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
UINT32 DxePciSegmentLibPciRootBridgeIoReadWorker(IN UINT64 Address, IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width)
UINT32 DxePciSegmentLibPciRootBridgeIoWriteWorker(IN UINT64 Address, IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, IN UINT32 Data)
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM Write
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM Read