summaryrefslogtreecommitdiffstats
path: root/include/drm
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-08-06 16:26:21 +1000
committerDave Airlie <airlied@redhat.com>2014-10-13 14:40:53 +1000
commitdfda0df3426483cf5fc7441f23f318edbabecb03 (patch)
tree240106fe1072aeae2917c3c3c5fca83ba4f8a641 /include/drm
parent1e99cfa8de0f0879091e33cd65fd60418d006ad9 (diff)
downloadlinux-stable-dfda0df3426483cf5fc7441f23f318edbabecb03.tar.gz
linux-stable-dfda0df3426483cf5fc7441f23f318edbabecb03.tar.bz2
linux-stable-dfda0df3426483cf5fc7441f23f318edbabecb03.zip
drm/mst: rework payload table allocation to conform better.
The old code has problems with the Dell MST monitors due to some assumptions I made that weren't true. I initially thought the Virtual Channel Payload IDs had to be in the DPCD table in ascending order, however it appears that assumption is bogus. The old code also assumed it was possible to insert a member into the table and it would move other members up, like it does when you remove table entries, however reality has shown this isn't true. So the new code allocates VCPIs separate from entries in the payload tracking table, and when we remove an entry from the DPCD table, I shuffle the tracking payload entries around in the struct. This appears to make VT switch more robust (still not perfect) with an MST enabled Dell monitor. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm')
-rw-r--r--include/drm/drm_dp_mst_helper.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h
index 9b446ada2532..338fc1053835 100644
--- a/include/drm/drm_dp_mst_helper.h
+++ b/include/drm/drm_dp_mst_helper.h
@@ -388,6 +388,7 @@ struct drm_dp_payload {
int payload_state;
int start_slot;
int num_slots;
+ int vcpi;
};
/**
@@ -454,6 +455,7 @@ struct drm_dp_mst_topology_mgr {
struct drm_dp_vcpi **proposed_vcpis;
struct drm_dp_payload *payloads;
unsigned long payload_mask;
+ unsigned long vcpi_mask;
wait_queue_head_t tx_waitq;
struct work_struct work;