[coreboot-gerrit] New patch to review for coreboot: [WIP]nb/intel/sandybridge/raminit: Add 100Mhz refclock support

Patrick Rudolph (siro@das-labor.org) gerrit at coreboot.org
Fri Nov 25 17:07:45 CET 2016


Patrick Rudolph (siro at das-labor.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17607

-gerrit

commit 402d2872372d68810ac9adf13940065a9ee5a1f3
Author: Patrick Rudolph <siro at das-labor.org>
Date:   Thu Nov 24 19:40:23 2016 +0100

    [WIP]nb/intel/sandybridge/raminit: Add 100Mhz refclock support
    
    Add support for 100Mhz reference clock on ivybridge.
    Allows to use more frequencies than sandybridge.
    
    UNTESTED!
    
    Change-Id: I780d34ded2c1e3737ae1af685c8c2da832842e7c
    Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
 src/northbridge/intel/sandybridge/raminit_ivy.c | 38 ++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/src/northbridge/intel/sandybridge/raminit_ivy.c b/src/northbridge/intel/sandybridge/raminit_ivy.c
index 91fa22e..53ae7ba 100644
--- a/src/northbridge/intel/sandybridge/raminit_ivy.c
+++ b/src/northbridge/intel/sandybridge/raminit_ivy.c
@@ -429,11 +429,18 @@ static void dram_timing(ramctr_timing * ctrl)
 
 static void dram_freq(ramctr_timing * ctrl)
 {
+	bool ref_100mhz_support;
+	u32 reg32;
+
 	if (ctrl->tCK > TCK_400MHZ) {
 		printk (BIOS_ERR, "DRAM frequency is under lowest supported frequency (400 MHz). Increasing to 400 MHz as last resort");
 		ctrl->tCK = TCK_400MHZ;
 	}
 
+	/* 100 Mhz reference clock supported */
+	reg32 = pci_read_config32(PCI_DEV(0, 0, 0), CAPID0_B);
+	ref_100mhz_support = ((reg32 >> 21) & 0x7);
+
 	/* TODO: implement 100Mhz refclock */
 	ctrl->base_freq = 133;
 
@@ -443,22 +450,49 @@ static void dram_freq(ramctr_timing * ctrl)
 
 		/* Step 1 - Set target PCU frequency */
 
-		if (ctrl->tCK <= TCK_1066MHZ) {
+		if (ctrl->tCK <= TCK_1200MHZ) {
+			ctrl->tCK = TCK_1200MHZ;
+			ctrl->base_freq = 100;
+		} else if (ctrl->tCK <= TCK_1100MHZ) {
+			ctrl->tCK = TCK_1100MHZ;
+			ctrl->base_freq = 100;
+		} else if (ctrl->tCK <= TCK_1066MHZ) {
 			ctrl->tCK = TCK_1066MHZ;
+			ctrl->base_freq = 133;
+		} else if (ctrl->tCK <= TCK_1000MHZ) {
+			ctrl->tCK = TCK_1000MHZ;
+			ctrl->base_freq = 100;
 		} else if (ctrl->tCK <= TCK_933MHZ) {
 			ctrl->tCK = TCK_933MHZ;
+			ctrl->base_freq = 133;
+		} else if (ctrl->tCK <= TCK_900MHZ) {
+			ctrl->tCK = TCK_900MHZ;
+			ctrl->base_freq = 100;
 		} else if (ctrl->tCK <= TCK_800MHZ) {
 			ctrl->tCK = TCK_800MHZ;
+			ctrl->base_freq = 133;
+		} else if (ctrl->tCK <= TCK_700MHZ) {
+			ctrl->tCK = TCK_700MHZ;
+			ctrl->base_freq = 100;
 		} else if (ctrl->tCK <= TCK_666MHZ) {
 			ctrl->tCK = TCK_666MHZ;
+			ctrl->base_freq = 133;
 		} else if (ctrl->tCK <= TCK_533MHZ) {
 			ctrl->tCK = TCK_533MHZ;
+			ctrl->base_freq = 133;
 		} else if (ctrl->tCK <= TCK_400MHZ) {
 			ctrl->tCK = TCK_400MHZ;
+			ctrl->base_freq = 133;
 		} else {
 			die ("No lock frequency found");
 		}
 
+		if (!ref_100mhz_support && ctrl->base_freq == 100) {
+			/* Skip unsupported frequency. */
+			ctrl->tCK++;
+			continue;
+		}
+
 		/* Frequency multiplier.  */
 		u32 FRQ = get_FRQ(ctrl->tCK, ctrl->base_freq);
 
@@ -472,6 +506,8 @@ static void dram_freq(ramctr_timing * ctrl)
 
 		/* Step 2 - Select frequency in the MCU */
 		reg1 = FRQ;
+		if (ctrl->base_freq == 100)
+			reg1 |= 0x100; /* Enable 100Mhz REF clock */
 		reg1 |= 0x80000000;	// set running bit
 		MCHBAR32(MC_BIOS_REQ) = reg1;
 		int i=0;



More information about the coreboot-gerrit mailing list