mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-10 17:36:11 +00:00
lib: Add prime_sync_start and prime_sync_end helpers
This patch adds dma-buf mmap synchronization ioctls that can be used by tests for cache coherency management e.g. when CPU and GPU domains are being accessed through dma-buf at the same time. v7: add sync invalid flags test. Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
This commit is contained in:
parent
4730edbe8a
commit
e4504b0e82
@ -1492,6 +1492,32 @@ off_t prime_get_size(int dma_buf_fd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* prime_sync_start
|
||||
* @dma_buf_fd: dma-buf fd handle
|
||||
*/
|
||||
void prime_sync_start(int dma_buf_fd)
|
||||
{
|
||||
struct local_dma_buf_sync sync_start;
|
||||
|
||||
memset(&sync_start, 0, sizeof(sync_start));
|
||||
sync_start.flags = LOCAL_DMA_BUF_SYNC_START | LOCAL_DMA_BUF_SYNC_RW;
|
||||
do_ioctl(dma_buf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start);
|
||||
}
|
||||
|
||||
/**
|
||||
* prime_sync_end
|
||||
* @dma_buf_fd: dma-buf fd handle
|
||||
*/
|
||||
void prime_sync_end(int dma_buf_fd)
|
||||
{
|
||||
struct local_dma_buf_sync sync_end;
|
||||
|
||||
memset(&sync_end, 0, sizeof(sync_end));
|
||||
sync_end.flags = LOCAL_DMA_BUF_SYNC_END | LOCAL_DMA_BUF_SYNC_RW;
|
||||
do_ioctl(dma_buf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end);
|
||||
}
|
||||
|
||||
/**
|
||||
* igt_require_fb_modifiers:
|
||||
* @fd: Open DRM file descriptor.
|
||||
|
@ -153,6 +153,21 @@ void gem_require_caching(int fd);
|
||||
void gem_require_ring(int fd, int ring_id);
|
||||
|
||||
/* prime */
|
||||
struct local_dma_buf_sync {
|
||||
uint64_t flags;
|
||||
};
|
||||
|
||||
#define LOCAL_DMA_BUF_SYNC_READ (1 << 0)
|
||||
#define LOCAL_DMA_BUF_SYNC_WRITE (2 << 0)
|
||||
#define LOCAL_DMA_BUF_SYNC_RW (LOCAL_DMA_BUF_SYNC_READ | LOCAL_DMA_BUF_SYNC_WRITE)
|
||||
#define LOCAL_DMA_BUF_SYNC_START (0 << 2)
|
||||
#define LOCAL_DMA_BUF_SYNC_END (1 << 2)
|
||||
#define LOCAL_DMA_BUF_SYNC_VALID_FLAGS_MASK \
|
||||
(LOCAL_DMA_BUF_SYNC_RW | LOCAL_DMA_BUF_SYNC_END)
|
||||
|
||||
#define LOCAL_DMA_BUF_BASE 'b'
|
||||
#define LOCAL_DMA_BUF_IOCTL_SYNC _IOW(LOCAL_DMA_BUF_BASE, 0, struct local_dma_buf_sync)
|
||||
|
||||
int prime_handle_to_fd(int fd, uint32_t handle);
|
||||
#ifndef DRM_RDWR
|
||||
#define DRM_RDWR O_RDWR
|
||||
@ -160,6 +175,8 @@ int prime_handle_to_fd(int fd, uint32_t handle);
|
||||
int prime_handle_to_fd_for_mmap(int fd, uint32_t handle);
|
||||
uint32_t prime_fd_to_handle(int fd, int dma_buf_fd);
|
||||
off_t prime_get_size(int dma_buf_fd);
|
||||
void prime_sync_start(int dma_buf_fd);
|
||||
void prime_sync_end(int dma_buf_fd);
|
||||
|
||||
/* addfb2 fb modifiers */
|
||||
struct local_drm_mode_fb_cmd2 {
|
||||
|
@ -401,6 +401,30 @@ test_errors(void)
|
||||
gem_close(fd, handle);
|
||||
}
|
||||
|
||||
/* Test for invalid flags on sync ioctl */
|
||||
static void
|
||||
test_invalid_sync_flags(void)
|
||||
{
|
||||
int i, dma_buf_fd;
|
||||
uint32_t handle;
|
||||
struct local_dma_buf_sync sync;
|
||||
int invalid_flags[] = {-1,
|
||||
0x00,
|
||||
LOCAL_DMA_BUF_SYNC_RW + 1,
|
||||
LOCAL_DMA_BUF_SYNC_VALID_FLAGS_MASK + 1};
|
||||
|
||||
handle = gem_create(fd, BO_SIZE);
|
||||
dma_buf_fd = prime_handle_to_fd(fd, handle);
|
||||
for (i = 0; i < sizeof(invalid_flags) / sizeof(invalid_flags[0]); i++) {
|
||||
memset(&sync, 0, sizeof(sync));
|
||||
sync.flags = invalid_flags[i];
|
||||
|
||||
drmIoctl(dma_buf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync);
|
||||
igt_assert_eq(errno, EINVAL);
|
||||
errno = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
test_aperture_limit(void)
|
||||
{
|
||||
@ -473,6 +497,7 @@ igt_main
|
||||
{ "test_dup", test_dup },
|
||||
{ "test_userptr", test_userptr },
|
||||
{ "test_errors", test_errors },
|
||||
{ "test_invalid_sync_flags", test_invalid_sync_flags },
|
||||
{ "test_aperture_limit", test_aperture_limit },
|
||||
};
|
||||
int i;
|
||||
|
Loading…
x
Reference in New Issue
Block a user