audk/PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c

360 lines
9.9 KiB
C

/** @file
ISA ACPI Protocol Implementation
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
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.
**/
#include "PcatIsaAcpi.h"
//
// Platform specific data for the ISA devices that are present.in the platform
//
//
// COM 1 UART Controller
//
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiCom1DeviceResources[] = {
{EfiIsaAcpiResourceIo, 0, 0x3f8, 0x3ff},
{EfiIsaAcpiResourceInterrupt, 0, 4, 0},
{EfiIsaAcpiResourceEndOfList, 0, 0, 0}
};
//
// COM 2 UART Controller
//
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiCom2DeviceResources[] = {
{EfiIsaAcpiResourceIo, 0, 0x2f8, 0x2ff},
{EfiIsaAcpiResourceInterrupt, 0, 3, 0},
{EfiIsaAcpiResourceEndOfList, 0, 0, 0}
};
//
// PS/2 Keyboard Controller
//
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiPs2KeyboardDeviceResources[] = {
{EfiIsaAcpiResourceIo, 0, 0x60, 0x64},
{EfiIsaAcpiResourceInterrupt, 0, 1, 0},
{EfiIsaAcpiResourceEndOfList, 0, 0, 0}
};
//
// PS/2 Mouse Controller
//
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiPs2MouseDeviceResources[] = {
{EfiIsaAcpiResourceIo, 0, 0x60, 0x64},
{EfiIsaAcpiResourceInterrupt, 0, 12, 0},
{EfiIsaAcpiResourceEndOfList, 0, 0, 0}
};
//
// Floppy Disk Controller
//
GLOBAL_REMOVE_IF_UNREFERENCED
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}
};
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiCom1Device = {
{EISA_PNP_ID(0x501), 0}, mPcatIsaAcpiCom1DeviceResources
}; // COM 1 UART Controller
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiCom2Device = {
{EISA_PNP_ID(0x501), 1}, mPcatIsaAcpiCom2DeviceResources
}; // COM 2 UART Controller
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiPs2KeyboardDevice = {
{EISA_PNP_ID(0x303), 0}, mPcatIsaAcpiPs2KeyboardDeviceResources
}; // PS/2 Keyboard Controller
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiPs2MouseDevice = {
{EISA_PNP_ID(0x303), 1}, mPcatIsaAcpiPs2MouseDeviceResources
}; // PS/2 Mouse Controller
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiFloppyADevice = {
{EISA_PNP_ID(0x604), 0}, mPcatIsaAcpiFloppyResources
}; // Floppy Disk Controller A:
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiFloppyBDevice = {
{EISA_PNP_ID(0x604), 1}, mPcatIsaAcpiFloppyResources
}; // Floppy Disk Controller B:
//
// Table of ISA Controllers
//
EFI_ISA_ACPI_RESOURCE_LIST gPcatIsaAcpiDeviceList[7] = {{{0, 0}, NULL}};
/**
Initialize gPcatIsaAcpiDeviceList.
**/
VOID
InitializePcatIsaAcpiDeviceList (
VOID
)
{
UINTN Index;
Index = 0;
if (PcdGetBool (PcdIsaAcpiCom1Enable)) {
CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiCom1Device, sizeof(mPcatIsaAcpiCom1Device));
Index++;
}
if (PcdGetBool (PcdIsaAcpiCom2Enable)) {
CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiCom2Device, sizeof(mPcatIsaAcpiCom2Device));
Index++;
}
if (PcdGetBool (PcdIsaAcpiPs2KeyboardEnable)) {
CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiPs2KeyboardDevice, sizeof(mPcatIsaAcpiPs2KeyboardDevice));
Index++;
}
if (PcdGetBool (PcdIsaAcpiPs2MouseEnable)) {
CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiPs2MouseDevice, sizeof(mPcatIsaAcpiPs2MouseDevice));
Index++;
}
if (PcdGetBool (PcdIsaAcpiFloppyAEnable)) {
CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiFloppyADevice, sizeof(mPcatIsaAcpiFloppyADevice));
Index++;
}
if (PcdGetBool (PcdIsaAcpiFloppyBEnable)) {
CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiFloppyBDevice, sizeof(mPcatIsaAcpiFloppyBDevice));
Index++;
}
}
//
// ISA ACPI Protocol Functions
//
/**
Enumerate the ISA devices on the ISA bus.
@param Device Point to device ID instance
@param IsaAcpiDevice On return, point to resource data for Isa device
@param NextIsaAcpiDevice On return, point to resource data for next Isa device
**/
VOID
IsaDeviceLookup (
IN EFI_ISA_ACPI_DEVICE_ID *Device,
OUT EFI_ISA_ACPI_RESOURCE_LIST **IsaAcpiDevice,
OUT EFI_ISA_ACPI_RESOURCE_LIST **NextIsaAcpiDevice
)
{
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]);
}
}
/**
Enumerate the ISA devices on the ISA bus
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@retval EFI_NOT_FOUND Can not found the next Isa device.
@retval EFI_SUCCESS Success retrieve the next Isa device for enumration.
**/
EFI_STATUS
EFIAPI
IsaDeviceEnumerate (
IN EFI_ISA_ACPI_PROTOCOL *This,
OUT EFI_ISA_ACPI_DEVICE_ID **Device
)
{
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;
}
/**
Set ISA device power
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@param OnOff TRUE for setting isa device power on,
FALSE for setting isa device power off
@return EFI_SUCCESS Success to change power status for isa device.
**/
EFI_STATUS
EFIAPI
IsaDeviceSetPower (
IN EFI_ISA_ACPI_PROTOCOL *This,
IN EFI_ISA_ACPI_DEVICE_ID *Device,
IN BOOLEAN OnOff
)
{
return EFI_SUCCESS;
}
/**
Get current resource for the specific ISA device.
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@param ResourceList On return, point to resources instances for given isa device
@retval EFI_NOT_FOUND Can not found the resource instance for given isa device
@retval EFI_SUCCESS Success to get resource instance for given isa device.
**/
EFI_STATUS
EFIAPI
IsaGetCurrentResource (
IN EFI_ISA_ACPI_PROTOCOL *This,
IN EFI_ISA_ACPI_DEVICE_ID *Device,
OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList
)
{
IsaDeviceLookup (Device, ResourceList, NULL);
if (*ResourceList == NULL) {
return EFI_NOT_FOUND;
}
return EFI_SUCCESS;
}
/**
Get possible resource for the specific ISA device.
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@param ResourceList On return, point to resources instances for given isa device
@retval EFI_SUCCESS Success to get resource instance for given isa device.
**/
EFI_STATUS
EFIAPI
IsaGetPossibleResource (
IN EFI_ISA_ACPI_PROTOCOL *This,
IN EFI_ISA_ACPI_DEVICE_ID *Device,
OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList
)
{
return EFI_SUCCESS;
}
/**
Set resource for the specific ISA device.
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@param ResourceList Point to resources instances for given isa device
@return EFI_SUCCESS Success to set resource.
**/
EFI_STATUS
EFIAPI
IsaSetResource (
IN EFI_ISA_ACPI_PROTOCOL *This,
IN EFI_ISA_ACPI_DEVICE_ID *Device,
IN EFI_ISA_ACPI_RESOURCE_LIST *ResourceList
)
{
return EFI_SUCCESS;
}
/**
Enable/Disable the specific ISA device.
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@param Enable Enable/Disable
@return EFI_SUCCESS Success to enable/disable.
**/
EFI_STATUS
EFIAPI
IsaEnableDevice (
IN EFI_ISA_ACPI_PROTOCOL *This,
IN EFI_ISA_ACPI_DEVICE_ID *Device,
IN BOOLEAN Enable
)
{
return EFI_SUCCESS;
}
/**
Initialize the specific ISA device.
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@param Device Point to device ID instance
@return EFI_SUCCESS Success to initialize.
**/
EFI_STATUS
EFIAPI
IsaInitDevice (
IN EFI_ISA_ACPI_PROTOCOL *This,
IN EFI_ISA_ACPI_DEVICE_ID *Device
)
{
return EFI_SUCCESS;
}
/**
Initialize the ISA interface.
@param This Point to instance of EFI_ISA_ACPI_PROTOCOL
@return EFI_SUCCESS Success to initialize ISA interface.
**/
EFI_STATUS
EFIAPI
IsaInterfaceInit (
IN EFI_ISA_ACPI_PROTOCOL *This
)
{
return EFI_SUCCESS;
}