aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/qcom/venus/firmware.c
diff options
context:
space:
mode:
authorStanimir Varbanov <stanimir.varbanov@linaro.org>2020-08-17 10:27:23 +0200
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2020-09-14 15:45:47 +0200
commit530ad31760ef07012ca73c6dff2a807b10dd9ac5 (patch)
tree7ada374b8515213aeaed7ca835214f16481d3140 /drivers/media/platform/qcom/venus/firmware.c
parentmedia: firmware: qcom_scm: Add memory protect virtual address ranges (diff)
downloadlinux-dev-530ad31760ef07012ca73c6dff2a807b10dd9ac5.tar.xz
linux-dev-530ad31760ef07012ca73c6dff2a807b10dd9ac5.zip
media: venus: firmware: Set virtual address ranges
In order to boot some of the new Venus firmware versions TZ call to set virtual address ranges is needed. Add virtual address ranges for CP and CP_NONPIX in resource structure and use them when loading and booting the firmware on remote processor. Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/media/platform/qcom/venus/firmware.c')
-rw-r--r--drivers/media/platform/qcom/venus/firmware.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
index 8801a6a7543d..1db64a854b88 100644
--- a/drivers/media/platform/qcom/venus/firmware.c
+++ b/drivers/media/platform/qcom/venus/firmware.c
@@ -181,6 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
int venus_boot(struct venus_core *core)
{
struct device *dev = core->dev;
+ const struct venus_resources *res = core->res;
phys_addr_t mem_phys;
size_t mem_size;
int ret;
@@ -200,7 +201,23 @@ int venus_boot(struct venus_core *core)
else
ret = venus_boot_no_tz(core, mem_phys, mem_size);
- return ret;
+ if (ret)
+ return ret;
+
+ if (core->use_tz && res->cp_size) {
+ ret = qcom_scm_mem_protect_video_var(res->cp_start,
+ res->cp_size,
+ res->cp_nonpixel_start,
+ res->cp_nonpixel_size);
+ if (ret) {
+ qcom_scm_pas_shutdown(VENUS_PAS_ID);
+ dev_err(dev, "set virtual address ranges fail (%d)\n",
+ ret);
+ return ret;
+ }
+ }
+
+ return 0;
}
int venus_shutdown(struct venus_core *core)