diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 298f59332..289c1c6c5 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -623,8 +623,6 @@ static int init_runlist(struct gk20a *g, struct fifo_gk20a *f) u32 i; size_t runlist_size; u32 active_engine_id, pbdma_id, engine_id; - u32 flags = nvgpu_is_enabled(g, NVGPU_MM_USE_PHYSICAL_SG) ? - NVGPU_DMA_FORCE_CONTIGUOUS : 0U; int err = 0; nvgpu_log_fn(g, " "); @@ -664,9 +662,10 @@ static int init_runlist(struct gk20a *g, struct fifo_gk20a *f) f->num_runlist_entries, runlist_size); for (i = 0; i < MAX_RUNLIST_BUFFERS; i++) { - err = nvgpu_dma_alloc_flags_sys(g, flags, - runlist_size, - &runlist->mem[i]); + err = nvgpu_dma_alloc_flags_sys(g, + NVGPU_DMA_PHYSICALLY_ADDRESSED, + runlist_size, + &runlist->mem[i]); if (err != 0) { nvgpu_err(g, "memory allocation failed"); goto clean_up_runlist; @@ -967,10 +966,8 @@ int gk20a_init_fifo_setup_sw(struct gk20a *g) (size_t)f->num_channels, &f->userd); } else { - u32 flags = nvgpu_is_enabled(g, NVGPU_MM_USE_PHYSICAL_SG) ? - NVGPU_DMA_FORCE_CONTIGUOUS : 0U; - - err = nvgpu_dma_alloc_flags_sys(g, flags, + err = nvgpu_dma_alloc_flags_sys(g, + NVGPU_DMA_PHYSICALLY_ADDRESSED, (size_t)f->userd_entry_size * (size_t)f->num_channels, &f->userd); } diff --git a/drivers/gpu/nvgpu/include/nvgpu/dma.h b/drivers/gpu/nvgpu/include/nvgpu/dma.h index d7ece3949..28f2159d5 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/dma.h +++ b/drivers/gpu/nvgpu/include/nvgpu/dma.h @@ -54,6 +54,15 @@ struct nvgpu_mem; */ #define NVGPU_DMA_READ_ONLY BIT32(2) +/* + * Buffer is physically addressed from the GPU. + * If device is not iommuable, or nvlink is enabled, don't allow building + * the buffer from individual pages, but require a physically contiguous + * block. + */ +#define NVGPU_DMA_PHYSICALLY_ADDRESSED BIT32(3) + + /** * nvgpu_iommuable - Check if GPU is behind IOMMU * diff --git a/drivers/gpu/nvgpu/os/linux/linux-dma.c b/drivers/gpu/nvgpu/os/linux/linux-dma.c index 348f2cdc7..6dcc40662 100644 --- a/drivers/gpu/nvgpu/os/linux/linux-dma.c +++ b/drivers/gpu/nvgpu/os/linux/linux-dma.c @@ -74,8 +74,9 @@ static char *nvgpu_dma_flags_to_str(struct gk20a *g, unsigned long flags) } \ } while (false) - APPEND_FLAG(NVGPU_DMA_NO_KERNEL_MAPPING, "NO_KERNEL_MAPPING "); - APPEND_FLAG(NVGPU_DMA_FORCE_CONTIGUOUS, "FORCE_CONTIGUOUS "); + APPEND_FLAG(NVGPU_DMA_NO_KERNEL_MAPPING, "NO_KERNEL_MAPPING "); + APPEND_FLAG(NVGPU_DMA_FORCE_CONTIGUOUS, "FORCE_CONTIGUOUS "); + APPEND_FLAG(NVGPU_DMA_PHYSICALLY_ADDRESSED, "PHYSICALLY_ADDRESSED"); #undef APPEND_FLAG return buf; @@ -187,6 +188,12 @@ int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags, WARN_ON(1); } + if ((flags & NVGPU_DMA_PHYSICALLY_ADDRESSED) && + (!nvgpu_iommuable(g) || + nvgpu_is_enabled(g, NVGPU_MM_USE_PHYSICAL_SG))) { + flags |= NVGPU_DMA_FORCE_CONTIGUOUS; + } + /* * WAR for IO coherent chips: the DMA API does not seem to generate * mappings that work correctly. Unclear why - Bug ID: 2040115. diff --git a/drivers/gpu/nvgpu/os/linux/ltc.c b/drivers/gpu/nvgpu/os/linux/ltc.c index baeb20b2e..9b51632df 100644 --- a/drivers/gpu/nvgpu/os/linux/ltc.c +++ b/drivers/gpu/nvgpu/os/linux/ltc.c @@ -31,7 +31,6 @@ int nvgpu_ltc_alloc_cbc(struct gk20a *g, size_t compbit_backing_size, bool vidmem_alloc) { struct gr_gk20a *gr = &g->gr; - unsigned long flags = 0; if (nvgpu_mem_is_valid(&gr->compbit_store.mem)) return 0; @@ -49,11 +48,8 @@ int nvgpu_ltc_alloc_cbc(struct gk20a *g, size_t compbit_backing_size, compbit_backing_size, &gr->compbit_store.mem); } else { - if (!nvgpu_iommuable(g)) - flags = NVGPU_DMA_FORCE_CONTIGUOUS; - return nvgpu_dma_alloc_flags_sys(g, - flags, + NVGPU_DMA_PHYSICALLY_ADDRESSED, compbit_backing_size, &gr->compbit_store.mem); }