@@ -78,6 +78,34 @@ static void fixup_possible_clones(struct drm_device *dev)
encoder->possible_clones |= drm_encoder_mask(encoder);
}
+static void validate_possible_clones(struct drm_encoder *encoder)
+{
+ struct drm_device *dev = encoder->dev;
+ struct drm_encoder *other;
+ u32 encoder_mask = 0;
+
+ drm_for_each_encoder(other, dev) {
+ encoder_mask |= drm_encoder_mask(other);
+
+ WARN(!(encoder->possible_clones & drm_encoder_mask(other)) !=
+ !(other->possible_clones & drm_encoder_mask(encoder)),
+ "possible_clones mismatch: "
+ "[ENCODER:%d:%s] mask=0x%x possible_clones=0x%x vs. "
+ "[ENCODER:%d:%s] mask=0x%x possible_clones=0x%x\n",
+ encoder->base.id, encoder->name,
+ drm_encoder_mask(encoder), encoder->possible_clones,
+ other->base.id, other->name,
+ drm_encoder_mask(other), other->possible_clones);
+ }
+
+ WARN((encoder->possible_clones & drm_encoder_mask(encoder)) == 0 ||
+ (encoder->possible_clones & ~encoder_mask) != 0,
+ "Bogus possible_clones: "
+ "[ENCODER:%d:%s] possible_clones=0x%x (full encoder mask=0x%x)\n",
+ encoder->base.id, encoder->name,
+ encoder->possible_clones, encoder_mask);
+}
+
int drm_encoder_register_all(struct drm_device *dev)
{
struct drm_encoder *encoder;
@@ -86,6 +114,8 @@ int drm_encoder_register_all(struct drm_device *dev)
fixup_possible_clones(dev);
drm_for_each_encoder(encoder, dev) {
+ validate_possible_clones(encoder);
+
if (encoder->funcs->late_register)
ret = encoder->funcs->late_register(encoder);
if (ret)