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