108 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
#define _GNU_SOURCE
 | 
						|
#define __EXPORTED_HEADERS__
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <string.h>
 | 
						|
#include <errno.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <malloc.h>
 | 
						|
 | 
						|
#include <sys/ioctl.h>
 | 
						|
#include <sys/syscall.h>
 | 
						|
#include <linux/memfd.h>
 | 
						|
#include <linux/udmabuf.h>
 | 
						|
 | 
						|
#define TEST_PREFIX	"drivers/dma-buf/udmabuf"
 | 
						|
#define NUM_PAGES       4
 | 
						|
 | 
						|
static int memfd_create(const char *name, unsigned int flags)
 | 
						|
{
 | 
						|
	return syscall(__NR_memfd_create, name, flags);
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
	struct udmabuf_create create;
 | 
						|
	int devfd, memfd, buf, ret;
 | 
						|
	off_t size;
 | 
						|
	void *mem;
 | 
						|
 | 
						|
	devfd = open("/dev/udmabuf", O_RDWR);
 | 
						|
	if (devfd < 0) {
 | 
						|
		printf("%s: [skip,no-udmabuf: Unable to access DMA buffer device file]\n",
 | 
						|
		       TEST_PREFIX);
 | 
						|
		exit(77);
 | 
						|
	}
 | 
						|
 | 
						|
	memfd = memfd_create("udmabuf-test", MFD_ALLOW_SEALING);
 | 
						|
	if (memfd < 0) {
 | 
						|
		printf("%s: [skip,no-memfd]\n", TEST_PREFIX);
 | 
						|
		exit(77);
 | 
						|
	}
 | 
						|
 | 
						|
	ret = fcntl(memfd, F_ADD_SEALS, F_SEAL_SHRINK);
 | 
						|
	if (ret < 0) {
 | 
						|
		printf("%s: [skip,fcntl-add-seals]\n", TEST_PREFIX);
 | 
						|
		exit(77);
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	size = getpagesize() * NUM_PAGES;
 | 
						|
	ret = ftruncate(memfd, size);
 | 
						|
	if (ret == -1) {
 | 
						|
		printf("%s: [FAIL,memfd-truncate]\n", TEST_PREFIX);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	memset(&create, 0, sizeof(create));
 | 
						|
 | 
						|
	/* should fail (offset not page aligned) */
 | 
						|
	create.memfd  = memfd;
 | 
						|
	create.offset = getpagesize()/2;
 | 
						|
	create.size   = getpagesize();
 | 
						|
	buf = ioctl(devfd, UDMABUF_CREATE, &create);
 | 
						|
	if (buf >= 0) {
 | 
						|
		printf("%s: [FAIL,test-1]\n", TEST_PREFIX);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	/* should fail (size not multiple of page) */
 | 
						|
	create.memfd  = memfd;
 | 
						|
	create.offset = 0;
 | 
						|
	create.size   = getpagesize()/2;
 | 
						|
	buf = ioctl(devfd, UDMABUF_CREATE, &create);
 | 
						|
	if (buf >= 0) {
 | 
						|
		printf("%s: [FAIL,test-2]\n", TEST_PREFIX);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	/* should fail (not memfd) */
 | 
						|
	create.memfd  = 0; /* stdin */
 | 
						|
	create.offset = 0;
 | 
						|
	create.size   = size;
 | 
						|
	buf = ioctl(devfd, UDMABUF_CREATE, &create);
 | 
						|
	if (buf >= 0) {
 | 
						|
		printf("%s: [FAIL,test-3]\n", TEST_PREFIX);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	/* should work */
 | 
						|
	create.memfd  = memfd;
 | 
						|
	create.offset = 0;
 | 
						|
	create.size   = size;
 | 
						|
	buf = ioctl(devfd, UDMABUF_CREATE, &create);
 | 
						|
	if (buf < 0) {
 | 
						|
		printf("%s: [FAIL,test-4]\n", TEST_PREFIX);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	fprintf(stderr, "%s: ok\n", TEST_PREFIX);
 | 
						|
	close(buf);
 | 
						|
	close(memfd);
 | 
						|
	close(devfd);
 | 
						|
	return 0;
 | 
						|
}
 |