/** * gecInitAfterPciEnum - Config GEC controller after PCI emulation * * * * @param[in] pConfig Southbridge configuration structure pointer. * */ VOID gecInitAfterPciEnum ( IN AMDSBCFG* pConfig ) { VOID* GecRomAddress; VOID* GecShadowRomAddress; UINT32 ddTemp; UINT8 dbVar; UINT8 dbTemp; if ( pConfig->GecConfig == 0) { dbVar = 0; ReadPCI ((GEC_BUS_DEV_FUN << 16) + SB_GEC_REG04, AccWidthUint8, &dbVar); dbTemp = 0x07; WritePCI ((GEC_BUS_DEV_FUN << 16) + SB_GEC_REG04, AccWidthUint8, &dbTemp); if ( !pConfig->DYNAMICGECROM.DynamicGecRomAddress_Ptr == NULL ) { GecRomAddress = pConfig->DYNAMICGECROM.DynamicGecRomAddress_Ptr; GecShadowRomAddress = (VOID*) (UINTN) pConfig->BuildParameters.GecShadowRomBase; AmdSbCopyMem (GecShadowRomAddress, GecRomAddress, 0x100); ReadPCI ((GEC_BUS_DEV_FUN << 16) + SB_GEC_REG10, AccWidthUint32, &ddTemp); ddTemp = ddTemp & 0xFFFFFFF0; RWMEM (ddTemp + 0x6804, AccWidthUint32, 0, BIT0 + BIT29); } WritePCI ((GEC_BUS_DEV_FUN << 16) + SB_GEC_REG04, AccWidthUint8, &dbVar); } }
/*++ Routine Description: SATA Late Configuration if the mode is selected as IDE->AHCI { 1. Set class ID to AHCI 2. Enable AHCI interrupt } Arguments: pConfig - SBconfiguration Returns: void --*/ void sataInitLatePost(AMDSBCFG* pConfig){ UINT32 ddBar5; UINT8 dbVar; //Return immediately is sata controller is not enabled if (pConfig->SataController == 0) return; restrictSataCapabilities(pConfig); //Get BAR5 value ReadPCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG24), AccWidthUint32, &ddBar5); //Assign temporary BAR if is not already assigned if ( (ddBar5 == 0) || (ddBar5 == -1) ){ //assign temporary BAR5 if ( (pConfig->TempMMIO == 0) || (pConfig->TempMMIO == -1)) ddBar5 = 0xFEC01000; else ddBar5=pConfig->TempMMIO; WritePCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG24), AccWidthUint32, &ddBar5); } ReadPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG04), AccWidthUint8, &dbVar); //Enable memory and io access RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG04), AccWidthUint8, 0xFF, 0x03); //Enable write access to pci header, pm capabilities RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG40), AccWidthUint8 | S3_SAVE, 0xff, BIT0); shutdownUnconnectedSataPortClock(pConfig, ddBar5); if ( (pConfig->SataClass == IDE_TO_AHCI_MODE) || (pConfig->SataClass == IDE_TO_AMD_AHCI_MODE)){ //program the AHCI class code RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG08), AccWidthUint32 | S3_SAVE, 0, 0x01060100); //Set interrupt enable bit RWMEM((ddBar5 + 0x04),AccWidthUint8,~(UINT32)0,BIT1); //program the correct device id for AHCI mode RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG02), AccWidthUint16 | S3_SAVE, 0, 0x4391); if (pConfig->SataClass == IDE_TO_AMD_AHCI_MODE) //program the correct device id for AMD-AHCI mode RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG40 + 3), AccWidthUint8 | S3_SAVE, 0xFF, BIT0); } //Disable write access to pci header and pm capabilities RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG40), AccWidthUint8 | S3_SAVE, ~(UINT32)BIT0, 0); //Clear error status RWMEM((ddBar5 + SB_SATA_BAR5_REG130),AccWidthUint32 | S3_SAVE, 0xFFFFFFFF, 0xFFFFFFFF); RWMEM((ddBar5 + SB_SATA_BAR5_REG1B0),AccWidthUint32 | S3_SAVE, 0xFFFFFFFF, 0xFFFFFFFF); RWMEM((ddBar5 + SB_SATA_BAR5_REG230),AccWidthUint32 | S3_SAVE, 0xFFFFFFFF, 0xFFFFFFFF); RWMEM((ddBar5 + SB_SATA_BAR5_REG2B0),AccWidthUint32 | S3_SAVE, 0xFFFFFFFF, 0xFFFFFFFF); //Restore memory and io access bits WritePCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG04), AccWidthUint8, &dbVar ); }
void sataInitAfterPciEnum(AMDSBCFG* pConfig){ UINT32 ddAndMask=0, ddOrMask=0, ddBar5=0; UINT8 dbVar, dbPortNum; if (pConfig->SataController == 0) return; //return if SATA controller is disabled. //Enable write access to pci header, pm capabilities RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG40), AccWidthUint8 | S3_SAVE, 0xFF, BIT0); //Disable AHCI enhancement function (RPR 7.2) RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG40 + 2), AccWidthUint8 | S3_SAVE, 0xFF, BIT7); restrictSataCapabilities(pConfig); ReadPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG24), AccWidthUint32, &ddBar5); if ( (ddBar5 == 0) || (ddBar5 == -1) ) { //assign temporary BAR5 if ( (pConfig->TempMMIO == 0) || (pConfig->TempMMIO == -1)) ddBar5 = 0xFEC01000; else ddBar5=pConfig->TempMMIO; WritePCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG24), AccWidthUint32, &ddBar5); } ReadPCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG04), AccWidthUint8, &dbVar); RWPCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG04), AccWidthUint8,0xFF, 0x03); //memory and io access enable ddBar5 &= 0xFFFFFC00; //Clear Bits 9:0 if (!pConfig->SataPortMultCap) ddAndMask |= BIT12; if (!pConfig->SataAggrLinkPmCap) ddAndMask |= BIT11; if (pConfig->SataSscPscCap) ddOrMask |= BIT1; RWMEM((ddBar5 + SB_SATA_BAR5_REGFC),AccWidthUint32 | S3_SAVE, ~ddAndMask, ddOrMask); //Clear HPCP and ESP by default RWMEM((ddBar5 + SB_SATA_BAR5_REGF8),AccWidthUint32 | S3_SAVE, 0xFFFC0FC0, 0); if (pConfig->SataHpcpButNonESP !=0) { RWMEM((ddBar5 + SB_SATA_BAR5_REGF8),AccWidthUint32 | S3_SAVE, 0xFFFFFFC0, pConfig->SataHpcpButNonESP); } // SATA ESP port setting // These config bits are set for SATA driver to identify which ports are external SATA ports and need to // support hotplug. If a port is set as an external SATA port and need to support hotplug, then driver will // not enable power management(HIPM & DIPM) for these ports. if (pConfig->SataEspPort !=0) { RWMEM((ddBar5 + SB_SATA_BAR5_REGFC),AccWidthUint32 | S3_SAVE, 0xFFFFFFFF, BIT20); RWMEM((ddBar5 + SB_SATA_BAR5_REGF8),AccWidthUint32 | S3_SAVE, ~(pConfig->SataEspPort), 0); RWMEM((ddBar5 + SB_SATA_BAR5_REGF8),AccWidthUint32 | S3_SAVE, ~(UINT32)(BIT17+BIT16+BIT15+BIT14+BIT13+BIT12),(pConfig->SataEspPort << 12)); } if ( ((pConfig->SataClass) != NATIVE_IDE_MODE) && ((pConfig->SataClass) != LEGACY_IDE_MODE) ) RWPCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG50+2), AccWidthUint8, ~(UINT32)(BIT3+BIT2+BIT1), BIT2+BIT1); //set MSI to 8 messages if ( ((pConfig->SataClass) != NATIVE_IDE_MODE) && ((pConfig->SataClass) != LEGACY_IDE_MODE) && ((pConfig->SataIdeCombinedMode) == CIMX_OPTION_DISABLED) ){ RWMEM((ddBar5 + SB_SATA_BAR5_REG00),AccWidthUint8 | S3_SAVE, ~(UINT32)(BIT2+BIT1+BIT0), BIT2+BIT0); RWMEM((ddBar5 + SB_SATA_BAR5_REG0C),AccWidthUint8 | S3_SAVE, 0xC0, 0x3F); } for (dbPortNum=0;dbPortNum<=5;dbPortNum++){ if (pConfig->SataPortMode & (1 << dbPortNum)){ //downgrade to GEN1 RWMEM(ddBar5+ SB_SATA_BAR5_REG12C + dbPortNum * 0x80, AccWidthUint8, 0x0F, 0x10); RWMEM(ddBar5+ SB_SATA_BAR5_REG12C + dbPortNum * 0x80, AccWidthUint8, 0xFF, 0x01); Stall(1000); RWMEM(ddBar5+ SB_SATA_BAR5_REG12C + dbPortNum * 0x80, AccWidthUint8, 0xFE, 0x00); } } //If this is not S3 resume and also if SATA set to one of IDE mode, then implement drive detection workaround. if ( !(pConfig->S3Resume) && ( ((pConfig->SataClass) != AHCI_MODE) && ((pConfig->SataClass) != RAID_MODE) && ((pConfig->SataClass) != AMD_AHCI_MODE) ) ) sataDriveDetection(pConfig, ddBar5); if ( (pConfig->SataPhyWorkaround==1) || ( (pConfig->SataPhyWorkaround==0) && (getRevisionID() < SB700_A13)) ) sataPhyWorkaround(pConfig, ddBar5); // Set the handshake bit for IDE driver to detect the disabled IDE channel correctly. // Set IDE PCI Config 0x63 [3] if primary channel disabled, [4] if secondary channel disabled. if (pConfig->SataIdeCombinedMode == CIMX_OPTION_DISABLED) RWPCI( ((IDE_BUS_DEV_FUN << 16) + SB_IDE_REG63), AccWidthUint8 , 0xF9, (0x02 << (pConfig->SataIdeCombMdPriSecOpt)) ); WritePCI( ((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG04), AccWidthUint8, &dbVar); //Disable write access to pci header, pm capabilities RWPCI(((SATA_BUS_DEV_FUN << 16) + SB_SATA_REG40), AccWidthUint8 | S3_SAVE, ~(UINT32)BIT0, 0); }