]> git.sur5r.net Git - u-boot/blobdiff - drivers/ddr/fsl/main.c
Revert "drivers/ddr/fsl: Dual-license DDR driver"
[u-boot] / drivers / ddr / fsl / main.c
index b72b24290ec911acadfa9186062fbd08c72c7eac..d0a7b3f107630e67b2bb0d2f4248b10774e7efaf 100644 (file)
@@ -1,9 +1,7 @@
 /*
  * Copyright 2008-2014 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
- * Version 2 as published by the Free Software Foundation.
+ * SPDX-License-Identifier:    GPL-2.0
  */
 
 /*
@@ -17,6 +15,8 @@
 #include <fsl_ddr_sdram.h>
 #include <fsl_ddr.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /*
  * CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY is the physical address from the view
  * of DDR controllers. It is the same as CONFIG_SYS_DDR_SDRAM_BASE for
@@ -42,35 +42,35 @@ void fsl_ddr_set_intl3r(const unsigned int granule_size);
 #if defined(SPD_EEPROM_ADDRESS) || \
     defined(SPD_EEPROM_ADDRESS1) || defined(SPD_EEPROM_ADDRESS2) || \
     defined(SPD_EEPROM_ADDRESS3) || defined(SPD_EEPROM_ADDRESS4)
-#if (CONFIG_NUM_DDR_CONTROLLERS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
-u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
+#if (CONFIG_SYS_NUM_DDR_CTLRS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
+u8 spd_i2c_addr[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
        [0][0] = SPD_EEPROM_ADDRESS,
 };
-#elif (CONFIG_NUM_DDR_CONTROLLERS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
-u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
+#elif (CONFIG_SYS_NUM_DDR_CTLRS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
+u8 spd_i2c_addr[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
        [0][0] = SPD_EEPROM_ADDRESS1,   /* controller 1 */
        [0][1] = SPD_EEPROM_ADDRESS2,   /* controller 1 */
 };
-#elif (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
-u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
+#elif (CONFIG_SYS_NUM_DDR_CTLRS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
+u8 spd_i2c_addr[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
        [0][0] = SPD_EEPROM_ADDRESS1,   /* controller 1 */
        [1][0] = SPD_EEPROM_ADDRESS2,   /* controller 2 */
 };
-#elif (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
-u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
+#elif (CONFIG_SYS_NUM_DDR_CTLRS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
+u8 spd_i2c_addr[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
        [0][0] = SPD_EEPROM_ADDRESS1,   /* controller 1 */
        [0][1] = SPD_EEPROM_ADDRESS2,   /* controller 1 */
        [1][0] = SPD_EEPROM_ADDRESS3,   /* controller 2 */
        [1][1] = SPD_EEPROM_ADDRESS4,   /* controller 2 */
 };
-#elif (CONFIG_NUM_DDR_CONTROLLERS == 3) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
-u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
+#elif (CONFIG_SYS_NUM_DDR_CTLRS == 3) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
+u8 spd_i2c_addr[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
        [0][0] = SPD_EEPROM_ADDRESS1,   /* controller 1 */
        [1][0] = SPD_EEPROM_ADDRESS2,   /* controller 2 */
        [2][0] = SPD_EEPROM_ADDRESS3,   /* controller 3 */
 };
-#elif (CONFIG_NUM_DDR_CONTROLLERS == 3) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
-u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
+#elif (CONFIG_SYS_NUM_DDR_CTLRS == 3) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
+u8 spd_i2c_addr[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
        [0][0] = SPD_EEPROM_ADDRESS1,   /* controller 1 */
        [0][1] = SPD_EEPROM_ADDRESS2,   /* controller 1 */
        [1][0] = SPD_EEPROM_ADDRESS3,   /* controller 2 */
@@ -135,19 +135,27 @@ static void __get_spd(generic_spd_eeprom_t *spd, u8 i2c_address)
 __attribute__((weak, alias("__get_spd")))
 void get_spd(generic_spd_eeprom_t *spd, u8 i2c_address);
 
+/* This function allows boards to update SPD address */
+__weak void update_spd_address(unsigned int ctrl_num,
+                              unsigned int slot,
+                              unsigned int *addr)
+{
+}
+
 void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
                      unsigned int ctrl_num, unsigned int dimm_slots_per_ctrl)
 {
        unsigned int i;
        unsigned int i2c_address = 0;
 
-       if (ctrl_num >= CONFIG_NUM_DDR_CONTROLLERS) {
+       if (ctrl_num >= CONFIG_SYS_NUM_DDR_CTLRS) {
                printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num);
                return;
        }
 
        for (i = 0; i < dimm_slots_per_ctrl; i++) {
                i2c_address = spd_i2c_addr[ctrl_num][i];
+               update_spd_address(ctrl_num, i, &i2c_address);
                get_spd(&(ctrl_dimms_spd[i]), i2c_address);
        }
 }
