summaryrefslogtreecommitdiff
path: root/libvgem.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-02-08 23:46:18 +0100
committerBen Widawsky <ben@bwidawsk.net>2012-02-22 19:17:42 +0100
commit3b27a238ae0ab4a1b3f9df2e9513f12b987edffb (patch)
tree73bad1e6007ff7837c4cee21ef107be63946b50b /libvgem.c
vgt: basic testsHEADmaster
Diffstat (limited to 'libvgem.c')
-rw-r--r--libvgem.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/libvgem.c b/libvgem.c
new file mode 100644
index 0000000..958e3d3
--- /dev/null
+++ b/libvgem.c
@@ -0,0 +1,91 @@
+#include <assert.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include "drm.h"
+#include "vgem_drm.h"
+#include "libvgem.h"
+
+int
+drm_open_vgem(void)
+{
+ char *name;
+ int i, fd;
+
+ for (i = 0; i < 16; i++) {
+ struct stat _stat;
+ int ret;
+ ret = asprintf(&name, "/sys/bus/platform/devices/vgem/drm/card%d", i);
+ assert(ret != -1);
+
+ if (stat(name, &_stat) == -1) {
+ free(name);
+ continue;
+ }
+
+ free(name);
+ ret = asprintf(&name, "/dev/dri/card%d", i);
+ assert(ret != -1);
+
+ fd = open(name, O_RDWR);
+ free(name);
+ if (fd == -1) {
+ perror("Couldn't open drm device read/write\n");
+ return -1;
+ }
+ return fd;
+ }
+ fprintf(stderr, "failed to open any drm device. retry as root?\n");
+ abort();
+}
+
+int
+create_vgem_bo(int fd, size_t size)
+{
+ struct drm_mode_create_dumb create;
+ int ret;
+
+ if (size == 0)
+ size = 4096;
+
+ memset(&create, 0, sizeof(create));
+ create.height = size;
+ create.width = 1;
+ create.bpp = 1;
+
+ ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
+ if (ret) {
+ fprintf(stderr, "DRM_IOCTL_MODE_CREATE_DUMB, failed with "
+ "%d\n", ret);
+ abort();
+ }
+
+ assert(create.size == size);
+
+ return create.handle;
+}
+
+void *
+mmap_vgem_bo(int fd, int handle, size_t size)
+{
+ struct drm_mode_map_dumb mmap_arg;
+ void *ptr;
+ int ret;
+
+ memset(&mmap_arg, 0, sizeof(mmap_arg));
+
+ mmap_arg.handle = handle;
+
+ ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mmap_arg);
+ assert(ret == 0);
+ assert(mmap_arg.offset != 0);
+
+ ptr = mmap(NULL, size, (PROT_READ|PROT_WRITE), MAP_PRIVATE, fd,
+ mmap_arg.offset);
+ assert(ptr != MAP_FAILED);
+
+ return ptr;
+}