2 * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd
3 * author: Jung Zhao jung.zhao@rock-chips.com
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #ifndef __VCODEC_IOMMU_OPS_H__
17 #define __VCODEC_IOMMU_OPS_H__
19 #include <linux/platform_device.h>
20 #include "vcodec_service.h"
22 #define BUFFER_LIST_MAX_NUMS 30
24 #define ALLOCATOR_USE_ION 0x00000000
25 #define ALLOCATOR_USE_DRM 0x00000001
27 #define DEBUG_IOMMU_OPS_DUMP 0x00020000
29 #define vpu_iommu_debug_func(debug_level, type, fmt, args...) \
31 if (unlikely(debug_level & type)) { \
32 pr_info("%s:%d: " fmt, \
33 __func__, __LINE__, ##args); \
36 #define vpu_iommu_debug(debug_level, type, fmt, args...) \
38 if (unlikely(debug_level & type)) { \
39 pr_info(fmt, ##args); \
43 struct vcodec_iommu_info;
44 struct vcodec_iommu_session_info;
46 struct vcodec_iommu_ops {
47 int (*create)(struct vcodec_iommu_info *iommu_info);
48 int (*import)(struct vcodec_iommu_session_info *session_info, int fd);
49 int (*free)(struct vcodec_iommu_session_info *session_info, int idx);
50 int (*free_fd)(struct vcodec_iommu_session_info *session_info, int fd);
51 void *(*map_kernel)(struct vcodec_iommu_session_info *session_info,
53 int (*unmap_kernel)(struct vcodec_iommu_session_info *session_info,
55 int (*map_iommu)(struct vcodec_iommu_session_info *session_info,
57 unsigned long *iova, unsigned long *size);
58 int (*unmap_iommu)(struct vcodec_iommu_session_info *session_info,
60 int (*destroy)(struct vcodec_iommu_info *iommu_info);
61 void (*dump)(struct vcodec_iommu_session_info *session_info);
62 int (*attach)(struct vcodec_iommu_info *iommu_info);
63 void (*detach)(struct vcodec_iommu_info *iommu_info);
64 void (*clear)(struct vcodec_iommu_session_info *session_info);
67 struct vcodec_iommu_session_info {
68 struct list_head head;
69 struct vpu_session *session;
71 struct list_head buffer_list;
72 struct mutex list_mutex;
75 struct device *mmu_dev;
76 struct vcodec_iommu_info *iommu_info;
80 struct vcodec_iommu_info {
81 struct list_head session_list;
82 struct mutex list_mutex;
83 struct mutex iommu_mutex;
85 struct device *mmu_dev;
86 struct vcodec_iommu_ops *ops;
92 void vcodec_iommu_drm_set_ops(struct vcodec_iommu_info *iommu_info);
95 void vcodec_iommu_ion_set_ops(struct vcodec_iommu_info *iommu_info);
98 struct vcodec_iommu_info *vcodec_iommu_info_create(struct device *dev,
99 struct device *mmu_dev,
101 int vcodec_iommu_info_destroy(struct vcodec_iommu_info *iommu_info);
103 int vcodec_iommu_create(struct vcodec_iommu_info *iommu_info);
104 int vcodec_iommu_import(struct vcodec_iommu_info *iommu_info,
105 struct vpu_session *session, int fd);
106 int vcodec_iommu_free(struct vcodec_iommu_info *iommu_info,
107 struct vpu_session *session, int idx);
108 int vcodec_iommu_free_fd(struct vcodec_iommu_info *iommu_info,
109 struct vpu_session *session, int fd);
110 void *vcodec_iommu_map_kernel(struct vcodec_iommu_info *iommu_info,
111 struct vpu_session *session, int idx);
112 int vcodec_iommu_unmap_kernel(struct vcodec_iommu_info *iommu_info,
113 struct vpu_session *session, int idx);
114 int vcodec_iommu_map_iommu(struct vcodec_iommu_info *iommu_info,
115 struct vpu_session *session,
118 unsigned long *size);
119 int vcodec_iommu_unmap_iommu(struct vcodec_iommu_info *iommu_info,
120 struct vpu_session *session,
122 int vcodec_iommu_destroy(struct vcodec_iommu_info *iommu_info);
123 void vcodec_iommu_dump(struct vcodec_iommu_info *iommu_info,
124 struct vpu_session *session);
125 void vcodec_iommu_clear(struct vcodec_iommu_info *iommu_info,
126 struct vpu_session *session);
128 int vcodec_iommu_attach(struct vcodec_iommu_info *iommu_info);
129 void vcodec_iommu_detach(struct vcodec_iommu_info *iommu_info);