On Tue, 27 Mar 2012 18:59:42 -0700 Ben Widawsky <ben at bwidawsk.net> wrote: > This is meant to test the sysfs entry for showing rc6 residency in > milliseconds. Remember, sysfs is a permanent interface. > > v2: use new get_card interface to try "all" devices > check rc6p and rc6pp in addition to rc6 > > v3: rename rc6_residency.c to sysfs_rc6_residency.c > print better error messages > skip test if rc6 isn't enabled > > Signed-off-by: Ben Widawsky <benjamin.widawsky at intel.com> > --- > lib/drmtest.h | 1 + > tests/Makefile.am | 1 + > tests/sysfs_rc6_residency.c | 107 +++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 109 insertions(+) > create mode 100644 tests/sysfs_rc6_residency.c > > diff --git a/lib/drmtest.h b/lib/drmtest.h > index 96fbf1a..42f238c 100644 > --- a/lib/drmtest.h > +++ b/lib/drmtest.h > @@ -35,6 +35,7 @@ > #include "xf86drm.h" > #include "intel_batchbuffer.h" > > +int drm_get_card(int master); > int drm_open_any(void); > int drm_open_any_master(void); > > diff --git a/tests/Makefile.am b/tests/Makefile.am > index 6544ec7..9c3b058 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -56,6 +56,7 @@ TESTS_progs = \ > drm_vma_limiter_cpu \ > drm_vma_limiter_gtt \ > drm_vma_limiter_cached \ > + sysfs_rc6_residency \ > $(NULL) > > # IMPORTANT: The ZZ_ tests need to be run last! > diff --git a/tests/sysfs_rc6_residency.c b/tests/sysfs_rc6_residency.c > new file mode 100644 > index 0000000..1772c87 > --- /dev/null > +++ b/tests/sysfs_rc6_residency.c > @@ -0,0 +1,107 @@ > +/* > + * Copyright ? 2012 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > + * IN THE SOFTWARE. > + * > + * Authors: > + * Ben Widawsky <ben at bwidawsk.net> > + * > + */ > + > +#define _GNU_SOURCE > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include <unistd.h> > +#include "drmtest.h" > + > +#define SLEEP_DURATION 3000 // in milliseconds > +#define RC6_FUDGE 900 // in milliseconds > + > +static unsigned int readit(const char *path) > +{ > + unsigned int ret; > + > + FILE *file; > + file = fopen(path, "r"); > + if (file == NULL) { > + fprintf(stderr, "Couldn't open %s (%d)\n", path, errno); > + abort(); > + } > + fscanf(file, "%u", &ret); > + fclose(file); > + > + return ret; > +} > + > +int main(int argc, char *argv[]) > +{ > + const int device = drm_get_card(0); > + char *path, *pathp, *pathpp; > + int fd, ret; > + unsigned int value1, value1p, value1pp, value2, value2p, value2pp; > + int diff; > + > + /* Use drm_open_any to verify device existence */ > + fd = drm_open_any(); > + close(fd); > + > + ret = asprintf(&path, "/sys/class/drm/card%d/power/rc6", device); > + assert(ret != -1); Copy+paste bug here. Imagine it says rc6_enabled instead of rc6. > + > + if (readit(path) == 0) > + exit(EXIT_SUCCESS); > + > + ret = asprintf(&path, "/sys/class/drm/card%d/power/rc6", device); > + assert(ret != -1); > + ret = asprintf(&pathp, "/sys/class/drm/card%d/power/rc6p", device); > + assert(ret != -1); > + ret = asprintf(&pathpp, "/sys/class/drm/card%d/power/rc6pp", device); > + assert(ret != -1); > + > + value1 = readit(path); > + value1p = readit(pathp); > + value1pp = readit(pathpp); > + sleep(SLEEP_DURATION / 1000); > + value2 = readit(path); > + value2p = readit(pathp); > + value2pp = readit(pathpp); > + > + free(pathpp); > + free(pathp); > + free(path); > + > + diff = (value2pp - value1pp) + > + (value2p - value1p) + > + (value2 - value1); > + > + if (diff > (SLEEP_DURATION + RC6_FUDGE)) { > + fprintf(stderr, "Diff was too high. That is unpossible\n"); > + exit(EXIT_FAILURE); > + } > + if (diff < (SLEEP_DURATION - RC6_FUDGE)) { > + fprintf(stderr, "GPU was not in RC6 long enough. Check that " > + "the GPU is as idle as possible (ie. no X, " > + "running and running no other tests)\n"); > + exit(EXIT_FAILURE); > + } > + > + exit(EXIT_SUCCESS); > +}