/** @file
Default PCI Segment Information Library that returns one segment whose
segment base address equals to PcdPciExpressBaseAddress.
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#define PCI_SEGMENT_INFO_HOB_GUID { \
0x6eab7169, 0x9b21, 0x450e, { 0x99, 0xe8, 0xe, 0xb1, 0x1b, 0x7d, 0xfe, 0xcb } \
}
EFI_GUID mPciSegmentInfoHobGuid = PCI_SEGMENT_INFO_HOB_GUID;
volatile PCI_SEGMENT_INFO mPciSegmentInfo;
/**
Return an array of PCI_SEGMENT_INFO holding the segment information.
Note: The returned array/buffer is owned by callee.
@param Count Return the count of segments.
@retval A callee owned array holding the segment information.
**/
PCI_SEGMENT_INFO *
EFIAPI
GetPciSegmentInfo (
OUT UINTN *Count
)
{
VOID *Hob;
PCI_SEGMENT_INFO *PciSegmentInfo;
if (Count == NULL) {
return NULL;
}
*Count = 1;
Hob = GetFirstGuidHob (&mPciSegmentInfoHobGuid);
if (Hob != NULL) {
PciSegmentInfo = GET_GUID_HOB_DATA(Hob);
} else {
mPciSegmentInfo.SegmentNumber = 0;
mPciSegmentInfo.BaseAddress = PcdGet64(PcdPciExpressBaseAddress);
mPciSegmentInfo.StartBusNumber = 0;
mPciSegmentInfo.EndBusNumber = (UINT8)((PcdGet32 (PcdPciExpressRegionLength) / 0x100000) - 1);
DEBUG ((DEBUG_INFO, "mPciSegmentInfo.BaseAddress - 0x%x\n", mPciSegmentInfo.BaseAddress));
if (mPciSegmentInfo.BaseAddress == 0) {
// Premem phase
PciSegmentInfo = BuildGuidHob (&mPciSegmentInfoHobGuid, sizeof(PCI_SEGMENT_INFO));
ASSERT(PciSegmentInfo != NULL);
if (PciSegmentInfo == NULL) {
return NULL;
}
PciSegmentInfo->SegmentNumber = 0;
PciSegmentInfo->BaseAddress = PcdGet64(PcdPciExpressBaseAddress);
PciSegmentInfo->StartBusNumber = 0;
PciSegmentInfo->EndBusNumber = (UINT8)((PcdGet32 (PcdPciExpressRegionLength) / 0x100000) - 1);
} else {
PciSegmentInfo = (VOID *)&mPciSegmentInfo;
}
}
return PciSegmentInfo;
}