Commit 61c0cb8a authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-misc-next-fixes-2021-06-18' of...

Merge tag 'drm-misc-next-fixes-2021-06-18' of git://anongit.freedesktop.org/drm/drm-misc

 into drm-next

Short summary of fixes pull:

 * hyperv: advertise the correct formatmodifiers for its primary plane
 * dp_mst: VCPI fixes to make it work with StarTech hub
 * dp_mst: Fix build error

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/YMxgI1oluBpPyfu6@linux-uq9g.fritz.box
parents bde431fb 24ff3dc1
Loading
Loading
Loading
Loading
+42 −26
Original line number Diff line number Diff line
@@ -94,6 +94,9 @@ static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port);
static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port);
static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);

static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
						 struct drm_dp_mst_branch *branch);

#define DBG_PREFIX "[dp_mst]"

#define DP_STR(x) [DP_ ## x] = #x
@@ -2501,7 +2504,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
{
	struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
	struct drm_dp_mst_port *port;
	int old_ddps, old_input, ret, i;
	int old_ddps, ret;
	u8 new_pdt;
	bool new_mcs;
	bool dowork = false, create_connector = false;
@@ -2533,7 +2536,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
	}

	old_ddps = port->ddps;
	old_input = port->input;
	port->input = conn_stat->input_port;
	port->ldps = conn_stat->legacy_device_plug_status;
	port->ddps = conn_stat->displayport_device_plug_status;
@@ -2555,28 +2557,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
		dowork = false;
	}

	if (!old_input && old_ddps != port->ddps && !port->ddps) {
		for (i = 0; i < mgr->max_payloads; i++) {
			struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
			struct drm_dp_mst_port *port_validated;

			if (!vcpi)
				continue;

			port_validated =
				container_of(vcpi, struct drm_dp_mst_port, vcpi);
			port_validated =
				drm_dp_mst_topology_get_port_validated(mgr, port_validated);
			if (!port_validated) {
				mutex_lock(&mgr->payload_lock);
				vcpi->num_slots = 0;
				mutex_unlock(&mgr->payload_lock);
			} else {
				drm_dp_mst_topology_put_port(port_validated);
			}
		}
	}

	if (port->connector)
		drm_modeset_unlock(&mgr->base.lock);
	else if (create_connector)
@@ -3389,6 +3369,7 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
	struct drm_dp_mst_port *port;
	int i, j;
	int cur_slots = 1;
	bool skip;

	mutex_lock(&mgr->payload_lock);
	for (i = 0; i < mgr->max_payloads; i++) {
@@ -3403,6 +3384,16 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
			port = container_of(vcpi, struct drm_dp_mst_port,
					    vcpi);

			mutex_lock(&mgr->lock);
			skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
			mutex_unlock(&mgr->lock);

			if (skip) {
				drm_dbg_kms(mgr->dev,
					    "Virtual channel %d is not in current topology\n",
					    i);
				continue;
			}
			/* Validated ports don't matter if we're releasing
			 * VCPI
			 */
@@ -3410,9 +3401,17 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
				port = drm_dp_mst_topology_get_port_validated(
				    mgr, port);
				if (!port) {
					if (vcpi->num_slots == payload->num_slots) {
						cur_slots += vcpi->num_slots;
						payload->start_slot = req_payload.start_slot;
						continue;
					} else {
						drm_dbg_kms(mgr->dev,
							    "Fail:set payload to invalid sink");
						mutex_unlock(&mgr->payload_lock);
						return -EINVAL;
					}
				}
				put_port = true;
			}

@@ -3495,6 +3494,7 @@ int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr)
	struct drm_dp_mst_port *port;
	int i;
	int ret = 0;
	bool skip;

	mutex_lock(&mgr->payload_lock);
	for (i = 0; i < mgr->max_payloads; i++) {
@@ -3504,6 +3504,13 @@ int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr)

		port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi);

		mutex_lock(&mgr->lock);
		skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
		mutex_unlock(&mgr->lock);

		if (skip)
			continue;

		drm_dbg_kms(mgr->dev, "payload %d %d\n", i, mgr->payloads[i].payload_state);
		if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) {
			ret = drm_dp_create_payload_step2(mgr, port, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]);
@@ -4590,9 +4597,18 @@ EXPORT_SYMBOL(drm_dp_mst_reset_vcpi_slots);
void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
				struct drm_dp_mst_port *port)
{
	bool skip;

	if (!port->vcpi.vcpi)
		return;

	mutex_lock(&mgr->lock);
	skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
	mutex_unlock(&mgr->lock);

	if (skip)
		return;

	drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
	port->vcpi.num_slots = 0;
	port->vcpi.pbn = 0;
+1 −1
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ static inline int hyperv_pipe_init(struct hyperv_drm_device *hv)
					   &hyperv_pipe_funcs,
					   hyperv_formats,
					   ARRAY_SIZE(hyperv_formats),
					   NULL,
					   hyperv_modifiers,
					   &hv->connector);
	if (ret)
		return ret;