ionmap_test.c 2.3 KB

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