/** @file
This file contains PSF routines
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mPchLpSerialIoPsfRegs[PCH_SERIALIO_MAX_CONTROLLERS] =
{
R_PCH_LP_PCR_PSF3_T0_SHDW_I2C0_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_I2C1_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_I2C2_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_I2C3_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_I2C4_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_I2C5_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_SPI0_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_SPI1_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_UART0_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_UART1_REG_BASE,
R_PCH_LP_PCR_PSF3_T0_SHDW_UART2_REG_BASE
};
GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mPchHSerialIoPsfRegs[PCH_SERIALIO_MAX_CONTROLLERS] =
{
R_PCH_H_PCR_PSF3_T0_SHDW_I2C0_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_I2C1_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_I2C2_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_I2C3_REG_BASE,
0,
0,
R_PCH_H_PCR_PSF3_T0_SHDW_SPI0_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_SPI1_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_UART0_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_UART1_REG_BASE,
R_PCH_H_PCR_PSF3_T0_SHDW_UART2_REG_BASE
};
/**
This procedure will enable SerialIO device BAR1 at PSF level
@param[in] SerialIoDevice SERIAL IO device (I2C0-5, SPI0-1, UART0-2)
@retval None
**/
VOID
PsfEnableSerialIoDeviceBar1 (
IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice
)
{
UINT32 *SerialIoPsfReg;
if (GetPchSeries () == PchLp) {
SerialIoPsfReg = mPchLpSerialIoPsfRegs;
} else {
SerialIoPsfReg = mPchHSerialIoPsfRegs;
if ((SerialIoDevice == PchSerialIoIndexI2C4) ||
(SerialIoDevice == PchSerialIoIndexI2C5)) {
ASSERT (FALSE);
}
}
//
// Set AGNT_T0_SHDW_PCIEN[19:18] = 00b
// SerialIo device BAR is 64bit wide so to enable BAR1
// at PSF both BAR2 (32bit wide) and BAR3 (32bit wide) need to be enabled
//
PchPcrAndThenOr32 (
PID_PSF3,
(UINT16)SerialIoPsfReg[SerialIoDevice] + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
(UINT32)~(B_PCH_PCR_PSFX_T0_SHDW_PCIEN_BAR2DIS | B_PCH_PCR_PSFX_T0_SHDW_PCIEN_BAR3DIS),
0
);
}
/**
This procedure will disable SerialIO device BAR1 at PSF level
@param[in] SerialIoDevice SERIAL IO device (I2C0-5, SPI0-1, UART0-2)
@retval None
**/
VOID
PsfDisableSerialIoDeviceBar1 (
IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice
)
{
UINT32 *SerialIoPsfReg;
if (GetPchSeries () == PchLp) {
SerialIoPsfReg = mPchLpSerialIoPsfRegs;
} else {
SerialIoPsfReg = mPchHSerialIoPsfRegs;
if ((SerialIoDevice == PchSerialIoIndexI2C4) ||
(SerialIoDevice == PchSerialIoIndexI2C5)) {
ASSERT (FALSE);
}
}
//
// Set AGNT_T0_SHDW_PCIEN[19:18] = 11b
// SerialIo device BAR is 64bit wide so to disable BAR1
// at PSF both BAR2 (32bit wide) and BAR3 (32bit wide) need to be disabled
//
PchPcrAndThenOr32 (
PID_PSF3,
(UINT16)SerialIoPsfReg[SerialIoDevice] + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
~0u,
(B_PCH_PCR_PSFX_T0_SHDW_PCIEN_BAR2DIS | B_PCH_PCR_PSFX_T0_SHDW_PCIEN_BAR3DIS)
);
}
/**
This procedure will disable SerailIO device at PSF level
@param[in] SerialIoDevice SERIAL IO device (I2C0-5, SPI0-1, UART0-2)
@retval None
**/
VOID
PsfDisableSerialIoDevice (
IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice
)
{
UINT32 *SerialIoPsfReg;
if (GetPchSeries () == PchLp) {
SerialIoPsfReg = mPchLpSerialIoPsfRegs;
} else {
SerialIoPsfReg = mPchHSerialIoPsfRegs;
if ((SerialIoDevice == PchSerialIoIndexI2C4) ||
(SerialIoDevice == PchSerialIoIndexI2C5)) {
ASSERT (FALSE);
}
}
PchPcrAndThenOr32 (
PID_PSF3,
(UINT16)SerialIoPsfReg[SerialIoDevice] + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
0xFFFFFFFF,
B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS
);
}
/**
This procedure will hide SerialIo device PciCfgSpace at PSF level
@param[in] SerialIoDevice SERIAL IO device (I2C0-5, SPI0-1, UART0-2)
@retval None
**/
VOID
PsfHideSerialIoDevice (
IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice
)
{
UINT32 *SerialIoPsfReg;
if (GetPchSeries () == PchLp) {
SerialIoPsfReg = mPchLpSerialIoPsfRegs;
} else {
SerialIoPsfReg = mPchHSerialIoPsfRegs;
if ((SerialIoDevice == PchSerialIoIndexI2C4) ||
(SerialIoDevice == PchSerialIoIndexI2C5)) {
ASSERT (FALSE);
}
}
PchPcrAndThenOr32 (
PID_PSF3,
(UINT16)SerialIoPsfReg[SerialIoDevice] + R_PCH_PCR_PSFX_T0_SHDW_CFG_DIS,
~0u,
B_PCH_PCR_PSFX_T0_SHDW_CFG_DIS_CFGDIS
);
}
/**
This procedure will reveal SerialIo device PciCfgSpace at PSF level
@param[in] SerialIoDevice SERIAL IO device (I2C0-5, SPI0-1, UART0-2)
@retval None
**/
VOID
PsfRevealSerialIoDevice (
IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice
)
{
UINT32 *SerialIoPsfReg;
if (GetPchSeries () == PchLp) {
SerialIoPsfReg = mPchLpSerialIoPsfRegs;
} else {
SerialIoPsfReg = mPchHSerialIoPsfRegs;
if ((SerialIoDevice == PchSerialIoIndexI2C4) ||
(SerialIoDevice == PchSerialIoIndexI2C5)) {
ASSERT (FALSE);
}
}
PchPcrAndThenOr32 (
PID_PSF3,
(UINT16)SerialIoPsfReg[SerialIoDevice] + R_PCH_PCR_PSFX_T0_SHDW_CFG_DIS,
(UINT32) ~(B_PCH_PCR_PSFX_T0_SHDW_CFG_DIS_CFGDIS),
0
);
}
/**
This procedure will set BARx value for TraceHub ACPI device at PSF level
@param[in] BarNum BAR Number (0:BAR0, 1:BAR1)
@param[in] BarValue 32bit BAR value
@retval None
**/
VOID
PsfSetTraceHubAcpiDeviceBarValue (
IN UINT8 BarNum,
IN UINT32 BarValue
)
{
UINT16 RegOffset;
if (BarNum > 1) {
ASSERT (FALSE);
}
RegOffset = R_PCH_PCR_PSF3_T0_SHDW_TRACE_HUB_ACPI_REG_BASE + R_PCH_PCR_PSFX_T0_SHDW_BAR0 + BarNum * 0x4;
PchPcrAndThenOr32 (
PID_PSF3,
RegOffset,
0x0,
BarValue
);
}
/**
This procedure will enable MSE for TraceHub ACPI device at PSF level
@param[in] None
@retval None
**/
VOID
PsfEnableTraceHubAcpiDeviceMemorySpace (
VOID
)
{
PchPcrAndThenOr8 (
PID_PSF3, R_PCH_PCR_PSF3_T0_SHDW_TRACE_HUB_ACPI_REG_BASE + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
0xFF,
B_PCH_PCR_PSFX_T0_SHDW_PCIEN_MEMEN
);
}
GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mPchLpHeciPsfRegBase[] =
{
R_PCH_LP_PCR_PSF1_T0_SHDW_HECI1_REG_BASE,
R_PCH_LP_PCR_PSF1_T0_SHDW_HECI2_REG_BASE,
R_PCH_LP_PCR_PSF1_T0_SHDW_HECI3_REG_BASE
};
GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mPchHHeciPsfRegBase[] =
{
R_PCH_H_PCR_PSF1_T0_SHDW_HECI1_REG_BASE,
R_PCH_H_PCR_PSF1_T0_SHDW_HECI2_REG_BASE,
R_PCH_H_PCR_PSF1_T0_SHDW_HECI3_REG_BASE
};
/**
Enable HECI device at PSF level
@param[in] HeciDevice HECIx Device (HECI1-3)
@retval None
**/
VOID
PsfEnableHeciDevice (
IN UINT8 HeciDevice
)
{
UINT16 *DevPsfBase;
if ((HeciDevice < 1) || (HeciDevice > 3)) {
ASSERT (FALSE);
}
if (GetPchSeries () == PchLp) {
DevPsfBase = mPchLpHeciPsfRegBase;
} else {
DevPsfBase = mPchHHeciPsfRegBase;
}
PchPcrAndThenOr32 (
PID_PSF1, DevPsfBase[HeciDevice - 1] + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
(UINT32) ~(B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS),
0
);
}
/**
Disable HECI device at PSF level
@param[in] HeciDevice HECIx Device (HECI1-3)
@retval None
**/
VOID
PsfDisableHeciDevice (
IN UINT8 HeciDevice
)
{
UINT16 *DevPsfBase;
if ((HeciDevice < 1) || (HeciDevice > 3)) {
ASSERT (FALSE);
}
if (GetPchSeries () == PchLp) {
DevPsfBase = mPchLpHeciPsfRegBase;
} else {
DevPsfBase = mPchHHeciPsfRegBase;
}
PchPcrAndThenOr32 (
PID_PSF1, DevPsfBase[HeciDevice - 1] + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
~0u,
B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS
);
}
/**
Enable IDER device at PSF level
@retval None
**/
VOID
PsfEnableIderDevice (
VOID
)
{
UINT16 DevPsfBase;
if (GetPchSeries () == PchLp) {
DevPsfBase = R_PCH_LP_PCR_PSF1_T0_SHDW_IDER_REG_BASE;
} else {
DevPsfBase = R_PCH_H_PCR_PSF1_T0_SHDW_IDER_REG_BASE;
}
PchPcrAndThenOr32 (
PID_PSF1, DevPsfBase + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
(UINT32) ~(B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS),
0
);
}
/**
Disable IDER device at PSF level
@retval None
**/
VOID
PsfDisableIderDevice (
VOID
)
{
UINT16 DevPsfBase;
if (GetPchSeries () == PchLp) {
DevPsfBase = R_PCH_LP_PCR_PSF1_T0_SHDW_IDER_REG_BASE;
} else {
DevPsfBase = R_PCH_H_PCR_PSF1_T0_SHDW_IDER_REG_BASE;
}
PchPcrAndThenOr32 (
PID_PSF1, DevPsfBase + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
~0u,
B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS
);
}
/**
Enable SOL device at PSF level
@retval None
**/
VOID
PsfEnableSolDevice (
VOID
)
{
UINT16 DevPsfBase;
if (GetPchSeries () == PchLp) {
DevPsfBase = R_PCH_LP_PCR_PSF1_T0_SHDW_KT_REG_BASE;
} else {
DevPsfBase = R_PCH_H_PCR_PSF1_T0_SHDW_KT_REG_BASE;
}
PchPcrAndThenOr32 (
PID_PSF1, DevPsfBase + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
(UINT32) ~(B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS),
0
);
}
/**
Disable SOL device at PSF level
@retval None
**/
VOID
PsfDisableSolDevice (
VOID
)
{
UINT16 DevPsfBase;
if (GetPchSeries () == PchLp) {
DevPsfBase = R_PCH_LP_PCR_PSF1_T0_SHDW_KT_REG_BASE;
} else {
DevPsfBase = R_PCH_H_PCR_PSF1_T0_SHDW_KT_REG_BASE;
}
PchPcrAndThenOr32 (
PID_PSF1, DevPsfBase + R_PCH_PCR_PSFX_T0_SHDW_PCIEN,
~0u,
B_PCH_PCR_PSFX_T0_SHDW_PCIEN_FUNDIS
);
}