46c721a9094be7276e13a21f80b61d10219da629
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / vcodec / vcodec_iommu_ops.h
1 /**
2  * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd
3  * author: Jung Zhao jung.zhao@rock-chips.com
4  *
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.
8  *
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.
13  *
14  */
15
16 #ifndef __VCODEC_IOMMU_OPS_H__
17 #define __VCODEC_IOMMU_OPS_H__
18
19 #include <linux/platform_device.h>
20 #include "vcodec_service.h"
21
22 #define BUFFER_LIST_MAX_NUMS    30
23
24 #define ALLOCATOR_USE_ION               0x00000000
25 #define ALLOCATOR_USE_DRM               0x00000001
26
27 #define DEBUG_IOMMU_OPS_DUMP    0x00020000
28
29 #define vpu_iommu_debug_func(debug_level, type, fmt, args...)   \
30         do {                                                    \
31                 if (unlikely(debug_level & type)) {             \
32                         pr_info("%s:%d: " fmt,                  \
33                                  __func__, __LINE__, ##args);   \
34                 }                                               \
35         } while (0)
36 #define vpu_iommu_debug(debug_level, type, fmt, args...)        \
37         do {                                                    \
38                 if (unlikely(debug_level & type)) {             \
39                         pr_info(fmt, ##args);                   \
40                 }                                               \
41         } while (0)
42
43 struct vcodec_iommu_info;
44 struct vcodec_iommu_session_info;
45
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,
52                                int idx);
53         int (*unmap_kernel)(struct vcodec_iommu_session_info *session_info,
54                             int idx);
55         int (*map_iommu)(struct vcodec_iommu_session_info *session_info,
56                          int idx,
57                          unsigned long *iova, unsigned long *size);
58         int (*unmap_iommu)(struct vcodec_iommu_session_info *session_info,
59                            int idx);
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);
65 };
66
67 struct vcodec_iommu_session_info {
68         struct list_head head;
69         struct vpu_session *session;
70         int buffer_nums;
71         struct list_head buffer_list;
72         struct mutex list_mutex;
73         int max_idx;
74         struct device *dev;
75         struct device *mmu_dev;
76         struct vcodec_iommu_info *iommu_info;
77         int debug_level;
78 };
79
80 struct vcodec_iommu_info {
81         struct list_head session_list;
82         struct mutex list_mutex;
83         struct mutex iommu_mutex;
84         struct device *dev;
85         struct device *mmu_dev;
86         struct vcodec_iommu_ops *ops;
87         int debug_level;
88         void *private;
89 };
90
91 #ifdef CONFIG_DRM
92 void vcodec_iommu_drm_set_ops(struct vcodec_iommu_info *iommu_info);
93 #endif
94 #ifdef CONFIG_ION
95 void vcodec_iommu_ion_set_ops(struct vcodec_iommu_info *iommu_info);
96 #endif
97
98 struct vcodec_iommu_info *vcodec_iommu_info_create(struct device *dev,
99                                                    struct device *mmu_dev,
100                                                    int alloc_type);
101 int vcodec_iommu_info_destroy(struct vcodec_iommu_info *iommu_info);
102
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,
116                            int idx,
117                            unsigned long *iova,
118                            unsigned long *size);
119 int vcodec_iommu_unmap_iommu(struct vcodec_iommu_info *iommu_info,
120                              struct vpu_session *session,
121                              int idx);
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);
127
128 int vcodec_iommu_attach(struct vcodec_iommu_info *iommu_info);
129 void vcodec_iommu_detach(struct vcodec_iommu_info *iommu_info);
130
131 #endif