@@ -424,7 +432,7 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
                assert_reset = pinfo->board_need_mem_reset();
 
        /* data bus width capacity adjust shift amount */
-       unsigned int dbw_capacity_adjust[CONFIG_NUM_DDR_CONTROLLERS];
+       unsigned int dbw_capacity_adjust[CONFIG_SYS_NUM_DDR_CTLRS];
 
        for (i = first_ctrl; i <= last_ctrl; i++)
                dbw_capacity_adjust[i] = 0;
@@ -453,7 +461,7 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
                                retval = compute_dimm_parameters(
                                                        i, spd, pdimm, j);
 #ifdef CONFIG_SYS_DDR_RAW_TIMING
-                               if (!i && !j && retval) {
+                               if (!j && retval) {
                                        printf("SPD error on controller %d! "
                                        "Trying fallback to raw timing "
                                        "calculation\n", i);
@@ -527,7 +535,7 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
                         * which is currently STEP_ASSIGN_ADDRESSES.
                         */
                        populate_memctl_options(
-                                       timing_params[i].all_dimms_registered,
+                                       &timing_params[i],
                                        &pinfo->memctl_opts[i],
                                        pinfo->dimm_params[i], i);
                        /*
@@ -714,7 +722,7 @@ phys_size_t __fsl_ddr_sdram(fsl_ddr_info_t *pinfo)
                                                &pinfo->common_timing_params[i],
                                                law_memctl, i);
                                }
-#if CONFIG_NUM_DDR_CONTROLLERS > 3
+#if CONFIG_SYS_NUM_DDR_CTLRS > 3
                                else if (i == 2) {
                                        law_memctl = LAW_TRGT_IF_DDR_INTLV_34;
                                        fsl_ddr_set_lawbar(
@@ -778,7 +786,7 @@ phys_size_t __fsl_ddr_sdram(fsl_ddr_info_t *pinfo)
                print_size(total_memory, " of memory\n");
                printf("       This U-Boot only supports < 4G of DDR\n");
                printf("       You could rebuild it with CONFIG_PHYS_64BIT\n");
-               printf("       "); /* re-align to match init_func_ram print */
+               printf("       "); /* re-align to match init_dram print */
                total_memory = CONFIG_MAX_MEM_MAPPED;
        }
 #endif
@@ -788,7 +796,7 @@ phys_size_t __fsl_ddr_sdram(fsl_ddr_info_t *pinfo)
 
 /*
  * fsl_ddr_sdram(void) -- this is the main function to be
- * called by initdram() in the board file.
+ * called by dram_init() in the board file.
  *
  * It returns amount of memory configured in bytes.
  */
@@ -805,6 +813,7 @@ phys_size_t fsl_ddr_sdram(void)
        info.board_need_mem_reset = board_need_mem_reset;
        info.board_mem_reset = board_assert_mem_reset;
        info.board_mem_de_reset = board_deassert_mem_reset;
+       remove_unused_controllers(&info);
 
        return __fsl_ddr_sdram(&info);
 }
@@ -850,6 +859,7 @@ fsl_ddr_sdram_size(void)
        info.num_ctrls = CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS;
        info.dimm_slots_per_ctrl = CONFIG_DIMM_SLOTS_PER_CTLR;
        info.board_need_mem_reset = NULL;
+       remove_unused_controllers(&info);
 
        /* Compute it once normally. */
        total_memory = fsl_ddr_compute(&info, STEP_GET_SPD, 1);