Implement hash/eram/acl/stat tables initialization. Signed-off-by: Bingbin Chen --- drivers/net/zxdh/zxdh_np.c | 713 ++++++++++++++++++++++++++++++++++++- drivers/net/zxdh/zxdh_np.h | 187 ++++++++++ 2 files changed, 895 insertions(+), 5 deletions(-) diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c index bcae32e94e..3de6330271 100644 --- a/drivers/net/zxdh/zxdh_np.c +++ b/drivers/net/zxdh/zxdh_np.c @@ -23,7 +23,10 @@ ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX]; ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX]; ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX]; ZXDH_SDT_TBL_DATA_T g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX]; -ZXDH_PPU_STAT_CFG_T g_ppu_stat_cfg; +ZXDH_PPU_STAT_CFG_T g_ppu_stat_cfg[ZXDH_DEV_CHANNEL_MAX]; +SE_APT_CALLBACK_T g_apt_se_callback[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX]; +ZXDH_ACL_CFG_EX_T g_apt_acl_cfg[ZXDH_DEV_CHANNEL_MAX] = {0}; +ZXDH_ACL_CFG_EX_T *g_p_acl_ex_cfg[ZXDH_DEV_CHANNEL_MAX] = {NULL}; 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} }; @@ -54,6 +57,10 @@ static uint32_t g_ddr_hash_arg[ZXDH_HASH_DDR_CRC_NUM] = { 0x00210801 }; +ZXDH_HASH_TBL_ID_INFO g_tbl_id_info[ZXDH_DEV_CHANNEL_MAX] + [ZXDH_HASH_FUNC_ID_NUM] + [ZXDH_HASH_TBL_ID_NUM]; + ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = { {"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, {"cpu_ind_rd_mode", ZXDH_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, @@ -550,6 +557,49 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn) #define GET_DDR_HASH_ARG(ddr_crc_sel) (g_ddr_hash_arg[ddr_crc_sel]) +#define ZXDH_SDT_GET_LOW_DATA(source_value, low_width) \ + ((source_value) & ((1 << (low_width)) - 1)) + +#define ZXDH_ACL_AS_RSLT_SIZE_GET_EX(mode) (2U << (mode)) + +#define ZXDH_GET_ACTU_KEY_BY_SIZE(actu_key_size) \ + ((actu_key_size) * ZXDH_HASH_ACTU_KEY_STEP) + +#define ZXDH_GET_KEY_SIZE(actu_key_size) \ + (ZXDH_GET_ACTU_KEY_BY_SIZE(actu_key_size) + ZXDH_HASH_KEY_CTR_SIZE) + +#define ZXDH_ACL_ENTRY_MAX_GET(key_mode, block_num) \ + ((block_num) * ZXDH_ETCAM_RAM_DEPTH * (1U << (key_mode))) + +#define ZXDH_ETCAM_ENTRY_SIZE_GET(entry_mode) \ + ((ZXDH_ETCAM_RAM_WIDTH << (3 - (entry_mode))) / 8) + +#define ZXDH_ACL_KEYSIZE_GET(key_mode) (2 * ZXDH_ETCAM_ENTRY_SIZE_GET(key_mode)) + +#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id]) + +static inline uint32_t +zxdh_np_get_hash_entry_size(uint32_t key_type) +{ + return ((key_type == ZXDH_HASH_KEY_128b) ? 16U : ((key_type == ZXDH_HASH_KEY_256b) ? 32U : + ((key_type == ZXDH_HASH_KEY_512b) ? 64U : 0))); +} + +#define ZXDH_GET_HASH_ENTRY_SIZE(key_type) \ + zxdh_np_get_hash_entry_size(key_type) + +static inline void +zxdh_np_comm_uint32_write_bits(uint32_t *_dst_, uint32_t _src_, + uint32_t _start_pos_, uint32_t _len_) +{ + (*_dst_) = + ((*_dst_) & ~(ZXDH_COMM_GET_BIT_MASK(uint32_t, (_len_)) << (_start_pos_))) | + (((_src_) & ZXDH_COMM_GET_BIT_MASK(uint32_t, (_len_))) << (_start_pos_)); +} + +#define ZXDH_COMM_UINT32_WRITE_BITS(_dst_, _src_, _start_pos_, _len_)\ + zxdh_np_comm_uint32_write_bits(&(_dst_), _src_, _start_pos_, _len_) + static uint32_t zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex) { @@ -2225,6 +2275,244 @@ zxdh_np_sdt_init(uint32_t dev_num, uint32_t *dev_id_array) return rc; } +static uint32_t +zxdh_np_sdt_mgr_sdt_item_add(uint32_t dev_id, uint32_t sdt_no, + uint32_t sdt_hig32, uint32_t sdt_low32) +{ + ZXDH_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL; + ZXDH_SDT_ITEM_T *p_sdt_item = NULL; + + p_sdt_soft_tbl = ZXDH_SDT_SOFT_TBL_GET(dev_id); + + if (p_sdt_soft_tbl == NULL) { + PMD_DRV_LOG(ERR, "Error: %s soft sdt table not Init!", __func__); + RTE_ASSERT(0); + return ZXDH_RC_TABLE_SDT_MGR_INVALID; + } + + if (dev_id != p_sdt_soft_tbl->device_id) { + PMD_DRV_LOG(ERR, + "Error: %s soft sdt table Item Invalid!", __func__); + RTE_ASSERT(0); + return ZXDH_RC_TABLE_PARA_INVALID; + } + + p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no]; + p_sdt_item->valid = ZXDH_SDT_VALID; + p_sdt_item->table_cfg[0] = sdt_hig32; + p_sdt_item->table_cfg[1] = sdt_low32; + + PMD_DRV_LOG(DEBUG, "%s 0x%08x 0x%08x", __func__, + p_sdt_item->table_cfg[0], p_sdt_item->table_cfg[1]); + + return ZXDH_OK; +} + +static uint32_t +zxdh_np_sdt_mgr_sdt_item_del(uint32_t dev_id, uint32_t sdt_no) +{ + ZXDH_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL; + ZXDH_SDT_ITEM_T *p_sdt_item = NULL; + + p_sdt_soft_tbl = ZXDH_SDT_SOFT_TBL_GET(dev_id); + + if (p_sdt_soft_tbl != NULL) { + if (dev_id != p_sdt_soft_tbl->device_id) { + PMD_DRV_LOG(ERR, + "Error: %s Soft Table Item Invalid !", __func__); + RTE_ASSERT(0); + return ZXDH_RC_TABLE_PARA_INVALID; + } + + p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no]; + p_sdt_item->valid = ZXDH_SDT_INVALID; + p_sdt_item->table_cfg[0] = 0; + p_sdt_item->table_cfg[1] = 0; + } + PMD_DRV_LOG(DEBUG, "%s sdt_no: 0x%08x", __func__, sdt_no); + return ZXDH_OK; +} + +static void +zxdh_np_soft_sdt_tbl_set(uint32_t dev_id, + uint32_t sdt_no, + uint32_t table_type, + ZXDH_SDT_TBL_DATA_T *p_sdt_info) +{ + g_table_type[dev_id][sdt_no] = table_type; + g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32; + g_sdt_info[dev_id][sdt_no].data_low32 = p_sdt_info->data_low32; +} + +static uint32_t +zxdh_np_sdt_tbl_write(uint32_t dev_id, + uint32_t sdt_no, + uint32_t table_type, + void *p_sdt_info, + uint32_t opr_type) +{ + uint32_t rtn = 0; + + ZXDH_SDT_TBL_DATA_T sdt_tbl = {0}; + ZXDH_SDT_TBL_ERAM_T *p_sdt_eram = NULL; + ZXDH_SDT_TBL_HASH_T *p_sdt_hash = NULL; + ZXDH_SDT_TBL_ETCAM_T *p_sdt_etcam = NULL; + ZXDH_SDT_TBL_PORT_TBL_T *p_sdt_porttbl = NULL; + + if (opr_type) { + zxdh_np_soft_sdt_tbl_set(dev_id, sdt_no, 0, &sdt_tbl); + + rtn = zxdh_np_sdt_mgr_sdt_item_del(dev_id, sdt_no); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_sdt_mgr_sdt_item_del"); + } else { + switch (table_type) { + case ZXDH_SDT_TBLT_ERAM: + { + p_sdt_eram = (ZXDH_SDT_TBL_ERAM_T *)p_sdt_info; + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_eram->eram_mode, + ZXDH_SDT_H_ERAM_MODE_BT_POS, + ZXDH_SDT_H_ERAM_MODE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_eram->eram_base_addr, + ZXDH_SDT_H_ERAM_BASE_ADDR_BT_POS, + ZXDH_SDT_H_ERAM_BASE_ADDR_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_eram->eram_table_depth, + ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_POS, + ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_eram->eram_clutch_en, + ZXDH_SDT_L_CLUTCH_EN_BT_POS, + ZXDH_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case ZXDH_SDT_TBLT_HASH: + { + p_sdt_hash = (ZXDH_SDT_TBL_HASH_T *)p_sdt_info; + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_hash->hash_id, + ZXDH_SDT_H_HASH_ID_BT_POS, + ZXDH_SDT_H_HASH_ID_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_hash->hash_table_width, + ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_POS, + ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_hash->key_size, + ZXDH_SDT_H_HASH_KEY_SIZE_BT_POS, + ZXDH_SDT_H_HASH_KEY_SIZE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_hash->hash_table_id, + ZXDH_SDT_H_HASH_TABLE_ID_BT_POS, + ZXDH_SDT_H_HASH_TABLE_ID_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_hash->learn_en, + ZXDH_SDT_H_LEARN_EN_BT_POS, + ZXDH_SDT_H_LEARN_EN_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_hash->keep_alive, + ZXDH_SDT_H_KEEP_ALIVE_BT_POS, + ZXDH_SDT_H_KEEP_ALIVE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + ((p_sdt_hash->keep_alive_baddr) >> + ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN), + ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_POS, + ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + ZXDH_SDT_GET_LOW_DATA((p_sdt_hash->keep_alive_baddr), + ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN), + ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_POS, + ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_hash->rsp_mode, + ZXDH_SDT_L_RSP_MODE_BT_POS, + ZXDH_SDT_L_RSP_MODE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_hash->hash_clutch_en, + ZXDH_SDT_L_CLUTCH_EN_BT_POS, + ZXDH_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case ZXDH_SDT_TBLT_ETCAM: + { + p_sdt_etcam = (ZXDH_SDT_TBL_ETCAM_T *)p_sdt_info; + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_etcam->etcam_id, + ZXDH_SDT_H_ETCAM_ID_BT_POS, + ZXDH_SDT_H_ETCAM_ID_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_etcam->etcam_key_mode, + ZXDH_SDT_H_ETCAM_KEY_MODE_BT_POS, + ZXDH_SDT_H_ETCAM_KEY_MODE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_etcam->etcam_table_id, + ZXDH_SDT_H_ETCAM_TABLE_ID_BT_POS, + ZXDH_SDT_H_ETCAM_TABLE_ID_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_etcam->no_as_rsp_mode, + ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS, + ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + p_sdt_etcam->as_en, + ZXDH_SDT_H_ETCAM_AS_EN_BT_POS, + ZXDH_SDT_H_ETCAM_AS_EN_BT_LEN); + + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + ((p_sdt_etcam->as_eram_baddr) >> + ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN), + ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS, + ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + ZXDH_SDT_GET_LOW_DATA((p_sdt_etcam->as_eram_baddr), + ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN), + ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS, + ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN); + + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_etcam->as_rsp_mode, + ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_POS, + ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_etcam->etcam_table_depth, ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_POS, + ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN); + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_etcam->etcam_clutch_en, ZXDH_SDT_L_CLUTCH_EN_BT_POS, + ZXDH_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case ZXDH_SDT_TBLT_PORTTBL: + { + p_sdt_porttbl = (ZXDH_SDT_TBL_PORT_TBL_T *)p_sdt_info; + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + p_sdt_porttbl->porttbl_clutch_en, ZXDH_SDT_L_CLUTCH_EN_BT_POS, + ZXDH_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + default: + { + PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", + table_type); + return ZXDH_ERR; + } + } + + ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, table_type, + ZXDH_SDT_H_TBL_TYPE_BT_POS, ZXDH_SDT_H_TBL_TYPE_BT_LEN); + + zxdh_np_soft_sdt_tbl_set(dev_id, sdt_no, table_type, &sdt_tbl); + + rtn = zxdh_np_sdt_mgr_sdt_item_add(dev_id, sdt_no, sdt_tbl.data_high32, + sdt_tbl.data_low32); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_sdt_mgr_sdt_item_add"); + } + + return ZXDH_OK; +} + static void zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id, uint32_t bitmap) @@ -4490,10 +4778,10 @@ zxdh_np_stat_cfg_soft_get(uint32_t dev_id, { ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_stat_cfg); - p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg.ddr_base_addr; - p_stat_cfg->eram_baddr = g_ppu_stat_cfg.eram_baddr; - p_stat_cfg->eram_depth = g_ppu_stat_cfg.eram_depth; - p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg.ppu_addr_offset; + p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[dev_id].ddr_base_addr; + p_stat_cfg->eram_baddr = g_ppu_stat_cfg[dev_id].eram_baddr; + p_stat_cfg->eram_depth = g_ppu_stat_cfg[dev_id].eram_depth; + p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[dev_id].ppu_addr_offset; } static uint32_t @@ -6473,12 +6761,401 @@ zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num, return rc; } +static uint32_t +zxdh_np_apt_set_callback(uint32_t dev_id, uint32_t sdt_no, uint32_t table_type, void *p_data) +{ + SE_APT_CALLBACK_T *apt_func = NULL; + + apt_func = &g_apt_se_callback[dev_id][sdt_no]; + + apt_func->sdt_no = sdt_no; + apt_func->table_type = table_type; + switch (table_type) { + case ZXDH_SDT_TBLT_ERAM: + { + apt_func->se_func_info.eram_func.opr_mode = + ((ZXDH_APT_ERAM_TABLE_T *)p_data)->opr_mode; + apt_func->se_func_info.eram_func.rd_mode = + ((ZXDH_APT_ERAM_TABLE_T *)p_data)->rd_mode; + apt_func->se_func_info.eram_func.eram_set_func = + ((ZXDH_APT_ERAM_TABLE_T *)p_data)->eram_set_func; + apt_func->se_func_info.eram_func.eram_get_func = + ((ZXDH_APT_ERAM_TABLE_T *)p_data)->eram_get_func; + break; + } + + case ZXDH_SDT_TBLT_HASH: + { + apt_func->se_func_info.hash_func.sdt_partner = + ((ZXDH_APT_HASH_TABLE_T *)p_data)->sdt_partner; + apt_func->se_func_info.hash_func.hash_set_func = + ((ZXDH_APT_HASH_TABLE_T *)p_data)->hash_set_func; + apt_func->se_func_info.hash_func.hash_get_func = + ((ZXDH_APT_HASH_TABLE_T *)p_data)->hash_get_func; + break; + } + + case ZXDH_SDT_TBLT_ETCAM: + { + apt_func->se_func_info.acl_func.sdt_partner = + ((ZXDH_APT_ACL_TABLE_T *)p_data)->sdt_partner; + apt_func->se_func_info.acl_func.acl_set_func = + ((ZXDH_APT_ACL_TABLE_T *)p_data)->acl_set_func; + apt_func->se_func_info.acl_func.acl_get_func = + ((ZXDH_APT_ACL_TABLE_T *)p_data)->acl_get_func; + break; + } + + default: + { + PMD_DRV_LOG(ERR, "zxdh_np_apt_se_set_callback table_type[ %d ]" + "is invalid!", table_type); + return ZXDH_ERR; + } + } + + return ZXDH_OK; +} + +static uint32_t +zxdh_np_hash_tbl_id_info_init(ZXDH_SE_CFG *p_se_cfg, + uint32_t fun_id, + uint32_t tbl_id, + uint32_t tbl_flag, + uint32_t key_type, + uint32_t actu_key_size) +{ + uint32_t key_by_size = 0; + uint32_t entry_size = 0; + + uint32_t dev_id = 0; + + ZXDH_HASH_TBL_ID_INFO *p_tbl_id_info = NULL; + + dev_id = p_se_cfg->dev_id; + key_by_size = ZXDH_GET_KEY_SIZE(actu_key_size); + entry_size = ZXDH_GET_HASH_ENTRY_SIZE(key_type); + + if (key_by_size > entry_size) { + PMD_DRV_LOG(ERR, "ErrorCode[%x]: actu_key_size[%d] not match to key_type[%d].", + ZXDH_HASH_RC_INVALID_PARA, + key_by_size, + entry_size); + RTE_ASSERT(0); + return ZXDH_HASH_RC_INVALID_PARA; + } + + p_tbl_id_info = GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id); + + if (p_tbl_id_info->is_init) { + PMD_DRV_LOG(ERR, "fun_id[%d], table_id[%d] is already init," + "do not init again!", fun_id, tbl_id); + return ZXDH_OK; + } + + p_tbl_id_info->fun_id = fun_id; + p_tbl_id_info->actu_key_size = actu_key_size; + p_tbl_id_info->key_type = key_type; + p_tbl_id_info->is_init = 1; + + if (tbl_flag & ZXDH_HASH_TBL_FLAG_AGE) + p_tbl_id_info->is_age = 1; + + if (tbl_flag & ZXDH_HASH_TBL_FLAG_LEARN) + p_tbl_id_info->is_lrn = 1; + + if (tbl_flag & ZXDH_HASH_TBL_FLAG_MC_WRT) + p_tbl_id_info->is_mc_wrt = 1; + + return ZXDH_OK; +} + +static uint32_t +zxdh_np_apt_hash_tbl_res_init(uint32_t dev_id, uint32_t tbl_num, + ZXDH_APT_HASH_TABLE_T *p_hash_tbl) +{ + uint32_t rc = ZXDH_OK; + uint32_t index = 0; + ZXDH_APT_HASH_TABLE_T *p_hash_tbl_temp = NULL; + ZXDH_SE_CFG *p_se_cfg = NULL; + + p_se_cfg = g_apt_se_cfg[dev_id]; + + for (index = 0; index < tbl_num; index++) { + p_hash_tbl_temp = p_hash_tbl + index; + ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_tbl_temp); + rc = zxdh_np_sdt_tbl_write(dev_id, + p_hash_tbl_temp->sdt_no, + p_hash_tbl_temp->hash_sdt.table_type, + &p_hash_tbl_temp->hash_sdt, + ZXDH_SDT_OPER_ADD); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write"); + + rc = zxdh_np_hash_tbl_id_info_init(p_se_cfg, + p_hash_tbl_temp->hash_sdt.hash_id, + p_hash_tbl_temp->hash_sdt.hash_table_id, + p_hash_tbl_temp->tbl_flag, + p_hash_tbl_temp->hash_sdt.hash_table_width, + p_hash_tbl_temp->hash_sdt.key_size); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_tbl_id_info_init_ex"); + + rc = zxdh_np_apt_set_callback(dev_id, + p_hash_tbl_temp->sdt_no, + p_hash_tbl_temp->hash_sdt.table_type, + (void *)p_hash_tbl_temp); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_set_callback"); + } + + return rc; +} + +static uint32_t +zxdh_np_apt_eram_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ERAM_TABLE_T *p_eram_tbl) +{ + uint32_t rc = ZXDH_OK; + uint32_t index = 0; + ZXDH_APT_ERAM_TABLE_T *p_temp_eram_tbl = NULL; + + for (index = 0; index < tbl_num; index++) { + p_temp_eram_tbl = p_eram_tbl + index; + rc = zxdh_np_sdt_tbl_write(dev_id, + p_temp_eram_tbl->sdt_no, + p_temp_eram_tbl->eram_sdt.table_type, + &p_temp_eram_tbl->eram_sdt, + ZXDH_SDT_OPER_ADD); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write"); + + rc = zxdh_np_apt_set_callback(dev_id, + p_temp_eram_tbl->sdt_no, + p_temp_eram_tbl->eram_sdt.table_type, + (void *)p_temp_eram_tbl); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_set_callback"); + } + + return rc; +} + +static uint32_t +zxdh_np_acl_entrynum_to_blocknum(uint32_t entry_num, uint32_t key_mode) +{ + uint32_t value = 0; + + value = entry_num % (ZXDH_ETCAM_RAM_DEPTH * ((uint32_t)1 << key_mode)); + + if (value == 0) + return (entry_num / (ZXDH_ETCAM_RAM_DEPTH * ((uint32_t)1 << key_mode))); + else + return (entry_num / (ZXDH_ETCAM_RAM_DEPTH * ((uint32_t)1 << key_mode)) + 1); +} + +static int32_t +zxdh_np_acl_key_cmp(void *p_new_key, void *p_old_key, uint32_t key_len) +{ + return memcmp(&(((ZXDH_ACL_KEY_INFO_T *)p_new_key)->pri), + &(((ZXDH_ACL_KEY_INFO_T *)p_old_key)->pri), key_len - sizeof(uint32_t)); +} + +static uint32_t +zxdh_np_acl_cfg_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg, + void *p_client, + uint32_t flags, + ZXDH_ACL_AS_RSLT_WRT_FUNCTION p_as_wrt_fun) +{ + uint32_t rc = 0; + + memset(p_acl_cfg, 0, sizeof(ZXDH_ACL_CFG_EX_T)); + + p_acl_cfg->p_client = p_client; + p_acl_cfg->dev_id = (uint32_t)(ZXDH_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF); + p_acl_cfg->flags = flags; + + g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg; + + if (flags & ZXDH_ACL_FLAG_ETCAM0_EN) { + p_acl_cfg->acl_etcamids.is_valid = 1; + + p_acl_cfg->acl_etcamids.as_eram_base = 0; + + rc = zxdh_comm_double_link_init(ZXDH_ACL_TBL_ID_NUM, + &p_acl_cfg->acl_etcamids.tbl_list); + ZXDH_COMM_CHECK_RC(rc, "zxdh_comm_double_link_init"); + } + + if (p_as_wrt_fun == NULL) { + p_acl_cfg->p_as_rslt_write_fun = NULL; + p_acl_cfg->p_as_rslt_read_fun = NULL; + + } else { + p_acl_cfg->p_as_rslt_write_fun = p_as_wrt_fun; + } + + PMD_DRV_LOG(INFO, "%s dev_id %d done.", __func__, p_acl_cfg->dev_id); + + return rc; +} + +static uint32_t +zxdh_np_acl_tbl_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg, + uint32_t table_id, + uint32_t as_enable, + uint32_t entry_num, + ZXDH_ACL_PRI_MODE_E pri_mode, + uint32_t key_mode, + ZXDH_ACL_AS_MODE_E as_mode, + uint32_t as_baddr, + uint32_t block_num, + uint32_t *p_block_idx) +{ + uint32_t rc = 0; + uint32_t i = 0; + + g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg; + + if (p_acl_cfg->acl_tbls[table_id].is_used) { + PMD_DRV_LOG(ERR, "table_id[ %d ] is already used!", table_id); + RTE_ASSERT(0); + return ZXDH_ACL_RC_INVALID_TBLID; + } + + if (!p_acl_cfg->acl_etcamids.is_valid) { + PMD_DRV_LOG(ERR, "etcam is not init!"); + RTE_ASSERT(0); + return ZXDH_ACL_RC_ETCAMID_NOT_INIT; + } + + if (zxdh_np_acl_entrynum_to_blocknum(entry_num, key_mode) > block_num) { + PMD_DRV_LOG(ERR, "key_mode[ %d ], the etcam block_num[ %d ] is not enough for entry_num[ 0x%x ].", + key_mode, block_num, entry_num); + RTE_ASSERT(0); + return ZXDH_ACL_RC_INVALID_BLOCKNUM; + } else if (zxdh_np_acl_entrynum_to_blocknum(entry_num, key_mode) < block_num) { + PMD_DRV_LOG(DEBUG, "key_mode[ %d ], the etcam block_num[ %d ] is more than entry_num[ 0x%x ], better to reduce block_num in order to match with entry_num.", + key_mode, block_num, entry_num); + } else { + PMD_DRV_LOG(DEBUG, "key_mode[ %d ], the etcam block_num[ %d ] is match with entry_num[ 0x%x ].", + key_mode, block_num, entry_num); + } + + p_acl_cfg->acl_tbls[table_id].as_enable = as_enable; + + if (as_enable) { + p_acl_cfg->acl_tbls[table_id].as_idx_base = as_baddr; + p_acl_cfg->acl_tbls[table_id].as_rslt_buff = + rte_zmalloc(NULL, entry_num * ZXDH_ACL_AS_RSLT_SIZE_GET_EX(as_mode), 0); + if (p_acl_cfg->acl_tbls[table_id].as_rslt_buff == NULL) { + PMD_DRV_LOG(ERR, "%s point null!", __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + } + + rc = (uint32_t)zxdh_comm_rb_init(&p_acl_cfg->acl_tbls[table_id].acl_rb, 0, + (sizeof(ZXDH_ACL_KEY_INFO_T) & 0xFFFFFFFFU) + ZXDH_ACL_KEYSIZE_GET(key_mode), + zxdh_np_acl_key_cmp); + ZXDH_COMM_CHECK_RC(rc, "zxdh_comm_rb_init"); + + p_acl_cfg->acl_tbls[table_id].table_id = table_id; + p_acl_cfg->acl_tbls[table_id].pri_mode = pri_mode; + p_acl_cfg->acl_tbls[table_id].key_mode = key_mode; + p_acl_cfg->acl_tbls[table_id].entry_num = entry_num; + p_acl_cfg->acl_tbls[table_id].as_mode = as_mode; + p_acl_cfg->acl_tbls[table_id].is_used = 1; + + ZXDH_INIT_D_NODE(&p_acl_cfg->acl_tbls[table_id].entry_dn, &p_acl_cfg->acl_tbls[table_id]); + rc = (uint32_t)zxdh_comm_double_link_insert_last(&(p_acl_cfg->acl_tbls + [table_id].entry_dn), &p_acl_cfg->acl_etcamids.tbl_list); + ZXDH_COMM_CHECK_RC(rc, "zxdh_comm_double_link_insert_last"); + + p_acl_cfg->acl_tbls[table_id].block_num = block_num; + p_acl_cfg->acl_tbls[table_id].block_array = + rte_zmalloc(NULL, block_num * sizeof(uint32_t), 0); + if (p_acl_cfg->acl_tbls[table_id].block_array == NULL) { + PMD_DRV_LOG(ERR, "%s point null!", __func__); + return ZXDH_PAR_CHK_POINT_NULL; + } + + for (i = 0; i < block_num; i++) { + if (p_acl_cfg->acl_blocks[p_block_idx[i]].is_used) { + PMD_DRV_LOG(ERR, "the block[ %d ] is already used by table[ %d ]!", + p_block_idx[i], p_acl_cfg->acl_blocks[p_block_idx[i]].tbl_id); + RTE_ASSERT(0); + return ZXDH_ACL_RC_INVALID_BLOCKID; + } + + p_acl_cfg->acl_tbls[table_id].block_array[i] = p_block_idx[i]; + p_acl_cfg->acl_blocks[p_block_idx[i]].is_used = 1; + p_acl_cfg->acl_blocks[p_block_idx[i]].tbl_id = table_id; + p_acl_cfg->acl_blocks[p_block_idx[i]].idx_base = + ((ZXDH_ACL_ENTRY_MAX_GET(key_mode, i)) >> ZXDH_BLOCK_IDXBASE_BIT_OFF) & + ZXDH_BLOCK_IDXBASE_BIT_MASK; + } + + return ZXDH_OK; +} + +static uint32_t +zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T *p_acl_tbl_res) +{ + uint32_t rc = ZXDH_OK; + uint8_t index = 0; + ZXDH_APT_ACL_TABLE_T *p_temp_acl_tbl = NULL; + + rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[dev_id], + (void *)ZXDH_COMM_VAL_TO_PTR(dev_id), + ZXDH_ACL_FLAG_ETCAM0_EN, + NULL); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_acl_cfg_init_ex"); + + for (index = 0; index < tbl_num; index++) { + p_temp_acl_tbl = p_acl_tbl_res + index; + rc = zxdh_np_sdt_tbl_write(dev_id, + p_temp_acl_tbl->sdt_no, + p_temp_acl_tbl->acl_sdt.table_type, + &p_temp_acl_tbl->acl_sdt, + ZXDH_SDT_OPER_ADD); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write"); + + rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[dev_id], + p_temp_acl_tbl->acl_sdt.etcam_table_id, + p_temp_acl_tbl->acl_sdt.as_en, + p_temp_acl_tbl->acl_res.entry_num, + p_temp_acl_tbl->acl_res.pri_mode, + p_temp_acl_tbl->acl_sdt.etcam_key_mode, + p_temp_acl_tbl->acl_sdt.as_rsp_mode, + p_temp_acl_tbl->acl_sdt.as_eram_baddr, + p_temp_acl_tbl->acl_res.block_num, + p_temp_acl_tbl->acl_res.block_index); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_acl_tbl_init_ex"); + + rc = zxdh_np_apt_set_callback(dev_id, + p_temp_acl_tbl->sdt_no, + p_temp_acl_tbl->acl_sdt.table_type, + (void *)p_temp_acl_tbl); + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_set_callback"); + } + + return rc; +} + +static void +zxdh_np_apt_stat_res_init(uint32_t dev_id, uint32_t type, ZXDH_APT_STAT_RES_INIT_T *stat_res_init) +{ + g_ppu_stat_cfg[dev_id].eram_baddr = stat_res_init->eram_baddr; + g_ppu_stat_cfg[dev_id].eram_depth = stat_res_init->eram_depth; + + if (type == ZXDH_SE_NON_STD_NIC_RES_TYPE) { + g_ppu_stat_cfg[dev_id].ddr_base_addr = stat_res_init->ddr_baddr; + g_ppu_stat_cfg[dev_id].ppu_addr_offset = stat_res_init->ppu_ddr_offset; + } +} + 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}; + ZXDH_APT_ERAM_RES_INIT_T eram_res_init = {0}; + ZXDH_APT_ACL_RES_INIT_T acl_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) { @@ -6489,8 +7166,14 @@ zxdh_np_se_res_init(uint32_t dev_id, uint32_t type) 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.tbl_num = p_se_res->hash_tbl_num; hash_res_init.func_res = p_se_res->hash_func; hash_res_init.bulk_res = p_se_res->hash_bulk; + hash_res_init.tbl_res = p_se_res->hash_tbl; + eram_res_init.tbl_num = p_se_res->eram_num; + eram_res_init.eram_res = p_se_res->eram_tbl; + acl_res_init.tbl_num = p_se_res->acl_num; + acl_res_init.acl_res = p_se_res->acl_tbl; rc = zxdh_np_apt_hash_global_res_init(dev_id); ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_global_res_init"); @@ -6507,6 +7190,26 @@ zxdh_np_se_res_init(uint32_t dev_id, uint32_t type) ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_bulk_res_init"); } + if (hash_res_init.tbl_num) { + rc = zxdh_np_apt_hash_tbl_res_init(dev_id, hash_res_init.tbl_num, + hash_res_init.tbl_res); + ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_tbl_res_init"); + } + + if (eram_res_init.tbl_num) { + rc = zxdh_np_apt_eram_res_init(dev_id, eram_res_init.tbl_num, + eram_res_init.eram_res); + ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_eram_res_init"); + } + + if (acl_res_init.tbl_num) { + rc = zxdh_np_apt_acl_res_init(dev_id, acl_res_init.tbl_num, + acl_res_init.acl_res); + ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_acl_res_init"); + } + + zxdh_np_apt_stat_res_init(dev_id, type, &p_se_res->stat_cfg); + return rc; } diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h index 31d4af2c05..b1b9dc9a1b 100644 --- a/drivers/net/zxdh/zxdh_np.h +++ b/drivers/net/zxdh/zxdh_np.h @@ -101,6 +101,10 @@ #define ZXDH_ETCAM_WR_MASK_MAX (((uint32_t)1 << ZXDH_ETCAM_RAM_NUM) - 1) #define ZXDH_ETCAM_WIDTH_MIN (ZXDH_ETCAM_RAM_WIDTH) #define ZXDH_ETCAM_WIDTH_MAX (ZXDH_ETCAM_RAM_NUM * ZXDH_ETCAM_RAM_WIDTH) +#define ZXDH_ETCAM_RAM_DEPTH (512) +#define ZXDH_ACL_FLAG_ETCAM0_EN (1 << 0) +#define ZXDH_BLOCK_IDXBASE_BIT_OFF (9) +#define ZXDH_BLOCK_IDXBASE_BIT_MASK (0x7f) #define ZXDH_DTB_TABLE_DATA_BUFF_SIZE (16384) #define ZXDH_DTB_TABLE_CMD_SIZE_BIT (128) @@ -173,6 +177,57 @@ #define ZXDH_COMM_PTR_TO_VAL(p) ((uint64_t)(p)) #define ZXDH_COMM_VAL_TO_PTR(v) ((void *)((uint64_t)(v))) +#define ZXDH_SDT_CFG_LEN (2) +#define ZXDH_SDT_VALID (1) +#define ZXDH_SDT_INVALID (0) +#define ZXDH_SDT_OPER_ADD (0) +#define ZXDH_SDT_H_TBL_TYPE_BT_POS (29) +#define ZXDH_SDT_H_TBL_TYPE_BT_LEN (3) +#define ZXDH_SDT_H_ERAM_MODE_BT_POS (26) +#define ZXDH_SDT_H_ERAM_MODE_BT_LEN (3) +#define ZXDH_SDT_H_ERAM_BASE_ADDR_BT_POS (7) +#define ZXDH_SDT_H_ERAM_BASE_ADDR_BT_LEN (19) +#define ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_POS (1) +#define ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_LEN (22) +#define ZXDH_SDT_H_HASH_ID_BT_POS (27) +#define ZXDH_SDT_H_HASH_ID_BT_LEN (2) +#define ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_POS (25) +#define ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_LEN (2) +#define ZXDH_SDT_H_HASH_KEY_SIZE_BT_POS (19) +#define ZXDH_SDT_H_HASH_KEY_SIZE_BT_LEN (6) +#define ZXDH_SDT_H_HASH_TABLE_ID_BT_POS (14) +#define ZXDH_SDT_H_HASH_TABLE_ID_BT_LEN (5) +#define ZXDH_SDT_H_LEARN_EN_BT_POS (13) +#define ZXDH_SDT_H_LEARN_EN_BT_LEN (1) +#define ZXDH_SDT_H_KEEP_ALIVE_BT_POS (12) +#define ZXDH_SDT_H_KEEP_ALIVE_BT_LEN (1) +#define ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_POS (0) +#define ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_LEN (12) +#define ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_POS (25) +#define ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN (7) +#define ZXDH_SDT_L_RSP_MODE_BT_POS (23) +#define ZXDH_SDT_L_RSP_MODE_BT_LEN (2) +#define ZXDH_SDT_H_ETCAM_ID_BT_POS (27) +#define ZXDH_SDT_H_ETCAM_ID_BT_LEN (1) +#define ZXDH_SDT_H_ETCAM_KEY_MODE_BT_POS (25) +#define ZXDH_SDT_H_ETCAM_KEY_MODE_BT_LEN (2) +#define ZXDH_SDT_H_ETCAM_TABLE_ID_BT_POS (21) +#define ZXDH_SDT_H_ETCAM_TABLE_ID_BT_LEN (4) +#define ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS (19) +#define ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN (2) +#define ZXDH_SDT_H_ETCAM_AS_EN_BT_POS (18) +#define ZXDH_SDT_H_ETCAM_AS_EN_BT_LEN (1) +#define ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS (0) +#define ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN (18) +#define ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS (31) +#define ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN (1) +#define ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_POS (28) +#define ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN (3) +#define ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_POS (1) +#define ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN (20) +#define ZXDH_SDT_L_CLUTCH_EN_BT_POS (0) +#define ZXDH_SDT_L_CLUTCH_EN_BT_LEN (1) + /**errco code */ #define ZXDH_RC_BASE (0x1000U) #define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200) @@ -291,6 +346,28 @@ #define ZXDH_SE_RC_FUN_INVALID (ZXDH_SE_RC_CFG_BASE | 0x2) #define ZXDH_SE_RC_PARA_INVALID (ZXDH_SE_RC_CFG_BASE | 0x3) +#define ZXDH_RC_TABLE_BASE (0x800) +#define ZXDH_RC_TABLE_PARA_INVALID (ZXDH_RC_TABLE_BASE | 0x0) +#define ZXDH_RC_TABLE_RANGE_INVALID (ZXDH_RC_TABLE_BASE | 0x1) +#define ZXDH_RC_TABLE_CALL_FUNC_FAIL (ZXDH_RC_TABLE_BASE | 0x2) +#define ZXDH_RC_TABLE_SDT_MSG_INVALID (ZXDH_RC_TABLE_BASE | 0x3) +#define ZXDH_RC_TABLE_SDT_MGR_INVALID (ZXDH_RC_TABLE_BASE | 0x4) +#define ZXDH_RC_TABLE_IF_VALUE_FAIL (ZXDH_RC_TABLE_BASE | 0x5) + +#define ZXDH_ACL_RC_BASE (0x60000) +#define ZXDH_ACL_RC_INVALID_TBLID (ZXDH_ACL_RC_BASE | 0x0) +#define ZXDH_ACL_RC_INVALID_BLOCKNUM (ZXDH_ACL_RC_BASE | 0x1) +#define ZXDH_ACL_RC_INVALID_BLOCKID (ZXDH_ACL_RC_BASE | 0x2) +#define ZXDH_ACL_RC_TBL_NOT_INIT (ZXDH_ACL_RC_BASE | 0x3) +#define ZXDH_ACL_RC_ETCAMID_NOT_INIT (ZXDH_ACL_RC_BASE | 0x4) +#define ZXDH_ACL_RC_AS_ERAM_NOT_ENOUGH (ZXDH_ACL_RC_BASE | 0x5) +#define ZXDH_ACL_RC_RB_TREE_FULL (ZXDH_ACL_RC_BASE | 0x6) +#define ZXDH_ACL_RC_TABLE_FULL (ZXDH_ACL_RC_BASE | 0x7) +#define ZXDH_ACL_RC_INVALID_PARA (ZXDH_ACL_RC_BASE | 0x8) +#define ZXDH_ACL_RC_DEL_SRHFAIL (ZXDH_ACL_RC_BASE | 0x9) +#define ZXDH_ACL_RC_TABLE_UPDATE (ZXDH_ACL_RC_BASE | 0xa) +#define ZXDH_ACL_RC_SRH_FAIL (ZXDH_ACL_RC_BASE | 0xb) + typedef enum zxdh_module_base_addr_e { ZXDH_MODULE_SE_SMMU0_BASE_ADDR = 0x00000000, ZXDH_MODULE_DTB_ENQ_BASE_ADDR = 0x00000000, @@ -446,6 +523,21 @@ typedef enum zxdh_se_fun_type_e { ZXDH_FUN_MAX } ZXDH_SE_FUN_TYPE; +typedef enum zxdh_acl_as_mode_e { + ZXDH_ACL_AS_MODE_16b = 0, + ZXDH_ACL_AS_MODE_32b = 1, + ZXDH_ACL_AS_MODE_64b = 2, + ZXDH_ACL_AS_MODE_128b = 3, + ZXDH_ACL_AS_MODE_INVALID, +} ZXDH_ACL_AS_MODE_E; + +typedef enum zxdh_hash_key_type_e { + ZXDH_HASH_KEY_INVALID = 0, + ZXDH_HASH_KEY_128b, + ZXDH_HASH_KEY_256b, + ZXDH_HASH_KEY_512b, +} ZXDH_HASH_KEY_TYPE; + typedef struct zxdh_avl_node_t { void *p_key; uint32_t result; @@ -869,6 +961,101 @@ typedef struct zxdh_dev_apt_se_tbl_res_t { ZXDH_APT_SE_RES_T offload_res; } ZXDH_DEV_APT_SE_TBL_RES_T; +typedef struct se_apt_eram_func_t { + uint32_t opr_mode; + uint32_t rd_mode; + ZXDH_APT_ERAM_SET_FUNC eram_set_func; + ZXDH_APT_ERAM_GET_FUNC eram_get_func; +} ZXDH_SE_APT_ERAM_FUNC_T; + +typedef struct se_apt_acl_func_t { + uint32_t sdt_partner; + ZXDH_APT_ACL_ENTRY_SET_FUNC acl_set_func; + ZXDH_APT_ACL_ENTRY_GET_FUNC acl_get_func; +} ZXDH_SE_APT_ACL_FUNC_T; + +typedef struct se_apt_hash_func_t { + uint32_t sdt_partner; + ZXDH_APT_HASH_ENTRY_SET_FUNC hash_set_func; + ZXDH_APT_HASH_ENTRY_GET_FUNC hash_get_func; +} ZXDH_SE_APT_HASH_FUNC_T; + +typedef struct se_apt_callback_t { + uint32_t sdt_no; + uint32_t table_type; + union { + ZXDH_SE_APT_ERAM_FUNC_T eram_func; + ZXDH_SE_APT_ACL_FUNC_T acl_func; + ZXDH_SE_APT_HASH_FUNC_T hash_func; + } se_func_info; +} SE_APT_CALLBACK_T; + +typedef struct zxdh_acl_block_info_t { + uint32_t is_used; + uint32_t tbl_id; + uint32_t idx_base; +} ZXDH_ACL_BLOCK_INFO_T; + +typedef struct zxdh_acl_etcamid_cfg_t { + uint32_t is_valid; + uint32_t as_enable; + uint32_t as_idx_offset; + uint32_t as_eram_base; + ZXDH_D_HEAD tbl_list; +} ZXDH_ACL_ETCAMID_CFG_T; + +typedef struct zxdh_acl_key_info_t { + uint32_t handle; + uint32_t pri; + uint8_t key[0]; +} ZXDH_ACL_KEY_INFO_T; + +typedef uint32_t (*ZXDH_ACL_TBL_AS_DDR_WR_FUN)(uint32_t dev_id, uint32_t tbl_type, + uint32_t tbl_id, uint32_t dir_tbl_share_type, uint32_t dir_tbl_base_addr, + uint32_t ecc_en, uint32_t index, uint32_t as_mode, uint8_t *p_data); +typedef uint32_t (*ZXDH_ACL_TBL_AS_DDR_RD_FUN)(uint32_t dev_id, uint32_t base_addr, + uint32_t index, uint32_t as_mode, uint8_t *p_data); +typedef uint32_t (*ZXDH_ACL_AS_RSLT_WRT_FUNCTION)(uint32_t dev_id, + uint32_t base_addr, uint32_t index, uint32_t as_mode, uint8_t *p_data); + +typedef struct zxdh_acl_tbl_cfg_t { + uint32_t tbl_type; + uint32_t table_id; + uint8_t is_as_ddr; + uint8_t ddr_bankcp_info; + uint32_t dir_tbl_share_type; + uint8_t ddr_ecc_en; + uint32_t pri_mode; + uint32_t key_mode; + uint32_t entry_num; + uint32_t block_num; + uint32_t *block_array; + uint32_t is_used; + uint32_t as_mode; + uint32_t as_idx_base; + uint32_t as_enable; + uint32_t as_eram_base; + uint32_t ddr_baddr; + uint32_t idx_offset; + ZXDH_ACL_TBL_AS_DDR_WR_FUN p_as_ddr_wr_fun; + ZXDH_ACL_TBL_AS_DDR_RD_FUN p_as_ddr_rd_fun; + ZXDH_D_NODE entry_dn; + ZXDH_RB_CFG acl_rb; + ZXDH_ACL_KEY_INFO_T **acl_key_buff; + uint8_t *as_rslt_buff; +} ZXDH_ACL_TBL_CFG_T; + +typedef struct zxdh_acl_cfg_ex_t { + void *p_client; + uint32_t dev_id; + uint32_t flags; + ZXDH_ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_write_fun; + ZXDH_ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_read_fun; + ZXDH_ACL_BLOCK_INFO_T acl_blocks[ZXDH_ACL_BLOCK_NUM]; + ZXDH_ACL_ETCAMID_CFG_T acl_etcamids; + ZXDH_ACL_TBL_CFG_T acl_tbls[ZXDH_ACL_TBL_ID_NUM]; +} ZXDH_ACL_CFG_EX_T; + typedef struct zxdh_mutex_t { pthread_mutex_t mutex; } ZXDH_MUTEX_T; -- 2.27.0