/**
 * @file
 *
 * Southbridge CIMx Function Support Define (All)
 *
 *
 *
 * @xrefitem bom "File Content Label" "Release Content"
 * @e project:      CIMx-SB
 * @e sub-project:
 * @e \$Revision:$   @e \$Date:$
 *
 */
/*
 *****************************************************************************
 *
 * Copyright (c) 2011, Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Advanced Micro Devices, Inc. nor the names of
 *       its contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * ***************************************************************************
 *
 */

// Southbridge SBMAIN Routines

/**
 * Southbridge Main Function Public Function
 *
 */

/**
 * sbBeforePciInit - Config Southbridge before PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbBeforePciInit (IN AMDSBCFG* pConfig);


/**
 * sbAfterPciInit - Config Southbridge after PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbAfterPciInit (IN AMDSBCFG* pConfig);

/**
 *  sbMidPostInit - Config Southbridge during middle of POST
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbMidPostInit (IN AMDSBCFG* pConfig);

/**
 *  sbLatePost - Prepare Southbridge to boot to OS.
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbLatePost (IN AMDSBCFG* pConfig);

/**
 * sbBeforePciRestoreInit - Config Southbridge before ACPI S3 resume PCI config device restore
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbBeforePciRestoreInit (IN AMDSBCFG* pConfig);

/**
 * sbAfterPciRestoreInit - Config Southbridge after ACPI S3 resume PCI config device restore
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbAfterPciRestoreInit (IN AMDSBCFG* pConfig);

/**
 * sbSmmAcpiOn - Config Southbridge during ACPI_ON
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbSmmAcpiOn (IN AMDSBCFG* pConfig);

/**
 * CallBackToOEM - Call Back routine.
 *
 *
 *
 * @param[in] Func    Callback ID.
 * @param[in] Data    Callback specific data.
 * @param[in] pConfig Southbridge configuration structure pointer.
 */
unsigned int CallBackToOEM (IN unsigned int Func, IN unsigned int Data, IN AMDSBCFG* pConfig);


// Southbridge SBPOR Routines

/**
 * Southbridge power-on initial Public Function
 *
 */

/**
 * sbPowerOnInit - Config Southbridge during power on stage.
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbPowerOnInit (IN AMDSBCFG* pConfig);


// Southbridge Common Routines

/**
 * Southbridge Common Public Function
 *
 */

/**
 * commonInitEarlyBoot - Config Southbridge SMBUS/ACPI/IDE/LPC/PCIB.
 *
 *    This settings should be done during S3 resume also
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void commonInitEarlyBoot (IN AMDSBCFG* pConfig);

/**
 * commonInitEarlyPost - Config Southbridge SMBUS/ACPI/IDE/LPC/PCIB.
 *
 *    This settings might not program during S3 resume
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void commonInitEarlyPost (IN AMDSBCFG* pConfig);

/**
 * commonInitLateBoot - Prepare Southbridge register setting to boot to OS.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void commonInitLateBoot (IN AMDSBCFG* pConfig);

/**
 * abSpecialSetBeforePciEnum - Special setting ABCFG registers before PCI emulation.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void abSpecialSetBeforePciEnum (IN AMDSBCFG* pConfig);

void usbSetPllDuringS3 (IN AMDSBCFG* pConfig);
void usbDesertPll (IN AMDSBCFG* pConfig);

/**
 * hpetInit - Program Southbridge HPET function
 *
 *  ** Eric
 *
 * @param[in] pConfig         Southbridge configuration structure pointer.
 * @param[in] pStaticOptions  Platform build configuration table.
 *
 */
void hpetInit (IN AMDSBCFG* pConfig, IN BUILDPARAM *pStaticOptions);

/**
 * c3PopupSetting - Program Southbridge C state function
 *
 *  ** Eric
 *
 * @param[in] pConfig   Southbridge configuration structure pointer.
 *
 */
void c3PopupSetting (IN AMDSBCFG* pConfig);

/**
 * FusionRelatedSetting - Program Fusion C related function
 *
 *
 *
 * @param[in] pConfig   Southbridge configuration structure pointer.
 *
 */
void FusionRelatedSetting (IN AMDSBCFG* pConfig);

/**
 * Southbridge Common Private Function
 *
 */

/**
 * abLinkInitBeforePciEnum - Set ABCFG registers before PCI emulation.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void abLinkInitBeforePciEnum (IN AMDSBCFG* pConfig);

// Southbridge SATA Routines

/**
 * Southbridge SATA Controller Public Function
 *
 */

