blob: 7468eb2d4c4029fd2ce9bfa95168a20db456d49c [file] [log] [blame]
/*****************************************************************************
*
* Copyright (C) 2012 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.
*
*
***************************************************************************/
#include "Platform.h"
#ifndef B1_IMAGE
BUILDPARAM DfltStaticOptions={
BIOS_SIZE, // BIOS Size
LEGACY_FREE, // Legacy Free Option
0x00, // Dummy space holder
0x00, // ECKbd disable/enable
0x00, // EcChannel0 disable/enable
0x00, // Dummy space holder1
SMBUS0_BASE_ADDRESS, // Smbus Base Address;
SMBUS1_BASE_ADDRESS, // Smbus Base Address;
SIO_PME_BASE_ADDRESS, // SIO PME Base Address
WATCHDOG_TIMER_BASE_ADDRESS, // Watchdog Timer Base Address
SPI_BASE_ADDRESS,
PM1_EVT_BLK_ADDRESS, // AcpiPm1EvtBlkAddr;
PM1_CNT_BLK_ADDRESS, // AcpiPm1CntBlkAddr;
PM1_TMR_BLK_ADDRESS, // AcpiPmTmrBlkAddr;
CPU_CNT_BLK_ADDRESS, // CpuControlBlkAddr;
GPE0_BLK_ADDRESS, // AcpiGpe0BlkAddr;
SMI_CMD_PORT, // SmiCmdPortAddr;
ACPI_PMA_CNT_BLK_ADDRESS, // AcpiPmaCntBlkAddr;
EC_LDN5_MAILBOX_ADDRESS,
EC_LDN5_IRQ,
EC_LDN9_MAILBOX_ADDRESS, // EC LDN9 Mailbox address
RESERVED_VALUE,
RESERVED_VALUE,
RESERVED_VALUE,
RESERVED_VALUE,
HPET_BASE_ADDRESS, // HPET Base address
SATA_IDE_MODE_SSID,
SATA_RAID_MODE_SSID,
SATA_RAID5_MODE_SSID,
SATA_AHCI_SSID,
OHCI0_SSID,
OHCI1_SSID,
EHCI0_SSID,
OHCI2_SSID,
OHCI3_SSID,
EHCI1_SSID,
OHCI4_SSID,
SMBUS_SSID,
IDE_SSID,
AZALIA_SSID,
LPC_SSID,
P2P_SSID,
};
/*********************************************************************************
*
* Routine Description: Config SB Before PCI INIT
*
* Arguments:
*
* pConfig - SBconfiguration
*
* Returns:
*
* void
*
**********************************************************************************/
void sbBeforePciInit (AMDSBCFG* pConfig){
BUILDPARAM *pStaticOptions;
pStaticOptions = &pConfig->BuildParameters;
TRACE((DMSG_SB_TRACE, "CIMx - Entering sbBeforePciInit \n"));
commonInitEarlyBoot(pConfig);
commonInitEarlyPost(pConfig);
#ifndef NO_EC_SUPPORT
ecInitBeforePciEnum(pConfig);
#endif
usbInitBeforePciEnum(pConfig); // USB POST TIME Only
fcInitBeforePciEnum(pConfig); // Preinit flash controller
sataInitBeforePciEnum(pConfig); // Init SATA class code and PHY
programSubSystemIDs(pConfig, pStaticOptions); // Set subsystem/vendor ID
TRACE((DMSG_SB_TRACE, "CIMx - Exiting sbBeforePciInit \n"));
}
/*********************************************************************************
*
* Routine Description: Config SB After PCI INIT
*
* Arguments:
*
* pConfig - SBconfiguration
*
* Returns: void
*
* Reference: atiSbAfterPciInit
*
**********************************************************************************/
void sbAfterPciInit(AMDSBCFG* pConfig){
BUILDPARAM *pStaticOptions;
TRACE((DMSG_SB_TRACE, "CIMx - Entering sbAfterPciInit \n"));
pStaticOptions = &pConfig->BuildParameters;
usbInitMidPost(pConfig); //usb initialization which is required only during post
usbInitAfterPciInit(pConfig); // Init USB MMIO
sataInitAfterPciEnum(pConfig); // SATA port enumeration
azaliaInitAfterPciEnum(pConfig); // Detect and configure High Definition Audio
TRACE((DMSG_SB_TRACE, "CIMx - Exiting sbAfterPciInit \n"));
}
/*********************************************************************************
*
* Routine Description: Config SB during late POST
*
* Arguments:
*
* pConfig - SBconfiguration
*
* Returns: void
*
* Reference: atiSbLatePost
*
**********************************************************************************/
void sbLatePost(AMDSBCFG* pConfig){
UINT16 dwVar;
BUILDPARAM *pStaticOptions;
pStaticOptions = &pConfig->BuildParameters;
TRACE((DMSG_SB_TRACE, "CIMx - Entering sbLatePost \n"));
ReadPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG02, AccWidthUint16, &dwVar);
if (dwVar != SB7XX_DEVICE_ID){
// Display message that the SB is wrong and stop the system
TRACE((DMSG_SB_TRACE, "Current system does not have SB700 chipset. Stopping\n"));
for(;;);
}
commonInitLateBoot(pConfig);
sataInitLatePost(pConfig);
hpetInit(pConfig, pStaticOptions); // SB Configure HPET base and enable bit
#ifndef NO_EC_SUPPORT
ecInitLatePost(pConfig);
#endif
}
/*********************************************************************************
*
* Routine Description: Config SB before ACPI S3 resume PCI config device restore
*
* Arguments:
*
* pConfig - SBconfiguration
*
* Returns: void
*
* Reference: AtiSbBfPciRestore
*
**********************************************************************************/
void sbBeforePciRestoreInit(AMDSBCFG* pConfig){
BUILDPARAM *pStaticOptions;
TRACE((DMSG_SB_TRACE, "CIMx - Entering sbBeforePciRestoreInit \n"));
pConfig->S3Resume = 1;
pStaticOptions = &pConfig->BuildParameters;
commonInitEarlyBoot(pConfig); // set /SMBUS/ACPI/IDE/LPC/PCIB
abLinkInitBeforePciEnum(pConfig); // Set ABCFG registers
usbInitBeforePciEnum(pConfig); // USB POST TIME Only
fcInitBeforePciEnum(pConfig); // Preinit flash controller
sataInitBeforePciEnum(pConfig);
programSubSystemIDs(pConfig, pStaticOptions); // Set subsystem/vendor ID
}
/*********************************************************************************
*
* Routine Description: Config SB after ACPI S3 resume PCI config device restore
*
* Arguments:
*
* pConfig - SBconfiguration
*
* Returns: void
*
* Reference: AtiSbAfPciRestore
*
**********************************************************************************/
void sbAfterPciRestoreInit(AMDSBCFG* pConfig){
BUILDPARAM *pStaticOptions;
pConfig->S3Resume = 1;
pStaticOptions = &pConfig->BuildParameters;
TRACE((DMSG_SB_TRACE, "CIMx - Entering sbAfterPciRestoreInit \n"));
commonInitLateBoot(pConfig);
sataInitAfterPciEnum(pConfig);
azaliaInitAfterPciEnum(pConfig); // Detect and configure High Definition Audio
hpetInit(pConfig, pStaticOptions); // SB Configure HPET base and enable bit
sataInitLatePost(pConfig);
sbSmmAcpiOn(pConfig);
}
/*++
Routine Description:
SB config hook during ACPI_ON
Arguments:
pConfig - SBconfiguration
Returns:
void
--*/
void sbSmmAcpiOn(AMDSBCFG* pConfig){
UINT32 ddBar5;
UINT8 dbPort;
//RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG60+2, AccWidthUint8 | S3_SAVE, ~(UINT32)(BIT1+BIT0), 0);
if (getRevisionID() >= SB700_A13)
RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG43, AccWidthUint8 | S3_SAVE, 0xFF, BIT0); //Enable Legacy DMA prefetch enhancement
RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG60+2, AccWidthUint8 | S3_SAVE, ~(UINT32)(BIT1+BIT0), 0);
RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG64+3, AccWidthUint8| S3_SAVE, ~(UINT32)BIT7, 0);
programOhciMmioForEmulation();
// For IDE_TO_AHCI_MODE and IDE_TO_AMD_AHCI_MODE, clear Interrupt Status register for all ports
ReadPCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG24), AccWidthUint32, &ddBar5);
if ((pConfig->SataClass == IDE_TO_AHCI_MODE) || (pConfig->SataClass == IDE_TO_AMD_AHCI_MODE)){
for (dbPort = 0; dbPort <= 5; dbPort++) {
RWMEM(ddBar5 + SB_SATA_BAR5_REG110 + dbPort * 0x80, AccWidthUint32, 0x00, 0xFFFFFFFF);
}
}
}
UINT32 CallBackToOEM(UINT32 Func, UINTN Data,AMDSBCFG* pConfig){
UINT32 Result=0;
TRACE((DMSG_SB_TRACE,"OEM Call Back Func [%x] Data [%x]\n",Func,Data));
if (pConfig->StdHeader.pCallBack==NULL)
return Result;
Result = (*(pConfig->StdHeader.pCallBack))(Func,Data,pConfig);
TRACE((DMSG_SB_TRACE,"SB Hook Status [%x]\n",Result));
return Result;
}
#endif