summaryrefslogtreecommitdiff
path: root/ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/MrcOemAddrDecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/MrcOemAddrDecode.c')
-rw-r--r--ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/MrcOemAddrDecode.c232
1 files changed, 232 insertions, 0 deletions
diff --git a/ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/MrcOemAddrDecode.c b/ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/MrcOemAddrDecode.c
new file mode 100644
index 0000000..7c94deb
--- /dev/null
+++ b/ReferenceCode/Chipset/SystemAgent/MemoryInit/Pei/MrcOemAddrDecode.c
@@ -0,0 +1,232 @@
+/**
+This file contains an 'Intel Peripheral Driver' and uniquely
+identified as "Intel Reference Module" and is
+licensed for Intel CPUs and chipsets under the terms of your
+license agreement with Intel or your vendor. This file may
+be modified by the user, subject to additional terms of the
+license agreement
+
+Copyright (c) 1999 - 2012 Intel Corporation. All rights reserved.
+This software and associated documentation (if any) is furnished
+under a license and may only be used or copied in accordance
+with the terms of the license. Except as permitted by such
+license, no part of this software or documentation may be
+reproduced, stored in a retrieval system, or transmitted in any
+form or by any means without the express written consent of
+Intel Corporation.
+
+@file:
+ MrcOemAddrDecode.c
+
+@brief:
+ Wrapper file for AddrDecode files.
+**/
+
+//
+// Include files
+//
+#include "MrcApi.h"
+#include "MrcGlobal.h"
+#include "MrcOemAddrDecode.h"
+#include "MrcOemIo.h"
+#include "MrcOemMmio.h"
+#include "McAddress.h"
+#include "MrcHswMcAddrDecode.h"
+
+/**
+@brief
+ Address decode function
+ Converts system address to DRAM address
+
+ @param[in] SystemAddress - The 39-bit system address to convert.
+ @param[out] DramAddress - The dram address struct that the system address decodes to.
+
+ @retval Returns 1 if successful, 0 otherwise.
+
+**/
+unsigned char
+MrcMcAddressDecode (
+ IN unsigned long long SystemAddress,
+ OUT ADDRESS_DECODE *DramAddress
+ )
+{
+ unsigned char Status;
+ U32 MchBarBaseAddress;
+ U32 PciEBaseAddress;
+ U32 Offset;
+ MRC_PCI_000_TOLUD_STRUCT Tolud;
+ MRC_PCI_000_REMAPBASE_STRUCT RemapBase;
+ MRC_PCI_000_REMAPLIMIT_STRUCT RemapLimit;
+ MCDECS_CR_CHANNEL_HASH_MCMAIN_STRUCT ChannelHash;
+ MCDECS_CR_MAD_ZR_MCMAIN_STRUCT MadZr;
+ MCDECS_CR_MAD_CHNL_MCMAIN_STRUCT MadChnl;
+ MCDECS_CR_MAD_DIMM_CH0_MCMAIN_STRUCT DimmCh0McMain;
+ MCDECS_CR_MAD_DIMM_CH1_MCMAIN_STRUCT DimmCh1McMain;
+ U16 TempChannel;
+ U16 TempDimm;
+ U16 TempRank;
+ U16 TempBank;
+ U16 TempRow;
+ U16 TempColumn;
+ BOOL IsTcm;
+
+ Status = 0;
+
+ //
+ // Check that MCHBAR is programmed
+ //
+ MrcOemOutPort32 (MrcOemPciIndex (), MrcOemGetPciDeviceAddress (0, 0, 0, MRC_PCI_000_MCHBAR_REG));
+ MchBarBaseAddress = MrcOemInPort32 (MrcOemPciData ());
+
+ if ((MchBarBaseAddress & MRC_BIT0) == MRC_BIT0) {
+ MchBarBaseAddress &= (~MRC_BIT0);
+ } else {
+ return Status;
+ }
+
+ //
+ // Check that PCIEXBAR is programmed
+ //
+ MrcOemOutPort32 (MrcOemPciIndex(), MrcOemGetPciDeviceAddress (0, 0, 0, MRC_PCI_000_PCIEXBAR_REG));
+ PciEBaseAddress = MrcOemInPort32 (MrcOemPciData ());
+
+ if ((PciEBaseAddress & MRC_BIT0) == MRC_BIT0) {
+ PciEBaseAddress &= ~(MRC_BIT2 | MRC_BIT1 | MRC_BIT0);
+ } else {
+ return Status;
+ }
+
+ Offset = MrcOemGetPcieDeviceAddress (0, 0, 0, MRC_PCI_000_TOLUD_REG);
+ MrcOemMmioRead (Offset, &Tolud.Data, PciEBaseAddress);
+ Offset = MrcOemGetPcieDeviceAddress (0, 0, 0, MRC_PCI_000_REMAPBASE_REG);
+ MrcOemMmioRead64 (Offset, &RemapBase.Data, PciEBaseAddress);
+ Offset = MrcOemGetPcieDeviceAddress (0, 0, 0, MRC_PCI_000_REMAPLIMIT_REG);
+ MrcOemMmioRead64 (Offset, &RemapLimit.Data, PciEBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_CHANNEL_HASH_MCMAIN_REG, &ChannelHash.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_ZR_MCMAIN_REG, &MadZr.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_CHNL_MCMAIN_REG, &MadChnl.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_DIMM_CH0_MCMAIN_REG, &DimmCh0McMain.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_DIMM_CH1_MCMAIN_REG, &DimmCh1McMain.Data, MchBarBaseAddress);
+ IsTcm = FALSE;
+
+ Status = MrcHswDecode (
+ SystemAddress,
+ &IsTcm,
+ Tolud.Data,
+ RemapBase.Data,
+ RemapLimit.Data,
+ ChannelHash.Data,
+ MadZr.Data,
+ MadChnl.Data,
+ DimmCh0McMain.Data,
+ DimmCh1McMain.Data,
+ 0,
+ &TempChannel,
+ &TempDimm,
+ &TempRank,
+ &TempBank,
+ &TempRow,
+ &TempColumn
+ );
+ DramAddress->ChannelNumber = (U8) TempChannel;
+ DramAddress->DIMMNumber = (U8) TempDimm;
+ DramAddress->Rank = (U8) TempRank;
+ DramAddress->Bank = (U8) TempBank;
+ DramAddress->RAS = (U16) TempRow;
+ DramAddress->CAS = (U16) TempColumn;
+
+ return Status;
+}
+
+/**
+@brief
+ Address encode function (reverse address decode)
+ DRAM address to system address conversion
+
+ @param[in] DramAddress - The dram address that is converted.
+ @param[out] SystemAddress - The 39-bit system address to convert to.
+
+ @retval Returns 1 if successful, 0 otherwise.
+
+**/
+unsigned char
+MrcMcAddressEncode (
+ IN ADDRESS_DECODE *DramAddress,
+ OUT unsigned long long *SystemAddress
+ )
+{
+ unsigned char Status;
+ U32 MchBarBaseAddress;
+ U32 PciEBaseAddress;
+ U32 Offset;
+ MRC_PCI_000_TOLUD_STRUCT Tolud;
+ MRC_PCI_000_REMAPBASE_STRUCT RemapBase;
+ MRC_PCI_000_REMAPLIMIT_STRUCT RemapLimit;
+ MCDECS_CR_CHANNEL_HASH_MCMAIN_STRUCT ChannelHash;
+ MCDECS_CR_MAD_ZR_MCMAIN_STRUCT MadZr;
+ MCDECS_CR_MAD_CHNL_MCMAIN_STRUCT MadChnl;
+ MCDECS_CR_MAD_DIMM_CH0_MCMAIN_STRUCT DimmCh0McMain;
+ MCDECS_CR_MAD_DIMM_CH1_MCMAIN_STRUCT DimmCh1McMain;
+ BOOL IsTcm;
+
+ Status = 0;
+
+ //
+ // Check that MCHBAR is programmed
+ //
+ MrcOemOutPort32 (MrcOemPciIndex (), MrcOemGetPciDeviceAddress (0, 0, 0, MRC_PCI_000_MCHBAR_REG));
+ MchBarBaseAddress = MrcOemInPort32 (MrcOemPciData ());
+
+ if ((MchBarBaseAddress & MRC_BIT0) == MRC_BIT0) {
+ MchBarBaseAddress &= (~MRC_BIT0);
+ } else {
+ return Status;
+ }
+
+ //
+ // Check that PCIEXBAR is programmed
+ //
+ MrcOemOutPort32 (MrcOemPciIndex(), MrcOemGetPciDeviceAddress (0, 0, 0, MRC_PCI_000_PCIEXBAR_REG));
+ PciEBaseAddress = MrcOemInPort32 (MrcOemPciData ());
+
+ if ((PciEBaseAddress & MRC_BIT0) == MRC_BIT0) {
+ PciEBaseAddress &= ~(MRC_BIT2 | MRC_BIT1 | MRC_BIT0);
+ } else {
+ return Status;
+ }
+
+ Offset = MrcOemGetPcieDeviceAddress (0, 0, 0, MRC_PCI_000_TOLUD_REG);
+ MrcOemMmioRead (Offset, &Tolud.Data, PciEBaseAddress);
+ Offset = MrcOemGetPcieDeviceAddress (0, 0, 0, MRC_PCI_000_REMAPBASE_REG);
+ MrcOemMmioRead64 (Offset, &RemapBase.Data, PciEBaseAddress);
+ Offset = MrcOemGetPcieDeviceAddress (0, 0, 0, MRC_PCI_000_REMAPLIMIT_REG);
+ MrcOemMmioRead64 (Offset, &RemapLimit.Data, PciEBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_CHANNEL_HASH_MCMAIN_REG, &ChannelHash.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_ZR_MCMAIN_REG, &MadZr.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_CHNL_MCMAIN_REG, &MadChnl.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_DIMM_CH0_MCMAIN_REG, &DimmCh0McMain.Data, MchBarBaseAddress);
+ MrcOemMmioRead (MCDECS_CR_MAD_DIMM_CH1_MCMAIN_REG, &DimmCh1McMain.Data, MchBarBaseAddress);
+ IsTcm = FALSE;
+
+ Status = MrcHswEncode (
+ (U16) DramAddress->ChannelNumber,
+ (U16) DramAddress->DIMMNumber,
+ (U16) DramAddress->Rank,
+ (U16) DramAddress->Bank,
+ (U16) DramAddress->RAS,
+ (U16) DramAddress->CAS,
+ Tolud.Data,
+ RemapBase.Data,
+ RemapLimit.Data,
+ ChannelHash.Data,
+ MadZr.Data,
+ MadChnl.Data,
+ DimmCh0McMain.Data,
+ DimmCh1McMain.Data,
+ 0,
+ SystemAddress,
+ &IsTcm
+ );
+
+ return Status;
+}