1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) Marvell International Ltd. and its affiliates 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _DDR3_TRAINING_IP_H_ 8*4882a593Smuzhiyun #define _DDR3_TRAINING_IP_H_ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include "ddr3_training_ip_def.h" 11*4882a593Smuzhiyun #include "ddr_topology_def.h" 12*4882a593Smuzhiyun #include "ddr_training_ip_db.h" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define DDR3_TIP_VERSION_STRING "DDR3 Training Sequence - Ver TIP-1.29." 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define MAX_CS_NUM 4 17*4882a593Smuzhiyun #define MAX_TOTAL_BUS_NUM (MAX_INTERFACE_NUM * MAX_BUS_NUM) 18*4882a593Smuzhiyun #define MAX_DQ_NUM 40 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define GET_MIN(arg1, arg2) ((arg1) < (arg2)) ? (arg1) : (arg2) 21*4882a593Smuzhiyun #define GET_MAX(arg1, arg2) ((arg1) < (arg2)) ? (arg2) : (arg1) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define INIT_CONTROLLER_MASK_BIT 0x00000001 24*4882a593Smuzhiyun #define STATIC_LEVELING_MASK_BIT 0x00000002 25*4882a593Smuzhiyun #define SET_LOW_FREQ_MASK_BIT 0x00000004 26*4882a593Smuzhiyun #define LOAD_PATTERN_MASK_BIT 0x00000008 27*4882a593Smuzhiyun #define SET_MEDIUM_FREQ_MASK_BIT 0x00000010 28*4882a593Smuzhiyun #define WRITE_LEVELING_MASK_BIT 0x00000020 29*4882a593Smuzhiyun #define LOAD_PATTERN_2_MASK_BIT 0x00000040 30*4882a593Smuzhiyun #define READ_LEVELING_MASK_BIT 0x00000080 31*4882a593Smuzhiyun #define SW_READ_LEVELING_MASK_BIT 0x00000100 32*4882a593Smuzhiyun #define WRITE_LEVELING_SUPP_MASK_BIT 0x00000200 33*4882a593Smuzhiyun #define PBS_RX_MASK_BIT 0x00000400 34*4882a593Smuzhiyun #define PBS_TX_MASK_BIT 0x00000800 35*4882a593Smuzhiyun #define SET_TARGET_FREQ_MASK_BIT 0x00001000 36*4882a593Smuzhiyun #define ADJUST_DQS_MASK_BIT 0x00002000 37*4882a593Smuzhiyun #define WRITE_LEVELING_TF_MASK_BIT 0x00004000 38*4882a593Smuzhiyun #define LOAD_PATTERN_HIGH_MASK_BIT 0x00008000 39*4882a593Smuzhiyun #define READ_LEVELING_TF_MASK_BIT 0x00010000 40*4882a593Smuzhiyun #define WRITE_LEVELING_SUPP_TF_MASK_BIT 0x00020000 41*4882a593Smuzhiyun #define DM_PBS_TX_MASK_BIT 0x00040000 42*4882a593Smuzhiyun #define CENTRALIZATION_RX_MASK_BIT 0x00100000 43*4882a593Smuzhiyun #define CENTRALIZATION_TX_MASK_BIT 0x00200000 44*4882a593Smuzhiyun #define TX_EMPHASIS_MASK_BIT 0x00400000 45*4882a593Smuzhiyun #define PER_BIT_READ_LEVELING_TF_MASK_BIT 0x00800000 46*4882a593Smuzhiyun #define VREF_CALIBRATION_MASK_BIT 0x01000000 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun enum hws_result { 49*4882a593Smuzhiyun TEST_FAILED = 0, 50*4882a593Smuzhiyun TEST_SUCCESS = 1, 51*4882a593Smuzhiyun NO_TEST_DONE = 2 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun enum hws_training_result { 55*4882a593Smuzhiyun RESULT_PER_BIT, 56*4882a593Smuzhiyun RESULT_PER_BYTE 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun enum auto_tune_stage { 60*4882a593Smuzhiyun INIT_CONTROLLER, 61*4882a593Smuzhiyun STATIC_LEVELING, 62*4882a593Smuzhiyun SET_LOW_FREQ, 63*4882a593Smuzhiyun LOAD_PATTERN, 64*4882a593Smuzhiyun SET_MEDIUM_FREQ, 65*4882a593Smuzhiyun WRITE_LEVELING, 66*4882a593Smuzhiyun LOAD_PATTERN_2, 67*4882a593Smuzhiyun READ_LEVELING, 68*4882a593Smuzhiyun WRITE_LEVELING_SUPP, 69*4882a593Smuzhiyun PBS_RX, 70*4882a593Smuzhiyun PBS_TX, 71*4882a593Smuzhiyun SET_TARGET_FREQ, 72*4882a593Smuzhiyun ADJUST_DQS, 73*4882a593Smuzhiyun WRITE_LEVELING_TF, 74*4882a593Smuzhiyun READ_LEVELING_TF, 75*4882a593Smuzhiyun WRITE_LEVELING_SUPP_TF, 76*4882a593Smuzhiyun DM_PBS_TX, 77*4882a593Smuzhiyun VREF_CALIBRATION, 78*4882a593Smuzhiyun CENTRALIZATION_RX, 79*4882a593Smuzhiyun CENTRALIZATION_TX, 80*4882a593Smuzhiyun TX_EMPHASIS, 81*4882a593Smuzhiyun LOAD_PATTERN_HIGH, 82*4882a593Smuzhiyun PER_BIT_READ_LEVELING_TF, 83*4882a593Smuzhiyun MAX_STAGE_LIMIT 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun enum hws_access_type { 87*4882a593Smuzhiyun ACCESS_TYPE_UNICAST = 0, 88*4882a593Smuzhiyun ACCESS_TYPE_MULTICAST = 1 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun enum hws_algo_type { 92*4882a593Smuzhiyun ALGO_TYPE_DYNAMIC, 93*4882a593Smuzhiyun ALGO_TYPE_STATIC 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct init_cntr_param { 97*4882a593Smuzhiyun int is_ctrl64_bit; 98*4882a593Smuzhiyun int do_mrs_phy; 99*4882a593Smuzhiyun int init_phy; 100*4882a593Smuzhiyun int msys_init; 101*4882a593Smuzhiyun }; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun struct pattern_info { 104*4882a593Smuzhiyun u8 num_of_phases_tx; 105*4882a593Smuzhiyun u8 tx_burst_size; 106*4882a593Smuzhiyun u8 delay_between_bursts; 107*4882a593Smuzhiyun u8 num_of_phases_rx; 108*4882a593Smuzhiyun u32 start_addr; 109*4882a593Smuzhiyun u8 pattern_len; 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* CL value for each frequency */ 113*4882a593Smuzhiyun struct cl_val_per_freq { 114*4882a593Smuzhiyun u8 cl_val[DDR_FREQ_LIMIT]; 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct cs_element { 118*4882a593Smuzhiyun u8 cs_num; 119*4882a593Smuzhiyun u8 num_of_cs; 120*4882a593Smuzhiyun }; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct mode_info { 123*4882a593Smuzhiyun /* 32 bits representing MRS bits */ 124*4882a593Smuzhiyun u32 reg_mr0[MAX_INTERFACE_NUM]; 125*4882a593Smuzhiyun u32 reg_mr1[MAX_INTERFACE_NUM]; 126*4882a593Smuzhiyun u32 reg_mr2[MAX_INTERFACE_NUM]; 127*4882a593Smuzhiyun u32 reg_m_r3[MAX_INTERFACE_NUM]; 128*4882a593Smuzhiyun /* 129*4882a593Smuzhiyun * Each element in array represent read_data_sample register delay for 130*4882a593Smuzhiyun * a specific interface. 131*4882a593Smuzhiyun * Each register, 4 bits[0+CS*8 to 4+CS*8] represent Number of DDR 132*4882a593Smuzhiyun * cycles from read command until data is ready to be fetched from 133*4882a593Smuzhiyun * the PHY, when accessing CS. 134*4882a593Smuzhiyun */ 135*4882a593Smuzhiyun u32 read_data_sample[MAX_INTERFACE_NUM]; 136*4882a593Smuzhiyun /* 137*4882a593Smuzhiyun * Each element in array represent read_data_sample register delay for 138*4882a593Smuzhiyun * a specific interface. 139*4882a593Smuzhiyun * Each register, 4 bits[0+CS*8 to 4+CS*8] represent the total delay 140*4882a593Smuzhiyun * from read command until opening the read mask, when accessing CS. 141*4882a593Smuzhiyun * This field defines the delay in DDR cycles granularity. 142*4882a593Smuzhiyun */ 143*4882a593Smuzhiyun u32 read_data_ready[MAX_INTERFACE_NUM]; 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun struct hws_tip_freq_config_info { 147*4882a593Smuzhiyun u8 is_supported; 148*4882a593Smuzhiyun u8 bw_per_freq; 149*4882a593Smuzhiyun u8 rate_per_freq; 150*4882a593Smuzhiyun }; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun struct hws_cs_config_info { 153*4882a593Smuzhiyun u32 cs_reg_value; 154*4882a593Smuzhiyun u32 cs_cbe_value; 155*4882a593Smuzhiyun }; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun struct dfx_access { 158*4882a593Smuzhiyun u8 pipe; 159*4882a593Smuzhiyun u8 client; 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct hws_xsb_info { 163*4882a593Smuzhiyun struct dfx_access *dfx_table; 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun int ddr3_tip_register_dq_table(u32 dev_num, u32 *table); 167*4882a593Smuzhiyun int hws_ddr3_tip_select_ddr_controller(u32 dev_num, int enable); 168*4882a593Smuzhiyun int hws_ddr3_tip_init_controller(u32 dev_num, 169*4882a593Smuzhiyun struct init_cntr_param *init_cntr_prm); 170*4882a593Smuzhiyun int hws_ddr3_tip_load_topology_map(u32 dev_num, 171*4882a593Smuzhiyun struct hws_topology_map *topology); 172*4882a593Smuzhiyun int hws_ddr3_tip_run_alg(u32 dev_num, enum hws_algo_type algo_type); 173*4882a593Smuzhiyun int hws_ddr3_tip_mode_read(u32 dev_num, struct mode_info *mode_info); 174*4882a593Smuzhiyun int ddr3_tip_is_pup_lock(u32 *pup_buf, enum hws_training_result read_mode); 175*4882a593Smuzhiyun u8 ddr3_tip_get_buf_min(u8 *buf_ptr); 176*4882a593Smuzhiyun u8 ddr3_tip_get_buf_max(u8 *buf_ptr); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #endif /* _DDR3_TRAINING_IP_H_ */ 179