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

Commit 71580a00 authored by Narender Ankam's avatar Narender Ankam Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/dp: check for VSC SDP support



Support YUV420 formats over DisplayPort only if downstream
DP device supports pxl encoding and colorimetry format
indication by way of VSC SDP.

Change-Id: I714fc743ac32540a1cbd8cdb717448715d14c3ad
Signed-off-by: default avatarNarender Ankam <nankam@codeaurora.org>
Signed-off-by: default avatarChirag Khurana <ckhurana@codeaurora.org>
parent 96d70542
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -1457,6 +1457,20 @@ static int dp_display_get_display_type(struct dp_display *dp_display,
	return 0;
}

static bool dp_display_vsc_sdp_supported(struct dp_display *dp_display)
{
	struct dp_display_private *dp;

	if (!dp_display) {
		pr_err("invalid input\n");
		return 0;
	}

	dp = container_of(dp_display, struct dp_display_private, dp_display);

	return dp->panel->vsc_sdp_supported(dp->panel);
}

static int dp_display_create_workqueue(struct dp_display_private *dp)
{
	dp->wq = create_singlethread_workqueue("drm_dp");
@@ -1522,6 +1536,7 @@ static int dp_display_probe(struct platform_device *pdev)
	g_dp_display->post_init     = dp_display_post_init;
	g_dp_display->config_hdr    = dp_display_config_hdr;
	g_dp_display->get_display_type = dp_display_get_display_type;
	g_dp_display->vsc_sdp_supported = dp_display_vsc_sdp_supported;

	rc = component_add(&pdev->dev, &dp_display_comp_ops);
	if (rc) {
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ struct dp_display {
	void (*post_init)(struct dp_display *dp_display);
	int (*get_display_type)(struct dp_display *dp_display,
			const char **display_type);
	bool (*vsc_sdp_supported)(struct dp_display *dp_display);
};

int dp_display_get_num_of_displays(void);
+6 −0
Original line number Diff line number Diff line
@@ -690,6 +690,12 @@ enum drm_mode_status dp_connector_mode_valid(struct drm_connector *connector,
		mode->flags &= ~DRM_MODE_FLAG_SUPPORTS_YUV422;
	}

	if (!dp_disp->vsc_sdp_supported(dp_disp))
		mode->flags &= ~DRM_MODE_FLAG_SUPPORTS_YUV420;

	if (!(mode->flags & SDE_DRM_MODE_FLAG_FMT_MASK))
		return MODE_BAD;

	if ((mode->flags & SDE_DRM_MODE_FLAG_FMT_MASK) ==
			DRM_MODE_FLAG_SUPPORTS_YUV420) {
		rate_ratio = YUV420_24BPP_TMDS_CHAR_RATE_RATIO;
+15 −0
Original line number Diff line number Diff line
@@ -798,6 +798,20 @@ static u32 dp_panel_get_min_req_link_rate(struct dp_panel *dp_panel)
	return min_link_rate_khz;
}

static bool dp_panel_vsc_sdp_supported(struct dp_panel *dp_panel)
{
	struct dp_panel_private *panel;

	if (!dp_panel) {
		pr_err("invalid input\n");
		return false;
	}

	panel = container_of(dp_panel, struct dp_panel_private, dp_panel);

	return panel->major >= 1 && panel->minor >= 4 && panel->vsc_supported;
}

static bool dp_panel_hdr_supported(struct dp_panel *dp_panel)
{
	struct dp_panel_private *panel;
@@ -949,6 +963,7 @@ struct dp_panel *dp_panel_get(struct dp_panel_in *in)
	dp_panel->spd_config = dp_panel_spd_config;
	dp_panel->setup_hdr = dp_panel_setup_hdr;
	dp_panel->hdr_supported = dp_panel_hdr_supported;
	dp_panel->vsc_sdp_supported = dp_panel_vsc_sdp_supported;
	dp_panel->get_pixel_clk = dp_panel_get_pixel_clk;

	dp_panel_edid_register(panel);
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ struct dp_panel {
	void (*tpg_config)(struct dp_panel *dp_panel, bool enable);
	int (*spd_config)(struct dp_panel *dp_panel);
	bool (*hdr_supported)(struct dp_panel *dp_panel);
	bool (*vsc_sdp_supported)(struct dp_panel *dp_panel);
	u32 (*get_pixel_clk)(struct dp_panel *dp_panel);
};