diff options
Diffstat (limited to 'resources/libreboot/patch/kgpe-d16/0092-northbridge-amd-amdmct-mct_ddr3-Move-K10D-configurat.patch')
-rw-r--r-- | resources/libreboot/patch/kgpe-d16/0092-northbridge-amd-amdmct-mct_ddr3-Move-K10D-configurat.patch | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/resources/libreboot/patch/kgpe-d16/0092-northbridge-amd-amdmct-mct_ddr3-Move-K10D-configurat.patch b/resources/libreboot/patch/kgpe-d16/0092-northbridge-amd-amdmct-mct_ddr3-Move-K10D-configurat.patch new file mode 100644 index 00000000..2c1a411e --- /dev/null +++ b/resources/libreboot/patch/kgpe-d16/0092-northbridge-amd-amdmct-mct_ddr3-Move-K10D-configurat.patch @@ -0,0 +1,334 @@ +From 4875c65838b25b4338a023111fc667e9a9f314ca Mon Sep 17 00:00:00 2001 +From: Timothy Pearson <kb9vqf@pearsoncomputing.net> +Date: Sun, 2 Aug 2015 21:23:02 -0500 +Subject: [PATCH 092/146] northbridge/amd/amdmct/mct_ddr3: Move K10D + configuration into separate file + +--- + src/northbridge/amd/amdfam10/raminit_amdmct.c | 1 + + src/northbridge/amd/amdmct/amddefs.h | 5 +- + src/northbridge/amd/amdmct/mct_ddr3/mct_d.c | 131 +++++++++++------------- + src/northbridge/amd/amdmct/mct_ddr3/mctcsi_d.c | 4 +- + src/northbridge/amd/amdmct/mct_ddr3/mctprod.c | 65 ++++++++++++ + 5 files changed, 130 insertions(+), 76 deletions(-) + create mode 100644 src/northbridge/amd/amdmct/mct_ddr3/mctprod.c + +diff --git a/src/northbridge/amd/amdfam10/raminit_amdmct.c b/src/northbridge/amd/amdfam10/raminit_amdmct.c +index 4962c2a..ebd22cd 100644 +--- a/src/northbridge/amd/amdfam10/raminit_amdmct.c ++++ b/src/northbridge/amd/amdfam10/raminit_amdmct.c +@@ -370,6 +370,7 @@ static uint16_t mct_MaxLoadFreq(uint8_t count, uint8_t highest_rank_count, uint8 + #include "../amdmct/mct_ddr3/mctdqs_d.c" + #include "../amdmct/mct_ddr3/mctsrc.c" + #include "../amdmct/mct_ddr3/mctsdi.c" ++#include "../amdmct/mct_ddr3/mctprod.c" + #include "../amdmct/mct_ddr3/mctproc.c" + #include "../amdmct/mct_ddr3/mctprob.c" + #include "../amdmct/mct_ddr3/mcthwl.c" +diff --git a/src/northbridge/amd/amdmct/amddefs.h b/src/northbridge/amd/amdmct/amddefs.h +index 7aa4698..60d3c16 100644 +--- a/src/northbridge/amd/amdmct/amddefs.h ++++ b/src/northbridge/amd/amdmct/amddefs.h +@@ -2,6 +2,7 @@ + * This file is part of the coreboot project. + * + * Copyright (C) 2007-2008 Advanced Micro Devices, Inc. ++ * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -115,7 +116,7 @@ + /* + * CPU HT PHY REGISTERS, FIELDS, AND MASKS + */ +-#define HTPHY_OFFSET_MASK 0xE00001FF ++#define HTPHY_OFFSET_MASK 0xE000FFFF + #define HTPHY_WRITE_CMD 0x40000000 + #define HTPHY_IS_COMPLETE_MASK 0x80000000 + #define HTPHY_DIRECT_MAP 0x20000000 +@@ -164,4 +165,4 @@ + #define AMD_PKGTYPE_S1gX 2 + #define AMD_PKGTYPE_G34 3 + #define AMD_PKGTYPE_ASB2 4 +-#define AMD_PKGTYPE_C32 5 +\ No newline at end of file ++#define AMD_PKGTYPE_C32 5 +diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c +index b7c8e83..4d8f3d0 100644 +--- a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c ++++ b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c +@@ -182,6 +182,7 @@ static void SyncSetting(struct DCTStatStruc *pDCTstat); + static uint8_t crcCheck(struct DCTStatStruc *pDCTstat, uint8_t dimm); + static void mct_ExtMCTConfig_Bx(struct DCTStatStruc *pDCTstat); + static void mct_ExtMCTConfig_Cx(struct DCTStatStruc *pDCTstat); ++static void mct_ExtMCTConfig_Dx(struct DCTStatStruc *pDCTstat); + + static void read_dqs_receiver_enable_control_registers(uint16_t* current_total_delay, + uint32_t dev, uint8_t dct, uint8_t dimm, uint32_t index_reg); +@@ -2670,13 +2671,11 @@ static void MCTMemClr_D(struct MCTStatStruc *pMCTstat, + } + + for (Node = 0; Node < MAX_NODES_SUPPORTED; Node++) { +- /* Configure and enable prefetchers */ +- if (is_fam15h()) +- dword = 0x0ce00f41; /* BKDG recommended */ +- else +- dword = 0x0fe40fc0; /* BKDG recommended */ +- dword |= MCCH_FlushWrOnStpGnt; /* Set for S3 */ +- Set_NB32(pDCTstat->dev_dct, 0x11c, dword); ++ /* Enable prefetchers */ ++ dword = Get_NB32(pDCTstat->dev_dct, 0x11c); /* Memory Controller Configuration High */ ++ dword &= ~(0x1 << 13); /* PrefIoDis = 0 */ ++ dword &= ~(0x1 << 12); /* PrefCpuDis = 0 */ ++ Set_NB32(pDCTstat->dev_dct, 0x11c, dword); /* Memory Controller Configuration High */ + } + } + +@@ -4914,31 +4913,33 @@ static void Set_OtherTiming(struct MCTStatStruc *pMCTstat, + Get_TrwtTO(pMCTstat, pDCTstat, dct); + Get_TrwtWB(pMCTstat, pDCTstat); + +- reg = 0x8C; /* Dram Timing Hi */ +- val = Get_NB32_DCT(dev, dct, reg); +- val &= 0xffff0300; +- dword = pDCTstat->TrwtTO; +- val |= dword << 4; +- dword = pDCTstat->Twrrd & 3; +- val |= dword << 10; +- dword = pDCTstat->Twrwr & 3; +- val |= dword << 12; +- dword = pDCTstat->Trdrd & 3; +- val |= dword << 14; +- dword = pDCTstat->TrwtWB; +- val |= dword; +- Set_NB32_DCT(dev, dct, reg, val); +- +- reg = 0x78; +- val = Get_NB32_DCT(dev, dct, reg); +- val &= 0xFFFFC0FF; +- dword = pDCTstat->Twrrd >> 2; +- val |= dword << 8; +- dword = pDCTstat->Twrwr >> 2; +- val |= dword << 10; +- dword = pDCTstat->Trdrd >> 2; +- val |= dword << 12; +- Set_NB32_DCT(dev, dct, reg, val); ++ if (!is_fam15h()) { ++ reg = 0x8c; /* Dram Timing Hi */ ++ val = Get_NB32_DCT(dev, dct, reg); ++ val &= 0xffff0300; ++ dword = pDCTstat->TrwtTO; ++ val |= dword << 4; ++ dword = pDCTstat->Twrrd & 3; ++ val |= dword << 10; ++ dword = pDCTstat->Twrwr & 3; ++ val |= dword << 12; ++ dword = (pDCTstat->Trdrd - 0x3) & 3; ++ val |= dword << 14; ++ dword = pDCTstat->TrwtWB; ++ val |= dword; ++ Set_NB32_DCT(dev, dct, reg, val); ++ ++ reg = 0x78; ++ val = Get_NB32_DCT(dev, dct, reg); ++ val &= 0xffffc0ff; ++ dword = pDCTstat->Twrrd >> 2; ++ val |= dword << 8; ++ dword = pDCTstat->Twrwr >> 2; ++ val |= dword << 10; ++ dword = (pDCTstat->Trdrd - 0x3) >> 2; ++ val |= dword << 12; ++ Set_NB32_DCT(dev, dct, reg, val); ++ } + } + + static void Get_Trdrd(struct MCTStatStruc *pMCTstat, +@@ -4949,6 +4950,8 @@ static void Get_Trdrd(struct MCTStatStruc *pMCTstat, + Trdrd = ((int8_t)(pDCTstat->DqsRcvEnGrossMax - pDCTstat->DqsRcvEnGrossMin) >> 1) + 1; + if (Trdrd > 8) + Trdrd = 8; ++ if (Trdrd < 3) ++ Trdrd = 3; + pDCTstat->Trdrd = Trdrd; + } + +@@ -5259,47 +5262,31 @@ static void mct_FinalMCT_D(struct MCTStatStruc *pMCTstat, + if (pDCTstat->NodePresent) { + mct_PhyController_Config(pMCTstat, pDCTstat, 0); + mct_PhyController_Config(pMCTstat, pDCTstat, 1); +- } +- if (!(pDCTstat->LogicalCPUID & AMD_DR_Dx)) { /* mct_checkForDxSupport */ +- mct_ExtMCTConfig_Cx(pDCTstat); +- mct_ExtMCTConfig_Bx(pDCTstat); +- } else { /* For Dx CPU */ +- val = 0x0CE00F00 | 1 << 29/* FlushWrOnStpGnt */; +- if (!(pDCTstat->GangedMode)) +- val |= 0x20; /* MctWrLimit = 8 for Unganged mode */ +- else +- val |= 0x40; /* MctWrLimit = 16 for ganged mode */ +- Set_NB32(pDCTstat->dev_dct, 0x11C, val); +- +- val = Get_NB32(pDCTstat->dev_dct, 0x1B0); +- val &= 0xFFFFF8C0; +- val |= 0x101; /* BKDG recommended settings */ +- val |= 0x0FC00000; /* Agesa V5 */ +- if (!(pDCTstat->GangedMode)) +- val |= 1 << 12; +- else +- val &= ~(1 << 12); + +- val &= 0x0FFFFFFF; + if (!is_fam15h()) { +- switch (pDCTstat->Speed) { +- case 4: +- val |= 0x50000000; /* 5 for DDR800 */ +- break; +- case 5: +- val |= 0x60000000; /* 6 for DDR1066 */ +- break; +- case 6: +- val |= 0x80000000; /* 8 for DDR800 */ +- break; +- default: +- val |= 0x90000000; /* 9 for DDR1600 */ +- break; +- } +- } +- Set_NB32(pDCTstat->dev_dct, 0x1B0, val); ++ /* Family 10h CPUs */ ++ mct_ExtMCTConfig_Cx(pDCTstat); ++ mct_ExtMCTConfig_Bx(pDCTstat); ++ mct_ExtMCTConfig_Dx(pDCTstat); ++ } else { ++ /* Family 15h CPUs */ ++ val = 0x0ce00f00 | 0x1 << 29; /* FlushWrOnStpGnt */ ++ val |= 0x10 << 2; /* MctWrLimit = 16 */ ++ Set_NB32(pDCTstat->dev_dct, 0x11c, val); ++ ++ val = Get_NB32(pDCTstat->dev_dct, 0x1b0); ++ val &= ~0x3; /* AdapPrefMissRatio = 0x1 */ ++ val |= 0x1; ++ val &= ~(0x3 << 2); /* AdapPrefPositiveStep = 0x0 */ ++ val &= ~(0x3 << 4); /* AdapPrefNegativeStep = 0x0 */ ++ val &= ~(0x7 << 8); /* CohPrefPrbLmt = 0x1 */ ++ val |= (0x1 << 8); ++ val |= (0x1 << 12); /* EnSplitDctLimits = 0x1 */ ++ val |= (0x7 << 22); /* PrefFourConf = 0x7 */ ++ val |= (0x7 << 25); /* PrefFiveConf = 0x7 */ ++ val &= ~(0xf << 28); /* DcqBwThrotWm = 0x0 */ ++ Set_NB32(pDCTstat->dev_dct, 0x1b0, val); + +- if (is_fam15h()) { + uint8_t wm1; + uint8_t wm2; + +@@ -5330,11 +5317,11 @@ static void mct_FinalMCT_D(struct MCTStatStruc *pMCTstat, + break; + } + +- val = Get_NB32(pDCTstat->dev_dct, 0x1B4); ++ val = Get_NB32(pDCTstat->dev_dct, 0x1b4); + val &= ~(0x3ff); + val |= ((wm2 & 0x1f) << 5); + val |= (wm1 & 0x1f); +- Set_NB32(pDCTstat->dev_dct, 0x1B4, val); ++ Set_NB32(pDCTstat->dev_dct, 0x1b4, val); + } + } + } +diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mctcsi_d.c b/src/northbridge/amd/amdmct/mct_ddr3/mctcsi_d.c +index a1cdfa6..41f0946 100644 +--- a/src/northbridge/amd/amdmct/mct_ddr3/mctcsi_d.c ++++ b/src/northbridge/amd/amdmct/mct_ddr3/mctcsi_d.c +@@ -102,7 +102,7 @@ void InterleaveBanks_D(struct MCTStatStruc *pMCTstat, + BitDelta = bsf(AddrHiMask) - bsf(AddrLoMask); + + for (ChipSel = 0; ChipSel < MAX_CS_SUPPORTED; ChipSel++) { +- reg = 0x40+(ChipSel<<2); /*Dram CS Base 0 */ ++ reg = 0x40 + (ChipSel<<2); /* Dram CS Base 0 */ + val = Get_NB32_DCT(dev, dct, reg); + if (val & 3) { + val_lo = val & AddrLoMask; +@@ -118,7 +118,7 @@ void InterleaveBanks_D(struct MCTStatStruc *pMCTstat, + if(ChipSel & 1) + continue; + +- reg = 0x60 + ((ChipSel>>1)<<2); /*Dram CS Mask 0 */ ++ reg = 0x60 + ((ChipSel>>1)<<2); /* Dram CS Mask 0 */ + val = Get_NB32_DCT(dev, dct, reg); + val_lo = val & AddrLoMask; + val_hi = val & AddrHiMask; +diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mctprod.c b/src/northbridge/amd/amdmct/mct_ddr3/mctprod.c +new file mode 100644 +index 0000000..2b62d4c +--- /dev/null ++++ b/src/northbridge/amd/amdmct/mct_ddr3/mctprod.c +@@ -0,0 +1,65 @@ ++/* ++ * This file is part of the coreboot project. ++ * ++ * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering ++ * Copyright (C) 2010 Advanced Micro Devices, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; version 2 of the License. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc. ++ */ ++ ++void mct_ExtMCTConfig_Dx(struct DCTStatStruc *pDCTstat) ++{ ++ uint32_t dword; ++ ++ if (pDCTstat->LogicalCPUID & AMD_DR_Dx) { ++ dword = 0x0ce00f00 | 0x1 << 29; /* FlushWrOnStpGnt */ ++ if (!(pDCTstat->GangedMode)) ++ dword |= 0x18 << 2; /* MctWrLimit = 0x18 for unganged mode */ ++ else ++ dword |= 0x10 << 2; /* MctWrLimit = 0x10 for ganged mode */ ++ Set_NB32(pDCTstat->dev_dct, 0x11c, dword); ++ ++ dword = Get_NB32(pDCTstat->dev_dct, 0x1b0); ++ dword &= ~0x3; /* AdapPrefMissRatio = 0x1 */ ++ dword |= 0x1; ++ dword &= ~(0x3 << 2); /* AdapPrefPositiveStep = 0x0 */ ++ dword &= ~(0x3 << 4); /* AdapPrefNegativeStep = 0x0 */ ++ dword &= ~(0x7 << 8); /* CohPrefPrbLmt = 0x1 */ ++ dword |= (0x1 << 8); ++ dword |= (0x7 << 22); /* PrefFourConf = 0x7 */ ++ dword |= (0x7 << 25); /* PrefFiveConf = 0x7 */ ++ ++ if (!(pDCTstat->GangedMode)) ++ dword |= (0x1 << 12); /* EnSplitDctLimits = 0x1 */ ++ else ++ dword &= ~(0x1 << 12); /* EnSplitDctLimits = 0x0 */ ++ ++ dword &= ~(0xf << 28); /* DcqBwThrotWm = ... */ ++ switch (pDCTstat->Speed) { ++ case 4: ++ dword |= (0x5 << 28); /* ...5 for DDR800 */ ++ break; ++ case 5: ++ dword |= (0x6 << 28); /* ...6 for DDR1066 */ ++ break; ++ case 6: ++ dword |= (0x8 << 28); /* ...8 for DDR800 */ ++ break; ++ default: ++ dword |= (0x9 << 28); /* ...9 for DDR1600 */ ++ break; ++ } ++ Set_NB32(pDCTstat->dev_dct, 0x1b0, dword); ++ } ++} +-- +1.7.9.5 + |