blob: 3514836d26ee1ade4fcd7eb75abdb74d6d9013d8 [file] [log] [blame] [edit]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* WrapFD kernel API
*
* Copyright (C) 2025 Google, Inc.
*/
#ifndef _LINUX_WRAPFD_H
#define _LINUX_WRAPFD_H
union wrapfd_mappable {
struct dma_buf *dmabuf;
};
#ifdef CONFIG_ANDROID_WRAPFD
/* Check if the vma is mapping a wrapfd file. */
bool is_wrapfd_vma(struct vm_area_struct *vma);
/*
* Get mappable object. Caller also gets buffer ownership.
* Function does not take file references, therefore the caller should
* ensure the file is stable until wrapfd_put_mappable() is called.
*
* file: wrap file to get the mappable object.
* dev: device requesting the operation.
* mappable: mappable object.
*
* On success returns mappable object. On error returns:
* -EBADF: file is invalid.
* -ENODEV: device is invalid.
* -EINVAL: buffer is mapped.
* -EBUSY: buffer is owned by another device.
* -ENOENT: wrap is empty (buffer got freed or moved)
*/
int wrapfd_get_mappable(struct file *file, struct device *dev,
union wrapfd_mappable *mappable);
/*
* Release mappable object and buffer ownership. Caller should own the buffer.
* Note that the caller might still keep the buffer mapped. If the buffer
* is reused or freed then the next wrapfd_get_mappable() call will fail with
* -ENOENT and the mapping should be invalidated. If wrapfd_get_mappable()
* succeeds then previous mappings are still valid and can be reused.
*
* file: wrap file associated with the mappable object.
* dev: device requesting the operation.
* mappable: mappable object returned by wrapfd_get_mappable().
*
* On success returns 0. On error returns:
* -EBADF: file is invalid.
* -ENODEV: device is invalid.
* -EBUSY: buffer is not owned by the caller.
*/
int wrapfd_put_mappable(struct file *file, struct device *dev,
union wrapfd_mappable *mappable);
#else /* CONFIG_ANDROID_WRAPFD */
static inline bool is_wrapfd_vma(struct vm_area_struct *vma)
{
return false;
}
static inline int wrapfd_get_mappable(struct file *file, struct device *dev,
union wrapfd_mappable *mappable)
{
return -ENOENT;
}
static inline int wrapfd_put_mappable(struct file *file, struct device *dev,
union wrapfd_mappable *mappable)
{
return -ENOENT;
}
#endif /* CONFIG_ANDROID_WRAPFD */
#endif /* _LINUX_WRAPFD_H */