fsl_ddr_cfg_regs_t *ddr,
                               const common_timing_params_t *common_dimm,
                               const dimm_params_t *dimm_params,
-                              unsigned int dbw_cap_adj)
+                              unsigned int dbw_cap_adj,
+                              unsigned int size_only)
 {
        unsigned int i;
        unsigned int cas_latency;
                        printf("CS%d is disabled.\n", i);
        }
 
+       /*
+        * In the case we only need to compute the ddr sdram size, we only need
+        * to set csn registers, so return from here.
+        */
+       if (size_only)
+               return 0;
+
        set_ddr_eor(ddr, popts);
 
 #if !defined(CONFIG_FSL_DDR1)
 
 /*
- * Copyright 2008 Freescale Semiconductor, Inc.
+ * Copyright 2008-2011 Freescale Semiconductor, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #define STEP_ALL                     0xFFF
 
 extern unsigned long long
-fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step);
+fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
+                                      unsigned int size_only);
 
 extern const char * step_to_string(unsigned int step);
 
                               fsl_ddr_cfg_regs_t *ddr,
                               const common_timing_params_t *common_dimm,
                               const dimm_params_t *dimm_parameters,
-                              unsigned int dbw_capacity_adjust);
+                              unsigned int dbw_capacity_adjust,
+                              unsigned int size_only);
 extern unsigned int
 compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,
                                      common_timing_params_t *outpdimm,
 
 /*
- * Copyright 2008 Freescale Semiconductor, Inc.
+ * Copyright 2008-2011 Freescale Semiconductor, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 }
 
 unsigned long long
-fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step)
+fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
+                                      unsigned int size_only)
 {
        unsigned int i, j;
        unsigned int all_controllers_memctl_interleaving = 0;
                                        &pinfo->memctl_opts[i],
                                        &ddr_reg[i], &timing_params[i],
                                        pinfo->dimm_params[i],
-                                       dbw_capacity_adjust[i]);
+                                       dbw_capacity_adjust[i],
+                                       size_only);
                }
 
        default:
        memset(&info, 0, sizeof(fsl_ddr_info_t));
 
        /* Compute it once normally. */
-       total_memory = fsl_ddr_compute(&info, STEP_GET_SPD);
+       total_memory = fsl_ddr_compute(&info, STEP_GET_SPD, 0);
 
        /* Check for memory controller interleaving. */
        memctl_interleaved = 0;
                                info.memctl_opts[i].memctl_interleaving = 0;
                        debug("Recomputing with memctl_interleaving off.\n");
                        total_memory = fsl_ddr_compute(&info,
-                                                      STEP_ASSIGN_ADDRESSES);
+                                                      STEP_ASSIGN_ADDRESSES,
+                                                      0);
                }
        }
 
 
        return total_memory;
 }
+
+/*
+ * fsl_ddr_sdram_size() - This function only returns the size of the total
+ * memory without setting ddr control registers.
+ */
+phys_size_t
+fsl_ddr_sdram_size(void)
+{
+       fsl_ddr_info_t  info;
+       unsigned long long total_memory = 0;
+
+       memset(&info, 0 , sizeof(fsl_ddr_info_t));
+
+       /* Compute it once normally. */
+       total_memory = fsl_ddr_compute(&info, STEP_GET_SPD, 1);
+
+       return total_memory;
+}