summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c
diff options
context:
space:
mode:
authorThomas Fleury <tfleury@nvidia.com>2016-08-24 18:12:35 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-08-29 19:14:40 -0400
commitfba43012c092b7566a1e83d140e0c5f170de62f0 (patch)
tree4e893772b571b4c96b8284c8a7118faea31f129e /drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c
parent7298414969ff659241f4fe1d8111bc54ae335d5e (diff)
gpu: nvgpu: do not flush FECS record on engine reset
Flushing timestamp record method can fail in case FECS is not processing the main method queue. In particular, this occurs in case of ctxsw timeout, where we process fifo sched interrupts from the host, but FECS is still waiting for idle (grWFI). In such scenario, this adds huge delay in fifo recovery procedure (timeout on FECS method). Since flushing the last (incomplete) record from FECS would only be useful in that case (context switch ongoing), remove flush operation on engine reset. Note that an explicit ENGINE_RESET event (with pid) is inserted in user-facing ctxsw buffer on engine reset. Bug 200228310 Change-Id: I885525f8f197f81266b50db161bb511867fc74f4 Signed-off-by: Thomas Fleury <tfleury@nvidia.com> Reviewed-on: http://git-master/r/1207305 (cherry picked from commit 44391b6204fd648949295f90481b0c424d9a5ddf) Reviewed-on: http://git-master/r/1208414 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c')
-rw-r--r--drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c b/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c
index 634932b7..c80da26d 100644
--- a/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c
+++ b/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.c
@@ -26,6 +26,7 @@ struct vgpu_fecs_trace {
26 struct nvgpu_ctxsw_ring_header *header; 26 struct nvgpu_ctxsw_ring_header *header;
27 struct nvgpu_ctxsw_trace_entry *entries; 27 struct nvgpu_ctxsw_trace_entry *entries;
28 int num_entries; 28 int num_entries;
29 bool enabled;
29 void *buf; 30 void *buf;
30}; 31};
31 32
@@ -104,6 +105,7 @@ static int vgpu_fecs_trace_deinit(struct gk20a *g)
104 105
105static int vgpu_fecs_trace_enable(struct gk20a *g) 106static int vgpu_fecs_trace_enable(struct gk20a *g)
106{ 107{
108 struct vgpu_fecs_trace *vcst = (struct vgpu_fecs_trace *)g->fecs_trace;
107 struct tegra_vgpu_cmd_msg msg = { 109 struct tegra_vgpu_cmd_msg msg = {
108 .cmd = TEGRA_VGPU_CMD_FECS_TRACE_ENABLE, 110 .cmd = TEGRA_VGPU_CMD_FECS_TRACE_ENABLE,
109 .handle = vgpu_get_handle(g), 111 .handle = vgpu_get_handle(g),
@@ -113,23 +115,33 @@ static int vgpu_fecs_trace_enable(struct gk20a *g)
113 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); 115 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg));
114 err = err ? err : msg.ret; 116 err = err ? err : msg.ret;
115 WARN_ON(err); 117 WARN_ON(err);
118 vcst->enabled = !err;
116 return err; 119 return err;
117} 120}
118 121
119static int vgpu_fecs_trace_disable(struct gk20a *g) 122static int vgpu_fecs_trace_disable(struct gk20a *g)
120{ 123{
124 struct vgpu_fecs_trace *vcst = (struct vgpu_fecs_trace *)g->fecs_trace;
121 struct tegra_vgpu_cmd_msg msg = { 125 struct tegra_vgpu_cmd_msg msg = {
122 .cmd = TEGRA_VGPU_CMD_FECS_TRACE_DISABLE, 126 .cmd = TEGRA_VGPU_CMD_FECS_TRACE_DISABLE,
123 .handle = vgpu_get_handle(g), 127 .handle = vgpu_get_handle(g),
124 }; 128 };
125 int err; 129 int err;
126 130
131 vcst->enabled = false;
127 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); 132 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg));
128 err = err ? err : msg.ret; 133 err = err ? err : msg.ret;
129 WARN_ON(err); 134 WARN_ON(err);
130 return err; 135 return err;
131} 136}
132 137
138static bool vpgpu_fecs_trace_is_enabled(struct gk20a *g)
139{
140 struct vgpu_fecs_trace *vcst = (struct vgpu_fecs_trace *)g->fecs_trace;
141
142 return (vcst && vcst->enabled);
143}
144
133static int vgpu_fecs_trace_poll(struct gk20a *g) 145static int vgpu_fecs_trace_poll(struct gk20a *g)
134{ 146{
135 struct tegra_vgpu_cmd_msg msg = { 147 struct tegra_vgpu_cmd_msg msg = {
@@ -208,6 +220,7 @@ void vgpu_init_fecs_trace_ops(struct gpu_ops *ops)
208 ops->fecs_trace.deinit = vgpu_fecs_trace_deinit; 220 ops->fecs_trace.deinit = vgpu_fecs_trace_deinit;
209 ops->fecs_trace.enable = vgpu_fecs_trace_enable; 221 ops->fecs_trace.enable = vgpu_fecs_trace_enable;
210 ops->fecs_trace.disable = vgpu_fecs_trace_disable; 222 ops->fecs_trace.disable = vgpu_fecs_trace_disable;
223 ops->fecs_trace.is_enabled = vpgpu_fecs_trace_is_enabled;
211 ops->fecs_trace.reset = NULL; 224 ops->fecs_trace.reset = NULL;
212 ops->fecs_trace.flush = NULL; 225 ops->fecs_trace.flush = NULL;
213 ops->fecs_trace.poll = vgpu_fecs_trace_poll; 226 ops->fecs_trace.poll = vgpu_fecs_trace_poll;