Skip to content

Commit 0a91ca2

Browse files
committed
drm/i915: check connector hw/sw state
Atm we can only check the connector state after a dpms call - while doing modeset with the copy&pasted crtc helper code things are too ill-defined for proper checking. But the idea is very much to call this check from the modeset code, too. v2: Fix dpms check and don't presume that if the hw isn't on that it must not be linked up with an encoder (it could simply be switched off with the dpms state). Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
1 parent 2492935 commit 0a91ca2

File tree

6 files changed

+46
-0
lines changed

6 files changed

+46
-0
lines changed

drivers/gpu/drm/i915/intel_crt.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ static void intel_crt_dpms(struct drm_connector *connector, int mode)
176176

177177
intel_crtc_update_dpms(crtc);
178178
}
179+
180+
intel_connector_check_state(to_intel_connector(connector));
179181
}
180182

181183
static int intel_crt_mode_valid(struct drm_connector *connector,

drivers/gpu/drm/i915/intel_display.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3562,6 +3562,41 @@ void intel_encoder_dpms(struct intel_encoder *encoder, int mode)
35623562
}
35633563
}
35643564

3565+
/* Cross check the actual hw state with our own modeset state tracking (and it's
3566+
* internal consistency). */
3567+
void intel_connector_check_state(struct intel_connector *connector)
3568+
{
3569+
if (connector->get_hw_state(connector)) {
3570+
struct intel_encoder *encoder = connector->encoder;
3571+
struct drm_crtc *crtc;
3572+
bool encoder_enabled;
3573+
enum pipe pipe;
3574+
3575+
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
3576+
connector->base.base.id,
3577+
drm_get_connector_name(&connector->base));
3578+
3579+
WARN(connector->base.dpms == DRM_MODE_DPMS_OFF,
3580+
"wrong connector dpms state\n");
3581+
WARN(connector->base.encoder != &encoder->base,
3582+
"active connector not linked to encoder\n");
3583+
WARN(!encoder->connectors_active,
3584+
"encoder->connectors_active not set\n");
3585+
3586+
encoder_enabled = encoder->get_hw_state(encoder, &pipe);
3587+
WARN(!encoder_enabled, "encoder not enabled\n");
3588+
if (WARN_ON(!encoder->base.crtc))
3589+
return;
3590+
3591+
crtc = encoder->base.crtc;
3592+
3593+
WARN(!crtc->enabled, "crtc not enabled\n");
3594+
WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
3595+
WARN(pipe != to_intel_crtc(crtc)->pipe,
3596+
"encoder active on the wrong pipe\n");
3597+
}
3598+
}
3599+
35653600
/* Even simpler default implementation, if there's really no special case to
35663601
* consider. */
35673602
void intel_connector_dpms(struct drm_connector *connector, int mode)
@@ -3582,6 +3617,8 @@ void intel_connector_dpms(struct drm_connector *connector, int mode)
35823617
intel_encoder_dpms(encoder, mode);
35833618
else
35843619
encoder->connectors_active = false;
3620+
3621+
intel_connector_check_state(to_intel_connector(connector));
35853622
}
35863623

35873624
/* Simple connector->get_hw_state implementation for encoders that support only

drivers/gpu/drm/i915/intel_dp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,6 +1367,8 @@ intel_dp_dpms(struct drm_connector *connector, int mode)
13671367
intel_encoder_dpms(&intel_dp->base, mode);
13681368
WARN_ON(intel_dp->dpms_mode != DRM_MODE_DPMS_ON);
13691369
}
1370+
1371+
intel_connector_check_state(to_intel_connector(connector));
13701372
}
13711373

13721374
/*

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ extern void intel_encoder_destroy(struct drm_encoder *encoder);
434434
extern void intel_encoder_dpms(struct intel_encoder *encoder, int mode);
435435
extern void intel_connector_dpms(struct drm_connector *, int mode);
436436
extern bool intel_connector_get_hw_state(struct intel_connector *connector);
437+
extern void intel_connector_check_state(struct intel_connector *);
437438

438439
static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector)
439440
{

drivers/gpu/drm/i915/intel_dvo.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ static void intel_dvo_dpms(struct drm_connector *connector, int mode)
188188

189189
intel_crtc_update_dpms(crtc);
190190
}
191+
192+
intel_connector_check_state(to_intel_connector(connector));
191193
}
192194

193195
static int intel_dvo_mode_valid(struct drm_connector *connector,

drivers/gpu/drm/i915/intel_sdvo.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,8 @@ static void intel_sdvo_dpms(struct drm_connector *connector, int mode)
12741274
intel_sdvo_set_encoder_power_state(intel_sdvo, mode);
12751275
intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output);
12761276
}
1277+
1278+
intel_connector_check_state(to_intel_connector(connector));
12771279
}
12781280

12791281
static int intel_sdvo_mode_valid(struct drm_connector *connector,

0 commit comments

Comments
 (0)