/** * igt_pipe_crc_start: * @pipe_crc: pipe CRC object * * Starts the CRC capture process on @pipe_crc. */ void igt_pipe_crc_start(igt_pipe_crc_t *pipe_crc) { igt_crc_t crc; igt_assert(igt_pipe_crc_do_start(pipe_crc)); /* * For some no yet identified reason, the first CRC is bonkers. So * let's just wait for the next vblank and read out the buggy result. * * On CHV sometimes the second CRC is bonkers as well, so don't trust * that one either. */ read_one_crc(pipe_crc, &crc); read_one_crc(pipe_crc, &crc); }
/** * igt_pipe_crc_collect_crc: * @pipe_crc: pipe CRC object * @out_crc: buffer for the captured CRC values * * Read a single CRC from @pipe_crc. This function blocks until the CRC is * retrieved. @out_crc must be allocated by the caller. * * This function takes care of the pipe_crc book-keeping, it will start/stop * the collection of the CRC. * * This function also calls the interactive debug with the "crc" domain, so you * can make use of this feature to actually see the screen that is being CRC'd. */ void igt_pipe_crc_collect_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out_crc) { igt_debug_wait_for_keypress("crc"); igt_pipe_crc_start(pipe_crc); read_one_crc(pipe_crc, out_crc); igt_pipe_crc_stop(pipe_crc); crc_sanity_checks(out_crc); }
/** * igt_pipe_crc_get_crcs: * @pipe_crc: pipe CRC object * @n_crcs: number of CRCs to capture * @out_crcs: buffer pointer for the captured CRC values * * Read @n_crcs from @pipe_crc. This function blocks until @n_crcs are * retrieved. @out_crcs is alloced by this function and must be released with * free() by the caller. * * Callers must start and stop the capturing themselves by calling * igt_pipe_crc_start() and igt_pipe_crc_stop(). */ void igt_pipe_crc_get_crcs(igt_pipe_crc_t *pipe_crc, int n_crcs, igt_crc_t **out_crcs) { igt_crc_t *crcs; int n = 0; crcs = calloc(n_crcs, sizeof(igt_crc_t)); do { igt_crc_t *crc = &crcs[n]; if (!read_one_crc(pipe_crc, crc)) continue; n++; } while (n < n_crcs); *out_crcs = crcs; }