mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-01 12:53:27 +01:00
214 lines
7.9 KiB
C
214 lines
7.9 KiB
C
/** @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__
|