powerpc/mpc8xxx: Set inactive csn_bnds to 0xffffffff
authorYork Sun <yorksun@freescale.com>
Tue, 25 Jun 2013 18:37:45 +0000 (11:37 -0700)
committerYork Sun <yorksun@freescale.com>
Fri, 9 Aug 2013 19:41:39 +0000 (12:41 -0700)
When chip select interleaving is enabled, cs0_bnds is used for address
binding. Other csn_bnds are not used. When two controllers interleaving is
enabled, cs0_bnds of both controllers are used, other csn_bnds are not.
However, the unused csn_bnds may be used internally for calculating
addresses for calibration. Setting those registers to 0 may confuse
controllers in some cases. Instead, setting them to 0xffffffff together
with normal LAWs will guarantee the address is not mapped to DDR.

Signed-off-by: York Sun <yorksun@freescale.com>
arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c
arch/powerpc/cpu/mpc8xxx/ddr/main.c

index 0f73e9c6c6ec8abd525126cb9f9e581d8d885b9b..b5e4070414a243bab25c8f6538b174112f1fea13 100644 (file)
@@ -1585,8 +1585,8 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
                                | ((ea & 0xFFF) << 0)   /* ending address MSB */
                                );
                } else {
-                       debug("FSLDDR: setting bnds to 0 for inactive CS\n");
-                       ddr->cs[i].bnds = 0;
+                       /* setting bnds to 0xffffffff for inactive CS */
+                       ddr->cs[i].bnds = 0xffffffff;
                }
 
                debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds);
index 7a8636de166ac4ca6e2c69eda2faa7fc2a65d6f2..c35405dcc9e4e7c96ebc4677256b54a107b20f1f 100644 (file)
@@ -504,7 +504,13 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
                                fsl_ddr_cfg_regs_t *reg = &ddr_reg[i];
                                if (reg->cs[j].config & 0x80000000) {
                                        unsigned int end;
-                                       end = reg->cs[j].bnds & 0xFFF;
+                                       /*
+                                        * 0xfffffff is a special value we put
+                                        * for unused bnds
+                                        */
+                                       if (reg->cs[j].bnds == 0xffffffff)
+                                               continue;
+                                       end = reg->cs[j].bnds & 0xffff;
                                        if (end > max_end) {
                                                max_end = end;
                                        }