Home | History | Annotate | Download | only in PciBusDxe
      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