/** @file Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __SILICON_REG_ACCESS_PROTOCOL_H__ #define __SILICON_REG_ACCESS_PROTOCOL_H__ #include extern EFI_GUID gUsraProtocolGuid; /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register read operations. It transfers data from a register into a naturally aligned data buffer. @param[in] Address A pointer of the address of the USRA Address Structure to be read out @param[in] Buffer A pointer of buffer for the value read from the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ typedef INTN (EFIAPI *USRA_PROTOCOL_REG_READ)( IN USRA_ADDRESS *Address, OUT VOID *Buffer ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register write operations. It transfers data from a naturally aligned data buffer into a silicon register. @param[in] Address A pointer of the address of the USRA Address Structure to be written @param[in] Buffer A pointer of buffer for the value write to the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ typedef INTN (EFIAPI *USRA_PROTOCOL_REG_WRITE)( IN USRA_ADDRESS *Address, IN VOID *Buffer ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register write operations. It transfers data from a naturally aligned data buffer into a silicon register. @param[in] Address A pointer of the address of the USRA Address Structure to be written @param[in] Buffer A pointer of buffer for the value write to the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ typedef INTN (EFIAPI *USRA_PROTOCOL_REG_MODIFY)( IN USRA_ADDRESS *Address, IN VOID *AndBuffer, IN VOID *OrBuffer ); /** This API get the flat address from the given USRA Address. @param[in] Address A pointer of the address of the USRA Address Structure to be read out @retval The flat address **/ typedef INTN (EFIAPI *USRA_PROTOCOL_GET_ADDR)( IN USRA_ADDRESS *Address ); /// /// This service abstracts the ability to read/write silicon register. /// typedef struct { USRA_PROTOCOL_REG_READ RegRead; USRA_PROTOCOL_REG_WRITE RegWrite; USRA_PROTOCOL_REG_MODIFY RegModify; USRA_PROTOCOL_GET_ADDR GetRegAddr; } USRA_PROTOCOL; /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register read operations. It transfers data from a register into a naturally aligned data buffer. @param[in] Address A pointer of the address of the USRA Address Structure to be read out @param[in] Buffer A pointer of buffer for the value read from the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ INTN EFIAPI DxeRegRead ( IN USRA_ADDRESS *Address, IN VOID *Buffer ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register write operations. It transfers data from a naturally aligned data buffer into a silicon register. @param[in] Address A pointer of the address of the USRA Address Structure to be written @param[in] Buffer A pointer of buffer for the value write to the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ INTN EFIAPI DxeRegWrite ( IN USRA_ADDRESS *Address, OUT VOID *Buffer ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register AND then OR operations. It read data from a register, And it with the AndBuffer, then Or it with the OrBuffer, and write the result back to the register @param[in] Address A pointer of the address of the silicon register to be written @param[in] AndBuffer A pointer of buffer for the value used for AND operation A NULL pointer means no AND operation. RegisterModify() equivalents to RegisterOr() @param[in] OrBuffer A pointer of buffer for the value used for OR operation A NULL pointer means no OR operation. RegisterModify() equivalents to RegisterAnd() @retval NULL The function completed successfully. @retval <>NULL Return Error **/ INTN EFIAPI DxeRegModify ( IN USRA_ADDRESS *Address, IN VOID *AndBuffer, IN VOID *OrBuffer ); /** This API get the flat address from the given USRA Address. @param[in] Address A pointer of the address of the USRA Address Structure to be read out @retval The flat address **/ INTN EFIAPI DxeGetRegAddr ( IN USRA_ADDRESS *Address ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register read operations. It transfers data from a register into a naturally aligned data buffer. @param[in] Address A pointer of the address of the USRA Address Structure to be read out @param[in] Buffer A pointer of buffer for the value read from the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ INTN EFIAPI SmmRegRead ( IN USRA_ADDRESS *Address, IN VOID *Buffer ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register write operations. It transfers data from a naturally aligned data buffer into a silicon register. @param[in] Address A pointer of the address of the USRA Address Structure to be written @param[in] Buffer A pointer of buffer for the value write to the register @retval NULL The function completed successfully. @retval <>NULL Return Error **/ INTN EFIAPI SmmRegWrite ( IN USRA_ADDRESS *Address, OUT VOID *Buffer ); /** This API Perform 8-bit, 16-bit, 32-bit or 64-bit silicon register AND then OR operations. It read data from a register, And it with the AndBuffer, then Or it with the OrBuffer, and write the result back to the register @param[in] Address A pointer of the address of the silicon register to be written @param[in] AndBuffer A pointer of buffer for the value used for AND operation A NULL pointer means no AND operation. RegisterModify() equivalents to RegisterOr() @param[in] OrBuffer A pointer of buffer for the value used for OR operation A NULL pointer means no OR operation. RegisterModify() equivalents to RegisterAnd() @retval NULL The function completed successfully. @retval <>NULL Return Error **/ INTN EFIAPI SmmRegModify ( IN USRA_ADDRESS *Address, IN VOID *AndBuffer, IN VOID *OrBuffer ); /** This API get the flat address from the given USRA Address. @param[in] Address A pointer of the address of the USRA Address Structure to be read out @retval The flat address **/ INTN EFIAPI SmmGetRegAddr ( IN USRA_ADDRESS *Address ); #endif