xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/rga3/include/rga_mm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun static 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