/** @file
Defines and prototypes for the IoTrap SMM driver
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _IO_TRAP_H_
#define _IO_TRAP_H_
//
// Include files
//
#include
#include
#include
#include
#define IO_TRAP_HANDLER_NUM 4
//
// Driver private data
//
#define IO_TRAP_INSTANCE_SIGNATURE SIGNATURE_32 ('I', 'O', 'T', 'P')
typedef struct {
UINT32 Signature;
EFI_HANDLE Handle;
EFI_SMM_IO_TRAP_DISPATCH2_PROTOCOL EfiSmmIoTrapDispatchProtocol;
EFI_HANDLE IoTrapHandle[IO_TRAP_HANDLER_NUM];
LIST_ENTRY CallbackDataBase;
UINT32 TrapUsedLength[IO_TRAP_HANDLER_NUM];
BOOLEAN MergeDisable[IO_TRAP_HANDLER_NUM]; ///< Determine if IoTrap can be merged with other IoTrap
PCH_SMM_IO_TRAP_CONTROL_PROTOCOL PchSmmIoTrapControlProtocol; ///< Protocol for runtime control the IoTrap state
BOOLEAN TrackIoResource[IO_TRAP_HANDLER_NUM];
} IO_TRAP_INSTANCE;
#define IO_TRAP_INSTANCE_FROM_THIS(a) CR (a, IO_TRAP_INSTANCE, EfiSmmIoTrapDispatchProtocol, IO_TRAP_INSTANCE_SIGNATURE)
///
/// "IOTRAP" RECORD
/// Linked list data structures
///
#define IO_TRAP_RECORD_SIGNATURE SIGNATURE_32 ('I', 'T', 'R', 'C')
typedef struct _IO_TRAP_RECORD {
UINT32 Signature;
LIST_ENTRY Link;
EFI_SMM_IO_TRAP_REGISTER_CONTEXT Context;
EFI_SMM_HANDLER_ENTRY_POINT2 Callback;
} IO_TRAP_RECORD;
#define IO_TRAP_RECORD_FROM_LINK(_record) CR (_record, IO_TRAP_RECORD, Link, IO_TRAP_RECORD_SIGNATURE)
//
// Prototypes
//
/**
The IoTrap module abstracts PCH I/O trapping capabilities for other drivers.
This driver manages the limited I/O trap resources.
@param[in] ImageHandle Image handle for this driver image
@retval EFI_SUCCESS Driver initialization completed successfully
**/
EFI_STATUS
EFIAPI
InstallIoTrap (
IN EFI_HANDLE ImageHandle
);
/**
Register a new IO Trap SMI dispatch function with a parent SMM driver.
The caller will provide information about the IO trap characteristics via
the context. This includes base address, length, read vs. r/w, etc.
This function will autoallocate IO base address from a common pool if the base address is 0,
and the RegisterContext Address field will be updated.
The service will not perform GCD allocation if the base address is non-zero.
In this case, the caller is responsible for the existence and allocation of the
specific IO range.
This function looks for the suitable handler and Register a new IoTrap handler
if the IO Trap handler is not used. It also enable the IO Trap Range to generate
SMI.
@param[in] This Pointer to the EFI_SMM_IO_TRAP_DISPATCH2_PROTOCOL instance.
@param[in] DispatchFunction Pointer to dispatch function to be invoked for
this SMI source.
@param[in, out] RegisterContext Pointer to the dispatch function's context.
The caller fills this context in before calling
the register function to indicate to the register
function the IO trap SMI source for which the dispatch
function should be invoked. This may not be NULL.
@param[out] DispatchHandle Handle of dispatch function, for when interfacing
with the parent SMM driver, will be the address of linked
list link in the call back record. This may not be NULL.
@retval EFI_SUCCESS The dispatch function has been successfully
registered and the SMI source has been enabled.
@retval EFI_DEVICE_ERROR The driver was unable to enable the SMI source.
@retval EFI_OUT_OF_RESOURCES Insufficient resources are available
@retval EFI_INVALID_PARAMETER Address requested is already in use.
@retval EFI_ACCESS_DENIED Return access denied if the SmmReadyToLock event has been triggered
**/
EFI_STATUS
EFIAPI
IoTrapRegister (
IN CONST EFI_SMM_IO_TRAP_DISPATCH2_PROTOCOL *This,
IN EFI_SMM_HANDLER_ENTRY_POINT2 DispatchFunction,
IN OUT EFI_SMM_IO_TRAP_REGISTER_CONTEXT *RegisterContext,
OUT EFI_HANDLE *DispatchHandle
);
/**
Unregister a child SMI source dispatch function with a parent SMM driver.
@param[in] This Pointer to the EFI_SMM_IO_TRAP_DISPATCH2_PROTOCOL instance.
@param[in] DispatchHandle Handle of dispatch function to deregister.
@retval EFI_SUCCESS The dispatch function has been successfully
unregistered and the SMI source has been disabled
if there are no other registered child dispatch
functions for this SMI source.
@retval EFI_INVALID_PARAMETER Handle is invalid.
@retval EFI_ACCESS_DENIED Return access denied if the SmmReadyToLock event has been triggered
**/
EFI_STATUS
EFIAPI
IoTrapUnRegister (
IN CONST EFI_SMM_IO_TRAP_DISPATCH2_PROTOCOL *This,
IN EFI_HANDLE DispatchHandle
);
/**
This I/O Trap SMI handler invokes the ACPI reference code to handle the SMI.
It currently assumes it owns all of the IO trap SMI.
@param[in] DispatchHandle Not used
**/
VOID
EFIAPI
IoTrapCallback (
IN EFI_HANDLE DispatchHandle
);
/**
Pause IoTrap callback function.
This function disables the SMI enable of IoTrap according to the DispatchHandle,
which is returned by IoTrap callback registration. It only supports the DispatchHandle
with MergeDisable TRUE and address not zero.
@param[in] This Pointer to the PCH_SMM_IO_TRAP_CONTROL_PROTOCOL instance.
@param[in] DispatchHandle Handle of the child service to change state.
@retval EFI_SUCCESS This operation is complete.
@retval EFI_INVALID_PARAMETER The DispatchHandle is invalid.
@retval EFI_ACCESS_DENIED The SMI status is alrady PAUSED.
**/
EFI_STATUS
EFIAPI
IoTrapControlPause (
IN PCH_SMM_IO_TRAP_CONTROL_PROTOCOL * This,
IN EFI_HANDLE DispatchHandle
);
/**
Resume IoTrap callback function.
This function enables the SMI enable of IoTrap according to the DispatchHandle,
which is returned by IoTrap callback registration. It only supports the DispatchHandle
with MergeDisable TRUE and address not zero.
@param[in] This Pointer to the PCH_SMM_IO_TRAP_CONTROL_PROTOCOL instance.
@param[in] DispatchHandle Handle of the child service to change state.
@retval EFI_SUCCESS This operation is complete.
@retval EFI_INVALID_PARAMETER The DispatchHandle is invalid.
@retval EFI_ACCESS_DENIED The SMI status is alrady RESUMED.
**/
EFI_STATUS
EFIAPI
IoTrapControlResume (
IN PCH_SMM_IO_TRAP_CONTROL_PROTOCOL * This,
IN EFI_HANDLE DispatchHandle
);
#endif