15614e71bSYork Sun /* 234e026f9SYork Sun * Copyright 2008-2014 Freescale Semiconductor, Inc. 35614e71bSYork Sun * 45614e71bSYork Sun * This program is free software; you can redistribute it and/or 55614e71bSYork Sun * modify it under the terms of the GNU General Public License 65614e71bSYork Sun * Version 2 as published by the Free Software Foundation. 75614e71bSYork Sun */ 85614e71bSYork Sun 95614e71bSYork Sun #ifndef DDR2_DIMM_PARAMS_H 105614e71bSYork Sun #define DDR2_DIMM_PARAMS_H 115614e71bSYork Sun 125614e71bSYork Sun #define EDC_DATA_PARITY 1 135614e71bSYork Sun #define EDC_ECC 2 145614e71bSYork Sun #define EDC_AC_PARITY 4 155614e71bSYork Sun 1634e026f9SYork Sun /* Parameters for a DDR dimm computed from the SPD */ 175614e71bSYork Sun typedef struct dimm_params_s { 185614e71bSYork Sun 195614e71bSYork Sun /* DIMM organization parameters */ 205614e71bSYork Sun char mpart[19]; /* guaranteed null terminated */ 215614e71bSYork Sun 225614e71bSYork Sun unsigned int n_ranks; 235614e71bSYork Sun unsigned long long rank_density; 245614e71bSYork Sun unsigned long long capacity; 255614e71bSYork Sun unsigned int data_width; 265614e71bSYork Sun unsigned int primary_sdram_width; 275614e71bSYork Sun unsigned int ec_sdram_width; 285614e71bSYork Sun unsigned int registered_dimm; 295614e71bSYork Sun unsigned int device_width; /* x4, x8, x16 components */ 305614e71bSYork Sun 315614e71bSYork Sun /* SDRAM device parameters */ 325614e71bSYork Sun unsigned int n_row_addr; 335614e71bSYork Sun unsigned int n_col_addr; 345614e71bSYork Sun unsigned int edc_config; /* 0 = none, 1 = parity, 2 = ECC */ 3534e026f9SYork Sun #ifdef CONFIG_SYS_FSL_DDR4 3634e026f9SYork Sun unsigned int bank_addr_bits; 3734e026f9SYork Sun unsigned int bank_group_bits; 3834e026f9SYork Sun #else 395614e71bSYork Sun unsigned int n_banks_per_sdram_device; 4034e026f9SYork Sun #endif 415614e71bSYork Sun unsigned int burst_lengths_bitmask; /* BL=4 bit 2, BL=8 = bit 3 */ 425614e71bSYork Sun unsigned int row_density; 435614e71bSYork Sun 445614e71bSYork Sun /* used in computing base address of DIMMs */ 455614e71bSYork Sun unsigned long long base_address; 465614e71bSYork Sun /* mirrored DIMMs */ 475614e71bSYork Sun unsigned int mirrored_dimm; /* only for ddr3 */ 485614e71bSYork Sun 495614e71bSYork Sun /* DIMM timing parameters */ 505614e71bSYork Sun 5134e026f9SYork Sun int mtb_ps; /* medium timebase ps */ 5234e026f9SYork Sun int ftb_10th_ps; /* fine timebase, in 1/10 ps */ 5334e026f9SYork Sun int taa_ps; /* minimum CAS latency time */ 5434e026f9SYork Sun int tfaw_ps; /* four active window delay */ 555614e71bSYork Sun 565614e71bSYork Sun /* 575614e71bSYork Sun * SDRAM clock periods 585614e71bSYork Sun * The range for these are 1000-10000 so a short should be sufficient 595614e71bSYork Sun */ 6034e026f9SYork Sun int tckmin_x_ps; 6134e026f9SYork Sun int tckmin_x_minus_1_ps; 6234e026f9SYork Sun int tckmin_x_minus_2_ps; 6334e026f9SYork Sun int tckmax_ps; 645614e71bSYork Sun 655614e71bSYork Sun /* SPD-defined CAS latencies */ 665614e71bSYork Sun unsigned int caslat_x; 675614e71bSYork Sun unsigned int caslat_x_minus_1; 685614e71bSYork Sun unsigned int caslat_x_minus_2; 695614e71bSYork Sun 705614e71bSYork Sun unsigned int caslat_lowest_derated; /* Derated CAS latency */ 715614e71bSYork Sun 725614e71bSYork Sun /* basic timing parameters */ 7334e026f9SYork Sun int trcd_ps; 7434e026f9SYork Sun int trp_ps; 7534e026f9SYork Sun int tras_ps; 765614e71bSYork Sun 7734e026f9SYork Sun #ifdef CONFIG_SYS_FSL_DDR4 7834e026f9SYork Sun int trfc1_ps; 7934e026f9SYork Sun int trfc2_ps; 8034e026f9SYork Sun int trfc4_ps; 8134e026f9SYork Sun int trrds_ps; 8234e026f9SYork Sun int trrdl_ps; 8334e026f9SYork Sun int tccdl_ps; 8434e026f9SYork Sun #else 8534e026f9SYork Sun int twr_ps; /* maximum = 63750 ps */ 8634e026f9SYork Sun int trfc_ps; /* max = 255 ns + 256 ns + .75 ns 875614e71bSYork Sun = 511750 ps */ 8834e026f9SYork Sun int trrd_ps; /* maximum = 63750 ps */ 8934e026f9SYork Sun int twtr_ps; /* maximum = 63750 ps */ 9034e026f9SYork Sun int trtp_ps; /* byte 38, spd->trtp */ 9134e026f9SYork Sun #endif 925614e71bSYork Sun 9334e026f9SYork Sun int trc_ps; /* maximum = 254 ns + .75 ns = 254750 ps */ 945614e71bSYork Sun 9534e026f9SYork Sun int refresh_rate_ps; 9634e026f9SYork Sun int extended_op_srt; 975614e71bSYork Sun 9834e026f9SYork Sun #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2) 9934e026f9SYork Sun int tis_ps; /* byte 32, spd->ca_setup */ 10034e026f9SYork Sun int tih_ps; /* byte 33, spd->ca_hold */ 10134e026f9SYork Sun int tds_ps; /* byte 34, spd->data_setup */ 10234e026f9SYork Sun int tdh_ps; /* byte 35, spd->data_hold */ 10334e026f9SYork Sun int tdqsq_max_ps; /* byte 44, spd->tdqsq */ 10434e026f9SYork Sun int tqhs_ps; /* byte 45, spd->tqhs */ 10534e026f9SYork Sun #endif 1065614e71bSYork Sun 1075614e71bSYork Sun /* DDR3 RDIMM */ 1085614e71bSYork Sun unsigned char rcw[16]; /* Register Control Word 0-15 */ 10934e026f9SYork Sun #ifdef CONFIG_SYS_FSL_DDR4 11034e026f9SYork Sun unsigned int dq_mapping[18]; 11134e026f9SYork Sun unsigned int dq_mapping_ors; 11234e026f9SYork Sun #endif 1135614e71bSYork Sun } dimm_params_t; 1145614e71bSYork Sun 115*03e664d8SYork Sun unsigned int ddr_compute_dimm_parameters(const unsigned int ctrl_num, 1165614e71bSYork Sun const generic_spd_eeprom_t *spd, 1175614e71bSYork Sun dimm_params_t *pdimm, 1185614e71bSYork Sun unsigned int dimm_number); 1195614e71bSYork Sun 1205614e71bSYork Sun #endif 121