1 /** @file
2 
3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
4 
5 
6   This program and the accompanying materials are licensed and made available under
7 
8   the terms and conditions of the BSD License that accompanies this distribution.
9 
10   The full text of the license may be found at
11 
12   http://opensource.org/licenses/bsd-license.php.
13 
14 
15 
16   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 
18   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 
20 
21 
22 
23 Module Name:
24 
25   SlotConfig.c
26 
27 Abstract:
28 
29   Sets platform/SKU specific expansion slot information.
30 
InitializeSlotInfo()31 
32 
33 --*/
34 #include "SlotConfig.h"
35 
36 //
37 // Implementation
38 //
39 VOID
40 InitializeSlotInfo (
41   )
42 {
43   UINT16                              BusSaveState;
44   UINT16                              Vendor;
45   UINT8                               CurrentBus;
46   UINTN                               i;
47   UINTN                               j;
48   EFI_HANDLE                          Handle;
49   EFI_STATUS                          Status;
50   BOOLEAN                             RunNext;
51 
52   //
53   // Loop through the slot table and see if any slots have cards in them
54   //
55   for (i = 0; i < mSlotBridgeTableSize; i++) {
56     //
57     // Initialize variable
58     //
59     RunNext = FALSE;
60 
61     //
62     // Hide mini PCIe slots per SKU
63     //
64     for (j = 0; j < mSlotInformation.NumberOfEntries; j++) {
65       if (mSlotInformation.SlotEntries[j].SmbiosSlotId == mSlotBridgeTable[i].SmbiosSlotId) {
66         if ((mSlotInformation.SlotEntries[j].SmbiosSlotId == 0x02) &&
67             (mBoardFeatures & B_BOARD_FEATURES_NO_MINIPCIE)
68           ) {
69           mSlotInformation.SlotEntries[j].Disabled = TRUE;
70           RunNext = TRUE;
71         }
72         break;
73       }
74     }
75 
76     if (RunNext) {
77       //
78       // Skip slot device detection since the slot is disabled.
79       //
80       continue;
81     }
82 
83     //
84     // Check to see if the bridge has a bus number and assign one if not
85     //
86     BusSaveState = MmPci16 (
87       0,
88       mSlotBridgeTable[i].Bus,
89       mSlotBridgeTable[i].Dev,
90       mSlotBridgeTable[i].Function,
91       PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET
92                             );
93     if (BusSaveState == 0) {
94       //
95       // Assign temp bus number
96       //
97       MmPci16 (
98         0,
99         mSlotBridgeTable[i].Bus,
100         mSlotBridgeTable[i].Dev,
101         mSlotBridgeTable[i].Function,
102         PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET
103         ) = DEF_BUS_CONFIG;
104       CurrentBus = DEF_BUS;
105     } else if (BusSaveState == 0xFFFF) {
106       //
107       // Bridge is disabled so continue with next entry in the table
108       //
109       continue;
110     } else {
111       //
112       // Use existing bus number
113       //
114       CurrentBus = (UINT8) BusSaveState & 0xFF;
115     }
116 
117     //
118     // Check to see if a device is behind the bridge
119     //
120     Vendor = MmPci16 (
121                0,
122                CurrentBus,
123                mSlotBridgeTable[i].TargetDevice,
124                0,
125                0
126                );
127     if (Vendor != 0xFFFF) {
128       //
129       // Device found so make sure the slot is marked that way
130       //
131       for (j = 0; j < mSlotInformation.NumberOfEntries; j++) {
132         if (mSlotInformation.SlotEntries[j].SmbiosSlotId == mSlotBridgeTable[i].SmbiosSlotId) {
133           mSlotInformation.SlotEntries[j].InUse = TRUE;
134           break;
135         }
136       }
137     }
138 
139     //
140     // Restore previous bus information
141     //
142     if (BusSaveState == 0) {
143       MmPci16 (
144         0,
145         mSlotBridgeTable[i].Bus,
146         mSlotBridgeTable[i].Dev,
147         mSlotBridgeTable[i].Function,
148         PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET
149         ) = 0;
150     }
151   }
152 
153   Handle = NULL;
154   Status = gBS->InstallProtocolInterface (
155                   &Handle,
156                   &gEfiSmbiosSlotPopulationGuid,
157                   EFI_NATIVE_INTERFACE,
158                   &mSlotInformation
159                   );
160   ASSERT_EFI_ERROR(Status);
161 
162 }
163