]> git.proxmox.com Git - mirror_edk2.git/blame - PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c
Update the copyright notice format
[mirror_edk2.git] / PcAtChipsetPkg / IsaAcpiDxe / PcatIsaAcpi.c
CommitLineData
c860b463 1/** @file\r
2 EFI PCAT ISA ACPI Driver for a Generic PC Platform\r
c69dd9df 3\r
95d48e82 4Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
18c97f53 5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
c69dd9df 9\r
18c97f53 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
c69dd9df 12\r
c860b463 13**/\r
c69dd9df 14\r
15#include "PcatIsaAcpi.h"\r
16\r
17//\r
18// PcatIsaAcpi Driver Binding Protocol\r
19//\r
20EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding = {\r
21 PcatIsaAcpiDriverBindingSupported,\r
22 PcatIsaAcpiDriverBindingStart,\r
23 PcatIsaAcpiDriverBindingStop,\r
24 0xa,\r
25 NULL,\r
26 NULL\r
27};\r
28\r
18c97f53 29/**\r
30 the entry point of the PcatIsaAcpi driver.\r
31\r
32 @param ImageHandle Handle for driver image\r
33 @param SystemTable Point to EFI_SYSTEM_TABLE\r
34\r
35 @return Sucess or not for installing driver binding protocol\r
36**/\r
c69dd9df 37EFI_STATUS\r
38EFIAPI\r
39PcatIsaAcpiDriverEntryPoint (\r
40 IN EFI_HANDLE ImageHandle,\r
41 IN EFI_SYSTEM_TABLE *SystemTable\r
42 )\r
c69dd9df 43{\r
44 return EfiLibInstallDriverBindingComponentName2 (\r
45 ImageHandle, \r
46 SystemTable, \r
47 &gPcatIsaAcpiDriverBinding,\r
48 ImageHandle,\r
49 &gPcatIsaAcpiComponentName,\r
50 &gPcatIsaAcpiComponentName2\r
51 );\r
52}\r
53\r
18c97f53 54/**\r
55 ControllerDriver Protocol Method\r
56\r
57 @param This Driver Binding protocol instance pointer. \r
58 @param Controller Handle of device to test.\r
59 @param RemainingDevicePath Optional parameter use to pick a specific child\r
60 device to start.\r
61 @retval EFI_SUCCESS This driver supports this device.\r
62 @retval other This driver does not support this device.\r
63\r
64**/\r
c69dd9df 65EFI_STATUS\r
66EFIAPI\r
67PcatIsaAcpiDriverBindingSupported (\r
68 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
69 IN EFI_HANDLE Controller,\r
70 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
71 )\r
c69dd9df 72{\r
73 EFI_STATUS Status;\r
74 EFI_PCI_IO_PROTOCOL *PciIo;\r
75 PCI_TYPE00 Pci;\r
76\r
77 //\r
78 // Get PciIo protocol instance\r
79 // \r
80 Status = gBS->OpenProtocol (\r
81 Controller, \r
82 &gEfiPciIoProtocolGuid, \r
9c83c97a 83 (VOID**)&PciIo,\r
c69dd9df 84 This->DriverBindingHandle,\r
85 Controller,\r
86 EFI_OPEN_PROTOCOL_BY_DRIVER\r
87 );\r
88 if (EFI_ERROR(Status)) {\r
89 return Status;\r
90 }\r
91\r
92 Status = PciIo->Pci.Read (\r
93 PciIo,\r
94 EfiPciIoWidthUint32,\r
95 0,\r
96 sizeof(Pci) / sizeof(UINT32), \r
97 &Pci);\r
c860b463 98\r
c69dd9df 99 if (!EFI_ERROR (Status)) {\r
100 Status = EFI_UNSUPPORTED;\r
101 if ((Pci.Hdr.Command & 0x03) == 0x03) {\r
102 if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {\r
103 //\r
104 // See if this is a standard PCI to ISA Bridge from the Base Code and Class Code\r
105 //\r
bc14bdb3 106 if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {\r
c69dd9df 107 Status = EFI_SUCCESS;\r
108 } \r
109\r
110 //\r
111 // See if this is an Intel PCI to ISA bridge in Positive Decode Mode\r
112 //\r
bc14bdb3 113 if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&\r
c69dd9df 114 Pci.Hdr.VendorId == 0x8086 && \r
c860b463 115 (Pci.Hdr.DeviceId & 0xF000) == 0x7000) {\r
c69dd9df 116 Status = EFI_SUCCESS;\r
117 }\r
118 } \r
119 }\r
120 }\r
121\r
122 gBS->CloseProtocol (\r
123 Controller, \r
124 &gEfiPciIoProtocolGuid, \r
125 This->DriverBindingHandle, \r
126 Controller \r
127 );\r
128 \r
129 return Status;\r
130}\r
131\r
18c97f53 132/**\r
133 Install EFI_ISA_ACPI_PROTOCOL.\r
134\r
135 @param This Driver Binding protocol instance pointer.\r
136 @param ControllerHandle Handle of device to bind driver to.\r
137 @param RemainingDevicePath Optional parameter use to pick a specific child\r
138 device to start.\r
139\r
140 @retval EFI_SUCCESS This driver is added to ControllerHandle\r
141 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
142 @retval other This driver does not support this device\r
143**/\r
c69dd9df 144EFI_STATUS\r
145EFIAPI\r
146PcatIsaAcpiDriverBindingStart (\r
147 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
148 IN EFI_HANDLE Controller,\r
149 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
150 )\r
c69dd9df 151{\r
152 EFI_STATUS Status;\r
153 EFI_PCI_IO_PROTOCOL *PciIo;\r
154 PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
155 \r
156 PcatIsaAcpiDev = NULL;\r
157 //\r
158 // Open the PCI I/O Protocol Interface\r
159 //\r
160 PciIo = NULL;\r
161 Status = gBS->OpenProtocol (\r
162 Controller, \r
163 &gEfiPciIoProtocolGuid, \r
9c83c97a 164 (VOID**)&PciIo,\r
c69dd9df 165 This->DriverBindingHandle, \r
166 Controller, \r
167 EFI_OPEN_PROTOCOL_BY_DRIVER \r
168 );\r
169 if (EFI_ERROR (Status)) {\r
170 goto Done;\r
171 }\r
172\r
173 Status = PciIo->Attributes (\r
174 PciIo, \r
175 EfiPciIoAttributeOperationEnable, \r
176 EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, \r
177 NULL \r
178 );\r
179 if (EFI_ERROR (Status)) {\r
180 goto Done;\r
181 }\r
182 \r
183 //\r
184 // Allocate memory for the PCAT ISA ACPI Device structure\r
185 //\r
186 PcatIsaAcpiDev = NULL;\r
187 Status = gBS->AllocatePool (\r
188 EfiBootServicesData,\r
189 sizeof(PCAT_ISA_ACPI_DEV),\r
9c83c97a 190 (VOID**)&PcatIsaAcpiDev\r
c69dd9df 191 );\r
192 if (EFI_ERROR (Status)) {\r
193 goto Done;\r
194 }\r
195\r
196 //\r
197 // Initialize the PCAT ISA ACPI Device structure\r
198 //\r
199 PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE;\r
200 PcatIsaAcpiDev->Handle = Controller;\r
201 PcatIsaAcpiDev->PciIo = PciIo;\r
202 \r
203 //\r
204 // IsaAcpi interface\r
205 //\r
206 (PcatIsaAcpiDev->IsaAcpi).DeviceEnumerate = IsaDeviceEnumerate;\r
207 (PcatIsaAcpiDev->IsaAcpi).SetPower = IsaDeviceSetPower;\r
208 (PcatIsaAcpiDev->IsaAcpi).GetCurResource = IsaGetCurrentResource;\r
209 (PcatIsaAcpiDev->IsaAcpi).GetPosResource = IsaGetPossibleResource;\r
210 (PcatIsaAcpiDev->IsaAcpi).SetResource = IsaSetResource;\r
211 (PcatIsaAcpiDev->IsaAcpi).EnableDevice = IsaEnableDevice;\r
212 (PcatIsaAcpiDev->IsaAcpi).InitDevice = IsaInitDevice;\r
213 (PcatIsaAcpiDev->IsaAcpi).InterfaceInit = IsaInterfaceInit;\r
214 \r
215 //\r
216 // Install the ISA ACPI Protocol interface\r
217 //\r
218 Status = gBS->InstallMultipleProtocolInterfaces (\r
219 &Controller,\r
220 &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi,\r
221 NULL\r
222 );\r
223\r
224Done:\r
225 if (EFI_ERROR (Status)) {\r
226 if (PciIo) {\r
227 PciIo->Attributes (\r
228 PciIo, \r
229 EfiPciIoAttributeOperationDisable, \r
230 EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
231 NULL \r
232 );\r
233 }\r
234 gBS->CloseProtocol (\r
235 Controller, \r
236 &gEfiPciIoProtocolGuid, \r
237 This->DriverBindingHandle, \r
238 Controller\r
239 );\r
240 if (PcatIsaAcpiDev != NULL) {\r
241 gBS->FreePool (PcatIsaAcpiDev);\r
242 }\r
243 return Status;\r
244 }\r
245 \r
246 return EFI_SUCCESS;\r
247}\r
248\r
18c97f53 249\r
250/**\r
251 Stop this driver on ControllerHandle. Support stopping any child handles\r
252 created by this driver.\r
253\r
254 @param This Protocol instance pointer.\r
255 @param ControllerHandle Handle of device to stop driver on\r
256 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
257 children is zero stop the entire bus driver.\r
258 @param ChildHandleBuffer List of Child Handles to Stop.\r
259\r
260 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
261 @retval other This driver was not removed from this device\r
262\r
263**/\r
c69dd9df 264EFI_STATUS\r
265EFIAPI\r
266PcatIsaAcpiDriverBindingStop (\r
267 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
268 IN EFI_HANDLE Controller,\r
269 IN UINTN NumberOfChildren,\r
270 IN EFI_HANDLE *ChildHandleBuffer\r
271 )\r
c69dd9df 272{\r
273 EFI_STATUS Status;\r
274 EFI_ISA_ACPI_PROTOCOL *IsaAcpi;\r
275 PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
276 \r
277 //\r
278 // Get the ISA ACPI Protocol Interface\r
279 // \r
280 Status = gBS->OpenProtocol (\r
281 Controller, \r
282 &gEfiIsaAcpiProtocolGuid, \r
9c83c97a 283 (VOID**)&IsaAcpi,\r
c69dd9df 284 This->DriverBindingHandle, \r
285 Controller, \r
286 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
287 );\r
288 if (EFI_ERROR (Status)) {\r
289 return Status;\r
290 }\r
291\r
292 //\r
293 // Get the PCAT ISA ACPI Device structure from the ISA ACPI Protocol\r
294 //\r
295 PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi);\r
296\r
297 PcatIsaAcpiDev->PciIo->Attributes (\r
298 PcatIsaAcpiDev->PciIo, \r
299 EfiPciIoAttributeOperationDisable, \r
300 EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
301 NULL \r
302 );\r
303 \r
304 //\r
305 // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL\r
306 //\r
307 Status = gBS->UninstallProtocolInterface (\r
308 Controller,\r
309 &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi\r
310 );\r
311 if (EFI_ERROR (Status)) {\r
312 return Status;\r
313 }\r
314\r
315 gBS->CloseProtocol (\r
316 Controller, \r
317 &gEfiPciIoProtocolGuid, \r
318 This->DriverBindingHandle, \r
319 Controller\r
320 );\r
321 \r
322 gBS->FreePool (PcatIsaAcpiDev);\r
323 \r
324 return EFI_SUCCESS;\r
325}\r