On 3/6/19 10:14 AM, Benjamin Gaignard wrote: > Le mar. 5 mars 2019 à 21:54, John Stultz <john.stu...@linaro.org> a écrit : >> >> Add very trivial allocation test for dma-heaps. >> >> TODO: Need to actually do some validation on >> the returned dma-buf. >> >> Cc: Laura Abbott <labb...@redhat.com> >> Cc: Benjamin Gaignard <benjamin.gaign...@linaro.org> >> Cc: Greg KH <gre...@linuxfoundation.org> >> Cc: Sumit Semwal <sumit.sem...@linaro.org> >> Cc: Liam Mark <lm...@codeaurora.org> >> Cc: Brian Starkey <brian.star...@arm.com> >> Cc: Andrew F. Davis <a...@ti.com> >> Cc: Chenbo Feng <fe...@google.com> >> Cc: Alistair Strachan <astrac...@google.com> >> Cc: dri-devel@lists.freedesktop.org >> Signed-off-by: John Stultz <john.stu...@linaro.org> >> --- >> v2: Switched to use reworked dma-heap apis >> --- >> tools/testing/selftests/dmabuf-heaps/Makefile | 11 +++ >> tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c | 96 >> ++++++++++++++++++++++ >> 2 files changed, 107 insertions(+) >> create mode 100644 tools/testing/selftests/dmabuf-heaps/Makefile >> create mode 100644 tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >> >> diff --git a/tools/testing/selftests/dmabuf-heaps/Makefile >> b/tools/testing/selftests/dmabuf-heaps/Makefile >> new file mode 100644 >> index 0000000..c414ad3 >> --- /dev/null >> +++ b/tools/testing/selftests/dmabuf-heaps/Makefile >> @@ -0,0 +1,11 @@ >> +# SPDX-License-Identifier: GPL-2.0 >> +CFLAGS += -static -O3 -Wl,-no-as-needed -Wall >> +#LDLIBS += -lrt -lpthread -lm >> + >> +# these are all "safe" tests that don't modify >> +# system time or require escalated privileges >> +TEST_GEN_PROGS = dmabuf-heap >> + >> + >> +include ../lib.mk >> + >> diff --git a/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >> b/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >> new file mode 100644 >> index 0000000..06837a4 >> --- /dev/null >> +++ b/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >> @@ -0,0 +1,96 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> + >> +#include <dirent.h> >> +#include <errno.h> >> +#include <fcntl.h> >> +#include <stdio.h> >> +#include <string.h> >> +#include <unistd.h> >> +#include <sys/ioctl.h> >> +#include <sys/mman.h> >> +#include <sys/types.h> >> + >> +#include "../../../../include/uapi/linux/dma-heap.h" >> + >> +#define DEVPATH "/dev/dma_heap" >> + >> +int dmabuf_heap_open(char *name) >> +{ >> + int ret, fd; >> + char buf[256]; >> + >> + ret = sprintf(buf, "%s/%s", DEVPATH, name); >> + if (ret < 0) { >> + printf("sprintf failed!\n"); >> + return ret; >> + } >> + >> + fd = open(buf, O_RDWR); >> + if (fd < 0) >> + printf("open %s failed!\n", buf); >> + return fd; >> +} >> + >> +int dmabuf_heap_alloc(int fd, size_t len, unsigned int flags, int >> *dmabuf_fd) >> +{ >> + struct dma_heap_allocation_data data = { >> + .len = len, >> + .flags = flags, >> + }; >> + int ret; >> + >> + if (dmabuf_fd == NULL) >> + return -EINVAL; >> + >> + ret = ioctl(fd, DMA_HEAP_IOC_ALLOC, &data); >> + if (ret < 0) >> + return ret; >> + *dmabuf_fd = (int)data.fd; >> + return ret; >> +} >> + >> +#define ONE_MEG (1024*1024) >> + >> +void do_test(char *heap_name) >> +{ >> + int heap_fd = -1, dmabuf_fd = -1; >> + int ret; >> + >> + printf("Testing heap: %s\n", heap_name); >> + >> + heap_fd = dmabuf_heap_open(heap_name); >> + if (heap_fd < 0) >> + return; >> + >> + printf("Allocating 1 MEG\n"); >> + ret = dmabuf_heap_alloc(heap_fd, ONE_MEG, 0, &dmabuf_fd); >> + if (ret) >> + goto out; >> + >> + /* DO SOMETHING WITH THE DMABUF HERE? */ > > You can do a call to mmap and write a pattern in the buffer. >
mmap is optional for DMA-BUFs, only attach/map are required. To test those we would need a dummy device, so a test kernel module may be needed to really exercise this. I have one I use for ION buffer testing, it consumes a DMA-BUF passed from userspace, attach/maps it to a dummy device then return the physical address of the first page of the buffer for validation. Might be a good test, but dummy devices don't always have the proper dma attributes set like a real device does, so it may also fail for some otherwise valid buffers. Andrew > Benjamin >> + >> +out: >> + if (dmabuf_fd >= 0) >> + close(dmabuf_fd); >> + if (heap_fd >= 0) >> + close(heap_fd); >> +} >> + >> + >> +int main(void) >> +{ >> + DIR *d; >> + struct dirent *dir; >> + >> + d = opendir(DEVPATH); >> + if (!d) { >> + printf("No %s directory?\n", DEVPATH); >> + return -1; >> + } >> + >> + while ((dir = readdir(d)) != NULL) >> + do_test(dir->d_name); >> + >> + >> + return 0; >> +} >> -- >> 2.7.4 >> > > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel