Skip to content

Commit 61c0cb8

Browse files
committed
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: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/YMxgI1oluBpPyfu6@linux-uq9g.fritz.box
2 parents bde431f + 24ff3dc commit 61c0cb8

2 files changed

Lines changed: 43 additions & 27 deletions

File tree

drivers/gpu/drm/drm_dp_mst_topology.c

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port);
9494
static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port);
9595
static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);
9696

97+
static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
98+
struct drm_dp_mst_branch *branch);
99+
97100
#define DBG_PREFIX "[dp_mst]"
98101

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

25352538
old_ddps = port->ddps;
2536-
old_input = port->input;
25372539
port->input = conn_stat->input_port;
25382540
port->ldps = conn_stat->legacy_device_plug_status;
25392541
port->ddps = conn_stat->displayport_device_plug_status;
@@ -2555,28 +2557,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
25552557
dowork = false;
25562558
}
25572559

2558-
if (!old_input && old_ddps != port->ddps && !port->ddps) {
2559-
for (i = 0; i < mgr->max_payloads; i++) {
2560-
struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
2561-
struct drm_dp_mst_port *port_validated;
2562-
2563-
if (!vcpi)
2564-
continue;
2565-
2566-
port_validated =
2567-
container_of(vcpi, struct drm_dp_mst_port, vcpi);
2568-
port_validated =
2569-
drm_dp_mst_topology_get_port_validated(mgr, port_validated);
2570-
if (!port_validated) {
2571-
mutex_lock(&mgr->payload_lock);
2572-
vcpi->num_slots = 0;
2573-
mutex_unlock(&mgr->payload_lock);
2574-
} else {
2575-
drm_dp_mst_topology_put_port(port_validated);
2576-
}
2577-
}
2578-
}
2579-
25802560
if (port->connector)
25812561
drm_modeset_unlock(&mgr->base.lock);
25822562
else if (create_connector)
@@ -3389,6 +3369,7 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
33893369
struct drm_dp_mst_port *port;
33903370
int i, j;
33913371
int cur_slots = 1;
3372+
bool skip;
33923373

33933374
mutex_lock(&mgr->payload_lock);
33943375
for (i = 0; i < mgr->max_payloads; i++) {
@@ -3403,15 +3384,33 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
34033384
port = container_of(vcpi, struct drm_dp_mst_port,
34043385
vcpi);
34053386

3387+
mutex_lock(&mgr->lock);
3388+
skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
3389+
mutex_unlock(&mgr->lock);
3390+
3391+
if (skip) {
3392+
drm_dbg_kms(mgr->dev,
3393+
"Virtual channel %d is not in current topology\n",
3394+
i);
3395+
continue;
3396+
}
34063397
/* Validated ports don't matter if we're releasing
34073398
* VCPI
34083399
*/
34093400
if (vcpi->num_slots) {
34103401
port = drm_dp_mst_topology_get_port_validated(
34113402
mgr, port);
34123403
if (!port) {
3413-
mutex_unlock(&mgr->payload_lock);
3414-
return -EINVAL;
3404+
if (vcpi->num_slots == payload->num_slots) {
3405+
cur_slots += vcpi->num_slots;
3406+
payload->start_slot = req_payload.start_slot;
3407+
continue;
3408+
} else {
3409+
drm_dbg_kms(mgr->dev,
3410+
"Fail:set payload to invalid sink");
3411+
mutex_unlock(&mgr->payload_lock);
3412+
return -EINVAL;
3413+
}
34153414
}
34163415
put_port = true;
34173416
}
@@ -3495,6 +3494,7 @@ int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr)
34953494
struct drm_dp_mst_port *port;
34963495
int i;
34973496
int ret = 0;
3497+
bool skip;
34983498

34993499
mutex_lock(&mgr->payload_lock);
35003500
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)
35043504

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

3507+
mutex_lock(&mgr->lock);
3508+
skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
3509+
mutex_unlock(&mgr->lock);
3510+
3511+
if (skip)
3512+
continue;
3513+
35073514
drm_dbg_kms(mgr->dev, "payload %d %d\n", i, mgr->payloads[i].payload_state);
35083515
if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) {
35093516
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);
45904597
void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
45914598
struct drm_dp_mst_port *port)
45924599
{
4600+
bool skip;
4601+
45934602
if (!port->vcpi.vcpi)
45944603
return;
45954604

4605+
mutex_lock(&mgr->lock);
4606+
skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
4607+
mutex_unlock(&mgr->lock);
4608+
4609+
if (skip)
4610+
return;
4611+
45964612
drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
45974613
port->vcpi.num_slots = 0;
45984614
port->vcpi.pbn = 0;

drivers/gpu/drm/hyperv/hyperv_drm_modeset.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ static inline int hyperv_pipe_init(struct hyperv_drm_device *hv)
163163
&hyperv_pipe_funcs,
164164
hyperv_formats,
165165
ARRAY_SIZE(hyperv_formats),
166-
NULL,
166+
hyperv_modifiers,
167167
&hv->connector);
168168
if (ret)
169169
return ret;

0 commit comments

Comments
 (0)