From 3ff15b69de3e98568b97b335098ad99bcd66603e Mon Sep 17 00:00:00 2001 From: Timo Alho Date: Thu, 16 Feb 2023 10:31:28 +0200 Subject: [PATCH] gpu: nvgpu: fix return value check of MRQ_STRAP The return value of tegra_bpmp_transfer() API is only for a low level wire-protocol errors. When checking BPMP-FW response to MRQ_STRAP request, the return value in the MRQ response payload need to be checked. Bug 3744064 Bug 3317279 Signed-off-by: Timo Alho Change-Id: I165431a5d2ed5a09965eb84b7ee09766bb09d091 Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2859267 Reviewed-by: Divya Singhatwaria Reviewed-by: svc-mobile-cert Reviewed-by: Vijayakumar Subbu Tested-by: Divya Singhatwaria GVS: Gerrit_Virtual_Submit --- .../gpu/nvgpu/os/linux/platform_ga10b_tegra.c | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nvgpu/os/linux/platform_ga10b_tegra.c b/drivers/gpu/nvgpu/os/linux/platform_ga10b_tegra.c index 2fac16e2b..c21f66287 100644 --- a/drivers/gpu/nvgpu/os/linux/platform_ga10b_tegra.c +++ b/drivers/gpu/nvgpu/os/linux/platform_ga10b_tegra.c @@ -42,6 +42,7 @@ #ifdef CONFIG_TEGRA_BPMP #include +#include #endif /* CONFIG_TEGRA_BPMP */ #include @@ -360,7 +361,16 @@ int ga10b_tegra_static_pg_control(struct device *dev, struct tegra_bpmp *bpmp, msg.tx.size = sizeof(*req); err = tegra_bpmp_transfer(bpmp, &msg); - return err; + + if (msg.rx.ret == -BPMP_EINVAL) { + return -EINVAL; + } else if (msg.rx.ret == -BPMP_ENODEV) { + return -ENODEV; + } else if (msg.rx.ret == -BPMP_EACCES) { + return -EPERM; + } else { + return err; + } } #endif @@ -473,11 +483,29 @@ static int ga10b_tegra_unrailgate(struct device *dev) unsigned long max_rate; long rate; #endif - #if defined(CONFIG_TEGRA_BPMP) + struct gk20a *g = get_gk20a(dev); + ret = ga10b_tegra_bpmp_mrq_set(dev); - if (ret != 0) + if (ret == -EINVAL) { + nvgpu_err(g, "MRQ incorrect parameters"); return ret; + } else if (ret == -ENODEV) { + nvgpu_log_info(g, "MRQ is not supported by BPMP-FW"); + /* + * reset the return value to 0 + * as the control can go forward + */ + ret = 0; + } else if (ret == -EPERM) { + nvgpu_log_info(g, "MRQ not permitted"); + /* + * reset the return value to 0 + * as the control can go forward + */ + ret = 0; + } + #endif /* Setting clk controls */