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