forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/drm_probe_helper.c
....@@ -32,14 +32,16 @@
3232 #include <linux/export.h>
3333 #include <linux/moduleparam.h>
3434
35
-#include <drm/drmP.h>
35
+#include <drm/drm_bridge.h>
3636 #include <drm/drm_client.h>
3737 #include <drm/drm_crtc.h>
38
-#include <drm/drm_fourcc.h>
39
-#include <drm/drm_crtc_helper.h>
40
-#include <drm/drm_fb_helper.h>
4138 #include <drm/drm_edid.h>
39
+#include <drm/drm_fb_helper.h>
40
+#include <drm/drm_fourcc.h>
4241 #include <drm/drm_modeset_helper_vtables.h>
42
+#include <drm/drm_print.h>
43
+#include <drm/drm_probe_helper.h>
44
+#include <drm/drm_sysfs.h>
4345
4446 #include "drm_crtc_helper_internal.h"
4547
....@@ -84,26 +86,28 @@
8486 return MODE_OK;
8587 }
8688
87
-static enum drm_mode_status
89
+static int
8890 drm_mode_validate_pipeline(struct drm_display_mode *mode,
89
- struct drm_connector *connector)
91
+ struct drm_connector *connector,
92
+ struct drm_modeset_acquire_ctx *ctx,
93
+ enum drm_mode_status *status)
9094 {
9195 struct drm_device *dev = connector->dev;
92
- enum drm_mode_status ret = MODE_OK;
9396 struct drm_encoder *encoder;
94
- int i;
97
+ int ret;
9598
9699 /* Step 1: Validate against connector */
97
- ret = drm_connector_mode_valid(connector, mode);
98
- if (ret != MODE_OK)
100
+ ret = drm_connector_mode_valid(connector, mode, ctx, status);
101
+ if (ret || *status != MODE_OK)
99102 return ret;
100103
101104 /* Step 2: Validate against encoders and crtcs */
102
- drm_connector_for_each_possible_encoder(connector, encoder, i) {
105
+ drm_connector_for_each_possible_encoder(connector, encoder) {
106
+ struct drm_bridge *bridge;
103107 struct drm_crtc *crtc;
104108
105
- ret = drm_encoder_mode_valid(encoder, mode);
106
- if (ret != MODE_OK) {
109
+ *status = drm_encoder_mode_valid(encoder, mode);
110
+ if (*status != MODE_OK) {
107111 /* No point in continuing for crtc check as this encoder
108112 * will not accept the mode anyway. If all encoders
109113 * reject the mode then, at exit, ret will not be
....@@ -111,8 +115,11 @@
111115 continue;
112116 }
113117
114
- ret = drm_bridge_mode_valid(encoder->bridge, mode);
115
- if (ret != MODE_OK) {
118
+ bridge = drm_bridge_chain_get_first_bridge(encoder);
119
+ *status = drm_bridge_chain_mode_valid(bridge,
120
+ &connector->display_info,
121
+ mode);
122
+ if (*status != MODE_OK) {
116123 /* There is also no point in continuing for crtc check
117124 * here. */
118125 continue;
....@@ -122,17 +129,17 @@
122129 if (!drm_encoder_crtc_ok(encoder, crtc))
123130 continue;
124131
125
- ret = drm_crtc_mode_valid(crtc, mode);
126
- if (ret == MODE_OK) {
132
+ *status = drm_crtc_mode_valid(crtc, mode);
133
+ if (*status == MODE_OK) {
127134 /* If we get to this point there is at least
128135 * one combination of encoder+crtc that works
129136 * for this mode. Lets return now. */
130
- return ret;
137
+ return 0;
131138 }
132139 }
133140 }
134141
135
- return ret;
142
+ return 0;
136143 }
137144
138145 static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)
....@@ -156,6 +163,8 @@
156163 continue;
157164 }
158165
166
+ /* Mark the matching mode as being preferred by the user */
167
+ mode->type |= DRM_MODE_TYPE_USERDEF;
159168 return 0;
160169 }
161170
....@@ -191,16 +200,27 @@
191200 return encoder_funcs->mode_valid(encoder, mode);
192201 }
193202
194
-enum drm_mode_status drm_connector_mode_valid(struct drm_connector *connector,
195
- struct drm_display_mode *mode)
203
+int
204
+drm_connector_mode_valid(struct drm_connector *connector,
205
+ struct drm_display_mode *mode,
206
+ struct drm_modeset_acquire_ctx *ctx,
207
+ enum drm_mode_status *status)
196208 {
197209 const struct drm_connector_helper_funcs *connector_funcs =
198210 connector->helper_private;
211
+ int ret = 0;
199212
200
- if (!connector_funcs || !connector_funcs->mode_valid)
201
- return MODE_OK;
213
+ if (!connector_funcs)
214
+ *status = MODE_OK;
215
+ else if (connector_funcs->mode_valid_ctx)
216
+ ret = connector_funcs->mode_valid_ctx(connector, mode, ctx,
217
+ status);
218
+ else if (connector_funcs->mode_valid)
219
+ *status = connector_funcs->mode_valid(connector, mode);
220
+ else
221
+ *status = MODE_OK;
202222
203
- return connector_funcs->mode_valid(connector, mode);
223
+ return ret;
204224 }
205225
206226 #define DRM_OUTPUT_POLL_PERIOD (10*HZ)
....@@ -285,6 +305,9 @@
285305 if (WARN_ON(ret < 0))
286306 ret = connector_status_unknown;
287307
308
+ if (ret != connector->status)
309
+ connector->epoch_counter += 1;
310
+
288311 drm_modeset_drop_locks(&ctx);
289312 drm_modeset_acquire_fini(&ctx);
290313
....@@ -318,11 +341,16 @@
318341 return ret;
319342
320343 if (funcs->detect_ctx)
321
- return funcs->detect_ctx(connector, ctx, force);
344
+ ret = funcs->detect_ctx(connector, ctx, force);
322345 else if (connector->funcs->detect)
323
- return connector->funcs->detect(connector, force);
346
+ ret = connector->funcs->detect(connector, force);
324347 else
325
- return connector_status_connected;
348
+ ret = connector_status_connected;
349
+
350
+ if (ret != connector->status)
351
+ connector->epoch_counter += 1;
352
+
353
+ return ret;
326354 }
327355 EXPORT_SYMBOL(drm_helper_probe_detect);
328356
....@@ -370,8 +398,9 @@
370398 * (if specified)
371399 * - drm_mode_validate_flag() checks the modes against basic connector
372400 * capabilities (interlace_allowed,doublescan_allowed,stereo_allowed)
373
- * - the optional &drm_connector_helper_funcs.mode_valid helper can perform
374
- * driver and/or sink specific checks
401
+ * - the optional &drm_connector_helper_funcs.mode_valid or
402
+ * &drm_connector_helper_funcs.mode_valid_ctx helpers can perform driver
403
+ * and/or sink specific checks
375404 * - the optional &drm_crtc_helper_funcs.mode_valid,
376405 * &drm_bridge_funcs.mode_valid and &drm_encoder_helper_funcs.mode_valid
377406 * helpers can perform driver and/or source specific checks which are also
....@@ -459,8 +488,9 @@
459488 */
460489 dev->mode_config.delayed_event = true;
461490 if (dev->mode_config.poll_enabled)
462
- schedule_delayed_work(&dev->mode_config.output_poll_work,
463
- 0);
491
+ mod_delayed_work(system_wq,
492
+ &dev->mode_config.output_poll_work,
493
+ 0);
464494 }
465495
466496 /* Re-enable polling in case the global poll config changed. */
....@@ -502,22 +532,39 @@
502532 mode_flags |= DRM_MODE_FLAG_3D_MASK;
503533
504534 list_for_each_entry(mode, &connector->modes, head) {
505
- if (mode->status == MODE_OK)
506
- mode->status = drm_mode_validate_driver(dev, mode);
535
+ if (mode->status != MODE_OK)
536
+ continue;
507537
508
- if (mode->status == MODE_OK)
509
- mode->status = drm_mode_validate_size(mode, maxX, maxY);
538
+ mode->status = drm_mode_validate_driver(dev, mode);
539
+ if (mode->status != MODE_OK)
540
+ continue;
510541
511
- if (mode->status == MODE_OK)
512
- mode->status = drm_mode_validate_flag(mode, mode_flags);
542
+ mode->status = drm_mode_validate_size(mode, maxX, maxY);
543
+ if (mode->status != MODE_OK)
544
+ continue;
513545
514
- if (mode->status == MODE_OK)
515
- mode->status = drm_mode_validate_pipeline(mode,
516
- connector);
546
+ mode->status = drm_mode_validate_flag(mode, mode_flags);
547
+ if (mode->status != MODE_OK)
548
+ continue;
517549
518
- if (mode->status == MODE_OK)
519
- mode->status = drm_mode_validate_ycbcr420(mode,
520
- connector);
550
+ ret = drm_mode_validate_pipeline(mode, connector, &ctx,
551
+ &mode->status);
552
+ if (ret) {
553
+ drm_dbg_kms(dev,
554
+ "drm_mode_validate_pipeline failed: %d\n",
555
+ ret);
556
+
557
+ if (drm_WARN_ON_ONCE(dev, ret != -EDEADLK)) {
558
+ mode->status = MODE_ERROR;
559
+ } else {
560
+ drm_modeset_backoff(&ctx);
561
+ goto retry;
562
+ }
563
+ }
564
+
565
+ if (mode->status != MODE_OK)
566
+ continue;
567
+ mode->status = drm_mode_validate_ycbcr420(mode, connector);
521568 }
522569
523570 prune:
....@@ -528,9 +575,6 @@
528575
529576 if (list_empty(&connector->modes))
530577 return 0;
531
-
532
- list_for_each_entry(mode, &connector->modes, head)
533
- mode->vrefresh = drm_mode_vrefresh(mode);
534578
535579 drm_mode_sort(&connector->modes);
536580
....@@ -580,6 +624,7 @@
580624 struct drm_connector_list_iter conn_iter;
581625 enum drm_connector_status old_status;
582626 bool repoll = false, changed;
627
+ u64 old_epoch_counter;
583628
584629 if (!dev->mode_config.poll_enabled)
585630 return;
....@@ -616,8 +661,9 @@
616661
617662 repoll = true;
618663
664
+ old_epoch_counter = connector->epoch_counter;
619665 connector->status = drm_helper_probe_detect(connector, NULL, false);
620
- if (old_status != connector->status) {
666
+ if (old_epoch_counter != connector->epoch_counter) {
621667 const char *old, *new;
622668
623669 /*
....@@ -646,6 +692,9 @@
646692 connector->base.id,
647693 connector->name,
648694 old, new);
695
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] epoch counter %llu -> %llu\n",
696
+ connector->base.id, connector->name,
697
+ old_epoch_counter, connector->epoch_counter);
649698
650699 changed = true;
651700 }
....@@ -775,6 +824,7 @@
775824 struct drm_connector_list_iter conn_iter;
776825 enum drm_connector_status old_status;
777826 bool changed = false;
827
+ u64 old_epoch_counter;
778828
779829 if (!dev->mode_config.poll_enabled)
780830 return false;
....@@ -788,20 +838,39 @@
788838
789839 old_status = connector->status;
790840
841
+ old_epoch_counter = connector->epoch_counter;
842
+
843
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id,
844
+ connector->name,
845
+ old_epoch_counter);
846
+
791847 connector->status = drm_helper_probe_detect(connector, NULL, false);
792848 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
793849 connector->base.id,
794850 connector->name,
795851 drm_get_connector_status_name(old_status),
796852 drm_get_connector_status_name(connector->status));
797
- if (old_status != connector->status)
853
+
854
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n",
855
+ connector->base.id,
856
+ connector->name,
857
+ connector->epoch_counter);
858
+
859
+ /*
860
+ * Check if epoch counter had changed, meaning that we need
861
+ * to send a uevent.
862
+ */
863
+ if (old_epoch_counter != connector->epoch_counter)
798864 changed = true;
865
+
799866 }
800867 drm_connector_list_iter_end(&conn_iter);
801868 mutex_unlock(&dev->mode_config.mutex);
802869
803
- if (changed)
870
+ if (changed) {
804871 drm_kms_helper_hotplug_event(dev);
872
+ DRM_DEBUG_KMS("Sent hotplug event\n");
873
+ }
805874
806875 return changed;
807876 }