Skip to content
Snippets Groups Projects
options.c 27 KiB
Newer Older
  • Learn to ignore specific revisions
  • 				printf("Not enough bank(chip-select) for CS2+CS3 "
    
    					"on controller %d, interleaving disabled!\n", ctrl_num);
    
    			break;
    		case FSL_DDR_CS0_CS1_AND_CS2_CS3:
    
    #if (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
    
    			if (pdimm[0].n_ranks < 4) {
    
    				popts->ba_intlv_ctl = 0;
    				printf("Not enough bank(CS) for CS0+CS1 and "
    					"CS2+CS3 on controller %d, "
    
    					"interleaving disabled!\n", ctrl_num);
    
    			}
    #elif (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
    
    			if ((pdimm[0].n_ranks < 2) || (pdimm[1].n_ranks < 2)) {
    
    				popts->ba_intlv_ctl = 0;
    
    				printf("Not enough bank(CS) for CS0+CS1 and "
    					"CS2+CS3 on controller %d, "
    
    					"interleaving disabled!\n", ctrl_num);
    
    			break;
    		default:
    			popts->ba_intlv_ctl = 0;
    			break;
    		}
    	}
    
    	if (hwconfig_sub_f("fsl_ddr", "addr_hash", buf)) {
    		if (hwconfig_subarg_cmp_f("fsl_ddr", "addr_hash", "null", buf))
    
    			popts->addr_hash = 0;
    
    		else if (hwconfig_subarg_cmp_f("fsl_ddr", "addr_hash",
    					       "true", buf))
    
    	if (pdimm[0].n_ranks == 4)
    		popts->quad_rank_present = 1;
    
    
    	ddr_freq = get_ddr_freq(0) / 1000000;
    	if (popts->registered_dimm_en) {
    		popts->rcw_override = 1;
    		popts->rcw_1 = 0x000a5a00;
    		if (ddr_freq <= 800)
    			popts->rcw_2 = 0x00000000;
    		else if (ddr_freq <= 1066)
    			popts->rcw_2 = 0x00100000;
    		else if (ddr_freq <= 1333)
    			popts->rcw_2 = 0x00200000;
    		else
    			popts->rcw_2 = 0x00300000;
    	}
    
    
    	fsl_ddr_board_options(popts, pdimm, ctrl_num);
    
    
    void check_interleaving_options(fsl_ddr_info_t *pinfo)
    {
    
    	int i, j, k, check_n_ranks, intlv_invalid = 0;
    	unsigned int check_intlv, check_n_row_addr, check_n_col_addr;
    
    	unsigned long long check_rank_density;
    
    	struct dimm_params_s *dimm;
    
    	/*
    	 * Check if all controllers are configured for memory
    	 * controller interleaving. Identical dimms are recommended. At least
    
    	 * the size, row and col address should be checked.
    
    	 */
    	j = 0;
    	check_n_ranks = pinfo->dimm_params[0][0].n_ranks;
    	check_rank_density = pinfo->dimm_params[0][0].rank_density;
    
    	check_n_row_addr =  pinfo->dimm_params[0][0].n_row_addr;
    	check_n_col_addr = pinfo->dimm_params[0][0].n_col_addr;
    	check_intlv = pinfo->memctl_opts[0].memctl_interleaving_mode;
    
    	for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
    
    		dimm = &pinfo->dimm_params[i][0];
    		if (!pinfo->memctl_opts[i].memctl_interleaving) {
    			continue;
    		} else if (((check_rank_density != dimm->rank_density) ||
    		     (check_n_ranks != dimm->n_ranks) ||
    		     (check_n_row_addr != dimm->n_row_addr) ||
    		     (check_n_col_addr != dimm->n_col_addr) ||
    		     (check_intlv !=
    			pinfo->memctl_opts[i].memctl_interleaving_mode))){
    			intlv_invalid = 1;
    			break;
    		} else {
    
    		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++)
    
    			pinfo->memctl_opts[i].memctl_interleaving = 0;
    		printf("Not all DIMMs are identical. "
    			"Memory controller interleaving disabled.\n");
    	} else {
    		switch (check_intlv) {
    
    		case FSL_DDR_256B_INTERLEAVING:
    
    		case FSL_DDR_CACHE_LINE_INTERLEAVING:
    		case FSL_DDR_PAGE_INTERLEAVING:
    		case FSL_DDR_BANK_INTERLEAVING:
    		case FSL_DDR_SUPERBANK_INTERLEAVING:
    			if (3 == CONFIG_NUM_DDR_CONTROLLERS)
    				k = 2;
    			else
    				k = CONFIG_NUM_DDR_CONTROLLERS;
    			break;
    		case FSL_DDR_3WAY_1KB_INTERLEAVING:
    		case FSL_DDR_3WAY_4KB_INTERLEAVING:
    		case FSL_DDR_3WAY_8KB_INTERLEAVING:
    		case FSL_DDR_4WAY_1KB_INTERLEAVING:
    		case FSL_DDR_4WAY_4KB_INTERLEAVING:
    		case FSL_DDR_4WAY_8KB_INTERLEAVING:
    		default:
    			k = CONFIG_NUM_DDR_CONTROLLERS;
    			break;
    		}
    		debug("%d of %d controllers are interleaving.\n", j, k);
    
    			for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++)
    
    				pinfo->memctl_opts[i].memctl_interleaving = 0;
    
    			printf("Not all controllers have compatible "
    				"interleaving mode. All disabled.\n");
    		}
    
    	debug("Checking interleaving options completed\n");
    
    
    int fsl_use_spd(void)
    {
    	int use_spd = 0;
    
    #ifdef CONFIG_DDR_SPD
    
    	char buffer[HWCONFIG_BUFFER_SIZE];
    	char *buf = NULL;
    
    	/*
    	 * Extract hwconfig from environment since we have not properly setup
    	 * the environment but need it for ddr config params
    	 */
    	if (getenv_f("hwconfig", buffer, sizeof(buffer)) > 0)
    		buf = buffer;
    
    
    	/* if hwconfig is not enabled, or "sdram" is not defined, use spd */
    
    	if (hwconfig_sub_f("fsl_ddr", "sdram", buf)) {
    		if (hwconfig_subarg_cmp_f("fsl_ddr", "sdram", "spd", buf))
    
    		else if (hwconfig_subarg_cmp_f("fsl_ddr", "sdram",
    					       "fixed", buf))
    
    			use_spd = 0;
    		else
    			use_spd = 1;
    	} else
    		use_spd = 1;
    #endif
    
    	return use_spd;
    }