From 9045984efbdfd2a7936d788a5833e072e6237cff Mon Sep 17 00:00:00 2001 From: Ketan Patil Date: Tue, 8 Nov 2022 06:23:15 +0000 Subject: [PATCH] nvmap: Remove use of __dma_flush_area __dma_flush_area is defined in downstream, we need maintenance effort when kernel version is upgraded. Instead, use arch_invalidate_pmem function provided by the upstream. Bug 3855165 Change-Id: Ie62935aba7f3c31e6e233816b3bff507197d3f86 Signed-off-by: Ketan Patil Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2804844 Reviewed-by: svcacv Reviewed-by: svc_kernel_abi Reviewed-by: Jonathan Hunter Reviewed-by: Sachin Nikam GVS: Gerrit_Virtual_Submit --- drivers/video/tegra/nvmap/Makefile.memory.configs | 7 +++++++ drivers/video/tegra/nvmap/nvmap_alloc.c | 9 ++++++++- drivers/video/tegra/nvmap/nvmap_cache.c | 8 ++++++++ drivers/video/tegra/nvmap/nvmap_core.c | 7 +++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/video/tegra/nvmap/Makefile.memory.configs b/drivers/video/tegra/nvmap/Makefile.memory.configs index ca787255..aed850bd 100644 --- a/drivers/video/tegra/nvmap/Makefile.memory.configs +++ b/drivers/video/tegra/nvmap/Makefile.memory.configs @@ -37,6 +37,13 @@ ifneq ($(CONFIG_DMA_SHARED_BUFFER),y) $(error CONFIG_DMA_SHARED_BUFFER is not set) endif +# Check if CONFIG_ARCH_HAS_PMEM_API enabled for OOT/Kstable kernel +# CONFIG_ARCH_HAS_PMEM_API is needed for arch_invalidate_pmem +ifeq ($(CONFIG_TEGRA_OOT_MODULE),m) +ifneq ($(CONFIG_ARCH_HAS_PMEM_API),y) +$(error CONFIG_ARCH_HAS_PMEM_API is not set) +endif +endif ################################################################################ # Section 2 # This config is used to include the memory management driver for the diff --git a/drivers/video/tegra/nvmap/nvmap_alloc.c b/drivers/video/tegra/nvmap/nvmap_alloc.c index c19be7d5..f7cbcfe9 100644 --- a/drivers/video/tegra/nvmap/nvmap_alloc.c +++ b/drivers/video/tegra/nvmap/nvmap_alloc.c @@ -34,6 +34,9 @@ #endif #endif /* !NVMAP_LOADABLE_MODULE */ +#ifdef NVMAP_UPSTREAM_KERNEL +#include +#endif /* NVMAP_UPSTREAM_KERNEL */ #include "nvmap_priv.h" bool nvmap_convert_carveout_to_iovmm; @@ -714,12 +717,16 @@ static void alloc_handle(struct nvmap_client *client, /* Clear the allocated buffer */ if (nvmap_cpu_map_is_allowed(h)) { void *cpu_addr; - + cpu_addr = memremap(b->base, h->size, MEMREMAP_WB); if (cpu_addr != NULL) { memset(cpu_addr, 0, h->size); +#ifdef NVMAP_UPSTREAM_KERNEL + arch_invalidate_pmem(cpu_addr, h->size); +#else __dma_flush_area(cpu_addr, h->size); +#endif memunmap(cpu_addr); } } diff --git a/drivers/video/tegra/nvmap/nvmap_cache.c b/drivers/video/tegra/nvmap/nvmap_cache.c index e25c722d..453de77d 100644 --- a/drivers/video/tegra/nvmap/nvmap_cache.c +++ b/drivers/video/tegra/nvmap/nvmap_cache.c @@ -25,6 +25,10 @@ #include #endif +#ifdef NVMAP_UPSTREAM_KERNEL +#include +#endif /* NVMAP_UPSTREAM_KERNEL */ + #include #ifdef NVMAP_LOADABLE_MODULE __weak struct arm64_ftr_reg arm64_ftr_reg_ctrel0; @@ -63,7 +67,11 @@ void nvmap_clean_cache(struct page **pages, int numpages) void inner_cache_maint(unsigned int op, void *vaddr, size_t size) { if (op == NVMAP_CACHE_OP_WB_INV) +#ifdef NVMAP_UPSTREAM_KERNEL + arch_invalidate_pmem(vaddr, size); +#else __dma_flush_area(vaddr, size); +#endif else if (op == NVMAP_CACHE_OP_INV) __dma_map_area(vaddr, size, DMA_FROM_DEVICE); else diff --git a/drivers/video/tegra/nvmap/nvmap_core.c b/drivers/video/tegra/nvmap/nvmap_core.c index 1edd7c2a..8a1d15a1 100644 --- a/drivers/video/tegra/nvmap/nvmap_core.c +++ b/drivers/video/tegra/nvmap/nvmap_core.c @@ -31,6 +31,9 @@ #include #include +#ifdef NVMAP_UPSTREAM_KERNEL +#include +#endif /* NVMAP_UPSTREAM_KERNEL */ #include "nvmap_priv.h" @@ -122,7 +125,11 @@ void __nvmap_kunmap(struct nvmap_handle *h, unsigned int pagenum, if (h->flags != NVMAP_HANDLE_UNCACHEABLE && h->flags != NVMAP_HANDLE_WRITE_COMBINE) { +#ifdef NVMAP_UPSTREAM_KERNEL + arch_invalidate_pmem(addr, PAGE_SIZE); +#else __dma_flush_area(addr, PAGE_SIZE); +#endif outer_flush_range(paddr, paddr + PAGE_SIZE); /* FIXME */ } iounmap((void __iomem *)addr);