/** @file System On Chip Unit (SOCUnit) routines. Copyright (c) 2013-2015 Intel Corporation. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #include "CommonHeader.h" /** Early initialisation of the SOC Unit @retval EFI_SUCCESS Operation success. **/ EFI_STATUS EFIAPI SocUnitEarlyInitialisation ( VOID ) { UINT32 NewValue; // // Set the mixer load resistance // NewValue = QNCPortIORead (QUARK_SC_PCIE_AFE_SB_PORT_ID, QUARK_PCIE_AFE_PCIE_RXPICTRL0_L0); NewValue &= OCFGPIMIXLOAD_1_0_MASK; QNCPortIOWrite (QUARK_SC_PCIE_AFE_SB_PORT_ID, QUARK_PCIE_AFE_PCIE_RXPICTRL0_L0, NewValue); NewValue = QNCPortIORead (QUARK_SC_PCIE_AFE_SB_PORT_ID, QUARK_PCIE_AFE_PCIE_RXPICTRL0_L1); NewValue &= OCFGPIMIXLOAD_1_0_MASK; QNCPortIOWrite (QUARK_SC_PCIE_AFE_SB_PORT_ID, QUARK_PCIE_AFE_PCIE_RXPICTRL0_L1, NewValue); return EFI_SUCCESS; } /** Tasks to release PCI controller from reset pre wait for PLL Lock. @retval EFI_SUCCESS Operation success. **/ EFI_STATUS EFIAPI SocUnitReleasePcieControllerPreWaitPllLock ( IN CONST EFI_PLATFORM_TYPE PlatformType ) { UINT32 NewValue; // // Assert PERST# and validate time assertion time. // PlatformPERSTAssert (PlatformType); ASSERT (PCIEXP_PERST_MIN_ASSERT_US <= (PCIEXP_DELAY_US_POST_CMNRESET_RESET + PCIEXP_DELAY_US_WAIT_PLL_LOCK + PCIEXP_DELAY_US_POST_SBI_RESET)); // // PHY Common lane reset. // NewValue = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG); NewValue |= SOCCLKEN_CONFIG_PHY_I_CMNRESET_L; QNCAltPortWrite (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG, NewValue); // // Wait post common lane reset. // MicroSecondDelay (PCIEXP_DELAY_US_POST_CMNRESET_RESET); // // PHY Sideband interface reset. // Controller main reset // NewValue = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG); NewValue |= (SOCCLKEN_CONFIG_SBI_RST_100_CORE_B | SOCCLKEN_CONFIG_PHY_I_SIDE_RST_L); QNCAltPortWrite (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG, NewValue); return EFI_SUCCESS; } /** Tasks to release PCI controller from reset after PLL has locked @retval EFI_SUCCESS Operation success. **/ EFI_STATUS EFIAPI SocUnitReleasePcieControllerPostPllLock ( IN CONST EFI_PLATFORM_TYPE PlatformType ) { UINT32 NewValue; // // Controller sideband interface reset. // NewValue = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG); NewValue |= SOCCLKEN_CONFIG_SBI_BB_RST_B; QNCAltPortWrite (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG, NewValue); // // Wait post sideband interface reset. // MicroSecondDelay (PCIEXP_DELAY_US_POST_SBI_RESET); // // Deassert PERST#. // PlatformPERSTDeAssert (PlatformType); // // Wait post de assert PERST#. // MicroSecondDelay (PCIEXP_DELAY_US_POST_PERST_DEASSERT); // // Controller primary interface reset. // NewValue = QNCAltPortRead (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG); NewValue |= SOCCLKEN_CONFIG_BB_RST_B; QNCAltPortWrite (QUARK_SCSS_SOC_UNIT_SB_PORT_ID, QUARK_SCSS_SOC_UNIT_SOCCLKEN_CONFIG, NewValue); return EFI_SUCCESS; }