Message ID | 000452fddedbaf7f473ac25d4dde2502e60b8e39.1652097712.git.jani.nikula@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/edid: introduce struct drm_edid | expand |
LGTM. Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> Regards, Ankit On 5/9/2022 5:33 PM, Jani Nikula wrote: > We'll need to propagate drm_edid everywhere. This is a clunky start, but > a start nonetheless. We'll eventually convert all of the EDID parsing to > struct drm_edid. > > Initially, we'll just create the struct drm_edid in stack. This will be > the compat layer for legacy struct edid code. In the future, we'll have > EDID read return drm_edid objects. > > v2: Add legacy init helper. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> > --- > drivers/gpu/drm/drm_edid.c | 30 +++++++++++++++++++++++++++--- > 1 file changed, 27 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index 480fd9fbe412..f48f1f1a1fa7 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -1608,6 +1608,24 @@ static const void *edid_extension_block_data(const struct edid *edid, int index) > return edid_block_data(edid, index + 1); > } > > +/* > + * Initializer helper for legacy interfaces, where we have no choice but to > + * trust edid size. Not for general purpose use. > + */ > +static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid, > + const struct edid *edid) > +{ > + if (!edid) > + return NULL; > + > + memset(drm_edid, 0, sizeof(*drm_edid)); > + > + drm_edid->edid = edid; > + drm_edid->size = edid_size(edid); > + > + return drm_edid; > +} > + > /* > * EDID base and extension block iterator. > * > @@ -5814,17 +5832,20 @@ static int add_displayid_detailed_modes(struct drm_connector *connector, > } > > static int drm_edid_connector_update(struct drm_connector *connector, > - const struct edid *edid) > + const struct drm_edid *drm_edid) > { > + const struct edid *edid; > int num_modes = 0; > u32 quirks; > > - if (edid == NULL) { > + if (!drm_edid) { > drm_reset_display_info(connector); > clear_eld(connector); > return 0; > } > > + edid = drm_edid->edid; > + > /* > * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks. > * To avoid multiple parsing of same block, lets parse that map > @@ -5890,13 +5911,16 @@ static int drm_edid_connector_update(struct drm_connector *connector, > */ > int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) > { > + struct drm_edid drm_edid; > + > if (edid && !drm_edid_is_valid(edid)) { > drm_warn(connector->dev, "%s: EDID invalid.\n", > connector->name); > edid = NULL; > } > > - return drm_edid_connector_update(connector, edid); > + return drm_edid_connector_update(connector, > + drm_edid_legacy_init(&drm_edid, edid)); > } > EXPORT_SYMBOL(drm_add_edid_modes); >
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 480fd9fbe412..f48f1f1a1fa7 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1608,6 +1608,24 @@ static const void *edid_extension_block_data(const struct edid *edid, int index) return edid_block_data(edid, index + 1); } +/* + * Initializer helper for legacy interfaces, where we have no choice but to + * trust edid size. Not for general purpose use. + */ +static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid, + const struct edid *edid) +{ + if (!edid) + return NULL; + + memset(drm_edid, 0, sizeof(*drm_edid)); + + drm_edid->edid = edid; + drm_edid->size = edid_size(edid); + + return drm_edid; +} + /* * EDID base and extension block iterator. * @@ -5814,17 +5832,20 @@ static int add_displayid_detailed_modes(struct drm_connector *connector, } static int drm_edid_connector_update(struct drm_connector *connector, - const struct edid *edid) + const struct drm_edid *drm_edid) { + const struct edid *edid; int num_modes = 0; u32 quirks; - if (edid == NULL) { + if (!drm_edid) { drm_reset_display_info(connector); clear_eld(connector); return 0; } + edid = drm_edid->edid; + /* * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks. * To avoid multiple parsing of same block, lets parse that map @@ -5890,13 +5911,16 @@ static int drm_edid_connector_update(struct drm_connector *connector, */ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) { + struct drm_edid drm_edid; + if (edid && !drm_edid_is_valid(edid)) { drm_warn(connector->dev, "%s: EDID invalid.\n", connector->name); edid = NULL; } - return drm_edid_connector_update(connector, edid); + return drm_edid_connector_update(connector, + drm_edid_legacy_init(&drm_edid, edid)); } EXPORT_SYMBOL(drm_add_edid_modes);
We'll need to propagate drm_edid everywhere. This is a clunky start, but a start nonetheless. We'll eventually convert all of the EDID parsing to struct drm_edid. Initially, we'll just create the struct drm_edid in stack. This will be the compat layer for legacy struct edid code. In the future, we'll have EDID read return drm_edid objects. v2: Add legacy init helper. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/drm_edid.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)