diff --git a/drivers/ub/hw/hns3/hns3_udma_abi.h b/drivers/ub/hw/hns3/hns3_udma_abi.h index 29b66ba20179b7f2ef4ac9dbf7f4b616d5af2c93..cd6465191522e33597a9ec4693818f9bd91fc5a8 100644 --- a/drivers/ub/hw/hns3/hns3_udma_abi.h +++ b/drivers/ub/hw/hns3/hns3_udma_abi.h @@ -23,9 +23,9 @@ #define MAP_INDEX_SHIFT 8 #define UDMA_DWQE_PAGE_SIZE 65536 #define UDMA_JETTY_X_PREFIX_BIT_NUM 2 -#define UDMA_JFS_QPN_PREFIX 0x0 +#define UDMA_JFS_QPN_PREFIX 0x2 #define UDMA_JFR_QPN_PREFIX 0x1 -#define UDMA_JETTY_QPN_PREFIX 0x2 +#define UDMA_JETTY_QPN_PREFIX 0x3 #define UDMA_ADDR_4K_MASK 0xfffUL #define URMA_SEG_ACCESS_GUARD (1UL << 5) #define UDMA_DCA_ATTACH_FLAGS_NEW_BUFFER BIT(0) @@ -72,8 +72,8 @@ struct udma_create_jfr_resp { struct udma_jfc_attr_ex { uint64_t jfc_ex_mask; /* Use enum udma_jfc_init_attr_mask */ uint64_t create_flags; /* Use enum udma_jfc_create_flags */ - uint8_t poe_channel; /* poe channel to use */ uint64_t notify_addr; + uint8_t poe_channel; /* poe channel to use */ uint8_t notify_mode; /* Use enum udma_jfc_notify_mode */ }; @@ -123,8 +123,8 @@ enum udma_qp_cap_flags { }; struct udp_srcport { - bool um_spray_en; uint16_t um_data_udp_start; + bool um_spray_en; uint8_t um_udp_range; }; diff --git a/drivers/ub/hw/hns3/hns3_udma_eid.c b/drivers/ub/hw/hns3/hns3_udma_eid.c index ccfbb2093b59b2ec092ef9afe63188867cbc3ca1..08d00fa69220b221dc7c77b1224b8e4ec4df268e 100644 --- a/drivers/ub/hw/hns3/hns3_udma_eid.c +++ b/drivers/ub/hw/hns3/hns3_udma_eid.c @@ -118,10 +118,11 @@ static int del_eid_entry(struct udma_dev *udma_dev, uint32_t eid_index) static int udma_check_ueid_cfg(struct udma_dev *dev, uint16_t fe_idx, uint32_t eid_index) { - if (fe_idx != UDMA_NON_VIRTUALIZATION_FE_ID) { + if (fe_idx != dev->func_id) { dev_err(dev->dev, "Check FE ID failed.\n"); return -EINVAL; } + if (eid_index >= dev->caps.max_eid_cnt) { dev_err(dev->dev, "Invalid EID index(%u), max value is %u.\n", eid_index, dev->caps.max_eid_cnt); diff --git a/drivers/ub/hw/hns3/hns3_udma_jetty.c b/drivers/ub/hw/hns3/hns3_udma_jetty.c index e4b6ffcc2f98873b1343b297206f7e6fad7922bc..78bc3706f06b94007c0873374ecff8997ac4af5f 100644 --- a/drivers/ub/hw/hns3/hns3_udma_jetty.c +++ b/drivers/ub/hw/hns3/hns3_udma_jetty.c @@ -124,6 +124,12 @@ static int alloc_jetty_um_qp(struct udma_dev *dev, struct udma_jetty *jetty, return ret; } + ret = udma_init_qpc(dev, &jetty->qp); + if (ret) { + udma_destroy_qp_common(dev, &jetty->qp); + return ret; + } + jetty->qp.state = QPS_RESET; ret = udma_modify_qp_jetty(dev, jetty, QPS_RTS); if (ret) @@ -163,10 +169,10 @@ static int set_jetty_buf_attr(struct udma_dev *udma_dev, struct udma_jetty *jetty, struct udma_buf_attr *buf_attr) { - int totle_buff_size = 0; + uint32_t total_buff_size = 0; uint32_t cfg_depth; - int buf_size; - int idx = 0; + uint32_t buf_size; + uint32_t idx = 0; /* SQ WQE */ jetty->rc_node.sge_offset = 0; @@ -182,10 +188,10 @@ static int set_jetty_buf_attr(struct udma_dev *udma_dev, buf_attr->region[idx].size = buf_size; buf_attr->region[idx].hopnum = udma_dev->caps.wqe_sq_hop_num; idx++; - totle_buff_size += buf_size; + total_buff_size += buf_size; } /* extend SGE WQE in SQ */ - jetty->rc_node.sge_offset = totle_buff_size; + jetty->rc_node.sge_offset = total_buff_size; buf_size = to_udma_hem_entries_size(jetty->rc_node.sge_cnt, jetty->rc_node.sge_shift); @@ -193,11 +199,14 @@ static int set_jetty_buf_attr(struct udma_dev *udma_dev, buf_attr->region[idx].size = buf_size; buf_attr->region[idx].hopnum = udma_dev->caps.wqe_sge_hop_num; idx++; - totle_buff_size += buf_size; + total_buff_size += buf_size; } - if (totle_buff_size < 1) + if (total_buff_size < 1) { + dev_err(udma_dev->dev, "jetty buf size is invalid, size = %u.\n", + total_buff_size); return -EINVAL; + } buf_attr->region_count = idx; buf_attr->mtt_only = false; diff --git a/drivers/ub/hw/hns3/hns3_udma_jfr.c b/drivers/ub/hw/hns3/hns3_udma_jfr.c index 83ad794aadc364f0d40a72b97876c5c1e58cea29..957a87b36eae7951df3e3ac90528b8f908d0c683 100644 --- a/drivers/ub/hw/hns3/hns3_udma_jfr.c +++ b/drivers/ub/hw/hns3/hns3_udma_jfr.c @@ -510,6 +510,11 @@ static int alloc_jfr_um_qp(struct udma_dev *dev, struct udma_jfr *jfr) dev_err(dev->dev, "failed to create qpc.\n"); goto failed_create_qpc; } + + ret = udma_init_qpc(dev, qp); + if (ret) + goto failed_modify_qpc; + jfr->um_qp = qp; qp->state = QPS_RESET; diff --git a/drivers/ub/hw/hns3/hns3_udma_jfs.c b/drivers/ub/hw/hns3/hns3_udma_jfs.c index 2ff0d3b3f8cc9992486c500f7d02126ecb7d0824..0c914f0ac9f32df8433c7e8a4aa820c426ad8fa0 100644 --- a/drivers/ub/hw/hns3/hns3_udma_jfs.c +++ b/drivers/ub/hw/hns3/hns3_udma_jfs.c @@ -103,8 +103,14 @@ static int create_jfs_um_qp(struct udma_dev *dev, struct udma_jfs *jfs, udma_fill_jfs_um_qp_attr(dev, jfs, &jfs->um_qp.qp_attr, udata->uctx, cfg); jfs->um_qp.qp_attr.qpn_map = &jfs->qpn_map; ret = udma_create_qp_common(dev, &jfs->um_qp, udata); - if (ret) + if (ret) { dev_err(dev->dev, "failed to create qp for um jfs.\n"); + return ret; + } + + ret = udma_init_qpc(dev, &jfs->um_qp); + if (ret) + udma_destroy_qp_common(dev, &jfs->um_qp); return ret; } diff --git a/drivers/ub/hw/hns3/hns3_udma_main.c b/drivers/ub/hw/hns3/hns3_udma_main.c index ed42f5280b425e98006a481c56804095d2b1ec6d..6a9249c6b0758f58aa4d0579b3d5d16bef394c9a 100644 --- a/drivers/ub/hw/hns3/hns3_udma_main.c +++ b/drivers/ub/hw/hns3/hns3_udma_main.c @@ -358,7 +358,7 @@ static int udma_query_device_attr(struct ubcore_device *dev, attr->dev_cap.feature.bs.oor = udma_dev->caps.oor_en; attr->dev_cap.ceq_cnt = udma_dev->caps.num_comp_vectors; attr->dev_cap.feature.bs.jfc_inline = !!(udma_dev->caps.flags & UDMA_CAP_FLAG_CQE_INLINE); - attr->dev_cap.feature.bs.spray_en = 1; + attr->dev_cap.feature.bs.spray_en = !!(udma_dev->caps.flags & UDMA_CAP_FLAG_AR); attr->dev_cap.max_jfs_rsge = udma_dev->caps.max_sq_sg; attr->dev_cap.congestion_ctrl_alg = query_congest_alg(udma_dev->caps.cong_type); attr->dev_cap.max_fe_cnt = udma_dev->func_num - 1; diff --git a/drivers/ub/hw/hns3/hns3_udma_qp.c b/drivers/ub/hw/hns3/hns3_udma_qp.c index fff196e85838f3c1018234e6b408861cb200c3af..603085a6d4701d60f8d3f54bb02e9c7b78987740 100644 --- a/drivers/ub/hw/hns3/hns3_udma_qp.c +++ b/drivers/ub/hw/hns3/hns3_udma_qp.c @@ -1887,12 +1887,23 @@ static int udma_alloc_qp_sq(struct udma_dev *udma_dev, struct udma_qp *qp, return ret; } +int udma_init_qpc(struct udma_dev *udma_dev, struct udma_qp *qp) +{ + struct udma_qp_context ctx[2] = {}; + int ret; + + ret = udma_pass_qpc_to_hw(udma_dev, ctx, ctx + 1, qp); + if (ret) + dev_err(udma_dev->dev, "failed to init QPC to HW, ret = %d.\n", ret); + + return ret; +} + int udma_create_qp_common(struct udma_dev *udma_dev, struct udma_qp *qp, struct ubcore_udata *udata) { struct udma_ucontext *uctx = to_udma_ucontext(udata->uctx); struct udma_qp_attr *qp_attr = &qp->qp_attr; - struct udma_qp_context ctx[2] = {0}; struct device *dev = udma_dev->dev; struct udma_create_tp_ucmd ucmd; struct udma_create_tp_resp resp; @@ -1965,12 +1976,6 @@ int udma_create_qp_common(struct udma_dev *udma_dev, struct udma_qp *qp, refcount_set(&qp->refcount, 1); init_completion(&qp->free); - ret = udma_pass_qpc_to_hw(udma_dev, ctx, ctx+1, qp); - if (ret) { - dev_err(dev, "failed to pass QPC to HW, ret = %d.\n", ret); - goto err_copy; - } - return 0; err_copy: diff --git a/drivers/ub/hw/hns3/hns3_udma_qp.h b/drivers/ub/hw/hns3/hns3_udma_qp.h index 35c1a5999682422e2e741ded2bfee501bc8ca4ae..ca5b0a4d2268aeca7adfc8baead9b9f4981b50b9 100644 --- a/drivers/ub/hw/hns3/hns3_udma_qp.h +++ b/drivers/ub/hw/hns3/hns3_udma_qp.h @@ -369,6 +369,7 @@ int udma_flush_cqe(struct udma_dev *udma_dev, struct udma_qp *udma_qp, void udma_qp_event(struct udma_dev *udma_dev, uint32_t qpn, int event_type); void copy_send_jfc(struct udma_qp *from_qp, struct udma_qp *to_qp); int udma_set_dca_buf(struct udma_dev *dev, struct udma_qp *qp); +int udma_init_qpc(struct udma_dev *udma_dev, struct udma_qp *qp); static inline uint8_t get_affinity_cq_bank(uint8_t qp_bank) { diff --git a/drivers/ub/hw/hns3/hns3_udma_tp.c b/drivers/ub/hw/hns3/hns3_udma_tp.c index 149c53662f02ee3fa93d0ef765ca9af31ce63c9f..0a51bb001d91ef002f527443b7610bc9e4a4e824 100644 --- a/drivers/ub/hw/hns3/hns3_udma_tp.c +++ b/drivers/ub/hw/hns3/hns3_udma_tp.c @@ -467,16 +467,24 @@ struct ubcore_tp *udma_create_tp(struct ubcore_device *dev, struct ubcore_tp_cfg udma_set_tp(dev, cfg, tp); ret = udma_store_tp(udma_dev, tp, &fail_ret_tp); - unlock_jetty(&tp->qp.qp_attr); if (ret || fail_ret_tp) goto failed_create_qp; + ret = udma_init_qpc(udma_dev, &tp->qp); + if (ret) + goto failed_init_qpc; + + unlock_jetty(&tp->qp.qp_attr); + if (dfx_switch) store_tpn(udma_dev, tp); return &tp->ubcore_tp; +failed_init_qpc: + udma_erase_tp(tp); failed_create_qp: + unlock_jetty(&tp->qp.qp_attr); udma_destroy_qp_common(udma_dev, &tp->qp); failed_alloc_tp: kfree(tp);