From: Clint Taylor <clinton.a.tay...@intel.com>

Current 50ms max threshold timing for an EDID read is very close to the
actual time for a 2 block HDMI EDID read. Adjust the timings base on
connector type as DP reads are at 1 MBit and HDMI at 100K bit. If an LSPcon
is connected to device under test the -l option should be passed to update
the threshold timing to allow the LSPcon to read the EDID at the HDMI
timing. The -l option should be used when LSPcon is on the motherboard or
if a USB_C->HDMI converter is present

V2: Adjust timings based on connector type, EDID size, and Add an option to
specify if an LSPcon is present.

Cc: Daniel Vetter <daniel.vet...@intel.com>
Cc: Marta Lofstedt <marta.lofst...@intel.com>
Signed-off-by: Clint Taylor <clinton.a.tay...@intel.com>
---
 tests/kms_sysfs_edid_timing.c | 76 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 62 insertions(+), 14 deletions(-)

diff --git a/tests/kms_sysfs_edid_timing.c b/tests/kms_sysfs_edid_timing.c
index 1201388..441dfee 100644
--- a/tests/kms_sysfs_edid_timing.c
+++ b/tests/kms_sysfs_edid_timing.c
@@ -26,21 +26,46 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 
-#define THRESHOLD_PER_CONNECTOR        10
-#define THRESHOLD_TOTAL                50
-#define CHECK_TIMES            15
+#define THRESHOLD_FOR_EMPTY_CONNECTOR  10
+#define THRESHOLD_PER_EDID_BLOCK               5
+#define HDMI_THRESHOLD_MULTIPLIER              10
+#define CHECK_TIMES                            10
 
 IGT_TEST_DESCRIPTION("This check the time we take to read the content of all "
                     "the possible connectors. Without the edid -ENXIO patch "
                     
"(http://permalink.gmane.org/gmane.comp.video.dri.devel/62083), "
-                    "we sometimes take a *really* long time. "
-                    "So let's just check for some reasonable timing here");
+                    "we sometimes take a *really* long time. So let's check "
+                    "an approximate time per edid block based on connector "
+                    "type. The -l option adjusts DP timing to reflect HDMI 
read "
+                    "timings from LSPcon.");
+
+/* The -l option has been added to correctly handle timings when an LSPcon is
+ * present. This could be on the platform itself or in a USB_C->HDMI converter.
+ * With LSPCon EDID read timing will need to change from the 1 Mbit AUX
+ * bus speed to the 100 Kbit HDMI DDC bus speed
+ */
+bool lspcon_present;
 
+static int opt_handler(int opt, int opt_index, void *data)
+{
+       if (opt == 'l') {
+               lspcon_present = true;
+               igt_info("set LSPcon present on DP ports\n");
+       }
 
-igt_simple_main
+       return 0;
+}
+
+int main(int argc, char **argv)
 {
        DIR *dirp;
        struct dirent *de;
+       lspcon_present = false;
+
+       igt_simple_init_parse_opts(&argc, argv, "l", NULL, NULL,
+                                     opt_handler, NULL);
+
+       igt_skip_on_simulation();
 
        dirp = opendir("/sys/class/drm");
        igt_assert(dirp != NULL);
@@ -49,17 +74,36 @@ igt_simple_main
                struct igt_mean mean = {};
                struct stat st;
                char path[PATH_MAX];
-               int i;
+               char edid_path[PATH_MAX];
+               char edid[512]; /* enough for 4 block edid */
+               unsigned long edid_size = 0;
+               int i, fd_edid;
+               unsigned int threshold = 0;
 
                if (*de->d_name == '.')
                        continue;;
 
                snprintf(path, sizeof(path), "/sys/class/drm/%s/status",
                                de->d_name);
+               snprintf(edid_path, sizeof(edid_path), "/sys/class/drm/%s/edid",
+                               de->d_name);
 
                if (stat(path, &st))
                        continue;
 
+               fd_edid = open(edid_path, O_RDONLY);
+               if (fd_edid == -1) {
+                       igt_warn("Read Error EDID\n");
+                       continue;
+               }
+
+               edid_size = read(fd_edid, edid, 512);
+               threshold = THRESHOLD_PER_EDID_BLOCK * (edid_size / 128);
+               if (lspcon_present || (edid_size > 128 &&
+                   !strncmp(de->d_name, "card0-HDMI", 10))) {
+                       threshold *= HDMI_THRESHOLD_MULTIPLIER;
+               }
+
                igt_mean_init(&mean);
                for (i = 0; i < CHECK_TIMES; i++) {
                        struct timespec ts = {};
@@ -76,22 +120,26 @@ igt_simple_main
                }
 
                igt_debug("%s: mean.max %.2fns, %.2fus, %.2fms, "
-                         "mean.avg %.2fns, %.2fus, %.2fms\n",
+                         "mean.avg %.2fns, %.2fus, %.2fms, "
+                         "edid_size %lu, threshold %d\n",
                          de->d_name,
                          mean.max, mean.max / 1e3, mean.max / 1e6,
-                         mean.mean, mean.mean / 1e3, mean.mean / 1e6);
+                         mean.mean, mean.mean / 1e3, mean.mean / 1e6,
+                         edid_size, threshold);
 
-               if (mean.max > (THRESHOLD_PER_CONNECTOR * 1e6)) {
+               if (edid_size == 0 &&
+                  (mean.max > (THRESHOLD_FOR_EMPTY_CONNECTOR * 1e6))) {
                        igt_warn("%s: probe time exceed 10ms, "
                                 "max=%.2fms, avg=%.2fms\n", de->d_name,
                                 mean.max / 1e6, mean.mean / 1e6);
                }
-               igt_assert_f(mean.mean < (THRESHOLD_TOTAL * 1e6),
-                            "%s: average probe time exceeded 50ms, "
-                            "max=%.2fms, avg=%.2fms\n", de->d_name,
+               if (edid_size > 0)
+                       igt_assert_f(mean.mean < (threshold * 1e6),
+                            "%s: average probe time exceeded %dms, "
+                            "max=%.2fms, avg=%.2fms\n", de->d_name, threshold,
                             mean.max / 1e6, mean.mean / 1e6);
 
        }
        closedir(dirp);
-
+       igt_exit();
 }
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to