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