提交 1d065a75 编写于 作者: M Mingqiang Ling 提交者: Xie XiuQi

arm64: Support independence of Warpdrive on page size

driver inclusion
category: bugfix
bugzilla: 13683
CVE: NA

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

Support independence of Warpdrive on page size
The 'qfrs_pg_start' which was showed for user space is updated as
'qfrs_offset'. Secondly, try to mmap 2 pages in MMIO region as
PAGE_SIZE is 4k. As a result, user space warpdrive need no page
size any longer.
Signed-off-by: Nxuzaibo <xuzaibo@huawei.com>
Reviewed-by: Nwangzhou <wangzhou1@hisilicon.com>
Signed-off-by: NMingqiang Ling <lingmingqiang@huawei.com>
Reviewed-by: NXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 c99d3685
...@@ -1446,24 +1446,28 @@ static int hisi_qm_uacce_mmap(struct uacce_queue *q, ...@@ -1446,24 +1446,28 @@ static int hisi_qm_uacce_mmap(struct uacce_queue *q,
size_t sz = vma->vm_end - vma->vm_start; size_t sz = vma->vm_end - vma->vm_start;
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
unsigned long long mmio_base;
unsigned long vm_pgoff; unsigned long vm_pgoff;
int ret; int ret;
switch (qfr->type) { switch (qfr->type) {
case UACCE_QFRT_MMIO: case UACCE_QFRT_MMIO:
WARN_ON(sz > PAGE_SIZE);
vma->vm_flags |= VM_IO; /* Try to mmap corresponding pages size region */
if (qm->ver == QM_HW_V1) if (qm->ver == QM_HW_V2)
mmio_base = qm->phys_base; WARN_ON(sz > PAGE_SIZE * (QM_DOORBELL_PAGE_NR +
QM_V2_DOORBELL_OFFSET / PAGE_SIZE));
else else
mmio_base = qm->phys_base + QM_V2_BASE_OFFSET; WARN_ON(sz > PAGE_SIZE * QM_DOORBELL_PAGE_NR);
vma->vm_flags |= VM_IO;
/* /*
* Warning: This is not safe as multiple queues use the same * Warning: This is not safe as multiple processes use the same
* doorbell, v1 hardware interface problem. will fix it in v2 * doorbell, v1/v2 hardware interface problem. It will be fixed
* it in next version.
*/ */
return remap_pfn_range(vma, vma->vm_start, return remap_pfn_range(vma, vma->vm_start,
mmio_base >> PAGE_SHIFT, qm->phys_base >> PAGE_SHIFT,
sz, pgprot_noncached(vma->vm_page_prot)); sz, pgprot_noncached(vma->vm_page_prot));
case UACCE_QFRT_DUS: case UACCE_QFRT_DUS:
if (qm->use_dma_api) { if (qm->use_dma_api) {
...@@ -2009,6 +2013,7 @@ int hisi_qm_start(struct hisi_qm *qm) ...@@ -2009,6 +2013,7 @@ int hisi_qm_start(struct hisi_qm *qm)
struct uacce_ops *ops = qm->uacce.ops; struct uacce_ops *ops = qm->uacce.ops;
unsigned long dus_page_nr = 0; unsigned long dus_page_nr = 0;
unsigned long dko_page_nr = 0; unsigned long dko_page_nr = 0;
unsigned long mmio_page_nr;
if (qm->use_uacce) { if (qm->use_uacce) {
dus_page_nr = (PAGE_SIZE - 1 + qm->sqe_size * QM_Q_DEPTH + dus_page_nr = (PAGE_SIZE - 1 + qm->sqe_size * QM_Q_DEPTH +
...@@ -2032,18 +2037,21 @@ int hisi_qm_start(struct hisi_qm *qm) ...@@ -2032,18 +2037,21 @@ int hisi_qm_start(struct hisi_qm *qm)
/* reset qfr definition */ /* reset qfr definition */
#ifdef CONFIG_CRYPTO_QM_UACCE #ifdef CONFIG_CRYPTO_QM_UACCE
if (qm->ver == QM_HW_V2)
mmio_page_nr = QM_DOORBELL_PAGE_NR +
QM_V2_DOORBELL_OFFSET / PAGE_SIZE;
else
mmio_page_nr = QM_DOORBELL_PAGE_NR;
if (qm->use_uacce && qm->use_dma_api) { if (qm->use_uacce && qm->use_dma_api) {
ops->qf_pg_start[UACCE_QFRT_MMIO] = 0; ops->qf_pg_start[UACCE_QFRT_MMIO] = 0;
ops->qf_pg_start[UACCE_QFRT_DKO] = UACCE_QFR_NA; ops->qf_pg_start[UACCE_QFRT_DKO] = UACCE_QFR_NA;
ops->qf_pg_start[UACCE_QFRT_DUS] = QM_DOORBELL_PAGE_NR; ops->qf_pg_start[UACCE_QFRT_DUS] = mmio_page_nr;
ops->qf_pg_start[UACCE_QFRT_SS] = QM_DOORBELL_PAGE_NR + ops->qf_pg_start[UACCE_QFRT_SS] = mmio_page_nr + dus_page_nr;
dus_page_nr;
} else if (qm->use_uacce) { } else if (qm->use_uacce) {
ops->qf_pg_start[UACCE_QFRT_MMIO] = 0; ops->qf_pg_start[UACCE_QFRT_MMIO] = 0;
ops->qf_pg_start[UACCE_QFRT_DKO] = QM_DOORBELL_PAGE_NR; ops->qf_pg_start[UACCE_QFRT_DKO] = mmio_page_nr;
ops->qf_pg_start[UACCE_QFRT_DUS] = QM_DOORBELL_PAGE_NR + ops->qf_pg_start[UACCE_QFRT_DUS] = mmio_page_nr + dko_page_nr;
dko_page_nr; ops->qf_pg_start[UACCE_QFRT_SS] = mmio_page_nr +
ops->qf_pg_start[UACCE_QFRT_SS] = QM_DOORBELL_PAGE_NR +
dko_page_nr + dko_page_nr +
dus_page_nr; dus_page_nr;
} }
......
...@@ -8,10 +8,11 @@ ...@@ -8,10 +8,11 @@
#define QM_Q_DEPTH 1024 #define QM_Q_DEPTH 1024
/* page number for queue file region */ /* page number for queue file region */
#define QM_DOORBELL_PAGE_NR 1 #define QM_DOORBELL_PAGE_NR 1
#define QM_DOORBELL_OFFSET 0x340 #define QM_DOORBELL_OFFSET 0x340
#define QM_V2_DOORBELL_OFFSET 0x1000
struct cqe { struct cqe {
__le32 rsvd0; __le32 rsvd0;
......
...@@ -920,22 +920,27 @@ uacce_dev_show_algorithms(struct device *dev, ...@@ -920,22 +920,27 @@ uacce_dev_show_algorithms(struct device *dev,
static DEVICE_ATTR(algorithms, S_IRUGO, uacce_dev_show_algorithms, NULL); static DEVICE_ATTR(algorithms, S_IRUGO, uacce_dev_show_algorithms, NULL);
static ssize_t static ssize_t uacce_dev_show_qfrs_offset(struct device *dev,
uacce_dev_show_qfrs_pg_start(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct uacce *uacce = UACCE_FROM_CDEV_ATTR(dev); struct uacce *uacce = UACCE_FROM_CDEV_ATTR(dev);
int i, ret; int i, ret;
unsigned long offset;
for (i = 0, ret = 0; i < UACCE_QFRT_MAX - 1; i++) for (i = 0, ret = 0; i < UACCE_QFRT_MAX; i++) {
ret += sprintf(buf + ret, "%lu\t", uacce->ops->qf_pg_start[i]); offset = uacce->ops->qf_pg_start[i];
if (offset != UACCE_QFR_NA)
ret += sprintf(buf + ret, "%lu\n", uacce->ops->qf_pg_start[i]); offset = offset << PAGE_SHIFT;
if (i == UACCE_QFRT_SS)
break;
ret += sprintf(buf + ret, "%lu\t", offset);
}
ret += sprintf(buf + ret, "%lu\n", offset);
return ret; return ret;
} }
static DEVICE_ATTR(qfrs_offset, S_IRUGO, uacce_dev_show_qfrs_offset, NULL);
static DEVICE_ATTR(qfrs_pg_start, S_IRUGO, uacce_dev_show_qfrs_pg_start, NULL);
static struct attribute *uacce_dev_attrs[] = { static struct attribute *uacce_dev_attrs[] = {
&dev_attr_id.attr, &dev_attr_id.attr,
...@@ -945,7 +950,7 @@ static struct attribute *uacce_dev_attrs[] = { ...@@ -945,7 +950,7 @@ static struct attribute *uacce_dev_attrs[] = {
&dev_attr_flags.attr, &dev_attr_flags.attr,
&dev_attr_available_instances.attr, &dev_attr_available_instances.attr,
&dev_attr_algorithms.attr, &dev_attr_algorithms.attr,
&dev_attr_qfrs_pg_start.attr, &dev_attr_qfrs_offset.attr,
NULL, NULL,
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册