On Thu, May 14, 2015 at 03:39:50PM +0100, Damien Lespiau wrote: > The CRC debug interface is a bit more than a simple textual file in > debugfs as there are a small command language to control what we want > from them. > > This tool starts, slowly, by allowing us to dump the pipe CRCs whenever > we want. It can be handy to check what is the current CRC when we reach > a certain state on the screen (when using --interactive-debug for > instance) against a known CRC. > > Signed-off-by: Damien Lespiau <damien.lespiau@xxxxxxxxx> Right now the kernel has only one fifo and multiple consumers will eat away each anothers CRCs. My gut feeling is that extending the debug loggin in igt_debugfs.c would be more useful. Or maybe we need to juggle things around a bit and have a per open fd read pointer in the kernel into the crc ringbuffer? -Daniel > --- > tools/.gitignore | 1 + > tools/Makefile.sources | 1 + > tools/intel_display_crc.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 112 insertions(+) > create mode 100644 tools/intel_display_crc.c > > diff --git a/tools/.gitignore b/tools/.gitignore > index b47fafd..5a2f5ff 100644 > --- a/tools/.gitignore > +++ b/tools/.gitignore > @@ -4,6 +4,7 @@ intel_audio_dump > intel_backlight > intel_bios_dumper > intel_bios_reader > +intel_display_crc > intel_display_poller > intel_dump_decode > intel_error_decode > diff --git a/tools/Makefile.sources b/tools/Makefile.sources > index b07a71c..5acf45a 100644 > --- a/tools/Makefile.sources > +++ b/tools/Makefile.sources > @@ -10,6 +10,7 @@ bin_PROGRAMS = \ > intel_backlight \ > intel_bios_dumper \ > intel_bios_reader \ > + intel_display_crc \ > intel_display_poller \ > intel_dump_decode \ > intel_error_decode \ > diff --git a/tools/intel_display_crc.c b/tools/intel_display_crc.c > new file mode 100644 > index 0000000..ba9ec5b > --- /dev/null > +++ b/tools/intel_display_crc.c > @@ -0,0 +1,110 @@ > +/* > + * Copyright © 2015 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: > + * Damien Lespiau <damien.lespiau@xxxxxxxxx> > + */ > + > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include <unistd.h> > + > +#include "igt_core.h" > +#include "igt_debugfs.h" > +#include "igt_kms.h" > + > +typedef struct { > + int fd; > + int pipe; > + int n_crcs; > +} display_crc_t; > + > +static int pipe_from_str(const char *str) > +{ > + unsigned char c; > + > + if (!str || strlen(str) != 1) > + return -1; > + > + c = str[0]; > + > + if (c >= 'A' && c <= 'C') > + return c - 'A'; > + > + if (c >= 'a' && c <= 'c') > + return c - 'a'; > + > + if (c >= '0' && c <= '3') > + return c - '0'; > + > + return -1; > +} > + > +static void print_crcs(display_crc_t *ctx) > +{ > + igt_pipe_crc_t *pipe_crc; > + igt_crc_t crc; > + char *crc_str; > + int i; > + > + pipe_crc = igt_pipe_crc_new(ctx->pipe, INTEL_PIPE_CRC_SOURCE_AUTO); > + > + for (i = 0; i < ctx->n_crcs; i++) { > + igt_pipe_crc_collect_crc(pipe_crc, &crc); > + > + crc_str = igt_crc_to_string(&crc); > + printf("CRC on pipe %s: %s\n", kmstest_pipe_name(ctx->pipe), > + crc_str); > + free(crc_str); > + } > + > + igt_pipe_crc_free(pipe_crc); > +} > + > +static display_crc_t ctx; > + > +int main(int argc, char **argv) > +{ > + int opt; > + > + ctx.n_crcs = 1; > + > + while ((opt = getopt(argc, argv, "p:n:")) != -1) { > + switch (opt) { > + case 'p': > + ctx.pipe = pipe_from_str(optarg); > + if (ctx.pipe == -1) { > + fprintf(stderr, "Unknown pipe %s\n", optarg); > + exit(1); > + } > + break; > + case 'n': > + ctx.n_crcs = atoi(optarg); > + break; > + default: > + igt_assert(0); > + } > + } > + > + print_crcs(&ctx); > +} > -- > 2.1.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx