+++ /dev/null
-/** @file\r
- EFI PCAT ISA ACPI Driver for a Generic PC Platform\r
-\r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\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
-/**\r
- the entry point of the PcatIsaAcpi driver.\r
-\r
- @param ImageHandle Handle for driver image\r
- @param SystemTable Point to EFI_SYSTEM_TABLE\r
-\r
- @return Success or not for installing driver binding protocol\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PcatIsaAcpiDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- return EfiLibInstallDriverBindingComponentName2 (\r
- ImageHandle,\r
- SystemTable,\r
- &gPcatIsaAcpiDriverBinding,\r
- ImageHandle,\r
- &gPcatIsaAcpiComponentName,\r
- &gPcatIsaAcpiComponentName2\r
- );\r
-}\r
-\r
-/**\r
- ControllerDriver Protocol Method\r
-\r
- @param This Driver Binding protocol instance pointer.\r
- @param Controller Handle of device to test.\r
- @param RemainingDevicePath Optional parameter use to pick a specific child\r
- device to start.\r
- @retval EFI_SUCCESS This driver supports this device.\r
- @retval other This driver does not support this device.\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
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCI_TYPE00 Pci;\r
- UINTN SegmentNumber;\r
- UINTN BusNumber;\r
- UINTN DeviceNumber;\r
- UINTN FunctionNumber;\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
- //\r
- // See if this is on Function #0 to avoid false positives on\r
- // PCI_CLASS_BRIDGE_OTHER that has the same value as\r
- // PCI_CLASS_BRIDGE_ISA_PDECODE\r
- //\r
- Status = PciIo->GetLocation (\r
- PciIo,\r
- &SegmentNumber,\r
- &BusNumber,\r
- &DeviceNumber,\r
- &FunctionNumber\r
- );\r
- if (!EFI_ERROR (Status) && FunctionNumber == 0) {\r
- Status = EFI_SUCCESS;\r
- } else {\r
- Status = EFI_UNSUPPORTED;\r
- }\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
-/**\r
- Install EFI_ISA_ACPI_PROTOCOL.\r
-\r
- @param This Driver Binding protocol instance pointer.\r
- @param ControllerHandle Handle of device to bind driver to.\r
- @param RemainingDevicePath Optional parameter use to pick a specific child\r
- device to start.\r
-\r
- @retval EFI_SUCCESS This driver is added to ControllerHandle\r
- @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
- @retval other This driver does not support this device\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
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev;\r
- UINT64 Supports;\r
- UINT64 OriginalAttributes;\r
- BOOLEAN Enabled;\r
-\r
- Enabled = FALSE;\r
- Supports = 0;\r
- PcatIsaAcpiDev = NULL;\r
- OriginalAttributes = 0;\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
- //\r
- // Get supported PCI attributes\r
- //\r
- Status = PciIo->Attributes (\r
- PciIo,\r
- EfiPciIoAttributeOperationSupported,\r
- 0,\r
- &Supports\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- Supports &= (UINT64) (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16);\r
- if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16)) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
- }\r
-\r
- Status = PciIo->Attributes (\r
- PciIo,\r
- EfiPciIoAttributeOperationGet,\r
- 0,\r
- &OriginalAttributes\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- Status = PciIo->Attributes (\r
- PciIo,\r
- EfiPciIoAttributeOperationEnable,\r
- EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- Enabled = TRUE;\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
- PcatIsaAcpiDev->OriginalAttributes = OriginalAttributes;\r
-\r
- //\r
- // Initialize PcatIsaAcpiDeviceList\r
- //\r
- InitializePcatIsaAcpiDeviceList ();\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 != NULL && Enabled) {\r
- PciIo->Attributes (\r
- PciIo,\r
- EfiPciIoAttributeOperationSet,\r
- OriginalAttributes,\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
-\r
-/**\r
- Stop this driver on ControllerHandle. Support stopping any child handles\r
- created by this driver.\r
-\r
- @param This Protocol instance pointer.\r
- @param ControllerHandle Handle of device to stop driver on\r
- @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
- children is zero stop the entire bus driver.\r
- @param ChildHandleBuffer List of Child Handles to Stop.\r
-\r
- @retval EFI_SUCCESS This driver is removed ControllerHandle\r
- @retval other This driver was not removed from this device\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
- 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
- //\r
- // Restore PCI attributes\r
- //\r
- Status = PcatIsaAcpiDev->PciIo->Attributes (\r
- PcatIsaAcpiDev->PciIo,\r
- EfiPciIoAttributeOperationSet,\r
- PcatIsaAcpiDev->OriginalAttributes,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\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