OvmfPkg: Add an Super IO bus driver
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1495 There is a plan to remove the IntelFrameworkModulePkg: https://bugzilla.tianocore.org/show_bug.cgi?id=1605 This patch will a new OVMF Super I/O bus driver which will create the below child devices: * COM 1 UART * COM 2 UART * PS/2 Keyboard and installs the Super I/O Protocol on them. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ray Ni <ray.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
221
OvmfPkg/SioBusDxe/SioService.h
Normal file
221
OvmfPkg/SioBusDxe/SioService.h
Normal file
@ -0,0 +1,221 @@
|
||||
/** @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>
|
||||
|
||||
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.
|
||||
|
||||
**/
|
||||
|
||||
#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__
|
Reference in New Issue
Block a user