Skip to content

Commit

Permalink
Merge tag 'drm-misc-next-fixes-2021-06-18' of git://anongit.freedeskt…
Browse files Browse the repository at this point in the history
…op.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: Dave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/YMxgI1oluBpPyfu6@linux-uq9g.fritz.box
  • Loading branch information
Dave Airlie committed Jun 23, 2021
2 parents bde431f + 24ff3dc commit 61c0cb8
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 27 deletions.
68 changes: 42 additions & 26 deletions drivers/gpu/drm/drm_dp_mst_topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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++) {
Expand All @@ -3403,15 +3384,33 @@ 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
*/
if (vcpi->num_slots) {
port = drm_dp_mst_topology_get_port_validated(
mgr, port);
if (!port) {
mutex_unlock(&mgr->payload_lock);
return -EINVAL;
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;
}
Expand Down Expand Up @@ -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++) {
Expand All @@ -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]);
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/hyperv/hyperv_drm_modeset.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 61c0cb8

Please sign in to comment.