1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) Rockchip Electronics Co., Ltd. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Author: 6*4882a593Smuzhiyun * Cerf Yu <cerf.yu@rock-chips.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __LINUX_RKRGA_MM_H_ 10*4882a593Smuzhiyun #define __LINUX_RKRGA_MM_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include "rga_drv.h" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun enum rga_mm_flag { 15*4882a593Smuzhiyun /* It will identify whether the buffer is within 0 ~ 4G. */ 16*4882a593Smuzhiyun RGA_MEM_UNDER_4G = 1 << 0, 17*4882a593Smuzhiyun /* Logo enable IOMMU */ 18*4882a593Smuzhiyun RGA_MEM_NEED_USE_IOMMU = 1 << 1, 19*4882a593Smuzhiyun /* Flag this is a physical contiguous memory. */ 20*4882a593Smuzhiyun RGA_MEM_PHYSICAL_CONTIGUOUS = 1 << 2, 21*4882a593Smuzhiyun /* need force flush cache */ 22*4882a593Smuzhiyun RGA_MEM_FORCE_FLUSH_CACHE = 1 << 3, 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct rga_mm { 26*4882a593Smuzhiyun struct mutex lock; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* 29*4882a593Smuzhiyun * @memory_idr: 30*4882a593Smuzhiyun * 31*4882a593Smuzhiyun * Mapping of memory object handles to object pointers. Used by the GEM 32*4882a593Smuzhiyun * subsystem. Protected by @memory_lock. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun struct idr memory_idr; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* the count of buffer in the cached_list */ 37*4882a593Smuzhiyun int buffer_count; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun rga_mm_is_invalid_dma_buffer(struct rga_dma_buffer * buffer)40*4882a593Smuzhiyunstatic inline bool rga_mm_is_invalid_dma_buffer(struct rga_dma_buffer *buffer) 41*4882a593Smuzhiyun { 42*4882a593Smuzhiyun if (buffer == NULL) 43*4882a593Smuzhiyun return true; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun return buffer->scheduler == NULL ? true : false; 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct rga_internal_buffer *rga_mm_lookup_handle(struct rga_mm *mm_session, uint32_t handle); 49*4882a593Smuzhiyun int rga_mm_lookup_flag(struct rga_mm *mm_session, uint64_t handle); 50*4882a593Smuzhiyun dma_addr_t rga_mm_lookup_iova(struct rga_internal_buffer *buffer); 51*4882a593Smuzhiyun struct sg_table *rga_mm_lookup_sgt(struct rga_internal_buffer *buffer); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun void rga_mm_dump_buffer(struct rga_internal_buffer *dump_buffer); 54*4882a593Smuzhiyun void rga_mm_dump_info(struct rga_mm *session); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun int rga_mm_map_job_info(struct rga_job *job); 57*4882a593Smuzhiyun void rga_mm_unmap_job_info(struct rga_job *job); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun uint32_t rga_mm_import_buffer(struct rga_external_buffer *external_buffer, 60*4882a593Smuzhiyun struct rga_session *session); 61*4882a593Smuzhiyun int rga_mm_release_buffer(uint32_t handle); 62*4882a593Smuzhiyun int rga_mm_session_release_buffer(struct rga_session *session); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun int rga_mm_init(struct rga_mm **session); 65*4882a593Smuzhiyun int rga_mm_remove(struct rga_mm **session); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #endif 68