mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 22:02:02 +00:00
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
2 changed files with 27 additions and 2 deletions
|
@ -581,6 +581,29 @@ static void validate_encoder_possible_clones(struct drm_encoder *encoder)
|
||||||
encoder->possible_clones, encoder_mask);
|
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)
|
void drm_mode_config_validate(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_encoder *encoder;
|
struct drm_encoder *encoder;
|
||||||
|
@ -588,6 +611,8 @@ void drm_mode_config_validate(struct drm_device *dev)
|
||||||
drm_for_each_encoder(encoder, dev)
|
drm_for_each_encoder(encoder, dev)
|
||||||
fixup_encoder_possible_clones(encoder);
|
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_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
|
* the bits for all &drm_crtc objects this encoder can be connected to
|
||||||
* before calling drm_dev_register().
|
* 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
|
* Note that since CRTC objects can't be hotplugged the assigned indices
|
||||||
* are stable and hence known before registering all objects.
|
* are stable and hence known before registering all objects.
|
||||||
|
|
Loading…
Reference in a new issue