diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2012-02-08 23:46:18 +0100 |
---|---|---|
committer | Ben Widawsky <ben@bwidawsk.net> | 2012-02-22 19:17:42 +0100 |
commit | 3b27a238ae0ab4a1b3f9df2e9513f12b987edffb (patch) | |
tree | 73bad1e6007ff7837c4cee21ef107be63946b50b /libvgem.c |
Diffstat (limited to 'libvgem.c')
-rw-r--r-- | libvgem.c | 91 |
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; +} |