Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2bbcbd7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/dp: fix mode validation logic"

parents ab3dd7b6 59510405
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ static ssize_t dp_debug_write_edid_modes(struct file *file,
	struct dp_debug_private *debug = file->private_data;
	char buf[SZ_32];
	size_t len = 0;
	int hdisplay = 0, vdisplay = 0, vrefresh = 0;
	int hdisplay = 0, vdisplay = 0, vrefresh = 0, aspect_ratio;

	if (!debug)
		return -ENODEV;
@@ -89,7 +89,8 @@ static ssize_t dp_debug_write_edid_modes(struct file *file,

	buf[len] = '\0';

	if (sscanf(buf, "%d %d %d", &hdisplay, &vdisplay, &vrefresh) != 3)
	if (sscanf(buf, "%d %d %d %d", &hdisplay, &vdisplay, &vrefresh,
				&aspect_ratio) != 4)
		goto clear;

	if (!hdisplay || !vdisplay || !vrefresh)
@@ -99,6 +100,7 @@ static ssize_t dp_debug_write_edid_modes(struct file *file,
	debug->dp_debug.hdisplay = hdisplay;
	debug->dp_debug.vdisplay = vdisplay;
	debug->dp_debug.vrefresh = vrefresh;
	debug->dp_debug.aspect_ratio = aspect_ratio;
	goto end;
clear:
	pr_debug("clearing debug modes\n");
@@ -198,11 +200,11 @@ static ssize_t dp_debug_read_edid_modes(struct file *file,

	list_for_each_entry(mode, &connector->modes, head) {
		len += snprintf(buf + len, SZ_4K - len,
		"%s %d %d %d %d %d %d %d %d %d 0x%x\n",
		mode->name, mode->vrefresh, mode->hdisplay,
		mode->hsync_start, mode->hsync_end, mode->htotal,
		mode->vdisplay, mode->vsync_start, mode->vsync_end,
		mode->vtotal, mode->flags);
		"%s %d %d %d %d %d %d %d %d %d %d 0x%x\n",
		mode->name, mode->vrefresh, mode->picture_aspect_ratio,
		mode->hdisplay, mode->hsync_start, mode->hsync_end,
		mode->htotal, mode->vdisplay, mode->vsync_start,
		mode->vsync_end, mode->vtotal, mode->flags);
	}

	if (copy_to_user(user_buff, buf, len)) {
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
 */
struct dp_debug {
	bool debug_en;
	int aspect_ratio;
	int vdisplay;
	int hdisplay;
	int vrefresh;
+14 −20
Original line number Diff line number Diff line
@@ -514,25 +514,19 @@ enum drm_mode_status dp_connector_mode_valid(struct drm_connector *connector,
	dp_disp = display;
	debug = dp_disp->get_debug(dp_disp);

	if (debug->debug_en) {
		if (mode->hdisplay == debug->hdisplay &&
				mode->vdisplay == debug->vdisplay &&
				mode->vrefresh == debug->vrefresh &&
				mode->clock <= dp_disp->max_pclk_khz)
			return MODE_OK;
		else
			return MODE_ERROR;
	} else {
		if (mode->vrefresh == 0) {
			int vrefresh = (mode->clock * 1000) /
				(mode->vtotal * mode->htotal);
			if (vrefresh > 60)
	mode->vrefresh = drm_mode_vrefresh(mode);

	if (mode->vrefresh > 60)
		return MODE_BAD;
		}

	if (mode->clock > dp_disp->max_pclk_khz)
		return MODE_BAD;
		else

	if (debug->debug_en && (mode->hdisplay != debug->hdisplay ||
			mode->vdisplay != debug->vdisplay ||
			mode->vrefresh != debug->vrefresh ||
			mode->picture_aspect_ratio != debug->aspect_ratio))
		return MODE_BAD;

	return MODE_OK;
}
}