From 98da3f8eed914225e9ffe0f768d7647506e95cdc Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Mon, 29 Jan 2018 16:21:30 -0800 Subject: gpu: nvgpu: Cleanup usage of bypass_smmu The GPU has multiple different operating modes in respect to IOMMU'ability. As such there needs to be a clean way to tell the driver whether it is IOMMU'able or not. This state also does not always reflect what is possible: all becasue the GPU can generate IOMMU'ed memory requests doesn't mean it wants to. The nvgpu_iommuable() API has now existed for a little while which is a useful way to convey whether nvgpu should consider the GPU as IOMMU'able. However, there is also the g->mm.bypass_smmu flag which used to be able to override what the GPU decided it should do. Typically it was assigned the same value as nvgpu_iommuable() but that was not necessarily a requirment. This patch removes all the usages of g->mm.bypass_smmu and instead uses the nvgpu_iommuable() function. All places where the check against g->mm.bypass_smmu have been replaced with nvgpu_iommuable(). The code should now be much cleaner. Subsequently other checks can also be placed in the nvgpu_iommuable() function. For example, when NVLINK comes online and the GPU should no longer consider DMA addresses and instead use scatter-gather lists directly the ngpu_iommuable() function will be able to check the state of NVLINK and then act accordingly. Change-Id: I0da6262386de15709decac89d63d3eecfec20cd7 Signed-off-by: Alex Waterman Reviewed-on: https://git-master.nvidia.com/r/1648332 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/cde_gp10b.c | 7 ++++--- drivers/gpu/nvgpu/common/linux/debug.c | 5 ----- drivers/gpu/nvgpu/common/linux/dma.c | 11 ++++++++--- drivers/gpu/nvgpu/common/linux/driver_common.c | 1 - drivers/gpu/nvgpu/common/linux/os_linux.h | 1 - drivers/gpu/nvgpu/common/linux/platform_gk20a.h | 3 --- drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c | 3 +-- drivers/gpu/nvgpu/common/linux/platform_gv11b_tegra.c | 3 +-- drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_mm_gp10b.c | 4 ++-- 9 files changed, 16 insertions(+), 22 deletions(-) (limited to 'drivers/gpu/nvgpu/common/linux') diff --git a/drivers/gpu/nvgpu/common/linux/cde_gp10b.c b/drivers/gpu/nvgpu/common/linux/cde_gp10b.c index ffae6e34..483a3ee7 100644 --- a/drivers/gpu/nvgpu/common/linux/cde_gp10b.c +++ b/drivers/gpu/nvgpu/common/linux/cde_gp10b.c @@ -26,6 +26,7 @@ #include "cde_gp10b.h" #include +#include enum gp10b_programs { GP10B_PROG_HPASS = 0, @@ -56,10 +57,10 @@ void gp10b_cde_get_program_numbers(struct gk20a *g, hprog = GP10B_PROG_HPASS_DEBUG; vprog = GP10B_PROG_VPASS_DEBUG; } - if (g->mm.bypass_smmu) { + if (!nvgpu_iommuable(g)) { if (!g->mm.disable_bigpage) { nvgpu_warn(g, - "when bypass_smmu is 1, disable_bigpage must be 1 too"); + "When no IOMMU big pages cannot be used"); } hprog |= 1; vprog |= 1; @@ -72,7 +73,7 @@ void gp10b_cde_get_program_numbers(struct gk20a *g, bool gp10b_need_scatter_buffer(struct gk20a *g) { - return g->mm.bypass_smmu; + return !nvgpu_iommuable(g); } static u8 parity(u32 a) diff --git a/drivers/gpu/nvgpu/common/linux/debug.c b/drivers/gpu/nvgpu/common/linux/debug.c index 76018f8d..af3b9964 100644 --- a/drivers/gpu/nvgpu/common/linux/debug.c +++ b/drivers/gpu/nvgpu/common/linux/debug.c @@ -332,11 +332,6 @@ void gk20a_debug_init(struct gk20a *g, const char *debugfs_symlink) l->debugfs, &g->timeouts_enabled); - l->debugfs_bypass_smmu = - debugfs_create_bool("bypass_smmu", - S_IRUGO, - l->debugfs, - &g->mm.bypass_smmu); l->debugfs_disable_bigpage = debugfs_create_file("disable_bigpage", S_IRUGO|S_IWUSR, diff --git a/drivers/gpu/nvgpu/common/linux/dma.c b/drivers/gpu/nvgpu/common/linux/dma.c index 786065dd..ec9c3b5a 100644 --- a/drivers/gpu/nvgpu/common/linux/dma.c +++ b/drivers/gpu/nvgpu/common/linux/dma.c @@ -637,8 +637,13 @@ bool nvgpu_iommuable(struct gk20a *g) #ifdef CONFIG_TEGRA_GK20A struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); - return device_is_iommuable(l->dev); -#else - return true; + /* + * Check against the nvgpu device to see if it's been marked as + * IOMMU'able. + */ + if (!device_is_iommuable(l->dev)) + return false; #endif + + return true; } diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index ed7f7fe9..9df7ea3f 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.c @@ -184,7 +184,6 @@ static void nvgpu_init_mm_vars(struct gk20a *g) { struct gk20a_platform *platform = dev_get_drvdata(dev_from_gk20a(g)); - g->mm.bypass_smmu = platform->bypass_smmu; g->mm.disable_bigpage = platform->disable_bigpage; __nvgpu_set_enabled(g, NVGPU_MM_HONORS_APERTURE, platform->honors_aperture); diff --git a/drivers/gpu/nvgpu/common/linux/os_linux.h b/drivers/gpu/nvgpu/common/linux/os_linux.h index a2181c05..ebe131de 100644 --- a/drivers/gpu/nvgpu/common/linux/os_linux.h +++ b/drivers/gpu/nvgpu/common/linux/os_linux.h @@ -123,7 +123,6 @@ struct nvgpu_os_linux { struct dentry *debugfs_ltc_enabled; struct dentry *debugfs_timeouts_enabled; struct dentry *debugfs_gr_idle_timeout_default; - struct dentry *debugfs_bypass_smmu; struct dentry *debugfs_disable_bigpage; struct dentry *debugfs_gr_default_attrib_cb_size; diff --git a/drivers/gpu/nvgpu/common/linux/platform_gk20a.h b/drivers/gpu/nvgpu/common/linux/platform_gk20a.h index 60e71a74..6994677e 100644 --- a/drivers/gpu/nvgpu/common/linux/platform_gk20a.h +++ b/drivers/gpu/nvgpu/common/linux/platform_gk20a.h @@ -106,9 +106,6 @@ struct gk20a_platform { /* Timeout for per-channel watchdog (in mS) */ u32 ch_wdt_timeout_ms; - /* Enable SMMU bypass by default */ - bool bypass_smmu; - /* Disable big page support */ bool disable_bigpage; diff --git a/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c b/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c index 4dd5d46e..0b0ebeeb 100644 --- a/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c +++ b/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c @@ -137,8 +137,7 @@ static int gp10b_tegra_probe(struct device *dev) return ret; #endif - platform->bypass_smmu = !device_is_iommuable(dev); - platform->disable_bigpage = platform->bypass_smmu; + platform->disable_bigpage = !device_is_iommuable(dev); platform->g->gr.ctx_vars.dump_ctxsw_stats_on_channel_close = false; diff --git a/drivers/gpu/nvgpu/common/linux/platform_gv11b_tegra.c b/drivers/gpu/nvgpu/common/linux/platform_gv11b_tegra.c index c56bc0f3..7d7fc603 100644 --- a/drivers/gpu/nvgpu/common/linux/platform_gv11b_tegra.c +++ b/drivers/gpu/nvgpu/common/linux/platform_gv11b_tegra.c @@ -81,8 +81,7 @@ static int gv11b_tegra_probe(struct device *dev) g->has_syncpoints = false; #endif - platform->bypass_smmu = !device_is_iommuable(dev); - platform->disable_bigpage = platform->bypass_smmu; + platform->disable_bigpage = !device_is_iommuable(dev); platform->g->gr.ctx_vars.dump_ctxsw_stats_on_channel_close = false; diff --git a/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_mm_gp10b.c b/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_mm_gp10b.c index 72214d3c..161a69e9 100644 --- a/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_mm_gp10b.c +++ b/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_mm_gp10b.c @@ -23,10 +23,10 @@ #include "gk20a/mm_gk20a.h" #include +#include int vgpu_gp10b_init_mm_setup_hw(struct gk20a *g) { - g->mm.bypass_smmu = true; g->mm.disable_bigpage = true; return 0; } @@ -77,7 +77,7 @@ u64 vgpu_gp10b_locked_gmmu_map(struct vm_gk20a *vm, /* FIXME: add support for sparse mappings */ - if (WARN_ON(!sgt) || WARN_ON(!g->mm.bypass_smmu)) + if (WARN_ON(!sgt) || WARN_ON(nvgpu_iommuable(g))) return 0; if (space_to_skip & (page_size - 1)) -- cgit v1.2.2