From 62dce3567e9c112095a2dcb1526f1b2c4049a50d Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Wed, 19 Jun 2019 15:37:12 -0700 Subject: [PATCH] ANDROID: dma-buf: Add support to get flags associated with a buffer Allow kernel clients to get the flags associated with a buffer that is wrapped by a dma-buf. This information can be used to communicate the type of memory associated with the buffer(e.g. uncached vs cached memory). Bug: 133508579 Test: ion-unit-tests Change-Id: I82eab8beb738b258616c22a01080615d7ffb6ad5 Signed-off-by: Isaac J. Manjarres Signed-off-by: Sandeep Patil --- drivers/dma-buf/dma-buf.c | 14 ++++++++++++++ include/linux/dma-buf.h | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 22d321b743f8..d0f6e7290bcd 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -1188,6 +1188,20 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) } EXPORT_SYMBOL_GPL(dma_buf_vunmap); +int dma_buf_get_flags(struct dma_buf *dmabuf, unsigned long *flags) +{ + int ret = 0; + + if (WARN_ON(!dmabuf) || !flags) + return -EINVAL; + + if (dmabuf->ops->get_flags) + ret = dmabuf->ops->get_flags(dmabuf, flags); + + return ret; +} +EXPORT_SYMBOL_GPL(dma_buf_get_flags); + #ifdef CONFIG_DEBUG_FS static int dma_buf_debug_show(struct seq_file *s, void *unused) { diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 5d3fe7ccc749..1e148a48d706 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -318,6 +318,20 @@ struct dma_buf_ops { void *(*vmap)(struct dma_buf *); void (*vunmap)(struct dma_buf *, void *vaddr); + + /** + * @get_flags: + * + * This is called by dma_buf_get_flags and is used to get the buffer's + * flags. + * This callback is optional. + * + * Returns: + * + * 0 on success or a negative error code on failure. On success flags + * will be populated with the buffer's flags. + */ + int (*get_flags)(struct dma_buf *dmabuf, unsigned long *flags); }; /** @@ -486,4 +500,5 @@ int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *, unsigned long); void *dma_buf_vmap(struct dma_buf *); void dma_buf_vunmap(struct dma_buf *, void *vaddr); +int dma_buf_get_flags(struct dma_buf *dmabuf, unsigned long *flags); #endif /* __DMA_BUF_H__ */