/**
 * sataInitMidPost - Config SATA controller in Middle POST.
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sataInitMidPost (IN AMDSBCFG* pConfig);

/**
 * sataInitAfterPciEnum - Config SATA controller after PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void  sataInitAfterPciEnum (IN AMDSBCFG*   pConfig);

/**
 * sataInitBeforePciEnum - Config SATA controller before PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void  sataInitBeforePciEnum (IN AMDSBCFG*  pConfig);

/**
 * sataInitLatePost - Prepare SATA controller to boot to OS.
 *
 *              - Set class ID to AHCI (if set to AHCI * Mode)
 *              - Enable AHCI interrupt
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void  sataInitLatePost (IN AMDSBCFG* pConfig);

// Southbridge GEC Routines

/**
 * Southbridge GEC Controller Public Function
 *
 */

/**
 * gecInitBeforePciEnum - Config GEC controller before PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void gecInitBeforePciEnum (IN AMDSBCFG*   pConfig);

/**
 * gecInitAfterPciEnum - Config GEC controller after PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void gecInitAfterPciEnum (IN AMDSBCFG* pConfig);

/**
 * gecInitLatePost - Prepare GEC controller to boot to OS.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void gecInitLatePost (IN AMDSBCFG* pConfig);

// Southbridge USB Routines

/**
 * Southbridge USB Controller Public Function
 *
 */

/**
 * Config USB controller before PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void usbInitBeforePciEnum (IN AMDSBCFG* pConfig);

/**
 * Config USB controller after PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void usbInitAfterPciInit (IN AMDSBCFG* pConfig);

/**
 * Config USB1 EHCI controller after PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void usb1EhciInitAfterPciInit (IN AMDSBCFG* pConfig);
void usb2EhciInitAfterPciInit (IN AMDSBCFG* pConfig);
void usb3EhciInitAfterPciInit (IN AMDSBCFG* pConfig);
void usb1OhciInitAfterPciInit (IN AMDSBCFG* pConfig);
void usb2OhciInitAfterPciInit (IN AMDSBCFG* pConfig);
void usb3OhciInitAfterPciInit (IN AMDSBCFG* pConfig);
void usb4OhciInitAfterPciInit (IN AMDSBCFG* pConfig);

// Southbridge SMI Service Routines (SMM.C)

/**
 * Southbridge SMI Service Routines Public Function
 *
 */

/**
 * Southbridge SMI service module
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbSmmService (IN AMDSBCFG* pConfig);

/**
 * softwareSMIservice - Software SMI service
 *
 *  ** Eric
 *
 * @param[in] void Southbridge software SMI service ID.
 *
 */
void softwareSMIservice (IN void);

// Southbridge GPP Controller Routines

/**
 * Southbridge GPP Controller Routines Public Function
 *
 */

/**
 * GPP early programming and link training. On exit all populated EPs should be fully operational.
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbPcieGppEarlyInit (IN AMDSBCFG* pConfig);

/**
 * sbPcieGppLateInit - Late PCIE initialization for SB800 GPP component
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void sbPcieGppLateInit (IN AMDSBCFG* pConfig);

// Southbridge HD Controller Routines (AZALIA.C)

/**
 * Southbridge HD Controller Routines (AZALIA.C) Public Function
 *
 */

/**
 * Config HD Audio Before PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void azaliaInitBeforePciEnum (IN AMDSBCFG* pConfig);

/**
 * Config HD Audio after PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
void azaliaInitAfterPciEnum (IN AMDSBCFG* pConfig);


// Southbridge EC Routines

#ifndef NO_EC_SUPPORT
/**
 * Southbridge EC Controller Public Function
 *
 */

/**
 * Config EC controller during power-on
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
  void  ecPowerOnInit (IN AMDSBCFG* pConfig);

/**
 * Config EC controller before PCI emulation
 *
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
  void  ecInitBeforePciEnum (IN AMDSBCFG* pConfig);

/**
 * Prepare EC controller to boot to OS.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
  void  ecInitLatePost (IN AMDSBCFG* pConfig);

/**
 * validateImcFirmware - Validate IMC Firmware.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 * @retval        TRUE   Pass
 * @retval        FALSE     Failed
 */
  unsigned char  validateImcFirmware (IN AMDSBCFG* pConfig);

/**
 * validateImcFirmware - Validate IMC Firmware.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
  void  softwareToggleImcStrapping (IN AMDSBCFG* pConfig);
#endif

#ifndef NO_HWM_SUPPORT
/**
 * validateImcFirmware - Validate IMC Firmware.
 *
 *
 * @param[in] pConfig Southbridge configuration structure pointer.
 *
 */
  void  hwmInit (IN AMDSBCFG* pConfig);
#endif

