From e0dbf3a784f6cb1a6e1c41a23123b19ec73b8708 Mon Sep 17 00:00:00 2001 From: Deepak Goyal Date: Thu, 18 Jan 2018 11:44:47 +0530 Subject: gpu: nvgpu: gv11b: Enable perfmon. t19x PMU ucode uses RPC mechanism for PERFMON commands. - Declared "pmu_init_perfmon", "pmu_perfmon_start_sampling", "pmu_perfmon_stop_sampling" and "pmu_perfmon_get_samples" in pmu ops to differenciate for chips using RPC & legacy cmd/msg mechanism. - Defined and used PERFMON RPC commands for t19x - INIT - START - STOP - QUERY - Adds RPC handler for PERFMON RPC commands. - For guerying GPU utilization/load, we need to send PERFMON_QUERY RPC command for gv11b. - Enables perfmon for gv11b. Bug 2039013 Change-Id: Ic32326f81d48f11bc772afb8fee2dee6e427a699 Signed-off-by: Deepak Goyal Reviewed-on: https://git-master.nvidia.com/r/1614114 Reviewed-by: svc-mobile-coverity GVS: Gerrit_Virtual_Submit Reviewed-by: Seshendra Gadagottu Tested-by: Seshendra Gadagottu Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/pmu/pmu_ipc.c | 35 +++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'drivers/gpu/nvgpu/common/pmu/pmu_ipc.c') diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c b/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c index 829fee19..2811a4b0 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c @@ -925,8 +925,9 @@ int nvgpu_pmu_process_message(struct nvgpu_pmu *pmu) nvgpu_pmu_process_init_msg(pmu, &msg); if (g->ops.pmu.init_wpr_region != NULL) g->ops.pmu.init_wpr_region(g); + if (nvgpu_is_enabled(g, NVGPU_PMU_PERFMON)) - nvgpu_pmu_init_perfmon(pmu); + g->ops.pmu.pmu_init_perfmon(pmu); return 0; } @@ -978,6 +979,8 @@ static void pmu_rpc_handler(struct gk20a *g, struct pmu_msg *msg, void *param, u32 handle, u32 status) { struct nv_pmu_rpc_header rpc; + struct nvgpu_pmu *pmu = &g->pmu; + struct nv_pmu_rpc_struct_perfmon_query *rpc_param; memset(&rpc, 0, sizeof(struct nv_pmu_rpc_header)); if (param) @@ -990,10 +993,36 @@ static void pmu_rpc_handler(struct gk20a *g, struct pmu_msg *msg, } switch (msg->hdr.unit_id) { + case PMU_UNIT_PERFMON_T18X: + case PMU_UNIT_PERFMON: + switch (rpc.function) { + case NV_PMU_RPC_ID_PERFMON_T18X_INIT: + nvgpu_pmu_dbg(g, + "reply NV_PMU_RPC_ID_PERFMON_INIT"); + pmu->perfmon_ready = 1; + break; + case NV_PMU_RPC_ID_PERFMON_T18X_START: + nvgpu_pmu_dbg(g, + "reply NV_PMU_RPC_ID_PERFMON_START"); + break; + case NV_PMU_RPC_ID_PERFMON_T18X_STOP: + nvgpu_pmu_dbg(g, + "reply NV_PMU_RPC_ID_PERFMON_STOP"); + break; + case NV_PMU_RPC_ID_PERFMON_T18X_QUERY: + nvgpu_pmu_dbg(g, + "reply NV_PMU_RPC_ID_PERFMON_QUERY"); + rpc_param = (struct nv_pmu_rpc_struct_perfmon_query *)param; + pmu->load = rpc_param->sample_buffer[0]; + pmu->perfmon_query = 1; + /* set perfmon_query to 1 after load is copied */ + break; + } + break; /* TBD case will be added */ default: - nvgpu_err(g, " Invalid RPC response, stats 0x%x", - rpc.flcn_status); + nvgpu_err(g, " Invalid RPC response, stats 0x%x", + rpc.flcn_status); break; } -- cgit v1.2.2