blob: e216a46a3a6fe96c6f580f769d2832cf01543037 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#ifndef _CAM_MEM_MGR_API_H_
#define _CAM_MEM_MGR_API_H_
#include <media/cam_req_mgr.h>
#include "cam_smmu_api.h"
/**
* struct cam_mem_mgr_request_desc
*
* @size : Size of memory requested for allocation
* @align : Alignment of requested memory
* @smmu_hdl: SMMU handle to identify context bank where memory will be mapped
* @flags : Flags to indicate cached/uncached property
* @region : Region where memory should be allocated
*/
struct cam_mem_mgr_request_desc {
uint64_t size;
uint64_t align;
int32_t smmu_hdl;
uint32_t flags;
};
/**
* struct cam_mem_mgr_memory_desc
*
* @kva : Kernel virtual address of allocated memory
* @iova : IOVA of allocated memory
* @smmu_hdl : SMMU handle of allocated memory
* @mem_handle : Mem handle identifying allocated memory
* @len : Length of allocated memory
* @region : Region to which allocated memory belongs
*/
struct cam_mem_mgr_memory_desc {
uintptr_t kva;
uint32_t iova;
int32_t smmu_hdl;
uint32_t mem_handle;
uint64_t len;
enum cam_smmu_region_id region;
};
/**
* @brief: Requests a memory buffer
*
* @inp: Information specifying requested buffer properties
* @out: Information about allocated buffer
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
int cam_mem_mgr_request_mem(struct cam_mem_mgr_request_desc *inp,
struct cam_mem_mgr_memory_desc *out);
/**
* @brief: Releases a memory buffer
*
* @inp: Information specifying buffer to be released
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
int cam_mem_mgr_release_mem(struct cam_mem_mgr_memory_desc *inp);
/**
* @brief: Returns IOVA information about buffer
*
* @buf_handle: Handle of the buffer
* @mmu_handle: SMMU handle where buffer is mapped
* @iova_ptr : Pointer to mmu's iova
* @len_ptr : Length of the buffer
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
int cam_mem_get_io_buf(int32_t buf_handle, int32_t mmu_handle,
dma_addr_t *iova_ptr, size_t *len_ptr);
/**
* @brief: This indicates begin of CPU access.
* Also returns CPU address information about DMA buffer
*
* @buf_handle: Handle for the buffer
* @vaddr_ptr : pointer to kernel virtual address
* @len_ptr : Length of the buffer
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
int cam_mem_get_cpu_buf(int32_t buf_handle, uintptr_t *vaddr_ptr,
size_t *len);
static inline bool cam_mem_is_secure_buf(int32_t buf_handle)
{
return CAM_MEM_MGR_IS_SECURE_HDL(buf_handle);
}
/**
* @brief: Reserves a memory region
*
* @inp: Information specifying requested region properties
* @region : Region which is to be reserved
* @out : Information about reserved region
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
int cam_mem_mgr_reserve_memory_region(struct cam_mem_mgr_request_desc *inp,
enum cam_smmu_region_id region,
struct cam_mem_mgr_memory_desc *out);
/**
* @brief: Frees a memory region
*
* @inp : Information about region which is to be freed
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
int cam_mem_mgr_free_memory_region(struct cam_mem_mgr_memory_desc *inp);
#endif /* _CAM_MEM_MGR_API_H_ */