-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-\r
-Module Name:\r
-\r
- PcatIsaAcpi.c\r
- \r
-Abstract:\r
-\r
- EFI PCAT ISA ACPI Driver for a Generic PC Platform\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include "PcatIsaAcpi.h"\r
-\r
-//\r
-// PcatIsaAcpi Driver Binding Protocol\r
-//\r
-EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding = {\r
- PcatIsaAcpiDriverBindingSupported,\r
- PcatIsaAcpiDriverBindingStart,\r
- PcatIsaAcpiDriverBindingStop,\r
- 0xa,\r
- NULL,\r
- NULL\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcatIsaAcpiDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- the entry point of the PcatIsaAcpi driver\r
- \r
- Arguments:\r
- \r
- Returns:\r
- \r
---*/ \r
-{\r
- return EfiLibInstallDriverBindingComponentName2 (\r
- ImageHandle, \r
- SystemTable, \r
- &gPcatIsaAcpiDriverBinding,\r
- ImageHandle,\r
- &gPcatIsaAcpiComponentName,\r
- &gPcatIsaAcpiComponentName2\r
- );\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcatIsaAcpiDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- ControllerDriver Protocol Method\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCI_TYPE00 Pci;\r
-\r
- //\r
- // Get PciIo protocol instance\r
- // \r
- Status = gBS->OpenProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- (VOID**)&PciIo,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
-\r
- Status = PciIo->Pci.Read (\r
- PciIo,\r
- EfiPciIoWidthUint32,\r
- 0,\r
- sizeof(Pci) / sizeof(UINT32), \r
- &Pci);\r
- \r
- if (!EFI_ERROR (Status)) {\r
- Status = EFI_UNSUPPORTED;\r
- if ((Pci.Hdr.Command & 0x03) == 0x03) {\r
- if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {\r
- //\r
- // See if this is a standard PCI to ISA Bridge from the Base Code and Class Code\r
- //\r
- if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) {\r
- Status = EFI_SUCCESS;\r
- } \r
-\r
- //\r
- // See if this is an Intel PCI to ISA bridge in Positive Decode Mode\r
- //\r
- if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE &&\r
- Pci.Hdr.VendorId == 0x8086 && \r
- Pci.Hdr.DeviceId == 0x7110) {\r
- Status = EFI_SUCCESS;\r
- }\r
- } \r
- }\r
- }\r
-\r
- gBS->CloseProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- This->DriverBindingHandle, \r
- Controller \r
- );\r
- \r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcatIsaAcpiDriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Install EFI_ISA_ACPI_PROTOCOL\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
- \r
- PcatIsaAcpiDev = NULL;\r
- //\r
- // Open the PCI I/O Protocol Interface\r
- //\r
- PciIo = NULL;\r
- Status = gBS->OpenProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- (VOID**)&PciIo,\r
- This->DriverBindingHandle, \r
- Controller, \r
- EFI_OPEN_PROTOCOL_BY_DRIVER \r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- Status = PciIo->Attributes (\r
- PciIo, \r
- EfiPciIoAttributeOperationEnable, \r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, \r
- NULL \r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
- \r
- //\r
- // Allocate memory for the PCAT ISA ACPI Device structure\r
- //\r
- PcatIsaAcpiDev = NULL;\r
- Status = gBS->AllocatePool (\r
- EfiBootServicesData,\r
- sizeof(PCAT_ISA_ACPI_DEV),\r
- (VOID**)&PcatIsaAcpiDev\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- //\r
- // Initialize the PCAT ISA ACPI Device structure\r
- //\r
- PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE;\r
- PcatIsaAcpiDev->Handle = Controller;\r
- PcatIsaAcpiDev->PciIo = PciIo;\r
- \r
- //\r
- // IsaAcpi interface\r
- //\r
- (PcatIsaAcpiDev->IsaAcpi).DeviceEnumerate = IsaDeviceEnumerate;\r
- (PcatIsaAcpiDev->IsaAcpi).SetPower = IsaDeviceSetPower;\r
- (PcatIsaAcpiDev->IsaAcpi).GetCurResource = IsaGetCurrentResource;\r
- (PcatIsaAcpiDev->IsaAcpi).GetPosResource = IsaGetPossibleResource;\r
- (PcatIsaAcpiDev->IsaAcpi).SetResource = IsaSetResource;\r
- (PcatIsaAcpiDev->IsaAcpi).EnableDevice = IsaEnableDevice;\r
- (PcatIsaAcpiDev->IsaAcpi).InitDevice = IsaInitDevice;\r
- (PcatIsaAcpiDev->IsaAcpi).InterfaceInit = IsaInterfaceInit;\r
- \r
- //\r
- // Install the ISA ACPI Protocol interface\r
- //\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &Controller,\r
- &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi,\r
- NULL\r
- );\r
-\r
-Done:\r
- if (EFI_ERROR (Status)) {\r
- if (PciIo) {\r
- PciIo->Attributes (\r
- PciIo, \r
- EfiPciIoAttributeOperationDisable, \r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
- NULL \r
- );\r
- }\r
- gBS->CloseProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- This->DriverBindingHandle, \r
- Controller\r
- );\r
- if (PcatIsaAcpiDev != NULL) {\r
- gBS->FreePool (PcatIsaAcpiDev);\r
- }\r
- return Status;\r
- }\r
- \r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcatIsaAcpiDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Arguments:\r
-\r
- Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_ISA_ACPI_PROTOCOL *IsaAcpi;\r
- PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
- \r
- //\r
- // Get the ISA ACPI Protocol Interface\r
- // \r
- Status = gBS->OpenProtocol (\r
- Controller, \r
- &gEfiIsaAcpiProtocolGuid, \r
- (VOID**)&IsaAcpi,\r
- This->DriverBindingHandle, \r
- Controller, \r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Get the PCAT ISA ACPI Device structure from the ISA ACPI Protocol\r
- //\r
- PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi);\r
-\r
- PcatIsaAcpiDev->PciIo->Attributes (\r
- PcatIsaAcpiDev->PciIo, \r
- EfiPciIoAttributeOperationDisable, \r
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
- NULL \r
- );\r
- \r
- //\r
- // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL\r
- //\r
- Status = gBS->UninstallProtocolInterface (\r
- Controller,\r
- &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- gBS->CloseProtocol (\r
- Controller, \r
- &gEfiPciIoProtocolGuid, \r
- This->DriverBindingHandle, \r
- Controller\r
- );\r
- \r
- gBS->FreePool (PcatIsaAcpiDev);\r
- \r
- return EFI_SUCCESS;\r
-}\r