drm: Validate encoder->possible_crtcs
WARN if the encoder possible_crtcs is effectively empty or contains bits for non-existing crtcs. v2: Move to drm_mode_config_validate() (Daniel) Make the docs say we WARN when this is wrong (Daniel) Extract full_crtc_mask() Cc: Thomas Zimmermann <tzimmermann@suse.de> Cc: Daniel Vetter <daniel@ffwll.ch> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200211162208.16224-7-ville.syrjala@linux.intel.com Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
74d2aacbe8
commit
0df1082374
|
@ -581,6 +581,29 @@ static void validate_encoder_possible_clones(struct drm_encoder *encoder)
|
|||
encoder->possible_clones, encoder_mask);
|
||||
}
|
||||
|
||||
static u32 full_crtc_mask(struct drm_device *dev)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
u32 crtc_mask = 0;
|
||||
|
||||
drm_for_each_crtc(crtc, dev)
|
||||
crtc_mask |= drm_crtc_mask(crtc);
|
||||
|
||||
return crtc_mask;
|
||||
}
|
||||
|
||||
static void validate_encoder_possible_crtcs(struct drm_encoder *encoder)
|
||||
{
|
||||
u32 crtc_mask = full_crtc_mask(encoder->dev);
|
||||
|
||||
WARN((encoder->possible_crtcs & crtc_mask) == 0 ||
|
||||
(encoder->possible_crtcs & ~crtc_mask) != 0,
|
||||
"Bogus possible_crtcs: "
|
||||
"[ENCODER:%d:%s] possible_crtcs=0x%x (full crtc mask=0x%x)\n",
|
||||
encoder->base.id, encoder->name,
|
||||
encoder->possible_crtcs, crtc_mask);
|
||||
}
|
||||
|
||||
void drm_mode_config_validate(struct drm_device *dev)
|
||||
{
|
||||
struct drm_encoder *encoder;
|
||||
|
@ -588,6 +611,8 @@ void drm_mode_config_validate(struct drm_device *dev)
|
|||
drm_for_each_encoder(encoder, dev)
|
||||
fixup_encoder_possible_clones(encoder);
|
||||
|
||||
drm_for_each_encoder(encoder, dev)
|
||||
drm_for_each_encoder(encoder, dev) {
|
||||
validate_encoder_possible_clones(encoder);
|
||||
validate_encoder_possible_crtcs(encoder);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ struct drm_encoder {
|
|||
* the bits for all &drm_crtc objects this encoder can be connected to
|
||||
* before calling drm_dev_register().
|
||||
*
|
||||
* In reality almost every driver gets this wrong.
|
||||
* You will get a WARN if you get this wrong in the driver.
|
||||
*
|
||||
* Note that since CRTC objects can't be hotplugged the assigned indices
|
||||
* are stable and hence known before registering all objects.
|
||||
|
|
Loading…
Reference in New Issue