15614e71bSYork Sun /* 234e026f9SYork Sun * Copyright 2008-2014 Freescale Semiconductor, Inc. 35614e71bSYork Sun * 4*5b8031ccSTom Rini * SPDX-License-Identifier: GPL-2.0 55614e71bSYork Sun */ 65614e71bSYork Sun 75614e71bSYork Sun #ifndef DDR2_DIMM_PARAMS_H 85614e71bSYork Sun #define DDR2_DIMM_PARAMS_H 95614e71bSYork Sun 105614e71bSYork Sun #define EDC_DATA_PARITY 1 115614e71bSYork Sun #define EDC_ECC 2 125614e71bSYork Sun #define EDC_AC_PARITY 4 135614e71bSYork Sun 1434e026f9SYork Sun /* Parameters for a DDR dimm computed from the SPD */ 155614e71bSYork Sun typedef struct dimm_params_s { 165614e71bSYork Sun 175614e71bSYork Sun /* DIMM organization parameters */ 185614e71bSYork Sun char mpart[19]; /* guaranteed null terminated */ 195614e71bSYork Sun 205614e71bSYork Sun unsigned int n_ranks; 215614e71bSYork Sun unsigned long long rank_density; 225614e71bSYork Sun unsigned long long capacity; 235614e71bSYork Sun unsigned int data_width; 245614e71bSYork Sun unsigned int primary_sdram_width; 255614e71bSYork Sun unsigned int ec_sdram_width; 265614e71bSYork Sun unsigned int registered_dimm; 275614e71bSYork Sun unsigned int device_width; /* x4, x8, x16 components */ 285614e71bSYork Sun 295614e71bSYork Sun /* SDRAM device parameters */ 305614e71bSYork Sun unsigned int n_row_addr; 315614e71bSYork Sun unsigned int n_col_addr; 325614e71bSYork Sun unsigned int edc_config; /* 0 = none, 1 = parity, 2 = ECC */ 3334e026f9SYork Sun #ifdef CONFIG_SYS_FSL_DDR4 3434e026f9SYork Sun unsigned int bank_addr_bits; 3534e026f9SYork Sun unsigned int bank_group_bits; 3634e026f9SYork Sun #else 375614e71bSYork Sun unsigned int n_banks_per_sdram_device; 3834e026f9SYork Sun #endif 395614e71bSYork Sun unsigned int burst_lengths_bitmask; /* BL=4 bit 2, BL=8 = bit 3 */ 405614e71bSYork Sun unsigned int row_density; 415614e71bSYork Sun 425614e71bSYork Sun /* used in computing base address of DIMMs */ 435614e71bSYork Sun unsigned long long base_address; 445614e71bSYork Sun /* mirrored DIMMs */ 455614e71bSYork Sun unsigned int mirrored_dimm; /* only for ddr3 */ 465614e71bSYork Sun 475614e71bSYork Sun /* DIMM timing parameters */ 485614e71bSYork Sun 4934e026f9SYork Sun int mtb_ps; /* medium timebase ps */ 5034e026f9SYork Sun int ftb_10th_ps; /* fine timebase, in 1/10 ps */ 5134e026f9SYork Sun int taa_ps; /* minimum CAS latency time */ 5234e026f9SYork Sun int tfaw_ps; /* four active window delay */ 535614e71bSYork Sun 545614e71bSYork Sun /* 555614e71bSYork Sun * SDRAM clock periods 565614e71bSYork Sun * The range for these are 1000-10000 so a short should be sufficient 575614e71bSYork Sun */ 5834e026f9SYork Sun int tckmin_x_ps; 5934e026f9SYork Sun int tckmin_x_minus_1_ps; 6034e026f9SYork Sun int tckmin_x_minus_2_ps; 6134e026f9SYork Sun int tckmax_ps; 625614e71bSYork Sun 635614e71bSYork Sun /* SPD-defined CAS latencies */ 645614e71bSYork Sun unsigned int caslat_x; 655614e71bSYork Sun unsigned int caslat_x_minus_1; 665614e71bSYork Sun unsigned int caslat_x_minus_2; 675614e71bSYork Sun 685614e71bSYork Sun unsigned int caslat_lowest_derated; /* Derated CAS latency */ 695614e71bSYork Sun 705614e71bSYork Sun /* basic timing parameters */ 7134e026f9SYork Sun int trcd_ps; 7234e026f9SYork Sun int trp_ps; 7334e026f9SYork Sun int tras_ps; 745614e71bSYork Sun 7534e026f9SYork Sun #ifdef CONFIG_SYS_FSL_DDR4 7634e026f9SYork Sun int trfc1_ps; 7734e026f9SYork Sun int trfc2_ps; 7834e026f9SYork Sun int trfc4_ps; 7934e026f9SYork Sun int trrds_ps; 8034e026f9SYork Sun int trrdl_ps; 8134e026f9SYork Sun int tccdl_ps; 8234e026f9SYork Sun #else 8334e026f9SYork Sun int twr_ps; /* maximum = 63750 ps */ 8434e026f9SYork Sun int trfc_ps; /* max = 255 ns + 256 ns + .75 ns 855614e71bSYork Sun = 511750 ps */ 8634e026f9SYork Sun int trrd_ps; /* maximum = 63750 ps */ 8734e026f9SYork Sun int twtr_ps; /* maximum = 63750 ps */ 8834e026f9SYork Sun int trtp_ps; /* byte 38, spd->trtp */ 8934e026f9SYork Sun #endif 905614e71bSYork Sun 9134e026f9SYork Sun int trc_ps; /* maximum = 254 ns + .75 ns = 254750 ps */ 925614e71bSYork Sun 9334e026f9SYork Sun int refresh_rate_ps; 9434e026f9SYork Sun int extended_op_srt; 955614e71bSYork Sun 9634e026f9SYork Sun #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2) 9734e026f9SYork Sun int tis_ps; /* byte 32, spd->ca_setup */ 9834e026f9SYork Sun int tih_ps; /* byte 33, spd->ca_hold */ 9934e026f9SYork Sun int tds_ps; /* byte 34, spd->data_setup */ 10034e026f9SYork Sun int tdh_ps; /* byte 35, spd->data_hold */ 10134e026f9SYork Sun int tdqsq_max_ps; /* byte 44, spd->tdqsq */ 10234e026f9SYork Sun int tqhs_ps; /* byte 45, spd->tqhs */ 10334e026f9SYork Sun #endif 1045614e71bSYork Sun 1055614e71bSYork Sun /* DDR3 RDIMM */ 1065614e71bSYork Sun unsigned char rcw[16]; /* Register Control Word 0-15 */ 10734e026f9SYork Sun #ifdef CONFIG_SYS_FSL_DDR4 10834e026f9SYork Sun unsigned int dq_mapping[18]; 10934e026f9SYork Sun unsigned int dq_mapping_ors; 11034e026f9SYork Sun #endif 1115614e71bSYork Sun } dimm_params_t; 1125614e71bSYork Sun 11303e664d8SYork Sun unsigned int ddr_compute_dimm_parameters(const unsigned int ctrl_num, 1145614e71bSYork Sun const generic_spd_eeprom_t *spd, 1155614e71bSYork Sun dimm_params_t *pdimm, 1165614e71bSYork Sun unsigned int dimm_number); 1175614e71bSYork Sun 1185614e71bSYork Sun #endif 119