123456789101112131415161718192021222324252627282930313233343536373839 |
- class GraphicsBase:
- def get_n_fb_crc(self, *, count=10, uniq=False, timeout=-1):
- """
- Return count DRM CRC from the framebuffer. If uniq is True,
- only unique CRCs are returned (which may be less than the
- requested cont).
- Returns a possibly empty list of integers.
- Set timeout to -1 for no timeout, or to a positive number for
- a timeout of that many seconds.
- """
- # DRM CRCs are exposed through a sysfs pseudo file
- try:
- self.debugfs_mounted
- except AttributeError:
- # Note: some init system (e.g. systemd) may have this already
- # mounted, so check beforehand
- self.assertRunOk("mountpoint /sys/kernel/debug/ || mount -t debugfs none /sys/kernel/debug/")
- self.debugfs_mounted = True
- # The first column is the frame number, the second column is the
- # CRC measure. We use "head" to get the needed CRC count.
- disp_crc_path = "/sys/kernel/debug/dri/0/crtc-0/crc/data"
- cmd = f"head -{count} {disp_crc_path}"
- # The DRM CRC sysfs pseudo file lines are terminated by '\n'
- # and '\0'. We remove the '\0' to have a text-only output.
- cmd += " | tr -d '\\000'"
- # Finally, we drop the frame counter, and keep only the second
- # column (CRC values)
- cmd += " | cut -f 2 -d ' '"
- if uniq:
- cmd += " | sort -u"
- output, exit_code = self.emulator.run(cmd, timeout=timeout)
- self.assertTrue(exit_code == 0, f"'{cmd}' failed with exit code {exit_code}")
- return [int(crc, 16) for crc in output]
|