13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * DMABUF Heaps Allocation Infrastructure
43d0407baSopenharmony_ci *
53d0407baSopenharmony_ci * Copyright (C) 2011 Google, Inc.
63d0407baSopenharmony_ci * Copyright (C) 2019 Linaro Ltd.
73d0407baSopenharmony_ci */
83d0407baSopenharmony_ci
93d0407baSopenharmony_ci#ifndef DMA_HEAPS_H
103d0407baSopenharmony_ci#define DMA_HEAPS_H
113d0407baSopenharmony_ci
123d0407baSopenharmony_ci#include <linux/cdev.h>
133d0407baSopenharmony_ci#include <linux/types.h>
143d0407baSopenharmony_ci
153d0407baSopenharmony_cistruct dma_heap;
163d0407baSopenharmony_ci
173d0407baSopenharmony_ci/**
183d0407baSopenharmony_ci * struct dma_heap_ops - ops to operate on a given heap
193d0407baSopenharmony_ci * @allocate:        allocate dmabuf and return struct dma_buf ptr
203d0407baSopenharmony_ci * @get_pool_size:    if heap maintains memory pools, get pool size in bytes
213d0407baSopenharmony_ci *
223d0407baSopenharmony_ci * allocate returns dmabuf on success, ERR_PTR(-errno) on error.
233d0407baSopenharmony_ci */
243d0407baSopenharmony_cistruct dma_heap_ops {
253d0407baSopenharmony_ci    struct dma_buf *(*allocate)(struct dma_heap *heap, unsigned long len, unsigned long fd_flags,
263d0407baSopenharmony_ci                                unsigned long heap_flags);
273d0407baSopenharmony_ci    long (*get_pool_size)(struct dma_heap *heap);
283d0407baSopenharmony_ci};
293d0407baSopenharmony_ci
303d0407baSopenharmony_ci/**
313d0407baSopenharmony_ci * struct dma_heap_export_info - information needed to export a new dmabuf heap
323d0407baSopenharmony_ci * @name:    used for debugging/device-node name
333d0407baSopenharmony_ci * @ops:    ops struct for this heap
343d0407baSopenharmony_ci * @priv:    heap exporter private data
353d0407baSopenharmony_ci *
363d0407baSopenharmony_ci * Information needed to export a new dmabuf heap.
373d0407baSopenharmony_ci */
383d0407baSopenharmony_cistruct dma_heap_export_info {
393d0407baSopenharmony_ci    const char *name;
403d0407baSopenharmony_ci    const struct dma_heap_ops *ops;
413d0407baSopenharmony_ci    void *priv;
423d0407baSopenharmony_ci};
433d0407baSopenharmony_ci
443d0407baSopenharmony_ci/**
453d0407baSopenharmony_ci * dma_heap_get_drvdata() - get per-heap driver data
463d0407baSopenharmony_ci * @heap: DMA-Heap to retrieve private data for
473d0407baSopenharmony_ci *
483d0407baSopenharmony_ci * Returns:
493d0407baSopenharmony_ci * The per-heap data for the heap.
503d0407baSopenharmony_ci */
513d0407baSopenharmony_civoid *dma_heap_get_drvdata(struct dma_heap *heap);
523d0407baSopenharmony_ci
533d0407baSopenharmony_ci/**
543d0407baSopenharmony_ci * dma_heap_get_dev() - get device struct for the heap
553d0407baSopenharmony_ci * @heap: DMA-Heap to retrieve device struct from
563d0407baSopenharmony_ci *
573d0407baSopenharmony_ci * Returns:
583d0407baSopenharmony_ci * The device struct for the heap.
593d0407baSopenharmony_ci */
603d0407baSopenharmony_cistruct device *dma_heap_get_dev(struct dma_heap *heap);
613d0407baSopenharmony_ci
623d0407baSopenharmony_ci/**
633d0407baSopenharmony_ci * dma_heap_get_name() - get heap name
643d0407baSopenharmony_ci * @heap: DMA-Heap to retrieve private data for
653d0407baSopenharmony_ci *
663d0407baSopenharmony_ci * Returns:
673d0407baSopenharmony_ci * The char* for the heap name.
683d0407baSopenharmony_ci */
693d0407baSopenharmony_ciconst char *dma_heap_get_name(struct dma_heap *heap);
703d0407baSopenharmony_ci
713d0407baSopenharmony_ci/**
723d0407baSopenharmony_ci * dma_heap_add - adds a heap to dmabuf heaps
733d0407baSopenharmony_ci * @exp_info:        information needed to register this heap
743d0407baSopenharmony_ci */
753d0407baSopenharmony_cistruct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info);
763d0407baSopenharmony_ci
773d0407baSopenharmony_ci/**
783d0407baSopenharmony_ci * dma_heap_put - drops a reference to a dmabuf heaps, potentially freeing it
793d0407baSopenharmony_ci * @heap:        heap pointer
803d0407baSopenharmony_ci */
813d0407baSopenharmony_civoid dma_heap_put(struct dma_heap *heap);
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci/**
843d0407baSopenharmony_ci * dma_heap_find - Returns the registered dma_heap with the specified name
853d0407baSopenharmony_ci * @name: Name of the heap to find
863d0407baSopenharmony_ci *
873d0407baSopenharmony_ci * NOTE: dma_heaps returned from this function MUST be released
883d0407baSopenharmony_ci * using dma_heap_put() when the user is done.
893d0407baSopenharmony_ci */
903d0407baSopenharmony_cistruct dma_heap *dma_heap_find(const char *name);
913d0407baSopenharmony_ci
923d0407baSopenharmony_ci/**
933d0407baSopenharmony_ci * dma_heap_buffer_alloc - Allocate dma-buf from a dma_heap
943d0407baSopenharmony_ci * @heap:    dma_heap to allocate from
953d0407baSopenharmony_ci * @len:    size to allocate
963d0407baSopenharmony_ci * @fd_flags:    flags to set on returned dma-buf fd
973d0407baSopenharmony_ci * @heap_flags:    flags to pass to the dma heap
983d0407baSopenharmony_ci *
993d0407baSopenharmony_ci * This is for internal dma-buf allocations only.
1003d0407baSopenharmony_ci */
1013d0407baSopenharmony_cistruct dma_buf *dma_heap_buffer_alloc(struct dma_heap *heap, size_t len, unsigned int fd_flags,
1023d0407baSopenharmony_ci                                      unsigned int heap_flags);
1033d0407baSopenharmony_ci
1043d0407baSopenharmony_ci/** dma_heap_buffer_free - Free dma_buf allocated by dma_heap_buffer_alloc
1053d0407baSopenharmony_ci * @dma_buf:    dma_buf to free
1063d0407baSopenharmony_ci *
1073d0407baSopenharmony_ci * This is really only a simple wrapper to dma_buf_put()
1083d0407baSopenharmony_ci */
1093d0407baSopenharmony_civoid dma_heap_buffer_free(struct dma_buf *);
1103d0407baSopenharmony_ci
1113d0407baSopenharmony_ci/**
1123d0407baSopenharmony_ci * dma_heap_bufferfd_alloc - Allocate dma-buf fd from a dma_heap
1133d0407baSopenharmony_ci * @heap:    dma_heap to allocate from
1143d0407baSopenharmony_ci * @len:    size to allocate
1153d0407baSopenharmony_ci * @fd_flags:    flags to set on returned dma-buf fd
1163d0407baSopenharmony_ci * @heap_flags:    flags to pass to the dma heap
1173d0407baSopenharmony_ci */
1183d0407baSopenharmony_ciint dma_heap_bufferfd_alloc(struct dma_heap *heap, size_t len, unsigned int fd_flags, unsigned int heap_flags);
1193d0407baSopenharmony_ci#endif /* _DMA_HEAPS_H */
120