From ac08d0891a969acc5d4a2f9b0ce56e75dc565f59 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 15 Oct 2018 14:08:59 +0200 Subject: add virtiotest --- virtiotest.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 virtiotest.c (limited to 'virtiotest.c') diff --git a/virtiotest.c b/virtiotest.c new file mode 100644 index 0000000..bd87073 --- /dev/null +++ b/virtiotest.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "virtgpu_drm.h" + +#include +#include + +#include +#include + +#include "drmtools.h" + +/* ------------------------------------------------------------------ */ + +static struct { + uint64_t cap; + const char *name; +} virtio_caps[] = { + { .cap = VIRTGPU_PARAM_3D_FEATURES, .name = "virgl-3d" }, +#ifdef VIRTGPU_PARAM_CAPSET_QUERY_FIX + { .cap = VIRTGPU_PARAM_CAPSET_QUERY_FIX, .name = "capset-fix" }, +#endif +}; + +static uint64_t virtio_get_cap(uint64_t cap) +{ + struct drm_virtgpu_getparam param = { + .param = cap, + .value = 0, + }; + int ret; + + ret = ioctl(fd, DRM_VIRTGPU_GETPARAM, ¶m); + if (ret != 0) { + fprintf(stderr, "ioctl DRM_VIRTGPU_GETPARAM(%" PRId64 "): %s\n", + cap, strerror(errno)); + exit(1); + } + return param.value; +} + +static void virtio_print_caps(void) +{ + uint64_t value; + int i; + + printf("virtio capabilities\n"); + for (i = 0; i < sizeof(virtio_caps)/sizeof(virtio_caps[0]); i++) { + value = virtio_get_cap(virtio_caps[i].cap); + printf(" %s: %" PRId64 "\n", virtio_caps[i].name, value); + } +} + +/* ------------------------------------------------------------------ */ + +static void usage(FILE *fp) +{ + fprintf(fp, + "\n" + "usage: virtiotest [ options ]\n" + "\n" + "options:\n" + " -h print this\n" + " -c pick card\n" + " -i print device info\n" + "\n"); +} + +int main(int argc, char **argv) +{ + int card = 0; + char *output = NULL; + char *modename = NULL; + bool printinfo = false; + int c; + + for (;;) { + c = getopt(argc, argv, "hic:"); + if (c == -1) + break; + switch (c) { + case 'c': + card = atoi(optarg); + break; + case 'i': + printinfo = true; + break; + case 'h': + usage(stdout); + exit(0); + default: + usage(stderr); + exit(1); + } + } + + drm_init_dev(card, output, modename, false); + + if (printinfo) { + virtio_print_caps(); + } + + drm_fini_dev(); + return 0; +} -- cgit