1. 04 2月, 2021 1 次提交
  2. 18 11月, 2020 1 次提交
  3. 11 11月, 2020 1 次提交
  4. 23 9月, 2020 1 次提交
  5. 01 9月, 2020 3 次提交
  6. 17 8月, 2020 1 次提交
  7. 05 8月, 2020 1 次提交
  8. 02 7月, 2020 1 次提交
  9. 11 6月, 2020 5 次提交
    • I
      drm/dp_mst: Fix flushing the delayed port/mstb destroy work · 72822c3b
      Imre Deak 提交于
      Atm, a pending delayed destroy work during module removal will be
      canceled, leaving behind MST ports, mstbs. Fix this by using a dedicated
      workqueue which will be drained of requeued items as well when
      destroying it.
      
      v2:
      - Check if wq is NULL before calling destroy_workqueue().
      
      Cc: Lyude Paul <lyude@redhat.com>
      Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Reviewed-by: NStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Reviewed-by: NLyude Paul <lyude@redhat.com>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200610134704.25270-1-imre.deak@intel.com
      72822c3b
    • I
      drm/dp_mst: Fix the DDC I2C device registration of an MST port · d8bd15b3
      Imre Deak 提交于
      During the initial MST probing an MST port's I2C device will be
      registered using the kdev of the DRM device as a parent. Later after MST
      Connection Status Notifications this I2C device will be re-registered
      with the kdev of the port's connector. This will also move
      inconsistently the I2C device's sysfs entry from the DRM device's sysfs
      dir to the connector's dir.
      
      Fix the above by keeping the DRM kdev as the parent of the I2C device.
      
      Ideally the connector's kdev would be used as a parent, similarly to
      non-MST connectors, however that needs some more refactoring to ensure
      the connector's kdev is already available early enough. So keep the
      existing (initial) behavior for now.
      
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Reviewed-by: NLyude Paul <lyude@redhat.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200607212522.16935-2-imre.deak@intel.com
      d8bd15b3
    • I
      drm/dp_mst: Fix the DDC I2C device unregistration of an MST port · 7d115076
      Imre Deak 提交于
      The WARN below triggers during the removal of an MST port. The problem
      is that the parent device's (the connector's kdev) sysfs directory is
      removed recursively when the connector is unregistered (even though the
      I2C device holds a reference on the parent device). To fix this set
      first the Peer Device Type to none which will remove the I2C device.
      
      Note that atm, inconsistently, the parent of the I2C device is initially set to
      the DRM kdev and after a Connection Status Notification the parent may be reset
      to be the connector's kdev. This problem is addressed by the next patch.
      
      [ 4462.989299] ------------[ cut here ]------------
      [ 4463.014940] sysfs group 'power' not found for kobject 'i2c-24'
      [ 4463.034664] WARNING: CPU: 0 PID: 970 at fs/sysfs/group.c:281 sysfs_remove_group+0x71/0x80
      [ 4463.044357] Modules linked in: snd_hda_intel i915 drm_kms_helper(O) drm netconsole snd_hda_codec_hdmi mei_hdcp x86_pkg_temp_thermal coretemp crct10dif_pclmul snd_intel_dspcf
      g crc32_pclmul snd_hda_codec snd_hwdep ghash_clmulni_intel snd_hda_core asix usbnet kvm_intel mii i2c_algo_bit snd_pcm syscopyarea sysfillrect e1000e sysimgblt fb_sys_fops prim
      e_numbers ptp pps_core i2c_i801 r8169 mei_me realtek mei [last unloaded: drm]
      [ 4463.044399] CPU: 0 PID: 970 Comm: kworker/0:2 Tainted: G           O      5.7.0+ #172
      [ 4463.044402] Hardware name: Intel Corporation Tiger Lake Client Platform/TigerLake U DDR4 SODIMM RVP
      [ 4463.044423] Workqueue: events drm_dp_delayed_destroy_work [drm_kms_helper]
      [ 4463.044428] RIP: 0010:sysfs_remove_group+0x71/0x80
      [ 4463.044431] Code: 48 89 df 5b 5d 41 5c e9 cd b6 ff ff 48 89 df e8 95 b4 ff ff eb cb 49 8b 14 24 48 8b 75 00 48 c7 c7 20 0f 3f 82 e8 9f c5 d7 ff <0f> 0b 5b 5d 41 5c c3 0f 1f
      84 00 00 00 00 00 48 85 f6 74 31 41 54
      [ 4463.044433] RSP: 0018:ffffc900018bfbf0 EFLAGS: 00010282
      [ 4463.044436] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
      [ 4463.044439] RDX: 0000000080000001 RSI: ffff88849e828f38 RDI: 00000000ffffffff
      [ 4463.052970] [drm:drm_atomic_get_plane_state [drm]] Added [PLANE:100:plane 2B] 00000000c2160caa state to 00000000d172564a
      [ 4463.070533] RBP: ffffffff820cea20 R08: ffff88847f4b8958 R09: 0000000000000000
      [ 4463.070535] R10: 0000000000000000 R11: 0000000000000000 R12: ffff88848a725018
      [ 4463.070537] R13: 0000000000000000 R14: ffffffff827090e0 R15: 0000000000000002
      [ 4463.070539] FS:  0000000000000000(0000) GS:ffff88849e800000(0000) knlGS:0000000000000000
      [ 4463.070541] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [ 4463.070543] CR2: 00007fdf8a756538 CR3: 0000000489684001 CR4: 0000000000760ef0
      [ 4463.070545] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [ 4463.070547] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [ 4463.070549] PKRU: 55555554
      [ 4463.070551] Call Trace:
      [ 4463.070560]  device_del+0x84/0x400
      [ 4463.070571]  cdev_device_del+0x10/0x30
      [ 4463.070578]  put_i2c_dev+0x69/0x80
      [ 4463.070584]  i2cdev_detach_adapter+0x2e/0x60
      [ 4463.070591]  notifier_call_chain+0x34/0x90
      [ 4463.070599]  blocking_notifier_call_chain+0x3f/0x60
      [ 4463.070606]  device_del+0x7c/0x400
      [ 4463.087817]  ? lockdep_init_map_waits+0x57/0x210
      [ 4463.087825]  device_unregister+0x11/0x60
      [ 4463.087829]  i2c_del_adapter+0x249/0x310
      [ 4463.087846]  drm_dp_port_set_pdt+0x6b/0x2c0 [drm_kms_helper]
      [ 4463.087862]  drm_dp_delayed_destroy_work+0x2af/0x350 [drm_kms_helper]
      [ 4463.087876]  process_one_work+0x268/0x600
      [ 4463.105438]  ? __schedule+0x30c/0x920
      [ 4463.105451]  worker_thread+0x37/0x380
      [ 4463.105457]  ? process_one_work+0x600/0x600
      [ 4463.105462]  kthread+0x140/0x160
      [ 4463.105466]  ? kthread_park+0x80/0x80
      [ 4463.105474]  ret_from_fork+0x24/0x50
      
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
      Reviewed-by: NLyude Paul <lyude@redhat.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200607212522.16935-1-imre.deak@intel.com
      7d115076
    • I
      drm/i915/dp_mst: Work around out-of-spec adapters filtering short pulses · 471bdd0d
      Imre Deak 提交于
      Some TypeC -> native DP adapters, at least the Club 3D CAC-1557 adapter,
      incorrectly filter out HPD short pulses with a duration less than
      ~540 usec, leading to MST probe failures.
      
      According to the DP Standard 2.0 section 5.1.4:
      - DP sinks should generate short pulses in the 500 usec -> 1 msec range
      - DP sources should detect short pulses in the 250 usec -> 2 msec range
      
      According to the DP Alt Mode on TypeC Standard section 3.9.2, adapters
      should detect and forward short pulses according to how sources should
      detect them as specified in the DP Standard (250 usec -> 2 msec).
      
      Based on the above filtering out short pulses with a duration less than
      540 usec is incorrect.
      
      To make such adapters work add support for a driver polling on MST
      inerrupt flags, and wire this up in the i915 driver. The sink can clear
      an interrupt it raised after 110 msec if the source doesn't respond, so
      use a 50 msec poll period to avoid missing an interrupt. Polling of the
      MST interrupt flags is explicitly allowed by the DP Standard.
      
      This fixes MST probe failures I saw using this adapter and a DELL U2515H
      monitor.
      
      v2:
      - Fix the wait event timeout for the no-poll case.
      v3 (Ville):
      - Fix the short pulse duration limits in the commit log prescribed by the
        DP Standard.
      - Add code comment explaining why/how polling is used.
      - Factor out a helper to schedule the port's hpd irq handler and move it
        to the rest of hotplug handlers.
      - Document the new MST callback.
      - s/update_hpd_irq_state/poll_hpd_irq/
      
      Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Reviewed-by: NLyude Paul <lyude@redhat.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200604184500.23730-2-imre.deak@intel.com
      471bdd0d
    • I
  10. 18 5月, 2020 1 次提交
  11. 15 5月, 2020 1 次提交
    • I
      drm/dp_mst: Fix timeout handling of MST down messages · 58c17217
      Imre Deak 提交于
      This fixes the following use-after-free problem in case an MST down
      message times out, while waiting for the response for it:
      
      [  449.022841] [drm:drm_dp_mst_wait_tx_reply.isra.26] timedout msg send 0000000080ba7fa2 2 0
      [  449.022898] ------------[ cut here ]------------
      [  449.022903] list_add corruption. prev->next should be next (ffff88847dae32c0), but was 6b6b6b6b6b6b6b6b. (prev=ffff88847db1c140).
      [  449.022931] WARNING: CPU: 2 PID: 22 at lib/list_debug.c:28 __list_add_valid+0x4d/0x70
      [  449.022935] Modules linked in: asix usbnet mii snd_hda_codec_hdmi mei_hdcp i915 x86_pkg_temp_thermal coretemp crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hwdep e1000e snd_hda_core ptp snd_pcm pps_core mei_me mei intel_lpss_pci prime_numbers
      [  449.022966] CPU: 2 PID: 22 Comm: kworker/2:0 Not tainted 5.7.0-rc3-CI-Patchwork_17536+ #1
      [  449.022970] Hardware name: Intel Corporation Tiger Lake Client Platform/TigerLake U DDR4 SODIMM RVP, BIOS TGLSFWI1.R00.2457.A16.1912270059 12/27/2019
      [  449.022976] Workqueue: events_long drm_dp_mst_link_probe_work
      [  449.022982] RIP: 0010:__list_add_valid+0x4d/0x70
      [  449.022987] Code: c3 48 89 d1 48 c7 c7 f0 e7 32 82 48 89 c2 e8 3a 49 b7 ff 0f 0b 31 c0 c3 48 89 c1 4c 89 c6 48 c7 c7 40 e8 32 82 e8 23 49 b7 ff <0f> 0b 31 c0 c3 48 89 f2 4c 89 c1 48 89 fe 48 c7 c7 90 e8 32 82 e8
      [  449.022991] RSP: 0018:ffffc900001abcb0 EFLAGS: 00010286
      [  449.022995] RAX: 0000000000000000 RBX: ffff88847dae2d58 RCX: 0000000000000001
      [  449.022999] RDX: 0000000080000001 RSI: ffff88849d914978 RDI: 00000000ffffffff
      [  449.023002] RBP: ffff88847dae32c0 R08: ffff88849d914978 R09: 0000000000000000
      [  449.023006] R10: ffffc900001abcb8 R11: 0000000000000000 R12: ffff888490d98400
      [  449.023009] R13: ffff88847dae3230 R14: ffff88847db1c140 R15: ffff888490d98540
      [  449.023013] FS:  0000000000000000(0000) GS:ffff88849ff00000(0000) knlGS:0000000000000000
      [  449.023017] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  449.023021] CR2: 00007fb96fafdc63 CR3: 0000000005610004 CR4: 0000000000760ee0
      [  449.023025] PKRU: 55555554
      [  449.023028] Call Trace:
      [  449.023034]  drm_dp_queue_down_tx+0x59/0x110
      [  449.023041]  ? rcu_read_lock_sched_held+0x4d/0x80
      [  449.023050]  ? kmem_cache_alloc_trace+0x2a6/0x2d0
      [  449.023060]  drm_dp_send_link_address+0x74/0x870
      [  449.023065]  ? __slab_free+0x3e1/0x5c0
      [  449.023071]  ? lockdep_hardirqs_on+0xe0/0x1c0
      [  449.023078]  ? lockdep_hardirqs_on+0xe0/0x1c0
      [  449.023097]  drm_dp_check_and_send_link_address+0x9a/0xc0
      [  449.023106]  drm_dp_mst_link_probe_work+0x9e/0x160
      [  449.023117]  process_one_work+0x268/0x600
      [  449.023124]  ? __schedule+0x307/0x8d0
      [  449.023139]  worker_thread+0x37/0x380
      [  449.023149]  ? process_one_work+0x600/0x600
      [  449.023153]  kthread+0x140/0x160
      [  449.023159]  ? kthread_park+0x80/0x80
      [  449.023169]  ret_from_fork+0x24/0x50
      
      Fixes: d308a881 ("drm/dp_mst: Kill the second sideband tx slot, save the world")
      Cc: Lyude Paul <lyude@redhat.com>
      Cc: Sean Paul <sean@poorly.run>
      Cc: Wayne Lin <Wayne.Lin@amd.com>
      Cc: <stable@vger.kernel.org> # v3.17+
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200513103155.12336-1-imre.deak@intel.com
      58c17217
  12. 28 4月, 2020 3 次提交
    • L
      drm/dp_mst: Kill the second sideband tx slot, save the world · d308a881
      Lyude Paul 提交于
      While we support using both tx slots for sideband transmissions, it
      appears that DisplayPort devices in the field didn't end up doing a very
      good job of supporting it. From section 5.2.1 of the DP 2.0
      specification:
      
        There are MST Sink/Branch devices in the field that do not handle
        interleaved message transactions.
      
        To facilitate message transaction handling by downstream devices, an
        MST Source device shall generate message transactions in an atomic
        manner (i.e., the MST Source device shall not concurrently interleave
        multiple message transactions). Therefore, an MST Source device shall
        clear the Message_Sequence_No value in the Sideband_MSG_Header to 0.
      
      This might come as a bit of a surprise since the vast majority of hubs
      will support using both tx slots even if they don't support interleaved
      message transactions, and we've also been using both tx slots since MST
      was introduced into the kernel.
      
      However, there is one device we've had trouble getting working
      consistently with MST for so long that we actually assumed it was just
      broken: the infamous Dell P2415Qb. Previously this monitor would appear
      to work sometimes, but in most situations would end up timing out
      LINK_ADDRESS messages almost at random until you power cycled the whole
      display. After reading section 5.2.1 in the DP 2.0 spec, some closer
      investigation into this infamous display revealed it was only ever
      timing out on sideband messages in the second TX slot.
      
      Sure enough, avoiding the second TX slot has suddenly made this monitor
      function perfectly for the first time in five years. And since they
      explicitly mention this in the specification, I doubt this is the only
      monitor out there with this issue. This might even explain explain the
      seemingly harmless garbage sideband responses we would occasionally see
      with MST hubs!
      
      So - rewrite our sideband TX handlers to only support one TX slot. In
      order to simplify our sideband handling now that we don't support
      transmitting to multiple MSTBs at once, we also move all state tracking
      for down replies from mstbs to the topology manager.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: ad7f8a1f ("drm/helper: add Displayport multi-stream helper (v0.6)")
      Cc: Sean Paul <sean@poorly.run>
      Cc: "Lin, Wayne" <Wayne.Lin@amd.com>
      Cc: <stable@vger.kernel.org> # v3.17+
      Reviewed-by: NSean Paul <sean@poorly.run>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200424181308.770749-1-lyude@redhat.com
      d308a881
    • P
      drm: Make drm_dp_mst_dsc_aux_for_port() safe for old compilers · 53965dbe
      Paul E. McKenney 提交于
      Older compilers either want two extra pairs of curly braces around the
      initializer for local variable desc, or they want a single pair of curly
      braces with nothing inside.  Because current Linux-kernel practice favors
      the latter, this commit makes it so.
      Suggested-by: NChris Wilson <chris@chris-wilson.co.uk>
      Suggested-by: NJoe Perches <joe@perches.com>
      Suggested-by: NChristoph Hellwig <hch@infradead.org>
      Signed-off-by: NPaul E. McKenney <paulmck@kernel.org>
      53965dbe
    • L
      drm/dp_mst: Fix drm_dp_send_dpcd_write() return code · dbc05ae3
      Lyude Paul 提交于
      drm_dp_mst_wait_tx_reply() returns > 1 if time elapsed in
      wait_event_timeout() before check_txmsg_state(mgr, txmsg) evaluated to
      true. However, we make the mistake of returning this time from
      drm_dp_send_dpcd_write() on success instead of returning the number of
      bytes written - causing spontaneous failures during link probing:
      
      [drm:drm_dp_send_link_address [drm_kms_helper]] *ERROR* GUID check on
      10:01 failed: 3975
      
      Yikes! So, fix this by returning the number of bytes written on success
      instead.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: cb897542 ("drm/dp_mst: Fix W=1 warnings")
      Cc: Benjamin Gaignard <benjamin.gaignard@st.com>
      Cc: Sean Paul <sean@poorly.run>
      Acked-by: NAlex Deucher <alexander.deucher@amd.com>
      Reviewed-by: NSean Paul <sean@poorly.run>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200424190722.775284-1-lyude@redhat.com
      dbc05ae3
  13. 24 4月, 2020 1 次提交
    • L
      Revert "drm/dp_mst: Remove single tx msg restriction." · 973a5909
      Lyude Paul 提交于
      This reverts commit 6bb0942e.
      
      Unfortunately it would appear that the rumors we've heard of sideband
      message interleaving not being very well supported are true. On the
      Lenovo ThinkPad Thunderbolt 3 dock that I have, interleaved messages
      appear to just get dropped:
      
        [drm:drm_dp_mst_wait_tx_reply [drm_kms_helper]] timedout msg send
        00000000571ddfd0 2 1
        [dp_mst] txmsg cur_offset=2 cur_len=2 seqno=1 state=SENT path_msg=1 dst=00
        [dp_mst] 	type=ENUM_PATH_RESOURCES contents:
        [dp_mst] 		port=2
      
      DP descriptor for this hub:
        OUI 90-cc-24 dev-ID SYNA3  HW-rev 1.0 SW-rev 3.12 quirks 0x0008
      
      It would seem like as well that this is a somewhat well known issue in
      the field. From section 5.4.2 of the DisplayPort 2.0 specification:
      
        There are MST Sink/Branch devices in the field that do not handle
        interleaved message transactions.
      
        To facilitate message transaction handling by downstream devices, an
        MST Source device shall generate message transactions in an atomic
        manner (i.e., the MST Source device shall not concurrently interleave
        multiple message transactions). Therefore, an MST Source device shall
        clear the Message_Sequence_No value in the Sideband_MSG_Header to 0.
      
        MST Source devices that support field policy updates by way of
        software should update the policy to forego the generation of
        interleaved message transactions.
      
      This is a bit disappointing, as features like HDCP require that we send
      a sideband request every ~2 seconds for each active stream. However,
      there isn't really anything in the specification that allows us to
      accurately probe for interleaved messages.
      
      If it ends up being that we -really- need this in the future, we might
      be able to whitelist hubs where interleaving is known to work-or maybe
      try some sort of heuristics. But for now, let's just play it safe and
      not use it.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: 6bb0942e ("drm/dp_mst: Remove single tx msg restriction.")
      Cc: Wayne Lin <Wayne.Lin@amd.com>
      Cc: Sean Paul <seanpaul@chromium.org>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200423164225.680178-1-lyude@redhat.comReviewed-by: NSean Paul <sean@poorly.run>
      973a5909
  14. 18 4月, 2020 1 次提交
  15. 10 4月, 2020 4 次提交
  16. 08 4月, 2020 1 次提交
    • L
      drm/dp_mst: Remove drm_dp_mst_has_audio() · 20c22ad3
      Lyude Paul 提交于
      Drive-by fix I noticed the other day - drm_dp_mst_has_audio() only ever
      made sense back when we still had to validate ports before accessing
      them in order to (attempt to) avoid NULL dereferences. Since we have
      proper reference counting that guarantees we always can safely access
      the MST port, there's no use in keeping this function around as all it
      does is validate the port pointer before checking the audio status.
      
      Note - drm_dp_mst_port->has_audio is technically protected by
      drm_device->mode_config.connection_mutex, since it's only ever updated
      from drm_dp_mst_get_edid(). Additionally, we change the declaration for
      port in struct intel_connector to be properly typed, so we can directly
      access it.
      
      Changes since v1:
      * Change type of intel_connector->port in a separate patch - Sean Paul
      
      Cc: "Lee, Shawn C" <shawn.c.lee@intel.com>
      Reviewed-by: NSean Paul <sean@poorly.run>
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200406200646.1263435-2-lyude@redhat.com
      20c22ad3
  17. 07 4月, 2020 2 次提交
    • L
      drm/dp_mst: Don't drop NAKs for down responses · 61272e47
      Lyude Paul 提交于
      It looks like that when we introduced the ability to handle multiple
      down requests at once, we accidentally started dropping NAK replies -
      causing sideband messages which got NAK'd to seemingly timeout and cause
      all sorts of weirdness.
      
      So, fix this by making sure we don't return from
      drm_dp_mst_handle_down_rep() early, but instead treat NAKs like any
      other message.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: fbc821c4 ("drm/mst: Support simultaneous down replies")
      Cc: Wayne Lin <Wayne.Lin@amd.com>
      Cc: Wayne Lin <waynelin@amd.com>
      Cc: Sean Paul <seanpaul@chromium.org>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200403200325.885628-1-lyude@redhat.comReviewed-by: NSean Paul <sean@poorly.run>
      61272e47
    • L
      drm/dp_mst: Fix NULL deref in drm_dp_get_one_sb_msg() · cbfb1b74
      Lyude Paul 提交于
      While we don't need this function to store an mstb anywhere for UP
      requests since we process them asynchronously, we do need to make sure
      that we don't try to write to **mstb for UP requests otherwise we'll
      cause a NULL pointer deref:
      
          RIP: 0010:drm_dp_get_one_sb_msg+0x4b/0x460 [drm_kms_helper]
          Call Trace:
           ? vprintk_emit+0x16a/0x230
           ? drm_dp_mst_hpd_irq+0x133/0x1010 [drm_kms_helper]
           drm_dp_mst_hpd_irq+0x133/0x1010 [drm_kms_helper]
           ? __drm_dbg+0x87/0x90 [drm]
           ? intel_dp_hpd_pulse+0x24b/0x400 [i915]
           intel_dp_hpd_pulse+0x24b/0x400 [i915]
           i915_digport_work_func+0xd6/0x160 [i915]
           process_one_work+0x1a9/0x370
           worker_thread+0x4d/0x3a0
           kthread+0xf9/0x130
           ? process_one_work+0x370/0x370
           ? kthread_park+0x90/0x90
           ret_from_fork+0x35/0x40
      
      So, fix this.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: fbc821c4 ("drm/mst: Support simultaneous down replies")
      Cc: Wayne Lin <Wayne.Lin@amd.com>
      Cc: Lyude Paul <lyude@redhat.com>
      Cc: Wayne Lin <waynelin@amd.com>
      Cc: Sean Paul <seanpaul@chromium.org>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200406193352.1245985-1-lyude@redhat.comReviewed-by: NSean Paul <sean@poorly.run>
      cbfb1b74
  18. 04 4月, 2020 1 次提交
  19. 01 4月, 2020 1 次提交
  20. 28 3月, 2020 3 次提交
  21. 13 3月, 2020 4 次提交
    • L
      drm/dp_mst: Rewrite and fix bandwidth limit checks · 047d4cd2
      Lyude Paul 提交于
      Sigh, this is mostly my fault for not giving commit cd82d82c
      ("drm/dp_mst: Add branch bandwidth validation to MST atomic check")
      enough scrutiny during review. The way we're checking bandwidth
      limitations here is mostly wrong:
      
      For starters, drm_dp_mst_atomic_check_bw_limit() determines the
      pbn_limit of a branch by simply scanning each port on the current branch
      device, then uses the last non-zero full_pbn value that it finds. It
      then counts the sum of the PBN used on each branch device for that
      level, and compares against the full_pbn value it found before.
      
      This is wrong because ports can and will have different PBN limitations
      on many hubs, especially since a number of DisplayPort hubs out there
      will be clever and only use the smallest link rate required for each
      downstream sink - potentially giving every port a different full_pbn
      value depending on what link rate it's trained at. This means with our
      current code, which max PBN value we end up with is not well defined.
      
      Additionally, we also need to remember when checking bandwidth
      limitations that the top-most device in any MST topology is a branch
      device, not a port. This means that the first level of a topology
      doesn't technically have a full_pbn value that needs to be checked.
      Instead, we should assume that so long as our VCPI allocations fit we're
      within the bandwidth limitations of the primary MSTB.
      
      We do however, want to check full_pbn on every port including those of
      the primary MSTB. However, it's important to keep in mind that this
      value represents the minimum link rate /between a port's sink or mstb,
      and the mstb itself/. A quick diagram to explain:
      
                                      MSTB #1
                                     /       \
                                    /         \
                                 Port #1    Port #2
             full_pbn for Port #1 → |          | ← full_pbn for Port #2
                                 Sink #1    MSTB #2
                                               |
                                             etc...
      
      Note that in the above diagram, the combined PBN from all VCPI
      allocations on said hub should not exceed the full_pbn value of port #2,
      and the display configuration on sink #1 should not exceed the full_pbn
      value of port #1. However, port #1 and port #2 can otherwise consume as
      much bandwidth as they want so long as their VCPI allocations still fit.
      
      And finally - our current bandwidth checking code also makes the mistake
      of not checking whether something is an end device or not before trying
      to traverse down it.
      
      So, let's fix it by rewriting our bandwidth checking helpers. We split
      the function into one part for handling branches which simply adds up
      the total PBN on each branch and returns it, and one for checking each
      port to ensure we're not going over its PBN limit. Phew.
      
      This should fix regressions seen, where we erroneously reject display
      configurations due to thinking they're going over our bandwidth limits
      when they're not.
      
      Changes since v1:
      * Took an even closer look at how PBN limitations are supposed to be
        handled, and did some experimenting with Sean Paul. Ended up rewriting
        these helpers again, but this time they should actually be correct!
      Changes since v2:
      * Small indenting fix
      * Fix pbn_used check in drm_dp_mst_atomic_check_port_bw_limit()
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: cd82d82c ("drm/dp_mst: Add branch bandwidth validation to MST atomic check")
      Cc: Sean Paul <seanpaul@google.com>
      Acked-by: NAlex Deucher <alexander.deucher@amd.com>
      Reviewed-by: NMikita Lipski <mikita.lipski@amd.com>
      Tested-by: NHans de Goede <hdegoede@redhat.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200309210131.1497545-1-lyude@redhat.com
      047d4cd2
    • L
      drm/dp_mst: Reprobe path resources in CSN handler · 87212b51
      Lyude Paul 提交于
      We used to punt off reprobing path resources to the link address probe
      work, but now that we handle CSNs asynchronously from the driver's HPD
      handling we can do whatever the heck we want from the CSN!
      
      So, reprobe the path resources from drm_dp_mst_handle_conn_stat(). Also,
      get rid of the path resource reprobing code in
      drm_dp_check_and_send_link_address() since it's needlessly complicated
      when we already reprobe path resources from
      drm_dp_handle_link_address_port(). And finally, teach
      drm_dp_send_enum_path_resources() to return 1 on PBN changes so we know
      if we need to send another hotplug or not.
      
      This fixes issues where we've indicated to userspace that a port has
      just been connected, before we actually probed it's available PBN -
      something that results in unexpected atomic check failures.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: cd82d82c ("drm/dp_mst: Add branch bandwidth validation to MST atomic check")
      Cc: Mikita Lipski <mikita.lipski@amd.com>
      Cc: Hans de Goede <hdegoede@redhat.com>
      Cc: Sean Paul <sean@poorly.run>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200306234623.547525-4-lyude@redhat.comReviewed-by: NAlex Deucher <alexander.deucher@amd.com>
      Tested-by: NHans de Goede <hdegoede@redhat.com>
      87212b51
    • L
      drm/dp_mst: Use full_pbn instead of available_pbn for bandwidth checks · fcf46380
      Lyude Paul 提交于
      DisplayPort specifications are fun. For a while, it's been really
      unclear to us what available_pbn actually does. There's a somewhat vague
      explanation in the DisplayPort spec (starting from 1.2) that partially
      explains it:
      
        The minimum payload bandwidth number supported by the path. Each node
        updates this number with its available payload bandwidth number if its
        payload bandwidth number is less than that in the Message Transaction
        reply.
      
      So, it sounds like available_pbn represents the smallest link rate in
      use between the source and the branch device. Cool, so full_pbn is just
      the highest possible PBN that the branch device supports right?
      
      Well, we assumed that for quite a while until Sean Paul noticed that on
      some MST hubs, available_pbn will actually get set to 0 whenever there's
      any active payloads on the respective branch device. This caused quite a
      bit of confusion since clearing the payload ID table would end up fixing
      the available_pbn value.
      
      So, we just went with that until commit cd82d82c ("drm/dp_mst: Add
      branch bandwidth validation to MST atomic check") started breaking
      people's setups due to us getting erroneous available_pbn values. So, we
      did some more digging and got confused until we finally looked at the
      definition for full_pbn:
      
        The bandwidth of the link at the trained link rate and lane count
        between the DP Source device and the DP Sink device with no time slots
        allocated to VC Payloads, represented as a Payload Bandwidth Number. As
        with the Available_Payload_Bandwidth_Number, this number is determined
        by the link with the lowest lane count and link rate.
      
      That's what we get for not reading specs closely enough, hehe. So, since
      full_pbn is definitely what we want for doing bandwidth restriction
      checks - let's start using that instead and ignore available_pbn
      entirely.
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: cd82d82c ("drm/dp_mst: Add branch bandwidth validation to MST atomic check")
      Cc: Mikita Lipski <mikita.lipski@amd.com>
      Cc: Hans de Goede <hdegoede@redhat.com>
      Cc: Sean Paul <sean@poorly.run>
      Reviewed-by: NMikita Lipski <mikita.lipski@amd.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200306234623.547525-3-lyude@redhat.comReviewed-by: NAlex Deucher <alexander.deucher@amd.com>
      Tested-by: NHans de Goede <hdegoede@redhat.com>
      fcf46380
    • L
      drm/dp_mst: Rename drm_dp_mst_is_dp_mst_end_device() to be less redundant · b2feb1d6
      Lyude Paul 提交于
      It's already prefixed by dp_mst, so we don't really need to repeat
      ourselves here. One of the changes I should have picked up originally
      when reviewing MST DSC support.
      
      There should be no functional changes here
      
      Cc: Mikita Lipski <mikita.lipski@amd.com>
      Cc: Sean Paul <seanpaul@google.com>
      Cc: Hans de Goede <hdegoede@redhat.com>
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Reviewed-by: NAlex Deucher <alexander.deucher@amd.com>
      Tested-by: NHans de Goede <hdegoede@redhat.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200306234623.547525-2-lyude@redhat.com
      b2feb1d6
  22. 12 3月, 2020 2 次提交