/** @file
Perform related functions for PCH Sata in DXE phase
Copyright (c) 2019 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include "PchInit.h"
#include
#include
/**
Perform the remaining configuration on PCH SATA to perform device detection,
then set the SATA SPD and PxE corresponding, and set the Register Lock on PCH SATA
@retval None
**/
VOID
ConfigurePchSataOnEndOfDxe (
VOID
)
{
UINT64 PciSataRegBase;
UINT16 SataPortsEnabled;
UINT32 DwordReg;
UINTN Index;
UINT32 SataCtrlIndex;
for (SataCtrlIndex = 0; SataCtrlIndex < GetPchMaxSataControllerNum (); SataCtrlIndex++) {
///
/// SATA PCS: Enable the port in any of below condition:
/// i.) Hot plug is enabled
/// ii.) A device is attached
/// iii.) Test mode is enabled
/// iv.) Configured as eSATA port
///
PciSataRegBase = GetSataRegBase (SataCtrlIndex);
SataPortsEnabled = 0;
DwordReg = PciSegmentRead32 (PciSataRegBase + R_SATA_CFG_PCS);
for (Index = 0; Index < GetPchMaxSataPortNum (SataCtrlIndex); Index++) {
if ((mPchConfigHob->Sata[SataCtrlIndex].PortSettings[Index].HotPlug == TRUE) ||
(DwordReg & (B_SATA_CFG_PCS_P0P << Index)) ||
(mPchConfigHob->Sata[SataCtrlIndex].TestMode == TRUE) ||
(mPchConfigHob->Sata[SataCtrlIndex].PortSettings[Index].External == TRUE)) {
SataPortsEnabled |= (mPchConfigHob->Sata[SataCtrlIndex].PortSettings[Index].Enable << Index);
}
}
///
/// Set MAP."Sata PortX Disable", SATA PCI offset 90h[23:16] to 1b if SATA Port 0/1/2/3/4/5/6/7 is disabled
///
PciSegmentOr32 (PciSataRegBase + R_SATA_CFG_MAP, (~SataPortsEnabled << N_SATA_CFG_MAP_SPD));
S3BootScriptSaveMemWrite (
S3BootScriptWidthUint32,
PcdGet64 (PcdPciExpressBaseAddress) + PciSataRegBase + R_SATA_CFG_MAP,
1,
(VOID *) (UINTN) (PcdGet64 (PcdPciExpressBaseAddress) + PciSataRegBase + R_SATA_CFG_MAP)
);
///
/// Program PCS "Port X Enabled", SATA PCI offset 94h[7:0] = Port 0~7 Enabled bit as per SataPortsEnabled value.
///
PciSegmentOr16 (PciSataRegBase + R_SATA_CFG_PCS, SataPortsEnabled);
S3BootScriptSaveMemWrite (
S3BootScriptWidthUint16,
PcdGet64 (PcdPciExpressBaseAddress) + PciSataRegBase + R_SATA_CFG_PCS,
1,
(VOID *) (UINTN) (PcdGet64 (PcdPciExpressBaseAddress) + PciSataRegBase + R_SATA_CFG_PCS)
);
///
/// Step 14
/// Program SATA PCI offset 9Ch [31] to 1b
///
PciSegmentOr32 ((UINTN) (PciSataRegBase + R_SATA_CFG_SATAGC), BIT31);
S3BootScriptSaveMemWrite (
S3BootScriptWidthUint32,
PcdGet64 (PcdPciExpressBaseAddress) + PciSataRegBase + R_SATA_CFG_SATAGC,
1,
(VOID *) (UINTN) (PcdGet64 (PcdPciExpressBaseAddress) + PciSataRegBase + R_SATA_CFG_SATAGC)
);
}
}