/** @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 ); }