提交 b701b41b 编写于 作者: A Arnd Bergmann

Merge tag 'qcom-drivers-for-4.17' of...

Merge tag 'qcom-drivers-for-4.17' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/agross/linux into next/drivers

Pull "Qualcomm ARM Based Driver Updates for v4.17" from Andy Gross:

* Fix NV upload increment in wcnss_ctrl
* Add support in rmtfs-mem driver for assigning memory

* tag 'qcom-drivers-for-4.17' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/agross/linux:
  soc: qcom: wcnss_ctrl: Fix increment in NV upload
  soc: qcom: rmtfs-mem: Add support for assigning memory to remote
...@@ -47,6 +47,7 @@ config QCOM_QMI_HELPERS ...@@ -47,6 +47,7 @@ config QCOM_QMI_HELPERS
config QCOM_RMTFS_MEM config QCOM_RMTFS_MEM
tristate "Qualcomm Remote Filesystem memory driver" tristate "Qualcomm Remote Filesystem memory driver"
depends on ARCH_QCOM depends on ARCH_QCOM
select QCOM_SCM
help help
The Qualcomm remote filesystem memory driver is used for allocating The Qualcomm remote filesystem memory driver is used for allocating
and exposing regions of shared memory with remote processors for the and exposing regions of shared memory with remote processors for the
......
...@@ -37,6 +37,8 @@ struct qcom_rmtfs_mem { ...@@ -37,6 +37,8 @@ struct qcom_rmtfs_mem {
phys_addr_t size; phys_addr_t size;
unsigned int client_id; unsigned int client_id;
unsigned int perms;
}; };
static ssize_t qcom_rmtfs_mem_show(struct device *dev, static ssize_t qcom_rmtfs_mem_show(struct device *dev,
...@@ -151,9 +153,11 @@ static void qcom_rmtfs_mem_release_device(struct device *dev) ...@@ -151,9 +153,11 @@ static void qcom_rmtfs_mem_release_device(struct device *dev)
static int qcom_rmtfs_mem_probe(struct platform_device *pdev) static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
{ {
struct device_node *node = pdev->dev.of_node; struct device_node *node = pdev->dev.of_node;
struct qcom_scm_vmperm perms[2];
struct reserved_mem *rmem; struct reserved_mem *rmem;
struct qcom_rmtfs_mem *rmtfs_mem; struct qcom_rmtfs_mem *rmtfs_mem;
u32 client_id; u32 client_id;
u32 vmid;
int ret; int ret;
rmem = of_reserved_mem_lookup(node); rmem = of_reserved_mem_lookup(node);
...@@ -204,10 +208,31 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev) ...@@ -204,10 +208,31 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
rmtfs_mem->dev.release = qcom_rmtfs_mem_release_device; rmtfs_mem->dev.release = qcom_rmtfs_mem_release_device;
ret = of_property_read_u32(node, "qcom,vmid", &vmid);
if (ret < 0 && ret != -EINVAL) {
dev_err(&pdev->dev, "failed to parse qcom,vmid\n");
goto remove_cdev;
} else if (!ret) {
perms[0].vmid = QCOM_SCM_VMID_HLOS;
perms[0].perm = QCOM_SCM_PERM_RW;
perms[1].vmid = vmid;
perms[1].perm = QCOM_SCM_PERM_RW;
rmtfs_mem->perms = BIT(QCOM_SCM_VMID_HLOS);
ret = qcom_scm_assign_mem(rmtfs_mem->addr, rmtfs_mem->size,
&rmtfs_mem->perms, perms, 2);
if (ret < 0) {
dev_err(&pdev->dev, "assign memory failed\n");
goto remove_cdev;
}
}
dev_set_drvdata(&pdev->dev, rmtfs_mem); dev_set_drvdata(&pdev->dev, rmtfs_mem);
return 0; return 0;
remove_cdev:
cdev_device_del(&rmtfs_mem->cdev, &rmtfs_mem->dev);
put_device: put_device:
put_device(&rmtfs_mem->dev); put_device(&rmtfs_mem->dev);
...@@ -217,6 +242,15 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev) ...@@ -217,6 +242,15 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
static int qcom_rmtfs_mem_remove(struct platform_device *pdev) static int qcom_rmtfs_mem_remove(struct platform_device *pdev)
{ {
struct qcom_rmtfs_mem *rmtfs_mem = dev_get_drvdata(&pdev->dev); struct qcom_rmtfs_mem *rmtfs_mem = dev_get_drvdata(&pdev->dev);
struct qcom_scm_vmperm perm;
if (rmtfs_mem->perms) {
perm.vmid = QCOM_SCM_VMID_HLOS;
perm.perm = QCOM_SCM_PERM_RW;
qcom_scm_assign_mem(rmtfs_mem->addr, rmtfs_mem->size,
&rmtfs_mem->perms, &perm, 1);
}
cdev_device_del(&rmtfs_mem->cdev, &rmtfs_mem->dev); cdev_device_del(&rmtfs_mem->cdev, &rmtfs_mem->dev);
put_device(&rmtfs_mem->dev); put_device(&rmtfs_mem->dev);
......
...@@ -249,7 +249,7 @@ static int wcnss_download_nv(struct wcnss_ctrl *wcnss, bool *expect_cbc) ...@@ -249,7 +249,7 @@ static int wcnss_download_nv(struct wcnss_ctrl *wcnss, bool *expect_cbc)
/* Increment for next fragment */ /* Increment for next fragment */
req->seq++; req->seq++;
data += req->hdr.len; data += NV_FRAGMENT_SIZE;
left -= NV_FRAGMENT_SIZE; left -= NV_FRAGMENT_SIZE;
} while (left > 0); } while (left > 0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册