mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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
This commit is contained in:
@@ -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,8 +3401,16 @@ 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) {
|
||||
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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user