/** @file * * Copyright (c) 2016, Hisilicon Limited. All rights reserved. * Copyright (c) 2016, Linaro Limited. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include "PcieInit.h" #include #include #include #include extern VOID PcieRegWrite(UINT32 Port, UINTN Offset, UINT32 Value); extern EFI_STATUS PciePortReset(UINT32 HostBridgeNum, UINT32 Port); extern EFI_STATUS PciePortInit (UINT32 soctype, UINT32 HostBridgeNum, PCIE_DRIVER_CFG *PcieCfg); PCIE_DRIVER_CFG gastr_pcie_driver_cfg[PCIE_MAX_ROOTBRIDGE] = { //Port 0 { 0x0, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, //PortInfo }, //Port 1 { 0x1, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, //Port 2 { 0x2, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, //Port 3 { 0x3, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, //Port 4 { 0x4, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, //Port 5 { 0x5, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, //Port 6 { 0x6, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, //Port 7 { 0x7, //Portindex { PCIE_ROOT_COMPLEX, //PortType PCIE_WITDH_X8, //PortWidth PCIE_GEN3_0, //PortGen }, }, }; EFI_STATUS PcieInitEntry ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { UINT32 Port; EFI_STATUS Status = EFI_SUCCESS; UINT32 HostBridgeNum = 0; UINT32 soctype = 0; UINT32 PcieRootBridgeMask; if (!OemIsMpBoot()) { PcieRootBridgeMask = PcdGet32(PcdPcieRootBridgeMask); } else { PcieRootBridgeMask = PcdGet32(PcdPcieRootBridgeMask2P); } soctype = PcdGet32(Pcdsoctype); for (HostBridgeNum = 0; HostBridgeNum < PCIE_MAX_HOSTBRIDGE; HostBridgeNum++) { for (Port = 0; Port < PCIE_MAX_ROOTBRIDGE; Port++) { /* Host Bridge may contain lots of root bridges. Each Host bridge have PCIE_MAX_ROOTBRIDGE root bridges PcieRootBridgeMask have PCIE_MAX_ROOTBRIDGE*HostBridgeNum bits, and each bit stands for this PCIe Port is enable or not */ if (!(((( PcieRootBridgeMask >> (PCIE_MAX_ROOTBRIDGE * HostBridgeNum))) >> Port) & 0x1)) { continue; } Status = PciePortInit(soctype, HostBridgeNum, &gastr_pcie_driver_cfg[Port]); if(EFI_ERROR(Status)) { DEBUG((EFI_D_ERROR, "HostBridge %d, Pcie Port %d Init Failed! \n", HostBridgeNum, Port)); } } } return EFI_SUCCESS; }