123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /** @file
- Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
- Module Name:
- SlotConfig.c
- Abstract:
- Sets platform/SKU specific expansion slot information.
- --*/
- #include "SlotConfig.h"
- //
- // Implementation
- //
- VOID
- InitializeSlotInfo (
- )
- {
- UINT16 BusSaveState;
- UINT16 Vendor;
- UINT8 CurrentBus;
- UINTN i;
- UINTN j;
- EFI_HANDLE Handle;
- EFI_STATUS Status;
- BOOLEAN RunNext;
- //
- // Loop through the slot table and see if any slots have cards in them
- //
- for (i = 0; i < mSlotBridgeTableSize; i++) {
- //
- // Initialize variable
- //
- RunNext = FALSE;
- //
- // Hide mini PCIe slots per SKU
- //
- for (j = 0; j < mSlotInformation.NumberOfEntries; j++) {
- if (mSlotInformation.SlotEntries[j].SmbiosSlotId == mSlotBridgeTable[i].SmbiosSlotId) {
- if ((mSlotInformation.SlotEntries[j].SmbiosSlotId == 0x02) &&
- (mBoardFeatures & B_BOARD_FEATURES_NO_MINIPCIE)
- ) {
- mSlotInformation.SlotEntries[j].Disabled = TRUE;
- RunNext = TRUE;
- }
- break;
- }
- }
- if (RunNext) {
- //
- // Skip slot device detection since the slot is disabled.
- //
- continue;
- }
- //
- // Check to see if the bridge has a bus number and assign one if not
- //
- BusSaveState = MmPci16 (
- 0,
- mSlotBridgeTable[i].Bus,
- mSlotBridgeTable[i].Dev,
- mSlotBridgeTable[i].Function,
- PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET
- );
- if (BusSaveState == 0) {
- //
- // Assign temp bus number
- //
- MmPci16 (
- 0,
- mSlotBridgeTable[i].Bus,
- mSlotBridgeTable[i].Dev,
- mSlotBridgeTable[i].Function,
- PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET
- ) = DEF_BUS_CONFIG;
- CurrentBus = DEF_BUS;
- } else if (BusSaveState == 0xFFFF) {
- //
- // Bridge is disabled so continue with next entry in the table
- //
- continue;
- } else {
- //
- // Use existing bus number
- //
- CurrentBus = (UINT8) BusSaveState & 0xFF;
- }
- //
- // Check to see if a device is behind the bridge
- //
- Vendor = MmPci16 (
- 0,
- CurrentBus,
- mSlotBridgeTable[i].TargetDevice,
- 0,
- 0
- );
- if (Vendor != 0xFFFF) {
- //
- // Device found so make sure the slot is marked that way
- //
- for (j = 0; j < mSlotInformation.NumberOfEntries; j++) {
- if (mSlotInformation.SlotEntries[j].SmbiosSlotId == mSlotBridgeTable[i].SmbiosSlotId) {
- mSlotInformation.SlotEntries[j].InUse = TRUE;
- break;
- }
- }
- }
- //
- // Restore previous bus information
- //
- if (BusSaveState == 0) {
- MmPci16 (
- 0,
- mSlotBridgeTable[i].Bus,
- mSlotBridgeTable[i].Dev,
- mSlotBridgeTable[i].Function,
- PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET
- ) = 0;
- }
- }
- Handle = NULL;
- Status = gBS->InstallProtocolInterface (
- &Handle,
- &gEfiSmbiosSlotPopulationGuid,
- EFI_NATIVE_INTERFACE,
- &mSlotInformation
- );
- ASSERT_EFI_ERROR(Status);
- }
|