summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/debug_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/debug_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/debug_gk20a.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/debug_gk20a.c b/drivers/gpu/nvgpu/gk20a/debug_gk20a.c
index 0f1c31dd..bda0dab0 100644
--- a/drivers/gpu/nvgpu/gk20a/debug_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/debug_gk20a.c
@@ -36,6 +36,7 @@ static struct platform_device *gk20a_device;
36 36
37struct ch_state { 37struct ch_state {
38 int pid; 38 int pid;
39 int refs;
39 u8 inst_block[0]; 40 u8 inst_block[0];
40}; 41};
41 42
@@ -118,9 +119,10 @@ static void gk20a_debug_show_channel(struct gk20a *g,
118 syncpointa = gk20a_mem_rd32(inst_ptr, ram_fc_syncpointa_w()); 119 syncpointa = gk20a_mem_rd32(inst_ptr, ram_fc_syncpointa_w());
119 syncpointb = gk20a_mem_rd32(inst_ptr, ram_fc_syncpointb_w()); 120 syncpointb = gk20a_mem_rd32(inst_ptr, ram_fc_syncpointb_w());
120 121
121 gk20a_debug_output(o, "%d-%s, pid %d: ", hw_chid, 122 gk20a_debug_output(o, "%d-%s, pid %d, refs: %d: ", hw_chid,
122 g->dev->name, 123 g->dev->name,
123 ch_state->pid); 124 ch_state->pid,
125 ch_state->refs);
124 gk20a_debug_output(o, "%s in use %s %s\n", 126 gk20a_debug_output(o, "%s in use %s %s\n",
125 ccsr_channel_enable_v(channel) ? "" : "not", 127 ccsr_channel_enable_v(channel) ? "" : "not",
126 ccsr_chan_status_str[status], 128 ccsr_chan_status_str[status],
@@ -231,16 +233,30 @@ void gk20a_debug_show_dump(struct gk20a *g, struct gk20a_debug_output *o)
231 } 233 }
232 234
233 for (chid = 0; chid < f->num_channels; chid++) { 235 for (chid = 0; chid < f->num_channels; chid++) {
234 if (f->channel[chid].in_use) 236 struct channel_gk20a *ch = &f->channel[chid];
235 ch_state[chid] = kmalloc(sizeof(struct ch_state) + ram_in_alloc_size_v(), GFP_KERNEL); 237 if (gk20a_channel_get(ch)) {
238 ch_state[chid] =
239 kmalloc(sizeof(struct ch_state) +
240 ram_in_alloc_size_v(), GFP_KERNEL);
241 /* ref taken stays to below loop with
242 * successful allocs */
243 if (!ch_state[chid])
244 gk20a_channel_put(ch);
245 }
236 } 246 }
237 247
238 for (chid = 0; chid < f->num_channels; chid++) { 248 for (chid = 0; chid < f->num_channels; chid++) {
239 if (ch_state[chid] && f->channel[chid].inst_block.cpu_va) { 249 struct channel_gk20a *ch = &f->channel[chid];
240 ch_state[chid]->pid = f->channel[chid].pid; 250 if (ch_state[chid]) {
241 memcpy(&ch_state[chid]->inst_block[0], 251 if (ch->inst_block.cpu_va) {
242 f->channel[chid].inst_block.cpu_va, 252 ch_state[chid]->pid = ch->pid;
243 ram_in_alloc_size_v()); 253 ch_state[chid]->refs =
254 atomic_read(&ch->ref_count);
255 memcpy(&ch_state[chid]->inst_block[0],
256 ch->inst_block.cpu_va,
257 ram_in_alloc_size_v());
258 }
259 gk20a_channel_put(ch);
244 } 260 }
245 } 261 }
246 for (chid = 0; chid < f->num_channels; chid++) { 262 for (chid = 0; chid < f->num_channels; chid++) {