Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | #include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/dma-buf.h>
#include <drm/drm.h>
#include "ion.h"
#include "ionutils.h"
int check_vgem(int fd)
{
drm_version_t version = { 0 };
char name[5];
int ret;
version.name_len = 4;
version.name = name;
ret = ioctl(fd, DRM_IOCTL_VERSION, &version);
if (ret)
return 1;
return strcmp(name, "vgem");
}
int open_vgem(void)
{
int i, fd;
const char *drmstr = "/dev/dri/card";
fd = -1;
for (i = 0; i < 16; i++) {
char name[80];
sprintf(name, "%s%u", drmstr, i);
fd = open(name, O_RDWR);
if (fd < 0)
continue;
if (check_vgem(fd)) {
close(fd);
continue;
} else {
break;
}
}
return fd;
}
int import_vgem_fd(int vgem_fd, int dma_buf_fd, uint32_t *handle)
{
struct drm_prime_handle import_handle = { 0 };
int ret;
import_handle.fd = dma_buf_fd;
import_handle.flags = 0;
import_handle.handle = 0;
ret = ioctl(vgem_fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &import_handle);
if (ret == 0)
*handle = import_handle.handle;
return ret;
}
void close_handle(int vgem_fd, uint32_t handle)
{
struct drm_gem_close close = { 0 };
close.handle = handle;
ioctl(vgem_fd, DRM_IOCTL_GEM_CLOSE, &close);
}
int main()
{
int ret, vgem_fd;
struct ion_buffer_info info;
uint32_t handle = 0;
struct dma_buf_sync sync = { 0 };
info.heap_type = ION_HEAP_TYPE_SYSTEM;
info.heap_size = 4096;
info.flag_type = ION_FLAG_CACHED;
ret = ion_export_buffer_fd(&info);
if (ret < 0) {
printf("ion buffer alloc failed\n");
return -1;
}
vgem_fd = open_vgem();
if (vgem_fd < 0) {
ret = vgem_fd;
printf("Failed to open vgem\n");
goto out_ion;
}
ret = import_vgem_fd(vgem_fd, info.buffd, &handle);
if (ret < 0) {
printf("Failed to import buffer\n");
goto out_vgem;
}
sync.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW;
ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync);
if (ret)
printf("sync start failed %d\n", errno);
memset(info.buffer, 0xff, 4096);
sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW;
ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync);
if (ret)
printf("sync end failed %d\n", errno);
close_handle(vgem_fd, handle);
ret = 0;
out_vgem:
close(vgem_fd);
out_ion:
ion_close_buffer_fd(&info);
printf("done.\n");
return ret;
}
|