optimize np dtb channel initialization. Signed-off-by: Junlong Wang --- drivers/net/zxdh/zxdh_ethdev.c | 193 ++++++++++++++++++++++------- drivers/net/zxdh/zxdh_ethdev.h | 16 ++- drivers/net/zxdh/zxdh_ethdev_ops.c | 99 +++++++-------- drivers/net/zxdh/zxdh_msg.c | 13 +- drivers/net/zxdh/zxdh_msg.h | 64 +++++----- drivers/net/zxdh/zxdh_np.c | 89 ++----------- drivers/net/zxdh/zxdh_tables.c | 137 +++++++++++--------- drivers/net/zxdh/zxdh_tables.h | 34 +++-- 8 files changed, 364 insertions(+), 281 deletions(-) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index 858e3c3d47..9e6f7d6340 100644 --- a/drivers/net/zxdh/zxdh_ethdev.c +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -19,12 +19,12 @@ #include "zxdh_ethdev_ops.h" struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS]; -struct zxdh_shared_data *zxdh_shared_data; -const char *ZXDH_PMD_SHARED_DATA_MZ = "zxdh_pmd_shared_data"; -rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER; -struct zxdh_dtb_shared_data g_dtb_data; +struct zxdh_dev_shared_data g_dev_sd[ZXDH_SLOT_MAX]; +static rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER; +static struct zxdh_shared_data *zxdh_shared_data; -#define ZXDH_INVALID_DTBQUE 0xFFFF +#define ZXDH_INVALID_DTBQUE 0xFFFF +#define ZXDH_INVALID_SLOT_IDX 0xFFFF uint16_t zxdh_vport_to_vfid(union zxdh_virport_num v) @@ -810,10 +810,10 @@ zxdh_rss_qid_config(struct rte_eth_dev *dev) int ret = 0; if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.port_base_qid = hw->channel_context[0].ph_chno & 0xfff; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "PF:%d port_base_qid insert failed", hw->vfid); return ret; @@ -937,30 +937,28 @@ static void zxdh_np_dtb_data_res_free(struct zxdh_hw *hw) { struct rte_eth_dev *dev = hw->eth_dev; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; int ret; int i; - if (g_dtb_data.init_done && g_dtb_data.bind_device == dev) { - ret = zxdh_np_online_uninit(0, dev->data->name, g_dtb_data.queueid); + if (dtb_data->init_done && dtb_data->bind_device == dev) { + ret = zxdh_np_online_uninit(hw->slot_id, dev->data->name, dtb_data->queueid); if (ret) PMD_DRV_LOG(ERR, "%s dpp_np_online_uninstall failed", dev->data->name); - if (g_dtb_data.dtb_table_conf_mz) - rte_memzone_free(g_dtb_data.dtb_table_conf_mz); - - if (g_dtb_data.dtb_table_dump_mz) { - rte_memzone_free(g_dtb_data.dtb_table_dump_mz); - g_dtb_data.dtb_table_dump_mz = NULL; - } + rte_memzone_free(dtb_data->dtb_table_conf_mz); + dtb_data->dtb_table_conf_mz = NULL; + rte_memzone_free(dtb_data->dtb_table_dump_mz); + dtb_data->dtb_table_dump_mz = NULL; for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) { - if (g_dtb_data.dtb_table_bulk_dump_mz[i]) { - rte_memzone_free(g_dtb_data.dtb_table_bulk_dump_mz[i]); - g_dtb_data.dtb_table_bulk_dump_mz[i] = NULL; + if (dtb_data->dtb_table_bulk_dump_mz[i]) { + rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]); + dtb_data->dtb_table_bulk_dump_mz[i] = NULL; } } - g_dtb_data.init_done = 0; - g_dtb_data.bind_device = NULL; + dtb_data->init_done = 0; + dtb_data->bind_device = NULL; } if (zxdh_shared_data != NULL) zxdh_shared_data->np_init_done = 0; @@ -970,11 +968,14 @@ static void zxdh_np_uninit(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; - if (!g_dtb_data.init_done && !g_dtb_data.dev_refcnt) + if (!hw->is_pf) + return; + if (!dtb_data->init_done && !dtb_data->dev_refcnt) return; - if (--g_dtb_data.dev_refcnt == 0) + if (--dtb_data->dev_refcnt == 0) zxdh_np_dtb_data_res_free(hw); } @@ -1002,7 +1003,7 @@ static int zxdh_dev_stop(struct rte_eth_dev *dev) { uint16_t i; - int ret; + int ret = 0; if (dev->data->dev_started == 0) return 0; @@ -1010,21 +1011,22 @@ zxdh_dev_stop(struct rte_eth_dev *dev) ret = zxdh_intr_disable(dev); if (ret) { PMD_DRV_LOG(ERR, "intr disable failed"); - return ret; + goto end; } ret = zxdh_dev_set_link_down(dev); if (ret) { PMD_DRV_LOG(ERR, "set port %s link down failed!", dev->device->name); - return ret; + goto end; } +end: for (i = 0; i < dev->data->nb_rx_queues; i++) dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED; for (i = 0; i < dev->data->nb_tx_queues; i++) dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED; - return 0; + return ret; } static int @@ -1089,7 +1091,7 @@ zxdh_mac_config(struct rte_eth_dev *eth_dev) int ret = 0; if (hw->is_pf) { - ret = zxdh_set_mac_table(hw->vport.vport, + ret = zxdh_set_mac_table(hw, hw->vport.vport, ð_dev->data->mac_addrs[0], hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "Failed to add mac: port 0x%x", hw->vport.vport); @@ -1238,23 +1240,72 @@ zxdh_agent_comm(struct rte_eth_dev *eth_dev, struct zxdh_hw *hw) return 0; } +static inline int +zxdh_dtb_dump_res_init(struct zxdh_hw *hw __rte_unused, ZXDH_DEV_INIT_CTRL_T *dpp_ctrl) +{ + int ret = 0, i; + + struct zxdh_dtb_bulk_dump_info dtb_dump_baseres[] = { + {"sdt_vport_att_table", 4 * 1024 * 1024, ZXDH_SDT_VPORT_ATT_TABLE, NULL}, + {"sdt_l2_entry_table0", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE0, NULL}, + {"sdt_l2_entry_table1", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE1, NULL}, + {"sdt_l2_entry_table2", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE2, NULL}, + {"sdt_l2_entry_table3", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE3, NULL}, + {"sdt_mc_table0", 5 * 1024 * 1024, ZXDH_SDT_MC_TABLE0, NULL}, + {"sdt_mc_table1", 5 * 1024 * 1024, ZXDH_SDT_MC_TABLE1, NULL}, + {"sdt_mc_table2", 5 * 1024 * 1024, ZXDH_SDT_MC_TABLE2, NULL}, + {"sdt_mc_table3", 5 * 1024 * 1024, ZXDH_SDT_MC_TABLE3, NULL}, + }; + + struct zxdh_dev_shared_data *dev_sd = hw->dev_sd; + struct zxdh_dtb_shared_data *dtb_data = &dev_sd->dtb_sd; + + for (i = 0; i < (int)RTE_DIM(dtb_dump_baseres); i++) { + struct zxdh_dtb_bulk_dump_info *p = dtb_dump_baseres + i; + char buf[ZXDH_MAX_NAME_LEN] = {0}; + + p->mz_name = buf; + + const struct rte_memzone *generic_dump_mz = + rte_memzone_reserve_aligned(p->mz_name, p->mz_size, + SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE); + if (generic_dump_mz == NULL) { + PMD_DRV_LOG(ERR, "Cannot alloc mem for dtb table bulk dump, mz_name is %s, mz_size is %u", + p->mz_name, p->mz_size); + ret = -ENOMEM; + return ret; + } + p->mz = generic_dump_mz; + dpp_ctrl->dump_addr_info[i].vir_addr = generic_dump_mz->addr_64; + dpp_ctrl->dump_addr_info[i].phy_addr = generic_dump_mz->iova; + dpp_ctrl->dump_addr_info[i].sdt_no = p->sdt_no; + dpp_ctrl->dump_addr_info[i].size = p->mz_size; + + dtb_data->dtb_table_bulk_dump_mz[dpp_ctrl->dump_sdt_num] = generic_dump_mz; + dpp_ctrl->dump_sdt_num++; + } + return ret; +} + static int zxdh_np_dtb_res_init(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; struct zxdh_bar_offset_params param = {0}; struct zxdh_bar_offset_res res = {0}; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; int ret = 0; - if (g_dtb_data.init_done) { + if (dtb_data->init_done) { PMD_DRV_LOG(DEBUG, "DTB res already init done, dev %s no need init", dev->device->name); return 0; } - g_dtb_data.queueid = ZXDH_INVALID_DTBQUE; - g_dtb_data.bind_device = dev; - g_dtb_data.dev_refcnt++; - g_dtb_data.init_done = 1; + + dtb_data->queueid = ZXDH_INVALID_DTBQUE; + dtb_data->bind_device = dev; + dtb_data->dev_refcnt++; + dtb_data->init_done = 1; ZXDH_DEV_INIT_CTRL_T *dpp_ctrl = rte_zmalloc(NULL, sizeof(*dpp_ctrl) + sizeof(ZXDH_DTB_ADDR_INFO_T) * 256, 0); @@ -1281,7 +1332,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev) dpp_ctrl->np_bar_len = res.bar_length; dpp_ctrl->np_bar_offset = res.bar_offset; - if (!g_dtb_data.dtb_table_conf_mz) { + if (!dtb_data->dtb_table_conf_mz) { const struct rte_memzone *conf_mz = rte_memzone_reserve_aligned("zxdh_dtb_table_conf_mz", ZXDH_DTB_TABLE_CONF_SIZE, SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE); @@ -1294,10 +1345,10 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev) } dpp_ctrl->down_vir_addr = conf_mz->addr_64; dpp_ctrl->down_phy_addr = conf_mz->iova; - g_dtb_data.dtb_table_conf_mz = conf_mz; + dtb_data->dtb_table_conf_mz = conf_mz; } - if (!g_dtb_data.dtb_table_dump_mz) { + if (!dtb_data->dtb_table_dump_mz) { const struct rte_memzone *dump_mz = rte_memzone_reserve_aligned("zxdh_dtb_table_dump_mz", ZXDH_DTB_TABLE_DUMP_SIZE, SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE); @@ -1310,18 +1361,24 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev) } dpp_ctrl->dump_vir_addr = dump_mz->addr_64; dpp_ctrl->dump_phy_addr = dump_mz->iova; - g_dtb_data.dtb_table_dump_mz = dump_mz; + dtb_data->dtb_table_dump_mz = dump_mz; + } + + ret = zxdh_dtb_dump_res_init(hw, dpp_ctrl); + if (ret) { + PMD_DRV_LOG(ERR, "dev %s zxdh_dtb_dump_res_init failed", dev->device->name); + goto free_res; } - ret = zxdh_np_host_init(0, dpp_ctrl); + ret = zxdh_np_host_init(hw->slot_id, dpp_ctrl); if (ret) { - PMD_DRV_LOG(ERR, "dev %s dpp host np init failed .ret %d", dev->device->name, ret); + PMD_DRV_LOG(ERR, "dev %s dpp host np init failed", dev->device->name); goto free_res; } PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %d", dev->device->name, dpp_ctrl->queue_id); - g_dtb_data.queueid = dpp_ctrl->queue_id; + dtb_data->queueid = dpp_ctrl->queue_id; rte_free(dpp_ctrl); return 0; @@ -1331,6 +1388,44 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev) return ret; } +static inline uint16_t +zxdh_get_dev_shared_data_idx(uint32_t dev_serial_id) +{ + uint16_t idx = 0; + for (; idx < ZXDH_SLOT_MAX; idx++) { + if (g_dev_sd[idx].serial_id == dev_serial_id || g_dev_sd[idx].serial_id == 0) + return idx; + } + + PMD_DRV_LOG(ERR, "dev serial_id[%d] can not found in global dev_share_data arrays", + dev_serial_id); + return ZXDH_INVALID_SLOT_IDX; +} + +static int zxdh_init_dev_share_data(struct rte_eth_dev *eth_dev) +{ + struct zxdh_hw *hw = eth_dev->data->dev_private; + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + uint32_t serial_id = (pci_dev->addr.domain << 16) | + (pci_dev->addr.bus << 8) | pci_dev->addr.devid; + uint16_t slot_id = 0; + + if (serial_id <= 0) { + PMD_DRV_LOG(ERR, "failed to get pcie bus-info %s", pci_dev->name); + return -EINVAL; + } + + slot_id = zxdh_get_dev_shared_data_idx(serial_id); + if (slot_id == ZXDH_INVALID_SLOT_IDX) + return -EINVAL; + + hw->slot_id = slot_id; + g_dev_sd[slot_id].serial_id = serial_id; + hw->dev_sd = &g_dev_sd[slot_id]; + + return 0; +} + static int zxdh_init_shared_data(void) { @@ -1341,7 +1436,7 @@ zxdh_init_shared_data(void) if (zxdh_shared_data == NULL) { if (rte_eal_process_type() == RTE_PROC_PRIMARY) { /* Allocate shared memory. */ - mz = rte_memzone_reserve(ZXDH_PMD_SHARED_DATA_MZ, + mz = rte_memzone_reserve("zxdh_pmd_shared_data", sizeof(*zxdh_shared_data), SOCKET_ID_ANY, 0); if (mz == NULL) { PMD_DRV_LOG(ERR, "Cannot allocate zxdh shared data"); @@ -1352,7 +1447,7 @@ zxdh_init_shared_data(void) memset(zxdh_shared_data, 0, sizeof(*zxdh_shared_data)); rte_spinlock_init(&zxdh_shared_data->lock); } else { /* Lookup allocated shared memory. */ - mz = rte_memzone_lookup(ZXDH_PMD_SHARED_DATA_MZ); + mz = rte_memzone_lookup("zxdh_pmd_shared_data"); if (mz == NULL) { PMD_DRV_LOG(ERR, "Cannot attach zxdh shared data"); ret = -rte_errno; @@ -1368,10 +1463,19 @@ zxdh_init_shared_data(void) } static int -zxdh_init_once(void) +zxdh_init_once(struct rte_eth_dev *eth_dev) { + struct zxdh_hw *hw = eth_dev->data->dev_private; int ret = 0; + if (hw->is_pf) { + ret = zxdh_init_dev_share_data(eth_dev); + if (ret < 0) { + PMD_DRV_LOG(ERR, "init dev share date failed"); + return ret; + } + } + if (zxdh_init_shared_data()) return -1; @@ -1476,6 +1580,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev) hw->eth_dev = eth_dev; hw->speed = RTE_ETH_SPEED_NUM_UNKNOWN; hw->duplex = RTE_ETH_LINK_FULL_DUPLEX; + hw->slot_id = ZXDH_INVALID_SLOT_IDX; hw->is_pf = 0; if (pci_dev->id.device_id == ZXDH_E310_PF_DEVICEID || @@ -1483,7 +1588,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev) hw->is_pf = 1; } - ret = zxdh_init_once(); + ret = zxdh_init_once(eth_dev); if (ret != 0) goto err_zxdh_init; diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h index fd4699c34d..2c11efb23c 100644 --- a/drivers/net/zxdh/zxdh_ethdev.h +++ b/drivers/net/zxdh/zxdh_ethdev.h @@ -40,6 +40,7 @@ #define ZXDH_DTB_TABLE_CONF_SIZE (32 * (16 + 16 * 1024)) #define ZXDH_MAX_NAME_LEN 32 +#define ZXDH_SLOT_MAX 256 union zxdh_virport_num { uint16_t vport; @@ -65,6 +66,7 @@ struct zxdh_hw { struct rte_intr_handle *dtb_intr; struct zxdh_virtqueue **vqs; struct zxdh_chnl_context channel_context[ZXDH_QUEUES_NUM_MAX]; + struct zxdh_dev_shared_data *dev_sd; uint64_t bar_addr[ZXDH_NUM_BARS]; uint64_t host_features; @@ -104,7 +106,7 @@ struct zxdh_hw { uint8_t allmulti_status; uint8_t rss_enable; uint8_t rss_init; - uint8_t rsv[2]; + uint16_t slot_id; }; struct zxdh_dtb_shared_data { @@ -131,6 +133,18 @@ struct zxdh_shared_data { struct zxdh_dtb_shared_data *dtb_data; }; +struct zxdh_dev_shared_data { + uint32_t serial_id; + struct zxdh_dtb_shared_data dtb_sd; +}; + +struct zxdh_dtb_bulk_dump_info { + const char *mz_name; + uint32_t mz_size; + uint32_t sdt_no; + const struct rte_memzone *mz; +}; + uint16_t zxdh_vport_to_vfid(union zxdh_virport_num v); #endif /* ZXDH_ETHDEV_H */ diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index 1a21ded58e..50a585edad 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -135,14 +135,14 @@ static int32_t zxdh_config_port_status(struct rte_eth_dev *dev, uint16_t link_st int32_t ret = 0; if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "get port_attr failed"); return -1; } port_attr.is_up = link_status; - ret = zxdh_set_port_attr(hw->vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "write port_attr failed"); return -1; @@ -296,14 +296,14 @@ int zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) } if (hw->is_pf) { - ret = zxdh_del_mac_table(hw->vport.vport, old_addr, hw->hash_search_index); + ret = zxdh_del_mac_table(hw, hw->vport.vport, old_addr, hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret); return ret; } hw->uc_num--; - ret = zxdh_set_mac_table(hw->vport.vport, addr, hw->hash_search_index); + ret = zxdh_set_mac_table(hw, hw->vport.vport, addr, hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret); return ret; @@ -314,7 +314,7 @@ int zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) mac_filter->filter_flag = ZXDH_MAC_UNFILTER; mac_filter->mac_flag = true; - rte_memcpy(&mac_filter->mac, old_addr, sizeof(struct rte_ether_addr)); + memcpy(&mac_filter->mac, old_addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_DEL, &msg_info); ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0); if (ret) { @@ -327,7 +327,7 @@ int zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) hw->vport.vport, ZXDH_MAC_DEL); mac_filter->filter_flag = ZXDH_MAC_UNFILTER; - rte_memcpy(&mac_filter->mac, addr, sizeof(struct rte_ether_addr)); + memcpy(&mac_filter->mac, addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0); if (ret) { @@ -364,8 +364,8 @@ int zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_ad if (hw->is_pf) { if (rte_is_unicast_ether_addr(mac_addr)) { if (hw->uc_num < ZXDH_MAX_UC_MAC_ADDRS) { - ret = zxdh_set_mac_table(hw->vport.vport, - mac_addr, hw->hash_search_index); + ret = zxdh_set_mac_table(hw, hw->vport.vport, + mac_addr, hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret); return ret; @@ -378,8 +378,8 @@ int zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_ad } } else { if (hw->mc_num < ZXDH_MAX_MC_MAC_ADDRS) { - ret = zxdh_set_mac_table(hw->vport.vport, - mac_addr, hw->hash_search_index); + ret = zxdh_set_mac_table(hw, hw->vport.vport, + mac_addr, hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret); return ret; @@ -395,7 +395,7 @@ int zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_ad struct zxdh_mac_filter *mac_filter = &msg_info.data.mac_filter_msg; mac_filter->filter_flag = ZXDH_MAC_FILTER; - rte_memcpy(&mac_filter->mac, mac_addr, sizeof(struct rte_ether_addr)); + memcpy(&mac_filter->mac, mac_addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); if (rte_is_unicast_ether_addr(mac_addr)) { if (hw->uc_num < ZXDH_MAX_UC_MAC_ADDRS) { @@ -446,7 +446,7 @@ void zxdh_dev_mac_addr_remove(struct rte_eth_dev *dev __rte_unused, uint32_t ind if (hw->is_pf) { if (rte_is_unicast_ether_addr(mac_addr)) { if (hw->uc_num <= ZXDH_MAX_UC_MAC_ADDRS) { - ret = zxdh_del_mac_table(hw->vport.vport, + ret = zxdh_del_mac_table(hw, hw->vport.vport, mac_addr, hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_del failed, code:%d", ret); @@ -460,7 +460,7 @@ void zxdh_dev_mac_addr_remove(struct rte_eth_dev *dev __rte_unused, uint32_t ind } } else { if (hw->mc_num <= ZXDH_MAX_MC_MAC_ADDRS) { - ret = zxdh_del_mac_table(hw->vport.vport, + ret = zxdh_del_mac_table(hw, hw->vport.vport, mac_addr, hw->hash_search_index); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_del failed, code:%d", ret); @@ -477,7 +477,7 @@ void zxdh_dev_mac_addr_remove(struct rte_eth_dev *dev __rte_unused, uint32_t ind struct zxdh_mac_filter *mac_filter = &msg_info.data.mac_filter_msg; mac_filter->filter_flag = ZXDH_MAC_FILTER; - rte_memcpy(&mac_filter->mac, mac_addr, sizeof(struct rte_ether_addr)); + memcpy(&mac_filter->mac, mac_addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_DEL, &msg_info); if (rte_is_unicast_ether_addr(mac_addr)) { if (hw->uc_num <= ZXDH_MAX_UC_MAC_ADDRS) { @@ -680,7 +680,7 @@ zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) } if (hw->is_pf) { - ret = zxdh_vlan_filter_table_set(hw->vport.vport, vlan_id, on); + ret = zxdh_vlan_filter_table_set(hw, hw->vport.vport, vlan_id, on); if (ret) { PMD_DRV_LOG(ERR, "vlan_id:%d table set failed", vlan_id); return -1; @@ -718,9 +718,9 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) if (mask & RTE_ETH_VLAN_FILTER_MASK) { if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER) { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.vlan_filter_enable = true; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "port %d vlan filter set failed", hw->vport.vfid); @@ -739,9 +739,9 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) } } else { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.vlan_filter_enable = false; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "port %d vlan filter set failed", hw->vport.vfid); @@ -764,9 +764,9 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) if (mask & RTE_ETH_VLAN_STRIP_MASK) { if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.vlan_strip_offload = true; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "port %d vlan strip set failed", hw->vport.vfid); @@ -786,9 +786,9 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) } } else { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.vlan_strip_offload = false; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "port %d vlan strip set failed", hw->vport.vfid); @@ -813,9 +813,9 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) memset(&msg, 0, sizeof(struct zxdh_msg_info)); if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP) { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.qinq_strip_offload = true; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "port %d qinq offload set failed", hw->vport.vfid); @@ -835,9 +835,9 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) } } else { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.qinq_strip_offload = true; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "port %d qinq offload set failed", hw->vport.vfid); @@ -918,7 +918,7 @@ zxdh_dev_rss_reta_update(struct rte_eth_dev *dev, (hw->channel_context[hw->rss_reta[i] * 2].ph_chno); if (hw->is_pf) { - ret = zxdh_rss_table_set(hw->vport.vport, &msg.data.rss_reta); + ret = zxdh_rss_table_set(hw, hw->vport.vport, &msg.data.rss_reta); if (ret) { PMD_DRV_LOG(ERR, "rss reta table set failed"); return -EINVAL; @@ -976,7 +976,7 @@ zxdh_dev_rss_reta_query(struct rte_eth_dev *dev, zxdh_msg_head_build(hw, ZXDH_RSS_RETA_GET, &msg); if (hw->is_pf) { - ret = zxdh_rss_table_get(hw->vport.vport, &reply_msg.reply_body.rss_reta); + ret = zxdh_rss_table_get(hw, hw->vport.vport, &reply_msg.reply_body.rss_reta); if (ret) { PMD_DRV_LOG(ERR, "rss reta table set failed"); return -EINVAL; @@ -1067,9 +1067,9 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, if (need_update_hf) { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.rss_enable = !!rss_conf->rss_hf; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "rss enable set failed"); return -EINVAL; @@ -1085,9 +1085,9 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, } } if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.rss_hash_factor = hw_hf_new; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "rss hash factor set failed"); return -EINVAL; @@ -1129,7 +1129,7 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg); if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "rss hash factor set failed"); return -EINVAL; @@ -1181,9 +1181,9 @@ zxdh_rss_configure(struct rte_eth_dev *dev) if (hw->rss_enable != curr_rss_enable) { if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.rss_enable = curr_rss_enable; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "rss enable set failed"); return -EINVAL; @@ -1207,9 +1207,9 @@ zxdh_rss_configure(struct rte_eth_dev *dev) hw_hf = zxdh_rss_hf_to_hw(dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf); memset(&msg, 0, sizeof(msg)); if (hw->is_pf) { - ret = zxdh_get_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.rss_hash_factor = hw_hf; - ret = zxdh_set_port_attr(hw->vport.vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "rss hash factor set failed"); return -EINVAL; @@ -1244,7 +1244,7 @@ zxdh_rss_configure(struct rte_eth_dev *dev) hw->channel_context[hw->rss_reta[i] * 2].ph_chno; if (hw->is_pf) { - ret = zxdh_rss_table_set(hw->vport.vport, &msg.data.rss_reta); + ret = zxdh_rss_table_set(hw, hw->vport.vport, &msg.data.rss_reta); if (ret) { PMD_DRV_LOG(ERR, "rss reta table set failed"); return -EINVAL; @@ -1294,7 +1294,7 @@ zxdh_hw_vqm_stats_get(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode, } struct zxdh_msg_reply_body *reply_body = &reply_info.reply_body; - rte_memcpy(hw_stats, &reply_body->vqm_stats, sizeof(struct zxdh_hw_vqm_stats)); + memcpy(hw_stats, &reply_body->vqm_stats, sizeof(struct zxdh_hw_vqm_stats)); return 0; } @@ -1315,8 +1315,8 @@ static int zxdh_hw_mac_stats_get(struct rte_eth_dev *dev, bytes_addr = virt_addr + ZXDH_MAC_BYTES_OFFSET + 32 * 4; } - rte_memcpy(mac_stats, (void *)stats_addr, sizeof(struct zxdh_hw_mac_stats)); - rte_memcpy(mac_bytes, (void *)bytes_addr, sizeof(struct zxdh_hw_mac_bytes)); + memcpy(mac_stats, (void *)stats_addr, sizeof(struct zxdh_hw_mac_stats)); + memcpy(mac_bytes, (void *)bytes_addr, sizeof(struct zxdh_hw_mac_bytes)); return 0; } @@ -1334,13 +1334,14 @@ static void zxdh_data_hi_to_lo(uint64_t *data) static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_np_stats_data stats_data; uint32_t stats_id = zxdh_vport_to_vfid(hw->vport); uint32_t idx = 0; int ret = 0; idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE; - ret = zxdh_np_dtb_stats_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid, 0, idx, (uint32_t *)&np_stats->np_tx_broadcast); if (ret) return ret; @@ -1348,7 +1349,7 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE; memset(&stats_data, 0, sizeof(stats_data)); - ret = zxdh_np_dtb_stats_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid, 0, idx, (uint32_t *)&np_stats->np_rx_broadcast); if (ret) return ret; @@ -1356,7 +1357,7 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE; memset(&stats_data, 0, sizeof(stats_data)); - ret = zxdh_np_dtb_stats_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid, 1, idx, (uint32_t *)&stats_data); if (ret) return ret; @@ -1368,7 +1369,7 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE; memset(&stats_data, 0, sizeof(stats_data)); - ret = zxdh_np_dtb_stats_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid, 1, idx, (uint32_t *)&stats_data); if (ret) return ret; @@ -1381,7 +1382,7 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n } static int -zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats) +zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats) { struct zxdh_hw *hw = dev->data->dev_private; struct zxdh_msg_info msg_info = {0}; @@ -1523,7 +1524,7 @@ int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu) return ret; } - ret = zxdh_get_port_attr(vfid, &vport_att); + ret = zxdh_get_port_attr(hw, hw->vport.vport, &vport_att); if (ret != 0) { PMD_DRV_LOG(ERR, "[vfid:%d] zxdh_dev_mtu, get vport failed ret:%d", vfid, ret); @@ -1540,7 +1541,7 @@ int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu) vport_att.mtu_enable = 1; vport_att.mtu = new_mtu; - ret = zxdh_set_port_attr(vfid, &vport_att); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &vport_att); if (ret != 0) { PMD_DRV_LOG(ERR, "[vfid:%d] zxdh_dev_mtu, set vport failed ret:%d", vfid, ret); diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index 32994b719f..0e9cf0a4ca 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -88,9 +88,6 @@ #define ZXDH_BAR_MSG_DST_MPF 2 #define ZXDH_BAR_MSG_DST_PFVF 1 #define ZXDH_BAR_MSG_DST_ERR 0xff - -#define ZXDH_LOCK_TYPE_HARD (1) -#define ZXDH_LOCK_TYPE_SOFT (0) #define ZXDH_BAR_INDEX_TO_RISC 0 #define ZXDH_BAR_CHAN_INDEX_SEND 0 @@ -103,24 +100,18 @@ #define ZXDH_BAR_CHAN_MSG_ACK 1 #define ZXDH_MSG_REPS_OK 0xff -uint8_t subchan_id_tbl[ZXDH_BAR_MSG_SRC_NUM][ZXDH_BAR_MSG_DST_NUM] = { +static uint8_t subchan_id_tbl[ZXDH_BAR_MSG_SRC_NUM][ZXDH_BAR_MSG_DST_NUM] = { {ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_SEND}, {ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_RECV}, {ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_RECV, ZXDH_BAR_CHAN_INDEX_RECV} }; -uint8_t chan_id_tbl[ZXDH_BAR_MSG_SRC_NUM][ZXDH_BAR_MSG_DST_NUM] = { +static uint8_t chan_id_tbl[ZXDH_BAR_MSG_SRC_NUM][ZXDH_BAR_MSG_DST_NUM] = { {ZXDH_BAR_INDEX_TO_RISC, ZXDH_BAR_INDEX_MPF_TO_PFVF, ZXDH_BAR_INDEX_MPF_TO_MPF}, {ZXDH_BAR_INDEX_TO_RISC, ZXDH_BAR_INDEX_PF_TO_VF, ZXDH_BAR_INDEX_PFVF_TO_MPF}, {ZXDH_BAR_INDEX_TO_RISC, ZXDH_BAR_INDEX_PF_TO_VF, ZXDH_BAR_INDEX_PFVF_TO_MPF} }; -uint8_t lock_type_tbl[ZXDH_BAR_MSG_SRC_NUM][ZXDH_BAR_MSG_DST_NUM] = { - {ZXDH_LOCK_TYPE_HARD, ZXDH_LOCK_TYPE_HARD, ZXDH_LOCK_TYPE_HARD}, - {ZXDH_LOCK_TYPE_SOFT, ZXDH_LOCK_TYPE_SOFT, ZXDH_LOCK_TYPE_HARD}, - {ZXDH_LOCK_TYPE_HARD, ZXDH_LOCK_TYPE_HARD, ZXDH_LOCK_TYPE_HARD} -}; - struct zxdh_dev_stat { bool is_mpf_scanned; bool is_res_init; diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h index 6f657da434..fc05211af0 100644 --- a/drivers/net/zxdh/zxdh_msg.h +++ b/drivers/net/zxdh/zxdh_msg.h @@ -301,82 +301,82 @@ struct zxdh_offset_get_msg { uint16_t type; }; -struct __rte_packed_begin zxdh_msg_reply_head { +struct zxdh_msg_reply_head { uint8_t flag; uint16_t reps_len; uint8_t resvd; -} __rte_packed_end; +}; enum zxdh_reps_flag { ZXDH_REPS_FAIL, ZXDH_REPS_SUCC = 0xaa, }; -struct __rte_packed_begin zxdh_link_info_msg { +struct zxdh_link_info_msg { uint8_t autoneg; uint8_t link_state; uint8_t blink_enable; uint8_t duplex; uint32_t speed_modes; uint32_t speed; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_rss_reta { +struct zxdh_rss_reta { uint32_t reta[RTE_ETH_RSS_RETA_SIZE_256]; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_rss_hf { +struct zxdh_rss_hf { uint32_t rss_hf; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_msg_reply_body { +struct zxdh_msg_reply_body { enum zxdh_reps_flag flag; - union __rte_packed_begin { + union { uint8_t reply_data[ZXDH_MSG_REPLY_BODY_MAX_LEN - sizeof(enum zxdh_reps_flag)]; struct zxdh_hw_np_stats np_stats; struct zxdh_link_info_msg link_msg; struct zxdh_rss_reta rss_reta; struct zxdh_rss_hf rss_hf; struct zxdh_hw_vqm_stats vqm_stats; - } __rte_packed_end; -} __rte_packed_end; + }; +}; -struct __rte_packed_begin zxdh_msg_reply_info { +struct zxdh_msg_reply_info { struct zxdh_msg_reply_head reply_head; struct zxdh_msg_reply_body reply_body; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_vf_init_msg { +struct zxdh_vf_init_msg { uint8_t link_up; uint8_t rsv; uint16_t base_qid; uint8_t rss_enable; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_msg_head { +struct zxdh_msg_head { enum zxdh_msg_type msg_type; uint16_t vport; uint16_t vf_id; uint16_t pcieid; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_port_attr_set_msg { +struct zxdh_port_attr_set_msg { uint32_t mode; uint32_t value; uint8_t allmulti_follow; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_mac_filter { +struct zxdh_mac_filter { uint8_t mac_flag; uint8_t filter_flag; struct rte_ether_addr mac; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_port_promisc_msg { +struct zxdh_port_promisc_msg { uint8_t mode; uint8_t value; uint8_t mc_follow; -} __rte_packed_end; +}; struct zxdh_vlan_filter { uint16_t vlan_id; @@ -386,31 +386,31 @@ struct zxdh_vlan_filter_set { uint8_t enable; }; -struct __rte_packed_begin zxdh_vlan_offload { +struct zxdh_vlan_offload { uint8_t enable; uint8_t type; -} __rte_packed_end; +}; struct zxdh_rss_enable { uint8_t enable; }; -struct __rte_packed_begin zxdh_agent_msg_head { +struct zxdh_agent_msg_head { enum zxdh_agent_msg_type msg_type; uint8_t panel_id; uint8_t phyport; uint8_t rsv; uint16_t vf_id; uint16_t pcie_id; -} __rte_packed_end; +}; -struct __rte_packed_begin zxdh_msg_info { +struct zxdh_msg_info { union { uint8_t head_len[ZXDH_MSG_HEAD_LEN]; struct zxdh_msg_head msg_head; struct zxdh_agent_msg_head agent_msg_head; }; - union __rte_packed_begin { + union { uint8_t datainfo[ZXDH_MSG_REQ_BODY_MAX_LEN]; struct zxdh_vf_init_msg vf_init_msg; struct zxdh_port_attr_set_msg port_attr_msg; @@ -423,8 +423,8 @@ struct __rte_packed_begin zxdh_msg_info { struct zxdh_rss_reta rss_reta; struct zxdh_rss_enable rss_enable; struct zxdh_rss_hf rss_hf; - } __rte_packed_end data; -} __rte_packed_end; + } data; +}; typedef int (*zxdh_bar_chan_msg_recv_callback)(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev); diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c index 1e6e8f0e75..01237aba70 100644 --- a/drivers/net/zxdh/zxdh_np.c +++ b/drivers/net/zxdh/zxdh_np.c @@ -19,14 +19,14 @@ static ZXDH_DEV_MGR_T g_dev_mgr; static ZXDH_SDT_MGR_T g_sdt_mgr; static uint32_t g_dpp_dtb_int_enable; static uint32_t g_table_type[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX]; -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_TLB_MGR_T *g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX]; -ZXDH_REG_T g_dpp_reg_info[4]; -ZXDH_DTB_TABLE_T g_dpp_dtb_table_info[4]; -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; +static ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX]; +static ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX]; +static ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX]; +static ZXDH_TLB_MGR_T *g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX]; +static ZXDH_REG_T g_dpp_reg_info[4]; +static ZXDH_DTB_TABLE_T g_dpp_dtb_table_info[4]; +static ZXDH_SDT_TBL_DATA_T g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX]; +static ZXDH_PPU_STAT_CFG_T g_ppu_stat_cfg; #define ZXDH_SDT_MGR_PTR_GET() (&g_sdt_mgr) #define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id]) @@ -873,8 +873,7 @@ zxdh_np_sdt_mgr_destroy(uint32_t dev_id) p_sdt_tbl_temp = ZXDH_SDT_SOFT_TBL_GET(dev_id); p_sdt_mgr = ZXDH_SDT_MGR_PTR_GET(); - if (p_sdt_tbl_temp != NULL) - free(p_sdt_tbl_temp); + free(p_sdt_tbl_temp); ZXDH_SDT_SOFT_TBL_GET(dev_id) = NULL; @@ -1024,11 +1023,10 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id, { uint32_t temp_idx; uint32_t dtb_ind_addr; - uint32_t rc; + uint32_t rc = 0; switch (wrt_mode) { case ZXDH_ERAM128_OPR_128b: - { if ((0xFFFFFFFF - (base_addr)) < (index)) { PMD_DRV_LOG(ERR, "ICM %s:%d[Error:VALUE[val0=0x%x]" "INVALID] [val1=0x%x] FUNCTION :%s", __FILE__, __LINE__, @@ -1042,20 +1040,14 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id, } temp_idx = index << 7; break; - } - case ZXDH_ERAM128_OPR_64b: - { if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) { PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range"); return 1; } temp_idx = index << 6; break; - } - case ZXDH_ERAM128_OPR_1b: - { if ((base_addr + (index >> 7)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) { PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range"); return 1; @@ -1063,7 +1055,6 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id, temp_idx = index; } - } dtb_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + temp_idx; @@ -1086,16 +1077,12 @@ zxdh_np_eram_dtb_len_get(uint32_t mode) switch (mode) { case ZXDH_ERAM128_OPR_128b: - { dtb_len += 2; break; - } case ZXDH_ERAM128_OPR_64b: case ZXDH_ERAM128_OPR_1b: - { dtb_len += 1; break; - } default: break; } @@ -1130,22 +1117,15 @@ zxdh_np_dtb_eram_one_entry(uint32_t dev_id, switch (opr_mode) { case ZXDH_ERAM128_TBL_128b: - { opr_mode = ZXDH_ERAM128_OPR_128b; break; - } case ZXDH_ERAM128_TBL_64b: - { opr_mode = ZXDH_ERAM128_OPR_64b; break; - } - case ZXDH_ERAM128_TBL_1b: - { opr_mode = ZXDH_ERAM128_OPR_1b; break; } - } if (del_en) { memset((uint8_t *)buff, 0, sizeof(buff)); @@ -1409,7 +1389,7 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t tbl_type; uint32_t addr_offset; uint32_t max_size; - uint32_t rc; + uint32_t rc = 0; p_data_buff = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0); ZXDH_COMM_CHECK_POINT(p_data_buff); @@ -1428,19 +1408,15 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id, tbl_type = zxdh_np_sdt_tbl_type_get(dev_id, sdt_no); switch (tbl_type) { case ZXDH_SDT_TBLT_ERAM: - { rc = zxdh_np_dtb_eram_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE, 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; @@ -1523,19 +1499,15 @@ zxdh_np_dtb_table_entry_delete(uint32_t dev_id, 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; @@ -1586,26 +1558,19 @@ zxdh_np_sdt_tbl_data_parser(uint32_t sdt_hig32, uint32_t sdt_low32, void *p_sdt_ switch (tbl_type) { case ZXDH_SDT_TBLT_ERAM: - { p_sdt_eram = (ZXDH_SDTTBL_ERAM_T *)p_sdt_info; p_sdt_eram->table_type = tbl_type; p_sdt_eram->eram_clutch_en = clutch_en; break; - } - case ZXDH_SDT_TBLT_PORTTBL: - { p_sdt_porttbl = (ZXDH_SDTTBL_PORTTBL_T *)p_sdt_info; p_sdt_porttbl->table_type = tbl_type; p_sdt_porttbl->porttbl_clutch_en = clutch_en; break; - } default: - { PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type); return 1; } - } return 0; } @@ -1634,23 +1599,17 @@ zxdh_np_eram_index_cal(uint32_t eram_mode, uint32_t index, switch (eram_mode) { case ZXDH_ERAM128_TBL_128b: - { row_index = index; break; - } case ZXDH_ERAM128_TBL_64b: - { row_index = (index >> 1); col_index = index & 0x1; break; - } case ZXDH_ERAM128_TBL_1b: - { row_index = (index >> 7); col_index = index & 0x7F; break; } - } *p_row_index = row_index; *p_col_index = col_index; } @@ -1676,22 +1635,16 @@ zxdh_np_dtb_eram_data_get(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no, switch (rd_mode) { case ZXDH_ERAM128_TBL_128b: - { memcpy(p_data, temp_data, (128 / 8)); break; - } case ZXDH_ERAM128_TBL_64b: - { memcpy(p_data, temp_data + ((1 - col_index) << 1), (64 / 8)); break; - } case ZXDH_ERAM128_TBL_1b: - { ZXDH_COMM_UINT32_GET_BITS(p_data[0], *(temp_data + (3 - col_index / 32)), (col_index % 32), 1); break; } - } return rc; } @@ -1703,7 +1656,7 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id, { ZXDH_SDT_TBL_DATA_T sdt_tbl = {0}; uint32_t tbl_type = 0; - uint32_t rc; + uint32_t rc = 0; uint32_t sdt_no; sdt_no = get_entry->sdt_no; @@ -1713,20 +1666,16 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id, ZXDH_SDT_H_TBL_TYPE_BT_POS, ZXDH_SDT_H_TBL_TYPE_BT_LEN); switch (tbl_type) { case ZXDH_SDT_TBLT_ERAM: - { rc = zxdh_np_dtb_eram_data_get(dev_id, queue_id, sdt_no, (ZXDH_DTB_ERAM_ENTRY_INFO_T *)get_entry->p_entry_data); ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_eram_data_get"); break; - } default: - { PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type); return 1; } - } return 0; } @@ -1945,23 +1894,17 @@ zxdh_np_dtb_se_smmu0_ind_read(uint32_t dev_id, switch (rd_mode) { case ZXDH_ERAM128_OPR_128b: - { row_index = index; break; - } case ZXDH_ERAM128_OPR_64b: - { row_index = (index >> 1); col_index = index & 0x1; break; - } case ZXDH_ERAM128_OPR_1b: - { row_index = (index >> 7); col_index = index & 0x7F; break; } - } eram_dump_base_addr = base_addr + row_index; rc = zxdh_np_dtb_se_smmu0_dma_dump(dev_id, @@ -1974,24 +1917,16 @@ zxdh_np_dtb_se_smmu0_ind_read(uint32_t dev_id, switch (rd_mode) { case ZXDH_ERAM128_OPR_128b: - { memcpy(p_data, temp_data, (128 / 8)); break; - } - case ZXDH_ERAM128_OPR_64b: - { memcpy(p_data, temp_data + ((1 - col_index) << 1), (64 / 8)); break; - } - case ZXDH_ERAM128_OPR_1b: - { ZXDH_COMM_UINT32_GET_BITS(p_data[0], *(temp_data + (3 - col_index / 32)), (col_index % 32), 1); break; } - } return rc; } diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index fe228e2227..f169eca575 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -27,17 +27,19 @@ #define ZXDH_VLAN_FILTER_VLANID_STEP 120 int -zxdh_set_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr) +zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_table *port_attr) { + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; + union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; int ret = 0; - ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr}; + ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid, (uint32_t *)port_attr}; ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry}; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &user_entry_write); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &user_entry_write); if (ret != 0) - PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid); + PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vport_num.vfid); return ret; } @@ -64,7 +66,7 @@ zxdh_port_attr_init(struct rte_eth_dev *dev) if (!port_attr.rss_enable) port_attr.port_base_qid = 0; - ret = zxdh_set_port_attr(hw->vfid, &port_attr); + ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "write port_attr failed"); ret = -1; @@ -90,6 +92,7 @@ int zxdh_port_attr_uninit(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_msg_info msg_info = {0}; struct zxdh_port_attr_table port_attr = {0}; int ret = 0; @@ -100,7 +103,7 @@ zxdh_port_attr_uninit(struct rte_eth_dev *dev) .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); + ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) { PMD_DRV_LOG(ERR, "delete port attr table failed"); ret = -1; @@ -119,6 +122,7 @@ zxdh_port_attr_uninit(struct rte_eth_dev *dev) int zxdh_panel_table_init(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; int ret; if (!hw->is_pf) @@ -140,7 +144,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev) .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE, .p_entry_data = (void *)&panel_entry }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) { PMD_DRV_LOG(ERR, "Insert eram-panel failed, code:%u", ret); @@ -153,6 +157,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev) int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; uint8_t index_phy_port = hw->phyport; ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = { @@ -163,7 +168,7 @@ int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_ .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE, .p_entry_data = (void *)&panel_entry }; - int ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &entry, 1); + int ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1); if (ret != 0) PMD_DRV_LOG(ERR, "get panel table failed"); @@ -174,6 +179,7 @@ int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; uint8_t index_phy_port = hw->phyport; ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = { @@ -184,7 +190,7 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_ .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE, .p_entry_data = (void *)&panel_entry }; - int ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry); + int ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) PMD_DRV_LOG(ERR, "Insert panel table failed"); @@ -193,23 +199,26 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_ } int -zxdh_get_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr) +zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_table *port_attr) { - int ret; - - ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr}; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; + union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid, (uint32_t *)port_attr}; ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VPORT_ATT_TABLE, &entry}; + int ret; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &user_entry_get, 1); + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1); if (ret != 0) - PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret); + PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vport_num.vfid, ret); return ret; } int -zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_search_idx) +zxdh_set_mac_table(struct zxdh_hw *hw, uint16_t vport, + struct rte_ether_addr *addr, uint8_t hash_search_idx) { + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_mac_unicast_table unicast_table = {0}; struct zxdh_mac_multicast_table multicast_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; @@ -230,8 +239,8 @@ zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se .p_entry_data = (void *)&dtb_hash_entry }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_get); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &entry_get); if (ret) { PMD_DRV_LOG(ERR, "Insert mac_table failed"); return -ret; @@ -251,7 +260,7 @@ zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se .p_entry_data = (void *)&dtb_hash_entry }; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1); uint8_t index = (vport_num.vfid % 64) / 32; if (ret == 0) { @@ -283,7 +292,7 @@ zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se } } - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_get); if (ret) { PMD_DRV_LOG(ERR, "add mac_table failed, code:%d", ret); @@ -295,8 +304,10 @@ zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se } int -zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_search_idx) +zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, + struct rte_ether_addr *addr, uint8_t hash_search_idx) { + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_mac_unicast_table unicast_table = {0}; struct zxdh_mac_multicast_table multicast_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; @@ -318,8 +329,8 @@ zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se .p_entry_data = (void *)&dtb_hash_entry }; - ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_get); + ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, + dtb_data->queueid, 1, &entry_get); if (ret) { PMD_DRV_LOG(ERR, "delete l2_fwd_hash_table failed, code:%d", ret); return -ret; @@ -338,8 +349,8 @@ zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se .p_entry_data = (void *)&dtb_hash_entry }; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, - g_dtb_data.queueid, &entry_get, 1); + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, + dtb_data->queueid, &entry_get, 1); uint8_t index = (vport_num.vfid % 64) / 32; if (vport_num.vf_flag) multicast_table.entry.mc_bitmap[index] &= @@ -347,8 +358,8 @@ zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se else multicast_table.entry.mc_pf_enable = 0; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_get); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &entry_get); if (ret) { PMD_DRV_LOG(ERR, "mac_addr_add mc_table failed, code:%d", ret); return -ret; @@ -367,7 +378,7 @@ zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se .p_entry_data = (void *)&dtb_hash_entry }; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1); if (multicast_table.entry.mc_bitmap[0] == 0 && multicast_table.entry.mc_bitmap[1] == 0 && @@ -392,8 +403,8 @@ zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_se .p_entry_data = (void *)&dtb_hash_entry }; - ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_get); + ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, + dtb_data->queueid, 1, &entry_get); } } } @@ -404,6 +415,7 @@ int zxdh_promisc_table_init(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; uint32_t ret, vf_group_id = 0; struct zxdh_brocast_table brocast_table = {0}; struct zxdh_unitcast_table uc_table = {0}; @@ -423,8 +435,8 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev) .p_entry_data = (void *)&eram_brocast_entry }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_brocast); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &entry_brocast); if (ret) { PMD_DRV_LOG(ERR, "write brocast table failed"); return ret; @@ -440,8 +452,8 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev) .p_entry_data = (void *)&eram_uc_entry }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_unicast); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &entry_unicast); if (ret) { PMD_DRV_LOG(ERR, "write unicast table failed"); return ret; @@ -457,7 +469,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev) .p_entry_data = (void *)&eram_mc_entry }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_multicast); if (ret) { PMD_DRV_LOG(ERR, "write multicast table failed"); @@ -472,6 +484,7 @@ int zxdh_promisc_table_uninit(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; uint32_t ret, vf_group_id = 0; struct zxdh_brocast_table brocast_table = {0}; struct zxdh_unitcast_table uc_table = {0}; @@ -491,8 +504,8 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev) .p_entry_data = (void *)&eram_brocast_entry }; - ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_brocast); + ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, + dtb_data->queueid, 1, &entry_brocast); if (ret) { PMD_DRV_LOG(ERR, "write brocast table failed"); return ret; @@ -508,8 +521,8 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev) .p_entry_data = (void *)&eram_uc_entry }; - ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &entry_unicast); + ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, + dtb_data->queueid, 1, &entry_unicast); if (ret) { PMD_DRV_LOG(ERR, "write unicast table failed"); return ret; @@ -525,7 +538,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev) .p_entry_data = (void *)&eram_mc_entry }; - ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, g_dtb_data.queueid, + ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &entry_multicast); if (ret) { PMD_DRV_LOG(ERR, "write multicast table failed"); @@ -539,9 +552,10 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev) int zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) { - int16_t ret = 0; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_unitcast_table uc_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + int16_t ret = 0; ZXDH_DTB_ERAM_ENTRY_INFO_T uc_table_entry = { .index = ((hw->vfid - ZXDH_BASE_VFID) << 2) + vport_num.vfid / 64, @@ -552,7 +566,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) .p_entry_data = (void *)&uc_table_entry }; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &entry, 1); + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1); if (ret) { PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", hw->vfid); return -ret; @@ -569,7 +583,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) uc_table.uc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6)); } - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) { PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid); return -ret; @@ -580,9 +594,10 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) int zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) { - int16_t ret = 0; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_multicast_table mc_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + int16_t ret = 0; ZXDH_DTB_ERAM_ENTRY_INFO_T mc_table_entry = { .index = ((hw->vfid - ZXDH_BASE_VFID) << 2) + vport_num.vfid / 64, @@ -593,7 +608,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) .p_entry_data = (void *)&mc_table_entry }; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &entry, 1); + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1); if (ret) { PMD_DRV_LOG(ERR, "allmulti_table_get_failed:%d", hw->vfid); return -ret; @@ -610,7 +625,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) } else { mc_table.mc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6)); } - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) { PMD_DRV_LOG(ERR, "allmulti_table_set_failed:%d", hw->vfid); return -ret; @@ -622,6 +637,7 @@ int zxdh_vlan_filter_table_init(struct rte_eth_dev *dev) { struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_vlan_filter_table vlan_table = {0}; int16_t ret = 0; @@ -643,8 +659,8 @@ zxdh_vlan_filter_table_init(struct rte_eth_dev *dev) }; ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data}; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &user_entry); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &user_entry); if (ret != 0) { PMD_DRV_LOG(ERR, "[vfid:%d], vlan_group:%d, init vlan filter table failed", @@ -657,8 +673,9 @@ zxdh_vlan_filter_table_init(struct rte_eth_dev *dev) } int -zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable) +zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id, uint8_t enable) { + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_vlan_filter_table vlan_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; int ret = 0; @@ -677,7 +694,7 @@ zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable) ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = {index, (uint32_t *)&vlan_table}; ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data}; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &user_entry_get, 1); + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1); if (ret) { PMD_DRV_LOG(ERR, "get vlan table failed"); return -1; @@ -703,8 +720,8 @@ zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable) .p_entry_data = &entry_data }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &user_entry_write); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &user_entry_write); if (ret != 0) { PMD_DRV_LOG(ERR, "write vlan table failed"); return -1; @@ -713,8 +730,9 @@ zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable) } int -zxdh_rss_table_set(uint16_t vport, struct zxdh_rss_reta *rss_reta) +zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta) { + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_rss_to_vqid_table rss_vqid = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; int ret = 0; @@ -744,8 +762,8 @@ zxdh_rss_table_set(uint16_t vport, struct zxdh_rss_reta *rss_reta) .sdt_no = ZXDH_SDT_RSS_ATT_TABLE, .p_entry_data = &entry }; - ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, - g_dtb_data.queueid, 1, &user_entry_write); + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, + dtb_data->queueid, 1, &user_entry_write); if (ret != 0) { PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vport_num.vfid); return ret; @@ -755,8 +773,9 @@ zxdh_rss_table_set(uint16_t vport, struct zxdh_rss_reta *rss_reta) } int -zxdh_rss_table_get(uint16_t vport, struct zxdh_rss_reta *rss_reta) +zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta) { + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; struct zxdh_rss_to_vqid_table rss_vqid = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; int ret = 0; @@ -765,8 +784,8 @@ zxdh_rss_table_get(uint16_t vport, struct zxdh_rss_reta *rss_reta) ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid * 32 + i, (uint32_t *)&rss_vqid}; ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_RSS_ATT_TABLE, &entry}; - ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, - g_dtb_data.queueid, &user_entry, 1); + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, + dtb_data->queueid, &user_entry, 1); if (ret != 0) { PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vport_num.vfid); return -1; diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h index adedf3d0d3..0ba35b4bd6 100644 --- a/drivers/net/zxdh/zxdh_tables.h +++ b/drivers/net/zxdh/zxdh_tables.h @@ -7,12 +7,25 @@ #include -#define ZXDH_DEVICE_NO 0 #define ZXDH_PORT_MTU_FLAG 9 #define ZXDH_PORT_BASE_QID_FLAG 10 #define ZXDH_PORT_ATTR_IS_UP_FLAG 35 #define ZXDH_PORT_MTU_EN_FLAG 42 +/* eram */ +#define ZXDH_SDT_VPORT_ATT_TABLE 1 + +/* hash */ +#define ZXDH_SDT_L2_ENTRY_TABLE0 64 +#define ZXDH_SDT_L2_ENTRY_TABLE1 65 +#define ZXDH_SDT_L2_ENTRY_TABLE2 66 +#define ZXDH_SDT_L2_ENTRY_TABLE3 67 + +#define ZXDH_SDT_MC_TABLE0 76 +#define ZXDH_SDT_MC_TABLE1 77 +#define ZXDH_SDT_MC_TABLE2 78 +#define ZXDH_SDT_MC_TABLE3 79 + #define ZXDH_MTU_STATS_EGRESS_BASE 0x8481 #define ZXDH_MTU_STATS_INGRESS_BASE 0x8981 #define ZXDH_BROAD_STATS_EGRESS_BASE 0xC902 @@ -212,19 +225,24 @@ struct zxdh_rss_to_vqid_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_set_port_attr(struct zxdh_hw *hw, uint16_t vport, + struct zxdh_port_attr_table *port_attr); int zxdh_port_attr_uninit(struct rte_eth_dev *dev); -int zxdh_get_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr); -int zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_search_idx); -int zxdh_del_mac_table(uint16_t vport, struct rte_ether_addr *addr, uint8_t hash_search_idx); +int zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, + struct zxdh_port_attr_table *port_attr); +int zxdh_set_mac_table(struct zxdh_hw *hw, uint16_t vport, + struct rte_ether_addr *addr, uint8_t hash_search_idx); +int zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, + struct rte_ether_addr *addr, uint8_t hash_search_idx); int zxdh_promisc_table_init(struct rte_eth_dev *dev); int zxdh_promisc_table_uninit(struct rte_eth_dev *dev); int zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable); int zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable); int zxdh_vlan_filter_table_init(struct rte_eth_dev *dev); -int zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable); -int zxdh_rss_table_set(uint16_t vport, struct zxdh_rss_reta *rss_reta); -int zxdh_rss_table_get(uint16_t vport, struct zxdh_rss_reta *rss_reta); +int zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, + uint16_t vlan_id, uint8_t enable); +int zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta); +int zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta); int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr); int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr); -- 2.27.0