diff options
Diffstat (limited to 'ReferenceCode/Chipset/LynxPoint/Protocol/SmmIoTrapDispatch/SmmIoTrapDispatch.h')
-rw-r--r-- | ReferenceCode/Chipset/LynxPoint/Protocol/SmmIoTrapDispatch/SmmIoTrapDispatch.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/ReferenceCode/Chipset/LynxPoint/Protocol/SmmIoTrapDispatch/SmmIoTrapDispatch.h b/ReferenceCode/Chipset/LynxPoint/Protocol/SmmIoTrapDispatch/SmmIoTrapDispatch.h new file mode 100644 index 0000000..8923d3c --- /dev/null +++ b/ReferenceCode/Chipset/LynxPoint/Protocol/SmmIoTrapDispatch/SmmIoTrapDispatch.h @@ -0,0 +1,182 @@ +/** @file + PCH SMM IO Trap Dispatch Protocol + +@copyright + Copyright (c) 2005 - 2012 Intel Corporation. All rights reserved + This software and associated documentation (if any) is furnished + under a license and may only be used or copied in accordance + with the terms of the license. Except as permitted by such + license, no part of this software or documentation may be + reproduced, stored in a retrieval system, or transmitted in any + form or by any means without the express written consent of + Intel Corporation. + + This file contains a 'Sample Driver' and is licensed as such + under the terms of your license agreement with Intel or your + vendor. This file may be modified by the user, subject to + the additional terms of the license agreement +**/ +#ifndef _EFI_SMM_IO_TRAP_DISPATCH_H_ +#define _EFI_SMM_IO_TRAP_DISPATCH_H_ + +/// +/// GUID for the SMM IO Trap Dispatch Protocol +/// +/// EDK and EDKII have different GUID formats +/// +#if !defined(EDK_RELEASE_VERSION) || (EDK_RELEASE_VERSION < 0x00020000) +#define EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL_GUID \ + { \ + 0xdb7f536b, 0xede4, 0x4714, 0xa5, 0xc8, 0xe3, 0x46, 0xeb, 0xaa, 0x20, 0x1d \ + } +#else +#define EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL_GUID \ + { \ + 0xdb7f536b, 0xede4, 0x4714, \ + { \ + 0xa5, 0xc8, 0xe3, 0x46, 0xeb, 0xaa, 0x20, 0x1d \ + } \ + } +#endif +// +// Extern the GUID for protocol users. +// +extern EFI_GUID gEfiSmmIoTrapDispatchProtocolGuid; + +// +// Forward reference for ANSI C compatibility +// +typedef struct _EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL; + +// +// Related Definitions +// +/// +/// IO Trap valid types +/// +typedef enum { + WriteTrap, + ReadTrap, + ReadWriteTrap, + IoTrapTypeMaximum +} EFI_SMM_IO_TRAP_DISPATCH_TYPE; + +/// +/// IO Trap context structure containing information about the IO trap event that should invoke the callback +/// +typedef struct { + UINT16 Address; ///< IO Trap range base address (NULL means allocate) + UINT16 Length; ///< IO Trap range length + EFI_SMM_IO_TRAP_DISPATCH_TYPE Type; ///< Access types to trap on + VOID *Context; ///< Callback function context + BOOLEAN MergeDisable; ///< Determine if IoTrap needs to be merged with other registered IoTrap +} EFI_SMM_IO_TRAP_DISPATCH_REGISTER_CONTEXT; + +/// +/// IO Trap context structure containing information about the IO trap that occurred +/// +typedef struct { + UINT16 Address; ///< IO address trapped + EFI_SMM_IO_TRAP_DISPATCH_TYPE Type; ///< IO access type + UINT32 WriteData; ///< Data written (contents undefined for read trap) + VOID *Context; ///< Callback function context +} EFI_SMM_IO_TRAP_DISPATCH_CALLBACK_CONTEXT; + +// +// Member functions +// + +/** + Dispatch function for an IO Trap specific SMI handler. + + @param[in] DispatchHandle Handle of this dispatch function. + @param[in] CallbackContext Pointer to the dispatched function's context. + The CallbackContext fields are updated + by the dispatching driver prior to + invoking this callback function. + + @retval None +**/ +typedef +VOID +(EFIAPI *EFI_SMM_IO_TRAP_DISPATCH_CALLBACK) ( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_IO_TRAP_DISPATCH_CALLBACK_CONTEXT * CallbackContext + ); + +/** + Register an IO trap SMI child handler for a specified SMI. + This service will register a child for a given SMI source. + The caller will provide information about the IO trap characteristics via the context. + This includes base address, length, and type (read, write, read/write). + The service will allocate the IO range if the base address is 0, and the RegisterContext + Address field will be updated and returned to the caller. + The service will allocate system resources via GCD services for the requested IO trap range and type. + An error will be returned if insufficient resources are available to fulfill the request. + 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. + An error may be returned if some or all of the requested resources conflict with an existing IO trap child handler. + It is not required that implementations will allow multiple children for a single IO trap SMI source. + Some implementations may support multiple children. + + @param[in] This Pointer to the EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL instance. + @param[in] DispatchFunction Pointer to the 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 the dispatch function, for when interfacing with the parent SMM driver. + Type EFI_HANDLE is defined in InstallProtocolInterface() in the EFI 1.10 Specification. + This may not be NULL. + + @retval EFI_SUCCESS The dispatch function has been successfully registered. + @retval EFI_DEVICE_ERROR The driver was unable to complete due to hardware error. + @retval EFI_OUT_OF_RESOURCES Insufficient resources are available to fulfill + the IO trap range request. + @retval EFI_INVALID_PARAMETER RegisterContext is invalid. The input value is not within a valid range. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_IO_TRAP_DISPATCH_REGISTER) ( + IN EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL * This, + IN EFI_SMM_IO_TRAP_DISPATCH_CALLBACK DispatchFunction, + IN OUT EFI_SMM_IO_TRAP_DISPATCH_REGISTER_CONTEXT * RegisterContext, + OUT EFI_HANDLE * DispatchHandle + ); + +/** + Unregister a child SMI source dispatch function with a parent SMM driver + + This service removes a previously installed child dispatch handler. + This does not guarantee that the system resources will be freed from the GCD. + + @param[in] This Pointer to the EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL instance. + @param[in] DispatchHandle Handle of the child service to remove. + Type EFI_HANDLE is defined in InstallProtocolInterface() in the EFI 1.10 Specification. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered. + @retval EFI_INVALID_PARAMETER Handle is invalid. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_IO_TRAP_DISPATCH_UNREGISTER) ( + IN EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL * This, + IN EFI_HANDLE * DispatchHandle + ); + +/// +/// Interface structure for the SMM IO trap specific SMI Dispatch Protocol +/// +/// This protocol provides the ability to install child handlers for IO trap SMI. +/// These handlers will be invoked to respond to specific IO trap SMI. IO trap SMI +/// would typically be generated on reads or writes to specific processor IO space +/// addresses or ranges. This protocol will typically abstract a limited hardware +/// resource, so callers should handle errors gracefully. +/// +struct _EFI_SMM_IO_TRAP_DISPATCH_PROTOCOL { + EFI_SMM_IO_TRAP_DISPATCH_REGISTER Register; ///< Installs a child service to be dispatched when the requested IO trap SMI occurs. + EFI_SMM_IO_TRAP_DISPATCH_UNREGISTER UnRegister; ///< Removes a previously registered child service. +}; + +#endif |