video: rockchip: vcodec: add log message in iommu drm
[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 #define DEBUG_IOMMU_NORMAL      0x00040000
29
30 #define vpu_iommu_debug_func(debug_level, type, fmt, args...)   \
31         do {                                                    \
32                 if (unlikely(debug_level & type)) {             \
33                         pr_info("%s:%d: " fmt,                  \
34                                  __func__, __LINE__, ##args);   \
35                 }                                               \
36         } while (0)
37 #define vpu_iommu_debug(debug_level, type, fmt, args...)        \
38         do {                                                    \
39                 if (unlikely(debug_level & type)) {             \
40                         pr_info(fmt, ##args);                   \
41                 }                                               \
42         } while (0)
43
44 struct vcodec_iommu_info;
45 struct vcodec_iommu_session_info;
46
47 struct vcodec_iommu_ops {
48         int (*create)(struct vcodec_iommu_info *iommu_info);
49         int (*import)(struct vcodec_iommu_session_info *session_info, int fd);
50         int (*free)(struct vcodec_iommu_session_info *session_info, int idx);
51         int (*free_fd)(struct vcodec_iommu_session_info *session_info, int fd);
52         void *(*map_kernel)(struct vcodec_iommu_session_info *session_info,
53                                int idx);
54         int (*unmap_kernel)(struct vcodec_iommu_session_info *session_info,
55                             int idx);
56         int (*map_iommu)(struct vcodec_iommu_session_info *session_info,
57                          int idx,
58                          unsigned long *iova, unsigned long *size);
59         int (*unmap_iommu)(struct vcodec_iommu_session_info *session_info,
60                            int idx);
61         int (*destroy)(struct vcodec_iommu_info *iommu_info);
62         void (*dump)(struct vcodec_iommu_session_info *session_info);
63         int (*attach)(struct vcodec_iommu_info *iommu_info);
64         void (*detach)(struct vcodec_iommu_info *iommu_info);
65         void (*clear)(struct vcodec_iommu_session_info *session_info);
66 };
67
68 struct vcodec_iommu_session_info {
69         struct list_head head;
70         struct vpu_session *session;
71         int buffer_nums;
72         struct list_head buffer_list;
73         struct mutex list_mutex;
74         int max_idx;
75         struct device *dev;
76         struct device *mmu_dev;
77         struct vcodec_iommu_info *iommu_info;
78         int debug_level;
79 };
80
81 struct vcodec_iommu_info {
82         struct list_head session_list;
83         struct mutex list_mutex;
84         struct mutex iommu_mutex;
85         struct device *dev;
86         struct device *mmu_dev;
87         struct vcodec_iommu_ops *ops;
88         int debug_level;
89         void *private;
90 };
91
92 #ifdef CONFIG_DRM
93 void vcodec_iommu_drm_set_ops(struct vcodec_iommu_info *iommu_info);
94 #endif
95 #ifdef CONFIG_ION
96 void vcodec_iommu_ion_set_ops(struct vcodec_iommu_info *iommu_info);
97 #endif
98
99 struct vcodec_iommu_info *vcodec_iommu_info_create(struct device *dev,
100                                                    struct device *mmu_dev,
101                                                    int alloc_type);
102 int vcodec_iommu_info_destroy(struct vcodec_iommu_info *iommu_info);
103
104 int vcodec_iommu_create(struct vcodec_iommu_info *iommu_info);
105 int vcodec_iommu_import(struct vcodec_iommu_info *iommu_info,
106                         struct vpu_session *session, int fd);
107 int vcodec_iommu_free(struct vcodec_iommu_info *iommu_info,
108                       struct vpu_session *session, int idx);
109 int vcodec_iommu_free_fd(struct vcodec_iommu_info *iommu_info,
110                          struct vpu_session *session, int fd);
111 void *vcodec_iommu_map_kernel(struct vcodec_iommu_info *iommu_info,
112                                  struct vpu_session *session, int idx);
113 int vcodec_iommu_unmap_kernel(struct vcodec_iommu_info *iommu_info,
114                               struct vpu_session *session, int idx);
115 int vcodec_iommu_map_iommu(struct vcodec_iommu_info *iommu_info,
116                            struct vpu_session *session,
117                            int idx,
118                            unsigned long *iova,
119                            unsigned long *size);
120 int vcodec_iommu_unmap_iommu(struct vcodec_iommu_info *iommu_info,
121                              struct vpu_session *session,
122                              int idx);
123 int vcodec_iommu_destroy(struct vcodec_iommu_info *iommu_info);
124 void vcodec_iommu_dump(struct vcodec_iommu_info *iommu_info,
125                        struct vpu_session *session);
126 void vcodec_iommu_clear(struct vcodec_iommu_info *iommu_info,
127                         struct vpu_session *session);
128
129 int vcodec_iommu_attach(struct vcodec_iommu_info *iommu_info);
130 void vcodec_iommu_detach(struct vcodec_iommu_info *iommu_info);
131
132 #endif