Home | History | Annotate | Download | only in PciHostBridge
      1 /** @file
      2 Do platform initialization for PCI bridge.
      3 
      4 Copyright (c) 2013-2015 Intel Corporation.
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 
     15 **/
     16 
     17 #include "PciHostBridge.h"
     18 
     19 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo;
     20 
     21 EFI_STATUS
     22 ChipsetPreprocessController (
     23   IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL          *This,
     24   IN  EFI_HANDLE                                                RootBridgeHandle,
     25   IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS               PciAddress,
     26   IN  EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE              Phase
     27   )
     28 /*++
     29 
     30 Routine Description:
     31   This function is called for all the PCI controllers that the PCI
     32   bus driver finds. Can be used to Preprogram the controller.
     33 
     34 Arguments:
     35   This             -- The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance
     36   RootBridgeHandle -- The PCI Root Bridge handle
     37   PciBusAddress    -- Address of the controller on the PCI bus
     38   Phase            -- The Phase during resource allocation
     39 
     40 Returns:
     41   EFI_SUCCESS
     42 
     43 --*/
     44 
     45 // GC_TODO:    PciAddress - add argument and description to function comment
     46 //
     47 // GC_TODO:    PciAddress - add argument and description to function comment
     48 //
     49 // GC_TODO:    PciAddress - add argument and description to function comment
     50 //
     51 // GC_TODO:    PciAddress - add argument and description to function comment
     52 //
     53 {
     54 
     55   EFI_STATUS  Status;
     56   UINT8       Latency;
     57   UINT8       CacheLineSize;
     58 
     59   if (mPciRootBridgeIo == NULL) {
     60     //
     61     // Get root bridge in the system.
     62     //
     63     Status = gBS->HandleProtocol (RootBridgeHandle, &gEfiPciRootBridgeIoProtocolGuid, (VOID **) &mPciRootBridgeIo);
     64     ASSERT_EFI_ERROR (Status);
     65   }
     66 
     67   if (Phase == EfiPciBeforeResourceCollection) {
     68     //
     69     // Program the latency register, CLS register
     70     //
     71     PciAddress.Register = PCI_LATENCY_TIMER_OFFSET;
     72     mPciRootBridgeIo->Pci.Read (
     73                             mPciRootBridgeIo,
     74                             EfiPciWidthUint8,
     75                             *((UINT64 *) &PciAddress),
     76                             1,
     77                             &Latency
     78                             );
     79 
     80     //
     81     // PCI-x cards come up with a default latency of 0x40. Don't touch them.
     82     //
     83     if (Latency == 0) {
     84       Latency = DEFAULT_PCI_LATENCY;
     85       mPciRootBridgeIo->Pci.Write (
     86                               mPciRootBridgeIo,
     87                               EfiPciWidthUint8,
     88                               *((UINT64 *) &PciAddress),
     89                               1,
     90                               &Latency
     91                               );
     92     }
     93     //
     94     // Program Cache Line Size as 64bytes
     95     // 16 of DWORDs = 64bytes (0x10)
     96     //
     97     PciAddress.Register = PCI_CACHELINE_SIZE_OFFSET;
     98     CacheLineSize       = 0x10;
     99     mPciRootBridgeIo->Pci.Write (
    100                             mPciRootBridgeIo,
    101                             EfiPciWidthUint8,
    102                             *((UINT64 *) &PciAddress),
    103                             1,
    104                             &CacheLineSize
    105                             );
    106 
    107   }
    108 
    109   return EFI_SUCCESS;
    110 }
    111 
    112 UINT64
    113 GetAllocAttributes (
    114   IN  UINTN        RootBridgeIndex
    115   )
    116 /*++
    117 
    118 Routine Description:
    119 
    120   Returns the Allocation attributes for the BNB Root Bridge.
    121 
    122 Arguments:
    123 
    124   RootBridgeIndex  -  The root bridge number. 0 based.
    125 
    126 Returns:
    127 
    128   EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM | EFI_PCI_HOST_BRIDGE_MEM64_DECODE
    129 
    130 --*/
    131 {
    132   //
    133   // Cannot have more than one Root bridge
    134   //
    135   //ASSERT (RootBridgeIndex == 0);
    136 
    137   //
    138   // PCI Root Bridge does not support separate windows for Non-prefetchable
    139   // and Prefetchable memory. A PCI bus driver needs to include requests for
    140   // Prefetchable memory in the Non-prefetchable memory pool.
    141   // Further TNB does not support 64 bit memory apertures for PCI. BNB
    142   // can only have system memory above 4 GB,
    143   //
    144 
    145     return EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM | EFI_PCI_HOST_BRIDGE_MEM64_DECODE;
    146 }
    147