From a2f4fdf190fa6e4ea686747a9dcb876e160399ee Mon Sep 17 00:00:00 2001 From: Sagar Kamble Date: Wed, 29 Dec 2021 14:57:02 +0000 Subject: [PATCH] gpu: nvgpu: enable CONFIG_NVGPU_VPR for all kernels VPR functionality is split up as static VPR and VPR resize. Static VPR is supported on all kernels. VPR resize is enabled only on 4.9 kernel. Enable CONFIG_NVGPU_VPR unconditionally in Linux Makefile. Compile VPR resize related functionality in nvgpu under the check for Linux kernel version using new define NVGPU_VPR_RESIZE_SUPPORTED. JIRA LS-458 Bug 200754700 Change-Id: Ib92f7f1b95afc6c69fbdf33354459c147337350c Signed-off-by: Sagar Kamble Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2647619 Tested-by: mobile promotions Reviewed-by: Konsta Holtta Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/Makefile.linux.configs | 3 --- drivers/gpu/nvgpu/include/nvgpu/vpr.h | 14 +++++++++++++- drivers/gpu/nvgpu/os/linux/module.c | 11 +++++++---- drivers/gpu/nvgpu/os/linux/platform_gk20a_tegra.c | 10 ++++++++-- drivers/gpu/nvgpu/os/linux/vpr.c | 9 ++++++++- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/nvgpu/Makefile.linux.configs b/drivers/gpu/nvgpu/Makefile.linux.configs index dd595522b..5515b1b16 100644 --- a/drivers/gpu/nvgpu/Makefile.linux.configs +++ b/drivers/gpu/nvgpu/Makefile.linux.configs @@ -123,10 +123,7 @@ ifeq ($(CONFIG_TEGRA_GR_VIRTUALIZATION),y) CONFIG_NVGPU_GR_VIRTUALIZATION := y endif -# Support for NVGPU VPR -ifeq ($(CONFIG_TEGRA_VPR),y) CONFIG_NVGPU_VPR := y -endif # Support Tegra fuse ifeq ($(CONFIG_TEGRA_KFUSE),y) diff --git a/drivers/gpu/nvgpu/include/nvgpu/vpr.h b/drivers/gpu/nvgpu/include/nvgpu/vpr.h index d069efe64..18a77c9e3 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/vpr.h +++ b/drivers/gpu/nvgpu/include/nvgpu/vpr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,18 @@ #include +#ifdef __KERNEL__ +#include + +/* + * VPR resize is enabled only on 4.9 kernel because kernel core mm changes to + * support it are intrusive and they can't be upstreamed easily. Upstream + * kernel will have support for static VPR. Note that static VPR is + * supported on all kernels. + */ +#define NVGPU_VPR_RESIZE_SUPPORTED (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)) +#endif /* __KERNEL__ */ + #ifdef CONFIG_NVGPU_VPR bool nvgpu_is_vpr_resize_enabled(void); #else diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c index cde92284a..4186cc959 100644 --- a/drivers/gpu/nvgpu/os/linux/module.c +++ b/drivers/gpu/nvgpu/os/linux/module.c @@ -1,7 +1,7 @@ /* * GK20A Graphics * - * Copyright (c) 2011-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2011-2022, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -26,7 +26,10 @@ #include #include #include -#ifdef CONFIG_NVGPU_VPR + +#include + +#if NVGPU_VPR_RESIZE_SUPPORTED #include #endif #include @@ -1005,7 +1008,7 @@ void gk20a_remove_support(struct gk20a *g) struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); struct sim_nvgpu_linux *sim_linux; -#ifdef CONFIG_NVGPU_VPR +#if NVGPU_VPR_RESIZE_SUPPORTED if (nvgpu_is_enabled(g, NVGPU_SUPPORT_VPR)) { tegra_unregister_idle_unidle(gk20a_do_idle); } @@ -1082,7 +1085,7 @@ static int gk20a_init_support(struct platform_device *pdev) void __iomem *addr; int err = -ENOMEM; -#ifdef CONFIG_NVGPU_VPR +#if NVGPU_VPR_RESIZE_SUPPORTED tegra_register_idle_unidle(gk20a_do_idle, gk20a_do_unidle, g); #endif diff --git a/drivers/gpu/nvgpu/os/linux/platform_gk20a_tegra.c b/drivers/gpu/nvgpu/os/linux/platform_gk20a_tegra.c index 0597e93be..d20017d0c 100644 --- a/drivers/gpu/nvgpu/os/linux/platform_gk20a_tegra.c +++ b/drivers/gpu/nvgpu/os/linux/platform_gk20a_tegra.c @@ -1,7 +1,7 @@ /* * GK20A Tegra Platform Interface * - * Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -21,10 +21,12 @@ #include #include #include +#include + #if defined(CONFIG_TEGRA_DVFS) #include #endif -#if defined(CONFIG_NVGPU_TEGRA_FUSE) || defined(CONFIG_NVGPU_VPR) +#if defined(CONFIG_NVGPU_TEGRA_FUSE) || NVGPU_VPR_RESIZE_SUPPORTED #include #endif @@ -683,7 +685,9 @@ int gk20a_tegra_init_secure_alloc(struct gk20a_platform *platform) * On simulation platform, VPR is only supported with * vdk frontdoor boot and gpu frontdoor mode. */ +#if NVGPU_VPR_RESIZE_SUPPORTED tegra_unregister_idle_unidle(gk20a_do_idle); +#endif nvgpu_log_info(g, "VPR is not supported on simulation platform"); return 0; @@ -700,7 +704,9 @@ int gk20a_tegra_init_secure_alloc(struct gk20a_platform *platform) /* Some platforms disable VPR. In that case VPR allocations always * fail. Just disable VPR usage in nvgpu in that case. */ if (dma_mapping_error(&tegra_vpr_dev, iova)) { +#if NVGPU_VPR_RESIZE_SUPPORTED tegra_unregister_idle_unidle(gk20a_do_idle); +#endif return 0; } diff --git a/drivers/gpu/nvgpu/os/linux/vpr.c b/drivers/gpu/nvgpu/os/linux/vpr.c index d51c42054..fadd0383e 100644 --- a/drivers/gpu/nvgpu/os/linux/vpr.c +++ b/drivers/gpu/nvgpu/os/linux/vpr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -14,9 +14,16 @@ #include #include + +#if NVGPU_VPR_RESIZE_SUPPORTED #include +#endif bool nvgpu_is_vpr_resize_enabled(void) { +#if NVGPU_VPR_RESIZE_SUPPORTED return tegra_is_vpr_resize_enabled(); +#else + return false; +#endif }