/** @file | |
The SioBusDxe driver is used to create child devices on the ISA bus and | |
installs the Super I/O protocols on them. | |
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __SIO_SERVICE_H__ | |
#define __SIO_SERVICE_H__ | |
#pragma pack(1) | |
typedef struct { | |
EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR Io; | |
EFI_ACPI_END_TAG_DESCRIPTOR End; | |
} SIO_RESOURCES_IO; | |
#pragma pack() | |
typedef struct { | |
UINT32 Hid; | |
UINT32 Uid; | |
ACPI_RESOURCE_HEADER_PTR Resources; | |
} SIO_DEVICE_INFO; | |
// | |
// SIO device private data structure | |
// | |
typedef struct { | |
UINT32 Signature; | |
EFI_HANDLE Handle; | |
EFI_PCI_IO_PROTOCOL *PciIo; | |
EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
EFI_SIO_PROTOCOL Sio; | |
UINT32 DeviceIndex; | |
} SIO_DEV; | |
#define SIO_DEV_SIGNATURE SIGNATURE_32 ('S', 'I', 'O', 'D') | |
#define SIO_DEV_FROM_SIO(a) CR (a, SIO_DEV, Sio, SIO_DEV_SIGNATURE) | |
// | |
// Super I/O Protocol interfaces | |
// | |
/** | |
Provides a low level access to the registers for the Super I/O. | |
@param[in] This Indicates a pointer to the calling context. | |
@param[in] Write Specifies the type of the register operation. | |
If this parameter is TRUE, Value is interpreted | |
as an input parameter and the operation is a | |
register write. If this parameter is FALSE, | |
Value is interpreted as an output parameter and | |
the operation is a register read. | |
@param[in] ExitCfgMode Exit Configuration Mode Indicator. If this | |
parameter is set to TRUE, the Super I/O driver | |
will turn off configuration mode of the Super | |
I/O prior to returning from this function. If | |
this parameter is set to FALSE, the Super I/O | |
driver will leave Super I/O in the | |
configuration mode. The Super I/O driver must | |
track the current state of the Super I/O and | |
enable the configuration mode of Super I/O if | |
necessary prior to register access. | |
@param[in] Register Register number. | |
@param[in,out] Value If Write is TRUE, Value is a pointer to the | |
buffer containing the byte of data to be | |
written to the Super I/O register. If Write is | |
FALSE, Value is a pointer to the destination | |
buffer for the byte of data to be read from the | |
Super I/O register. | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_INVALID_PARAMETER The Value is NULL. | |
@retval EFI_INVALID_PARAMETER Invalid Register number. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SioRegisterAccess ( | |
IN CONST EFI_SIO_PROTOCOL *This, | |
IN BOOLEAN Write, | |
IN BOOLEAN ExitCfgMode, | |
IN UINT8 Register, | |
IN OUT UINT8 *Value | |
); | |
/** | |
Provides an interface to get a list of the current resources consumed by the | |
device in the ACPI Resource Descriptor format. | |
GetResources() returns a list of resources currently consumed by the device. | |
The ResourceList is a pointer to the buffer containing resource descriptors | |
for the device. The descriptors are in the format of Small or Large ACPI | |
resource descriptor as defined by ACPI specification (2.0 & 3.0). The buffer | |
of resource descriptors is terminated with the 'End tag' resource descriptor. | |
@param[in] This Indicates a pointer to the calling context. | |
@param[out] ResourceList A pointer to an ACPI resource descriptor list | |
that defines the current resources used by the | |
device. | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_INVALID_PARAMETER ResourceList is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SioGetResources ( | |
IN CONST EFI_SIO_PROTOCOL *This, | |
OUT ACPI_RESOURCE_HEADER_PTR *ResourceList | |
); | |
/** | |
Sets the resources for the device. | |
@param[in] This Indicates a pointer to the calling context. | |
@param[in] ResourceList Pointer to the ACPI resource descriptor list. | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_INVALID_PARAMETER ResourceList is invalid. | |
@retval EFI_ACCESS_DENIED Some of the resources in ResourceList are in | |
use. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SioSetResources ( | |
IN CONST EFI_SIO_PROTOCOL *This, | |
IN ACPI_RESOURCE_HEADER_PTR ResourceList | |
); | |
/** | |
Provides a collection of resource descriptor lists. Each resource descriptor | |
list in the collection defines a combination of resources that can | |
potentially be used by the device. | |
@param[in] This Indicates a pointer to the calling context. | |
@param[out] ResourceCollection Collection of the resource descriptor | |
lists. | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_INVALID_PARAMETER ResourceCollection is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SioPossibleResources ( | |
IN CONST EFI_SIO_PROTOCOL *This, | |
OUT ACPI_RESOURCE_HEADER_PTR *ResourceCollection | |
); | |
/** | |
Provides an interface for a table based programming of the Super I/O | |
registers. | |
The Modify() function provides an interface for table based programming of | |
the Super I/O registers. This function can be used to perform programming of | |
multiple Super I/O registers with a single function call. For each table | |
entry, the Register is read, its content is bitwise ANDed with AndMask, and | |
then ORed with OrMask before being written back to the Register. The Super | |
I/O driver must track the current state of the Super I/O and enable the | |
configuration mode of Super I/O if necessary prior to table processing. Once | |
the table is processed, the Super I/O device has to be returned to the | |
original state. | |
@param[in] This Indicates a pointer to the calling context. | |
@param[in] Command A pointer to an array of NumberOfCommands | |
EFI_SIO_REGISTER_MODIFY structures. Each | |
structure specifies a single Super I/O register | |
modify operation. | |
@param[in] NumberOfCommands Number of elements in the Command array. | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_INVALID_PARAMETER Command is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SioModify ( | |
IN CONST EFI_SIO_PROTOCOL *This, | |
IN CONST EFI_SIO_REGISTER_MODIFY *Command, | |
IN UINTN NumberOfCommands | |
); | |
// | |
// Internal functions | |
// | |
/** | |
Create all the ISA child devices on the ISA bus controller (PCI to ISA | |
bridge). | |
@param[in] This The EFI_DRIVER_BINDING_PROTOCOL instance. | |
@param[in] Controller The handle of ISA bus controller. | |
@param[in] PciIo The pointer to the PCI protocol. | |
@param[in] ParentDevicePath Device path of the ISA bus controller. | |
@retval The number of child device that is successfully created. | |
**/ | |
UINT32 | |
SioCreateAllChildDevices ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN EFI_PCI_IO_PROTOCOL *PciIo, | |
IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath | |
); | |
#endif // __SIO_SERVICE_H__ |