[PATCH 2/5] drm/amdgpu: Use drm_crtc_vblank_crtc()

2024-04-08 Thread Ville Syrjala
From: Ville Syrjälä 

Replace the open coded drm_crtc_vblank_crtc() with the real
thing.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "Pan, Xinhui" 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c  | 8 ++--
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
index 8baa2e0935cc..258703145161 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
@@ -65,9 +65,7 @@ static enum hrtimer_restart 
amdgpu_vkms_vblank_simulate(struct hrtimer *timer)
 
 static int amdgpu_vkms_enable_vblank(struct drm_crtc *crtc)
 {
-   struct drm_device *dev = crtc->dev;
-   unsigned int pipe = drm_crtc_index(crtc);
-   struct drm_vblank_crtc *vblank = >vblank[pipe];
+   struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
struct amdgpu_vkms_output *out = drm_crtc_to_amdgpu_vkms_output(crtc);
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
 
@@ -91,10 +89,8 @@ static bool amdgpu_vkms_get_vblank_timestamp(struct drm_crtc 
*crtc,
 ktime_t *vblank_time,
 bool in_vblank_irq)
 {
-   struct drm_device *dev = crtc->dev;
-   unsigned int pipe = crtc->index;
struct amdgpu_vkms_output *output = 
drm_crtc_to_amdgpu_vkms_output(crtc);
-   struct drm_vblank_crtc *vblank = >vblank[pipe];
+   struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
 
if (!READ_ONCE(vblank->enabled)) {
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 71d2d44681b2..662d2d83473b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -528,7 +528,7 @@ static void dm_vupdate_high_irq(void *interrupt_params)
if (acrtc) {
vrr_active = amdgpu_dm_crtc_vrr_active_irq(acrtc);
drm_dev = acrtc->base.dev;
-   vblank = _dev->vblank[acrtc->base.index];
+   vblank = drm_crtc_vblank_crtc(>base);
previous_timestamp = 
atomic64_read(_params->previous_timestamp);
frame_duration_ns = vblank->time - previous_timestamp;
 
-- 
2.43.2



[PATCH v2 1/7] drm/amdgpu: Use drm_mode_init() for on-stack modes

2022-11-07 Thread Ville Syrjala
From: Ville Syrjälä 

Initialize on-stack modes with drm_mode_init() to guarantee
no stack garbage in the list head, or that we aren't copying
over another mode's list head.

Based on the following cocci script, with manual fixups:
@decl@
identifier M;
expression E;
@@
- struct drm_display_mode M = E;
+ struct drm_display_mode M;

@@
identifier decl.M;
expression decl.E;
statement S, S1;
@@
struct drm_display_mode M;
... when != S
+ drm_mode_init(, );
+
S1

@@
expression decl.E;
@@
- &*E
+ E

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Reviewed-by: Harry Wentland 
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d9940a3c64dd..7fa4b61bc5bf 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5685,7 +5685,7 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
const struct drm_connector_state *con_state =
dm_state ? _state->base : NULL;
struct dc_stream_state *stream = NULL;
-   struct drm_display_mode mode = *drm_mode;
+   struct drm_display_mode mode;
struct drm_display_mode saved_mode;
struct drm_display_mode *freesync_mode = NULL;
bool native_mode_found = false;
@@ -5699,6 +5699,7 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
 
struct dc_sink *sink = NULL;
 
+   drm_mode_init(, drm_mode);
memset(_mode, 0, sizeof(saved_mode));
 
if (aconnector == NULL) {
-- 
2.37.4



[PATCH v2 9/9] drm/edid: s/monitor_rage/vrr_range/

2022-09-27 Thread Ville Syrjala
From: Ville Syrjälä 

Rename info->monitor_range to info->vrr_range to actually
reflect its usage.

Cc: Nicholas Kazlauskas 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Reviewed-by: Manasi Navare 
Acked-by: Jani Nikula 
Signed-off-by: Ville Syrjälä 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 -
 drivers/gpu/drm/drm_debugfs.c |  4 +--
 drivers/gpu/drm/drm_edid.c| 26 +--
 drivers/gpu/drm/i915/display/intel_vrr.c  |  6 ++---
 include/drm/drm_connector.h   |  4 +--
 5 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 4c73727e0b7d..88758e8c65c6 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9943,8 +9943,8 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector 
*connector,
amdgpu_dm_connector->min_vfreq = 0;
amdgpu_dm_connector->max_vfreq = 0;
amdgpu_dm_connector->pixel_clock_mhz = 0;
-   connector->display_info.monitor_range.min_vfreq = 0;
-   connector->display_info.monitor_range.max_vfreq = 0;
+   connector->display_info.vrr_range.min_vfreq = 0;
+   connector->display_info.vrr_range.max_vfreq = 0;
freesync_capable = false;
 
goto update;
@@ -9991,8 +9991,8 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector 
*connector,
amdgpu_dm_connector->pixel_clock_mhz =
range->pixel_clock_mhz * 10;
 
-   connector->display_info.monitor_range.min_vfreq 
= range->min_vfreq;
-   connector->display_info.monitor_range.max_vfreq 
= range->max_vfreq;
+   connector->display_info.vrr_range.min_vfreq = 
range->min_vfreq;
+   connector->display_info.vrr_range.max_vfreq = 
range->max_vfreq;
 
break;
}
@@ -10014,8 +10014,8 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
if (amdgpu_dm_connector->max_vfreq - 
amdgpu_dm_connector->min_vfreq > 10)
freesync_capable = true;
 
-   connector->display_info.monitor_range.min_vfreq = 
vsdb_info.min_refresh_rate_hz;
-   connector->display_info.monitor_range.max_vfreq = 
vsdb_info.max_refresh_rate_hz;
+   connector->display_info.vrr_range.min_vfreq = 
vsdb_info.min_refresh_rate_hz;
+   connector->display_info.vrr_range.max_vfreq = 
vsdb_info.max_refresh_rate_hz;
}
}
 
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index 01ee3febb813..1437c798b122 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -377,8 +377,8 @@ static int vrr_range_show(struct seq_file *m, void *data)
if (connector->status != connector_status_connected)
return -ENODEV;
 
-   seq_printf(m, "Min: %u\n", 
connector->display_info.monitor_range.min_vfreq);
-   seq_printf(m, "Max: %u\n", 
connector->display_info.monitor_range.max_vfreq);
+   seq_printf(m, "Min: %u\n", connector->display_info.vrr_range.min_vfreq);
+   seq_printf(m, "Max: %u\n", connector->display_info.vrr_range.max_vfreq);
 
return 0;
 }
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 69485adcc80c..e7f46260dfe7 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6091,11 +6091,11 @@ static void drm_parse_cea_ext(struct drm_connector 
*connector,
 }
 
 static
-void get_monitor_range(const struct detailed_timing *timing, void *c)
+void get_vrr_range(const struct detailed_timing *timing, void *c)
 {
struct detailed_mode_closure *closure = c;
struct drm_display_info *info = >connector->display_info;
-   struct drm_monitor_range_info *monitor_range = >monitor_range;
+   struct drm_monitor_range_info *vrr_range = >vrr_range;
const struct detailed_non_pixel *data = >data.other_data;
const struct detailed_data_monitor_range *range = >data.range;
const struct edid *edid = closure->drm_edid->edid;
@@ -6115,19 +6115,19 @@ void get_monitor_range(const struct detailed_timing 
*timing, void *c)
if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
return;
 
-   monitor_range->min_vfreq = range->min_vfreq;
-   monitor_range->max_vfreq = range->max_vfreq;
+   vrr_range->min_vfreq = range->min_vfreq;
+   vrr_range->max_vfreq = range->max_vfreq;
 
if (edid->revision >= 4) {
if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
-   

[PATCH v2 3/9] drm/edid: Only parse VRR range for continuous frequency displays

2022-09-27 Thread Ville Syrjala
From: Ville Syrjälä 

Since we only use the parsed vrefresh range to determine
if VRR should be supported we should only accept continuous
frequency displays here.

Cc: Manasi Navare 
Cc: Nicholas Kazlauskas 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Reviewed-by: Jani Nikula 
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 76753c56d4f7..8c89d6a90390 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6064,7 +6064,10 @@ static void drm_get_monitor_range(struct drm_connector 
*connector,
.drm_edid = drm_edid,
};
 
-   if (!version_greater(drm_edid, 1, 1))
+   if (!version_greater(drm_edid, 1, 3))
+   return;
+
+   if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
return;
 
drm_for_each_detailed_block(drm_edid, get_monitor_range, );
-- 
2.35.1



[PATCH v2 1/9] drm/edid: Clarify why we only accept the "range limits only" descriptor

2022-09-27 Thread Ville Syrjala
From: Ville Syrjälä 

The current comment fails to clarify why we only accept
the "range limits only" variant of the range descriptor.
Reword it to make some actual sense.

Cc: Nicholas Kazlauskas 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Reviewed-by: Manasi Navare 
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 4005dab6147d..ac662495635c 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6033,10 +6033,13 @@ void get_monitor_range(const struct detailed_timing 
*timing, void *c)
return;
 
/*
-* Check for flag range limits only. If flag == 1 then
-* no additional timing information provided.
-* Default GTF, GTF Secondary curve and CVT are not
-* supported
+* These limits are used to determine the VRR refresh
+* rate range. Only the "range limits only" variant
+* of the range descriptor seems to guarantee that
+* any and all timings are accepted by the sink, as
+* opposed to just timings conforming to the indicated
+* formula (GTF/GTF2/CVT). Thus other variants of the
+* range descriptor are not accepted here.
 */
if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
return;
-- 
2.35.1



[PATCH 05/11] drm/edid: Only parse VRR range for continuous frequency displays

2022-08-26 Thread Ville Syrjala
From: Ville Syrjälä 

Since we only use the parsed vrefresh range to determine
if VRR should be supported we should only accept continuous
frequency displays here.

Cc: Manasi Navare 
Cc: Nicholas Kazlauskas 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 856d304a1354..b459fdf12b58 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6064,7 +6064,10 @@ static void drm_get_vrr_range(struct drm_connector 
*connector,
.drm_edid = drm_edid,
};
 
-   if (!version_greater(drm_edid, 1, 1))
+   if (!version_greater(drm_edid, 1, 3))
+   return;
+
+   if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
return;
 
drm_for_each_detailed_block(drm_edid, get_vrr_range, );
-- 
2.35.1



[PATCH 03/11] drm/edid: s/monitor_rage/vrr_range/

2022-08-26 Thread Ville Syrjala
From: Ville Syrjälä 

Rename info->monitor_range to info->vrr_range to actually
reflect its usage.

Cc: Manasi Navare 
Cc: Nicholas Kazlauskas 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 -
 drivers/gpu/drm/drm_debugfs.c |  4 +--
 drivers/gpu/drm/drm_edid.c| 26 +--
 drivers/gpu/drm/i915/display/intel_vrr.c  |  6 ++---
 include/drm/drm_connector.h   |  4 +--
 5 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index e702f0d72d53..928b5b6541db 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9921,8 +9921,8 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector 
*connector,
amdgpu_dm_connector->min_vfreq = 0;
amdgpu_dm_connector->max_vfreq = 0;
amdgpu_dm_connector->pixel_clock_mhz = 0;
-   connector->display_info.monitor_range.min_vfreq = 0;
-   connector->display_info.monitor_range.max_vfreq = 0;
+   connector->display_info.vrr_range.min_vfreq = 0;
+   connector->display_info.vrr_range.max_vfreq = 0;
freesync_capable = false;
 
goto update;
@@ -9970,8 +9970,8 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector 
*connector,
amdgpu_dm_connector->pixel_clock_mhz =
range->pixel_clock_mhz * 10;
 
-   connector->display_info.monitor_range.min_vfreq 
= range->min_vfreq;
-   connector->display_info.monitor_range.max_vfreq 
= range->max_vfreq;
+   connector->display_info.vrr_range.min_vfreq = 
range->min_vfreq;
+   connector->display_info.vrr_range.max_vfreq = 
range->max_vfreq;
 
break;
}
@@ -9993,8 +9993,8 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector 
*connector,
if (amdgpu_dm_connector->max_vfreq - 
amdgpu_dm_connector->min_vfreq > 10)
freesync_capable = true;
 
-   connector->display_info.monitor_range.min_vfreq = 
vsdb_info.min_refresh_rate_hz;
-   connector->display_info.monitor_range.max_vfreq = 
vsdb_info.max_refresh_rate_hz;
+   connector->display_info.vrr_range.min_vfreq = 
vsdb_info.min_refresh_rate_hz;
+   connector->display_info.vrr_range.max_vfreq = 
vsdb_info.max_refresh_rate_hz;
}
}
 
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index 01ee3febb813..1437c798b122 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -377,8 +377,8 @@ static int vrr_range_show(struct seq_file *m, void *data)
if (connector->status != connector_status_connected)
return -ENODEV;
 
