Message ID | 20231009153427.20951-11-brgl@bgdev.pl (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: qcom: add and enable SHM Bridge support | expand |
On Mon, Oct 09, 2023 at 05:34:22PM +0200, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > Let's use the new TZ memory allocator to obtain a buffer for this call > instead of manually kmalloc()ing it and then mapping to physical space. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Reviewed-by: Andrew Halaney <ahalaney@redhat.com> > --- > drivers/firmware/qcom/qcom_scm.c | 18 ++++-------------- > 1 file changed, 4 insertions(+), 14 deletions(-) > > diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c > index 11638daa2fe5..3a6cefb4eb2e 100644 > --- a/drivers/firmware/qcom/qcom_scm.c > +++ b/drivers/firmware/qcom/qcom_scm.c > @@ -1525,37 +1525,27 @@ int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id) > unsigned long app_name_len = strlen(app_name); > struct qcom_scm_desc desc = {}; > struct qcom_scm_qseecom_resp res = {}; > - dma_addr_t name_buf_phys; > - char *name_buf; > int status; > > if (app_name_len >= name_buf_size) > return -EINVAL; > > - name_buf = kzalloc(name_buf_size, GFP_KERNEL); > + char *name_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, > + name_buf_size, > + GFP_KERNEL); > if (!name_buf) > return -ENOMEM; > > memcpy(name_buf, app_name, app_name_len); > > - name_buf_phys = dma_map_single(__scm->dev, name_buf, name_buf_size, DMA_TO_DEVICE); > - status = dma_mapping_error(__scm->dev, name_buf_phys); > - if (status) { > - kfree(name_buf); > - dev_err(__scm->dev, "qseecom: failed to map dma address\n"); > - return status; > - } > - > desc.owner = QSEECOM_TZ_OWNER_QSEE_OS; > desc.svc = QSEECOM_TZ_SVC_APP_MGR; > desc.cmd = QSEECOM_TZ_CMD_APP_LOOKUP; > desc.arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL); > - desc.args[0] = name_buf_phys; > + desc.args[0] = qcom_tzmem_to_phys(name_buf); > desc.args[1] = app_name_len; > > status = qcom_scm_qseecom_call(&desc, &res); > - dma_unmap_single(__scm->dev, name_buf_phys, name_buf_size, DMA_TO_DEVICE); > - kfree(name_buf); > > if (status) > return status; > -- > 2.39.2 >
On 10/9/23 17:34, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > Let's use the new TZ memory allocator to obtain a buffer for this call > instead of manually kmalloc()ing it and then mapping to physical space. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Tested-by: Maximilian Luz <luzmaximilian@gmail.com> I've tested the whole series with both QCOM_TZMEM_MODE_DEFAULT and QCOM_TZMEM_MODE_SHMBRIDGE. Everything seems to work fine on my Surface Pro X (sc8180x), but I've only really tested the qseecom-related parts (hence my TB only for those). I'll try to do a proper review of the two qseecom patches in the next couple of days. > --- > drivers/firmware/qcom/qcom_scm.c | 18 ++++-------------- > 1 file changed, 4 insertions(+), 14 deletions(-) > > diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c > index 11638daa2fe5..3a6cefb4eb2e 100644 > --- a/drivers/firmware/qcom/qcom_scm.c > +++ b/drivers/firmware/qcom/qcom_scm.c > @@ -1525,37 +1525,27 @@ int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id) > unsigned long app_name_len = strlen(app_name); > struct qcom_scm_desc desc = {}; > struct qcom_scm_qseecom_resp res = {}; > - dma_addr_t name_buf_phys; > - char *name_buf; > int status; > > if (app_name_len >= name_buf_size) > return -EINVAL; > > - name_buf = kzalloc(name_buf_size, GFP_KERNEL); > + char *name_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, > + name_buf_size, > + GFP_KERNEL); > if (!name_buf) > return -ENOMEM; > > memcpy(name_buf, app_name, app_name_len); > > - name_buf_phys = dma_map_single(__scm->dev, name_buf, name_buf_size, DMA_TO_DEVICE); > - status = dma_mapping_error(__scm->dev, name_buf_phys); > - if (status) { > - kfree(name_buf); > - dev_err(__scm->dev, "qseecom: failed to map dma address\n"); > - return status; > - } > - > desc.owner = QSEECOM_TZ_OWNER_QSEE_OS; > desc.svc = QSEECOM_TZ_SVC_APP_MGR; > desc.cmd = QSEECOM_TZ_CMD_APP_LOOKUP; > desc.arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL); > - desc.args[0] = name_buf_phys; > + desc.args[0] = qcom_tzmem_to_phys(name_buf); > desc.args[1] = app_name_len; > > status = qcom_scm_qseecom_call(&desc, &res); > - dma_unmap_single(__scm->dev, name_buf_phys, name_buf_size, DMA_TO_DEVICE); > - kfree(name_buf); > > if (status) > return status;
diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c index 11638daa2fe5..3a6cefb4eb2e 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -1525,37 +1525,27 @@ int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id) unsigned long app_name_len = strlen(app_name); struct qcom_scm_desc desc = {}; struct qcom_scm_qseecom_resp res = {}; - dma_addr_t name_buf_phys; - char *name_buf; int status; if (app_name_len >= name_buf_size) return -EINVAL; - name_buf = kzalloc(name_buf_size, GFP_KERNEL); + char *name_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, + name_buf_size, + GFP_KERNEL); if (!name_buf) return -ENOMEM; memcpy(name_buf, app_name, app_name_len); - name_buf_phys = dma_map_single(__scm->dev, name_buf, name_buf_size, DMA_TO_DEVICE); - status = dma_mapping_error(__scm->dev, name_buf_phys); - if (status) { - kfree(name_buf); - dev_err(__scm->dev, "qseecom: failed to map dma address\n"); - return status; - } - desc.owner = QSEECOM_TZ_OWNER_QSEE_OS; desc.svc = QSEECOM_TZ_SVC_APP_MGR; desc.cmd = QSEECOM_TZ_CMD_APP_LOOKUP; desc.arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL); - desc.args[0] = name_buf_phys; + desc.args[0] = qcom_tzmem_to_phys(name_buf); desc.args[1] = app_name_len; status = qcom_scm_qseecom_call(&desc, &res); - dma_unmap_single(__scm->dev, name_buf_phys, name_buf_size, DMA_TO_DEVICE); - kfree(name_buf); if (status) return status;