[Intel-gfx] [PATCH v4 i-g-t] tests/kms: increase max threshold time for edid read
Lofstedt, Marta
marta.lofstedt at intel.com
Mon Aug 14 05:47:36 UTC 2017
> -----Original Message-----
> From: Taylor, Clinton A
> Sent: Friday, August 11, 2017 7:36 PM
> To: Lofstedt, Marta <marta.lofstedt at intel.com>; intel-
> gfx at lists.freedesktop.org
> Cc: Vetter, Daniel <daniel.vetter at intel.com>
> Subject: Re: [PATCH v4 i-g-t] tests/kms: increase max threshold time for edid
> read
>
>
>
> On 08/11/2017 12:49 AM, Lofstedt, Marta wrote:
> >
> >> -----Original Message-----
> >> From: Taylor, Clinton A
> >> Sent: Thursday, August 10, 2017 8:50 PM
> >> To: intel-gfx at lists.freedesktop.org
> >> Cc: Taylor, Clinton A <clinton.a.taylor at intel.com>; Vetter, Daniel
> >> <daniel.vetter at intel.com>; Lofstedt, Marta <marta.lofstedt at intel.com>
> >> Subject: [PATCH v4 i-g-t] tests/kms: increase max threshold time for
> >> edid read
> >>
> >> From: Clint Taylor <clinton.a.taylor at 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.
> >> V3: Add bugzilla to commit message
> >> V4: remove edid_size check from HDMI multiplier. Fixes DVI on HDMI.
> >>
> >> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100047
> >>
> >> Cc: Daniel Vetter <daniel.vetter at intel.com>
> >> Cc: Marta Lofstedt <marta.lofstedt at intel.com>
> >> Signed-off-by: Clint Taylor <clinton.a.taylor at intel.com>
> >> ---
> >> tests/kms_sysfs_edid_timing.c | 74
> >> +++++++++++++++++++++++++++++++++++--------
> >> 1 file changed, 60 insertions(+), 14 deletions(-)
> >>
> >> diff --git a/tests/kms_sysfs_edid_timing.c
> >> b/tests/kms_sysfs_edid_timing.c index 1201388..0382610 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);
> > We can't have this lspcon as an argument to the test, it will not work with
> automated testing using piglit as we do for CI.
> > Theoretically we could add a "has_lspcon" to debugfs, but I believe that
> this test has started to be over complicated.
> The test would need to know if an LSPcon is connected on a port by port
> basis. This is easy if the LSPcon driver is loaded but in the case of USB_C-
> >HDMI is gets a little more complicated (not impossible) to figure out. Even if
> we know exactly what device is connected failures can still occur if the
> TCON/Monitor clock stretches the EDID read.
>
> > The intention of the test is to do a sanity check so that we don't drift off
> here, so I actually prefer the V1.
> Unfortunately with the timing differences (3ms to 96ms) based on the
> monitor type connected and EDID size there is no way for a one size fits all
> sanity check to be reliable. If the original point of this test was to figure out if
> probe caused more than 1 EDID read, maybe we should actually count EDID
> reads and not infer it by measuring time.
>
That sound good to me, but let's see what the list thinks.
/Marta
> -Clint
>
> > Your detailed work could however be used in a benchmark, where the
> result would be the actually timing, I am sure there is a performance team
> who would like that.
> >
> > /Marta
> >
> >> +
> >> + igt_skip_on_simulation();
> >>
> >> dirp = opendir("/sys/class/drm");
> >> igt_assert(dirp != NULL);
> >> @@ -49,17 +74,34 @@ 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 || !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 +118,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
More information about the Intel-gfx
mailing list