Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33f09219 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Doug Ledford
Browse files

amso1100: fold c2_reg_phys_mr into c2_get_dma_mr



Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarSagi Grimberg <sagig@mellanox.com>
Reviewed-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> [core]
Reviewed-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent f64054d8
Loading
Loading
Loading
Loading
+14 −57
Original line number Original line Diff line number Diff line
@@ -337,43 +337,21 @@ static inline u32 c2_convert_access(int acc)
	    C2_ACF_LOCAL_READ | C2_ACF_WINDOW_BIND;
	    C2_ACF_LOCAL_READ | C2_ACF_WINDOW_BIND;
}
}


static struct ib_mr *c2_reg_phys_mr(struct ib_pd *ib_pd,
static struct ib_mr *c2_get_dma_mr(struct ib_pd *pd, int acc)
				    struct ib_phys_buf *buffer_list,
				    int num_phys_buf, int acc, u64 * iova_start)
{
{
	struct c2_mr *mr;
	struct c2_mr *mr;
	u64 *page_list;
	u64 *page_list;
	u32 total_len;
	const u32 total_len = 0xffffffff;	/* AMSO1100 limit */
	int err, i, j, k, page_shift, pbl_depth;
	int err, page_shift, pbl_depth, i;
	u64 kva = 0;


	pbl_depth = 0;
	pr_debug("%s:%u\n", __func__, __LINE__);
	total_len = 0;


	page_shift = PAGE_SHIFT;
	/*
	/*
	 * If there is only 1 buffer we assume this could
	 * This is a map of all phy mem...use a 32k page_shift.
	 * be a map of all phy mem...use a 32k page_shift.
	 */
	 */
	if (num_phys_buf == 1)
	page_shift = PAGE_SHIFT + 3;
		page_shift += 3;
	pbl_depth = ALIGN(total_len, BIT(page_shift)) >> page_shift;

	for (i = 0; i < num_phys_buf; i++) {

		if (offset_in_page(buffer_list[i].addr)) {
			pr_debug("Unaligned Memory Buffer: 0x%x\n",
				(unsigned int) buffer_list[i].addr);
			return ERR_PTR(-EINVAL);
		}

		if (!buffer_list[i].size) {
			pr_debug("Invalid Buffer Size\n");
			return ERR_PTR(-EINVAL);
		}

		total_len += buffer_list[i].size;
		pbl_depth += ALIGN(buffer_list[i].size,
				   BIT(page_shift)) >> page_shift;
	}


	page_list = vmalloc(sizeof(u64) * pbl_depth);
	page_list = vmalloc(sizeof(u64) * pbl_depth);
	if (!page_list) {
	if (!page_list) {
@@ -382,16 +360,8 @@ static struct ib_mr *c2_reg_phys_mr(struct ib_pd *ib_pd,
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);
	}
	}


	for (i = 0, j = 0; i < num_phys_buf; i++) {
	for (i = 0; i < pbl_depth; i++)

		page_list[i] = (i << page_shift);
		int naddrs;

 		naddrs = ALIGN(buffer_list[i].size,
			       BIT(page_shift)) >> page_shift;
		for (k = 0; k < naddrs; k++)
			page_list[j++] = (buffer_list[i].addr +
						     (k << page_shift));
	}


	mr = kmalloc(sizeof(*mr), GFP_KERNEL);
	mr = kmalloc(sizeof(*mr), GFP_KERNEL);
	if (!mr) {
	if (!mr) {
@@ -399,17 +369,17 @@ static struct ib_mr *c2_reg_phys_mr(struct ib_pd *ib_pd,
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);
	}
	}


	mr->pd = to_c2pd(ib_pd);
	mr->pd = to_c2pd(pd);
	mr->umem = NULL;
	mr->umem = NULL;
	pr_debug("%s - page shift %d, pbl_depth %d, total_len %u, "
	pr_debug("%s - page shift %d, pbl_depth %d, total_len %u, "
		"*iova_start %llx, first pa %llx, last pa %llx\n",
		"*iova_start %llx, first pa %llx, last pa %llx\n",
		__func__, page_shift, pbl_depth, total_len,
		__func__, page_shift, pbl_depth, total_len,
		(unsigned long long) *iova_start,
		(unsigned long long) kva,
	       	(unsigned long long) page_list[0],
	       	(unsigned long long) page_list[0],
	       	(unsigned long long) page_list[pbl_depth-1]);
	       	(unsigned long long) page_list[pbl_depth-1]);
  	err = c2_nsmr_register_phys_kern(to_c2dev(ib_pd->device), page_list,
	err = c2_nsmr_register_phys_kern(to_c2dev(pd->device), page_list,
					 BIT(page_shift), pbl_depth,
					 BIT(page_shift), pbl_depth,
					 total_len, 0, iova_start,
					 total_len, 0, &kva,
					 c2_convert_access(acc), mr);
					 c2_convert_access(acc), mr);
	vfree(page_list);
	vfree(page_list);
	if (err) {
	if (err) {
@@ -420,19 +390,6 @@ static struct ib_mr *c2_reg_phys_mr(struct ib_pd *ib_pd,
	return &mr->ibmr;
	return &mr->ibmr;
}
}


static struct ib_mr *c2_get_dma_mr(struct ib_pd *pd, int acc)
{
	struct ib_phys_buf bl;
	u64 kva = 0;

	pr_debug("%s:%u\n", __func__, __LINE__);

	/* AMSO1100 limit */
	bl.size = 0xffffffff;
	bl.addr = 0;
	return c2_reg_phys_mr(pd, &bl, 1, acc, &kva);
}

static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
				    u64 virt, int acc, struct ib_udata *udata)
				    u64 virt, int acc, struct ib_udata *udata)
{
{