From dd88aed5cc3088285c5d0b900aebf705f52178c5 Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Wed, 15 Mar 2017 15:49:18 -0700 Subject: gpu: nvgpu: Split out pramin code Split out the pramin interface code in preparation for splitting out the mem_desc code. JIRA NVGPU-12 Change-Id: I3f03447ea213cc15669b0934fa706e7cb22599b7 Signed-off-by: Alex Waterman Reviewed-on: http://git-master/r/1323323 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/pramin_gk20a.c | 71 ++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 drivers/gpu/nvgpu/gk20a/pramin_gk20a.c (limited to 'drivers/gpu/nvgpu/gk20a/pramin_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c b/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c new file mode 100644 index 00000000..bed2e9b5 --- /dev/null +++ b/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2017, 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, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "gk20a/gk20a.h" +#include "gk20a/mm_gk20a.h" +#include "gk20a/pramin_gk20a.h" + +#include +#include + +/* WARNING: returns pramin_window_lock taken, complement with pramin_exit() */ +static u32 gk20a_pramin_enter(struct gk20a *g, struct mem_desc *mem, + struct page_alloc_chunk *chunk, u32 w) +{ + u64 bufbase = chunk->base; + u64 addr = bufbase + w * sizeof(u32); + u32 hi = (u32)((addr & ~(u64)0xfffff) + >> bus_bar0_window_target_bar0_window_base_shift_v()); + u32 lo = (u32)(addr & 0xfffff); + u32 win = gk20a_aperture_mask(g, mem, + bus_bar0_window_target_sys_mem_noncoherent_f(), + bus_bar0_window_target_vid_mem_f()) | + bus_bar0_window_base_f(hi); + + gk20a_dbg(gpu_dbg_mem, + "0x%08x:%08x begin for %p,%p at [%llx,%llx] (sz %llx)", + hi, lo, mem, chunk, bufbase, + bufbase + chunk->length, chunk->length); + + WARN_ON(!bufbase); + + nvgpu_spinlock_acquire(&g->mm.pramin_window_lock); + + if (g->mm.pramin_window != win) { + gk20a_writel(g, bus_bar0_window_r(), win); + gk20a_readl(g, bus_bar0_window_r()); + g->mm.pramin_window = win; + } + + return lo; +} + +static void gk20a_pramin_exit(struct gk20a *g, struct mem_desc *mem, + struct page_alloc_chunk *chunk) +{ + gk20a_dbg(gpu_dbg_mem, "end for %p,%p", mem, chunk); + + nvgpu_spinlock_release(&g->mm.pramin_window_lock); +} + +void gk20a_init_pramin_ops(struct gpu_ops *gops) +{ + gops->pramin.enter = gk20a_pramin_enter; + gops->pramin.exit = gk20a_pramin_exit; + gops->pramin.data032_r = pram_data032_r; +} -- cgit v1.2.2