From 81727f38ed0d37bf6f5110def397220a8c207182 Mon Sep 17 00:00:00 2001 From: jljusten Date: Mon, 23 Feb 2009 22:30:53 +0000 Subject: IsaAcpiDxe: DuetPkg => PcAtChipsetPkg git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7614 6f19259b-4bc3-4df7-8a09-765794883524 --- PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c | 170 +++++++++++++++ PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c | 306 +++++++++++++++++++++++++++ PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf | 50 +++++ PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c | 329 ++++++++++++++++++++++++++++++ PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h | 159 +++++++++++++++ 5 files changed, 1014 insertions(+) create mode 100644 PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c create mode 100644 PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c create mode 100644 PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf create mode 100644 PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c create mode 100644 PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h (limited to 'PcAtChipsetPkg') diff --git a/PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c b/PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c new file mode 100644 index 0000000000..9b88dcf86d --- /dev/null +++ b/PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c @@ -0,0 +1,170 @@ +/*++ + +Copyright (c) 2006 - 2007, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +Module Name: + + ComponentName.c + +Abstract: + +--*/ + +#include "PcatIsaAcpi.h" + +// +// EFI Component Name Functions +// +EFI_STATUS +EFIAPI +PcatIsaAcpiComponentNameGetDriverName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN CHAR8 *Language, + OUT CHAR16 **DriverName + ); + +EFI_STATUS +EFIAPI +PcatIsaAcpiComponentNameGetControllerName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName + ); + +// +// EFI Component Name Protocol +// + +EFI_COMPONENT_NAME2_PROTOCOL gPcatIsaAcpiComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PcatIsaAcpiComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PcatIsaAcpiComponentNameGetControllerName, + "en" +}; + +EFI_COMPONENT_NAME_PROTOCOL gPcatIsaAcpiComponentName = { + PcatIsaAcpiComponentNameGetDriverName, + PcatIsaAcpiComponentNameGetControllerName, + "eng" +}; + + +EFI_UNICODE_STRING_TABLE mPcatIsaAcpiDriverNameTable[] = { + { + "eng;en", + L"PC-AT ISA Device Enumeration Driver" + }, + { + NULL, + NULL + } +}; + +EFI_STATUS +EFIAPI +PcatIsaAcpiComponentNameGetDriverName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN CHAR8 *Language, + OUT CHAR16 **DriverName + ) +/*++ + + Routine Description: + Retrieves a Unicode string that is the user readable name of the EFI Driver. + + Arguments: + This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. + Language - A pointer to a three character ISO 639-2 language identifier. + This is the language of the driver name that that the caller + is requesting, and it must match one of the languages specified + in SupportedLanguages. The number of languages supported by a + driver is up to the driver writer. + DriverName - A pointer to the Unicode string to return. This Unicode string + is the name of the driver specified by This in the language + specified by Language. + + Returns: + EFI_SUCCES - The Unicode string for the Driver specified by This + and the language specified by Language was returned + in DriverName. + EFI_INVALID_PARAMETER - Language is NULL. + EFI_INVALID_PARAMETER - DriverName is NULL. + EFI_UNSUPPORTED - The driver specified by This does not support the + language specified by Language. + +--*/ +{ + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mPcatIsaAcpiDriverNameTable, + DriverName, + (BOOLEAN)(This == &gPcatIsaAcpiComponentName) + ); +} + +EFI_STATUS +EFIAPI +PcatIsaAcpiComponentNameGetControllerName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName + ) +/*++ + + Routine Description: + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by an EFI Driver. + + Arguments: + This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. + ControllerHandle - The handle of a controller that the driver specified by + This is managing. This handle specifies the controller + whose name is to be returned. + ChildHandle - The handle of the child controller to retrieve the name + of. This is an optional parameter that may be NULL. It + will be NULL for device drivers. It will also be NULL + for a bus drivers that wish to retrieve the name of the + bus controller. It will not be NULL for a bus driver + that wishes to retrieve the name of a child controller. + Language - A pointer to a three character ISO 639-2 language + identifier. This is the language of the controller name + that that the caller is requesting, and it must match one + of the languages specified in SupportedLanguages. The + number of languages supported by a driver is up to the + driver writer. + ControllerName - A pointer to the Unicode string to return. This Unicode + string is the name of the controller specified by + ControllerHandle and ChildHandle in the language specified + by Language from the point of view of the driver specified + by This. + + Returns: + EFI_SUCCESS - The Unicode string for the user readable name in the + language specified by Language for the driver + specified by This was returned in DriverName. + EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. + EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. + EFI_INVALID_PARAMETER - Language is NULL. + EFI_INVALID_PARAMETER - ControllerName is NULL. + EFI_UNSUPPORTED - The driver specified by This is not currently managing + the controller specified by ControllerHandle and + ChildHandle. + EFI_UNSUPPORTED - The driver specified by This does not support the + language specified by Language. + +--*/ +{ + return EFI_UNSUPPORTED; +} diff --git a/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c b/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c new file mode 100644 index 0000000000..5eba8591b6 --- /dev/null +++ b/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c @@ -0,0 +1,306 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +Module Name: + + IsaAcpi.c + +Abstract: + + ISA ACPI Protocol Implementation + +Revision History + +--*/ + +#include "PcatIsaAcpi.h" + +// +// Platform specific data for the ISA devices that are present.in the platform +// + +// +// COM 1 UART Controller +// +EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiCom1DeviceResources[] = { + {EfiIsaAcpiResourceIo, 0, 0x3f8, 0x3ff}, + {EfiIsaAcpiResourceInterrupt, 0, 4, 0}, + {EfiIsaAcpiResourceEndOfList, 0, 0, 0} +}; + +// +// COM 2 UART Controller +// +EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiCom2DeviceResources[] = { + {EfiIsaAcpiResourceIo, 0, 0x2f8, 0x2ff}, + {EfiIsaAcpiResourceInterrupt, 0, 3, 0}, + {EfiIsaAcpiResourceEndOfList, 0, 0, 0} +}; + +// +// PS/2 Keyboard Controller +// +EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiPs2KeyboardDeviceResources[] = { + {EfiIsaAcpiResourceIo, 0, 0x60, 0x64}, + {EfiIsaAcpiResourceInterrupt, 0, 1, 0}, + {EfiIsaAcpiResourceEndOfList, 0, 0, 0} +}; + +// +// PS/2 Mouse Controller +// +EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiPs2MouseDeviceResources[] = { + {EfiIsaAcpiResourceIo, 0, 0x60, 0x64}, + {EfiIsaAcpiResourceInterrupt, 0, 12, 0}, + {EfiIsaAcpiResourceEndOfList, 0, 0, 0} +}; + +// +// Floppy Disk Controller +// +EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiFloppyResources[] = { + {EfiIsaAcpiResourceIo, 0, 0x3f0, 0x3f7}, + {EfiIsaAcpiResourceInterrupt, 0, 6, 0}, + {EfiIsaAcpiResourceDma, EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_COMPATIBLE | EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8 | EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE, 2, 0}, + {EfiIsaAcpiResourceEndOfList, 0, 0, 0} +}; + +// +// Table of ISA Controllers +// +EFI_ISA_ACPI_RESOURCE_LIST gPcatIsaAcpiDeviceList[] = { + {{EISA_PNP_ID(0x501), 0}, mPcatIsaAcpiCom1DeviceResources }, // COM 1 UART Controller + {{EISA_PNP_ID(0x501), 1}, mPcatIsaAcpiCom2DeviceResources }, // COM 2 UART Controller + {{EISA_PNP_ID(0x303), 0}, mPcatIsaAcpiPs2KeyboardDeviceResources }, // PS/2 Keyboard Controller + {{EISA_PNP_ID(0x303), 1}, mPcatIsaAcpiPs2MouseDeviceResources }, // PS/2 Mouse Controller + {{EISA_PNP_ID(0x604), 0}, mPcatIsaAcpiFloppyResources }, // Floppy Disk Controller A: + {{EISA_PNP_ID(0x604), 1}, mPcatIsaAcpiFloppyResources }, // Floppy Disk Controller B: + {{0, 0}, NULL } // End if ISA Controllers +}; + +// +// ISA ACPI Protocol Functions +// +VOID +IsaDeviceLookup ( + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **IsaAcpiDevice, + OUT EFI_ISA_ACPI_RESOURCE_LIST **NextIsaAcpiDevice + ) +/*++ + +Routine Description: + Enumerate the ISA devices on the ISA bus + +Arguments: + +Returns: + +--*/ +{ + UINTN Index; + + *IsaAcpiDevice = NULL; + if (NextIsaAcpiDevice != NULL) { + *NextIsaAcpiDevice = NULL; + } + if (Device == NULL) { + Index = 0; + } else { + for(Index = 0; gPcatIsaAcpiDeviceList[Index].ResourceItem != NULL; Index++) { + if (Device->HID == gPcatIsaAcpiDeviceList[Index].Device.HID && + Device->UID == gPcatIsaAcpiDeviceList[Index].Device.UID ) { + break; + } + } + if (gPcatIsaAcpiDeviceList[Index].ResourceItem == NULL) { + return; + } + *IsaAcpiDevice = &(gPcatIsaAcpiDeviceList[Index]); + Index++; + } + if (gPcatIsaAcpiDeviceList[Index].ResourceItem != NULL && NextIsaAcpiDevice != NULL) { + *NextIsaAcpiDevice = &(gPcatIsaAcpiDeviceList[Index]); + } +} + +EFI_STATUS +EFIAPI +IsaDeviceEnumerate ( + IN EFI_ISA_ACPI_PROTOCOL *This, + OUT EFI_ISA_ACPI_DEVICE_ID **Device + ) +/*++ + +Routine Description: + Enumerate the ISA devices on the ISA bus + +Arguments: + +Returns: + +--*/ +{ + EFI_ISA_ACPI_RESOURCE_LIST *IsaAcpiDevice; + EFI_ISA_ACPI_RESOURCE_LIST *NextIsaAcpiDevice; + + IsaDeviceLookup (*Device, &IsaAcpiDevice, &NextIsaAcpiDevice); + if (NextIsaAcpiDevice == NULL) { + return EFI_NOT_FOUND; + } + *Device = &(NextIsaAcpiDevice->Device); + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IsaDeviceSetPower ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN BOOLEAN OnOff + ) +/*++ + +Routine Description: + Set ISA device power + +Arguments: + +Returns: + +--*/ +{ + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IsaGetCurrentResource ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList + ) +/*++ + +Routine Description: + Get current Resource of the specific ISA device + +Arguments: + +Returns: + +--*/ +{ + IsaDeviceLookup (Device, ResourceList, NULL); + if (*ResourceList == NULL) { + return EFI_NOT_FOUND; + } + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IsaGetPossibleResource ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IsaSetResource ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN EFI_ISA_ACPI_RESOURCE_LIST *ResourceList + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IsaEnableDevice ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN BOOLEAN Enable + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IsaInitDevice ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +IsaInterfaceInit ( + IN EFI_ISA_ACPI_PROTOCOL *This +) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + return EFI_SUCCESS; +} diff --git a/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf b/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf new file mode 100644 index 0000000000..ec01a28346 --- /dev/null +++ b/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf @@ -0,0 +1,50 @@ +#/*++ +# +# Copyright (c) 2005, Intel Corporation +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# IsaAcpi.inf +# +# Abstract: +# Component description file for PCAT ISA ACPI driver +# +#--*/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = IsaAcpi + FILE_GUID = 38A0EC22-FBE7-4911-8BC1-176E0D6C1DBD + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x0002000A + + ENTRY_POINT = PcatIsaAcpiDriverEntryPoint + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec + DuetPkg/DuetPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + UefiBootServicesTableLib + UefiLib + +[Sources] + PcatIsaAcpi.h + PcatIsaAcpi.c + IsaAcpi.c + ComponentName.c + +[Protocols] + gEfiPciIoProtocolGuid + gEfiIsaAcpiProtocolGuid diff --git a/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c b/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c new file mode 100644 index 0000000000..a0f4cdfd40 --- /dev/null +++ b/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c @@ -0,0 +1,329 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +Module Name: + + PcatIsaAcpi.c + +Abstract: + + EFI PCAT ISA ACPI Driver for a Generic PC Platform + +Revision History + +--*/ + +#include "PcatIsaAcpi.h" + +// +// PcatIsaAcpi Driver Binding Protocol +// +EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding = { + PcatIsaAcpiDriverBindingSupported, + PcatIsaAcpiDriverBindingStart, + PcatIsaAcpiDriverBindingStop, + 0xa, + NULL, + NULL +}; + +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + + Routine Description: + the entry point of the PcatIsaAcpi driver + + Arguments: + + Returns: + +--*/ +{ + return EfiLibInstallDriverBindingComponentName2 ( + ImageHandle, + SystemTable, + &gPcatIsaAcpiDriverBinding, + ImageHandle, + &gPcatIsaAcpiComponentName, + &gPcatIsaAcpiComponentName2 + ); +} + +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ) +/*++ + +Routine Description: + + ControllerDriver Protocol Method + +Arguments: + +Returns: + +--*/ +{ + EFI_STATUS Status; + EFI_PCI_IO_PROTOCOL *PciIo; + PCI_TYPE00 Pci; + + // + // Get PciIo protocol instance + // + Status = gBS->OpenProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + (VOID**)&PciIo, + This->DriverBindingHandle, + Controller, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR(Status)) { + return Status; + } + + Status = PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint32, + 0, + sizeof(Pci) / sizeof(UINT32), + &Pci); + + if (!EFI_ERROR (Status)) { + Status = EFI_UNSUPPORTED; + if ((Pci.Hdr.Command & 0x03) == 0x03) { + if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) { + // + // See if this is a standard PCI to ISA Bridge from the Base Code and Class Code + // + if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) { + Status = EFI_SUCCESS; + } + + // + // See if this is an Intel PCI to ISA bridge in Positive Decode Mode + // + if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE && + Pci.Hdr.VendorId == 0x8086 && + Pci.Hdr.DeviceId == 0x7110) { + Status = EFI_SUCCESS; + } + } + } + } + + gBS->CloseProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + This->DriverBindingHandle, + Controller + ); + + return Status; +} + +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ) +/*++ + +Routine Description: + Install EFI_ISA_ACPI_PROTOCOL + +Arguments: + +Returns: + +--*/ +{ + EFI_STATUS Status; + EFI_PCI_IO_PROTOCOL *PciIo; + PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev; + + PcatIsaAcpiDev = NULL; + // + // Open the PCI I/O Protocol Interface + // + PciIo = NULL; + Status = gBS->OpenProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + (VOID**)&PciIo, + This->DriverBindingHandle, + Controller, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + goto Done; + } + + Status = PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationEnable, + EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, + NULL + ); + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Allocate memory for the PCAT ISA ACPI Device structure + // + PcatIsaAcpiDev = NULL; + Status = gBS->AllocatePool ( + EfiBootServicesData, + sizeof(PCAT_ISA_ACPI_DEV), + (VOID**)&PcatIsaAcpiDev + ); + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Initialize the PCAT ISA ACPI Device structure + // + PcatIsaAcpiDev->Signature = PCAT_ISA_ACPI_DEV_SIGNATURE; + PcatIsaAcpiDev->Handle = Controller; + PcatIsaAcpiDev->PciIo = PciIo; + + // + // IsaAcpi interface + // + (PcatIsaAcpiDev->IsaAcpi).DeviceEnumerate = IsaDeviceEnumerate; + (PcatIsaAcpiDev->IsaAcpi).SetPower = IsaDeviceSetPower; + (PcatIsaAcpiDev->IsaAcpi).GetCurResource = IsaGetCurrentResource; + (PcatIsaAcpiDev->IsaAcpi).GetPosResource = IsaGetPossibleResource; + (PcatIsaAcpiDev->IsaAcpi).SetResource = IsaSetResource; + (PcatIsaAcpiDev->IsaAcpi).EnableDevice = IsaEnableDevice; + (PcatIsaAcpiDev->IsaAcpi).InitDevice = IsaInitDevice; + (PcatIsaAcpiDev->IsaAcpi).InterfaceInit = IsaInterfaceInit; + + // + // Install the ISA ACPI Protocol interface + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &Controller, + &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi, + NULL + ); + +Done: + if (EFI_ERROR (Status)) { + if (PciIo) { + PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationDisable, + EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, + NULL + ); + } + gBS->CloseProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + This->DriverBindingHandle, + Controller + ); + if (PcatIsaAcpiDev != NULL) { + gBS->FreePool (PcatIsaAcpiDev); + } + return Status; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ) +/*++ + + Routine Description: + + Arguments: + + Returns: + +--*/ +{ + EFI_STATUS Status; + EFI_ISA_ACPI_PROTOCOL *IsaAcpi; + PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev; + + // + // Get the ISA ACPI Protocol Interface + // + Status = gBS->OpenProtocol ( + Controller, + &gEfiIsaAcpiProtocolGuid, + (VOID**)&IsaAcpi, + This->DriverBindingHandle, + Controller, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the PCAT ISA ACPI Device structure from the ISA ACPI Protocol + // + PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi); + + PcatIsaAcpiDev->PciIo->Attributes ( + PcatIsaAcpiDev->PciIo, + EfiPciIoAttributeOperationDisable, + EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, + NULL + ); + + // + // Uninstall protocol interface: EFI_ISA_ACPI_PROTOCOL + // + Status = gBS->UninstallProtocolInterface ( + Controller, + &gEfiIsaAcpiProtocolGuid, &PcatIsaAcpiDev->IsaAcpi + ); + if (EFI_ERROR (Status)) { + return Status; + } + + gBS->CloseProtocol ( + Controller, + &gEfiPciIoProtocolGuid, + This->DriverBindingHandle, + Controller + ); + + gBS->FreePool (PcatIsaAcpiDev); + + return EFI_SUCCESS; +} diff --git a/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h b/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h new file mode 100644 index 0000000000..8608156b9b --- /dev/null +++ b/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h @@ -0,0 +1,159 @@ +/*++ + +Copyright (c) 2006 - 2007, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +Module Name: + + PcatIsaAcpi.h + +Abstract: + + EFI PCAT ISA ACPI Driver for a Generic PC Platform + +Revision History + +--*/ + +#ifndef _PCAT_ISA_ACPI_H_ +#define _PCAT_ISA_ACPI_H_ + +#include + +#include + +#include +#include +#include +#include +#include +#include + + +#include +#include + +#include +// +// PCAT ISA ACPI device private data structure +// +#define PCAT_ISA_ACPI_DEV_SIGNATURE SIGNATURE_32('L','P','C','D') + +typedef struct { + UINTN Signature; + EFI_HANDLE Handle; + EFI_ISA_ACPI_PROTOCOL IsaAcpi; + EFI_PCI_IO_PROTOCOL *PciIo; +} PCAT_ISA_ACPI_DEV; + +#define PCAT_ISA_ACPI_DEV_FROM_THIS(a) BASE_CR(a, PCAT_ISA_ACPI_DEV, IsaAcpi) + +// +// Global Variables +// +extern EFI_DRIVER_BINDING_PROTOCOL gPcatIsaAcpiDriverBinding; + +extern EFI_COMPONENT_NAME2_PROTOCOL gPcatIsaAcpiComponentName2; + +extern EFI_COMPONENT_NAME_PROTOCOL gPcatIsaAcpiComponentName; + + +// +// Prototypes for Driver model protocol interface +// +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + +EFI_STATUS +EFIAPI +PcatIsaAcpiDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +// +// Prototypes for the ISA ACPI protocol interface +// +EFI_STATUS +EFIAPI +IsaDeviceEnumerate ( + IN EFI_ISA_ACPI_PROTOCOL *This, + OUT EFI_ISA_ACPI_DEVICE_ID **Device + ); + +EFI_STATUS +EFIAPI +IsaDeviceSetPower ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN BOOLEAN OnOff + ); + +EFI_STATUS +EFIAPI +IsaGetCurrentResource ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList + ); + +EFI_STATUS +EFIAPI +IsaGetPossibleResource ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList + ); + +EFI_STATUS +EFIAPI +IsaSetResource ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN EFI_ISA_ACPI_RESOURCE_LIST *ResourceList + ); + +EFI_STATUS +EFIAPI +IsaEnableDevice ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN BOOLEAN Enable + ); + +EFI_STATUS +EFIAPI +IsaInitDevice ( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device + ); + +EFI_STATUS +EFIAPI +IsaInterfaceInit ( + IN EFI_ISA_ACPI_PROTOCOL *This + ); + +#endif -- cgit v1.2.3