From: Bingbin Chen <chen.bingbin@zte.com.cn>
To: dev@dpdk.org
Cc: Bingbin Chen <chen.bingbin@zte.com.cn>
Subject: [PATCH v1 08/14] net/zxdh: support hash resources configuration
Date: Mon, 10 Feb 2025 09:50:11 +0800 [thread overview]
Message-ID: <20250210015017.4105624-3-chen.bingbin@zte.com.cn> (raw)
In-Reply-To: <20250210015017.4105624-1-chen.bingbin@zte.com.cn>
[-- Attachment #1.1.1: Type: text/plain, Size: 35030 bytes --]
Implement the hash functions and tables configuration.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_np.c | 798 +++++++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 260 ++++++++++++
2 files changed, 1058 insertions(+)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 1e4b214a6e..bcae32e94e 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -36,6 +36,23 @@ static const char * const g_dpp_dtb_name[] = {
"DOWN TAB",
"UP TAB",
};
+ZXDH_SE_CFG *g_apt_se_cfg[ZXDH_DEV_CHANNEL_MAX];
+ZXDH_SE_CFG *dpp_se_cfg[ZXDH_DEV_CHANNEL_MAX];
+static uint16_t g_lpm_crc[ZXDH_SE_ZBLK_NUM] = {
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b
+};
+uint32_t g_hash_zblk_idx[ZXDH_DEV_CHANNEL_MAX]
+ [ZXDH_HASH_FUNC_ID_NUM]
+ [ZXDH_HASH_TBL_ID_NUM] = {0};
+static uint32_t g_ddr_hash_arg[ZXDH_HASH_DDR_CRC_NUM] = {
+ 0x04C11DB7,
+ 0xF4ACFB13,
+ 0x20044009,
+ 0x00210801
+};
ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {
{"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},
@@ -519,6 +536,20 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
#define ZXDH_GET_TN_COLOR(p_tn) \
zxdh_np_get_tn_color(p_tn)
+#define ZXDH_SE_GET_ZBLK_CFG(p_se, zblk_idx) \
+ (&(((ZXDH_SE_CFG *)(p_se))->zblk_info[zblk_idx]))
+
+#define GET_ZBLK_IDX(zcell_idx) \
+ (((zcell_idx) & 0x7F) >> 2)
+
+#define GET_ZCELL_IDX(zcell_idx) \
+ ((zcell_idx) & 0x3)
+
+#define ZXDH_GET_FUN_INFO(p_se, fun_id) \
+ (&(((ZXDH_SE_CFG *)(p_se))->fun_info[fun_id]))
+
+#define GET_DDR_HASH_ARG(ddr_crc_sel) (g_ddr_hash_arg[ddr_crc_sel])
+
static uint32_t
zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex)
{
@@ -840,6 +871,33 @@ zxdh_comm_double_link_insert_pre(ZXDH_D_NODE *p_newnode,
return ZXDH_OK;
}
+static uint32_t
+zxdh_comm_double_link_insert_last(ZXDH_D_NODE *p_newnode, ZXDH_D_HEAD *p_head)
+{
+ ZXDH_D_NODE *p_dnode = NULL;
+
+ RTE_ASSERT(!(!p_head->p_next && p_head->p_prev));
+ RTE_ASSERT(!(p_head->p_next && !p_head->p_prev));
+
+ p_dnode = p_head->p_prev;
+
+ if (!p_dnode) {
+ p_head->p_next = p_newnode;
+ p_head->p_prev = p_newnode;
+ p_newnode->next = NULL;
+ p_newnode->prev = NULL;
+ } else {
+ p_newnode->prev = p_dnode;
+ p_newnode->next = NULL;
+ p_head->p_prev = p_newnode;
+ p_dnode->next = 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)
{
@@ -865,6 +923,46 @@ zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head)
return ZXDH_OK;
}
+static int32_t
+zxdh_comm_double_link_default_cmp_fuc(ZXDH_D_NODE *p_data1,
+ ZXDH_D_NODE *p_data2, __rte_unused void *p_data)
+{
+ uint32_t data1 = *(uint32_t *)p_data1->data;
+ uint32_t data2 = *(uint32_t *)p_data2->data;
+
+ if (data1 > data2)
+ return 1;
+ else if (data1 == data2)
+ return 0;
+ else
+ return -1;
+}
+
+static uint32_t
+zxdh_comm_double_link_insert_sort(ZXDH_D_NODE *p_newnode,
+ ZXDH_D_HEAD *p_head, ZXDH_CMP_FUNC cmp_fuc, void *cmp_data)
+{
+ ZXDH_D_NODE *pre_node = NULL;
+
+ if (cmp_fuc == NULL)
+ cmp_fuc = zxdh_comm_double_link_default_cmp_fuc;
+
+ if (p_head->used == 0)
+ return zxdh_comm_double_link_insert_1st(p_newnode, p_head);
+
+ pre_node = p_head->p_next;
+
+ while (pre_node != NULL) {
+ if (cmp_fuc(p_newnode, pre_node, cmp_data) <= 0)
+ return zxdh_comm_double_link_insert_pre(p_newnode,
+ pre_node, p_head);
+ else
+ pre_node = pre_node->next;
+ }
+
+ return zxdh_comm_double_link_insert_last(p_newnode, p_head);
+}
+
static int32_t
zxdh_comm_rb_def_cmp(void *p_new, void *p_old, uint32_t key_size)
{
@@ -5715,6 +5813,703 @@ zxdh_np_agent_se_res_get(uint32_t dev_id, uint32_t type)
return rc;
}
+static uint32_t
+zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
+{
+ uint32_t i = 0;
+ uint32_t j = 0;
+
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+
+ if (dpp_se_cfg[dev_id] != NULL) {
+ PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");
+ return ZXDH_OK;
+ }
+
+ memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));
+
+ p_se_cfg->dev_id = dev_id;
+ dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;
+
+ p_se_cfg->p_as_rslt_wrt_fun = NULL;
+ p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+
+ for (i = 0; i < ZXDH_SE_ZBLK_NUM; i++) {
+ p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_se_cfg, i);
+
+ p_zblk_cfg->zblk_idx = i;
+ p_zblk_cfg->is_used = 0;
+ p_zblk_cfg->hash_arg = g_lpm_crc[i];
+ p_zblk_cfg->zcell_bm = 0;
+ ZXDH_INIT_D_NODE(&p_zblk_cfg->zblk_dn, p_zblk_cfg);
+
+ for (j = 0; j < ZXDH_SE_ZCELL_NUM; j++) {
+ p_zcell_cfg = &p_zblk_cfg->zcell_info[j];
+
+ p_zcell_cfg->zcell_idx = (i << 2) + j;
+ p_zcell_cfg->item_used = 0;
+ p_zcell_cfg->mask_len = 0;
+
+ ZXDH_INIT_D_NODE(&p_zcell_cfg->zcell_dn, p_zcell_cfg);
+
+ p_zcell_cfg->zcell_avl.p_key = p_zcell_cfg;
+ }
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_apt_hash_global_res_init(uint32_t dev_id)
+{
+ if (g_apt_se_cfg[dev_id] == NULL) {
+ g_apt_se_cfg[dev_id] = (ZXDH_SE_CFG *)rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
+ if (g_apt_se_cfg[dev_id] == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);
+
+ g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+ }
+
+ return ZXDH_OK;
+}
+
+static void
+se_apt_get_zblock_index(uint32_t zblock_bitmap, uint32_t *zblk_idx)
+{
+ uint32_t index0 = 0;
+ uint32_t index1 = 0;
+
+ for (index0 = 0; index0 < 32; index0++) {
+ if ((zblock_bitmap >> index0) & 0x1) {
+ *(zblk_idx + index1) = index0;
+ index1++;
+ }
+ }
+}
+
+static uint32_t
+zxdh_np_crc32_calc(uint8_t *p_input_key, uint32_t dw_byte_num, uint32_t dw_crc_poly)
+{
+ uint32_t dw_result = 0;
+ uint32_t dw_data_type = 0;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+
+ while (i < dw_byte_num) {
+ dw_data_type = (uint32_t)((dw_result & 0xff000000) ^ (p_input_key[i] << 24));
+ for (j = 0; j < 8; j++) {
+ if (dw_data_type & 0x80000000) {
+ dw_data_type <<= 1;
+ dw_data_type ^= dw_crc_poly;
+ } else {
+ dw_data_type <<= 1;
+ }
+ }
+ dw_result <<= 8;
+ dw_result ^= dw_data_type;
+
+ i++;
+ }
+
+ return dw_result;
+}
+
+static uint16_t
+zxdh_np_crc16_calc(uint8_t *p_input_key, uint32_t dw_byte_num, uint16_t dw_crc_poly)
+{
+ uint16_t dw_result = 0;
+ uint16_t dw_data_type = 0;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+
+ while (i < dw_byte_num) {
+ dw_data_type = (uint16_t)(((dw_result & 0xff00) ^ (p_input_key[i] << 8)) & 0xFFFF);
+ for (j = 0; j < 8; j++) {
+ if (dw_data_type & 0x8000) {
+ dw_data_type <<= 1;
+ dw_data_type ^= dw_crc_poly;
+ } else {
+ dw_data_type <<= 1;
+ }
+ }
+ dw_result <<= 8;
+ dw_result ^= dw_data_type;
+
+ i++;
+ }
+
+ return dw_result;
+}
+
+static uint32_t
+zxdh_np_se_fun_init(ZXDH_SE_CFG *p_se_cfg,
+ uint8_t id,
+ uint32_t fun_type)
+{
+ ZXDH_FUNC_ID_INFO *p_fun_info = NULL;
+
+ p_fun_info = ZXDH_GET_FUN_INFO(p_se_cfg, id);
+
+ if (p_fun_info->is_used) {
+ PMD_DRV_LOG(ERR, "Error[0x%x], fun_id [%d] is already used!",
+ ZXDH_SE_RC_FUN_INVALID, id);
+ return ZXDH_SE_RC_FUN_INVALID;
+ }
+
+ p_fun_info->fun_id = id;
+ p_fun_info->is_used = 1;
+
+ switch (fun_type) {
+ case (ZXDH_FUN_HASH):
+ {
+ p_fun_info->fun_type = ZXDH_FUN_HASH;
+ p_fun_info->fun_ptr = rte_zmalloc(NULL, sizeof(ZXDH_HASH_CFG), 0);
+ if (p_fun_info->fun_ptr == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ ((ZXDH_HASH_CFG *)(p_fun_info->fun_ptr))->p_se_info = p_se_cfg;
+ }
+ break;
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, "Error, unrecgnized fun_type[ %d]", fun_type);
+ RTE_ASSERT(0);
+ return ZXDH_SE_RC_BASE;
+ }
+ break;
+ }
+
+ return ZXDH_OK;
+}
+
+static int32_t
+zxdh_np_hash_list_cmp(ZXDH_D_NODE *data1, ZXDH_D_NODE *data2, void *data)
+{
+ uint32_t flag = 0;
+ uint32_t data_new = 0;
+ uint32_t data_pre = 0;
+
+ flag = *(uint32_t *)data;
+
+ if (flag == ZXDH_HASH_CMP_ZCELL) {
+ data_new = ((ZXDH_SE_ZCELL_CFG *)data1->data)->zcell_idx;
+ data_pre = ((ZXDH_SE_ZCELL_CFG *)data2->data)->zcell_idx;
+ } else if (flag == ZXDH_HASH_CMP_ZBLK) {
+ data_new = ((ZXDH_SE_ZBLK_CFG *)data1->data)->zblk_idx;
+ data_pre = ((ZXDH_SE_ZBLK_CFG *)data2->data)->zblk_idx;
+ }
+
+ if (data_new > data_pre)
+ return 1;
+ else if (data_new == data_pre)
+ return 0;
+ else
+ return -1;
+}
+
+static int32_t
+zxdh_np_hash_rb_key_cmp(void *p_new, void *p_old, __rte_unused uint32_t key_size)
+{
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_old = NULL;
+
+ p_rbkey_new = (ZXDH_HASH_RBKEY_INFO *)(p_new);
+ p_rbkey_old = (ZXDH_HASH_RBKEY_INFO *)(p_old);
+
+ return memcmp(p_rbkey_new->key, p_rbkey_old->key, ZXDH_HASH_KEY_MAX);
+}
+
+static int32_t
+zxdh_np_hash_ddr_cfg_rb_key_cmp(void *p_new, void *p_old, __rte_unused uint32_t key_size)
+{
+ HASH_DDR_CFG *p_rbkey_new = NULL;
+ HASH_DDR_CFG *p_rbkey_old = NULL;
+
+ p_rbkey_new = (HASH_DDR_CFG *)(p_new);
+ p_rbkey_old = (HASH_DDR_CFG *)(p_old);
+
+ return memcmp(&p_rbkey_new->ddr_baddr, &p_rbkey_old->ddr_baddr, sizeof(uint32_t));
+}
+
+static uint32_t
+zxdh_np_hash_zcam_resource_init(ZXDH_HASH_CFG *p_hash_cfg,
+ uint32_t zblk_num, uint32_t *zblk_idx_array)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+ uint32_t cmp_type = 0;
+ uint32_t zblk_idx = 0;
+ uint32_t zcell_idx = 0;
+ uint32_t dev_id = 0;
+
+ ZXDH_D_HEAD *p_zblk_list = NULL;
+ ZXDH_D_HEAD *p_zcell_free = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+
+ dev_id = p_hash_cfg->p_se_info->dev_id;
+
+ p_zblk_list = &p_hash_cfg->hash_shareram.zblk_list;
+ rc = zxdh_comm_double_link_init(ZXDH_SE_ZBLK_NUM, p_zblk_list);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");
+
+ p_zcell_free = &p_hash_cfg->hash_shareram.zcell_free_list;
+ rc = zxdh_comm_double_link_init(ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM, p_zcell_free);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");
+
+ for (i = 0; i < zblk_num; i++) {
+ zblk_idx = zblk_idx_array[i];
+
+ p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info, zblk_idx);
+
+ if (p_zblk_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "ErrorCode:[0x%x],"
+ "ZBlock[%d] is already used by other function!",
+ ZXDH_HASH_RC_INVALID_ZBLCK, zblk_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_ZBLCK;
+ }
+
+ for (j = 0; j < ZXDH_SE_ZCELL_NUM; j++) {
+ zcell_idx = p_zblk_cfg->zcell_info[j].zcell_idx;
+ p_zcell_cfg = &(((ZXDH_SE_CFG *)(p_hash_cfg->p_se_info))->
+ zblk_info[GET_ZBLK_IDX(zcell_idx)].zcell_info[GET_ZCELL_IDX(zcell_idx)]);
+
+ if (p_zcell_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "ErrorCode:[0x%x], ZBlk[%d],"
+ "ZCell[%d] is already used by other function!",
+ ZXDH_HASH_RC_INVALID_ZCELL, zblk_idx, zcell_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_ZCELL;
+ }
+
+ p_zcell_cfg->is_used = 1;
+
+ cmp_type = ZXDH_HASH_CMP_ZCELL;
+ rc = zxdh_comm_double_link_insert_sort(&p_zcell_cfg->zcell_dn,
+ p_zcell_free, zxdh_np_hash_list_cmp, &cmp_type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_sort");
+ }
+
+ p_zblk_cfg->is_used = 1;
+ cmp_type = ZXDH_HASH_CMP_ZBLK;
+ rc = zxdh_comm_double_link_insert_sort(&p_zblk_cfg->zblk_dn,
+ p_zblk_list, zxdh_np_hash_list_cmp, &cmp_type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_last");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,
+ uint32_t fun_id,
+ uint32_t zblk_num,
+ uint32_t *zblk_idx,
+ uint32_t ddr_dis)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t dev_id = 0;
+
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+
+ rc = zxdh_np_se_fun_init(p_se_cfg, (fun_id & 0xff), ZXDH_FUN_HASH);
+ if (rc == ZXDH_SE_RC_FUN_INVALID)
+ return ZXDH_OK;
+
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_init");
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, fun_id);
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ p_hash_cfg->fun_id = fun_id;
+ p_hash_cfg->p_hash32_fun = zxdh_np_crc32_calc;
+ p_hash_cfg->p_hash16_fun = zxdh_np_crc16_calc;
+ p_hash_cfg->p_se_info = p_se_cfg;
+
+ if (ddr_dis == 1)
+ p_hash_cfg->ddr_valid = 0;
+ else
+ p_hash_cfg->ddr_valid = 1;
+
+ p_hash_cfg->hash_stat.zblock_num = zblk_num;
+ rc = zxdh_np_hash_zcam_resource_init(p_hash_cfg, zblk_num, zblk_idx);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_zcam_resource_init");
+
+ for (i = 0; i < zblk_num; i++)
+ p_hash_cfg->hash_stat.zblock_array[i] = zblk_idx[i];
+
+ rc = (uint32_t)zxdh_comm_rb_init(&p_hash_cfg->hash_rb,
+ 0,
+ sizeof(ZXDH_HASH_RBKEY_INFO),
+ zxdh_np_hash_rb_key_cmp);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
+
+ rc = (uint32_t)zxdh_comm_rb_init(&p_hash_cfg->ddr_cfg_rb,
+ 0,
+ sizeof(HASH_DDR_CFG),
+ zxdh_np_hash_ddr_cfg_rb_key_cmp);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
+
+ for (i = 0; i < zblk_num; i++)
+ g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,
+ ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t index = 0;
+ uint32_t zblk_idx[32] = {0};
+ ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ p_se_cfg = g_apt_se_cfg[dev_id];
+
+ for (index = 0; index < func_num; index++) {
+ memset(zblk_idx, 0, sizeof(zblk_idx));
+ p_hash_func_res_temp = p_hash_func_res + index;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_func_res_temp);
+
+ se_apt_get_zblock_index(p_hash_func_res_temp->zblk_bitmap, zblk_idx);
+
+ rc = zxdh_np_hash_init(p_se_cfg,
+ p_hash_func_res_temp->func_id,
+ p_hash_func_res_temp->zblk_num,
+ zblk_idx,
+ p_hash_func_res_temp->ddr_dis);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_init");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_bulk_init(ZXDH_SE_CFG *p_se_cfg,
+ uint32_t fun_id,
+ uint32_t bulk_id,
+ ZXDH_HASH_DDR_RESC_CFG_T *p_ddr_resc_cfg,
+ uint32_t zcell_num,
+ uint32_t zreg_num)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+ uint32_t zblk_idx = 0;
+ uint32_t dev_id = 0;
+ uint32_t ddr_item_num = 0;
+
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_D_NODE *p_zcell_dn = NULL;
+ ZXDH_RB_TN *p_rb_tn_new = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZREG_CFG *p_zreg_cfg = NULL;
+ HASH_DDR_CFG *p_ddr_cfg = NULL;
+ HASH_DDR_CFG *p_rbkey_new = NULL;
+ HASH_DDR_CFG *p_rbkey_rtn = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_SE_ITEM_CFG **p_item_array = NULL;
+ ZXDH_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, fun_id);
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ if (p_hash_cfg == NULL) {
+ PMD_DRV_LOG(ERR, "p_hash_cfg point null!");
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ if (p_hash_cfg->hash_stat.p_bulk_zcam_mono[bulk_id] != NULL) {
+ PMD_DRV_LOG(ERR, "fun_id[%u] bulk_id[%u] is already init,"
+ "do not init again!", fun_id, bulk_id);
+ return ZXDH_OK;
+ }
+
+ PMD_DRV_LOG(DEBUG, "p_hash_cfg->ddr_valid = %d!", p_hash_cfg->ddr_valid);
+ if (p_hash_cfg->ddr_valid == 1) {
+ ddr_item_num = p_ddr_resc_cfg->ddr_item_num;
+ if (ZXDH_DDR_WIDTH_512b == p_ddr_resc_cfg->ddr_width_mode)
+ ddr_item_num = p_ddr_resc_cfg->ddr_item_num >> 1;
+
+ p_rbkey_new = (HASH_DDR_CFG *)rte_zmalloc(NULL, sizeof(HASH_DDR_CFG), 0);
+ if (p_rbkey_new == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ p_rbkey_new->ddr_baddr = p_ddr_resc_cfg->ddr_baddr;
+
+ p_rb_tn_new = (ZXDH_RB_TN *)rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0);
+ if (p_rb_tn_new == NULL) {
+ rte_free(p_rbkey_new);
+ 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_tn_new, p_rbkey_new);
+
+ rc = zxdh_comm_rb_insert(&p_hash_cfg->ddr_cfg_rb,
+ (void *)p_rb_tn_new, (void *)(&p_rb_tn_rtn));
+ if (rc == ZXDH_RBT_RC_FULL) {
+ PMD_DRV_LOG(ERR, "The red black tree is full!");
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_RB_TREE_FULL;
+ } else if (rc == ZXDH_RBT_RC_UPDATE) {
+ PMD_DRV_LOG(DEBUG, "some bulk_id share one bulk!");
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_rbkey_rtn = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key);
+
+ p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id];
+
+ if (p_ddr_cfg->hash_ddr_arg !=
+ GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel) ||
+ p_ddr_cfg->width_mode != p_ddr_resc_cfg->ddr_width_mode ||
+ p_ddr_cfg->ddr_ecc_en != p_ddr_resc_cfg->ddr_ecc_en ||
+ p_ddr_cfg->item_num != ddr_item_num) {
+ PMD_DRV_LOG(ERR, "The base address is same but other ddr attribute is different");
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_hash_cfg->p_bulk_ddr_info[bulk_id] =
+ p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id];
+
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ } else {
+ p_item_array = (ZXDH_SE_ITEM_CFG **)rte_zmalloc(NULL, ddr_item_num *
+ sizeof(ZXDH_SE_ITEM_CFG *), 0);
+ if (NULL == (p_item_array)) {
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ PMD_DRV_LOG(ERR, "ICM %s:%d[Error:POINT NULL] !"
+ "FUNCTION : %s!", __FILE__, __LINE__, __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ p_rbkey_new->p_item_array = p_item_array;
+ p_rbkey_new->bulk_id = bulk_id;
+ p_rbkey_new->hw_baddr = 0;
+ p_rbkey_new->width_mode = p_ddr_resc_cfg->ddr_width_mode;
+ p_rbkey_new->item_num = ddr_item_num;
+ p_rbkey_new->ddr_ecc_en = p_ddr_resc_cfg->ddr_ecc_en;
+ p_rbkey_new->hash_ddr_arg = GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel);
+ p_rbkey_new->bulk_use = 1;
+ p_rbkey_new->zcell_num = zcell_num;
+ p_rbkey_new->zreg_num = zreg_num;
+ p_hash_cfg->p_bulk_ddr_info[bulk_id] = p_rbkey_new;
+
+ PMD_DRV_LOG(DEBUG, "one new ddr_bulk init!");
+ }
+ }
+
+ p_bulk_zcam_mono = (ZXDH_HASH_BULK_ZCAM_STAT *)rte_zmalloc(NULL,
+ sizeof(ZXDH_HASH_BULK_ZCAM_STAT), 0);
+ if (NULL == (p_bulk_zcam_mono)) {
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ rte_free(p_item_array);
+ PMD_DRV_LOG(ERR, "ICM %s:%d[Error:POINT NULL] ! FUNCTION"
+ ": %s!", __FILE__, __LINE__, __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[bulk_id] = p_bulk_zcam_mono;
+
+ for (i = 0; i < ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM; i++)
+ p_bulk_zcam_mono->zcell_mono_idx[i] = 0xffffffff;
+
+ for (i = 0; i < ZXDH_SE_ZBLK_NUM; i++) {
+ for (j = 0; j < ZXDH_SE_ZREG_NUM; j++) {
+ p_bulk_zcam_mono->zreg_mono_id[i][j].zblk_id = 0xffffffff;
+ p_bulk_zcam_mono->zreg_mono_id[i][j].zreg_id = 0xffffffff;
+ }
+ }
+
+ if (zcell_num > 0) {
+ p_hash_cfg->bulk_ram_mono[bulk_id] = 1;
+
+ p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;
+
+ i = 0;
+
+ while (p_zcell_dn) {
+ p_zcell_cfg = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;
+
+ if (p_zcell_cfg->is_used) {
+ if (!(p_zcell_cfg->flag & ZXDH_ZCELL_FLAG_IS_MONO)) {
+ p_zcell_cfg->flag |= ZXDH_ZCELL_FLAG_IS_MONO;
+ p_zcell_cfg->bulk_id = bulk_id;
+
+ p_bulk_zcam_mono->zcell_mono_idx[p_zcell_cfg->zcell_idx] =
+ p_zcell_cfg->zcell_idx;
+
+ if (++i >= zcell_num)
+ break;
+ }
+ } else {
+ PMD_DRV_LOG(ERR, "zcell[ %d ] is not init before"
+ " used!", p_zcell_cfg->zcell_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_zcell_dn = p_zcell_dn->next;
+ }
+
+ if (i < zcell_num)
+ PMD_DRV_LOG(ERR, "Input param 'zcell_num' is [ %d ],"
+ "actually bulk[ %d ]monopolize zcells is [ %d ]!",
+ zcell_num, bulk_id, i);
+ }
+
+ if (zreg_num > 0) {
+ p_hash_cfg->bulk_ram_mono[bulk_id] = 1;
+
+ p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;
+ j = 0;
+
+ while (p_zblk_dn) {
+ p_zblk_cfg = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;
+ zblk_idx = p_zblk_cfg->zblk_idx;
+
+ if (p_zblk_cfg->is_used) {
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {
+ p_zreg_cfg = &p_zblk_cfg->zreg_info[i];
+
+ if (!(p_zreg_cfg->flag & ZXDH_ZREG_FLAG_IS_MONO)) {
+ p_zreg_cfg->flag = ZXDH_ZREG_FLAG_IS_MONO;
+ p_zreg_cfg->bulk_id = bulk_id;
+
+ p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zblk_id =
+ zblk_idx;
+ p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zreg_id = i;
+
+ if (++j >= zreg_num)
+ break;
+ }
+ }
+
+ if (j >= zreg_num)
+ break;
+ } else {
+ PMD_DRV_LOG(ERR, "zblk [ %d ] is not init"
+ " before used!", p_zblk_cfg->zblk_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_zblk_dn = p_zblk_dn->next;
+ }
+
+ if (j < zreg_num)
+ PMD_DRV_LOG(ERR, "Input param 'zreg_num' is [ %d ],"
+ "actually bulk[ %d ]monopolize zregs is [ %d ]!",
+ zreg_num, bulk_id, j);
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
+ ZXDH_APT_HASH_BULK_RES_T *p_bulk_res)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t index = 0;
+ ZXDH_APT_HASH_BULK_RES_T *p_hash_bulk_res_temp = NULL;
+ ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ p_se_cfg = g_apt_se_cfg[dev_id];
+
+ for (index = 0; index < bulk_num; index++) {
+ memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));
+ p_hash_bulk_res_temp = p_bulk_res + index;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_bulk_res_temp);
+
+ ddr_resc_cfg.ddr_baddr = p_hash_bulk_res_temp->ddr_baddr;
+ ddr_resc_cfg.ddr_item_num = p_hash_bulk_res_temp->ddr_item_num;
+ ddr_resc_cfg.ddr_width_mode = p_hash_bulk_res_temp->ddr_width_mode;
+ ddr_resc_cfg.ddr_crc_sel = p_hash_bulk_res_temp->ddr_crc_sel;
+ ddr_resc_cfg.ddr_ecc_en = p_hash_bulk_res_temp->ddr_ecc_en;
+
+ rc = zxdh_np_hash_bulk_init(p_se_cfg,
+ p_hash_bulk_res_temp->func_id,
+ p_hash_bulk_res_temp->bulk_id,
+ &ddr_resc_cfg,
+ p_hash_bulk_res_temp->zcell_num,
+ p_hash_bulk_res_temp->zreg_num);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_bulk_init");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_se_res_init(uint32_t dev_id, uint32_t type)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_APT_SE_RES_T *p_se_res = NULL;
+ ZXDH_APT_HASH_RES_INIT_T hash_res_init = {0};
+
+ p_se_res = (ZXDH_APT_SE_RES_T *)zxdh_np_dev_get_se_res_ptr(dev_id, type);
+ if (!p_se_res->valid) {
+ PMD_DRV_LOG(ERR, "%s dev_id[0x%x],se_type[0x%x] invlaid!",
+ __func__, dev_id, type);
+ return ZXDH_ERR;
+ }
+
+ hash_res_init.func_num = p_se_res->hash_func_num;
+ hash_res_init.bulk_num = p_se_res->hash_bulk_num;
+ hash_res_init.func_res = p_se_res->hash_func;
+ hash_res_init.bulk_res = p_se_res->hash_bulk;
+
+ rc = zxdh_np_apt_hash_global_res_init(dev_id);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_global_res_init");
+
+ if (hash_res_init.func_num) {
+ rc = zxdh_np_apt_hash_func_res_init(dev_id, hash_res_init.func_num,
+ hash_res_init.func_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_func_res_init");
+ }
+
+ if (hash_res_init.bulk_num) {
+ rc = zxdh_np_apt_hash_bulk_res_init(dev_id, hash_res_init.bulk_num,
+ hash_res_init.bulk_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_bulk_res_init");
+ }
+
+ return rc;
+}
+
uint32_t
zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
{
@@ -5723,5 +6518,8 @@ zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
rc = zxdh_np_agent_se_res_get(dev_id, type);
ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_se_res_get");
+ rc = zxdh_np_se_res_init(dev_id, type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_res_init");
+
return rc;
}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 39e31b12f7..31d4af2c05 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -136,6 +136,43 @@
#define ZXDH_ETCAM_MAX_NUM (8)
#define ZXDH_ETCAM_BLOCK_NUM (8)
+#define ZXDH_SE_RAM_DEPTH (512)
+#define ZXDH_SE_ZCELL_NUM (4)
+#define ZXDH_SE_ZREG_NUM (4)
+#define ZXDH_SE_ALG_BANK_NUM (29)
+#define ZXDH_SE_ZBLK_NUM (32)
+#define ZXDH_MAX_FUN_NUM (8)
+#define ZXDH_HASH_KEY_MAX (49)
+#define ZXDH_HASH_RST_MAX (32)
+#define ZXDH_HASH_TBL_ID_NUM (32)
+#define ZXDH_HASH_BULK_NUM (8)
+#define ZXDH_HASH_CMP_ZCELL (1)
+#define ZXDH_HASH_CMP_ZBLK (2)
+#define ZXDH_HASH_FUNC_ID_NUM (4)
+#define ZXDH_ZCELL_FLAG_IS_MONO (1)
+#define ZXDH_ZREG_FLAG_IS_MONO (1)
+#define ZXDH_HASH_DDR_CRC_NUM (4)
+#define ZXDH_HASH_TBL_FLAG_AGE (1 << 0)
+#define ZXDH_HASH_TBL_FLAG_LEARN (1 << 1)
+#define ZXDH_HASH_TBL_FLAG_MC_WRT (1 << 2)
+#define ZXDH_HASH_ACTU_KEY_STEP (1)
+#define ZXDH_HASH_KEY_CTR_SIZE (1)
+#define ZXDH_ZCELL_IDX_BT_WIDTH (2)
+#define ZXDH_ZBLK_IDX_BT_WIDTH (3)
+#define ZXDH_ZGRP_IDX_BT_WIDTH (2)
+#define ZXDH_HASH_ENTRY_POS_STEP (16)
+#define ZXDH_HASH_TBL_ID_NUM (32)
+#define ZXDH_SE_ITEM_WIDTH_MAX (64)
+#define ZXDH_SE_ENTRY_WIDTH_MAX (64)
+#define ZXDH_REG_SRAM_FLAG_BT_START (16)
+#define ZXDH_ZBLK_NUM_PER_ZGRP (8)
+#define ZXDH_ZBLK_IDX_BT_START (11)
+#define ZXDH_ZBLK_WRT_MASK_BT_START (17)
+#define ZXDH_ZCELL_ADDR_BT_WIDTH (9)
+
+#define ZXDH_COMM_PTR_TO_VAL(p) ((uint64_t)(p))
+#define ZXDH_COMM_VAL_TO_PTR(v) ((void *)((uint64_t)(v)))
+
/**errco code */
#define ZXDH_RC_BASE (0x1000U)
#define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200)
@@ -249,6 +286,11 @@
#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)
+#define ZXDH_SE_RC_CFG_BASE (ZXDH_SE_RC_BASE | 0x1000)
+#define ZXDH_SE_RC_ZBLK_FULL (ZXDH_SE_RC_CFG_BASE | 0x1)
+#define ZXDH_SE_RC_FUN_INVALID (ZXDH_SE_RC_CFG_BASE | 0x2)
+#define ZXDH_SE_RC_PARA_INVALID (ZXDH_SE_RC_CFG_BASE | 0x3)
+
typedef enum zxdh_module_base_addr_e {
ZXDH_MODULE_SE_SMMU0_BASE_ADDR = 0x00000000,
ZXDH_MODULE_DTB_ENQ_BASE_ADDR = 0x00000000,
@@ -377,6 +419,13 @@ typedef struct zxdh_rb_tn {
} ZXDH_RB_TN;
typedef int32_t (*ZXDH_RB_CMPFUN)(void *p_new, void *p_old, uint32_t keysize);
+typedef int32_t (*ZXDH_CMP_FUNC)(ZXDH_D_NODE *data1, ZXDH_D_NODE *data2, void*);
+typedef uint32_t (*ZXDH_WRITE32_FUN)(uint32_t dev_id, uint32_t addr, uint32_t write_data);
+typedef uint32_t (*ZXDH_READ32_FUN) (uint32_t dev_id, uint32_t addr, uint32_t *read_data);
+typedef uint32_t (*ZXDH_LPM_AS_RSLT_WRT_FUNCTION)(uint32_t dev_id,
+ uint32_t as_type, uint32_t tbl_id, uint32_t index, uint8_t *p_data);
+typedef uint16_t (*ZXDH_HASH_FUNCTION)(uint8_t *pkey, uint32_t width, uint16_t arg);
+typedef uint32_t (*ZXDH_HASH_FUNCTION32)(uint8_t *pkey, uint32_t width, uint32_t arg);
typedef struct _rb_cfg {
uint32_t key_size;
@@ -390,6 +439,217 @@ typedef struct _rb_cfg {
uint32_t is_init;
} ZXDH_RB_CFG;
+typedef enum zxdh_se_fun_type_e {
+ ZXDH_FUN_HASH = 1,
+ ZXDH_FUN_LPM,
+ ZXDH_FUN_ACL,
+ ZXDH_FUN_MAX
+} ZXDH_SE_FUN_TYPE;
+
+typedef struct zxdh_avl_node_t {
+ void *p_key;
+ uint32_t result;
+ int32_t avl_height;
+ struct zxdh_avl_node_t *p_avl_left;
+ struct zxdh_avl_node_t *p_avl_right;
+ ZXDH_D_NODE avl_node_list;
+} ZXDH_AVL_NODE;
+
+typedef struct zxdh_se_item_cfg_t {
+ ZXDH_D_HEAD item_list;
+ uint32_t item_index;
+ uint32_t hw_addr;
+ uint32_t bulk_id;
+ uint32_t item_type;
+ uint8_t wrt_mask;
+ uint8_t valid;
+ uint8_t pad[2];
+} ZXDH_SE_ITEM_CFG;
+
+typedef struct zxdh_se_zcell_cfg_t {
+ uint8_t flag;
+ uint32_t bulk_id;
+ uint32_t zcell_idx;
+ uint16_t mask_len;
+ uint8_t is_used;
+ uint8_t is_share;
+ uint32_t item_used;
+ ZXDH_SE_ITEM_CFG item_info[ZXDH_SE_RAM_DEPTH];
+ ZXDH_D_NODE zcell_dn;
+ ZXDH_AVL_NODE zcell_avl;
+} ZXDH_SE_ZCELL_CFG;
+
+typedef struct zxdh_se_zreg_cfg_t {
+ uint8_t flag;
+ uint8_t pad[3];
+ uint32_t bulk_id;
+ ZXDH_SE_ITEM_CFG item_info;
+} ZXDH_SE_ZREG_CFG;
+
+typedef struct zxdh_se_zblk_cfg_t {
+ uint32_t zblk_idx;
+ uint16_t is_used;
+ uint16_t zcell_bm;
+ uint16_t hash_arg;
+ uint16_t pad;
+ ZXDH_SE_ZCELL_CFG zcell_info[ZXDH_SE_ZCELL_NUM];
+ ZXDH_SE_ZREG_CFG zreg_info[ZXDH_SE_ZREG_NUM];
+ ZXDH_D_NODE zblk_dn;
+} ZXDH_SE_ZBLK_CFG;
+
+typedef struct zxdh_func_id_info_t {
+ void *fun_ptr;
+ uint8_t fun_type;
+ uint8_t fun_id;
+ uint8_t is_used;
+ uint8_t pad;
+} ZXDH_FUNC_ID_INFO;
+
+typedef struct zxdh_ddr_mem_t {
+ uint32_t total_num;
+ uint32_t base_addr;
+ uint32_t base_addr_offset;
+ uint32_t ecc_en;
+ uint32_t bank_num;
+ uint32_t bank_info[ZXDH_SE_ALG_BANK_NUM];
+ uint32_t share_type;
+ uint32_t item_used;
+ ZXDH_LISTSTACK_MANAGER *p_ddr_mng;
+} ZXDH_DDR_MEM;
+
+typedef struct zxdh_share_ram_t {
+ uint32_t zblk_array[ZXDH_SE_ZBLK_NUM];
+ ZXDH_D_HEAD zblk_list;
+ ZXDH_D_HEAD zcell_free_list;
+ uint32_t def_route_num;
+ ZXDH_RB_CFG def_rb;
+ struct def_route_info *p_dr_info;
+ ZXDH_DDR_MEM ddr4_info;
+ ZXDH_DDR_MEM ddr6_info;
+} ZXDH_SHARE_RAM;
+
+typedef struct zxdh_se_cfg_t {
+ ZXDH_SE_ZBLK_CFG zblk_info[ZXDH_SE_ZBLK_NUM];
+ ZXDH_FUNC_ID_INFO fun_info[ZXDH_MAX_FUN_NUM];
+ ZXDH_SHARE_RAM route_shareram;
+ uint32_t reg_base;
+ ZXDH_WRITE32_FUN p_write32_fun;
+ ZXDH_READ32_FUN p_read32_fun;
+ uint32_t lpm_flags;
+ void *p_client;
+ uint32_t dev_id;
+ ZXDH_LPM_AS_RSLT_WRT_FUNCTION p_as_rslt_wrt_fun;
+} ZXDH_SE_CFG;
+
+typedef struct hash_ddr_cfg_t {
+ uint32_t bulk_use;
+ uint32_t ddr_baddr;
+ uint32_t ddr_ecc_en;
+ uint32_t item_num;
+ uint32_t bulk_id;
+ uint32_t hash_ddr_arg;
+ uint32_t width_mode;
+ uint32_t hw_baddr;
+ uint32_t zcell_num;
+ uint32_t zreg_num;
+ ZXDH_SE_ITEM_CFG **p_item_array;
+} HASH_DDR_CFG;
+
+typedef struct zxdh_hash_tbl_info_t {
+ uint32_t fun_id;
+ uint32_t actu_key_size;
+ uint32_t key_type;
+ uint8_t is_init;
+ uint8_t mono_zcell;
+ uint8_t zcell_num;
+ uint8_t mono_zreg;
+ uint8_t zreg_num;
+ uint8_t is_age;
+ uint8_t is_lrn;
+ uint8_t is_mc_wrt;
+} ZXDH_HASH_TBL_ID_INFO;
+
+typedef struct zxdh_hash_rbkey_info_t {
+ uint8_t key[ZXDH_HASH_KEY_MAX];
+ uint8_t rst[ZXDH_HASH_RST_MAX];
+ ZXDH_D_NODE entry_dn;
+ ZXDH_SE_ITEM_CFG *p_item_info;
+ uint32_t entry_size;
+ uint32_t entry_pos;
+} ZXDH_HASH_RBKEY_INFO;
+
+typedef struct zxdh_hash_table_stat_t {
+ float ddr;
+ float zcell;
+ float zreg;
+ float sum;
+} ZXDH_HASH_TABLE_STAT;
+
+typedef struct zxdh_hash_zreg_mono_stat_t {
+ uint32_t zblk_id;
+ uint32_t zreg_id;
+} ZXDH_HASH_ZREG_MONO_STAT;
+
+typedef struct zxdh_hash_bulk_zcam_stat_t {
+ uint32_t zcell_mono_idx[ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM];
+ ZXDH_HASH_ZREG_MONO_STAT zreg_mono_id[ZXDH_SE_ZBLK_NUM][ZXDH_SE_ZREG_NUM];
+} ZXDH_HASH_BULK_ZCAM_STAT;
+
+typedef struct zxdh_hash_stat_t {
+ uint32_t insert_ok;
+ uint32_t insert_fail;
+ uint32_t insert_same;
+ uint32_t insert_ddr;
+ uint32_t insert_zcell;
+ uint32_t insert_zreg;
+ uint32_t delete_ok;
+ uint32_t delete_fail;
+ uint32_t search_ok;
+ uint32_t search_fail;
+ uint32_t zblock_num;
+ uint32_t zblock_array[ZXDH_SE_ZBLK_NUM];
+ ZXDH_HASH_TABLE_STAT insert_table[ZXDH_HASH_TBL_ID_NUM];
+ ZXDH_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono[ZXDH_HASH_BULK_NUM];
+} ZXDH_HASH_STAT;
+
+typedef struct zxdh_hash_cfg_t {
+ uint32_t fun_id;
+ uint8_t ddr_valid;
+ uint8_t pad[3];
+ ZXDH_HASH_FUNCTION32 p_hash32_fun;
+ ZXDH_HASH_FUNCTION p_hash16_fun;
+ HASH_DDR_CFG *p_bulk_ddr_info[ZXDH_HASH_BULK_NUM];
+ uint8_t bulk_ram_mono[ZXDH_HASH_BULK_NUM];
+ ZXDH_SHARE_RAM hash_shareram;
+ ZXDH_SE_CFG *p_se_info;
+ ZXDH_RB_CFG hash_rb;
+ ZXDH_RB_CFG ddr_cfg_rb;
+ ZXDH_HASH_STAT hash_stat;
+} ZXDH_HASH_CFG;
+
+typedef struct hash_entry_cfg_t {
+ uint32_t fun_id;
+ uint8_t bulk_id;
+ uint8_t table_id;
+ uint8_t key_type;
+ uint8_t rsp_mode;
+ uint32_t actu_key_size;
+ uint32_t key_by_size;
+ uint32_t rst_by_size;
+ ZXDH_SE_CFG *p_se_cfg;
+ ZXDH_HASH_CFG *p_hash_cfg;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new;
+ ZXDH_RB_TN *p_rb_tn_new;
+} HASH_ENTRY_CFG;
+
+typedef struct zxdh_hash_ddr_resc_cfg_t {
+ uint32_t ddr_width_mode;
+ uint32_t ddr_crc_sel;
+ uint32_t ddr_item_num;
+ uint32_t ddr_baddr;
+ uint32_t ddr_ecc_en;
+} ZXDH_HASH_DDR_RESC_CFG_T;
+
typedef struct zxdh_dtb_tab_up_user_addr_t {
uint32_t user_flag;
uint64_t phy_addr;
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 90949 bytes --]
next prev parent reply other threads:[~2025-02-10 2:02 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-10 1:44 [PATCH v1 01/14] net/zxdh: add network processor registers ops Bingbin Chen
2025-02-10 1:46 ` [PATCH v1 02/14] net/zxdh: support compatibility check Bingbin Chen
2025-02-10 17:25 ` Stephen Hemminger
2025-02-10 1:47 ` [PATCH v1 03/14] net/zxdh: add agent channel Bingbin Chen
2025-02-10 17:28 ` Stephen Hemminger
2025-02-10 17:30 ` Stephen Hemminger
2025-02-10 17:31 ` Stephen Hemminger
2025-02-10 18:23 ` Stephen Hemminger
2025-02-10 1:47 ` [PATCH v1 04/14] net/zxdh: modify dtb queue ops Bingbin Chen
2025-02-10 17:31 ` Stephen Hemminger
2025-02-10 1:48 ` [PATCH v1 05/14] net/zxdh: add tables dump address ops Bingbin Chen
2025-02-10 17:33 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
2025-02-10 1:50 ` [PATCH v1 07/14] net/zxdh: get flow tables resources Bingbin Chen
2025-02-10 17:35 ` Stephen Hemminger
2025-02-10 17:35 ` Stephen Hemminger
2025-02-10 1:50 ` Bingbin Chen [this message]
2025-02-10 17:36 ` [PATCH v1 08/14] net/zxdh: support hash resources configuration Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 09/14] net/zxdh: implement tables initialization Bingbin Chen
2025-02-10 17:40 ` Stephen Hemminger
2025-02-10 17:43 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 10/14] net/zxdh: support hash tables write and delete ops Bingbin Chen
2025-02-10 17:45 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 11/14] net/zxdh: get hash table entry result Bingbin Chen
2025-02-10 17:46 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 12/14] net/zxdh: delete all hash entries Bingbin Chen
2025-02-10 17:47 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 13/14] net/zxdh: add acl tables ops Bingbin Chen
2025-02-10 1:50 ` [PATCH v1 14/14] net/zxdh: clean stat values Bingbin Chen
2025-02-10 17:50 ` Stephen Hemminger
2025-02-10 17:50 ` Stephen Hemminger
2025-02-10 18:19 ` Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250210015017.4105624-3-chen.bingbin@zte.com.cn \
--to=chen.bingbin@zte.com.cn \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).