@@ -842,6 +842,19 @@ zxdh_dev_configure(struct rte_eth_dev *dev)
return ret;
}
+static int
+zxdh_tables_uninit(struct rte_eth_dev *dev)
+{
+ int ret = 0;
+
+ ret = zxdh_port_attr_uninit(dev);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "zxdh_port_attr_uninit failed");
+ return ret;
+ }
+ return ret;
+}
+
static void
zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
{
@@ -893,6 +906,12 @@ zxdh_dev_close(struct rte_eth_dev *dev)
struct zxdh_hw *hw = dev->data->dev_private;
int ret = 0;
+ ret = zxdh_tables_uninit(dev);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "%s :unint port %s failed ", __func__, dev->device->name);
+ return -1;
+ }
+
zxdh_intr_release(dev);
zxdh_np_uninit(dev);
zxdh_pci_reset(hw);
@@ -167,6 +167,7 @@ enum pciebar_layout_type {
enum zxdh_msg_type {
ZXDH_NULL = 0,
ZXDH_VF_PORT_INIT = 1,
+ ZXDH_VF_PORT_UNINIT = 2,
ZXDH_MSG_TYPE_END,
} __rte_packed;
@@ -22,6 +22,7 @@ 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] = {NULL};
ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX] = {NULL};
ZXDH_TLB_MGR_T *g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX] = {NULL};
+ZXDH_SDT_TBL_DATA_T g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];
ZXDH_REG_T g_dpp_reg_info[4] = {0};
ZXDH_DTB_TABLE_T g_dpp_dtb_table_info[4] = {0};
@@ -1497,3 +1498,115 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,
return rc;
}
+
+static uint32_t
+zxdh_np_sdt_tbl_data_get(uint32_t dev_id, uint32_t sdt_no, ZXDH_SDT_TBL_DATA_T *p_sdt_data)
+{
+ uint32_t rc = 0;
+
+ p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32;
+ p_sdt_data->data_low32 = g_sdt_info[dev_id][sdt_no].data_low32;
+
+ return rc;
+}
+
+int
+zxdh_np_dtb_table_entry_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t entrynum,
+ ZXDH_DTB_USER_ENTRY_T *delete_entries)
+{
+ uint32_t rc = 0;
+ uint32_t entry_index = 0;
+ uint32_t sdt_no = 0;
+ uint32_t tbl_type = 0;
+ uint32_t element_id = 0xff;
+ uint32_t one_dtb_len = 0;
+ uint32_t dtb_len = 0;
+ uint32_t addr_offset = 0;
+ uint32_t max_size = 0;
+ uint8_t *p_data_buff = NULL;
+ uint8_t *p_data_buff_ex = NULL;
+ ZXDH_DTB_LPM_ENTRY_T lpm_entry = {0};
+
+ uint8_t entry_cmd[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+ uint8_t entry_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ ZXDH_SDT_TBL_DATA_T sdt_tbl = {0};
+ ZXDH_DTB_USER_ENTRY_T *pentry = NULL;
+ ZXDH_DTB_ENTRY_T dtb_one_entry = {0};
+
+ ZXDH_COMM_CHECK_POINT(delete_entries);
+
+ p_data_buff = (uint8_t *)rte_malloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);
+ ZXDH_COMM_CHECK_POINT(p_data_buff);
+ memset(p_data_buff, 0, ZXDH_DTB_TABLE_DATA_BUFF_SIZE);
+
+ p_data_buff_ex =
+ (uint8_t *)rte_malloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE * sizeof(uint8_t), 0);
+ memset(p_data_buff_ex, 0, ZXDH_DTB_TABLE_DATA_BUFF_SIZE);
+
+ memset((uint8_t *)&lpm_entry, 0x0, sizeof(ZXDH_DTB_LPM_ENTRY_T));
+
+ memset((uint8_t *)&dtb_one_entry, 0x0, sizeof(ZXDH_DTB_ENTRY_T));
+ memset(entry_cmd, 0x0, sizeof(entry_cmd));
+ memset(entry_data, 0x0, sizeof(entry_data));
+ dtb_one_entry.cmd = entry_cmd;
+ dtb_one_entry.data = entry_data;
+
+ max_size = (ZXDH_DTB_TABLE_DATA_BUFF_SIZE / 16) - 1;
+
+ for (entry_index = 0; entry_index < entrynum; entry_index++) {
+ pentry = delete_entries + entry_index;
+
+ sdt_no = pentry->sdt_no;
+ rc = zxdh_np_sdt_tbl_data_get(dev_id, sdt_no, &sdt_tbl);
+ switch (tbl_type) {
+ case ZXDH_SDT_TBLT_ERAM:
+ {
+ rc = zxdh_np_dtb_eram_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_DELETE,
+ pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);
+ break;
+ }
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type);
+ rte_free(p_data_buff);
+ rte_free(p_data_buff_ex);
+ return 1;
+ }
+ }
+
+ addr_offset = dtb_len * ZXDH_DTB_LEN_POS_SETP;
+ dtb_len += one_dtb_len;
+ if (dtb_len > max_size) {
+ rte_free(p_data_buff);
+ rte_free(p_data_buff_ex);
+ PMD_DRV_LOG(ERR, " %s error dtb_len>%u!", __func__,
+ max_size);
+ return ZXDH_RC_DTB_DOWN_LEN_INVALID;
+ }
+
+ rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_one_entry);
+ memset(entry_cmd, 0x0, sizeof(entry_cmd));
+ memset(entry_data, 0x0, sizeof(entry_data));
+ }
+
+ if (dtb_len == 0) {
+ rte_free(p_data_buff);
+ rte_free(p_data_buff_ex);
+ return ZXDH_RC_DTB_DOWN_LEN_INVALID;
+ }
+
+ rc = zxdh_np_dtb_write_down_table_data(dev_id,
+ queue_id,
+ dtb_len * 16,
+ p_data_buff,
+ &element_id);
+ rte_free(p_data_buff);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,
+ "dpp_dtb_write_down_table_data", p_data_buff_ex);
+
+ rte_free(p_data_buff_ex);
+ return 0;
+}
@@ -54,6 +54,8 @@
#define ZXDH_ACL_TBL_ID_MAX (7)
#define ZXDH_ACL_TBL_ID_NUM (8U)
#define ZXDH_ACL_BLOCK_NUM (8U)
+#define ZXDH_SDT_H_TBL_TYPE_BT_POS (29)
+#define ZXDH_SDT_H_TBL_TYPE_BT_LEN (3)
#define ZXDH_SMMU0_READ_REG_MAX_NUM (4)
@@ -507,9 +509,16 @@ typedef struct zxdh_dtb_user_entry_t {
void *p_entry_data;
} ZXDH_DTB_USER_ENTRY_T;
+typedef struct zxdh_sdt_tbl_data_t {
+ uint32_t data_high32;
+ uint32_t data_low32;
+} ZXDH_SDT_TBL_DATA_T;
+
int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);
int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);
int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,
uint32_t entrynum, ZXDH_DTB_USER_ENTRY_T *down_entries);
+int zxdh_np_dtb_table_entry_delete(uint32_t dev_id, uint32_t queue_id,
+ uint32_t entrynum, ZXDH_DTB_USER_ENTRY_T *delete_entries);
#endif /* ZXDH_NP_H */
@@ -70,7 +70,38 @@ zxdh_port_attr_init(struct rte_eth_dev *dev)
return ret;
};
-int zxdh_panel_table_init(struct rte_eth_dev *dev)
+int
+zxdh_port_attr_uninit(struct rte_eth_dev *dev)
+{
+ struct zxdh_hw *hw = dev->data->dev_private;
+ struct zxdh_msg_info msg_info = {0};
+ struct zxdh_port_attr_table port_attr = {0};
+ int ret = 0;
+
+ if (hw->is_pf == 1) {
+ ZXDH_DTB_ERAM_ENTRY_INFO_T port_attr_entry = {hw->vfid, (uint32_t *)&port_attr};
+ ZXDH_DTB_USER_ENTRY_T entry = {
+ .sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
+ .p_entry_data = (void *)&port_attr_entry
+ };
+ ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "delete port attr table failed");
+ return -ret;
+ }
+ } else {
+ zxdh_msg_head_build(hw, ZXDH_VF_PORT_UNINIT, &msg_info);
+ ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "vf port tables uninit failed");
+ return -ret;
+ }
+ }
+ return ret;
+}
+
+int
+zxdh_panel_table_init(struct rte_eth_dev *dev)
{
struct zxdh_hw *hw = dev->data->dev_private;
@@ -144,5 +144,6 @@ struct zxdh_panel_table {
int zxdh_port_attr_init(struct rte_eth_dev *dev);
int zxdh_panel_table_init(struct rte_eth_dev *dev);
int zxdh_set_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr);
+int zxdh_port_attr_uninit(struct rte_eth_dev *dev);
#endif /* ZXDH_TABLES_H */