[U-Boot-Users] [RFC][FSL DDR 4/8] FSL DDR: Provide a generic fsl_ddr_sdram_set_lawbar()

Kumar Gala galak at kernel.crashing.org
Mon Jun 9 21:55:18 CEST 2008


Make fsl_ddr_sdram_set_lawbar() a weak function to allow board code to
override if desired.

Signed-off-by: Kumar Gala <galak at kernel.crashing.org>
---
 drivers/misc/fsl_law.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/drivers/misc/fsl_law.c b/drivers/misc/fsl_law.c
index dca6a4d..f9bdf10 100644
--- a/drivers/misc/fsl_law.c
+++ b/drivers/misc/fsl_law.c
@@ -72,6 +72,69 @@ void print_laws(void)
 	return;
 }
 
+#if defined(CONFIG_FSL_DDR1) || \
+    defined(CONFIG_FSL_DDR2) || \
+    defined(CONFIG_FSL_DDR3)
+#include <../cpu/mpc8xxx/fsl_ddr_sdram.h>
+
+void
+__fsl_ddr_sdram_set_lawbar(const common_timing_params_t *memctl_common_params,
+			   unsigned int memctl_interleaved,
+			   unsigned int ctrl_num)
+{
+	unsigned long law_base_address;
+	unsigned long memsize_MB;
+	unsigned int law_size;
+
+	/*
+	 * If no DIMMs on this controller, do not proceed any further.
+	 */
+	if (!memctl_common_params->ndimms_present) {
+		return;
+	}
+
+	law_base_address = memctl_common_params->base_address;
+
+	/*
+	 * Compute LAWBARn[SIZE] value for 2**(SIZE + 1) bytes.
+	 * If interleaving is used, the memory size must represent
+	 * the combined total of both controllers.
+	 * The first supported LAW size is 16M, at LAWAR_SIZE_16M == 23.
+	 * Fnord.
+	 */
+	memsize_MB = memctl_common_params->total_mem / 0x100000;
+	law_size = 19 + __ilog2(memsize_MB << memctl_interleaved);
+
+	if (ctrl_num == 0) {
+		/*
+		 * Set up LAWBAR1 for DDR controller 1 space.
+		 */
+		unsigned int lawbar1_target_id = memctl_interleaved
+			? LAW_TRGT_IF_DDR_INTRLV : LAW_TRGT_IF_DDR_1;
+
+		set_law(1, law_base_address, law_size, lawbar1_target_id);
+		debug("ctl0 law_base_address = 0x%08X, law_size = 0x%x\n",
+		      law_base_address, law_size);
+
+	} else if (ctrl_num == 1) {
+		/*
+		 * Set up LAWBAR2 for DDR controller 2 space.
+		 */
+		set_law(2, law_base_address, law_size, LAW_TRGT_IF_DDR_2);
+		debug("ctl1 law_base_address = 0x%08X, law_size = 0x%x\n",
+		      law_base_address, law_size);
+
+	} else {
+		printf("unexpected controller number %u in fsl_ddr_sdram_set_lawbar()\n", ctrl_num);
+	}
+}
+
+__attribute__((weak, alias("__fsl_ddr_sdram_set_lawbar"))) void
+fsl_ddr_sdram_set_lawbar(const common_timing_params_t *memctl_common_params,
+			 unsigned int memctl_interleaved,
+			 unsigned int ctrl_num);
+#endif
+
 void init_laws(void)
 {
 	int i;
-- 
1.5.5.1





More information about the U-Boot mailing list