Configure the storage address for the dtb queue to save tables contents. Signed-off-by: Bingbin Chen --- drivers/net/zxdh/zxdh_np.c | 1146 ++++++++++++++++++++++++++++++++++++ drivers/net/zxdh/zxdh_np.h | 91 +++ 2 files changed, 1237 insertions(+) diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c index 1f16f75a23..845d06a056 100644 --- a/drivers/net/zxdh/zxdh_np.c +++ b/drivers/net/zxdh/zxdh_np.c @@ -28,6 +28,7 @@ static uint64_t g_np_fw_compat_addr[ZXDH_DEV_CHANNEL_MAX]; static ZXDH_VERSION_COMPATIBLE_REG_T g_np_sdk_version = { ZXDH_NPSDK_COMPAT_ITEM_ID, 1, 0, 0, 0, {0} }; uint32_t hardware_ep_id[5] = {5, 6, 7, 8, 9}; +ZXDH_RB_CFG *g_dtb_dump_addr_rb[ZXDH_DEV_CHANNEL_MAX][ZXDH_DTB_QUEUE_NUM_MAX]; ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = { {"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, @@ -347,6 +348,58 @@ zxdh_np_comm_convert32(uint32_t dw_data) #define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID) \ (p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].init_flag) +#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr) + +#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL) \ + (p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = \ + VAL) + +#define ZXDH_INIT_D_NODE(ptr, pdata) \ + do {\ + ZXDH_D_NODE *temp_ptr = ptr;\ + (temp_ptr)->data = pdata;\ + (temp_ptr)->prev = NULL;\ + (temp_ptr)->next = NULL;\ + } while (0) + +#define ZXDH_INIT_RBT_TN(p_tn, p_newkey) \ + do {\ + ZXDH_RB_TN *p_temp_tn = p_tn;\ + (p_temp_tn)->p_key = p_newkey; \ + (p_temp_tn)->color_lsv = 0; \ + (p_temp_tn)->p_left = NULL; \ + (p_temp_tn)->p_right = NULL; \ + (p_temp_tn)->p_parent = NULL; \ + ZXDH_INIT_D_NODE(&((p_temp_tn)->tn_ln), (p_temp_tn));\ + } while (0) + +#define ZXDH_GET_TN_LSV(p_tn) \ + ((p_tn)->color_lsv >> 2) + +#define ZXDH_SET_TN_LSV(p_tn, list_val) \ + do {\ + ZXDH_RB_TN *p_temp_tn = p_tn;\ + (p_temp_tn)->color_lsv &= 0x3;\ + (p_temp_tn)->color_lsv |= ((list_val) << 2); \ + } while (0) + +#define ZXDH_SET_TN_COLOR(p_tn, color) \ + do {\ + ZXDH_RB_TN *p_temp_tn = p_tn;\ + (p_temp_tn)->color_lsv &= 0xfffffffc;\ + (p_temp_tn)->color_lsv |= ((color) & 0x3);\ + } while (0) + +static inline uint32_t +zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn) +{ + return ((p_tn == NULL) ? ZXDH_RBT_BLACK : (p_tn)->color_lsv & 0x3); +} + +#define ZXDH_GET_TN_COLOR(p_tn) \ + zxdh_np_get_tn_color(p_tn) + static uint32_t zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex) { @@ -449,6 +502,947 @@ zxdh_np_comm_swap(uint8_t *p_uc_data, uint32_t dw_byte_len) } } +static uint32_t +zxdh_comm_double_link_init(uint32_t elmemtnum, ZXDH_D_HEAD *p_head) +{ + uint32_t err_code = 0; + + if (elmemtnum == 0) { + err_code = ZXDH_DOUBLE_LINK_INIT_ELEMENT_NUM_ERR; + PMD_DRV_LOG(ERR, "Error:[0x%x] doule_link_init Element Num Err !", + err_code); + return err_code; + } + + p_head->maxnum = elmemtnum; + p_head->used = 0; + p_head->p_next = NULL; + p_head->p_prev = NULL; + + return ZXDH_OK; +} + +static uint32_t +zxdh_np_comm_liststack_creat(uint32_t element_num, ZXDH_LISTSTACK_MANAGER **p_list) +{ + ZXDH_LISTSTACK_MANAGER *p_local_list = NULL; + uint32_t dw_list_size = 0; + uint32_t dw_manage_size = 0; + uint32_t dw_actual_element_num = 0; + uint32_t i = 0; + + if (p_list == NULL) { + PMD_DRV_LOG(INFO, " p_list is NULL!"); + return ZXDH_LIST_STACK_POINT_NULL; + } + if (element_num <= 0) { + *p_list = NULL; + PMD_DRV_LOG(INFO, " FtmComm_ListStackCreat_dwElementNum <=0"); + return ZXDH_LIST_STACK_ELEMENT_NUM_ERR; + } + + if (element_num > ZXDH_LISTSTACK_MAX_ELEMENT - 1) + dw_actual_element_num = ZXDH_LISTSTACK_MAX_ELEMENT; + else + dw_actual_element_num = element_num + 1; + + dw_list_size = (dw_actual_element_num * sizeof(ZXDH_COMM_FREELINK)) & 0xffffffff; + dw_manage_size = ((sizeof(ZXDH_LISTSTACK_MANAGER) & 0xFFFFFFFFU) + dw_list_size) & + 0xffffffff; + + p_local_list = (ZXDH_LISTSTACK_MANAGER *)rte_zmalloc(NULL, dw_manage_size, 0); + if (p_local_list == NULL) { + *p_list = NULL; + PMD_DRV_LOG(ERR, " %s Fail", __func__); + return ZXDH_LIST_STACK_ALLOC_MEMORY_FAIL; + } + + p_local_list->p_array = (ZXDH_COMM_FREELINK *)((uint8_t *)p_local_list + + sizeof(ZXDH_LISTSTACK_MANAGER)); + + p_local_list->capacity = dw_actual_element_num; + p_local_list->free_num = dw_actual_element_num - 1; + p_local_list->used_num = 0; + + for (i = 1; i < (dw_actual_element_num - 1); i++) { + p_local_list->p_array[i].index = i; + p_local_list->p_array[i].next = i + 1; + } + + p_local_list->p_array[0].index = 0; + p_local_list->p_array[0].next = 0; + + p_local_list->p_array[dw_actual_element_num - 1].index = dw_actual_element_num - 1; + p_local_list->p_array[dw_actual_element_num - 1].next = 0xffffffff; + + p_local_list->p_head = p_local_list->p_array[1].index; + + *p_list = p_local_list; + + return ZXDH_OK; +} + +static uint32_t +zxdh_np_comm_liststack_alloc(ZXDH_LISTSTACK_MANAGER *p_list, uint32_t *p_index) +{ + uint32_t dw_alloc_index = 0; + uint32_t dw_next_free = 0; + + if (p_list == NULL) { + *p_index = ZXDH_LISTSTACK_INVALID_INDEX; + PMD_DRV_LOG(INFO, " %s! ERROR LINE:%d ", __func__, __LINE__); + return ZXDH_LIST_STACK_POINT_NULL; + } + + if (p_list->p_head == ZXDH_LISTSTACK_INVALID_INDEX) { + *p_index = ZXDH_LISTSTACK_INVALID_INDEX; + return ZXDH_LIST_STACK_ISEMPTY_ERR; + } + + dw_alloc_index = p_list->p_head; + + dw_next_free = p_list->p_array[dw_alloc_index].next; + p_list->p_array[dw_alloc_index].next = ZXDH_LISTSTACK_INVALID_INDEX; + + if (dw_next_free != 0xffffffff) + p_list->p_head = p_list->p_array[dw_next_free].index; + else + p_list->p_head = ZXDH_LISTSTACK_INVALID_INDEX; + + *p_index = dw_alloc_index - 1; + + p_list->free_num--; + p_list->used_num++; + + if (p_list->free_num == 0 || (p_list->used_num == (p_list->capacity - 1))) + p_list->p_head = ZXDH_LISTSTACK_INVALID_INDEX; + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_liststack_free(ZXDH_LISTSTACK_MANAGER *p_list, uint32_t index) +{ + uint32_t dw_free_index = 0; + uint32_t dw_prev_free = 0; + uint32_t dw_index = 0; + + dw_index = index + 1; + + if (p_list == NULL) { + PMD_DRV_LOG(INFO, " %s is null! LINE:%d ", __func__, __LINE__); + return ZXDH_LIST_STACK_POINT_NULL; + } + + if (dw_index >= p_list->capacity) { + PMD_DRV_LOG(INFO, " %s is null! LINE:%d ", __func__, __LINE__); + return ZXDH_LIST_STACK_FREE_INDEX_INVALID; + } + + if (p_list->p_array[dw_index].next != ZXDH_LISTSTACK_INVALID_INDEX) + return ZXDH_OK; + + dw_free_index = dw_index; + dw_prev_free = p_list->p_head; + + if (dw_prev_free != 0) + p_list->p_array[dw_free_index].next = p_list->p_array[dw_prev_free].index; + else + p_list->p_array[dw_free_index].next = 0xffffffff; + + p_list->p_head = p_list->p_array[dw_free_index].index; + + p_list->free_num++; + p_list->used_num--; + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_double_link_insert_1st(ZXDH_D_NODE *p_newnode, ZXDH_D_HEAD *p_head) +{ + RTE_ASSERT(!(!p_head->p_next && p_head->p_prev)); + RTE_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + p_newnode->next = p_head->p_next; + p_newnode->prev = NULL; + + if (p_head->p_next) + p_head->p_next->prev = p_newnode; + else + p_head->p_prev = p_newnode; + + p_head->p_next = p_newnode; + p_head->used++; + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_double_link_insert_aft(ZXDH_D_NODE *p_newnode, + ZXDH_D_NODE *p_oldnode, + ZXDH_D_HEAD *p_head) +{ + RTE_ASSERT(!(!p_head->p_next && p_head->p_prev)); + RTE_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + p_newnode->next = p_oldnode->next; + p_newnode->prev = p_oldnode; + + if (p_oldnode->next) + p_oldnode->next->prev = p_newnode; + else + p_head->p_prev = p_newnode; + + p_oldnode->next = p_newnode; + p_head->used++; + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_double_link_insert_pre(ZXDH_D_NODE *p_newnode, + ZXDH_D_NODE *p_oldnode, ZXDH_D_HEAD *p_head) +{ + RTE_ASSERT(!(!p_head->p_next && p_head->p_prev)); + RTE_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + p_newnode->next = p_oldnode; + p_newnode->prev = p_oldnode->prev; + + if (p_oldnode->prev) + p_oldnode->prev->next = p_newnode; + else + p_head->p_next = p_newnode; + + p_oldnode->prev = p_newnode; + p_head->used++; + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head) +{ + ZXDH_D_NODE *next = NULL; + ZXDH_D_NODE *pre = NULL; + + next = delnode->next; + pre = delnode->prev; + + if (next) + next->prev = delnode->prev; + else + p_head->p_prev = delnode->prev; + + if (pre) + pre->next = delnode->next; + else + p_head->p_next = delnode->next; + + p_head->used--; + delnode->next = NULL; + delnode->prev = NULL; + return ZXDH_OK; +} + +static int32_t +zxdh_comm_rb_def_cmp(void *p_new, void *p_old, uint32_t key_size) +{ + return memcmp(p_new, p_old, key_size); +} + +static void +zxdh_comm_rb_swich_color(ZXDH_RB_TN *p_tn1, ZXDH_RB_TN *p_tn2) +{ + uint32_t color1, color2; + + color1 = ZXDH_GET_TN_COLOR(p_tn1); + color2 = ZXDH_GET_TN_COLOR(p_tn2); + + ZXDH_SET_TN_COLOR(p_tn1, color2); + ZXDH_SET_TN_COLOR(p_tn2, color1); +} + +static ZXDH_RB_TN * +zxdh_comm_rb_get_brotn(ZXDH_RB_TN *p_cur_tn) +{ + return (p_cur_tn->p_parent->p_left == p_cur_tn) ? p_cur_tn->p_parent->p_right : + p_cur_tn->p_parent->p_left; +} + +static uint32_t +zxdh_comm_rb_handle_ins(__rte_unused ZXDH_RB_CFG *p_rb_cfg, + ZXDH_RB_TN ***stack_tn, + uint32_t stack_top) +{ + ZXDH_RB_TN **pp_cur_tn = NULL; + ZXDH_RB_TN *p_cur_tn = NULL; + ZXDH_RB_TN **pp_tmp_tn = NULL; + ZXDH_RB_TN *p_tmp_tn = NULL; + + while (stack_top > 0) { + pp_cur_tn = stack_tn[stack_top]; + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn->p_parent) { + ZXDH_SET_TN_COLOR(p_cur_tn, ZXDH_RBT_BLACK); + break; + } else if (ZXDH_GET_TN_COLOR(p_cur_tn->p_parent) == ZXDH_RBT_RED) { + ZXDH_RB_TN *p_unc_tn = zxdh_comm_rb_get_brotn(p_cur_tn->p_parent); + + RTE_ASSERT(p_cur_tn->p_parent == *stack_tn[stack_top - 1]); + + if (ZXDH_GET_TN_COLOR(p_unc_tn) == ZXDH_RBT_RED) { + RTE_ASSERT(p_unc_tn); + ZXDH_SET_TN_COLOR(p_cur_tn->p_parent, ZXDH_RBT_BLACK); + ZXDH_SET_TN_COLOR(p_unc_tn, ZXDH_RBT_BLACK); + + RTE_ASSERT(p_cur_tn->p_parent->p_parent == + *stack_tn[stack_top - 2]); + + ZXDH_SET_TN_COLOR(p_cur_tn->p_parent->p_parent, ZXDH_RBT_RED); + stack_top -= 2; + } else { + ZXDH_RB_TN *p_bro_tn = NULL; + + pp_tmp_tn = stack_tn[stack_top - 2]; + p_tmp_tn = *pp_tmp_tn; + + if (p_cur_tn->p_parent == p_tmp_tn->p_left && p_cur_tn == + p_cur_tn->p_parent->p_left) { + *pp_tmp_tn = p_cur_tn->p_parent; + + p_bro_tn = zxdh_comm_rb_get_brotn(p_cur_tn); + p_cur_tn->p_parent->p_parent = p_tmp_tn->p_parent; + + p_tmp_tn->p_left = p_bro_tn; + p_tmp_tn->p_parent = p_cur_tn->p_parent; + p_cur_tn->p_parent->p_right = p_tmp_tn; + + if (p_bro_tn) + p_bro_tn->p_parent = p_tmp_tn; + + zxdh_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } else if (p_cur_tn->p_parent == p_tmp_tn->p_left && p_cur_tn == + p_cur_tn->p_parent->p_right) { + *pp_tmp_tn = p_cur_tn; + + p_cur_tn->p_parent->p_right = p_cur_tn->p_left; + + if (p_cur_tn->p_left) + p_cur_tn->p_left->p_parent = p_cur_tn->p_parent; + + p_cur_tn->p_parent->p_parent = p_cur_tn; + p_tmp_tn->p_left = p_cur_tn->p_right; + + if (p_cur_tn->p_right) + p_cur_tn->p_right->p_parent = p_tmp_tn; + + p_cur_tn->p_left = p_cur_tn->p_parent; + p_cur_tn->p_right = p_tmp_tn; + + p_cur_tn->p_parent = p_tmp_tn->p_parent; + p_tmp_tn->p_parent = p_cur_tn; + + zxdh_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } else if (p_cur_tn->p_parent == p_tmp_tn->p_right && p_cur_tn == + p_cur_tn->p_parent->p_right) { + *pp_tmp_tn = p_cur_tn->p_parent; + p_bro_tn = zxdh_comm_rb_get_brotn(p_cur_tn); + + p_cur_tn->p_parent->p_parent = p_tmp_tn->p_parent; + + p_tmp_tn->p_right = p_cur_tn->p_parent->p_left; + p_tmp_tn->p_parent = p_cur_tn->p_parent; + p_cur_tn->p_parent->p_left = p_tmp_tn; + + if (p_bro_tn) + p_bro_tn->p_parent = p_tmp_tn; + + zxdh_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } else { + *pp_tmp_tn = p_cur_tn; + p_cur_tn->p_parent->p_left = p_cur_tn->p_right; + + if (p_cur_tn->p_right) + p_cur_tn->p_right->p_parent = p_cur_tn->p_parent; + + p_cur_tn->p_parent->p_parent = p_cur_tn; + p_tmp_tn->p_right = p_cur_tn->p_left; + + if (p_cur_tn->p_left) + p_cur_tn->p_left->p_parent = p_tmp_tn; + + p_cur_tn->p_right = p_cur_tn->p_parent; + p_cur_tn->p_left = p_tmp_tn; + + p_cur_tn->p_parent = p_tmp_tn->p_parent; + p_tmp_tn->p_parent = p_cur_tn; + + zxdh_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } + break; + } + } else { + break; + } + } + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_rb_init(ZXDH_RB_CFG *p_rb_cfg, + uint32_t total_num, + uint32_t key_size, + ZXDH_RB_CMPFUN cmpfun) +{ + uint32_t rtn = ZXDH_OK; + uint32_t malloc_size = 0; + + if (p_rb_cfg->is_init) { + PMD_DRV_LOG(ERR, " %s already init!", __func__); + return ZXDH_OK; + } + + p_rb_cfg->key_size = key_size; + p_rb_cfg->p_root = NULL; + + if (cmpfun) + p_rb_cfg->p_cmpfun = cmpfun; + else + p_rb_cfg->p_cmpfun = zxdh_comm_rb_def_cmp; + + if (total_num) { + p_rb_cfg->is_dynamic = 0; + + rtn = zxdh_comm_double_link_init(total_num, &p_rb_cfg->tn_list); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_init"); + + rtn = zxdh_np_comm_liststack_creat(total_num, &p_rb_cfg->p_lsm); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_np_comm_liststack_creat"); + + p_rb_cfg->p_keybase = (uint8_t *)rte_zmalloc(NULL, + total_num * p_rb_cfg->key_size, 0); + if (p_rb_cfg->p_keybase == NULL) { + PMD_DRV_LOG(ERR, "%s point null!", __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + + malloc_size = ((sizeof(ZXDH_RB_TN) & 0xFFFFFFFFU) * total_num) & UINT32_MAX; + + p_rb_cfg->p_tnbase = (ZXDH_RB_TN *)rte_zmalloc(NULL, malloc_size, 0); + if (p_rb_cfg->p_tnbase == NULL) { + PMD_DRV_LOG(ERR, "%s point null!", __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + } else { + p_rb_cfg->is_dynamic = 1; + + rtn = zxdh_comm_double_link_init(0xFFFFFFFF, &p_rb_cfg->tn_list); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_init"); + } + p_rb_cfg->is_init = 1; + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_rb_insert(ZXDH_RB_CFG *p_rb_cfg, + void *p_key, + void *out_val) +{ + uint32_t rtn = 0; + uint32_t stack_top = 1; + int32_t cmprtn = 0; + uint32_t lsm_out = 0; + + ZXDH_RB_TN **stack_tn[ZXDH_RBT_MAX_DEPTH] = {0}; + ZXDH_RB_TN *p_cur_tn = NULL; + ZXDH_RB_TN *p_pre_tn = NULL; + ZXDH_RB_TN **pp_cur_tn = NULL; + void *p_cur_key = NULL; + ZXDH_RB_TN *p_ins_tn = p_key; + + p_cur_key = p_rb_cfg->is_dynamic ? ((ZXDH_RB_TN *)p_key)->p_key : p_key; + + pp_cur_tn = &p_rb_cfg->p_root; + + for (;;) { + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn) { + if (p_rb_cfg->is_dynamic == 0) { + rtn = zxdh_np_comm_liststack_alloc(p_rb_cfg->p_lsm, &lsm_out); + + if (rtn == ZXDH_LIST_STACK_ISEMPTY_ERR) + return ZXDH_RBT_RC_FULL; + + ZXDH_COMM_CHECK_RC(rtn, "zxdh_np_comm_liststack_alloc"); + + p_ins_tn = p_rb_cfg->p_tnbase + lsm_out; + + ZXDH_INIT_RBT_TN(p_ins_tn, p_rb_cfg->key_size * lsm_out + + p_rb_cfg->p_keybase); + + rte_memcpy(p_ins_tn->p_key, p_key, p_rb_cfg->key_size); + + ZXDH_SET_TN_LSV(p_ins_tn, lsm_out); + + if (out_val) + *((uint32_t *)out_val) = lsm_out; + } else { + ZXDH_INIT_D_NODE(&p_ins_tn->tn_ln, p_ins_tn); + } + + ZXDH_SET_TN_COLOR(p_ins_tn, ZXDH_RBT_RED); + + if (cmprtn < 0) { + rtn = zxdh_comm_double_link_insert_pre(&p_ins_tn->tn_ln, + &p_pre_tn->tn_ln, &p_rb_cfg->tn_list); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_insert_pre"); + } else if (cmprtn > 0) { + rtn = zxdh_comm_double_link_insert_aft(&p_ins_tn->tn_ln, + &p_pre_tn->tn_ln, &p_rb_cfg->tn_list); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_insert_aft"); + } else { + RTE_ASSERT(!p_pre_tn); + + rtn = zxdh_comm_double_link_insert_1st(&p_ins_tn->tn_ln, + &p_rb_cfg->tn_list); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_insert_1st"); + } + + break; + } + + stack_tn[stack_top++] = pp_cur_tn; + p_pre_tn = p_cur_tn; + cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size); + + if (cmprtn > 0) { + pp_cur_tn = &p_cur_tn->p_right; + } else if (cmprtn < 0) { + pp_cur_tn = &p_cur_tn->p_left; + } else { + PMD_DRV_LOG(INFO, "info , rb_key is same"); + + if (p_rb_cfg->is_dynamic) { + if (out_val) + *((ZXDH_RB_TN **)out_val) = p_cur_tn; + } else { + if (out_val) + *((uint32_t *)out_val) = ZXDH_GET_TN_LSV(p_cur_tn); + } + + return ZXDH_RBT_RC_UPDATE; + } + } + + p_ins_tn->p_parent = (stack_top > 1) ? *stack_tn[stack_top - 1] : NULL; + stack_tn[stack_top] = pp_cur_tn; + + *pp_cur_tn = p_ins_tn; + + rtn = zxdh_comm_rb_handle_ins(p_rb_cfg, stack_tn, stack_top); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_rb_handle_ins"); + + if (p_rb_cfg->is_dynamic) { + if (out_val) + *((ZXDH_RB_TN **)out_val) = p_ins_tn; + } + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_rb_handle_del(__rte_unused ZXDH_RB_CFG *p_rb_cfg, + ZXDH_RB_TN ***stack_tn, + uint32_t stack_top) +{ + ZXDH_RB_TN **pp_cur_tn = NULL; + ZXDH_RB_TN *p_cur_tn = NULL; + ZXDH_RB_TN *p_tmp_tn = NULL; + ZXDH_RB_TN *p_unc_tn = NULL; + ZXDH_RB_TN *p_par_tn = NULL; + + while (stack_top > 1) { + pp_cur_tn = stack_tn[stack_top]; + p_cur_tn = *pp_cur_tn; + + p_par_tn = *stack_tn[stack_top - 1]; + + if (p_cur_tn && p_cur_tn->p_parent) { + p_unc_tn = zxdh_comm_rb_get_brotn(p_cur_tn); + } else if (p_cur_tn && !p_cur_tn->p_parent) { + RTE_ASSERT(p_par_tn == p_cur_tn->p_parent); + + ZXDH_SET_TN_COLOR(p_cur_tn, ZXDH_RBT_BLACK); + + break; + } + if (!p_cur_tn) { + RTE_ASSERT(!p_cur_tn); + + if (p_par_tn) + p_unc_tn = p_par_tn->p_left ? p_par_tn->p_left : p_par_tn->p_right; + else + break; + } + + if (p_unc_tn) + RTE_ASSERT(p_unc_tn->p_parent == p_par_tn); + + if (!p_unc_tn) { + RTE_ASSERT(0); + RTE_ASSERT(ZXDH_GET_TN_COLOR(p_par_tn) == ZXDH_RBT_RED); + + ZXDH_SET_TN_COLOR(p_par_tn, ZXDH_RBT_BLACK); + + break; + } + if (ZXDH_GET_TN_COLOR(p_unc_tn) == ZXDH_RBT_RED) { + if (p_unc_tn == p_par_tn->p_left) { + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_left = p_unc_tn->p_right; + + if (p_unc_tn->p_right) + p_unc_tn->p_right->p_parent = p_par_tn; + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_right = p_par_tn; + + stack_tn[stack_top++] = &p_unc_tn->p_right; + stack_tn[stack_top] = &p_par_tn->p_right; + } else { + RTE_ASSERT(p_unc_tn == p_par_tn->p_right); + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_right = p_unc_tn->p_left; + + if (p_unc_tn->p_left) + p_unc_tn->p_left->p_parent = p_par_tn; + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_left = p_par_tn; + + stack_tn[stack_top++] = &p_unc_tn->p_left; + stack_tn[stack_top] = &p_par_tn->p_left; + } + + zxdh_comm_rb_swich_color(p_unc_tn, p_par_tn); + } else { + if (ZXDH_GET_TN_COLOR(p_unc_tn->p_left) == ZXDH_RBT_BLACK && + ZXDH_GET_TN_COLOR(p_unc_tn->p_right) == ZXDH_RBT_BLACK) { + if (ZXDH_GET_TN_COLOR(p_unc_tn->p_parent) == ZXDH_RBT_BLACK) { + ZXDH_SET_TN_COLOR(p_unc_tn, ZXDH_RBT_RED); + stack_top--; + } else { + RTE_ASSERT(ZXDH_GET_TN_COLOR(p_unc_tn->p_parent) + == ZXDH_RBT_RED); + + zxdh_comm_rb_swich_color(p_unc_tn->p_parent, p_unc_tn); + + break; + } + } else if (p_unc_tn == p_par_tn->p_right) { + if (ZXDH_GET_TN_COLOR(p_unc_tn->p_right) == ZXDH_RBT_RED) { + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_right = p_unc_tn->p_left; + + if (p_unc_tn->p_left) + p_unc_tn->p_left->p_parent = p_par_tn; + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_left = p_par_tn; + + zxdh_comm_rb_swich_color(p_unc_tn, p_par_tn); + + ZXDH_SET_TN_COLOR(p_unc_tn->p_right, ZXDH_RBT_BLACK); + + break; + } + RTE_ASSERT(ZXDH_GET_TN_COLOR(p_unc_tn->p_left) + == ZXDH_RBT_RED); + + p_tmp_tn = p_unc_tn->p_left; + + p_par_tn->p_right = p_tmp_tn; + p_tmp_tn->p_parent = p_par_tn; + p_unc_tn->p_left = p_tmp_tn->p_right; + + if (p_tmp_tn->p_right) + p_tmp_tn->p_right->p_parent = p_unc_tn; + + p_tmp_tn->p_right = p_unc_tn; + p_unc_tn->p_parent = p_tmp_tn; + + zxdh_comm_rb_swich_color(p_tmp_tn, p_unc_tn); + } else { + RTE_ASSERT(p_unc_tn == p_par_tn->p_left); + + if (ZXDH_GET_TN_COLOR(p_unc_tn->p_left) == ZXDH_RBT_RED) { + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_left = p_unc_tn->p_right; + + if (p_unc_tn->p_right) + p_unc_tn->p_right->p_parent = p_par_tn; + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_right = p_par_tn; + + zxdh_comm_rb_swich_color(p_unc_tn, p_par_tn); + + ZXDH_SET_TN_COLOR(p_unc_tn->p_left, ZXDH_RBT_BLACK); + break; + } + RTE_ASSERT(ZXDH_GET_TN_COLOR(p_unc_tn->p_right) + == ZXDH_RBT_RED); + + p_tmp_tn = p_unc_tn->p_right; + + p_par_tn->p_left = p_tmp_tn; + p_tmp_tn->p_parent = p_par_tn; + p_unc_tn->p_right = p_tmp_tn->p_left; + + if (p_tmp_tn->p_left) + p_tmp_tn->p_left->p_parent = p_unc_tn; + + p_tmp_tn->p_left = p_unc_tn; + p_unc_tn->p_parent = p_tmp_tn; + + zxdh_comm_rb_swich_color(p_tmp_tn, p_unc_tn); + } + } + } + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_rb_delete(ZXDH_RB_CFG *p_rb_cfg, + void *p_key, + void *out_val) +{ + uint32_t rtn = 0; + uint32_t stack_top = 1; + int32_t cmprtn = 0; + uint32_t rsv_stack = 0; + uint32_t del_is_red = 0; + ZXDH_RB_TN **stack_tn[ZXDH_RBT_MAX_DEPTH] = {0}; + ZXDH_RB_TN *p_cur_tn = NULL; + ZXDH_RB_TN **pp_cur_tn = NULL; + void *p_cur_key = NULL; + ZXDH_RB_TN *p_rsv_tn = NULL; + ZXDH_RB_TN *p_del_tn = NULL; + + p_cur_key = p_key; + + pp_cur_tn = &p_rb_cfg->p_root; + + for (;;) { + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn) + return ZXDH_RBT_RC_SRHFAIL; + + stack_tn[stack_top++] = pp_cur_tn; + + cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size); + + if (cmprtn > 0) { + pp_cur_tn = &p_cur_tn->p_right; + } else if (cmprtn < 0) { + pp_cur_tn = &p_cur_tn->p_left; + } else { + PMD_DRV_LOG(DEBUG, " find the key!"); + + break; + } + } + + rsv_stack = stack_top - 1; + p_rsv_tn = p_cur_tn; + + pp_cur_tn = &p_cur_tn->p_right; + p_cur_tn = *pp_cur_tn; + + if (p_cur_tn) { + stack_tn[stack_top++] = pp_cur_tn; + + pp_cur_tn = &p_cur_tn->p_left; + p_cur_tn = *pp_cur_tn; + + while (p_cur_tn) { + stack_tn[stack_top++] = pp_cur_tn; + pp_cur_tn = &p_cur_tn->p_left; + p_cur_tn = *pp_cur_tn; + } + + p_del_tn = *stack_tn[stack_top - 1]; + + *stack_tn[stack_top - 1] = p_del_tn->p_right; + + if (p_del_tn->p_right) + p_del_tn->p_right->p_parent = p_del_tn->p_parent; + + if (ZXDH_GET_TN_COLOR(p_del_tn) == ZXDH_RBT_RED) + del_is_red = 1; + + *stack_tn[rsv_stack] = p_del_tn; + + stack_tn[rsv_stack + 1] = &p_del_tn->p_right; + + ZXDH_SET_TN_COLOR(p_del_tn, ZXDH_GET_TN_COLOR(p_rsv_tn)); + p_del_tn->p_parent = p_rsv_tn->p_parent; + + p_del_tn->p_left = p_rsv_tn->p_left; + + if (p_rsv_tn->p_left) + p_rsv_tn->p_left->p_parent = p_del_tn; + + p_del_tn->p_right = p_rsv_tn->p_right; + + if (p_rsv_tn->p_right) + p_rsv_tn->p_right->p_parent = p_del_tn; + } else { + if (ZXDH_GET_TN_COLOR(p_rsv_tn) == ZXDH_RBT_RED) + del_is_red = 1; + + *stack_tn[stack_top - 1] = p_rsv_tn->p_left; + + if (p_rsv_tn->p_left) + p_rsv_tn->p_left->p_parent = p_rsv_tn->p_parent; + } + + stack_top--; + if (ZXDH_GET_TN_COLOR(*stack_tn[stack_top]) == ZXDH_RBT_RED) { + ZXDH_SET_TN_COLOR(*stack_tn[stack_top], ZXDH_RBT_BLACK); + } else if (!del_is_red) { + rtn = zxdh_comm_rb_handle_del(p_rb_cfg, stack_tn, stack_top); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_rb_handle_del"); + } + + rtn = zxdh_comm_double_link_del(&p_rsv_tn->tn_ln, &p_rb_cfg->tn_list); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_del"); + + if (p_rb_cfg->is_dynamic) { + *(ZXDH_RB_TN **)out_val = p_rsv_tn; + } else { + rtn = zxdh_comm_liststack_free(p_rb_cfg->p_lsm, ZXDH_GET_TN_LSV(p_rsv_tn)); + ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_liststack_free"); + + *(uint32_t *)out_val = ZXDH_GET_TN_LSV(p_rsv_tn); + + memset(p_rsv_tn->p_key, 0, p_rb_cfg->key_size); + memset(p_rsv_tn, 0, sizeof(ZXDH_RB_TN)); + } + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_liststack_destroy(ZXDH_LISTSTACK_MANAGER *p_list) +{ + if (p_list == NULL) { + PMD_DRV_LOG(INFO, " %s! LINE:%d ", __func__, __LINE__); + return ZXDH_LIST_STACK_POINT_NULL; + } + rte_free(p_list); + + return ZXDH_OK; +} + +static uint32_t +zxdh_comm_rb_destroy(ZXDH_RB_CFG *p_rb_cfg) +{ + uint32_t rtn = 0; + + if (p_rb_cfg->is_dynamic == 0) + zxdh_comm_liststack_destroy(p_rb_cfg->p_lsm); + + if (p_rb_cfg->p_keybase != NULL) { + rte_free(p_rb_cfg->p_keybase); + p_rb_cfg->p_keybase = NULL; + } + + if (p_rb_cfg->p_tnbase != NULL) { + rte_free(p_rb_cfg->p_tnbase); + p_rb_cfg->p_tnbase = NULL; + } + + memset(p_rb_cfg, 0, sizeof(ZXDH_RB_CFG)); + + return rtn; +} + +static int +zxdh_np_se_apt_key_default_cmp(void *p_new_key, + void *p_old_key, __rte_unused uint32_t key_len) +{ + return memcmp((uint32_t *)p_new_key, (uint32_t *)p_old_key, sizeof(uint32_t)); +} + +static uint32_t +zxdh_np_se_apt_rb_insert(ZXDH_RB_CFG *rb_cfg, void *p_data, uint32_t len) +{ + uint8_t *p_rb_key = NULL; + ZXDH_RB_TN *p_rb_new = NULL; + ZXDH_RB_TN *p_rb_rtn = NULL; + uint32_t rc = ZXDH_OK; + + p_rb_key = (uint8_t *)rte_zmalloc(NULL, len, 0); + if (p_rb_key == NULL) { + PMD_DRV_LOG(ERR, "%s point null!", __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + rte_memcpy(p_rb_key, p_data, len); + + p_rb_new = (ZXDH_RB_TN *)rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0); + if (NULL == (p_rb_new)) { + rte_free(p_rb_key); + PMD_DRV_LOG(ERR, " ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!", + __FILE__, __LINE__, __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + ZXDH_INIT_RBT_TN(p_rb_new, p_rb_key); + + rc = zxdh_comm_rb_insert(rb_cfg, p_rb_new, &p_rb_rtn); + if (rc == ZXDH_RBT_RC_UPDATE) { + if (p_rb_rtn == NULL) { + PMD_DRV_LOG(ERR, "p_rb_rtn point null!"); + return ZXDH_PAR_CHK_POINT_NULL; + } + + rte_memcpy(p_rb_rtn->p_key, p_data, len); + rte_free(p_rb_new); + rte_free(p_rb_key); + PMD_DRV_LOG(DEBUG, "update exist entry!"); + return ZXDH_OK; + } + + return rc; +} + +static uint32_t +zxdh_np_se_apt_rb_delete(ZXDH_RB_CFG *rb_cfg, void *p_data, __rte_unused uint32_t len) +{ + uint32_t rc = ZXDH_OK; + ZXDH_RB_TN *p_rb_rtn = NULL; + + rc = zxdh_comm_rb_delete(rb_cfg, p_data, &p_rb_rtn); + if (rc != ZXDH_OK) + return rc; + rte_free(p_rb_rtn->p_key); + rte_free(p_rb_rtn); + + return rc; +} + static uint32_t zxdh_np_dev_init(void) { @@ -1954,10 +2948,112 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id, rc = zxdh_np_dtb_queue_unused_item_num_get(dev_id, queue_id, &item_num); + if (item_num != ZXDH_DTB_QUEUE_ITEM_NUM_MAX) + return ZXDH_RC_DTB_QUEUE_IS_WORKING; + p_dtb_mgr->queue_info[queue_id].init_flag = 0; p_dtb_mgr->queue_info[queue_id].vport = 0; p_dtb_mgr->queue_info[queue_id].vector = 0; + memset(&p_dtb_mgr->queue_info[queue_id].tab_up, 0, sizeof(ZXDH_DTB_TAB_UP_INFO_T)); + memset(&p_dtb_mgr->queue_info[queue_id].tab_down, 0, sizeof(ZXDH_DTB_TAB_DOWN_INFO_T)); + + return rc; +} + +static ZXDH_RB_CFG * +zxdh_np_dtb_dump_addr_rb_get(uint32_t dev_id, uint32_t queue_id) +{ + return g_dtb_dump_addr_rb[dev_id][queue_id]; +} + +static uint32_t +zxdh_np_dtb_dump_addr_rb_set(uint32_t dev_id, uint32_t queue_id, ZXDH_RB_CFG *p_dump_addr_rb) +{ + g_dtb_dump_addr_rb[dev_id][queue_id] = p_dump_addr_rb; + return ZXDH_OK; +} + +static uint32_t +zxdh_np_dtb_dump_sdt_addr_clear(uint32_t dev_id, + uint32_t queue_id, + uint32_t sdt_no) +{ + uint32_t rc = ZXDH_OK; + + ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {0}; + ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL; + + dtb_dump_addr_info.sdt_no = sdt_no; + + p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id); + rc = zxdh_np_se_apt_rb_delete(p_dtb_dump_addr_rb, &dtb_dump_addr_info, + sizeof(ZXDH_DTB_ADDR_INFO_T)); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_apt_rb_delete"); + + return rc; +} + +static uint32_t +zxdh_np_dtb_dump_addr_rb_destroy(uint32_t dev_id, uint32_t queue_id) +{ + uint32_t rc = ZXDH_OK; + ZXDH_D_NODE *p_node = NULL; + ZXDH_RB_TN *p_rb_tn = NULL; + ZXDH_DTB_ADDR_INFO_T *p_rbkey = NULL; + ZXDH_D_HEAD *p_head_dtb_rb = NULL; + ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL; + uint32_t sdt_no = 0; + + p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id); + ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dtb_dump_addr_rb); + + p_head_dtb_rb = &p_dtb_dump_addr_rb->tn_list; + + while (p_head_dtb_rb->used) { + p_node = p_head_dtb_rb->p_next; + p_rb_tn = (ZXDH_RB_TN *)p_node->data; + p_rbkey = (ZXDH_DTB_ADDR_INFO_T *)p_rb_tn->p_key; + + sdt_no = p_rbkey->sdt_no; + rc = zxdh_np_dtb_dump_sdt_addr_clear(dev_id, queue_id, sdt_no); + + if (rc == ZXDH_HASH_RC_DEL_SRHFAIL) + PMD_DRV_LOG(ERR, "dtb dump delete key is not exist," + "std:%d", sdt_no); + else + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_clear"); + } + + rc = zxdh_comm_rb_destroy(p_dtb_dump_addr_rb); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init"); + + return rc; +} + +static uint32_t +zxdh_np_dtb_dump_addr_rb_init(uint32_t dev_id, uint32_t queue_id) +{ + uint32_t rc = ZXDH_OK; + + ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL; + p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id); + + if (p_dtb_dump_addr_rb == NULL) { + p_dtb_dump_addr_rb = (ZXDH_RB_CFG *)rte_zmalloc(NULL, sizeof(ZXDH_RB_CFG), 0); + if (p_dtb_dump_addr_rb == NULL) { + PMD_DRV_LOG(ERR, "%s point null!", __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + + rc = zxdh_np_dtb_dump_addr_rb_set(dev_id, queue_id, p_dtb_dump_addr_rb); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_rb_set"); + } + + rc = zxdh_comm_rb_init(p_dtb_dump_addr_rb, 0, + sizeof(ZXDH_DTB_ADDR_INFO_T), zxdh_np_se_apt_key_default_cmp); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init"); + return rc; } @@ -1988,6 +3084,9 @@ zxdh_np_dtb_queue_request(uint32_t dev_id, char p_name[32], PMD_DRV_LOG(DEBUG, "dtb request queue is %d.", queue_id); + rc = zxdh_np_dtb_dump_addr_rb_init(dev_id, queue_id); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_rb_init"); + *p_queue_id = queue_id; PMD_DRV_LOG(INFO, "%s:dev_id %d vport 0x%x name %s queue_id %d done.", @@ -2027,6 +3126,9 @@ zxdh_np_dtb_queue_release(uint32_t devid, zxdh_np_comm_mutex_unlock(p_dtb_mutex); + rc = zxdh_np_dtb_dump_addr_rb_destroy(devid, queueid); + ZXDH_COMM_CHECK_DEV_RC(devid, rc, "zxdh_np_dtb_dump_addr_rb_destroy"); + rc = zxdh_np_dtb_queue_id_free(devid, queueid); ZXDH_COMM_CHECK_DEV_RC(devid, rc, "zxdh_np_dtb_queue_id_free"); @@ -3435,12 +4537,43 @@ zxdh_np_dtb_user_info_set(uint32_t dev_id, uint32_t queue_id, uint16_t vport, ui return rc; } +static uint32_t +zxdh_np_dtb_dump_sdt_addr_set(uint32_t dev_id, + uint32_t queue_id, + uint32_t sdt_no, + uint64_t phy_addr, + uint64_t vir_addr, + uint32_t size) +{ + uint32_t rc = ZXDH_OK; + + ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {0}; + ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL; + + dtb_dump_addr_info.sdt_no = sdt_no; + dtb_dump_addr_info.phy_addr = phy_addr; + dtb_dump_addr_info.vir_addr = vir_addr; + dtb_dump_addr_info.size = size; + + p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id); + ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dtb_dump_addr_rb); + + rc = zxdh_np_se_apt_rb_insert(p_dtb_dump_addr_rb, + &dtb_dump_addr_info, sizeof(ZXDH_DTB_ADDR_INFO_T)); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_apt_rb_insert"); + + return rc; +} + static uint32_t zxdh_np_apt_dtb_res_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl) { uint32_t rc = ZXDH_OK; uint32_t queue_id = 0; + uint32_t index = 0; + uint32_t dump_sdt_num = 0; + ZXDH_DTB_ADDR_INFO_T *p_dump_info = NULL; rc = zxdh_np_dtb_queue_request(dev_id, p_dev_init_ctrl->port_name, p_dev_init_ctrl->vport, &queue_id); @@ -3458,6 +4591,19 @@ zxdh_np_apt_dtb_res_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl) zxdh_np_dtb_dump_channel_addr_set(dev_id, queue_id, p_dev_init_ctrl->dump_phy_addr, p_dev_init_ctrl->dump_vir_addr, 0); + dump_sdt_num = p_dev_init_ctrl->dump_sdt_num; + for (index = 0; index < dump_sdt_num; index++) { + p_dump_info = p_dev_init_ctrl->dump_addr_info + index; + ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dump_info); + rc = zxdh_np_dtb_dump_sdt_addr_set(dev_id, + queue_id, + p_dump_info->sdt_no, + p_dump_info->phy_addr, + p_dump_info->vir_addr, + p_dump_info->size); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_set"); + } + return ZXDH_OK; } diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h index 887760b3d8..f7d09f3fae 100644 --- a/drivers/net/zxdh/zxdh_np.h +++ b/drivers/net/zxdh/zxdh_np.h @@ -122,6 +122,13 @@ #define ZXDH_VFUNC_NUM(VPORT) (((VPORT) & 0x00FF)) #define ZXDH_IS_PF(VPORT) (!ZXDH_VF_ACTIVE(VPORT)) +#define ZXDH_RBT_RED (0x1) +#define ZXDH_RBT_BLACK (0x2) +#define ZXDH_RBT_MAX_DEPTH (128) + +#define ZXDH_LISTSTACK_INVALID_INDEX (0) +#define ZXDH_LISTSTACK_MAX_ELEMENT (0x0ffffffe) + /**errco code */ #define ZXDH_RC_BASE (0x1000U) #define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200) @@ -140,6 +147,26 @@ #define ZXDH_MUTEX_LOCK_ULOCK_FAIL (ZXDH_MUTEX_LOCK_BASE | 0X003) #define ZXDH_MUTEX_LOCK_DESTROY_FAIL (ZXDH_MUTEX_LOCK_BASE | 0X004) +#define ZXDH_DOUBLE_LINK_BASE (ZXDH_RC_BASE | 0x500) +#define ZXDH_DOUBLE_LINK_ELEMENT_NUM_ERR (ZXDH_DOUBLE_LINK_BASE | 0x001) +#define ZXDH_DOUBLE_LINK_MALLOC_FAIL (ZXDH_DOUBLE_LINK_BASE | 0x002) +#define ZXDH_DOUBLE_LINK_POINT_NULL (ZXDH_DOUBLE_LINK_BASE | 0x003) +#define ZXDH_DOUBLE_LINK_CHK_SUM_ERR (ZXDH_DOUBLE_LINK_BASE | 0x004) +#define ZXDH_DOUBLE_LINK_NO_EXIST_FREENODE (ZXDH_DOUBLE_LINK_BASE | 0x005) +#define ZXDH_DOUBLE_LINK_FREE_INDX_INVALID (ZXDH_DOUBLE_LINK_BASE | 0x006) +#define ZXDH_DOUBLE_LINK_NO_EXIST_PRENODE (ZXDH_DOUBLE_LINK_BASE | 0x007) +#define ZXDH_DOUBLE_LINK_INPUT_INDX_INVALID (ZXDH_DOUBLE_LINK_BASE | 0x008) +#define ZXDH_DOUBLE_LINK_INIT_ELEMENT_NUM_ERR (ZXDH_DOUBLE_LINK_BASE | 0x009) + +#define ZXDH_LIST_STACK_BASE (ZXDH_RC_BASE | 0x800) +#define ZXDH_LIST_STACK_ELEMENT_NUM_ERR (ZXDH_LIST_STACK_BASE | 0x001) +#define ZXDH_LIST_STACK_POINT_NULL (ZXDH_LIST_STACK_BASE | 0x002) +#define ZXDH_LIST_STACK_ALLOC_MEMORY_FAIL (ZXDH_LIST_STACK_BASE | 0x003) +#define ZXDH_LIST_STACK_ISEMPTY_ERR (ZXDH_LIST_STACK_BASE | 0x004) +#define ZXDH_LIST_STACK_FREE_INDEX_INVALID (ZXDH_LIST_STACK_BASE | 0x005) +#define ZXDH_LIST_STACK_ALLOC_INDEX_INVALID (ZXDH_LIST_STACK_BASE | 0x006) +#define ZXDH_LIST_STACK_ALLOC_INDEX_USED (ZXDH_LIST_STACK_BASE | 0x007) + #define ZXDH_ERAM128_BADDR_MASK (0x3FFFF80) #define ZXDH_DTB_TABLE_MODE_ERAM (0) @@ -184,6 +211,34 @@ #define ZXDH_RC_CTRLCH_MSG_OPER_NOT_SUPPORT (ZXDH_RC_CTRLCH_BASE | 0x3) #define ZXDH_RC_CTRLCH_MSG_DROP (ZXDH_RC_CTRLCH_BASE | 0x4) +#define ZXDH_RBT_RC_BASE (0x1000) +#define ZXDH_RBT_RC_UPDATE (ZXDH_RBT_RC_BASE | 0x1) +#define ZXDH_RBT_RC_SRHFAIL (ZXDH_RBT_RC_BASE | 0x2) +#define ZXDH_RBT_RC_FULL (ZXDH_RBT_RC_BASE | 0x3) +#define ZXDH_RBT_ISEMPTY_ERR (ZXDH_RBT_RC_BASE | 0x4) +#define ZXDH_RBT_PARA_INVALID (ZXDH_RBT_RC_BASE | 0x5) + +#define ZXDH_SE_RC_BASE (0x50000) +#define ZXDH_SE_RC_HASH_BASE (ZXDH_SE_RC_BASE | 0x4000) +#define ZXDH_HASH_RC_INVALID_FUNCINFO (ZXDH_SE_RC_HASH_BASE | 0x1) +#define ZXDH_HASH_RC_INVALID_ZBLCK (ZXDH_SE_RC_HASH_BASE | 0x2) +#define ZXDH_HASH_RC_INVALID_ZCELL (ZXDH_SE_RC_HASH_BASE | 0x3) +#define ZXDH_HASH_RC_INVALID_KEY (ZXDH_SE_RC_HASH_BASE | 0x4) +#define ZXDH_HASH_RC_INVALID_TBL_ID_INFO (ZXDH_SE_RC_HASH_BASE | 0x5) +#define ZXDH_HASH_RC_RB_TREE_FULL (ZXDH_SE_RC_HASH_BASE | 0x6) +#define ZXDH_HASH_RC_INVALID_KEY_TYPE (ZXDH_SE_RC_HASH_BASE | 0x7) +#define ZXDH_HASH_RC_ADD_UPDATE (ZXDH_SE_RC_HASH_BASE | 0x8) +#define ZXDH_HASH_RC_DEL_SRHFAIL (ZXDH_SE_RC_HASH_BASE | 0x9) +#define ZXDH_HASH_RC_ITEM_FULL (ZXDH_SE_RC_HASH_BASE | 0xa) +#define ZXDH_HASH_RC_INVALID_DDR_WIDTH_MODE (ZXDH_SE_RC_HASH_BASE | 0xb) +#define ZXDH_HASH_RC_INVALID_PARA (ZXDH_SE_RC_HASH_BASE | 0xc) +#define ZXDH_HASH_RC_TBL_FULL (ZXDH_SE_RC_HASH_BASE | 0xd) +#define ZXDH_HASH_RC_SRH_FAIL (ZXDH_SE_RC_HASH_BASE | 0xe) +#define ZXDH_HASH_RC_MATCH_ITEM_FAIL (ZXDH_SE_RC_HASH_BASE | 0xf) +#define ZXDH_HASH_RC_DDR_WIDTH_MODE_ERR (ZXDH_SE_RC_HASH_BASE | 0x10) +#define ZXDH_HASH_RC_INVALID_ITEM_TYPE (ZXDH_SE_RC_HASH_BASE | 0x11) +#define ZXDH_HASH_RC_REPEAT_INIT (ZXDH_SE_RC_HASH_BASE | 0x12) + typedef enum zxdh_module_base_addr_e { ZXDH_MODULE_SE_SMMU0_BASE_ADDR = 0x00000000, ZXDH_MODULE_DTB_ENQ_BASE_ADDR = 0x00000000, @@ -289,6 +344,42 @@ typedef struct zxdh_d_head { ZXDH_D_NODE *p_prev; } ZXDH_D_HEAD; +typedef struct zxdh_s_freelink { + uint32_t index; + uint32_t next; +} ZXDH_COMM_FREELINK; + +typedef struct zxdh_s_list_stack_manager { + ZXDH_COMM_FREELINK *p_array; + uint32_t capacity; + uint32_t p_head; + uint32_t free_num; + uint32_t used_num; +} ZXDH_LISTSTACK_MANAGER; + +typedef struct zxdh_rb_tn { + void *p_key; + uint32_t color_lsv; + struct zxdh_rb_tn *p_left; + struct zxdh_rb_tn *p_right; + struct zxdh_rb_tn *p_parent; + ZXDH_D_NODE tn_ln; +} ZXDH_RB_TN; + +typedef int32_t (*ZXDH_RB_CMPFUN)(void *p_new, void *p_old, uint32_t keysize); + +typedef struct _rb_cfg { + uint32_t key_size; + uint32_t is_dynamic; + ZXDH_RB_TN *p_root; + ZXDH_D_HEAD tn_list; + ZXDH_RB_CMPFUN p_cmpfun; + ZXDH_LISTSTACK_MANAGER *p_lsm; + uint8_t *p_keybase; + ZXDH_RB_TN *p_tnbase; + uint32_t is_init; +} ZXDH_RB_CFG; + typedef struct zxdh_dtb_tab_up_user_addr_t { uint32_t user_flag; uint64_t phy_addr; -- 2.27.0