-   seq_printf(m, "Min: %u\n", 
connector->display_info.monitor_range.min_vfreq);
-   seq_printf(m, "Max: %u\n", 
connector->display_info.monitor_range.max_vfreq);
+   seq_printf(m, "Min: %u\n", connector->display_info.vrr_range.min_vfreq);
+   seq_printf(m, "Max: %u\n", connector->display_info.vrr_range.max_vfreq);
 
return 0;
 }
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index ac662495635c..4355d73632c3 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6020,11 +6020,11 @@ static void drm_parse_cea_ext(struct drm_connector 
*connector,
 }
 
 static
-void get_monitor_range(const struct detailed_timing *timing, void *c)
+void get_vrr_range(const struct detailed_timing *timing, void *c)
 {
struct detailed_mode_closure *closure = c;
struct drm_display_info *info = >connector->display_info;
-   struct drm_monitor_range_info *monitor_range = >monitor_range;
+   struct drm_monitor_range_info *vrr_range = >vrr_range;
const struct detailed_non_pixel *data = >data.other_data;
const struct detailed_data_monitor_range *range = >data.range;
const struct edid *edid = closure->drm_edid->edid;
@@ -6044,19 +6044,19 @@ void get_monitor_range(const struct detailed_timing 
*timing, void *c)
if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
return;
 
-   monitor_range->min_vfreq = range->min_vfreq;
-   monitor_range->max_vfreq = range->max_vfreq;
+   vrr_range->min_vfreq = range->min_vfreq;
+   vrr_range->max_vfreq = range->max_vfreq;
 
if (edid->revision >= 4) {
if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
-   monitor_range->min_vfreq 

[PATCH 02/11] drm/edid: Clarify why we only accept the "range limits only" descriptor

2022-08-26 Thread Ville Syrjala
From: Ville Syrjälä 

The current comment fails to clarify why we only accept
the "range limits only" variant of the range descriptor.
Reword it to make some actual sense.

Cc: Manasi Navare 
Cc: Nicholas Kazlauskas 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 4005dab6147d..ac662495635c 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6033,10 +6033,13 @@ void get_monitor_range(const struct detailed_timing 
*timing, void *c)
return;
 
/*
-* Check for flag range limits only. If flag == 1 then
-* no additional timing information provided.
-* Default GTF, GTF Secondary curve and CVT are not
-* supported
+* These limits are used to determine the VRR refresh
+* rate range. Only the "range limits only" variant
+* of the range descriptor seems to guarantee that
+* any and all timings are accepted by the sink, as
+* opposed to just timings conforming to the indicated
+* formula (GTF/GTF2/CVT). Thus other variants of the
+* range descriptor are not accepted here.
 */
if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
return;
-- 
2.35.1



[PATCH 04/22] drm/amdgpu: Use drm_mode_copy()

2022-02-18 Thread Ville Syrjala
From: Ville Syrjälä 

struct drm_display_mode embeds a list head, so overwriting
the full struct with another one will corrupt the list
(if the destination mode is on a list). Use drm_mode_copy()
instead which explicitly preserves the list head of
the destination mode.

Even if we know the destination mode is not on any list
using drm_mode_copy() seems decent as it sets a good
example. Bad examples of not using it might eventually
get copied into code where preserving the list head
actually matters.

Obviously one case not covered here is when the mode
itself is embedded in a larger structure and the whole
structure is copied. But if we are careful when copying
into modes embedded in structures I think we can be a
little more reassured that bogus list heads haven't been
propagated in.

@is_mode_copy@
@@
drm_mode_copy(...)
{
...
}

@depends on !is_mode_copy@
struct drm_display_mode *mode;
expression E, S;
@@
(
- *mode = E
+ drm_mode_copy(mode, )
|
- memcpy(mode, E, S)
+ drm_mode_copy(mode, E)
)

@depends on !is_mode_copy@
struct drm_display_mode mode;
expression E;
@@
(
- mode = E
+ drm_mode_copy(, )
|
- memcpy(, E, S)
+ drm_mode_copy(, E)
)

@@
struct drm_display_mode *mode;
@@
- &*mode
+ mode

Cc: Alex Deucher 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c| 4 ++--
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index fa20261aa928..673078faa27a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -626,7 +626,7 @@ amdgpu_connector_fixup_lcd_native_mode(struct drm_encoder 
*encoder,
if (mode->type & DRM_MODE_TYPE_PREFERRED) {
if (mode->hdisplay != native_mode->hdisplay ||
mode->vdisplay != native_mode->vdisplay)
-   memcpy(native_mode, mode, sizeof(*mode));
+   drm_mode_copy(native_mode, mode);
}
}
 
@@ -635,7 +635,7 @@ amdgpu_connector_fixup_lcd_native_mode(struct drm_encoder 
*encoder,
list_for_each_entry_safe(mode, t, >probed_modes, 
head) {
if (mode->hdisplay == native_mode->hdisplay &&
mode->vdisplay == native_mode->vdisplay) {
-   *native_mode = *mode;
+   drm_mode_copy(native_mode, mode);
drm_mode_set_crtcinfo(native_mode, 
CRTC_INTERLACE_HALVE_V);
DRM_DEBUG_KMS("Determined LVDS native mode 
details from EDID\n");
break;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index bd23c9e481eb..514280699ad5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6318,7 +6318,7 @@ get_highest_refresh_rate_mode(struct amdgpu_dm_connector 
*aconnector,
}
}
 
-   aconnector->freesync_vid_base = *m_pref;
+   drm_mode_copy(>freesync_vid_base, m_pref);
return m_pref;
 }
 
@@ -6432,8 +6432,8 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
recalculate_timing = is_freesync_video_mode(, aconnector);
if (recalculate_timing) {
freesync_mode = 
get_highest_refresh_rate_mode(aconnector, false);
-   saved_mode = mode;
-   mode = *freesync_mode;
+   drm_mode_copy(_mode, );
+   drm_mode_copy(, freesync_mode);
} else {
decide_crtc_timing_for_drm_display_mode(
, preferred_mode, scale);
-- 
2.34.1



[PATCH 05/22] drm/radeon: Use drm_mode_copy()

2022-02-18 Thread Ville Syrjala
From: Ville Syrjälä 

struct drm_display_mode embeds a list head, so overwriting
the full struct with another one will corrupt the list
(if the destination mode is on a list). Use drm_mode_copy()
instead which explicitly preserves the list head of
the destination mode.

Even if we know the destination mode is not on any list
using drm_mode_copy() seems decent as it sets a good
example. Bad examples of not using it might eventually
get copied into code where preserving the list head
actually matters.

Obviously one case not covered here is when the mode
itself is embedded in a larger structure and the whole
structure is copied. But if we are careful when copying
into modes embedded in structures I think we can be a
little more reassured that bogus list heads haven't been
propagated in.

@is_mode_copy@
@@
drm_mode_copy(...)
{
...
}

@depends on !is_mode_copy@
struct drm_display_mode *mode;
expression E, S;
@@
(
- *mode = E
+ drm_mode_copy(mode, )
|
- memcpy(mode, E, S)
+ drm_mode_copy(mode, E)
)

@depends on !is_mode_copy@
struct drm_display_mode mode;
expression E;
@@
(
- mode = E
+ drm_mode_copy(, )
|
- memcpy(, E, S)
+ drm_mode_copy(, E)
)

@@
struct drm_display_mode *mode;
@@
- &*mode
+ mode

Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/radeon/radeon_connectors.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c 
b/drivers/gpu/drm/radeon/radeon_connectors.c
index a7925a8290b2..0cb1345c6ba4 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -777,7 +777,7 @@ static void radeon_fixup_lvds_native_mode(struct 
drm_encoder *encoder,
if (mode->type & DRM_MODE_TYPE_PREFERRED) {
if (mode->hdisplay != native_mode->hdisplay ||
mode->vdisplay != native_mode->vdisplay)
-   memcpy(native_mode, mode, sizeof(*mode));
+   drm_mode_copy(native_mode, mode);
}
}
 
@@ -786,7 +786,7 @@ static void radeon_fixup_lvds_native_mode(struct 
drm_encoder *encoder,
list_for_each_entry_safe(mode, t, >probed_modes, 
head) {
if (mode->hdisplay == native_mode->hdisplay &&
mode->vdisplay == native_mode->vdisplay) {
-   *native_mode = *mode;
+   drm_mode_copy(native_mode, mode);
drm_mode_set_crtcinfo(native_mode, 
CRTC_INTERLACE_HALVE_V);
DRM_DEBUG_KMS("Determined LVDS native mode 
details from EDID\n");
break;
-- 
2.34.1



[PATCH 03/22] drm/amdgpu: Use drm_mode_init() for on-stack modes

2022-02-18 Thread Ville Syrjala
From: Ville Syrjälä 

Initialize on-stack modes with drm_mode_init() to guarantee
no stack garbage in the list head, or that we aren't copying
over another mode's list head.

Based on the following cocci script, with manual fixups:
@decl@
identifier M;
expression E;
@@
- struct drm_display_mode M = E;
+ struct drm_display_mode M;

@@
identifier decl.M;
expression decl.E;
statement S, S1;
@@
struct drm_display_mode M;
... when != S
+ drm_mode_init(, );
+
S1

@@
expression decl.E;
@@
- &*E
+ E

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 65aab0d086b6..bd23c9e481eb 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6361,7 +6361,7 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
const struct drm_connector_state *con_state =
dm_state ? _state->base : NULL;
struct dc_stream_state *stream = NULL;
-   struct drm_display_mode mode = *drm_mode;
+   struct drm_display_mode mode;
struct drm_display_mode saved_mode;
struct drm_display_mode *freesync_mode = NULL;
bool native_mode_found = false;
@@ -6374,6 +6374,7 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
 #endif
struct dc_sink *sink = NULL;
 
+   drm_mode_init(, drm_mode);
memset(_mode, 0, sizeof(saved_mode));
 
if (aconnector == NULL) {
-- 
2.34.1



[PATCH 02/22] drm/amdgpu: Remove pointless on stack mode copies

2022-02-18 Thread Ville Syrjala
From: Ville Syrjälä 

These on stack copies of the modes appear to be pointless.
Just look at the originals directly.

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Cc: Nikola Cornij 
Cc: Aurabindo Pillai 
Signed-off-by: Ville Syrjälä 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 32 +--
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 21dba337dab0..65aab0d086b6 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -10139,27 +10139,27 @@ static bool
 is_timing_unchanged_for_freesync(struct drm_crtc_state *old_crtc_state,
 struct drm_crtc_state *new_crtc_state)
 {
-   struct drm_display_mode old_mode, new_mode;
+   const struct drm_display_mode *old_mode, *new_mode;
 
if (!old_crtc_state || !new_crtc_state)
return false;
 
-   old_mode = old_crtc_state->mode;
-   new_mode = new_crtc_state->mode;
+   old_mode = _crtc_state->mode;
+   new_mode = _crtc_state->mode;
 
-   if (old_mode.clock   == new_mode.clock &&
-   old_mode.hdisplay== new_mode.hdisplay &&
-   old_mode.vdisplay== new_mode.vdisplay &&
-   old_mode.htotal  == new_mode.htotal &&
-   old_mode.vtotal  != new_mode.vtotal &&
-   old_mode.hsync_start == new_mode.hsync_start &&
-   old_mode.vsync_start != new_mode.vsync_start &&
-   old_mode.hsync_end   == new_mode.hsync_end &&
-   old_mode.vsync_end   != new_mode.vsync_end &&
-   old_mode.hskew   == new_mode.hskew &&
-   old_mode.vscan   == new_mode.vscan &&
-   (old_mode.vsync_end - old_mode.vsync_start) ==
-   (new_mode.vsync_end - new_mode.vsync_start))
+   if (old_mode->clock   == new_mode->clock &&
+   old_mode->hdisplay== new_mode->hdisplay &&
+   old_mode->vdisplay== new_mode->vdisplay &&
+   old_mode->htotal  == new_mode->htotal &&
+   old_mode->vtotal  != new_mode->vtotal &&
+   old_mode->hsync_start == new_mode->hsync_start &&
+   old_mode->vsync_start != new_mode->vsync_start &&
+   old_mode->hsync_end   == new_mode->hsync_end &&
+   old_mode->vsync_end   != new_mode->vsync_end &&
+   old_mode->hskew   == new_mode->hskew &&
+   old_mode->vscan   == new_mode->vscan &&
+   (old_mode->vsync_end - old_mode->vsync_start) ==
+   (new_mode->vsync_end - new_mode->vsync_start))
return true;
 
return false;
-- 
2.34.1



[PATCH 00/22] drm: Review of mode copies

2022-02-18 Thread Ville Syrjala
From: Ville Syrjälä 

I might be taking this a bit too far, but the lack of
consistency in our methods to copy drm_display_mode
structs around is bugging me.

The main worry is the embedded list head, which if
clobbered could lead to list corruption. I'd also
prefer to make sure even the valid list heads don't
propagate between copies since that makes no sense.

While going through some of the code I also spotted
some very weird on stack copies being made for no
reason at all. I elimininated a few of them here,
but there could certainly be more lurking in the
shadows.

Cc: Abhinav Kumar 
Cc: Alain Volmat 
Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Cc: Andrzej Hajda 
Cc: Aurabindo Pillai 
Cc: Chen Feng 
Cc: Chun-Kuang Hu 
Cc: Emma Anholt 
Cc: freedr...@lists.freedesktop.org
Cc: Harry Wentland 
Cc: "Heiko Stübner" 
Cc: Jernej Skrabec 
Cc: John Stultz 
Cc: Jonas Karlman 
Cc: Jyri Sarha 
Cc: Laurent Pinchart 
Cc: Leo Li 
Cc: linux-arm-ker...@lists.infradead.org
Cc: linux-arm-...@vger.kernel.org
Cc: linux-rockc...@lists.infradead.org
Cc: Maxime Ripard 
Cc: Neil Armstrong 
Cc: Nikola Cornij 
Cc: Patrik Jakobsson 
Cc: Philipp Zabel 
Cc: Rob Clark 
Cc: Robert Foss 
Cc: Rodrigo Siqueira 
Cc: Sam Ravnborg 
Cc: Sandy Huang 
Cc: Sean Paul 
Cc: Thierry Reding 
Cc: Tian Tao 
Cc: Tomi Valkeinen 
Cc: Xinliang Liu 
Cc: Xinwei Kong 

Ville Syrjälä (22):
  drm: Add drm_mode_init()
  drm/amdgpu: Remove pointless on stack mode copies
  drm/amdgpu: Use drm_mode_init() for on-stack modes
  drm/amdgpu: Use drm_mode_copy()
  drm/radeon: Use drm_mode_copy()
  drm/bridge: Use drm_mode_copy()
  drm/gma500: Use drm_mode_copy()
  drm/hisilicon: Use drm_mode_init() for on-stack modes
  drm/imx: Use drm_mode_duplicate()
  drm/msm: Nuke weird on stack mode copy
  drm/msm: Use drm_mode_init() for on-stack modes
  drm/msm: Use drm_mode_copy()
  drm/mtk: Use drm_mode_init() for on-stack modes
  drm/rockchip: Use drm_mode_copy()
  drm/sti: Use drm_mode_copy()
  drm/tilcdc: Use drm_mode_copy()
  drm/vc4: Use drm_mode_copy()
  drm/i915: Use drm_mode_init() for on-stack modes
  drm/i915: Use drm_mode_copy()
  drm/panel: Use drm_mode_duplicate()
  drm: Use drm_mode_init() for on-stack modes
  drm: Use drm_mode_copy()

 .../gpu/drm/amd/amdgpu/amdgpu_connectors.c|  4 +-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 41 ++-
 drivers/gpu/drm/bridge/nwl-dsi.c  |  2 +-
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  2 +-
 drivers/gpu/drm/bridge/tc358767.c |  2 +-
 drivers/gpu/drm/drm_crtc_helper.c | 12 +++---
 drivers/gpu/drm/drm_edid.c|  8 +++-
 drivers/gpu/drm/drm_modes.c   | 21 +-
 drivers/gpu/drm/drm_vblank.c  |  2 +-
 drivers/gpu/drm/gma500/oaktrail_crtc.c|  8 +---
 drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c  |  2 +-
 drivers/gpu/drm/i915/display/intel_display.c  | 20 +
 drivers/gpu/drm/imx/imx-ldb.c |  3 +-
 drivers/gpu/drm/mediatek/mtk_hdmi.c   |  2 +-
 .../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c  |  2 +-
 .../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c  |  9 ++--
 drivers/gpu/drm/msm/dp/dp_display.c   |  2 +-
 drivers/gpu/drm/msm/dp/dp_drm.c   | 10 ++---
 drivers/gpu/drm/panel/panel-truly-nt35597.c   |  3 +-
 .../gpu/drm/panel/panel-visionox-rm69299.c|  4 +-
 drivers/gpu/drm/radeon/radeon_connectors.c|  4 +-
 drivers/gpu/drm/rockchip/cdn-dp-core.c|  2 +-
 drivers/gpu/drm/rockchip/inno_hdmi.c  |  2 +-
 drivers/gpu/drm/rockchip/rk3066_hdmi.c|  2 +-
 drivers/gpu/drm/sti/sti_dvo.c |  2 +-
 drivers/gpu/drm/sti/sti_hda.c |  2 +-
 drivers/gpu/drm/sti/sti_hdmi.c|  2 +-
 drivers/gpu/drm/tilcdc/tilcdc_crtc.c  |  2 +-
 drivers/gpu/drm/vc4/vc4_hdmi.c|  5 +--
 include/drm/drm_modes.h   |  2 +
 30 files changed, 105 insertions(+), 79 deletions(-)

-- 
2.34.1



[PATCH 2/3] drm/amdgpu/powerplay: Use swap() where appropriate

2019-10-10 Thread Ville Syrjala
From: Ville Syrjälä 

@swap@
identifier TEMP;
expression A,B;
@@
- TEMP = A;
- A = B;
- B = TEMP;
+ swap(A, B);

@@
type T;
identifier swap.TEMP;
@@
(
- T TEMP;
|
- T TEMP = {...};
)
... when != TEMP

Cc: Rex Zhu 
Cc: Evan Quan 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c   | 6 ++
 drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 6 ++
 2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 34f95e0e3ea4..1fe992835a76 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -1994,7 +1994,6 @@ static int smu7_sort_lookup_table(struct pp_hwmgr *hwmgr,
struct phm_ppt_v1_voltage_lookup_table *lookup_table)
 {
uint32_t table_size, i, j;
-   struct phm_ppt_v1_voltage_lookup_record tmp_voltage_lookup_record;
table_size = lookup_table->count;
 
PP_ASSERT_WITH_CODE(0 != lookup_table->count,
@@ -2005,9 +2004,8 @@ static int smu7_sort_lookup_table(struct pp_hwmgr *hwmgr,
for (j = i + 1; j > 0; j--) {
if (lookup_table->entries[j].us_vdd <
lookup_table->entries[j - 1].us_vdd) {
-   tmp_voltage_lookup_record = 
lookup_table->entries[j - 1];
-   lookup_table->entries[j - 1] = 
lookup_table->entries[j];
-   lookup_table->entries[j] = 
tmp_voltage_lookup_record;
+   swap(lookup_table->entries[j - 1],
+lookup_table->entries[j]);
}
}
}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
index d08493b67b67..f5dcba44f74a 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -712,7 +712,6 @@ static int vega10_sort_lookup_table(struct pp_hwmgr *hwmgr,
struct phm_ppt_v1_voltage_lookup_table *lookup_table)
 {
uint32_t table_size, i, j;
-   struct phm_ppt_v1_voltage_lookup_record tmp_voltage_lookup_record;
 
PP_ASSERT_WITH_CODE(lookup_table && lookup_table->count,
"Lookup table is empty", return -EINVAL);
@@ -724,9 +723,8 @@ static int vega10_sort_lookup_table(struct pp_hwmgr *hwmgr,
for (j = i + 1; j > 0; j--) {
if (lookup_table->entries[j].us_vdd <
lookup_table->entries[j - 1].us_vdd) {
-   tmp_voltage_lookup_record = 
lookup_table->entries[j - 1];
-   lookup_table->entries[j - 1] = 
lookup_table->entries[j];
-   lookup_table->entries[j] = 
tmp_voltage_lookup_record;
+   swap(lookup_table->entries[j - 1],
+lookup_table->entries[j]);
}
}
}
-- 
2.21.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

[PATCH 1/3] drm/amd/display: Use swap() where appropriate

2019-10-10 Thread Ville Syrjala
From: Ville Syrjälä 

Mostly a cocci-job, but it flat out refused to remove the
declaration in drivers/gpu/drm/amd/display/dc/core/dc.c so
had to do that part manually.

@swap@
identifier TEMP;
expression A,B;
@@
- TEMP = A;
- A = B;
- B = TEMP;
+ swap(A, B);

@@
type T;
identifier swap.TEMP;
@@
(
- T TEMP;
|
- T TEMP = {...};
)
... when != TEMP

Cc: Harry Wentland 
Cc: Leo Li 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/display/dc/bios/bios_parser.c  | 7 ++-
 drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 8 ++--
 drivers/gpu/drm/amd/display/dc/core/dc.c   | 6 +-
 3 files changed, 5 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c 
b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
index 221e0f56389f..823843cd2613 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
@@ -2543,7 +2543,6 @@ static enum bp_result construct_integrated_info(
 
/* Sort voltage table from low to high*/
if (result == BP_RESULT_OK) {
-   struct clock_voltage_caps temp = {0, 0};
uint32_t i;
uint32_t j;
 
@@ -2553,10 +2552,8 @@ static enum bp_result construct_integrated_info(

info->disp_clk_voltage[j].max_supported_clk <

info->disp_clk_voltage[j-1].max_supported_clk) {
/* swap j and j - 1*/
-   temp = info->disp_clk_voltage[j-1];
-   info->disp_clk_voltage[j-1] =
-   
info->disp_clk_voltage[j];
-   info->disp_clk_voltage[j] = temp;
+   swap(info->disp_clk_voltage[j - 1],
+info->disp_clk_voltage[j]);
}
}
}
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c 
b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
index dff65c0fe82f..7873abea4112 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
@@ -1613,8 +1613,6 @@ static enum bp_result construct_integrated_info(
 
struct atom_common_table_header *header;
struct atom_data_revision revision;
-
-   struct clock_voltage_caps temp = {0, 0};
uint32_t i;
uint32_t j;
 
@@ -1644,10 +1642,8 @@ static enum bp_result construct_integrated_info(
info->disp_clk_voltage[j-1].max_supported_clk
) {
/* swap j and j - 1*/
-   temp = info->disp_clk_voltage[j-1];
-   info->disp_clk_voltage[j-1] =
-   info->disp_clk_voltage[j];
-   info->disp_clk_voltage[j] = temp;
+   swap(info->disp_clk_voltage[j - 1],
+info->disp_clk_voltage[j]);
}
}
}
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 5d1adeda4d90..fb6a7288caf4 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -901,15 +901,11 @@ static void program_timing_sync(
 
/* set first pipe with plane as master */
for (j = 0; j < group_size; j++) {
-   struct pipe_ctx *temp;
-
if (pipe_set[j]->plane_state) {
if (j == 0)
break;
 
-   temp = pipe_set[0];
-   pipe_set[0] = pipe_set[j];
-   pipe_set[j] = temp;
+   swap(pipe_set[0], pipe_set[j]);
break;
}
}
-- 
2.21.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

[PATCH 3/4] drm/radeon: Use drm_hdmi_avi_infoframe_quant_range()

2019-01-08 Thread Ville Syrjala
From: Ville Syrjälä 

Fill out the AVI infoframe quantization range bits using
drm_hdmi_avi_infoframe_quant_range() instead of hand rolling it.

This changes the behaviour slightly as
drm_hdmi_avi_infoframe_quant_range() will set a non-zero Q bit
even when QS==0 iff the Q bit matched the default quantization
range for the given mode. This matches the recommendation in
HDMI 2.0 and is allowed even before that.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
Acked-by: Alex Deucher 
---
 drivers/gpu/drm/radeon/radeon_audio.c | 13 +
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_audio.c 
b/drivers/gpu/drm/radeon/radeon_audio.c
index 5a7d48339b32..708765bf9e66 100644
--- a/drivers/gpu/drm/radeon/radeon_audio.c
+++ b/drivers/gpu/drm/radeon/radeon_audio.c
@@ -523,14 +523,11 @@ static int radeon_audio_set_avi_packet(struct drm_encoder 
*encoder,
}
 
if (radeon_encoder->output_csc != RADEON_OUTPUT_CSC_BYPASS) {
-   if 
(drm_rgb_quant_range_selectable(radeon_connector_edid(connector))) {
-   if (radeon_encoder->output_csc == 
RADEON_OUTPUT_CSC_TVRGB)
-   frame.quantization_range = 
HDMI_QUANTIZATION_RANGE_LIMITED;
-   else
-   frame.quantization_range = 
HDMI_QUANTIZATION_RANGE_FULL;
-   } else {
-   frame.quantization_range = 
HDMI_QUANTIZATION_RANGE_DEFAULT;
-   }
+   drm_hdmi_avi_infoframe_quant_range(, connector, mode,
+  radeon_encoder->output_csc 
== RADEON_OUTPUT_CSC_TVRGB ?
+  
HDMI_QUANTIZATION_RANGE_LIMITED :
+  HDMI_QUANTIZATION_RANGE_FULL,
+  
drm_rgb_quant_range_selectable(radeon_connector_edid(connector)));
}
 
err = hdmi_avi_infoframe_pack(, buffer, sizeof(buffer));
-- 
2.19.2

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 1/4] drm/edid: Pass connector to AVI infoframe functions

2019-01-08 Thread Ville Syrjala
From: Ville Syrjälä 

Make life easier for drivers by simply passing the connector
to drm_hdmi_avi_infoframe_from_display_mode() and
drm_hdmi_avi_infoframe_quant_range(). That way drivers don't
need to worry about is_hdmi2_sink mess.

v2: Make is_hdmi2_sink() return true for sil-sii8620
Adapt to omap/vc4 changes

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Archit Taneja 
Cc: Andrzej Hajda 
Cc: Laurent Pinchart 
Cc: Inki Dae 
Cc: Joonyoung Shim 
Cc: Seung-Woo Kim 
Cc: Kyungmin Park 
Cc: Russell King 
Cc: CK Hu 
Cc: Philipp Zabel 
Cc: Rob Clark 
Cc: Ben Skeggs 
Cc: Tomi Valkeinen 
Cc: Sandy Huang 
Cc: "Heiko Stübner" 
Cc: Benjamin Gaignard 
Cc: Vincent Abriou 
Cc: Thierry Reding 
Cc: Eric Anholt 
Cc: Shawn Guo 
Cc: Ilia Mirkin 
Cc: amd-gfx@lists.freedesktop.org
Cc: linux-arm-...@vger.kernel.org
Cc: freedr...@lists.freedesktop.org
Cc: nouv...@lists.freedesktop.org
Cc: linux-te...@vger.kernel.org
Signed-off-by: Ville Syrjälä 
Acked-by: Thierry Reding 
Acked-by: Russell King 
Reviewed-by: Laurent Pinchart 
Reviewed-by: Jani Nikula 
---
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c|  2 +-
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c|  2 +-
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c |  3 ++-
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c |  2 +-
 drivers/gpu/drm/bridge/analogix-anx78xx.c |  5 ++--
 drivers/gpu/drm/bridge/sii902x.c  |  3 ++-
 drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +--
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  3 ++-
 drivers/gpu/drm/drm_edid.c| 33 ++-
 drivers/gpu/drm/exynos/exynos_hdmi.c  |  3 ++-
 drivers/gpu/drm/i2c/tda998x_drv.c |  3 ++-
 drivers/gpu/drm/i915/intel_hdmi.c | 14 +-
 drivers/gpu/drm/i915/intel_lspcon.c   | 15 ++-
 drivers/gpu/drm/i915/intel_sdvo.c | 10 ---
 drivers/gpu/drm/mediatek/mtk_hdmi.c   |  3 ++-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c|  3 ++-
 drivers/gpu/drm/nouveau/dispnv50/disp.c   |  7 +++--
 drivers/gpu/drm/omapdrm/omap_encoder.c|  4 +--
 drivers/gpu/drm/radeon/radeon_audio.c |  2 +-
 drivers/gpu/drm/rockchip/inno_hdmi.c  |  4 ++-
 drivers/gpu/drm/sti/sti_hdmi.c|  3 ++-
 drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c|  3 ++-
 drivers/gpu/drm/tegra/hdmi.c  |  3 ++-
 drivers/gpu/drm/tegra/sor.c   |  3 ++-
 drivers/gpu/drm/vc4/vc4_hdmi.c|  9 ---
 drivers/gpu/drm/zte/zx_hdmi.c |  4 ++-
 include/drm/drm_edid.h|  8 +++---
 27 files changed, 91 insertions(+), 66 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index 4cfecdce29a3..1f0426d2fc2a 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -1682,7 +1682,7 @@ static void dce_v10_0_afmt_setmode(struct drm_encoder 
*encoder,
dce_v10_0_audio_write_sad_regs(encoder);
dce_v10_0_audio_write_latency_fields(encoder, mode);
 
-   err = drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
+   err = drm_hdmi_avi_infoframe_from_display_mode(, connector, mode);
if (err < 0) {
DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
return;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index 7c868916d90f..2280b971d758 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -1724,7 +1724,7 @@ static void dce_v11_0_afmt_setmode(struct drm_encoder 
*encoder,
dce_v11_0_audio_write_sad_regs(encoder);
dce_v11_0_audio_write_latency_fields(encoder, mode);
 
-   err = drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
+   err = drm_hdmi_avi_infoframe_from_display_mode(, connector, mode);
if (err < 0) {
DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
return;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c 
b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
index 17eaaba36017..db443ec53d3a 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -1423,6 +1423,7 @@ static void dce_v6_0_audio_set_avi_infoframe(struct 
drm_encoder *encoder,
struct amdgpu_device *adev = dev->dev_private;
struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
+   struct drm_connector *connector = 
amdgpu_get_connector_for_encoder(encoder);
struct hdmi_avi_infoframe frame;
u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
uint8_t *payload = buffer + 3;
@@ -1430,7 +1431,7 @@ static void dce_v6_0_audio_set_avi_infoframe(struct 
drm_encoder *encoder,
ssize_t err;
u32 tmp;
 
-   err = drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
+   err = drm_hdmi_avi_infoframe_from_display_mode(, connector, 

[PATCH 4/4] drm/edid: Add display_info.rgb_quant_range_selectable

2019-01-08 Thread Ville Syrjala
From: Ville Syrjälä 

Move the CEA-861 QS bit handling entirely into the edid code. No
need to bother the drivers with this.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: amd-gfx@lists.freedesktop.org
Cc: Eric Anholt  (supporter:DRM DRIVERS FOR VC4)
Signed-off-by: Ville Syrjälä 
Acked-by: Alex Deucher 
Acked-by: Eric Anholt 
---
 drivers/gpu/drm/drm_edid.c| 70 ---
 drivers/gpu/drm/i915/intel_drv.h  |  1 -
 drivers/gpu/drm/i915/intel_hdmi.c |  8 +--
 drivers/gpu/drm/i915/intel_lspcon.c   |  3 +-
 drivers/gpu/drm/i915/intel_sdvo.c |  7 +--
 drivers/gpu/drm/radeon/radeon_audio.c |  3 +-
 drivers/gpu/drm/vc4/vc4_hdmi.c|  9 +---
 include/drm/drm_connector.h   |  6 +++
 include/drm/drm_edid.h|  4 +-
 9 files changed, 43 insertions(+), 68 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index cd25bd08bf53..990b1909f9d7 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3641,6 +3641,20 @@ static bool cea_db_is_hdmi_forum_vsdb(const u8 *db)
return oui == HDMI_FORUM_IEEE_OUI;
 }
 
+static bool cea_db_is_vcdb(const u8 *db)
+{
+   if (cea_db_tag(db) != USE_EXTENDED_TAG)
+   return false;
+
+   if (cea_db_payload_len(db) != 2)
+   return false;
+
+   if (cea_db_extended_tag(db) != EXT_VIDEO_CAPABILITY_BLOCK)
+   return false;
+
+   return true;
+}
+
 static bool cea_db_is_y420cmdb(const u8 *db)
 {
if (cea_db_tag(db) != USE_EXTENDED_TAG)
@@ -4223,41 +4237,6 @@ bool drm_detect_monitor_audio(struct edid *edid)
 }
 EXPORT_SYMBOL(drm_detect_monitor_audio);
 
-/**
- * drm_rgb_quant_range_selectable - is RGB quantization range selectable?
- * @edid: EDID block to scan
- *
- * Check whether the monitor reports the RGB quantization range selection
- * as supported. The AVI infoframe can then be used to inform the monitor
- * which quantization range (full or limited) is used.
- *
- * Return: True if the RGB quantization range is selectable, false otherwise.
- */
-bool drm_rgb_quant_range_selectable(struct edid *edid)
-{
-   u8 *edid_ext;
-   int i, start, end;
-
-   edid_ext = drm_find_cea_extension(edid);
-   if (!edid_ext)
-   return false;
-
-   if (cea_db_offsets(edid_ext, , ))
-   return false;
-
-   for_each_cea_db(edid_ext, i, start, end) {
-   if (cea_db_tag(_ext[i]) == USE_EXTENDED_TAG &&
-   cea_db_payload_len(_ext[i]) == 2 &&
-   cea_db_extended_tag(_ext[i]) ==
-   EXT_VIDEO_CAPABILITY_BLOCK) {
-   DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]);
-   return edid_ext[i + 2] & EDID_CEA_VCDB_QS;
-   }
-   }
-
-   return false;
-}
-EXPORT_SYMBOL(drm_rgb_quant_range_selectable);
 
 /**
  * drm_default_rgb_quant_range - default RGB quantization range
@@ -4278,6 +4257,16 @@ drm_default_rgb_quant_range(const struct 
drm_display_mode *mode)
 }
 EXPORT_SYMBOL(drm_default_rgb_quant_range);
 
+static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db)
+{
+   struct drm_display_info *info = >display_info;
+
+   DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", db[2]);
+
+   if (db[2] & EDID_CEA_VCDB_QS)
+   info->rgb_quant_range_selectable = true;
+}
+
 static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector,
   const u8 *db)
 {
@@ -4452,6 +4441,8 @@ static void drm_parse_cea_ext(struct drm_connector 
*connector,
drm_parse_hdmi_forum_vsdb(connector, db);
if (cea_db_is_y420cmdb(db))
drm_parse_y420cmdb_bitmap(connector, db);
+   if (cea_db_is_vcdb(db))
+   drm_parse_vcdb(connector, db);
}
 }
 
@@ -4472,6 +4463,7 @@ drm_reset_display_info(struct drm_connector *connector)
info->max_tmds_clock = 0;
info->dvi_dual = false;
info->has_hdmi_infoframe = false;
+   info->rgb_quant_range_selectable = false;
memset(>hdmi, 0, sizeof(info->hdmi));
 
info->non_desktop = 0;
@@ -4939,15 +4931,15 @@ EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
  * @connector: the connector
  * @mode: DRM display mode
  * @rgb_quant_range: RGB quantization range (Q)
- * @rgb_quant_range_selectable: Sink support selectable RGB quantization range 
(QS)
  */
 void
 drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
   struct drm_connector *connector,
   const struct drm_display_mode *mode,
-  enum hdmi_quantization_range rgb_quant_range,
-  bool rgb_quant_range_selectable)
+  enum hdmi_quantization_range rgb_quant_range)
 {
+   const 

[PATCH 3/4] drm/radeon: Use drm_hdmi_avi_infoframe_quant_range()

2018-11-20 Thread Ville Syrjala
From: Ville Syrjälä 

Fill out the AVI infoframe quantization range bits using
drm_hdmi_avi_infoframe_quant_range() instead of hand rolling it.

This changes the behaviour slightly as
drm_hdmi_avi_infoframe_quant_range() will set a non-zero Q bit
even when QS==0 iff the Q bit matched the default quantization
range for the given mode. This matches the recommendation in
HDMI 2.0 and is allowed even before that.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/radeon/radeon_audio.c | 13 +
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_audio.c 
b/drivers/gpu/drm/radeon/radeon_audio.c
index 5a7d48339b32..708765bf9e66 100644
--- a/drivers/gpu/drm/radeon/radeon_audio.c
+++ b/drivers/gpu/drm/radeon/radeon_audio.c
@@ -523,14 +523,11 @@ static int radeon_audio_set_avi_packet(struct drm_encoder 
*encoder,
}
 
if (radeon_encoder->output_csc != RADEON_OUTPUT_CSC_BYPASS) {
-   if 
(drm_rgb_quant_range_selectable(radeon_connector_edid(connector))) {
-   if (radeon_encoder->output_csc == 
RADEON_OUTPUT_CSC_TVRGB)
-   frame.quantization_range = 
HDMI_QUANTIZATION_RANGE_LIMITED;
-   else
-   frame.quantization_range = 
HDMI_QUANTIZATION_RANGE_FULL;
-   } else {
-   frame.quantization_range = 
HDMI_QUANTIZATION_RANGE_DEFAULT;
-   }
+   drm_hdmi_avi_infoframe_quant_range(, connector, mode,
+  radeon_encoder->output_csc 
== RADEON_OUTPUT_CSC_TVRGB ?
+  
HDMI_QUANTIZATION_RANGE_LIMITED :
+  HDMI_QUANTIZATION_RANGE_FULL,
+  
drm_rgb_quant_range_selectable(radeon_connector_edid(connector)));
}
 
err = hdmi_avi_infoframe_pack(, buffer, sizeof(buffer));
-- 
2.18.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 4/4] drm/edid: Add display_info.rgb_quant_range_selectable

2018-11-20 Thread Ville Syrjala
From: Ville Syrjälä 

Move the CEA-861 QS bit handling entirely into the edid code. No
need to bother the drivers with this.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: amd-gfx@lists.freedesktop.org
Cc: Eric Anholt  (supporter:DRM DRIVERS FOR VC4)
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c| 70 ---
 drivers/gpu/drm/i915/intel_drv.h  |  1 -
 drivers/gpu/drm/i915/intel_hdmi.c |  8 +--
 drivers/gpu/drm/i915/intel_lspcon.c   |  3 +-
 drivers/gpu/drm/i915/intel_sdvo.c |  7 +--
 drivers/gpu/drm/radeon/radeon_audio.c |  3 +-
 drivers/gpu/drm/vc4/vc4_hdmi.c|  9 +---
 include/drm/drm_connector.h   |  6 +++
 include/drm/drm_edid.h|  4 +-
 9 files changed, 43 insertions(+), 68 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 501ac05ba7da..cbee2f745548 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3641,6 +3641,20 @@ static bool cea_db_is_hdmi_forum_vsdb(const u8 *db)
return oui == HDMI_FORUM_IEEE_OUI;
 }
 
+static bool cea_db_is_vcdb(const u8 *db)
+{
+   if (cea_db_tag(db) != USE_EXTENDED_TAG)
+   return false;
+
+   if (cea_db_payload_len(db) != 2)
+   return false;
+
+   if (cea_db_extended_tag(db) != EXT_VIDEO_CAPABILITY_BLOCK)
+   return false;
+
+   return true;
+}
+
 static bool cea_db_is_y420cmdb(const u8 *db)
 {
if (cea_db_tag(db) != USE_EXTENDED_TAG)
@@ -4223,41 +4237,6 @@ bool drm_detect_monitor_audio(struct edid *edid)
 }
 EXPORT_SYMBOL(drm_detect_monitor_audio);
 
-/**
- * drm_rgb_quant_range_selectable - is RGB quantization range selectable?
- * @edid: EDID block to scan
- *
- * Check whether the monitor reports the RGB quantization range selection
- * as supported. The AVI infoframe can then be used to inform the monitor
- * which quantization range (full or limited) is used.
- *
- * Return: True if the RGB quantization range is selectable, false otherwise.
- */
-bool drm_rgb_quant_range_selectable(struct edid *edid)
-{
-   u8 *edid_ext;
-   int i, start, end;
-
-   edid_ext = drm_find_cea_extension(edid);
-   if (!edid_ext)
-   return false;
-
-   if (cea_db_offsets(edid_ext, , ))
-   return false;
-
-   for_each_cea_db(edid_ext, i, start, end) {
-   if (cea_db_tag(_ext[i]) == USE_EXTENDED_TAG &&
-   cea_db_payload_len(_ext[i]) == 2 &&
-   cea_db_extended_tag(_ext[i]) ==
-   EXT_VIDEO_CAPABILITY_BLOCK) {
-   DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]);
-   return edid_ext[i + 2] & EDID_CEA_VCDB_QS;
-   }
-   }
-
-   return false;
-}
-EXPORT_SYMBOL(drm_rgb_quant_range_selectable);
 
 /**
  * drm_default_rgb_quant_range - default RGB quantization range
@@ -4278,6 +4257,16 @@ drm_default_rgb_quant_range(const struct 
drm_display_mode *mode)
 }
 EXPORT_SYMBOL(drm_default_rgb_quant_range);
 
+static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db)
+{
+   struct drm_display_info *info = >display_info;
+
+   DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", db[2]);
+
+   if (db[2] & EDID_CEA_VCDB_QS)
+   info->rgb_quant_range_selectable = true;
+}
+
 static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector,
   const u8 *db)
 {
@@ -4452,6 +4441,8 @@ static void drm_parse_cea_ext(struct drm_connector 
*connector,
drm_parse_hdmi_forum_vsdb(connector, db);
if (cea_db_is_y420cmdb(db))
drm_parse_y420cmdb_bitmap(connector, db);
+   if (cea_db_is_vcdb(db))
+   drm_parse_vcdb(connector, db);
}
 }
 
@@ -4472,6 +4463,7 @@ drm_reset_display_info(struct drm_connector *connector)
info->max_tmds_clock = 0;
info->dvi_dual = false;
info->has_hdmi_infoframe = false;
+   info->rgb_quant_range_selectable = false;
memset(>hdmi, 0, sizeof(info->hdmi));
 
info->non_desktop = 0;
@@ -4939,15 +4931,15 @@ EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
  * @connector: the connector
  * @mode: DRM display mode
  * @rgb_quant_range: RGB quantization range (Q)
- * @rgb_quant_range_selectable: Sink support selectable RGB quantization range 
(QS)
  */
 void
 drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
   struct drm_connector *connector,
   const struct drm_display_mode *mode,
-  enum hdmi_quantization_range rgb_quant_range,
-  bool rgb_quant_range_selectable)
+  enum hdmi_quantization_range rgb_quant_range)
 {
+   const struct drm_display_info *info = >display_info;
+
   

[PATCH 1/4] drm/edid: Pass connector to AVI inforframe functions

2018-11-20 Thread Ville Syrjala
From: Ville Syrjälä 

Make life easier for drivers by simply passing the connector
to drm_hdmi_avi_infoframe_from_display_mode() and
drm_hdmi_avi_infoframe_quant_range(). That way drivers don't
need to worry about is_hdmi2_sink mess.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Archit Taneja 
Cc: Andrzej Hajda 
Cc: Laurent Pinchart 
Cc: Inki Dae 
Cc: Joonyoung Shim 
Cc: Seung-Woo Kim 
Cc: Kyungmin Park 
Cc: Russell King 
Cc: CK Hu 
Cc: Philipp Zabel 
Cc: Rob Clark 
Cc: Ben Skeggs 
Cc: Tomi Valkeinen 
Cc: Sandy Huang 
Cc: "Heiko Stübner" 
Cc: Benjamin Gaignard 
Cc: Vincent Abriou 
Cc: Thierry Reding 
Cc: Eric Anholt 
Cc: Shawn Guo 
Cc: Ilia Mirkin 
Cc: amd-gfx@lists.freedesktop.org
Cc: linux-arm-...@vger.kernel.org
Cc: freedr...@lists.freedesktop.org
Cc: nouv...@lists.freedesktop.org
Cc: linux-te...@vger.kernel.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c|  2 +-
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c|  2 +-
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c |  3 ++-
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c |  2 +-
 drivers/gpu/drm/bridge/analogix-anx78xx.c |  5 ++--
 drivers/gpu/drm/bridge/sii902x.c  |  3 ++-
 drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +--
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  3 ++-
 drivers/gpu/drm/drm_edid.c| 33 ++-
 drivers/gpu/drm/exynos/exynos_hdmi.c  |  3 ++-
 drivers/gpu/drm/i2c/tda998x_drv.c |  3 ++-
 drivers/gpu/drm/i915/intel_hdmi.c | 14 +-
 drivers/gpu/drm/i915/intel_lspcon.c   | 15 ++-
 drivers/gpu/drm/i915/intel_sdvo.c | 10 ---
 drivers/gpu/drm/mediatek/mtk_hdmi.c   |  3 ++-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c|  3 ++-
 drivers/gpu/drm/nouveau/dispnv50/disp.c   |  7 +++--
 drivers/gpu/drm/omapdrm/omap_encoder.c|  5 ++--
 drivers/gpu/drm/radeon/radeon_audio.c |  2 +-
 drivers/gpu/drm/rockchip/inno_hdmi.c  |  4 ++-
 drivers/gpu/drm/sti/sti_hdmi.c|  3 ++-
 drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c|  3 ++-
 drivers/gpu/drm/tegra/hdmi.c  |  3 ++-
 drivers/gpu/drm/tegra/sor.c   |  3 ++-
 drivers/gpu/drm/vc4/vc4_hdmi.c| 11 +---
 drivers/gpu/drm/zte/zx_hdmi.c |  4 ++-
 include/drm/drm_edid.h|  8 +++---
 27 files changed, 94 insertions(+), 66 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index 4cfecdce29a3..1f0426d2fc2a 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -1682,7 +1682,7 @@ static void dce_v10_0_afmt_setmode(struct drm_encoder 
*encoder,
dce_v10_0_audio_write_sad_regs(encoder);
dce_v10_0_audio_write_latency_fields(encoder, mode);
 
-   err = drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
+   err = drm_hdmi_avi_infoframe_from_display_mode(, connector, mode);
if (err < 0) {
DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
return;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index 7c868916d90f..2280b971d758 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -1724,7 +1724,7 @@ static void dce_v11_0_afmt_setmode(struct drm_encoder 
*encoder,
dce_v11_0_audio_write_sad_regs(encoder);
dce_v11_0_audio_write_latency_fields(encoder, mode);
 
-   err = drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
+   err = drm_hdmi_avi_infoframe_from_display_mode(, connector, mode);
if (err < 0) {
DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
return;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c 
b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
index 17eaaba36017..db443ec53d3a 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -1423,6 +1423,7 @@ static void dce_v6_0_audio_set_avi_infoframe(struct 
drm_encoder *encoder,
struct amdgpu_device *adev = dev->dev_private;
struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
+   struct drm_connector *connector = 
amdgpu_get_connector_for_encoder(encoder);
struct hdmi_avi_infoframe frame;
u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
uint8_t *payload = buffer + 3;
@@ -1430,7 +1431,7 @@ static void dce_v6_0_audio_set_avi_infoframe(struct 
drm_encoder *encoder,
ssize_t err;
u32 tmp;
 
-   err = drm_hdmi_avi_infoframe_from_display_mode(, mode, false);
+   err = drm_hdmi_avi_infoframe_from_display_mode(, connector, mode);
if (err < 0) {
DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
return;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c 

[PATCH v2 6/9] drm/radeon: Use drm_connector_for_each_possible_encoder()

2018-06-28 Thread Ville Syrjala
From: Ville Syrjälä 

Use drm_connector_for_each_possible_encoder() for iterating
connector->encoder_ids[]. A bit more convenient not having
to deal with the implementation details.

v2: Replace drm_for_each_connector_encoder_ids() with
drm_connector_for_each_possible_encoder() (Daniel)

Cc: Daniel Vetter 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
Reviewed-by: Alex Deucher  #v1
---
 drivers/gpu/drm/radeon/radeon_connectors.c | 90 +-
 1 file changed, 26 insertions(+), 64 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c 
b/drivers/gpu/drm/radeon/radeon_connectors.c
index 2aea2bdff99b..0655698f2956 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -244,23 +244,15 @@ radeon_connector_update_scratch_regs(struct drm_connector 
*connector, enum drm_c
 {
struct drm_device *dev = connector->dev;
struct radeon_device *rdev = dev->dev_private;
-   struct drm_encoder *best_encoder = NULL;
-   struct drm_encoder *encoder = NULL;
+   struct drm_encoder *best_encoder;
+   struct drm_encoder *encoder;
const struct drm_connector_helper_funcs *connector_funcs = 
connector->helper_private;
bool connected;
int i;
 
best_encoder = connector_funcs->best_encoder(connector);
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL,
-  connector->encoder_ids[i]);
-   if (!encoder)
-   continue;
-
+   drm_connector_for_each_possible_encoder(connector, encoder, i) {
if ((encoder == best_encoder) && (status == 
connector_status_connected))
connected = true;
else
@@ -270,7 +262,6 @@ radeon_connector_update_scratch_regs(struct drm_connector 
*connector, enum drm_c
radeon_atombios_connected_scratch_regs(connector, 
encoder, connected);
else
radeon_combios_connected_scratch_regs(connector, 
encoder, connected);
-
}
 }
 
@@ -279,17 +270,11 @@ static struct drm_encoder *radeon_find_encoder(struct 
drm_connector *connector,
struct drm_encoder *encoder;
int i;
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL, 
connector->encoder_ids[i]);
-   if (!encoder)
-   continue;
-
+   drm_connector_for_each_possible_encoder(connector, encoder, i) {
if (encoder->encoder_type == encoder_type)
return encoder;
}
+
return NULL;
 }
 
@@ -393,10 +378,13 @@ static int radeon_ddc_get_modes(struct drm_connector 
*connector)
 
 static struct drm_encoder *radeon_best_single_encoder(struct drm_connector 
*connector)
 {
-   int enc_id = connector->encoder_ids[0];
-   /* pick the encoder ids */
-   if (enc_id)
-   return drm_encoder_find(connector->dev, NULL, enc_id);
+   struct drm_encoder *encoder;
+   int i;
+
+   /* pick the first one */
+   drm_connector_for_each_possible_encoder(connector, encoder, i)
+   return encoder;
+
return NULL;
 }
 
@@ -436,19 +424,19 @@ radeon_connector_analog_encoder_conflict_solve(struct 
drm_connector *connector,
struct drm_device *dev = connector->dev;
struct drm_connector *conflict;
struct radeon_connector *radeon_conflict;
-   int i;
 
list_for_each_entry(conflict, >mode_config.connector_list, head) {
+   struct drm_encoder *enc;
+   int i;
+
if (conflict == connector)
continue;
 
radeon_conflict = to_radeon_connector(conflict);
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (conflict->encoder_ids[i] == 0)
-   break;
 
+   drm_connector_for_each_possible_encoder(conflict, enc, i) {
/* if the IDs match */
-   if (conflict->encoder_ids[i] == encoder->base.id) {
+   if (enc == encoder) {
if (conflict->status != 
connector_status_connected)
continue;
 
@@ -1256,7 +1244,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool 
force)
struct radeon_connector *radeon_connector = 
to_radeon_connector(connector);
struct drm_encoder *encoder = NULL;
const struct drm_encoder_helper_funcs *encoder_funcs;
-   int i, r;
+  

[PATCH v2 4/9] drm/amdgpu: Use drm_connector_for_each_possible_encoder()

2018-06-28 Thread Ville Syrjala
From: Ville Syrjälä 

Use drm_connector_for_each_possible_encoder() for iterating
connector->encoder_ids[]. A bit more convenient not having
to deal with the implementation details.

v2: Replace drm_for_each_connector_encoder_ids() with
drm_connector_for_each_possible_encoder() (Daniel)

Cc: Daniel Vetter 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
Reviewed-by: Alex Deucher  #v1
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 81 +++---
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 15 ++---
 2 files changed, 25 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index 8e66851eb427..881f7cb7ae6e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -212,30 +212,21 @@ static void
 amdgpu_connector_update_scratch_regs(struct drm_connector *connector,
  enum drm_connector_status status)
 {
-   struct drm_encoder *best_encoder = NULL;
-   struct drm_encoder *encoder = NULL;
+   struct drm_encoder *best_encoder;
+   struct drm_encoder *encoder;
const struct drm_connector_helper_funcs *connector_funcs = 
connector->helper_private;
bool connected;
int i;
 
best_encoder = connector_funcs->best_encoder(connector);
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL,
-   connector->encoder_ids[i]);
-   if (!encoder)
-   continue;
-
+   drm_connector_for_each_possible_encoder(connector, encoder, i) {
if ((encoder == best_encoder) && (status == 
connector_status_connected))
connected = true;
else
connected = false;
 
amdgpu_atombios_encoder_set_bios_scratch_regs(connector, 
encoder, connected);
-
}
 }
 
@@ -246,17 +237,11 @@ amdgpu_connector_find_encoder(struct drm_connector 
*connector,
struct drm_encoder *encoder;
int i;
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-   encoder = drm_encoder_find(connector->dev, NULL,
-   connector->encoder_ids[i]);
-   if (!encoder)
-   continue;
-
+   drm_connector_for_each_possible_encoder(connector, encoder, i) {
if (encoder->encoder_type == encoder_type)
return encoder;
}
+
return NULL;
 }
 
@@ -360,11 +345,13 @@ static int amdgpu_connector_ddc_get_modes(struct 
drm_connector *connector)
 static struct drm_encoder *
 amdgpu_connector_best_single_encoder(struct drm_connector *connector)
 {
-   int enc_id = connector->encoder_ids[0];
+   struct drm_encoder *encoder;
+   int i;
+
+   /* pick the first one */
+   drm_connector_for_each_possible_encoder(connector, encoder, i)
+   return encoder;
 
-   /* pick the encoder ids */
-   if (enc_id)
-   return drm_encoder_find(connector->dev, NULL, enc_id);
return NULL;
 }
 
@@ -985,9 +972,8 @@ amdgpu_connector_dvi_detect(struct drm_connector 
*connector, bool force)
struct drm_device *dev = connector->dev;
struct amdgpu_device *adev = dev->dev_private;
struct amdgpu_connector *amdgpu_connector = 
to_amdgpu_connector(connector);
-   struct drm_encoder *encoder = NULL;
const struct drm_encoder_helper_funcs *encoder_funcs;
-   int i, r;
+   int r;
enum drm_connector_status ret = connector_status_disconnected;
bool dret = false, broken_edid = false;
 
@@ -1077,14 +1063,10 @@ amdgpu_connector_dvi_detect(struct drm_connector 
*connector, bool force)
 
/* find analog encoder */
if (amdgpu_connector->dac_load_detect) {
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL, 
connector->encoder_ids[i]);
-   if (!encoder)
-   continue;
+   struct drm_encoder *encoder;
+   int i;
 
+   drm_connector_for_each_possible_encoder(connector, encoder, i) {
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
continue;
@@ -1132,18 +1114,11 @@ amdgpu_connector_dvi_detect(struct 

[PATCH v2 0/9] drm: Third attempt at fixing the fb-helper .best_encoder() mess

2018-06-28 Thread Ville Syrjala
From: Ville Syrjälä 

Changes from the previous version mainly involve Danoie's suggestion
of hiding the drm_encoder_find() in the iterator macro. I also polished
the msm and tilcdc cases a bit more with another small helper.

Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Cc: Ben Skeggs 
Cc: "Christian König" 
Cc: Daniel Vetter 
Cc: "David (ChunMing) Zhou" 
Cc: Dhinakaran Pandiyan 
Cc: freedr...@lists.freedesktop.org
Cc: Harry Wentland 
Cc: Jyri Sarha 
Cc: linux-arm-...@vger.kernel.org
Cc: nouv...@lists.freedesktop.org
Cc: Rob Clark 
Cc: Tomi Valkeinen 

Ville Syrjälä (9):
  drm/fb-helper: Eliminate the .best_encoder() usage
  drm/i915: Nuke intel_mst_best_encoder()
  drm: Add drm_connector_for_each_possible_encoder()
  drm/amdgpu: Use drm_connector_for_each_possible_encoder()
  drm/nouveau: Use drm_connector_for_each_possible_encoder()
  drm/radeon: Use drm_connector_for_each_possible_encoder()
  drm: Add drm_connector_has_possible_encoder()
  drm/msm: Use drm_connector_has_possible_encoder()
  drm/tilcdc: Use drm_connector_has_possible_encoder()

 drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 81 ++-
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 15 ++---
 drivers/gpu/drm/drm_connector.c| 44 +
 drivers/gpu/drm/drm_fb_helper.c| 34 +-
 drivers/gpu/drm/drm_probe_helper.c | 10 +--
 drivers/gpu/drm/i915/intel_dp_mst.c| 10 ---
 drivers/gpu/drm/msm/dsi/dsi_manager.c  |  8 +--
 drivers/gpu/drm/nouveau/nouveau_connector.c| 21 +-
 drivers/gpu/drm/radeon/radeon_connectors.c | 90 --
 drivers/gpu/drm/tilcdc/tilcdc_external.c   |  9 ++-
 include/drm/drm_connector.h| 16 +
 11 files changed, 128 insertions(+), 210 deletions(-)

-- 
2.16.4

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 4/8] drm/amdgpu: Use drm_for_each_connector_encoder_ids()

2018-06-26 Thread Ville Syrjala
From: Ville Syrjälä 

Use drm_for_each_connector_encoder_ids() for iterating
connector->encoder_ids[]. A bit more convenient not having
to deal with the implementation details.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 51 ++
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 15 
 2 files changed, 27 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index 8e66851eb427..dcbe45f6d941 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -216,16 +216,13 @@ amdgpu_connector_update_scratch_regs(struct drm_connector 
*connector,
struct drm_encoder *encoder = NULL;
const struct drm_connector_helper_funcs *connector_funcs = 
connector->helper_private;
bool connected;
+   u32 encoder_id;
int i;
 
best_encoder = connector_funcs->best_encoder(connector);
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL,
-   connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, encoder_id);
if (!encoder)
continue;
 
@@ -244,13 +241,11 @@ amdgpu_connector_find_encoder(struct drm_connector 
*connector,
   int encoder_type)
 {
struct drm_encoder *encoder;
+   u32 encoder_id;
int i;
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-   encoder = drm_encoder_find(connector->dev, NULL,
-   connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, encoder_id);
if (!encoder)
continue;
 
@@ -987,7 +982,7 @@ amdgpu_connector_dvi_detect(struct drm_connector 
*connector, bool force)
struct amdgpu_connector *amdgpu_connector = 
to_amdgpu_connector(connector);
struct drm_encoder *encoder = NULL;
const struct drm_encoder_helper_funcs *encoder_funcs;
-   int i, r;
+   int r;
enum drm_connector_status ret = connector_status_disconnected;
bool dret = false, broken_edid = false;
 
@@ -1077,11 +1072,11 @@ amdgpu_connector_dvi_detect(struct drm_connector 
*connector, bool force)
 
/* find analog encoder */
if (amdgpu_connector->dac_load_detect) {
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
+   u32 encoder_id;
+   int i;
 
-   encoder = drm_encoder_find(connector->dev, NULL, 
connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, 
encoder_id);
if (!encoder)
continue;
 
@@ -1135,12 +1130,11 @@ amdgpu_connector_dvi_encoder(struct drm_connector 
*connector)
int enc_id = connector->encoder_ids[0];
struct amdgpu_connector *amdgpu_connector = 
to_amdgpu_connector(connector);
struct drm_encoder *encoder;
+   u32 encoder_id;
int i;
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
 
-   encoder = drm_encoder_find(connector->dev, NULL, 
connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, encoder_id);
if (!encoder)
continue;
 
@@ -1294,14 +1288,11 @@ u16 
amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
 {
struct drm_encoder *encoder;
struct amdgpu_encoder *amdgpu_encoder;
+   u32 encoder_id;
int i;
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL,
-   connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, encoder_id);
if (!encoder)
 

[PATCH 7/8] drm/radeon: Use drm_for_each_connector_encoder_ids()

2018-06-26 Thread Ville Syrjala
From: Ville Syrjälä 

Use drm_for_each_connector_encoder_ids() for iterating
connector->encoder_ids[]. A bit more convenient not having
to deal with the implementation details.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/radeon/radeon_connectors.c | 63 --
 1 file changed, 26 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c 
b/drivers/gpu/drm/radeon/radeon_connectors.c
index 2aea2bdff99b..7fc7e72a075f 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -248,16 +248,13 @@ radeon_connector_update_scratch_regs(struct drm_connector 
*connector, enum drm_c
struct drm_encoder *encoder = NULL;
const struct drm_connector_helper_funcs *connector_funcs = 
connector->helper_private;
bool connected;
+   u32 encoder_id;
int i;
 
best_encoder = connector_funcs->best_encoder(connector);
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL,
-  connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, encoder_id);
if (!encoder)
continue;
 
@@ -277,13 +274,11 @@ radeon_connector_update_scratch_regs(struct drm_connector 
*connector, enum drm_c
 static struct drm_encoder *radeon_find_encoder(struct drm_connector 
*connector, int encoder_type)
 {
struct drm_encoder *encoder;
+   u32 encoder_id;
int i;
 
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
-
-   encoder = drm_encoder_find(connector->dev, NULL, 
connector->encoder_ids[i]);
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
+   encoder = drm_encoder_find(connector->dev, NULL, encoder_id);
if (!encoder)
continue;
 
@@ -436,6 +431,7 @@ radeon_connector_analog_encoder_conflict_solve(struct 
drm_connector *connector,
struct drm_device *dev = connector->dev;
struct drm_connector *conflict;
struct radeon_connector *radeon_conflict;
+   u32 encoder_id;
int i;
 
list_for_each_entry(conflict, >mode_config.connector_list, head) {
@@ -443,12 +439,10 @@ radeon_connector_analog_encoder_conflict_solve(struct 
drm_connector *connector,
continue;
 
radeon_conflict = to_radeon_connector(conflict);
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (conflict->encoder_ids[i] == 0)
-   break;
 
+   drm_for_each_connector_encoder_ids(conflict, encoder_id, i) {
/* if the IDs match */
-   if (conflict->encoder_ids[i] == encoder->base.id) {
+   if (encoder_id == encoder->base.id) {
if (conflict->status != 
connector_status_connected)
continue;
 
@@ -1256,7 +1250,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool 
force)
struct radeon_connector *radeon_connector = 
to_radeon_connector(connector);
struct drm_encoder *encoder = NULL;
const struct drm_encoder_helper_funcs *encoder_funcs;
-   int i, r;
+   int r;
enum drm_connector_status ret = connector_status_disconnected;
bool dret = false, broken_edid = false;
 
@@ -1374,12 +1368,12 @@ radeon_dvi_detect(struct drm_connector *connector, bool 
force)
 
/* find analog encoder */
if (radeon_connector->dac_load_detect) {
-   for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-   if (connector->encoder_ids[i] == 0)
-   break;
+   u32 encoder_id;
+   int i;
 
+   drm_for_each_connector_encoder_ids(connector, encoder_id, i) {
encoder = drm_encoder_find(connector->dev, NULL,
-  connector->encoder_ids[i]);
+  encoder_id);
if (!encoder)
continue;
 
@@ -1458,15 +1452,13 @@ radeon_dvi_detect(struct drm_connector *connector, bool 
force)
 /* okay need to be smart in here about which encoder to pick */
 static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 {
-   int enc_id = connector->encoder_ids[0];
struct radeon_connector *radeon_connector = 

[PATCH] drm: Pass crtc to .best_encoder()

2018-06-15 Thread Ville Syrjala
From: Ville Syrjälä 

To pick the correct MST encoder i915 wants to know which crtc is going
to be feeding us. To that end let's pass the crtc to the .best_encoder()
hook. The atomic variant already knows the crtc via the connector state,
but the non-atomic hooks is still being used by the fb_helper even on
atomic drivers.

This allows us to fix up the possible_crtcs bitmask for the i915 MST
encoders. We have one encoder for each crtc+port combination, and thus
we have to know both the connector and the crtc to pick the right one.
This has only worked so far because every MST encoder lied in its
possible_crtcs bitmask that they can be driven by any crtc.

I took the easy way out and passed NULL as the crtc for all the driver
internal uses of .best_encoder() in the amdgpu/radeon drivers. None of
the other drivers have such internal uses. The other callers
(crtc_helper, atomic_helper, fb_helper) will pass in the proper crtc.
but no one besides i915 will currently look at it.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 33 +
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   |  3 +-
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  |  7 ++--
 .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c|  5 +--
 drivers/gpu/drm/ast/ast_mode.c |  3 +-
 drivers/gpu/drm/bochs/bochs_kms.c  |  3 +-
 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |  3 +-
 drivers/gpu/drm/bridge/tc358767.c  |  3 +-
 drivers/gpu/drm/cirrus/cirrus_mode.c   |  5 +--
 drivers/gpu/drm/drm_atomic_helper.c| 16 ++---
 drivers/gpu/drm/drm_crtc_helper.c  |  3 +-
 drivers/gpu/drm/drm_fb_helper.c| 41 --
 drivers/gpu/drm/gma500/gma_display.c   |  3 +-
 drivers/gpu/drm/gma500/mdfld_dsi_output.c  |  5 +--
 drivers/gpu/drm/gma500/psb_intel_drv.h |  3 +-
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c   |  3 +-
 drivers/gpu/drm/i2c/tda998x_drv.c  |  3 +-
 drivers/gpu/drm/i915/intel_dp_mst.c|  9 +++--
 drivers/gpu/drm/imx/imx-ldb.c  |  5 +--
 drivers/gpu/drm/imx/imx-tve.c  |  5 +--
 drivers/gpu/drm/imx/parallel-display.c |  5 +--
 drivers/gpu/drm/mediatek/mtk_hdmi.c|  3 +-
 drivers/gpu/drm/mgag200/mgag200_mode.c |  5 +--
 drivers/gpu/drm/msm/dsi/dsi_manager.c  |  3 +-
 drivers/gpu/drm/nouveau/dispnv50/disp.c|  3 +-
 drivers/gpu/drm/nouveau/nouveau_connector.c|  3 +-
 drivers/gpu/drm/qxl/qxl_display.c  |  3 +-
 drivers/gpu/drm/radeon/radeon_connectors.c | 40 +++--
 drivers/gpu/drm/radeon/radeon_dp_mst.c |  5 +--
 drivers/gpu/drm/shmobile/shmob_drm_crtc.c  |  3 +-
 drivers/gpu/drm/tilcdc/tilcdc_panel.c  |  5 +--
 drivers/gpu/drm/tilcdc/tilcdc_tfp410.c |  5 +--
 drivers/gpu/drm/udl/udl_connector.c|  3 +-
 drivers/staging/vboxvideo/vbox_mode.c  |  5 +--
 include/drm/drm_atomic_helper.h|  3 +-
 include/drm/drm_modeset_helper_vtables.h   |  6 ++--
 36 files changed, 155 insertions(+), 106 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index 8e66851eb427..3dfa50ec2589 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -135,7 +135,8 @@ int amdgpu_connector_get_monitor_bpc(struct drm_connector 
*connector)
else {
const struct drm_connector_helper_funcs 
*connector_funcs =
connector->helper_private;
-   struct drm_encoder *encoder = 
connector_funcs->best_encoder(connector);
+   struct drm_encoder *encoder = 
connector_funcs->best_encoder(connector,
+   
NULL);
struct amdgpu_encoder *amdgpu_encoder = 
to_amdgpu_encoder(encoder);
struct amdgpu_encoder_atom_dig *dig = 
amdgpu_encoder->enc_priv;
 
@@ -218,7 +219,7 @@ amdgpu_connector_update_scratch_regs(struct drm_connector 
*connector,
bool connected;
int i;
 
-   best_encoder = connector_funcs->best_encoder(connector);
+   best_encoder = connector_funcs->best_encoder(connector, NULL);
 
for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
if (connector->encoder_ids[i] == 0)
@@ -358,7 +359,8 @@ static int amdgpu_connector_ddc_get_modes(struct 
drm_connector *connector)
 }
 
 static struct drm_encoder *
-amdgpu_connector_best_single_encoder(struct drm_connector 

[PATCH v2 07/13] drm/amdgpu/dc: Stop updating plane->fb

2018-05-25 Thread Ville Syrjala
From: Ville Syrjälä 

We want to get rid of plane->fb on atomic drivers. Stop setting it.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
Reviewed-by: Maarten Lankhorst 
Reviewed-by: Harry Wentland 
Reviewed-by: Daniel Vetter 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 1ce10bc2d37b..82bac02fffd7 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3927,8 +3927,6 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc,
 
/* Flip */
spin_lock_irqsave(>dev->event_lock, flags);
-   /* update crtc fb */
-   crtc->primary->fb = fb;
 
WARN_ON(acrtc->pflip_status != AMDGPU_FLIP_NONE);
WARN_ON(!acrtc_state->stream);
-- 
2.16.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH v2 00/13] drm: Eliminate plane->fb/crtc usage for atomic drivers

2018-05-25 Thread Ville Syrjala
From: Ville Syrjälä 

Here are again the last (?) bits of eliminating the plane->fb/crtc
usage for atomic drivers. I've pushed everything else (thanks to
everyone who reviewed them). 

Deepak said he'd tested the vmwgfx stuff, so I think it should be
safe to land. Just missing a bit of review...

Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Cc: "Christian König" 
Cc: Daniel Vetter 
Cc: David Airlie 
Cc: "David (ChunMing) Zhou" 
Cc: Deepak Rawat 
Cc: Eric Anholt 
Cc: freedr...@lists.freedesktop.org
Cc: Gerd Hoffmann 
Cc: Harry Wentland 
Cc: Inki Dae 
Cc: Joonyoung Shim 
Cc: Kyungmin Park 
Cc: linux-arm-...@vger.kernel.org
Cc: Rob Clark 
Cc: Seung-Woo Kim 
Cc: Sinclair Yeh 
Cc: Thomas Hellstrom 
Cc: virtualizat...@lists.linux-foundation.org
Cc: VMware Graphics 

Ville Syrjälä (13):
  drm/vmwgfx: Stop using plane->fb in vmw_kms_atomic_check_modeset()
  drm/vmwgfx: Stop using plane->fb in vmw_kms_helper_dirty()
  drm/vmwgfx: Stop using plane->fb in vmw_kms_update_implicit_fb()
  drm/vmwgfx: Stop updating plane->fb
  drm/vmwgfx: Stop using plane->fb in atomic_enable()
  drm/vmwgfx: Stop messing about with plane->fb/old_fb/crtc
  drm/amdgpu/dc: Stop updating plane->fb
  drm/i915: Stop updating plane->fb/crtc
  drm/exynos: Stop updating plane->crtc
  drm/msm: Stop updating plane->fb/crtc
  drm/virtio: Stop updating plane->crtc
  drm/vc4: Stop updating plane->fb/crtc
  drm: Stop updating plane->crtc/fb/old_fb on atomic drivers

 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  2 -
 drivers/gpu/drm/drm_atomic.c  | 55 +++
 drivers/gpu/drm/drm_atomic_helper.c   | 15 +--
 drivers/gpu/drm/drm_crtc.c|  8 +++-
 drivers/gpu/drm/drm_fb_helper.c   |  7 ---
 drivers/gpu/drm/drm_framebuffer.c |  5 ---
 drivers/gpu/drm/drm_plane.c   | 14 +++---
 drivers/gpu/drm/drm_plane_helper.c|  4 +-
 drivers/gpu/drm/exynos/exynos_drm_plane.c |  2 -
 drivers/gpu/drm/i915/intel_atomic_plane.c | 12 -
 drivers/gpu/drm/i915/intel_display.c  |  7 ++-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c |  1 -
 drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c|  2 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c |  1 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c|  2 -
 drivers/gpu/drm/vc4/vc4_crtc.c|  3 --
 drivers/gpu/drm/virtio/virtgpu_display.c  |  2 -
 drivers/gpu/drm/vmwgfx/vmwgfx_fb.c| 24 --
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c   | 24 +++---
 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c  |  2 -
 drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c  |  5 +--
 include/drm/drm_atomic.h  |  3 --
 22 files changed, 46 insertions(+), 154 deletions(-)

-- 
2.16.1
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 04/13] drm/amdgpu/dc: Stop updating plane->fb

2018-04-05 Thread Ville Syrjala
From: Ville Syrjälä 

We want to get rid of plane->fb on atomic drivers. Stop setting it.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
Reviewed-by: Maarten Lankhorst 
Reviewed-by: Harry Wentland 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index e42a28e3adc5..91d048bb5574 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3943,8 +3943,6 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc,
 
/* Flip */
spin_lock_irqsave(>dev->event_lock, flags);
-   /* update crtc fb */
-   crtc->primary->fb = fb;
 
WARN_ON(acrtc->pflip_status != AMDGPU_FLIP_NONE);
WARN_ON(!acrtc_state->stream);
-- 
2.16.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 16/23] drm/amdgpu/dc: Stop updating plane->fb

2018-03-22 Thread Ville Syrjala
From: Ville Syrjälä 

We want to get rid of plane->fb on atomic drivers. Stop setting it.

Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "David (ChunMing) Zhou" 
Cc: Harry Wentland 
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index ae512ecb65ee..a8129eca6e6d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3941,8 +3941,6 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc,
 
/* Flip */
spin_lock_irqsave(>dev->event_lock, flags);
-   /* update crtc fb */
-   crtc->primary->fb = fb;
 
WARN_ON(acrtc->pflip_status != AMDGPU_FLIP_NONE);
WARN_ON(!acrtc_state->stream);
-- 
2.16.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 00/23] drm: Eliminate plane->fb/crtc usage for atomic drivers

2018-03-22 Thread Ville Syrjala
From: Ville Syrjälä 

I really just wanted to fix i915 to re-enable its planes afer load
detection (a two line patch). This is what I actually ended up with
after I ran into a framebuffer refcount leak with said two line patch.

I've tested this on a few i915 boxes and so far it's looking
good. Everything else is just compile tested.

Entire series available here:
git://github.com/vsyrjala/linux.git plane_fb_crtc_nuke

Cc: Alex Deucher 
Cc: amd-gfx@lists.freedesktop.org
Cc: Benjamin Gaignard 
Cc: Boris Brezillon 
Cc: ch...@chris-wilson.co.uk
Cc: "Christian König" 
Cc: Daniel Vetter 
Cc: Dave Airlie 
Cc: David Airlie 
Cc: "David (ChunMing) Zhou" 
Cc: Eric Anholt 
Cc: freedr...@lists.freedesktop.org
Cc: Gerd Hoffmann 
Cc: Harry Wentland 
Cc: Inki Dae 
Cc: Joonyoung Shim 
Cc: Kyungmin Park 
Cc: linux-arm-...@vger.kernel.org
Cc: Maarten Lankhorst 
Cc: martin.pe...@free.fr
Cc: Rob Clark 
Cc: Seung-Woo Kim 
Cc: Shawn Guo 
Cc: Sinclair Yeh 
Cc: Thomas Hellstrom 
Cc: Vincent Abriou 
Cc: virtualizat...@lists.linux-foundation.org
Cc: VMware Graphics 

Ville Syrjälä (23):
  Revert "drm/atomic-helper: Fix leak in disable_all"
  drm/atomic-helper: Make drm_atomic_helper_disable_all() update the
plane->fb pointers
  drm: Clear crtc->primary->crtc when disabling the crtc via setcrtc()
  drm/atomic-helper: WARN if legacy plane fb pointers are bogus when
committing duplicated state
  drm: Add local 'plane' variable for primary/cursor planes
  drm: Adjust whitespace for legibility
  drm: Make the fb refcount handover less magic
  drm: Use plane->state->fb over plane->fb
  drm/i915: Stop consulting plane->fb
  drm/msm: Stop consulting plane->fb
  drm/sti: Stop consulting plane->fb
  drm/vmwgfx: Stop consulting plane->fb
  drm/zte: Stop consulting plane->fb
  drm/atmel-hlcdc: Stop using plane->fb
  drm: Stop updating plane->crtc/fb/old_fb on atomic drivers
  drm/amdgpu/dc: Stop updating plane->fb
  drm/i915: Stop updating plane->fb/crtc
  drm/exynos: Stop updating plane->crtc
  drm/msm: Stop updating plane->fb/crtc
  drm/virtio: Stop updating plane->fb
  drm/vc4: Stop updating plane->fb/crtc
  drm/i915: Restore planes after load detection
  drm/i915: Make force_load_detect effective even w/ DMI quirks/hotplug

 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  2 -
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c   | 12 +---
 drivers/gpu/drm/drm_atomic.c  | 55 ++--
 drivers/gpu/drm/drm_atomic_helper.c   | 79 ++-
 drivers/gpu/drm/drm_crtc.c| 51 ++-
 drivers/gpu/drm/drm_fb_helper.c   |  7 --
 drivers/gpu/drm/drm_framebuffer.c |  5 --
 drivers/gpu/drm/drm_plane.c   | 64 +++---
 drivers/gpu/drm/drm_plane_helper.c|  4 +-
 drivers/gpu/drm/exynos/exynos_drm_plane.c |  2 -
 drivers/gpu/drm/i915/intel_crt.c  |  6 ++
 drivers/gpu/drm/i915/intel_display.c  |  9 +--
 drivers/gpu/drm/i915/intel_fbdev.c|  2 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c |  3 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c|  2 -
 drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c|  2 -
 drivers/gpu/drm/sti/sti_plane.c   |  9 +--
 drivers/gpu/drm/vc4/vc4_crtc.c|  3 -
 drivers/gpu/drm/virtio/virtgpu_display.c  |  2 -
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c   |  6 +-
 drivers/gpu/drm/zte/zx_vou.c  |  2 +-
 include/drm/drm_atomic.h  |  3 -
 22 files changed, 143 insertions(+), 187 deletions(-)

-- 
2.16.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx