mirror of https://gitee.com/openkylin/linux.git
drm/i915: semaphore debugfs
Simple debugfs file to display the current state of semaphores. This is useful if you want to see the state without hanging the GPU. NOTE: This patch is optional to the series. NOTE2: Like the GPU error state collection, the reads are currently incoherent. v2 (Rodrigo): * Iterate only on active rings. * s/ring_buffer/engine_cs. Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
0ca36d7839
commit
e04934cf25
|
@ -2395,6 +2395,76 @@ static int i915_display_info(struct seq_file *m, void *unused)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int i915_semaphore_status(struct seq_file *m, void *unused)
|
||||||
|
{
|
||||||
|
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
||||||
|
struct drm_device *dev = node->minor->dev;
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
struct intel_engine_cs *ring;
|
||||||
|
int num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
|
||||||
|
int i, j, ret;
|
||||||
|
|
||||||
|
if (!i915_semaphore_is_enabled(dev)) {
|
||||||
|
seq_puts(m, "Semaphores are disabled\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = mutex_lock_interruptible(&dev->struct_mutex);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (IS_BROADWELL(dev)) {
|
||||||
|
struct page *page;
|
||||||
|
uint64_t *seqno;
|
||||||
|
|
||||||
|
page = i915_gem_object_get_page(dev_priv->semaphore_obj, 0);
|
||||||
|
|
||||||
|
seqno = (uint64_t *)kmap_atomic(page);
|
||||||
|
for_each_ring(ring, dev_priv, i) {
|
||||||
|
uint64_t offset;
|
||||||
|
|
||||||
|
seq_printf(m, "%s\n", ring->name);
|
||||||
|
|
||||||
|
seq_puts(m, " Last signal:");
|
||||||
|
for (j = 0; j < num_rings; j++) {
|
||||||
|
offset = i * I915_NUM_RINGS + j;
|
||||||
|
seq_printf(m, "0x%08llx (0x%02llx) ",
|
||||||
|
seqno[offset], offset * 8);
|
||||||
|
}
|
||||||
|
seq_putc(m, '\n');
|
||||||
|
|
||||||
|
seq_puts(m, " Last wait: ");
|
||||||
|
for (j = 0; j < num_rings; j++) {
|
||||||
|
offset = i + (j * I915_NUM_RINGS);
|
||||||
|
seq_printf(m, "0x%08llx (0x%02llx) ",
|
||||||
|
seqno[offset], offset * 8);
|
||||||
|
}
|
||||||
|
seq_putc(m, '\n');
|
||||||
|
|
||||||
|
}
|
||||||
|
kunmap_atomic(seqno);
|
||||||
|
} else {
|
||||||
|
seq_puts(m, " Last signal:");
|
||||||
|
for_each_ring(ring, dev_priv, i)
|
||||||
|
for (j = 0; j < num_rings; j++)
|
||||||
|
seq_printf(m, "0x%08x\n",
|
||||||
|
I915_READ(ring->semaphore.mbox.signal[j]));
|
||||||
|
seq_putc(m, '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
seq_puts(m, "\nSync seqno:\n");
|
||||||
|
for_each_ring(ring, dev_priv, i) {
|
||||||
|
for (j = 0; j < num_rings; j++) {
|
||||||
|
seq_printf(m, " 0x%08x ", ring->semaphore.sync_seqno[j]);
|
||||||
|
}
|
||||||
|
seq_putc(m, '\n');
|
||||||
|
}
|
||||||
|
seq_putc(m, '\n');
|
||||||
|
|
||||||
|
mutex_unlock(&dev->struct_mutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct pipe_crc_info {
|
struct pipe_crc_info {
|
||||||
const char *name;
|
const char *name;
|
||||||
struct drm_device *dev;
|
struct drm_device *dev;
|
||||||
|
@ -3904,6 +3974,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
|
||||||
{"i915_pc8_status", i915_pc8_status, 0},
|
{"i915_pc8_status", i915_pc8_status, 0},
|
||||||
{"i915_power_domain_info", i915_power_domain_info, 0},
|
{"i915_power_domain_info", i915_power_domain_info, 0},
|
||||||
{"i915_display_info", i915_display_info, 0},
|
{"i915_display_info", i915_display_info, 0},
|
||||||
|
{"i915_semaphore_status", i915_semaphore_status, 0},
|
||||||
};
|
};
|
||||||
#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
|
#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue