1. Create PlatformDriverOverride in Universal directory.
[people/mcb30/edk2.git] / edk2 / MdeModulePkg / Universal / PlatformDriverOverride / PlatOverMngr / PlatOverMngr.h
1 /** @file\r
2 \r
3 Copyright (c) 2007 - 2008, 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   PlatOverMngr.h\r
15 \r
16 Abstract:\r
17 \r
18   Function prototype for platform driver override manager driver\r
19 \r
20 **/\r
21 \r
22 #ifndef _PLAT_OVER_MNGR_H_\r
23 #define _PLAT_OVER_MNGR_H_\r
24 \r
25 #include <Uefi.h>\r
26 \r
27 #include <PiDxe.h>\r
28 \r
29 #include <Protocol/HiiConfigAccess.h>\r
30 #include <Protocol/HiiConfigRouting.h>\r
31 #include <Protocol/HiiDatabase.h>\r
32 #include <Protocol/LoadedImage.h>\r
33 #include <Protocol/FirmwareVolumeBlock.h>\r
34 #include <Protocol/FirmwareVolume2.h>\r
35 #include <Protocol/PciIo.h>\r
36 #include <Protocol/BusSpecificDriverOverride.h>\r
37 #include <Protocol/ComponentName2.h>\r
38 #include <Protocol/ComponentName.h>\r
39 #include <Protocol/DevicePathToText.h>\r
40 \r
41 #include <Library/BaseLib.h>\r
42 #include <Library/DebugLib.h>\r
43 #include <Library/UefiLib.h>\r
44 #include <Library/UefiApplicationEntryPoint.h>\r
45 #include <Library/UefiBootServicesTableLib.h>\r
46 #include <Library/PlatDriOverLib.h>\r
47 #include <Library/IfrSupportLib.h>\r
48 #include <Library/ExtendedIfrSupportLib.h>\r
49 #include <Library/BaseMemoryLib.h>\r
50 #include <Library/MemoryAllocationLib.h>\r
51 #include <Library/HiiLib.h>\r
52 #include <Library/ExtendedHiiLib.h>\r
53 #include <Library/UefiRuntimeServicesTableLib.h>\r
54 #include <Library/DevicePathLib.h>\r
55 \r
56 \r
57 #define MIN_ALIGNMENT_SIZE  4\r
58 #define ALIGN_SIZE(a)       ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0)\r
59 \r
60 \r
61 #define EFI_CALLBACK_INFO_SIGNATURE EFI_SIGNATURE_32 ('C', 'l', 'b', 'k')\r
62 #define EFI_CALLBACK_INFO_FROM_THIS(a)  CR (a, EFI_CALLBACK_INFO, ConfigAccess, EFI_CALLBACK_INFO_SIGNATURE)\r
63 #define MAX_CHOICE_NUM    0x100\r
64 #define UPDATE_DATA_SIZE  0x1000\r
65 \r
66 \r
67 extern UINT8  VfrBin[];\r
68 \r
69 extern UINT8  PlatOverMngrStrings[];\r
70 \r
71 //\r
72 // Following definition is the same as in vfr file\r
73 //\r
74 #define PLAT_OVER_MNGR_GUID \\r
75   { \\r
76     0x8614567d, 0x35be, 0x4415, 0x8d, 0x88, 0xbd, 0x7d, 0xc, 0x9c, 0x70, 0xc0 \\r
77   }\r
78 \r
79 typedef struct {\r
80   UINT8   DriSelection[100];\r
81   UINT8   DriOrder[100];\r
82   UINT8   PciDeviceFilter;\r
83 } PLAT_OVER_MNGR_DATA;\r
84 \r
85 #define FORM_ID_DEVICE                 0x1234\r
86 #define FORM_ID_DRIVER                 0x1200\r
87 #define FORM_ID_ORDER                  0x1500\r
88 \r
89 #define KEY_VALUE_DEVICE_OFFSET        0x0100\r
90 #define KEY_VALUE_DEVICE_MAX           0x04ff\r
91 \r
92 #define QUESTION_ID_OFFSET             0x0500\r
93 \r
94 #define KEY_VALUE_DEVICE_REFRESH       0x1234\r
95 #define KEY_VALUE_DEVICE_FILTER        0x1235\r
96 #define KEY_VALUE_DEVICE_CLEAR         0x1236\r
97 \r
98 #define KEY_VALUE_DRIVER_GOTO_PREVIOUS 0x1300\r
99 #define KEY_VALUE_DRIVER_GOTO_ORDER    0x1301\r
100 \r
101 #define KEY_VALUE_ORDER_GOTO_PREVIOUS  0x2000\r
102 #define KEY_VALUE_ORDER_SAVE_AND_EXIT  0x1800\r
103 \r
104 #define VARSTORE_ID_PLAT_OVER_MNGR     0x1000\r
105 \r
106 //\r
107 // Question Id start from 1, so define an offset for it\r
108 //\r
109 #define VAR_OFFSET(Field)              ((UINTN) &(((PLAT_OVER_MNGR_DATA *) 0)->Field))\r
110 \r
111 #define DRIVER_SELECTION_VAR_OFFSET     (VAR_OFFSET (DriSelection))\r
112 #define DRIVER_ORDER_VAR_OFFSET         (VAR_OFFSET (DriOrder))\r
113 \r
114 #define DRIVER_SELECTION_QUESTION_ID    (VAR_OFFSET (DriSelection) + QUESTION_ID_OFFSET)\r
115 #define DRIVER_ORDER_QUESTION_ID        (VAR_OFFSET (DriOrder) + QUESTION_ID_OFFSET)\r
116 \r
117 typedef struct {\r
118   UINTN                           Signature;\r
119 \r
120   EFI_HANDLE                      DriverHandle;\r
121   EFI_HII_HANDLE                  RegisteredHandle;\r
122   PLAT_OVER_MNGR_DATA             FakeNvData;\r
123 \r
124   EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
125 \r
126   EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;\r
127 } EFI_CALLBACK_INFO;\r
128 \r
129 typedef struct {\r
130   EFI_DRIVER_CONFIGURATION_PROTOCOL         *DriverConfiguration;\r
131   EFI_HANDLE                                DriverImageHandle;\r
132   EFI_HANDLE                                ControllerHandle;\r
133   EFI_HANDLE                                ChildControllerHandle;\r
134   //\r
135   // To avoid created string leak in Hii database, use this token to reuse every token created by the driver\r
136   //\r
137   EFI_STRING_ID                             DescriptionToken;\r
138 } CFG_PROTOCOL_INVOKER_CHOICE;\r
139 \r
140 EFI_STATUS\r
141 EFIAPI\r
142 PlatOverMngrExtractConfig (\r
143   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
144   IN  CONST EFI_STRING                       Request,\r
145   OUT EFI_STRING                             *Progress,\r
146   OUT EFI_STRING                             *Results\r
147   );\r
148 \r
149 EFI_STATUS\r
150 EFIAPI\r
151 PlatOverMngrRouteConfig (\r
152   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
153   IN  CONST EFI_STRING                       Configuration,\r
154   OUT EFI_STRING                             *Progress\r
155   );\r
156 \r
157 EFI_STATUS\r
158 EFIAPI\r
159 PlatOverMngrCallback (\r
160   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
161   IN  EFI_BROWSER_ACTION                     Action,\r
162   IN  EFI_QUESTION_ID                        KeyValue,\r
163   IN  UINT8                                  Type,\r
164   IN  EFI_IFR_TYPE_VALUE                     *Value,\r
165   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
166   );\r
167 \r
168 CHAR16 *\r
169 GetImageName (\r
170   IN  EFI_LOADED_IMAGE_PROTOCOL *Image\r
171   );\r
172 \r
173 CHAR16  *\r
174 DevicePathToStr (\r
175   EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
176   );\r
177 \r
178 \r
179 EFI_DEVICE_PATH_PROTOCOL *\r
180 UnpackDevicePath (\r
181   IN EFI_DEVICE_PATH_PROTOCOL  *DevPath\r
182   );\r
183 \r
184 #endif\r