Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 065f2ec2 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter
Browse files

drm/i915: Show cursor status in debugfs/i915_display_info



I have the occasional absent cursor on i845 and I want to know why.
This should help by revealing the last known cursor state.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 8ac36ec1
Loading
Loading
Loading
Loading
+50 −7
Original line number Diff line number Diff line
@@ -2248,24 +2248,67 @@ static void intel_connector_info(struct seq_file *m,
		intel_seq_print_mode(m, 2, mode);
}

static bool cursor_active(struct drm_device *dev, int pipe)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	u32 state;

	if (IS_845G(dev) || IS_I865G(dev))
		state = I915_READ(_CURACNTR) & CURSOR_ENABLE;
	else if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev))
		state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE;
	else
		state = I915_READ(CURCNTR_IVB(pipe)) & CURSOR_MODE;

	return state;
}

static bool cursor_position(struct drm_device *dev, int pipe, int *x, int *y)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	u32 pos;

	if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev) || IS_BROADWELL(dev))
		pos = I915_READ(CURPOS_IVB(pipe));
	else
		pos = I915_READ(CURPOS(pipe));

	*x = (pos >> CURSOR_X_SHIFT) & CURSOR_POS_MASK;
	if (pos & (CURSOR_POS_SIGN << CURSOR_X_SHIFT))
		*x = -*x;

	*y = (pos >> CURSOR_Y_SHIFT) & CURSOR_POS_MASK;
	if (pos & (CURSOR_POS_SIGN << CURSOR_Y_SHIFT))
		*y = -*y;

	return cursor_active(dev, pipe);
}

static int i915_display_info(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_crtc *crtc;
	struct intel_crtc *crtc;
	struct drm_connector *connector;

	drm_modeset_lock_all(dev);
	seq_printf(m, "CRTC info\n");
	seq_printf(m, "---------\n");
	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) {
		bool active;
		int x, y;

		seq_printf(m, "CRTC %d: pipe: %c, active: %s\n",
			   crtc->base.id, pipe_name(intel_crtc->pipe),
			   intel_crtc->active ? "yes" : "no");
		if (intel_crtc->active)
			intel_crtc_info(m, intel_crtc);
			   crtc->base.base.id, pipe_name(crtc->pipe),
			   yesno(crtc->active));
		if (crtc->active)
			intel_crtc_info(m, crtc);

		active = cursor_position(dev, crtc->pipe, &x, &y);
		seq_printf(m, "\tcursor visible? %s, position (%d, %d), addr 0x%08x, active? %s\n",
			   yesno(crtc->cursor_visible),
			   x, y, crtc->cursor_addr,
			   yesno(active));
	}

	seq_printf(m, "\n");