]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
Clean up meta data and code scrub for PCI Bus module.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / PciBusDxe / PciRomTable.c
1 /** @file
2 Option Rom Support for PCI Bus Driver
3
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. 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 #include "PciRomTable.h"
17
18 typedef struct {
19 EFI_HANDLE ImageHandle;
20 UINTN Seg;
21 UINT8 Bus;
22 UINT8 Dev;
23 UINT8 Func;
24 UINT64 RomAddress;
25 UINT64 RomLength;
26 } EFI_PCI_ROM_IMAGE_MAPPING;
27
28 UINTN mNumberOfPciRomImages = 0;
29 UINTN mMaxNumberOfPciRomImages = 0;
30 EFI_PCI_ROM_IMAGE_MAPPING *mRomImageTable = NULL;
31
32 /**
33 Add the Rom Image to internal database for later PCI light enumeration.
34
35 @param ImageHandle Option Rom image handle.
36 @param Seg Segment of PCI space.
37 @param Bus Bus NO of PCI space.
38 @param Dev Dev NO of PCI space.
39 @param Func Func NO of PCI space.
40 @param RomAddress Base address of OptionRom.
41 @param RomLength Length of rom image.
42 **/
43 VOID
44 PciRomAddImageMapping (
45 IN EFI_HANDLE ImageHandle,
46 IN UINTN Seg,
47 IN UINT8 Bus,
48 IN UINT8 Dev,
49 IN UINT8 Func,
50 IN UINT64 RomAddress,
51 IN UINT64 RomLength
52 )
53 {
54 EFI_PCI_ROM_IMAGE_MAPPING *TempMapping;
55
56 if (mNumberOfPciRomImages >= mMaxNumberOfPciRomImages) {
57
58 mMaxNumberOfPciRomImages += 0x20;
59
60 TempMapping = NULL;
61 TempMapping = AllocatePool (mMaxNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING));
62 if (TempMapping == NULL) {
63 return ;
64 }
65
66 CopyMem (TempMapping, mRomImageTable, mNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING));
67
68 if (mRomImageTable != NULL) {
69 FreePool (mRomImageTable);
70 }
71
72 mRomImageTable = TempMapping;
73 }
74
75 mRomImageTable[mNumberOfPciRomImages].ImageHandle = ImageHandle;
76 mRomImageTable[mNumberOfPciRomImages].Seg = Seg;
77 mRomImageTable[mNumberOfPciRomImages].Bus = Bus;
78 mRomImageTable[mNumberOfPciRomImages].Dev = Dev;
79 mRomImageTable[mNumberOfPciRomImages].Func = Func;
80 mRomImageTable[mNumberOfPciRomImages].RomAddress = RomAddress;
81 mRomImageTable[mNumberOfPciRomImages].RomLength = RomLength;
82 mNumberOfPciRomImages++;
83 }
84
85 /**
86 Get Option rom driver's mapping for PCI device.
87
88 @param PciIoDevice Device instance.
89
90 @retval TRUE Found Image mapping.
91 @retval FALSE
92
93 **/
94 BOOLEAN
95 PciRomGetImageMapping (
96 PCI_IO_DEVICE *PciIoDevice
97 )
98 {
99 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
100 UINTN Index;
101 BOOLEAN Found;
102
103 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;
104 Found = FALSE;
105
106 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {
107 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&
108 mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&
109 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&
110 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {
111 Found = TRUE;
112
113 if (mRomImageTable[Index].ImageHandle != NULL) {
114 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle);
115 } else {
116 PciIoDevice->PciIo.RomImage = (VOID *) (UINTN) mRomImageTable[Index].RomAddress;
117 PciIoDevice->PciIo.RomSize = (UINTN) mRomImageTable[Index].RomLength;
118 }
119 }
120 }
121
122 return Found;
123 }