diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2018-06-28 09:13:09 -0400 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2018-07-05 09:52:07 -0400 |
commit | 83aefbb887b59df0b3520965c3701e01deacfc52 (patch) | |
tree | 2ae00e1b761979767560fd7e989070e27f4137c7 /drivers/gpu | |
parent | 20431c05ae682ff2ad387945738fc129d9751d6e (diff) |
drm: Add drm_connector_for_each_possible_encoder()
Add a convenience macro for iterating connector->encoder_ids[].
Isolates the users from the implementation details.
Note that we don't seem to pass the file_priv down to drm_encoder_find()
because encoders apparently don't get leased. No idea why
drm_encoder_finc() even takes the file_priv actually.
Also use ARRAY_SIZE() when populating the array to avoid spreading
knowledge about the array size all over.
v2: Hide the drm_encoder_find() in the macro, and
rename the macro appropriately (Daniel)
v3: Fix kernel docs (Daniel)
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180628131315.14156-4-ville.syrjala@linux.intel.com
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/drm_connector.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_probe_helper.c | 10 |
3 files changed, 14 insertions, 28 deletions
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index b09b3a3e4024..7387c0377e51 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c | |||
@@ -321,7 +321,7 @@ int drm_mode_connector_attach_encoder(struct drm_connector *connector, | |||
321 | if (WARN_ON(connector->encoder)) | 321 | if (WARN_ON(connector->encoder)) |
322 | return -EINVAL; | 322 | return -EINVAL; |
323 | 323 | ||
324 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 324 | for (i = 0; i < ARRAY_SIZE(connector->encoder_ids); i++) { |
325 | if (connector->encoder_ids[i] == 0) { | 325 | if (connector->encoder_ids[i] == 0) { |
326 | connector->encoder_ids[i] = encoder->base.id; | 326 | connector->encoder_ids[i] = encoder->base.id; |
327 | return 0; | 327 | return 0; |
@@ -1706,22 +1706,19 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
1706 | if (!connector) | 1706 | if (!connector) |
1707 | return -ENOENT; | 1707 | return -ENOENT; |
1708 | 1708 | ||
1709 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) | 1709 | drm_connector_for_each_possible_encoder(connector, encoder, i) |
1710 | if (connector->encoder_ids[i] != 0) | 1710 | encoders_count++; |
1711 | encoders_count++; | ||
1712 | 1711 | ||
1713 | if ((out_resp->count_encoders >= encoders_count) && encoders_count) { | 1712 | if ((out_resp->count_encoders >= encoders_count) && encoders_count) { |
1714 | copied = 0; | 1713 | copied = 0; |
1715 | encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr); | 1714 | encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr); |
1716 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 1715 | |
1717 | if (connector->encoder_ids[i] != 0) { | 1716 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
1718 | if (put_user(connector->encoder_ids[i], | 1717 | if (put_user(encoder->base.id, encoder_ptr + copied)) { |
1719 | encoder_ptr + copied)) { | 1718 | ret = -EFAULT; |
1720 | ret = -EFAULT; | 1719 | goto out; |
1721 | goto out; | ||
1722 | } | ||
1723 | copied++; | ||
1724 | } | 1720 | } |
1721 | copied++; | ||
1725 | } | 1722 | } |
1726 | } | 1723 | } |
1727 | out_resp->count_encoders = encoders_count; | 1724 | out_resp->count_encoders = encoders_count; |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index b37f06317d51..d697c1c4a067 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -2326,17 +2326,10 @@ retry: | |||
2326 | static bool connector_has_possible_crtc(struct drm_connector *connector, | 2326 | static bool connector_has_possible_crtc(struct drm_connector *connector, |
2327 | struct drm_crtc *crtc) | 2327 | struct drm_crtc *crtc) |
2328 | { | 2328 | { |
2329 | struct drm_encoder *encoder; | ||
2329 | int i; | 2330 | int i; |
2330 | 2331 | ||
2331 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 2332 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
2332 | struct drm_encoder *encoder; | ||
2333 | |||
2334 | if (connector->encoder_ids[i] == 0) | ||
2335 | break; | ||
2336 | |||
2337 | encoder = drm_encoder_find(connector->dev, NULL, | ||
2338 | connector->encoder_ids[i]); | ||
2339 | |||
2340 | if (encoder->possible_crtcs & drm_crtc_mask(crtc)) | 2333 | if (encoder->possible_crtcs & drm_crtc_mask(crtc)) |
2341 | return true; | 2334 | return true; |
2342 | } | 2335 | } |
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c index 527743394150..1a901fe9e23e 100644 --- a/drivers/gpu/drm/drm_probe_helper.c +++ b/drivers/gpu/drm/drm_probe_helper.c | |||
@@ -88,9 +88,9 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode, | |||
88 | struct drm_connector *connector) | 88 | struct drm_connector *connector) |
89 | { | 89 | { |
90 | struct drm_device *dev = connector->dev; | 90 | struct drm_device *dev = connector->dev; |
91 | uint32_t *ids = connector->encoder_ids; | ||
92 | enum drm_mode_status ret = MODE_OK; | 91 | enum drm_mode_status ret = MODE_OK; |
93 | unsigned int i; | 92 | struct drm_encoder *encoder; |
93 | int i; | ||
94 | 94 | ||
95 | /* Step 1: Validate against connector */ | 95 | /* Step 1: Validate against connector */ |
96 | ret = drm_connector_mode_valid(connector, mode); | 96 | ret = drm_connector_mode_valid(connector, mode); |
@@ -98,13 +98,9 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode, | |||
98 | return ret; | 98 | return ret; |
99 | 99 | ||
100 | /* Step 2: Validate against encoders and crtcs */ | 100 | /* Step 2: Validate against encoders and crtcs */ |
101 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 101 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
102 | struct drm_encoder *encoder = drm_encoder_find(dev, NULL, ids[i]); | ||
103 | struct drm_crtc *crtc; | 102 | struct drm_crtc *crtc; |
104 | 103 | ||
105 | if (!encoder) | ||
106 | continue; | ||
107 | |||
108 | ret = drm_encoder_mode_valid(encoder, mode); | 104 | ret = drm_encoder_mode_valid(encoder, mode); |
109 | if (ret != MODE_OK) { | 105 | if (ret != MODE_OK) { |
110 | /* No point in continuing for crtc check as this encoder | 106 | /* No point in continuing for crtc check as this encoder |