diff options
author | Dave Airlie <airlied@redhat.com> | 2018-02-21 17:39:26 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-02-21 17:39:26 -0500 |
commit | dfe8db22372873d205c78a9fd5370b1b088a2b87 (patch) | |
tree | a2d0d68121caad20e1cd01ca9707c03d92d8adb9 /drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | |
parent | ccffc9ebfa66e3f2cc5e17b2579202786050b32e (diff) | |
parent | 30a3317ddc2427d173d8bcffaa3f41a61eb66560 (diff) |
Merge tag 'drm-misc-fixes-2018-02-21' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Fixes for 4.16. I contains fixes for deadlock on runtime suspend on few
drivers, a memory leak on non-blocking commits, a crash on color-eviction.
The is also meson and edid fixes, plus a fix for a doc warning.
* tag 'drm-misc-fixes-2018-02-21' of git://anongit.freedesktop.org/drm/drm-misc:
drm/tve200: fix kernel-doc documentation comment include
drm/meson: fix vsync buffer update
drm: Handle unexpected holes in color-eviction
drm/edid: Add 6 bpc quirk for CPT panel in Asus UX303LA
drm/amdgpu: Fix deadlock on runtime suspend
drm/radeon: Fix deadlock on runtime suspend
drm/nouveau: Fix deadlock on runtime suspend
drm: Allow determining if current task is output poll worker
workqueue: Allow retrieval of current task's work struct
drm/atomic: Fix memleak on ERESTARTSYS during non-blocking commits
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c index 8ca3783f2deb..74d2efaec52f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | |||
@@ -736,9 +736,11 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force) | |||
736 | enum drm_connector_status ret = connector_status_disconnected; | 736 | enum drm_connector_status ret = connector_status_disconnected; |
737 | int r; | 737 | int r; |
738 | 738 | ||
739 | r = pm_runtime_get_sync(connector->dev->dev); | 739 | if (!drm_kms_helper_is_poll_worker()) { |
740 | if (r < 0) | 740 | r = pm_runtime_get_sync(connector->dev->dev); |
741 | return connector_status_disconnected; | 741 | if (r < 0) |
742 | return connector_status_disconnected; | ||
743 | } | ||
742 | 744 | ||
743 | if (encoder) { | 745 | if (encoder) { |
744 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); | 746 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
@@ -757,8 +759,12 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force) | |||
757 | /* check acpi lid status ??? */ | 759 | /* check acpi lid status ??? */ |
758 | 760 | ||
759 | amdgpu_connector_update_scratch_regs(connector, ret); | 761 | amdgpu_connector_update_scratch_regs(connector, ret); |
760 | pm_runtime_mark_last_busy(connector->dev->dev); | 762 | |
761 | pm_runtime_put_autosuspend(connector->dev->dev); | 763 | if (!drm_kms_helper_is_poll_worker()) { |
764 | pm_runtime_mark_last_busy(connector->dev->dev); | ||
765 | pm_runtime_put_autosuspend(connector->dev->dev); | ||
766 | } | ||
767 | |||
762 | return ret; | 768 | return ret; |
763 | } | 769 | } |
764 | 770 | ||
@@ -868,9 +874,11 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force) | |||
868 | enum drm_connector_status ret = connector_status_disconnected; | 874 | enum drm_connector_status ret = connector_status_disconnected; |
869 | int r; | 875 | int r; |
870 | 876 | ||
871 | r = pm_runtime_get_sync(connector->dev->dev); | 877 | if (!drm_kms_helper_is_poll_worker()) { |
872 | if (r < 0) | 878 | r = pm_runtime_get_sync(connector->dev->dev); |
873 | return connector_status_disconnected; | 879 | if (r < 0) |
880 | return connector_status_disconnected; | ||
881 | } | ||
874 | 882 | ||
875 | encoder = amdgpu_connector_best_single_encoder(connector); | 883 | encoder = amdgpu_connector_best_single_encoder(connector); |
876 | if (!encoder) | 884 | if (!encoder) |
@@ -924,8 +932,10 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force) | |||
924 | amdgpu_connector_update_scratch_regs(connector, ret); | 932 | amdgpu_connector_update_scratch_regs(connector, ret); |
925 | 933 | ||
926 | out: | 934 | out: |
927 | pm_runtime_mark_last_busy(connector->dev->dev); | 935 | if (!drm_kms_helper_is_poll_worker()) { |
928 | pm_runtime_put_autosuspend(connector->dev->dev); | 936 | pm_runtime_mark_last_busy(connector->dev->dev); |
937 | pm_runtime_put_autosuspend(connector->dev->dev); | ||
938 | } | ||
929 | 939 | ||
930 | return ret; | 940 | return ret; |
931 | } | 941 | } |
@@ -988,9 +998,11 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force) | |||
988 | enum drm_connector_status ret = connector_status_disconnected; | 998 | enum drm_connector_status ret = connector_status_disconnected; |
989 | bool dret = false, broken_edid = false; | 999 | bool dret = false, broken_edid = false; |
990 | 1000 | ||
991 | r = pm_runtime_get_sync(connector->dev->dev); | 1001 | if (!drm_kms_helper_is_poll_worker()) { |
992 | if (r < 0) | 1002 | r = pm_runtime_get_sync(connector->dev->dev); |
993 | return connector_status_disconnected; | 1003 | if (r < 0) |
1004 | return connector_status_disconnected; | ||
1005 | } | ||
994 | 1006 | ||
995 | if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) { | 1007 | if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) { |
996 | ret = connector->status; | 1008 | ret = connector->status; |
@@ -1115,8 +1127,10 @@ out: | |||
1115 | amdgpu_connector_update_scratch_regs(connector, ret); | 1127 | amdgpu_connector_update_scratch_regs(connector, ret); |
1116 | 1128 | ||
1117 | exit: | 1129 | exit: |
1118 | pm_runtime_mark_last_busy(connector->dev->dev); | 1130 | if (!drm_kms_helper_is_poll_worker()) { |
1119 | pm_runtime_put_autosuspend(connector->dev->dev); | 1131 | pm_runtime_mark_last_busy(connector->dev->dev); |
1132 | pm_runtime_put_autosuspend(connector->dev->dev); | ||
1133 | } | ||
1120 | 1134 | ||
1121 | return ret; | 1135 | return ret; |
1122 | } | 1136 | } |
@@ -1359,9 +1373,11 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) | |||
1359 | struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector); | 1373 | struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector); |
1360 | int r; | 1374 | int r; |
1361 | 1375 | ||
1362 | r = pm_runtime_get_sync(connector->dev->dev); | 1376 | if (!drm_kms_helper_is_poll_worker()) { |
1363 | if (r < 0) | 1377 | r = pm_runtime_get_sync(connector->dev->dev); |
1364 | return connector_status_disconnected; | 1378 | if (r < 0) |
1379 | return connector_status_disconnected; | ||
1380 | } | ||
1365 | 1381 | ||
1366 | if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) { | 1382 | if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) { |
1367 | ret = connector->status; | 1383 | ret = connector->status; |
@@ -1429,8 +1445,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) | |||
1429 | 1445 | ||
1430 | amdgpu_connector_update_scratch_regs(connector, ret); | 1446 | amdgpu_connector_update_scratch_regs(connector, ret); |
1431 | out: | 1447 | out: |
1432 | pm_runtime_mark_last_busy(connector->dev->dev); | 1448 | if (!drm_kms_helper_is_poll_worker()) { |
1433 | pm_runtime_put_autosuspend(connector->dev->dev); | 1449 | pm_runtime_mark_last_busy(connector->dev->dev); |
1450 | pm_runtime_put_autosuspend(connector->dev->dev); | ||
1451 | } | ||
1434 | 1452 | ||
1435 | return ret; | 1453 | return ret; |
1436 | } | 1454 | } |