Commit 5631f6a0 authored by Jani Nikula's avatar Jani Nikula Committed by Dmitry Osipenko
Browse files

drm/displayid: return struct displayid_header from validate_displayid()



Avoid figuring out the header pointer multiple times.

Cc: Iaroslav Boliukin <iam@lach.pw>
Cc: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Tested-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
Reviewed-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/e840c744d165608a41db5a5e2bd4b0205783c697.1676580180.git.jani.nikula@intel.com
parent 5bacecc3
Loading
Loading
Loading
Loading
+8 −9
Original line number Original line Diff line number Diff line
@@ -20,7 +20,8 @@ displayid_get_header(const u8 *displayid, int length, int index)
	return base;
	return base;
}
}


static int validate_displayid(const u8 *displayid, int length, int idx)
static const struct displayid_header *
validate_displayid(const u8 *displayid, int length, int idx)
{
{
	int i, dispid_length;
	int i, dispid_length;
	u8 csum = 0;
	u8 csum = 0;
@@ -28,7 +29,7 @@ static int validate_displayid(const u8 *displayid, int length, int idx)


	base = displayid_get_header(displayid, length, idx);
	base = displayid_get_header(displayid, length, idx);
	if (IS_ERR(base))
	if (IS_ERR(base))
		return PTR_ERR(base);
		return base;


	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
		      base->rev, base->bytes, base->prod_id, base->ext_count);
		      base->rev, base->bytes, base->prod_id, base->ext_count);
@@ -36,16 +37,16 @@ static int validate_displayid(const u8 *displayid, int length, int idx)
	/* +1 for DispID checksum */
	/* +1 for DispID checksum */
	dispid_length = sizeof(*base) + base->bytes + 1;
	dispid_length = sizeof(*base) + base->bytes + 1;
	if (dispid_length > length - idx)
	if (dispid_length > length - idx)
		return -EINVAL;
		return ERR_PTR(-EINVAL);


	for (i = 0; i < dispid_length; i++)
	for (i = 0; i < dispid_length; i++)
		csum += displayid[idx + i];
		csum += displayid[idx + i];
	if (csum) {
	if (csum) {
		DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum);
		DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum);
		return -EINVAL;
		return ERR_PTR(-EINVAL);
	}
	}


	return 0;
	return base;
}
}


static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid,
static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid,
@@ -54,7 +55,6 @@ static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid,
{
{
	const u8 *displayid = drm_find_edid_extension(drm_edid, DISPLAYID_EXT, ext_index);
	const u8 *displayid = drm_find_edid_extension(drm_edid, DISPLAYID_EXT, ext_index);
	const struct displayid_header *base;
	const struct displayid_header *base;
	int ret;


	if (!displayid)
	if (!displayid)
		return NULL;
		return NULL;
@@ -63,11 +63,10 @@ static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid,
	*length = EDID_LENGTH - 1;
	*length = EDID_LENGTH - 1;
	*idx = 1;
	*idx = 1;


	ret = validate_displayid(displayid, *length, *idx);
	base = validate_displayid(displayid, *length, *idx);
	if (ret)
	if (IS_ERR(base))
		return NULL;
		return NULL;


	base = (const struct displayid_header *)&displayid[*idx];
	*length = *idx + sizeof(*base) + base->bytes;
	*length = *idx + sizeof(*base) + base->bytes;


	return displayid;
	return displayid;