diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 0c1c6d8f8..4ae09e895 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -234,12 +234,6 @@ static inline void pramin_access_batch_wr_n(struct gk20a *g, u32 start, r += sizeof(u32); } - /* - * Barrier moved here from gk20a_writel in the loop. The writes don't - * have to be ordered. - */ - wmb(); - *arg = src_u32; } @@ -252,12 +246,6 @@ static inline void pramin_access_batch_set(struct gk20a *g, u32 start, writel_relaxed(repeat, g->regs + r); r += sizeof(u32); } - - /* - * Barrier moved here from gk20a_writel in the loop. The writes don't - * have to be ordered. - */ - wmb(); } u32 gk20a_mem_rd32(struct gk20a *g, struct mem_desc *mem, u32 w) @@ -336,6 +324,8 @@ void gk20a_mem_wr32(struct gk20a *g, struct mem_desc *mem, u32 w, u32 data) pramin_access_batched(g, mem, w * sizeof(u32), sizeof(u32), pramin_access_batch_wr_n, &p); + if (!mem->skip_wmb) + wmb(); } else { WARN_ON("Accessing unallocated mem_desc"); } @@ -368,6 +358,8 @@ void gk20a_mem_wr_n(struct gk20a *g, struct mem_desc *mem, u32 offset, pramin_access_batched(g, mem, offset, size, pramin_access_batch_wr_n, &src_u32); + if (!mem->skip_wmb) + wmb(); } else { WARN_ON("Accessing unallocated mem_desc"); } @@ -398,6 +390,8 @@ void gk20a_memset(struct gk20a *g, struct mem_desc *mem, u32 offset, pramin_access_batched(g, mem, offset, size, pramin_access_batch_set, &p); + if (!mem->skip_wmb) + wmb(); } else { WARN_ON("Accessing unallocated mem_desc"); } diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index e8f7da984..b34ff4a75 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h @@ -74,6 +74,7 @@ struct mem_desc { bool user_mem; /* vidmem only */ struct gk20a_allocator *allocator; /* vidmem only */ struct list_head clear_list_entry; /* vidmem only */ + bool skip_wmb; }; struct mem_desc_sub {