1 /** @file 2 Set up ROM Table for PCI Bus module. 3 4 Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "PciBus.h" 16 17 // 18 // PCI ROM image information 19 // 20 typedef struct { 21 EFI_HANDLE ImageHandle; 22 UINTN Seg; 23 UINT8 Bus; 24 UINT8 Dev; 25 UINT8 Func; 26 UINT64 RomAddress; 27 UINT64 RomLength; 28 } EFI_PCI_ROM_IMAGE_MAPPING; 29 30 UINTN mNumberOfPciRomImages = 0; 31 UINTN mMaxNumberOfPciRomImages = 0; 32 EFI_PCI_ROM_IMAGE_MAPPING *mRomImageTable = NULL; 33 34 /** 35 Add the Rom Image to internal database for later PCI light enumeration. 36 37 @param ImageHandle Option Rom image handle. 38 @param Seg Segment of PCI space. 39 @param Bus Bus NO of PCI space. 40 @param Dev Dev NO of PCI space. 41 @param Func Func NO of PCI space. 42 @param RomAddress Base address of OptionRom. 43 @param RomLength Length of rom image. 44 45 **/ 46 VOID 47 PciRomAddImageMapping ( 48 IN EFI_HANDLE ImageHandle, 49 IN UINTN Seg, 50 IN UINT8 Bus, 51 IN UINT8 Dev, 52 IN UINT8 Func, 53 IN UINT64 RomAddress, 54 IN UINT64 RomLength 55 ) 56 { 57 EFI_PCI_ROM_IMAGE_MAPPING *TempMapping; 58 59 if (mNumberOfPciRomImages >= mMaxNumberOfPciRomImages) { 60 61 mMaxNumberOfPciRomImages += 0x20; 62 63 TempMapping = NULL; 64 TempMapping = AllocatePool (mMaxNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING)); 65 if (TempMapping == NULL) { 66 return ; 67 } 68 69 CopyMem (TempMapping, mRomImageTable, mNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING)); 70 71 if (mRomImageTable != NULL) { 72 FreePool (mRomImageTable); 73 } 74 75 mRomImageTable = TempMapping; 76 } 77 78 mRomImageTable[mNumberOfPciRomImages].ImageHandle = ImageHandle; 79 mRomImageTable[mNumberOfPciRomImages].Seg = Seg; 80 mRomImageTable[mNumberOfPciRomImages].Bus = Bus; 81 mRomImageTable[mNumberOfPciRomImages].Dev = Dev; 82 mRomImageTable[mNumberOfPciRomImages].Func = Func; 83 mRomImageTable[mNumberOfPciRomImages].RomAddress = RomAddress; 84 mRomImageTable[mNumberOfPciRomImages].RomLength = RomLength; 85 mNumberOfPciRomImages++; 86 } 87 88 /** 89 Get Option rom driver's mapping for PCI device. 90 91 @param PciIoDevice Device instance. 92 93 @retval TRUE Found Image mapping. 94 @retval FALSE Cannot found image mapping. 95 96 **/ 97 BOOLEAN 98 PciRomGetImageMapping ( 99 IN PCI_IO_DEVICE *PciIoDevice 100 ) 101 { 102 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; 103 UINTN Index; 104 BOOLEAN Found; 105 106 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo; 107 Found = FALSE; 108 109 for (Index = 0; Index < mNumberOfPciRomImages; Index++) { 110 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber && 111 mRomImageTable[Index].Bus == PciIoDevice->BusNumber && 112 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber && 113 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) { 114 Found = TRUE; 115 116 if (mRomImageTable[Index].ImageHandle != NULL) { 117 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle); 118 } else { 119 PciIoDevice->PciIo.RomImage = (VOID *) (UINTN) mRomImageTable[Index].RomAddress; 120 PciIoDevice->PciIo.RomSize = (UINTN) mRomImageTable[Index].RomLength; 121 } 122 } 123 } 124 125 return Found; 126 } 127