Commit 6060aa7b authored by Weibo Zhao's avatar Weibo Zhao Committed by JiangShui
Browse files

hns3 udma: mmap doorbell address to uar page

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I85R2F


CVE: NA

-----------------------------------------------

This patch mmap doorbell address of hardware to
uar page. Doorbell address is in bar23 area.

Signed-off-by: default avatarWeibo Zhao <zhaoweibo3@huawei.com>
parent e63f303b
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -17,6 +17,13 @@
#define _UDMA_ABI_H

#include <linux/types.h>

#define MAP_COMMAND_MASK		0xff

enum {
	UDMA_MMAP_UAR_PAGE,
};

struct udma_create_ctx_resp {
	uint32_t num_comp_vectors;
	uint32_t num_qps_shift;
+35 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
 *
 */

#include <linux/iommu.h>
#include <linux/pci.h>
#include "urma/ubcore_api.h"
#include "hns3_udma_abi.h"
@@ -126,11 +127,45 @@ static int udma_free_ucontext(struct ubcore_ucontext *uctx)
	return 0;
}

static int get_mmap_cmd(struct vm_area_struct *vma)
{
	return (vma->vm_pgoff & MAP_COMMAND_MASK);
}

static int udma_mmap(struct ubcore_ucontext *uctx, struct vm_area_struct *vma)
{
	struct udma_dev *udma_dev = to_udma_dev(uctx->ub_dev);
	int cmd;

	if (((vma->vm_end - vma->vm_start) % PAGE_SIZE) != 0) {
		dev_err(udma_dev->dev,
			"mmap failed, unexpected vm area size.\n");
		return -EINVAL;
	}

	cmd = get_mmap_cmd(vma);
	switch (cmd) {
	case UDMA_MMAP_UAR_PAGE:
		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
		if (io_remap_pfn_range(vma, vma->vm_start,
				       to_udma_ucontext(uctx)->uar.pfn,
				       PAGE_SIZE, vma->vm_page_prot))
			return -EAGAIN;
		break;
	default:
		dev_err(udma_dev->dev,
			"mmap failed, cmd(%d) not support\n", cmd);
		return -EINVAL;
	}

	return 0;
}
static struct ubcore_ops g_udma_dev_ops = {
	.owner = THIS_MODULE,
	.abi_version = 1,
	.alloc_ucontext = udma_alloc_ucontext,
	.free_ucontext = udma_free_ucontext,
	.mmap = udma_mmap,
};

static void udma_cleanup_uar_table(struct udma_dev *dev)