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