/** @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; }