/** @file
Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __USRA_ACCESS_LIB_H__
#define __USRA_ACCESS_LIB_H__
#include
#include
#include
#include
#include
#include
#include
//
// Get Aligned Access Address
//
typedef
VOID
(EFIAPI *GET_ALLIGNED_ACCESS_ADDRESS) (VOID*, BOOLEAN, USRA_ADDRESS*, UINTN*);
//
// Register Read
//
typedef
RETURN_STATUS
(EFIAPI *REGISTER_READ) (USRA_ADDRESS *, VOID *);
//
// Register Write
//
typedef
RETURN_STATUS
(EFIAPI *REGISTER_WRITE) (USRA_ADDRESS *, VOID *);
//
// Register Write
//
typedef
RETURN_STATUS
(EFIAPI *REGISTER_MODIFY) (USRA_ADDRESS *, VOID *, VOID *);
/**
This API get the Pcie address from the given USRA Address.
@param[in] Address A pointer of the address of the USRA Address Structure to be read out
@retval NONE
**/
VOID
GetPcieAccessAddress (
IN VOID *Global,
IN BOOLEAN Virtual,
IN USRA_ADDRESS *Address,
OUT UINTN *AlignedAddress
);
/**
This API get the CSR address from the given USRA Address.
@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 NONE
**/
VOID
GetCsrAccessAddress (
IN VOID *Global,
IN BOOLEAN Virtual,
IN USRA_ADDRESS *Address,
OUT UINTN *AlignedAddress
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit Pcie 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
PcieRegisterRead (
IN USRA_ADDRESS *Address,
IN VOID *Buffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit Pcie block 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
PcieBlkRegisterRead (
IN USRA_ADDRESS *Address,
IN VOID *Buffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit CSR 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
CsrRegisterRead (
IN USRA_ADDRESS *Address,
IN VOID *Buffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit Pcie silicon register write operations.
It transfers data from a naturally aligned data buffer into a 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
PcieRegisterWrite (
IN USRA_ADDRESS *Address,
OUT VOID *Buffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit Pcie block silicon register write operations.
It transfers data from a naturally aligned data buffer into a 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
PcieBlkRegisterWrite (
IN USRA_ADDRESS *Address,
OUT VOID *Buffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit CSR silicon register write operations.
It transfers data from a naturally aligned data buffer into a 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
CsrRegisterWrite (
IN USRA_ADDRESS *Address,
OUT VOID *Buffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit Pcie 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 modified
@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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
PcieRegisterModify (
IN USRA_ADDRESS *Address,
IN VOID *AndBuffer,
IN VOID *OrBuffer
);
/**
This API Perform 8-bit, 16-bit, 32-bit or 64-bit CSR 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 modified
@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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
CsrRegisterModify (
IN USRA_ADDRESS *Address,
IN VOID *AndBuffer,
IN VOID *OrBuffer
);
/**
Perform MMIO read
@param[in] AccessWidth Access Width
@param[in] AlignedAddress An address to be read out
@param[in] Buffer A pointer of buffer contains the data to be read out
@retval RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
UsraRegAlignedRead (
IN UINT32 AccessWidth,
IN UINTN AlignedAddress,
OUT VOID *Buffer
);
/**
Perform AND then OR operations for a input data
@param[in out] Data A pointer of the address of the register to be modified
@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()
@param[in] NumOfByte NumOfByte Count of byte data to be performed
@retval NONE
**/
VOID
DataAndOr (
IN UINT64 *Data,
IN VOID *AndBuffer,
IN VOID *OrBuffer,
IN UINT8 NumOfByte
);
/**
Perform MMIO write
@param[in] AccessWidth Access Width
@param[in] AlignedAddress An address to be written
@param[in] Buffer A pointer of buffer contains the data to be written
@retval RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
UsraRegAlignedWrite (
IN UINT32 AccessWidth,
IN UINTN AlignedAddress,
OUT VOID *Buffer
);
#endif