# Copyright 2017 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

include <asm/ioctl.h>
include <uapi/linux/fcntl.h>
include <uapi/linux/dma-buf.h>
include <drivers/staging/android/uapi/ion.h>

resource fd_ion[fd]
resource fd_dma_buf[fd]

openat$ion(fd const[AT_FDCWD], file ptr[in, string["/dev/ion"]], flags flags[open_flags], mode const[0]) fd_ion

ioctl$ION_IOC_ALLOC(fd fd_ion, cmd const[ION_IOC_ALLOC], arg ptr[inout, ion_allocation_data])
ioctl$ION_IOC_HEAP_QUERY(fd fd_ion, cmd const[ION_IOC_HEAP_QUERY], arg ptr[inout, ion_heap_query])

ioctl$DMA_BUF_IOCTL_SYNC(fd fd_dma_buf, cmd const[DMA_BUF_IOCTL_SYNC], arg ptr[in, flags[dma_buf_sync_flags, int64]])

ion_allocation_data {
	len		int64
	heap_id_mask	flags[ion_heap_mask, int32]
	flags		flags[ion_alloc_flags, int32]
	fd		fd_dma_buf[opt]
	unused		const[0, int32]
}

ion_heap_query {
	cnt		len[heaps, int32]
	reserved0	const[0, int32]
	heaps		ptr64[out, ion_heap_data]
	reserved1	const[0, int32]
	reserved2	const[0, int32]
}

ion_heap_data {
	name		string["name", MAX_HEAP_NAME]
	type		int32
	heap_id		int32
	reserved0	int32
	reserved1	int32
	reserved2	int32
}

ion_alloc_flags = ION_FLAG_CACHED
ion_heap_mask = ION_HEAP_TYPE_SYSTEM_BIT, ION_HEAP_TYPE_SYSTEM_CONTIG_BIT, ION_HEAP_TYPE_CARVEOUT_BIT, ION_HEAP_TYPE_CHUNK_BIT, ION_HEAP_TYPE_DMA_BIT, ION_HEAP_TYPE_CUSTOM_BIT
dma_buf_sync_flags = DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, DMA_BUF_SYNC_END

define ION_HEAP_TYPE_SYSTEM_BIT	1 << ION_HEAP_TYPE_SYSTEM
define ION_HEAP_TYPE_SYSTEM_CONTIG_BIT	1 << ION_HEAP_TYPE_SYSTEM_CONTIG
define ION_HEAP_TYPE_CARVEOUT_BIT	1 << ION_HEAP_TYPE_CARVEOUT
define ION_HEAP_TYPE_CHUNK_BIT	1 << ION_HEAP_TYPE_CHUNK
define ION_HEAP_TYPE_DMA_BIT	1 << ION_HEAP_TYPE_DMA
define ION_HEAP_TYPE_CUSTOM_BIT	1 << ION_HEAP_TYPE_CUSTOM
