vendorcode/amd/pi/00670F00/Lib/AmdLib.c: Remove VENDORCODE_FULL_SUPPORT
Remove VENDORCODE_FULL_SUPPORT from file above mentioned file, in preparation to full removal of VENDORCODE_FULL_SUPPORT functions. BUG=b:112578491 TEST=none, VENDORCODE_FULL_SUPPORT already not used. Change-Id: Ic23dcf245b2cee24f7363ca3bb9918eb2f11179c Signed-off-by: Richard Spiegel <richard.spiegel@silverbackltd.com> Reviewed-on: https://review.coreboot.org/28091 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
parent
1d0de7874d
commit
c1cefba150
|
@ -61,18 +61,6 @@ GetPciMmioAddress (
|
||||||
IN AMD_CONFIG_PARAMS *StdHeader
|
IN AMD_CONFIG_PARAMS *StdHeader
|
||||||
);
|
);
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
VOID
|
|
||||||
STATIC
|
|
||||||
LibAmdGetDataFromPtr (
|
|
||||||
IN ACCESS_WIDTH AccessWidth,
|
|
||||||
IN CONST VOID *Data,
|
|
||||||
IN CONST VOID *DataMask,
|
|
||||||
OUT UINT32 *TemData,
|
|
||||||
OUT UINT32 *TempDataMask
|
|
||||||
);
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
IdsOutPort (
|
IdsOutPort (
|
||||||
IN UINT32 Addr,
|
IN UINT32 Addr,
|
||||||
|
@ -277,123 +265,6 @@ Write64Mem32 (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdReadCpuReg (
|
|
||||||
IN UINT8 RegNum,
|
|
||||||
OUT UINT32 *Value
|
|
||||||
)
|
|
||||||
{
|
|
||||||
*Value = 0;
|
|
||||||
switch (RegNum){
|
|
||||||
case CR4_REG:
|
|
||||||
*Value = __readcr4 ();
|
|
||||||
break;
|
|
||||||
case DR0_REG:
|
|
||||||
*Value = __readdr (0);
|
|
||||||
break;
|
|
||||||
case DR1_REG:
|
|
||||||
*Value = __readdr (1);
|
|
||||||
break;
|
|
||||||
case DR2_REG:
|
|
||||||
*Value = __readdr (2);
|
|
||||||
break;
|
|
||||||
case DR3_REG:
|
|
||||||
*Value = __readdr (3);
|
|
||||||
break;
|
|
||||||
case DR7_REG:
|
|
||||||
*Value = __readdr (7);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
*Value = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdWriteCpuReg (
|
|
||||||
IN UINT8 RegNum,
|
|
||||||
IN UINT32 Value
|
|
||||||
)
|
|
||||||
{
|
|
||||||
switch (RegNum){
|
|
||||||
case CR4_REG:
|
|
||||||
__writecr4 (Value);
|
|
||||||
break;
|
|
||||||
case DR0_REG:
|
|
||||||
__writedr (0, Value);
|
|
||||||
break;
|
|
||||||
case DR1_REG:
|
|
||||||
__writedr (1, Value);
|
|
||||||
break;
|
|
||||||
case DR2_REG:
|
|
||||||
__writedr (2, Value);
|
|
||||||
break;
|
|
||||||
case DR3_REG:
|
|
||||||
__writedr (3, Value);
|
|
||||||
break;
|
|
||||||
case DR7_REG:
|
|
||||||
__writedr (7, Value);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdWriteBackInvalidateCache (
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
__wbinvd ();
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdHDTBreakPoint (
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
__writemsr (0xC001100A, __readmsr (0xC001100A) | 1);
|
|
||||||
__debugbreak (); // do you really need icebp? If so, go back to asm code
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
UINT8
|
|
||||||
LibAmdBitScanForward (
|
|
||||||
IN UINT32 value
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Index;
|
|
||||||
for (Index = 0; Index < 32; Index++){
|
|
||||||
if (value & (1 << Index)) break;
|
|
||||||
}
|
|
||||||
return (UINT8) Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
UINT8
|
|
||||||
LibAmdBitScanReverse (
|
|
||||||
IN UINT32 value
|
|
||||||
)
|
|
||||||
{
|
|
||||||
uint8_t bit = 31;
|
|
||||||
do {
|
|
||||||
if (value & (1 << 31))
|
|
||||||
return bit;
|
|
||||||
|
|
||||||
value <<= 1;
|
|
||||||
bit--;
|
|
||||||
|
|
||||||
} while (value != 0);
|
|
||||||
|
|
||||||
return 0xFF; /* Error code indicating no bit found */
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
AMDLIB_OPTIMIZE
|
||||||
VOID
|
VOID
|
||||||
LibAmdMsrRead (
|
LibAmdMsrRead (
|
||||||
|
@ -419,93 +290,6 @@ LibAmdMsrWrite (
|
||||||
__writemsr (MsrAddress, *Value);
|
__writemsr (MsrAddress, *Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
void LibAmdCpuidRead (
|
|
||||||
IN UINT32 CpuidFcnAddress,
|
|
||||||
OUT CPUID_DATA* Value,
|
|
||||||
IN OUT AMD_CONFIG_PARAMS *ConfigPtr
|
|
||||||
)
|
|
||||||
{
|
|
||||||
__cpuid ((int *)Value, CpuidFcnAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
UINT64
|
|
||||||
ReadTSC (
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return __rdtsc ();
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdSimNowEnterDebugger (
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
STATIC CONST UINT8 opcode [] = {0x60, // pushad
|
|
||||||
0xBB, 0x02, 0x00, 0x00, 0x00, // mov ebx, 2
|
|
||||||
0xB8, 0x0B, 0xD0, 0xCC, 0xBA, // mov eax, 0xBACCD00B
|
|
||||||
0x0F, 0xA2, // cpuid
|
|
||||||
0x61, // popad
|
|
||||||
0xC3 // ret
|
|
||||||
};
|
|
||||||
((VOID (*)(VOID)) (size_t) opcode) (); // call the function
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
IdsOutPort (
|
|
||||||
IN UINT32 Addr,
|
|
||||||
IN UINT32 Value,
|
|
||||||
IN UINT32 Flag
|
|
||||||
)
|
|
||||||
{
|
|
||||||
__outdword ((UINT16) Addr, Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
StopHere (
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
VOLATILE UINTN x = 1;
|
|
||||||
while (x);
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdCLFlush (
|
|
||||||
IN UINT64 Address,
|
|
||||||
IN UINT8 Count
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT64 hwcrSave;
|
|
||||||
UINT8 *address32;
|
|
||||||
UINTN Index;
|
|
||||||
address32 = 0;
|
|
||||||
hwcrSave = SetFsBase (Address);
|
|
||||||
for (Index = 0; Index < Count; Index++){
|
|
||||||
_mm_mfence ();
|
|
||||||
_mm_clflush_fs (&address32 [Index * 64]);
|
|
||||||
}
|
|
||||||
RestoreHwcr (hwcrSave);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
LibAmdFinit(
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
/* TODO: finit */
|
|
||||||
__asm__ volatile ("finit");
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* Read IO port
|
* Read IO port
|
||||||
|
@ -582,41 +366,6 @@ LibAmdIoWrite (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Poll IO register
|
|
||||||
*
|
|
||||||
* Poll register until (RegisterValue & DataMask) == Data
|
|
||||||
*
|
|
||||||
* @param[in] AccessWidth Access width
|
|
||||||
* @param[in] IoAddress IO address
|
|
||||||
* @param[in] Data Data to compare
|
|
||||||
* @param[in] DataMask And mask
|
|
||||||
* @param[in] Delay Poll for time in 100ns (not supported)
|
|
||||||
* @param[in] StdHeader Standard configuration header
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdIoPoll (
|
|
||||||
IN ACCESS_WIDTH AccessWidth,
|
|
||||||
IN UINT16 IoAddress,
|
|
||||||
IN CONST VOID *Data,
|
|
||||||
IN CONST VOID *DataMask,
|
|
||||||
IN UINT64 Delay,
|
|
||||||
IN OUT AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 TempData;
|
|
||||||
UINT32 TempMask;
|
|
||||||
UINT32 Value;
|
|
||||||
LibAmdGetDataFromPtr (AccessWidth, Data, DataMask, &TempData, &TempMask);
|
|
||||||
do {
|
|
||||||
LibAmdIoRead (AccessWidth, IoAddress, &Value, NULL);
|
|
||||||
} while (TempData != (Value & TempMask));
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* Read memory/MMIO
|
* Read memory/MMIO
|
||||||
|
@ -694,41 +443,6 @@ LibAmdMemWrite (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Poll Mmio
|
|
||||||
*
|
|
||||||
* Poll register until (RegisterValue & DataMask) == Data
|
|
||||||
*
|
|
||||||
* @param[in] AccessWidth Access width
|
|
||||||
* @param[in] MemAddress Memory address
|
|
||||||
* @param[in] Data Data to compare
|
|
||||||
* @param[in] DataMask AND mask
|
|
||||||
* @param[in] Delay Poll for time in 100ns (not supported)
|
|
||||||
* @param[in] StdHeader Standard configuration header
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdMemPoll (
|
|
||||||
IN ACCESS_WIDTH AccessWidth,
|
|
||||||
IN UINT64 MemAddress,
|
|
||||||
IN CONST VOID *Data,
|
|
||||||
IN CONST VOID *DataMask,
|
|
||||||
IN UINT64 Delay,
|
|
||||||
IN OUT AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 TempData = 0;
|
|
||||||
UINT32 TempMask = 0;
|
|
||||||
UINT32 Value;
|
|
||||||
LibAmdGetDataFromPtr (AccessWidth, Data, DataMask, &TempData, &TempMask);
|
|
||||||
do {
|
|
||||||
LibAmdMemRead (AccessWidth, MemAddress, &Value, NULL);
|
|
||||||
} while (TempData != (Value & TempMask));
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* Read PCI config space
|
* Read PCI config space
|
||||||
|
@ -835,41 +549,6 @@ LibAmdPciWrite (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Poll PCI config space register
|
|
||||||
*
|
|
||||||
* Poll register until (RegisterValue & DataMask) == Data
|
|
||||||
*
|
|
||||||
* @param[in] AccessWidth Access width
|
|
||||||
* @param[in] PciAddress Pci address
|
|
||||||
* @param[in] Data Data to compare
|
|
||||||
* @param[in] DataMask AND mask
|
|
||||||
* @param[in] Delay Poll for time in 100ns (not supported)
|
|
||||||
* @param[in] StdHeader Standard configuration header
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdPciPoll (
|
|
||||||
IN ACCESS_WIDTH AccessWidth,
|
|
||||||
IN PCI_ADDR PciAddress,
|
|
||||||
IN CONST VOID *Data,
|
|
||||||
IN CONST VOID *DataMask,
|
|
||||||
IN UINT64 Delay,
|
|
||||||
IN OUT AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 TempData = 0;
|
|
||||||
UINT32 TempMask = 0;
|
|
||||||
UINT32 Value;
|
|
||||||
LibAmdGetDataFromPtr (AccessWidth, Data, DataMask, &TempData, &TempMask);
|
|
||||||
do {
|
|
||||||
LibAmdPciRead (AccessWidth, PciAddress, &Value, NULL);
|
|
||||||
} while (TempData != (Value & TempMask));
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* Get MMIO base address for PCI accesses
|
* Get MMIO base address for PCI accesses
|
||||||
|
@ -903,207 +582,6 @@ GetPciMmioAddress (
|
||||||
return MmioIsEnabled;
|
return MmioIsEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Read field of PCI config register.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in] Address Pci address (register must be DWORD aligned)
|
|
||||||
* @param[in] Highbit High bit position of the field in DWORD
|
|
||||||
* @param[in] Lowbit Low bit position of the field in DWORD
|
|
||||||
* @param[out] Value Pointer to data
|
|
||||||
* @param[in] StdHeader Standard configuration header
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdPciReadBits (
|
|
||||||
IN PCI_ADDR Address,
|
|
||||||
IN UINT8 Highbit,
|
|
||||||
IN UINT8 Lowbit,
|
|
||||||
OUT UINT32 *Value,
|
|
||||||
IN AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
ASSERT (Highbit < 32 && Lowbit < 32 && Highbit >= Lowbit && (Address.AddressValue & 3) == 0);
|
|
||||||
|
|
||||||
LibAmdPciRead (AccessWidth32, Address, Value, NULL);
|
|
||||||
*Value >>= Lowbit; // Shift
|
|
||||||
|
|
||||||
// A 1 << 32 == 1 << 0 due to x86 SHL instruction, so skip if that is the case
|
|
||||||
|
|
||||||
if ((Highbit - Lowbit) != 31) {
|
|
||||||
*Value &= (((UINT32) 1 << (Highbit - Lowbit + 1)) - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Write field of PCI config register.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in] Address Pci address (register must be DWORD aligned)
|
|
||||||
* @param[in] Highbit High bit position of the field in DWORD
|
|
||||||
* @param[in] Lowbit Low bit position of the field in DWORD
|
|
||||||
* @param[in] Value Pointer to data
|
|
||||||
* @param[in] StdHeader Standard configuration header
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdPciWriteBits (
|
|
||||||
IN PCI_ADDR Address,
|
|
||||||
IN UINT8 Highbit,
|
|
||||||
IN UINT8 Lowbit,
|
|
||||||
IN CONST UINT32 *Value,
|
|
||||||
IN AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 Temp;
|
|
||||||
UINT32 Mask;
|
|
||||||
|
|
||||||
ASSERT (Highbit < 32 && Lowbit < 32 && Highbit >= Lowbit && (Address.AddressValue & 3) == 0);
|
|
||||||
|
|
||||||
// A 1<<32 == 1<<0 due to x86 SHL instruction, so skip if that is the case
|
|
||||||
|
|
||||||
if ((Highbit - Lowbit) != 31) {
|
|
||||||
Mask = (((UINT32) 1 << (Highbit - Lowbit + 1)) - 1);
|
|
||||||
} else {
|
|
||||||
Mask = (UINT32) 0xFFFFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
LibAmdPciRead (AccessWidth32, Address, &Temp, NULL);
|
|
||||||
Temp &= ~(Mask << Lowbit);
|
|
||||||
Temp |= (*Value & Mask) << Lowbit;
|
|
||||||
LibAmdPciWrite (AccessWidth32, Address, &Temp, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Locate next capability pointer
|
|
||||||
*
|
|
||||||
* Given a SBDFO this routine will find the next PCI capabilities list entry.
|
|
||||||
* if the end of the list is reached, or if a problem is detected, then ILLEGAL_SBDFO is
|
|
||||||
* returned.
|
|
||||||
* To start a new search from the head of the list, specify a SBDFO with an offset of zero.
|
|
||||||
*
|
|
||||||
* @param[in,out] Address Pci address
|
|
||||||
* @param[in] StdHeader Standard configuration header
|
|
||||||
*/
|
|
||||||
|
|
||||||
VOID
|
|
||||||
LibAmdPciFindNextCap (
|
|
||||||
IN OUT PCI_ADDR *Address,
|
|
||||||
IN AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
PCI_ADDR Base;
|
|
||||||
UINT32 Offset;
|
|
||||||
UINT32 Temp;
|
|
||||||
PCI_ADDR TempAddress;
|
|
||||||
|
|
||||||
ASSERT (Address != NULL);
|
|
||||||
ASSERT (*(UINT32 *) Address != ILLEGAL_SBDFO);
|
|
||||||
|
|
||||||
Base.AddressValue = Address->AddressValue;
|
|
||||||
Offset = Base.Address.Register;
|
|
||||||
Base.Address.Register = 0;
|
|
||||||
|
|
||||||
Address->AddressValue = (UINT32) ILLEGAL_SBDFO;
|
|
||||||
|
|
||||||
// Verify that the SBDFO points to a valid PCI device SANITY CHECK
|
|
||||||
LibAmdPciRead (AccessWidth32, Base, &Temp, NULL);
|
|
||||||
if (Temp == 0xFFFFFFFF) {
|
|
||||||
ASSERT (FALSE);
|
|
||||||
return; // There is no device at this address
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify that the device supports a capability list
|
|
||||||
TempAddress.AddressValue = Base.AddressValue + 0x04;
|
|
||||||
LibAmdPciReadBits (TempAddress, 20, 20, &Temp, NULL);
|
|
||||||
if (Temp == 0) {
|
|
||||||
return; // This PCI device does not support capability lists
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Offset != 0) {
|
|
||||||
// If we are continuing on an existing list
|
|
||||||
TempAddress.AddressValue = Base.AddressValue + Offset;
|
|
||||||
LibAmdPciReadBits (TempAddress, 15, 8, &Temp, NULL);
|
|
||||||
} else {
|
|
||||||
// We are starting on a new list
|
|
||||||
TempAddress.AddressValue = Base.AddressValue + 0x34;
|
|
||||||
LibAmdPciReadBits (TempAddress, 7, 0, &Temp, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Temp == 0) {
|
|
||||||
return; // We have reached the end of the capabilities list
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error detection and recovery- The statement below protects against
|
|
||||||
// PCI devices with broken PCI capabilities lists. Detect a pointer
|
|
||||||
// that is not uint32 aligned, points into the first 64 reserved DWORDs
|
|
||||||
// or points back to itself.
|
|
||||||
if (((Temp & 3) != 0) || (Temp == Offset) || (Temp < 0x40)) {
|
|
||||||
ASSERT (FALSE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Address->AddressValue = Base.AddressValue + Temp;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Set memory with value
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in,out] Destination Pointer to memory range
|
|
||||||
* @param[in] Value Value to set memory with
|
|
||||||
* @param[in] FillLength Size of the memory range
|
|
||||||
* @param[in] StdHeader Standard configuration header (Optional)
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdMemFill (
|
|
||||||
IN VOID *Destination,
|
|
||||||
IN UINT8 Value,
|
|
||||||
IN UINTN FillLength,
|
|
||||||
IN OUT AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT8 *Dest;
|
|
||||||
Dest = Destination;
|
|
||||||
while ((FillLength--) != 0) {
|
|
||||||
*Dest++ = Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Copy memory
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in,out] Destination Pointer to destination buffer
|
|
||||||
* @param[in] Source Pointer to source buffer
|
|
||||||
* @param[in] CopyLength buffer length
|
|
||||||
* @param[in] StdHeader Standard configuration header (Optional)
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
LibAmdMemCopy (
|
|
||||||
IN VOID *Destination,
|
|
||||||
IN CONST VOID *Source,
|
|
||||||
IN UINTN CopyLength,
|
|
||||||
IN OUT AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT8 *Dest;
|
|
||||||
CONST UINT8 *SourcePtr;
|
|
||||||
Dest = Destination;
|
|
||||||
SourcePtr = Source;
|
|
||||||
while ((CopyLength--) != 0) {
|
|
||||||
*Dest++ = *SourcePtr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* Verify checksum of binary image (B1/B2/B3)
|
* Verify checksum of binary image (B1/B2/B3)
|
||||||
|
@ -1187,138 +665,6 @@ LibAmdLocateImage (
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Returns the package type mask for the processor
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in] StdHeader Standard configuration header (Optional)
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Returns the package type mask for the processor
|
|
||||||
UINT32
|
|
||||||
LibAmdGetPackageType (
|
|
||||||
IN AMD_CONFIG_PARAMS *StdHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 ProcessorPackageType;
|
|
||||||
CPUID_DATA CpuId;
|
|
||||||
|
|
||||||
LibAmdCpuidRead (0x80000001, &CpuId, NULL);
|
|
||||||
ProcessorPackageType = (UINT32) (CpuId.EBX_Reg >> 28) & 0xF; // bit 31:28
|
|
||||||
return (UINT32) (1 << ProcessorPackageType);
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT)
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Returns the package type mask for the processor
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in] AccessWidth Access width
|
|
||||||
* @param[in] Data data
|
|
||||||
* @param[in] DataMask data
|
|
||||||
* @param[out] TemData typecast data
|
|
||||||
* @param[out] TempDataMask typecast data
|
|
||||||
*/
|
|
||||||
|
|
||||||
VOID
|
|
||||||
STATIC
|
|
||||||
LibAmdGetDataFromPtr (
|
|
||||||
IN ACCESS_WIDTH AccessWidth,
|
|
||||||
IN CONST VOID *Data,
|
|
||||||
IN CONST VOID *DataMask,
|
|
||||||
OUT UINT32 *TemData,
|
|
||||||
OUT UINT32 *TempDataMask
|
|
||||||
)
|
|
||||||
{
|
|
||||||
switch (AccessWidth) {
|
|
||||||
case AccessWidth8:
|
|
||||||
case AccessS3SaveWidth8:
|
|
||||||
*TemData = (UINT32)*(UINT8 *) Data;
|
|
||||||
*TempDataMask = (UINT32)*(UINT8 *) DataMask;
|
|
||||||
break;
|
|
||||||
case AccessWidth16:
|
|
||||||
case AccessS3SaveWidth16:
|
|
||||||
*TemData = (UINT32)*(UINT16 *) Data;
|
|
||||||
*TempDataMask = (UINT32)*(UINT16 *) DataMask;
|
|
||||||
break;
|
|
||||||
case AccessWidth32:
|
|
||||||
case AccessS3SaveWidth32:
|
|
||||||
*TemData = *(UINT32 *) Data;
|
|
||||||
*TempDataMask = *(UINT32 *) DataMask;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
IDS_ERROR_TRAP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* Returns the package type mask for the processor
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in] AccessWidth Access width
|
|
||||||
* @retval Width in number of bytes
|
|
||||||
*/
|
|
||||||
|
|
||||||
UINT8
|
|
||||||
LibAmdAccessWidth (
|
|
||||||
IN ACCESS_WIDTH AccessWidth
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT8 Width;
|
|
||||||
|
|
||||||
switch (AccessWidth) {
|
|
||||||
case AccessWidth8:
|
|
||||||
case AccessS3SaveWidth8:
|
|
||||||
Width = 1;
|
|
||||||
break;
|
|
||||||
case AccessWidth16:
|
|
||||||
case AccessS3SaveWidth16:
|
|
||||||
Width = 2;
|
|
||||||
break;
|
|
||||||
case AccessWidth32:
|
|
||||||
case AccessS3SaveWidth32:
|
|
||||||
Width = 4;
|
|
||||||
break;
|
|
||||||
case AccessWidth64:
|
|
||||||
case AccessS3SaveWidth64:
|
|
||||||
Width = 8;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Width = 0;
|
|
||||||
IDS_ERROR_TRAP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return Width;
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
VOID
|
|
||||||
CpuidRead (
|
|
||||||
IN UINT32 CpuidFcnAddress,
|
|
||||||
OUT CPUID_DATA *Value
|
|
||||||
)
|
|
||||||
{
|
|
||||||
__cpuid ((int *)Value, CpuidFcnAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
AMDLIB_OPTIMIZE
|
|
||||||
UINT8
|
|
||||||
ReadNumberOfCpuCores(
|
|
||||||
void
|
|
||||||
)
|
|
||||||
{
|
|
||||||
CPUID_DATA Value;
|
|
||||||
CpuidRead (0x80000008, &Value);
|
|
||||||
return Value.ECX_Reg & 0xff;
|
|
||||||
}
|
|
||||||
#endif /* IS_ENABLED(CONFIG_VENDORCODE_FULL_SUPPORT) */
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IdsErrorStop (
|
IdsErrorStop (
|
||||||
IN UINT32 FileCode
|
IN UINT32 FileCode
|
||||||
|
|
Loading…
Reference in New Issue