|
@@ -1756,10 +1756,9 @@ static int hns_roce_v2_set_mac(struct hns_roce_dev *hr_dev, u8 phy_port,
|
|
|
return hns_roce_cmq_send(hr_dev, &desc, 1);
|
|
|
}
|
|
|
|
|
|
-static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,
|
|
|
- unsigned long mtpt_idx)
|
|
|
+static int set_mtpt_pbl(struct hns_roce_v2_mpt_entry *mpt_entry,
|
|
|
+ struct hns_roce_mr *mr)
|
|
|
{
|
|
|
- struct hns_roce_v2_mpt_entry *mpt_entry;
|
|
|
struct scatterlist *sg;
|
|
|
u64 page_addr;
|
|
|
u64 *pages;
|
|
@@ -1767,6 +1766,53 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,
|
|
|
int len;
|
|
|
int entry;
|
|
|
|
|
|
+ mpt_entry->pbl_size = cpu_to_le32(mr->pbl_size);
|
|
|
+ mpt_entry->pbl_ba_l = cpu_to_le32(lower_32_bits(mr->pbl_ba >> 3));
|
|
|
+ roce_set_field(mpt_entry->byte_48_mode_ba,
|
|
|
+ V2_MPT_BYTE_48_PBL_BA_H_M, V2_MPT_BYTE_48_PBL_BA_H_S,
|
|
|
+ upper_32_bits(mr->pbl_ba >> 3));
|
|
|
+
|
|
|
+ pages = (u64 *)__get_free_page(GFP_KERNEL);
|
|
|
+ if (!pages)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ i = 0;
|
|
|
+ for_each_sg(mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) {
|
|
|
+ len = sg_dma_len(sg) >> PAGE_SHIFT;
|
|
|
+ for (j = 0; j < len; ++j) {
|
|
|
+ page_addr = sg_dma_address(sg) +
|
|
|
+ (j << mr->umem->page_shift);
|
|
|
+ pages[i] = page_addr >> 6;
|
|
|
+ /* Record the first 2 entry directly to MTPT table */
|
|
|
+ if (i >= HNS_ROCE_V2_MAX_INNER_MTPT_NUM - 1)
|
|
|
+ goto found;
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+found:
|
|
|
+ mpt_entry->pa0_l = cpu_to_le32(lower_32_bits(pages[0]));
|
|
|
+ roce_set_field(mpt_entry->byte_56_pa0_h, V2_MPT_BYTE_56_PA0_H_M,
|
|
|
+ V2_MPT_BYTE_56_PA0_H_S, upper_32_bits(pages[0]));
|
|
|
+
|
|
|
+ mpt_entry->pa1_l = cpu_to_le32(lower_32_bits(pages[1]));
|
|
|
+ roce_set_field(mpt_entry->byte_64_buf_pa1, V2_MPT_BYTE_64_PA1_H_M,
|
|
|
+ V2_MPT_BYTE_64_PA1_H_S, upper_32_bits(pages[1]));
|
|
|
+ roce_set_field(mpt_entry->byte_64_buf_pa1,
|
|
|
+ V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M,
|
|
|
+ V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S,
|
|
|
+ mr->pbl_buf_pg_sz + PG_SHIFT_OFFSET);
|
|
|
+
|
|
|
+ free_page((unsigned long)pages);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,
|
|
|
+ unsigned long mtpt_idx)
|
|
|
+{
|
|
|
+ struct hns_roce_v2_mpt_entry *mpt_entry;
|
|
|
+ int ret;
|
|
|
+
|
|
|
mpt_entry = mb_buf;
|
|
|
memset(mpt_entry, 0, sizeof(*mpt_entry));
|
|
|
|
|
@@ -1781,7 +1827,6 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,
|
|
|
mr->pbl_ba_pg_sz + PG_SHIFT_OFFSET);
|
|
|
roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
|
|
|
V2_MPT_BYTE_4_PD_S, mr->pd);
|
|
|
- mpt_entry->byte_4_pd_hop_st = cpu_to_le32(mpt_entry->byte_4_pd_hop_st);
|
|
|
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RA_EN_S, 0);
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_R_INV_EN_S, 1);
|
|
@@ -1796,13 +1841,11 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,
|
|
|
(mr->access & IB_ACCESS_REMOTE_WRITE ? 1 : 0));
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S,
|
|
|
(mr->access & IB_ACCESS_LOCAL_WRITE ? 1 : 0));
|
|
|
- mpt_entry->byte_8_mw_cnt_en = cpu_to_le32(mpt_entry->byte_8_mw_cnt_en);
|
|
|
|
|
|
roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_PA_S,
|
|
|
mr->type == MR_TYPE_MR ? 0 : 1);
|
|
|
roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_INNER_PA_VLD_S,
|
|
|
1);
|
|
|
- mpt_entry->byte_12_mw_pa = cpu_to_le32(mpt_entry->byte_12_mw_pa);
|
|
|
|
|
|
mpt_entry->len_l = cpu_to_le32(lower_32_bits(mr->size));
|
|
|
mpt_entry->len_h = cpu_to_le32(upper_32_bits(mr->size));
|
|
@@ -1813,53 +1856,9 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,
|
|
|
if (mr->type == MR_TYPE_DMA)
|
|
|
return 0;
|
|
|
|
|
|
- mpt_entry->pbl_size = cpu_to_le32(mr->pbl_size);
|
|
|
-
|
|
|
- mpt_entry->pbl_ba_l = cpu_to_le32(lower_32_bits(mr->pbl_ba >> 3));
|
|
|
- roce_set_field(mpt_entry->byte_48_mode_ba, V2_MPT_BYTE_48_PBL_BA_H_M,
|
|
|
- V2_MPT_BYTE_48_PBL_BA_H_S,
|
|
|
- upper_32_bits(mr->pbl_ba >> 3));
|
|
|
- mpt_entry->byte_48_mode_ba = cpu_to_le32(mpt_entry->byte_48_mode_ba);
|
|
|
-
|
|
|
- pages = (u64 *)__get_free_page(GFP_KERNEL);
|
|
|
- if (!pages)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- i = 0;
|
|
|
- for_each_sg(mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) {
|
|
|
- len = sg_dma_len(sg) >> PAGE_SHIFT;
|
|
|
- for (j = 0; j < len; ++j) {
|
|
|
- page_addr = sg_dma_address(sg) +
|
|
|
- (j << mr->umem->page_shift);
|
|
|
- pages[i] = page_addr >> 6;
|
|
|
-
|
|
|
- /* Record the first 2 entry directly to MTPT table */
|
|
|
- if (i >= HNS_ROCE_V2_MAX_INNER_MTPT_NUM - 1)
|
|
|
- goto found;
|
|
|
- i++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-found:
|
|
|
- mpt_entry->pa0_l = cpu_to_le32(lower_32_bits(pages[0]));
|
|
|
- roce_set_field(mpt_entry->byte_56_pa0_h, V2_MPT_BYTE_56_PA0_H_M,
|
|
|
- V2_MPT_BYTE_56_PA0_H_S,
|
|
|
- upper_32_bits(pages[0]));
|
|
|
- mpt_entry->byte_56_pa0_h = cpu_to_le32(mpt_entry->byte_56_pa0_h);
|
|
|
-
|
|
|
- mpt_entry->pa1_l = cpu_to_le32(lower_32_bits(pages[1]));
|
|
|
- roce_set_field(mpt_entry->byte_64_buf_pa1, V2_MPT_BYTE_64_PA1_H_M,
|
|
|
- V2_MPT_BYTE_64_PA1_H_S, upper_32_bits(pages[1]));
|
|
|
+ ret = set_mtpt_pbl(mpt_entry, mr);
|
|
|
|
|
|
- free_page((unsigned long)pages);
|
|
|
-
|
|
|
- roce_set_field(mpt_entry->byte_64_buf_pa1,
|
|
|
- V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M,
|
|
|
- V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S,
|
|
|
- mr->pbl_buf_pg_sz + PG_SHIFT_OFFSET);
|
|
|
- mpt_entry->byte_64_buf_pa1 = cpu_to_le32(mpt_entry->byte_64_buf_pa1);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
|
|
@@ -1868,6 +1867,7 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
|
|
|
u64 size, void *mb_buf)
|
|
|
{
|
|
|
struct hns_roce_v2_mpt_entry *mpt_entry = mb_buf;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (flags & IB_MR_REREG_PD) {
|
|
|
roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
|
|
@@ -1880,14 +1880,14 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
|
|
|
V2_MPT_BYTE_8_BIND_EN_S,
|
|
|
(mr_access_flags & IB_ACCESS_MW_BIND ? 1 : 0));
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en,
|
|
|
- V2_MPT_BYTE_8_ATOMIC_EN_S,
|
|
|
- (mr_access_flags & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0));
|
|
|
+ V2_MPT_BYTE_8_ATOMIC_EN_S,
|
|
|
+ mr_access_flags & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0);
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RR_EN_S,
|
|
|
- (mr_access_flags & IB_ACCESS_REMOTE_READ ? 1 : 0));
|
|
|
+ mr_access_flags & IB_ACCESS_REMOTE_READ ? 1 : 0);
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RW_EN_S,
|
|
|
- (mr_access_flags & IB_ACCESS_REMOTE_WRITE ? 1 : 0));
|
|
|
+ mr_access_flags & IB_ACCESS_REMOTE_WRITE ? 1 : 0);
|
|
|
roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S,
|
|
|
- (mr_access_flags & IB_ACCESS_LOCAL_WRITE ? 1 : 0));
|
|
|
+ mr_access_flags & IB_ACCESS_LOCAL_WRITE ? 1 : 0);
|
|
|
}
|
|
|
|
|
|
if (flags & IB_MR_REREG_TRANS) {
|
|
@@ -1896,21 +1896,13 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
|
|
|
mpt_entry->len_l = cpu_to_le32(lower_32_bits(size));
|
|
|
mpt_entry->len_h = cpu_to_le32(upper_32_bits(size));
|
|
|
|
|
|
- mpt_entry->pbl_size = cpu_to_le32(mr->pbl_size);
|
|
|
- mpt_entry->pbl_ba_l =
|
|
|
- cpu_to_le32(lower_32_bits(mr->pbl_ba >> 3));
|
|
|
- roce_set_field(mpt_entry->byte_48_mode_ba,
|
|
|
- V2_MPT_BYTE_48_PBL_BA_H_M,
|
|
|
- V2_MPT_BYTE_48_PBL_BA_H_S,
|
|
|
- upper_32_bits(mr->pbl_ba >> 3));
|
|
|
- mpt_entry->byte_48_mode_ba =
|
|
|
- cpu_to_le32(mpt_entry->byte_48_mode_ba);
|
|
|
-
|
|
|
mr->iova = iova;
|
|
|
mr->size = size;
|
|
|
+
|
|
|
+ ret = set_mtpt_pbl(mpt_entry, mr);
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int hns_roce_v2_frmr_write_mtpt(void *mb_buf, struct hns_roce_mr *mr)
|