1. Create PlatformDriverOverride in Universal directory.
[people/mcb30/edk2.git] / edk2 / MdeModulePkg / Universal / PlatformDriverOverride / PlatformDriOverrideDxe / PlatformDriOverride.c
1 /** @file\r
2 \r
3 Copyright (c) 2007, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution.  The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8 \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 \r
12 Module Name:\r
13 \r
14     PlatformDriOverride.c\r
15 \r
16 Abstract:\r
17 \r
18 \r
19 **/\r
20 \r
21 \r
22 #include "PlatformDriOverride.h"\r
23 \r
24 EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL gPlatformDriverOverride = {\r
25   GetDriver,\r
26   GetDriverPath,\r
27   DriverLoaded\r
28 };\r
29 \r
30 STATIC  LIST_ENTRY      mMappingDataBase = INITIALIZE_LIST_HEAD_VARIABLE (mMappingDataBase);\r
31 STATIC  BOOLEAN         mEnvironmentVariableRead = FALSE;\r
32 STATIC  EFI_HANDLE      mCallerImageHandle;\r
33 \r
34 \r
35 EFI_STATUS\r
36 EFIAPI\r
37 PlatformDriverOverrideEntry (\r
38   IN EFI_HANDLE        ImageHandle,\r
39   IN EFI_SYSTEM_TABLE  *SystemTable\r
40   )\r
41 /*++\r
42 \r
43 Routine Description:\r
44    Platform Driver Override driver entry point, install the Platform Driver Override Protocol\r
45 \r
46 Arguments:\r
47   (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
48 \r
49 Returns:\r
50   EFI_STATUS\r
51 \r
52 --*/\r
53 {\r
54   mEnvironmentVariableRead = FALSE;\r
55   mCallerImageHandle = ImageHandle;\r
56   InitializeListHead (&mMappingDataBase);\r
57   return InstallPlatformDriverOverrideProtocol (&gPlatformDriverOverride);\r
58 }\r
59 \r
60 \r
61 /**\r
62   Retrieves the image handle of the platform override driver for a controller in the system.\r
63 \r
64   @param  This                   A pointer to the\r
65                                  EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL instance.\r
66   @param  ControllerHandle       The device handle of the controller to check if a\r
67                                  driver override exists.\r
68   @param  DriverImageHandle      On input, a pointer to the previous driver image\r
69                                  handle returned by GetDriver().  On output, a\r
70                                  pointer to the next driver image handle. Passing\r
71                                  in a NULL,  will return the first driver image\r
72                                  handle for ControllerHandle.\r
73 \r
74   @retval EFI_SUCCESS            The driver override for ControllerHandle was\r
75                                  returned in DriverImageHandle.\r
76   @retval EFI_NOT_FOUND          A driver override for ControllerHandle was not\r
77                                  found.\r
78   @retval EFI_INVALID_PARAMETER  The handle specified by ControllerHandle is not a\r
79                                  valid handle. DriverImageHandle is not a handle\r
80                                  that was returned on a previous  call to\r
81                                  GetDriver().\r
82 \r
83 **/\r
84 STATIC\r
85 EFI_STATUS\r
86 EFIAPI\r
87 GetDriver (\r
88   IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL              * This,\r
89   IN     EFI_HANDLE                                     ControllerHandle,\r
90   IN OUT EFI_HANDLE                                     * DriverImageHandle\r
91   )\r
92 {\r
93   EFI_STATUS  Status;\r
94   //\r
95   // Check that ControllerHandle is a valid handle\r
96   //\r
97   if (ControllerHandle == NULL) {\r
98     return EFI_INVALID_PARAMETER;\r
99   }\r
100 \r
101   //\r
102   // Read the environment variable(s) that contain the override mappings from Controller Device Path to\r
103   // a set of Driver Device Paths, and  initialize in memory database of the overrides that map Controller\r
104   // Device Paths to an ordered set of Driver Device Paths and Driver Handles. This action is only performed\r
105   // once and finished in first call.\r
106   //\r
107   if (!mEnvironmentVariableRead) {\r
108     mEnvironmentVariableRead = TRUE;\r
109 \r
110     Status = InitOverridesMapping (&mMappingDataBase);\r
111     if (Status == EFI_NOT_FOUND) {\r
112       InitializeListHead (&mMappingDataBase);\r
113       return EFI_NOT_FOUND;\r
114     } else if (Status == EFI_VOLUME_CORRUPTED){\r
115       DEBUG ((DEBUG_ERROR, "Platform Driver Override Variable is corrupt\n"));\r
116       //\r
117       // The environment variable(s) that contain the override mappings from Controller Device Path to\r
118       //  a set of Driver Device Paths is corrupted,  platform code can use LibDeleteOverridesVariables to\r
119       //  delete all orverride variables as a policy. Here can be IBV/OEM customized.\r
120       //\r
121 \r
122       //LibDeleteOverridesVariables();\r
123       InitializeListHead (&mMappingDataBase);\r
124       return EFI_NOT_FOUND;\r
125     } else if (EFI_ERROR (Status)){\r
126       InitializeListHead (&mMappingDataBase);\r
127       return EFI_NOT_FOUND;\r
128     }\r
129   }\r
130   //\r
131   // if the environment variable does not exist or the variable appears to be corrupt, just return not found\r
132   //\r
133   if (IsListEmpty (&mMappingDataBase)) {\r
134     return EFI_NOT_FOUND;\r
135   }\r
136 \r
137   return GetDriverFromMapping (\r
138             This,\r
139             ControllerHandle,\r
140             DriverImageHandle,\r
141             &mMappingDataBase,\r
142             mCallerImageHandle\r
143             );\r
144 \r
145 }\r
146 \r
147 \r
148 /**\r
149   For the use of the ControllerHandle parameter in the GetDriverPath() and DriverLoaded() APIs\r
150   makes those APIs very difficult to use, so not support.\r
151 \r
152 \r
153 \r
154 **/\r
155 STATIC\r
156 EFI_STATUS\r
157 EFIAPI\r
158 GetDriverPath (\r
159   IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL              * This,\r
160   IN     EFI_HANDLE                                     ControllerHandle,\r
161   IN OUT EFI_DEVICE_PATH_PROTOCOL                       **DriverImagePath\r
162   )\r
163 {\r
164   return EFI_UNSUPPORTED;\r
165 }\r
166 \r
167 \r
168 /**\r
169   For the use of the ControllerHandle parameter in the GetDriverPath() and DriverLoaded() APIs\r
170   makes those APIs very difficult to use, so not support.\r
171 \r
172 \r
173 \r
174 **/\r
175 STATIC\r
176 EFI_STATUS\r
177 EFIAPI\r
178 DriverLoaded (\r
179   IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL          * This,\r
180   IN EFI_HANDLE                                     ControllerHandle,\r
181   IN EFI_DEVICE_PATH_PROTOCOL                       * DriverImagePath,\r
182   IN EFI_HANDLE                                     DriverImageHandle\r
183   )\r
184 {\r
185   return EFI_UNSUPPORTED;\r
186 }\r