From 3484fd0d1365c6f97723d97cb45664aa75c45f32 Mon Sep 17 00:00:00 2001 From: Richard Zhao Date: Wed, 2 Dec 2015 17:21:47 -0800 Subject: gpu: nvgpu: vgpu: add regops support Added new RM Server command for regops. JIRA VFND-1128 Bug 1700139 Change-Id: Ia1cc63e993c29c91f87440c241077fa91edb9e53 Signed-off-by: Richard Zhao Reviewed-on: http://git-master/r/923235 (cherry picked from commit 7de22e42cfd2e419ad64178b9f1f1ee16273bd03) Reviewed-on: http://git-master/r/841330 Reviewed-by: Aingara Paramakuru Reviewed-by: Terje Bergstrom GVS: Gerrit_Virtual_Submit Reviewed-by: Vladislav Buzov --- drivers/gpu/nvgpu/Makefile | 1 + drivers/gpu/nvgpu/vgpu/dbg_vgpu.c | 74 +++++++++++++++++++++++++++++++++++++++ drivers/gpu/nvgpu/vgpu/vgpu.c | 1 + drivers/gpu/nvgpu/vgpu/vgpu.h | 2 ++ 4 files changed, 78 insertions(+) create mode 100644 drivers/gpu/nvgpu/vgpu/dbg_vgpu.c (limited to 'drivers/gpu') diff --git a/drivers/gpu/nvgpu/Makefile b/drivers/gpu/nvgpu/Makefile index 966c5eea..f6b3a673 100644 --- a/drivers/gpu/nvgpu/Makefile +++ b/drivers/gpu/nvgpu/Makefile @@ -77,6 +77,7 @@ nvgpu-$(CONFIG_TEGRA_GR_VIRTUALIZATION) += \ vgpu/mm_vgpu.o \ vgpu/debug_vgpu.o \ vgpu/vgpu.o \ + vgpu/dbg_vgpu.o \ vgpu/gk20a/vgpu_hal_gk20a.o \ vgpu/gk20a/vgpu_gr_gk20a.o \ vgpu/gm20b/vgpu_hal_gm20b.o \ diff --git a/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c b/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c new file mode 100644 index 00000000..ef12c3fd --- /dev/null +++ b/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2015, 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 + +#include "gk20a/gk20a.h" +#include "gk20a/channel_gk20a.h" +#include "gk20a/dbg_gpu_gk20a.h" +#include "vgpu.h" + +static int vgpu_exec_regops(struct dbg_session_gk20a *dbg_s, + struct nvgpu_dbg_gpu_reg_op *ops, + u64 num_ops) +{ + struct channel_gk20a *ch = dbg_s->ch; + struct gk20a_platform *platform = gk20a_get_platform(dbg_s->g->dev); + struct tegra_vgpu_cmd_msg msg; + struct tegra_vgpu_reg_ops_params *p = &msg.params.reg_ops; + void *oob; + size_t oob_size; + void *handle = NULL; + int ops_size, err = 0; + + gk20a_dbg_fn(""); + BUG_ON(sizeof(*ops) != sizeof(struct tegra_vgpu_reg_op)); + + handle = tegra_gr_comm_oob_get_ptr(TEGRA_GR_COMM_CTX_CLIENT, + tegra_gr_comm_get_server_vmid(), + TEGRA_VGPU_QUEUE_CMD, + &oob, &oob_size); + if (!handle) + return -EINVAL; + + ops_size = sizeof(*ops) * num_ops; + if (oob_size < ops_size) { + err = -ENOMEM; + goto fail; + } + + memcpy(oob, ops, ops_size); + + msg.cmd = TEGRA_VGPU_CMD_REG_OPS; + msg.handle = platform->virt_handle; + p->handle = ch ? ch->virt_ctx : 0; + p->num_ops = num_ops; + p->is_profiler = dbg_s->is_profiler; + err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); + err = err ? err : msg.ret; + if (!err) + memcpy(ops, oob, ops_size); + +fail: + tegra_gr_comm_oob_put_ptr(handle); + return err; +} + +void vgpu_dbg_init(void) +{ + dbg_gpu_session_ops_gk20a.exec_reg_ops = vgpu_exec_regops; +} diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index 6f91db4c..3791d8a7 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c @@ -408,6 +408,7 @@ int vgpu_probe(struct platform_device *dev) return err; vgpu_init_support(dev); + vgpu_dbg_init(); init_rwsem(&gk20a->busy_lock); diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.h b/drivers/gpu/nvgpu/vgpu/vgpu.h index ffb863cd..32f4b110 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.h +++ b/drivers/gpu/nvgpu/vgpu/vgpu.h @@ -58,6 +58,8 @@ int vgpu_comm_sendrecv(struct tegra_vgpu_cmd_msg *msg, size_t size_in, void vgpu_init_hal_common(struct gk20a *g); int vgpu_gk20a_init_hal(struct gk20a *g); int vgpu_gm20b_init_hal(struct gk20a *g); + +void vgpu_dbg_init(void); #else static inline int vgpu_pm_prepare_poweroff(struct device *dev) { -- cgit v1.2.2