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

Commit 494b5bb0 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 mst stream rendering and notification issues" into msm-4.14

parents 0969f2ef 6b9f8089
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -715,6 +715,8 @@ static void dp_catalog_ctrl_state_ctrl(struct dp_catalog_ctrl *ctrl, u32 state)
	io_data = catalog->io.dp_link;

	dp_write(catalog, io_data, DP_STATE_CTRL, state);
	/* make sure to change the hw state */
	wmb();
}

static void dp_catalog_ctrl_config_ctrl(struct dp_catalog_ctrl *ctrl)
@@ -745,7 +747,7 @@ static void dp_catalog_panel_config_ctrl(struct dp_catalog_panel *panel,
{
	struct dp_catalog_private *catalog;
	struct dp_io_data *io_data;
	u32 strm_reg_off = 0;
	u32 strm_reg_off = 0, mainlink_ctrl;

	if (!panel) {
		pr_err("invalid input\n");
@@ -766,6 +768,18 @@ static void dp_catalog_panel_config_ctrl(struct dp_catalog_panel *panel,
	pr_debug("DP_CONFIGURATION_CTRL=0x%x\n", cfg);

	dp_write(catalog, io_data, DP_CONFIGURATION_CTRL + strm_reg_off, cfg);

	mainlink_ctrl = dp_read(catalog, io_data, DP_MAINLINK_CTRL);

	if (panel->stream_id == DP_STREAM_0)
		io_data = catalog->io.dp_p0;
	else if (panel->stream_id == DP_STREAM_1)
		io_data = catalog->io.dp_p1;

	if (mainlink_ctrl & BIT(8))
		dp_write(catalog, io_data, MMSS_DP_ASYNC_FIFO_CONFIG, 0x01);
	else
		dp_write(catalog, io_data, MMSS_DP_ASYNC_FIFO_CONFIG, 0x00);
}

static void dp_catalog_ctrl_lane_mapping(struct dp_catalog_ctrl *ctrl)
@@ -860,6 +874,7 @@ static void dp_catalog_panel_config_msa(struct dp_catalog_panel *panel,
	struct dp_catalog_private *catalog;
	struct dp_io_data *io_data;
	u32 strm_reg_off = 0;
	u32 mvid_reg_off = 0, nvid_reg_off = 0;

	if (!panel) {
		pr_err("invalid input\n");
@@ -917,12 +932,14 @@ static void dp_catalog_panel_config_msa(struct dp_catalog_panel *panel,

	io_data = catalog->io.dp_link;

	if (panel->stream_id == DP_STREAM_1)
		strm_reg_off = DP1_SOFTWARE_MVID - DP_SOFTWARE_MVID;
	if (panel->stream_id == DP_STREAM_1) {
		mvid_reg_off = DP1_SOFTWARE_MVID - DP_SOFTWARE_MVID;
		nvid_reg_off = DP1_SOFTWARE_NVID - DP_SOFTWARE_NVID;
	}

	pr_debug("mvid=0x%x, nvid=0x%x\n", mvid, nvid);
	dp_write(catalog, io_data, DP_SOFTWARE_MVID + strm_reg_off, mvid);
	dp_write(catalog, io_data, DP_SOFTWARE_NVID + strm_reg_off, nvid);
	dp_write(catalog, io_data, DP_SOFTWARE_MVID + mvid_reg_off, mvid);
	dp_write(catalog, io_data, DP_SOFTWARE_NVID + nvid_reg_off, nvid);
}

static void dp_catalog_ctrl_set_pattern(struct dp_catalog_ctrl *ctrl,
+3 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl, enum dp_stream_id strm)

trigger_idle:
	reinit_completion(&ctrl->idle_comp);
	dp_ctrl_state_ctrl(ctrl, ST_PUSH_IDLE);
	dp_ctrl_state_ctrl(ctrl, state);

	if (!wait_for_completion_timeout(&ctrl->idle_comp,
			idle_pattern_completion_timeout_ms))
@@ -847,6 +847,8 @@ static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl,

	DP_MST_DEBUG("mst stream channel allocation\n");

	panel->hw_cfg(panel);

	ctrl->catalog->channel_alloc(ctrl->catalog,
				panel->stream_id,
				panel->channel_start_slot,
+2 −4
Original line number Diff line number Diff line
@@ -559,8 +559,6 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)
			goto notify;
	}

	dp_display_process_mst_hpd_high(dp);

	edid = dp->panel->edid_ctrl->edid;

	dp->audio_supported = drm_detect_monitor_audio(edid);
@@ -569,6 +567,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)
	dp->panel->handle_sink_request(dp->panel);

	dp->dp_display.max_pclk_khz = dp->parser->max_pclk_khz;

	dp_display_process_mst_hpd_high(dp);
notify:
	dp_display_send_hpd_notification(dp, true);

@@ -1212,8 +1212,6 @@ static int dp_display_stream_enable(struct dp_display_private *dp,
{
	int rc = 0;

	dp_panel->hw_cfg(dp_panel);

	rc = dp->ctrl->stream_on(dp->ctrl, dp_panel);

	if (dp->debug->tpg_state)
+32 −12
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
#include <drm/drm_atomic.h>
#include <drm/drm_crtc.h>
#include <drm/drm_dp_mst_helper.h>
#include <drm/drm_dp_mst_helper.h>

#include "msm_drv.h"
#include "msm_kms.h"
@@ -493,9 +492,10 @@ static int dp_mst_connector_get_modes(struct drm_connector *connector,
	struct dp_display *dp_display = display;
	struct dp_mst_private *mst = dp_display->dp_mst_prv_info;
	struct edid *edid;
	int rc;
	int rc = 0;

	edid = drm_dp_mst_get_edid(connector, &mst->mst_mgr, c_conn->mst_port);
	if (edid)
		rc = dp_display->mst_connector_update_edid(dp_display,
				connector, edid);

@@ -660,6 +660,15 @@ static int dp_mst_connector_config_hdr(struct drm_connector *connector,
	return rc;
}

static void dp_mst_connector_pre_destroy(struct drm_connector *connector,
		void *display)
{
	struct dp_display *dp_display = display;

	DP_MST_DEBUG("enter:\n");
	dp_display->mst_connector_uninstall(dp_display, connector);
	DP_MST_DEBUG("exit:\n");
}

/* DRM MST callbacks */

@@ -677,6 +686,7 @@ dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr,
		.atomic_best_encoder = dp_mst_atomic_best_encoder,
		.atomic_check = dp_mst_connector_atomic_check,
		.config_hdr = dp_mst_connector_config_hdr,
		.pre_destroy = dp_mst_connector_pre_destroy,
	};
	struct dp_mst_private *dp_mst;
	struct drm_device *dev;
@@ -746,17 +756,12 @@ static void dp_mst_register_connector(struct drm_connector *connector)
static void dp_mst_destroy_connector(struct drm_dp_mst_topology_mgr *mgr,
					   struct drm_connector *connector)
{
	struct dp_mst_private *mst = container_of(mgr, struct dp_mst_private,
							mst_mgr);
	struct dp_display *dp_display = mst->dp_display;

	DP_MST_DEBUG("enter\n");

	DP_MST_DEBUG("destroy mst connector:%d\n", connector->base.id);

	dp_display->mst_connector_uninstall(dp_display, connector);

	sde_connector_destroy(connector);
	drm_connector_unregister(connector);
	drm_connector_unreference(connector);
}

static void dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
@@ -764,8 +769,14 @@ static void dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
	struct dp_mst_private *mst = container_of(mgr, struct dp_mst_private,
							mst_mgr);
	struct drm_device *dev = mst->dp_display->drm_dev;
	char event_string[] = "MST_HOTPLUG=1";
	char *envp[2];

	envp[0] = event_string;
	envp[1] = NULL;

	kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp);

	drm_kms_helper_hotplug_event(dev);
	DP_MST_DEBUG("mst hot plug event\n");
}

@@ -788,6 +799,7 @@ static void dp_mst_display_hpd_irq(void *dp_display)
	struct dp_display *dp = dp_display;
	struct dp_mst_private *mst = dp->dp_mst_prv_info;
	u8 esi[14], idx;
	unsigned int esi_res = DP_SINK_COUNT_ESI + 1;
	bool handled;

	rc = drm_dp_dpcd_read(mst->caps.drm_aux, DP_SINK_COUNT_ESI,
@@ -802,6 +814,14 @@ static void dp_mst_display_hpd_irq(void *dp_display)

	rc = drm_dp_mst_hpd_irq(&mst->mst_mgr, esi, &handled);

	/* ack the request */
	if (handled) {
		rc = drm_dp_dpcd_write(mst->caps.drm_aux, esi_res, &esi[1], 3);

		if (rc != 3)
			pr_err("dpcd esi_res failed. rlen=%d\n", rc);
	}

	DP_MST_DEBUG("mst display hpd_irq handled:%d rc:%d\n", handled, rc);
}

+5 −0
Original line number Diff line number Diff line
@@ -1482,6 +1482,11 @@ static void dp_panel_config_misc(struct dp_panel *dp_panel)
static bool dp_panel_use_fixed_nvid(struct dp_panel *dp_panel)
{
	u8 *dpcd = dp_panel->dpcd;
	struct sde_connector *c_conn = to_sde_connector(dp_panel->connector);

	/* use fixe mvid and nvid for MST streams */
	if (c_conn->mst_port)
		return true;

	/*
	 * For better interop experience, used a fixed NVID=0x8000