183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */ 2f1df9364SStefan Roese /* 3f1df9364SStefan Roese * Copyright (C) Marvell International Ltd. and its affiliates 4f1df9364SStefan Roese */ 5f1df9364SStefan Roese 6f1df9364SStefan Roese #ifndef _DDR3_TRAINING_IP_ENGINE_H_ 7f1df9364SStefan Roese #define _DDR3_TRAINING_IP_ENGINE_H_ 8f1df9364SStefan Roese 9f1df9364SStefan Roese #include "ddr3_training_ip_def.h" 10f1df9364SStefan Roese #include "ddr3_training_ip_flow.h" 11*ebb1a593SChris Packham #include "ddr3_training_ip_pbs.h" 12f1df9364SStefan Roese 13f1df9364SStefan Roese #define EDGE_1 0 14f1df9364SStefan Roese #define EDGE_2 1 15f1df9364SStefan Roese #define ALL_PUP_TRAINING 0xe 16f1df9364SStefan Roese #define PUP_RESULT_EDGE_1_MASK 0xff 17f1df9364SStefan Roese #define PUP_RESULT_EDGE_2_MASK (0xff << 8) 18f1df9364SStefan Roese #define PUP_LOCK_RESULT_BIT 25 19f1df9364SStefan Roese 20f1df9364SStefan Roese #define GET_TAP_RESULT(reg, edge) \ 21f1df9364SStefan Roese (((edge) == EDGE_1) ? ((reg) & PUP_RESULT_EDGE_1_MASK) : \ 22f1df9364SStefan Roese (((reg) & PUP_RESULT_EDGE_2_MASK) >> 8)); 23f1df9364SStefan Roese #define GET_LOCK_RESULT(reg) \ 24f1df9364SStefan Roese (((reg) & (1<<PUP_LOCK_RESULT_BIT)) >> PUP_LOCK_RESULT_BIT) 25f1df9364SStefan Roese 26f1df9364SStefan Roese #define EDGE_FAILURE 128 27f1df9364SStefan Roese #define ALL_BITS_PER_PUP 128 28f1df9364SStefan Roese 29f1df9364SStefan Roese #define MIN_WINDOW_SIZE 6 30f1df9364SStefan Roese #define MAX_WINDOW_SIZE_RX 32 31f1df9364SStefan Roese #define MAX_WINDOW_SIZE_TX 64 32f1df9364SStefan Roese 33f1df9364SStefan Roese int ddr3_tip_training_ip_test(u32 dev_num, enum hws_training_result result_type, 34f1df9364SStefan Roese enum hws_search_dir search_dir, 35f1df9364SStefan Roese enum hws_dir direction, 36f1df9364SStefan Roese enum hws_edge_compare edge, 37f1df9364SStefan Roese u32 init_val1, u32 init_val2, 38f1df9364SStefan Roese u32 num_of_iterations, u32 start_pattern, 39f1df9364SStefan Roese u32 end_pattern); 40f1df9364SStefan Roese int ddr3_tip_load_pattern_to_mem(u32 dev_num, enum hws_pattern pattern); 41f1df9364SStefan Roese int ddr3_tip_load_all_pattern_to_mem(u32 dev_num); 42f1df9364SStefan Roese int ddr3_tip_read_training_result(u32 dev_num, u32 if_id, 43f1df9364SStefan Roese enum hws_access_type pup_access_type, 44f1df9364SStefan Roese u32 pup_num, u32 bit_num, 45f1df9364SStefan Roese enum hws_search_dir search, 46f1df9364SStefan Roese enum hws_dir direction, 47f1df9364SStefan Roese enum hws_training_result result_type, 48f1df9364SStefan Roese enum hws_training_load_op operation, 49f1df9364SStefan Roese u32 cs_num_type, u32 **load_res, 50f1df9364SStefan Roese int is_read_from_db, u8 cons_tap, 51f1df9364SStefan Roese int is_check_result_validity); 52f1df9364SStefan Roese int ddr3_tip_ip_training(u32 dev_num, enum hws_access_type access_type, 53f1df9364SStefan Roese u32 interface_num, 54f1df9364SStefan Roese enum hws_access_type pup_access_type, 55f1df9364SStefan Roese u32 pup_num, enum hws_training_result result_type, 56f1df9364SStefan Roese enum hws_control_element control_element, 57f1df9364SStefan Roese enum hws_search_dir search_dir, enum hws_dir direction, 58f1df9364SStefan Roese u32 interface_mask, u32 init_value, u32 num_iter, 59f1df9364SStefan Roese enum hws_pattern pattern, 60f1df9364SStefan Roese enum hws_edge_compare edge_comp, 61f1df9364SStefan Roese enum hws_ddr_cs cs_type, u32 cs_num, 62f1df9364SStefan Roese enum hws_training_ip_stat *train_status); 63f1df9364SStefan Roese int ddr3_tip_ip_training_wrapper(u32 dev_num, enum hws_access_type access_type, 64f1df9364SStefan Roese u32 if_id, 65f1df9364SStefan Roese enum hws_access_type pup_access_type, 66f1df9364SStefan Roese u32 pup_num, 67f1df9364SStefan Roese enum hws_training_result result_type, 68f1df9364SStefan Roese enum hws_control_element control_element, 69f1df9364SStefan Roese enum hws_search_dir search_dir, 70f1df9364SStefan Roese enum hws_dir direction, 71f1df9364SStefan Roese u32 interface_mask, u32 init_value1, 72f1df9364SStefan Roese u32 init_value2, u32 num_iter, 73f1df9364SStefan Roese enum hws_pattern pattern, 74f1df9364SStefan Roese enum hws_edge_compare edge_comp, 75f1df9364SStefan Roese enum hws_ddr_cs train_cs_type, u32 cs_num, 76f1df9364SStefan Roese enum hws_training_ip_stat *train_status); 772b4ffbf6SChris Packham u8 mv_ddr_tip_sub_phy_byte_status_get(u32 if_id, u32 subphy_id); 782b4ffbf6SChris Packham void mv_ddr_tip_sub_phy_byte_status_set(u32 if_id, u32 subphy_id, u8 byte_status_data); 79f1df9364SStefan Roese void ddr3_tip_print_bist_res(void); 80f1df9364SStefan Roese struct pattern_info *ddr3_tip_get_pattern_table(void); 81f1df9364SStefan Roese u16 *ddr3_tip_get_mask_results_dq_reg(void); 82f1df9364SStefan Roese u16 *ddr3_tip_get_mask_results_pup_reg_map(void); 832b4ffbf6SChris Packham int mv_ddr_load_dm_pattern_to_odpg(enum hws_access_type access_type, enum hws_pattern pattern, 842b4ffbf6SChris Packham enum dm_direction dm_dir); 852b4ffbf6SChris Packham int mv_ddr_pattern_start_addr_set(struct pattern_info *pattern_tbl, enum hws_pattern pattern, u32 addr); 86f1df9364SStefan Roese #endif /* _DDR3_TRAINING_IP_ENGINE_H_ */ 87