diff --git a/drivers/gpu/nvgpu/os/linux/cde.c b/drivers/gpu/nvgpu/os/linux/cde.c index 2217cce5a..ca6577d65 100644 --- a/drivers/gpu/nvgpu/os/linux/cde.c +++ b/drivers/gpu/nvgpu/os/linux/cde.c @@ -1042,9 +1042,6 @@ __releases(&l->cde_app->mutex) const s16 compbits_kind = 0; u32 submit_op; struct dma_buf_attachment *attachment; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif nvgpu_log(g, gpu_dbg_cde, "compbits_byte_offset=%llu scatterbuffer_byte_offset=%llu", compbits_byte_offset, scatterbuffer_byte_offset); @@ -1135,12 +1132,7 @@ __releases(&l->cde_app->mutex) struct sg_table *sgt; void *scatter_buffer; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - err = dma_buf_vmap(compbits_scatter_buf, &map); - surface = err ? NULL : map.vaddr; -#else - surface = dma_buf_vmap(compbits_scatter_buf); -#endif + surface = gk20a_dmabuf_vmap(compbits_scatter_buf); if (!surface) { nvgpu_warn(g, "dma_buf_vmap failed"); err = -EINVAL; @@ -1189,11 +1181,7 @@ __releases(&l->cde_app->mutex) goto exit_unmap_surface; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_vunmap(compbits_scatter_buf, &map); -#else - dma_buf_vunmap(compbits_scatter_buf, surface); -#endif + gk20a_dmabuf_vunmap(compbits_scatter_buf, surface); surface = NULL; } @@ -1282,13 +1270,8 @@ __releases(&l->cde_app->mutex) return err; exit_unmap_surface: - if (surface) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_vunmap(compbits_scatter_buf, &map); -#else - dma_buf_vunmap(compbits_scatter_buf, surface); -#endif - } + if (surface) + gk20a_dmabuf_vunmap(compbits_scatter_buf, surface); exit_unmap_vaddr: nvgpu_vm_unmap(cde_ctx->vm, map_vaddr, NULL); exit_idle: diff --git a/drivers/gpu/nvgpu/os/linux/dmabuf_priv.c b/drivers/gpu/nvgpu/os/linux/dmabuf_priv.c index 6474a2a75..cc11bab28 100644 --- a/drivers/gpu/nvgpu/os/linux/dmabuf_priv.c +++ b/drivers/gpu/nvgpu/os/linux/dmabuf_priv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2017-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,15 @@ * along with this program. If not, see . */ +#include #include #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) +#include +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +#include +#endif #include #include @@ -318,3 +324,38 @@ out: *state = s; return err; } + +void *gk20a_dmabuf_vmap(struct dma_buf *dmabuf) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) + struct iosys_map map; +#else + struct dma_buf_map map; +#endif + /* Linux v5.11 and later kernels */ + if (dma_buf_vmap(dmabuf, &map)) + return NULL; + + return map.vaddr; +#else + /* Linux v5.10 and earlier kernels */ + return dma_buf_vmap(dmabuf); +#endif +} + +void gk20a_dmabuf_vunmap(struct dma_buf *dmabuf, void *addr) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) + struct iosys_map map = IOSYS_MAP_INIT_VADDR(addr); +#else + struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(addr); +#endif + /* Linux v5.11 and later kernels */ + dma_buf_vunmap(dmabuf, &map); +#else + /* Linux v5.10 and earlier kernels */ + dma_buf_vunmap(dmabuf, addr); +#endif +} diff --git a/drivers/gpu/nvgpu/os/linux/dmabuf_priv.h b/drivers/gpu/nvgpu/os/linux/dmabuf_priv.h index eb9a32c09..63ec547c1 100644 --- a/drivers/gpu/nvgpu/os/linux/dmabuf_priv.h +++ b/drivers/gpu/nvgpu/os/linux/dmabuf_priv.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2017-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, @@ -122,5 +122,7 @@ int gk20a_dmabuf_get_state(struct dma_buf *dmabuf, struct gk20a *g, void gk20a_dma_buf_priv_list_clear(struct nvgpu_os_linux *l); struct gk20a_dmabuf_priv *gk20a_dma_buf_get_drvdata( struct dma_buf *dmabuf, struct device *device); +void *gk20a_dmabuf_vmap(struct dma_buf *dmabuf); +void gk20a_dmabuf_vunmap(struct dma_buf *dmabuf, void *addr); #endif diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_channel.c b/drivers/gpu/nvgpu/os/linux/ioctl_channel.c index 2bda5514d..106b57aae 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_channel.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_channel.c @@ -1,7 +1,7 @@ /* * GK20A Graphics channel * - * 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, @@ -59,6 +59,7 @@ #include "ioctl.h" #include "channel.h" #include "os_linux.h" +#include "dmabuf_priv.h" /* the minimal size of client buffer */ #define CSS_MIN_CLIENT_SNAPSHOT_SIZE \ @@ -136,15 +137,8 @@ void gk20a_channel_free_cycle_stats_buffer(struct nvgpu_channel *ch) /* disable existing cyclestats buffer */ nvgpu_mutex_acquire(&ch->cyclestate.cyclestate_buffer_mutex); if (priv->cyclestate_buffer_handler) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; - - dma_buf_map_set_vaddr(&map, ch->cyclestate.cyclestate_buffer); - dma_buf_vunmap(priv->cyclestate_buffer_handler, &map); -#else - dma_buf_vunmap(priv->cyclestate_buffer_handler, + gk20a_dmabuf_vunmap(priv->cyclestate_buffer_handler, ch->cyclestate.cyclestate_buffer); -#endif dma_buf_put(priv->cyclestate_buffer_handler); priv->cyclestate_buffer_handler = NULL; ch->cyclestate.cyclestate_buffer = NULL; @@ -156,10 +150,6 @@ void gk20a_channel_free_cycle_stats_buffer(struct nvgpu_channel *ch) int gk20a_channel_cycle_stats(struct nvgpu_channel *ch, int dmabuf_fd) { struct dma_buf *dmabuf; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; - int err; -#endif void *virtual_address; struct nvgpu_channel_linux *priv = ch->os_priv; @@ -173,12 +163,8 @@ int gk20a_channel_cycle_stats(struct nvgpu_channel *ch, int dmabuf_fd) dmabuf = dma_buf_get(dmabuf_fd); if (IS_ERR(dmabuf)) return PTR_ERR(dmabuf); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - err = dma_buf_vmap(dmabuf, &map); - virtual_address = err ? NULL : map.vaddr; -#else - virtual_address = dma_buf_vmap(dmabuf); -#endif + + virtual_address = gk20a_dmabuf_vmap(dmabuf); if (!virtual_address) { dma_buf_put(dmabuf); return -ENOMEM; @@ -226,9 +212,6 @@ int gk20a_attach_cycle_stats_snapshot(struct nvgpu_channel *ch, struct gk20a *g = ch->g; struct gk20a_cs_snapshot_client_linux *client_linux; struct gk20a_cs_snapshot_client *client; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif nvgpu_mutex_acquire(&ch->cs_client_mutex); if (ch->cs_client) { @@ -257,14 +240,8 @@ int gk20a_attach_cycle_stats_snapshot(struct nvgpu_channel *ch, goto err_put; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - ret = dma_buf_vmap(client_linux->dma_handler, &map); - client->snapshot = ret ? NULL : - (struct gk20a_cs_snapshot_fifo *)map.vaddr; -#else client->snapshot = (struct gk20a_cs_snapshot_fifo *) - dma_buf_vmap(client_linux->dma_handler); -#endif + gk20a_dmabuf_vmap(client_linux->dma_handler); if (!client->snapshot) { ret = -ENOMEM; goto err_put; @@ -309,15 +286,8 @@ int gk20a_channel_free_cycle_stats_snapshot(struct nvgpu_channel *ch) if (client_linux->dma_handler) { if (ch->cs_client->snapshot) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; - - dma_buf_map_set_vaddr(&map, ch->cs_client->snapshot); - dma_buf_vunmap(client_linux->dma_handler, &map); -#else - dma_buf_vunmap(client_linux->dma_handler, + gk20a_dmabuf_vunmap(client_linux->dma_handler, ch->cs_client->snapshot); -#endif } dma_buf_put(client_linux->dma_handler); @@ -376,14 +346,8 @@ static void gk20a_channel_free_error_notifiers(struct nvgpu_channel *ch) nvgpu_mutex_acquire(&priv->error_notifier.mutex); if (priv->error_notifier.dmabuf) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; - - dma_buf_map_set_vaddr(&map, priv->error_notifier.vaddr); - dma_buf_vunmap(priv->error_notifier.dmabuf, &map); -#else - dma_buf_vunmap(priv->error_notifier.dmabuf, priv->error_notifier.vaddr); -#endif + gk20a_dmabuf_vunmap(priv->error_notifier.dmabuf, + priv->error_notifier.vaddr); dma_buf_put(priv->error_notifier.dmabuf); priv->error_notifier.dmabuf = NULL; priv->error_notifier.notification = NULL; @@ -396,10 +360,6 @@ static int gk20a_init_error_notifier(struct nvgpu_channel *ch, struct nvgpu_set_error_notifier *args) { struct dma_buf *dmabuf; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; - int err; -#endif void *va; u64 end = args->offset + sizeof(struct nvgpu_notification); struct nvgpu_channel_linux *priv = ch->os_priv; @@ -427,12 +387,7 @@ static int gk20a_init_error_notifier(struct nvgpu_channel *ch, nvgpu_speculation_barrier(); /* map handle */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - err = dma_buf_vmap(dmabuf, &map); - va = err ? NULL : map.vaddr; -#else - va = dma_buf_vmap(dmabuf); -#endif + va = gk20a_dmabuf_vmap(dmabuf); if (!va) { dma_buf_put(dmabuf); pr_err("Cannot map notifier handle\n"); @@ -749,9 +704,6 @@ static int gk20a_channel_wait_semaphore(struct nvgpu_channel *ch, u32 payload, u32 timeout) { struct dma_buf *dmabuf; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif void *data; int ret = 0; @@ -779,12 +731,7 @@ static int gk20a_channel_wait_semaphore(struct nvgpu_channel *ch, nvgpu_speculation_barrier(); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - ret = dma_buf_vmap(dmabuf, &map); - data = ret ? NULL : map.vaddr; -#else - data = dma_buf_vmap(dmabuf); -#endif + data = gk20a_dmabuf_vmap(dmabuf); if (!data) { nvgpu_err(ch->g, "failed to map semaphore memory"); ret = -EINVAL; @@ -797,11 +744,7 @@ static int gk20a_channel_wait_semaphore(struct nvgpu_channel *ch, nvgpu_channel_check_unserviceable(ch), timeout); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_vunmap(dmabuf, &map); -#else - dma_buf_vunmap(dmabuf, data); -#endif + gk20a_dmabuf_vunmap(dmabuf, data); cleanup_put: dma_buf_put(dmabuf); return ret; @@ -811,9 +754,6 @@ static int gk20a_channel_wait(struct nvgpu_channel *ch, struct nvgpu_wait_args *args) { struct dma_buf *dmabuf; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif struct gk20a *g = ch->g; struct notification *notif; struct timespec64 tv; @@ -850,12 +790,7 @@ static int gk20a_channel_wait(struct nvgpu_channel *ch, nvgpu_speculation_barrier(); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - ret = dma_buf_vmap(dmabuf, &map); - notif = ret ? NULL : map.vaddr; -#else - notif = dma_buf_vmap(dmabuf); -#endif + notif = gk20a_dmabuf_vmap(dmabuf); if (!notif) { nvgpu_err(g, "failed to map notifier memory"); return -ENOMEM; @@ -887,11 +822,7 @@ static int gk20a_channel_wait(struct nvgpu_channel *ch, notif->info16 = ch->chid; /* should be method offset */ notif_clean_up: -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_vunmap(dmabuf, &map); -#else - dma_buf_vunmap(dmabuf, notif); -#endif + gk20a_dmabuf_vunmap(dmabuf, notif); return ret; case NVGPU_WAIT_TYPE_SEMAPHORE: diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c b/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c index bd4e7d773..729284b0d 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c @@ -56,6 +56,7 @@ #include "ioctl_dbg.h" #include "ioctl_channel.h" #include "ioctl.h" +#include "dmabuf_priv.h" #include "dmabuf_vidmem.h" #include "common/gr/ctx_priv.h" @@ -2440,15 +2441,8 @@ static int nvgpu_gpu_access_sysmem_gpu_va(struct gk20a *g, u8 cmd, u32 size, { int ret = 0; u8 *cpu_va = NULL; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; - - ret = dma_buf_vmap(dmabuf, &map); - cpu_va = ret ? NULL : map.vaddr; -#else - cpu_va = (u8 *)dma_buf_vmap(dmabuf); -#endif + cpu_va = (u8 *)gk20a_dmabuf_vmap(dmabuf); if (!cpu_va) { return -ENOMEM; } @@ -2467,11 +2461,8 @@ static int nvgpu_gpu_access_sysmem_gpu_va(struct gk20a *g, u8 cmd, u32 size, ret = -EINVAL; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_vunmap(dmabuf, &map); -#else - dma_buf_vunmap(dmabuf, cpu_va); -#endif + gk20a_dmabuf_vunmap(dmabuf, cpu_va); + return ret; } diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_prof.c b/drivers/gpu/nvgpu/os/linux/ioctl_prof.c index 0df3239a1..0e93edc32 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_prof.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_prof.c @@ -32,6 +32,7 @@ #include #include +#include "dmabuf_priv.h" #include "platform_gk20a.h" #include "os_linux.h" #include "ioctl_prof.h" @@ -380,9 +381,6 @@ static int nvgpu_prof_ioctl_alloc_pma_stream(struct nvgpu_profiler_object_priv * u64 pma_buffer_offset; struct dma_buf *pma_dmabuf; struct dma_buf *pma_bytes_available_dmabuf; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif void *cpuva; u32 pma_buffer_size; int err; @@ -452,12 +450,7 @@ static int nvgpu_prof_ioctl_alloc_pma_stream(struct nvgpu_profiler_object_priv * goto err_unmap_pma; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - err = dma_buf_vmap(pma_bytes_available_dmabuf, &map); - cpuva = err ? NULL : map.vaddr; -#else - cpuva = dma_buf_vmap(pma_bytes_available_dmabuf); -#endif + cpuva = gk20a_dmabuf_vmap(pma_bytes_available_dmabuf); if (cpuva == NULL) { err = -ENOMEM; nvgpu_err(g, "failed to vmap available bytes buffer FD"); @@ -501,9 +494,6 @@ static void nvgpu_prof_free_pma_stream_priv_data(struct nvgpu_profiler_object_pr struct nvgpu_profiler_object *prof = priv->prof; struct gk20a *g = prof->g; struct mm_gk20a *mm = &g->mm; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif if (priv->pma_bytes_available_buffer_dmabuf == NULL) { return; @@ -516,13 +506,8 @@ static void nvgpu_prof_free_pma_stream_priv_data(struct nvgpu_profiler_object_pr prof->pma_buffer_va = 0U; prof->pma_buffer_size = 0U; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_map_set_vaddr(&map, prof->pma_bytes_available_buffer_cpuva); - dma_buf_vunmap(priv->pma_bytes_available_buffer_dmabuf, &map); -#else - dma_buf_vunmap(priv->pma_bytes_available_buffer_dmabuf, + gk20a_dmabuf_vunmap(priv->pma_bytes_available_buffer_dmabuf, prof->pma_bytes_available_buffer_cpuva); -#endif dma_buf_put(priv->pma_bytes_available_buffer_dmabuf); priv->pma_bytes_available_buffer_dmabuf = NULL; prof->pma_bytes_available_buffer_cpuva = NULL; diff --git a/drivers/gpu/nvgpu/os/linux/linux-channel.c b/drivers/gpu/nvgpu/os/linux/linux-channel.c index 87362f188..016613f31 100644 --- a/drivers/gpu/nvgpu/os/linux/linux-channel.c +++ b/drivers/gpu/nvgpu/os/linux/linux-channel.c @@ -661,9 +661,6 @@ static void trace_write_pushbuffer(struct nvgpu_channel *c, unsigned int words; u64 offset; struct dma_buf *dmabuf = NULL; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - struct dma_buf_map map; -#endif if (gk20a_debug_trace_cmdbuf) { u64 gpu_va = (u64)g->entry0 | @@ -672,14 +669,8 @@ static void trace_write_pushbuffer(struct nvgpu_channel *c, words = pbdma_gp_entry1_length_v(g->entry1); err = nvgpu_vm_find_buf(c->vm, gpu_va, &dmabuf, &offset); - if (!err) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - err = dma_buf_vmap(dmabuf, &map); - mem = err ? NULL : map.vaddr; -#else - mem = dma_buf_vmap(dmabuf); -#endif - } + if (!err) + mem = gk20a_dmabuf_vmap(dmabuf); } if (mem) { @@ -698,11 +689,7 @@ static void trace_write_pushbuffer(struct nvgpu_channel *c, mem); } #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) - dma_buf_vunmap(dmabuf, &map); -#else - dma_buf_vunmap(dmabuf, mem); -#endif + gk20a_dmabuf_vunmap(dmabuf, mem); } }