/** @file
Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "UsraAccessLib.h"
GET_ALLIGNED_ACCESS_ADDRESS mAccessAddrPtr[] =
{
&GetPcieAccessAddress, // AddrTypePCIE
&GetPcieAccessAddress, // AddrTypePCIEBLK
&GetCsrAccessAddress, // AddrTypeCSR
};
REGISTER_READ mRegisterReadPtr[] =
{
&PcieRegisterRead, // AddrTypePCIE
&PcieBlkRegisterRead, // AddrTypePCIEBLK
&CsrRegisterRead, // AddrTypeCSR
};
REGISTER_WRITE mRegisterWritePtr[] =
{
&PcieRegisterWrite, // AddrTypePCIE
&PcieBlkRegisterWrite, // AddrTypePCIEBLK
&CsrRegisterWrite, // AddrTypeCSR
};
REGISTER_MODIFY mRegisterModifyPtr[] =
{
&PcieRegisterModify, // AddrTypePCIE
&PcieRegisterModify, // AddrTypePCIEBLK
&CsrRegisterModify, // AddrTypeCSR
};
/**
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
)
{
switch (AccessWidth)
{
case UsraWidth8:
*((UINT8*)Buffer) = MmioRead8 (AlignedAddress);
break;
case UsraWidth16:
*((UINT16*)Buffer) = MmioRead16 (AlignedAddress);
break;
case UsraWidth32:
*((UINT32*)Buffer) = MmioRead32 (AlignedAddress);
break;
default:
*((UINT64*)Buffer) = MmioRead64 (AlignedAddress);
break;
}
return RETURN_SUCCESS;
};
/**
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
)
{
switch (AccessWidth)
{
case UsraWidth8:
MmioWrite8 (AlignedAddress,*((UINT8*)Buffer));
break;
case UsraWidth16:
MmioWrite16 (AlignedAddress,*((UINT16*)Buffer));
break;
case UsraWidth32:
MmioWrite32 (AlignedAddress,*((UINT32*)Buffer));
break;
default:
MmioWrite64 (AlignedAddress, *((UINT64*)Buffer));
break;
}
return RETURN_SUCCESS;
}
/**
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
)
{
union{
UINT64 QW;
UINT8 Byte[8];
} Buffer;
UINT8 AndData[8], OrData[8], i;
Buffer.QW = *Data;
for(i=0;iAttribute.AddrType] (NULL, 0, Address, &AlignedAddress);
return AlignedAddress;
};
/**
This API performs 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
EFIAPI
RegisterRead (
IN USRA_ADDRESS *Address,
IN VOID *Buffer
)
{
return mRegisterReadPtr[Address->Attribute.AddrType] (Address, Buffer);
};
/**
This API performs 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
EFIAPI
RegisterWrite (
IN USRA_ADDRESS *Address,
OUT VOID *Buffer
)
{
return mRegisterWritePtr[Address->Attribute.AddrType] (Address, Buffer);
};
/**
This API performs 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 RETURN_SUCCESS The function completed successfully.
**/
RETURN_STATUS
EFIAPI
RegisterModify (
IN USRA_ADDRESS *Address,
IN VOID *AndBuffer,
IN VOID *OrBuffer
)
{
return mRegisterModifyPtr[Address->Attribute.AddrType] (Address, AndBuffer, OrBuffer);
};