Merge tag 'lsk-v4.4-16.06-android'
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / vcodec / vcodec_hw_info.h
1 /**
2  * Copyright (C) 2015 Fuzhou Rockchip Electronics Co., Ltd
3  * author: Herman Chen herman.chen@rock-chips.com
4  *         Alpha Lin, alpha.lin@rock-chips.com
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #ifndef __ARCH_ARM_MACH_ROCKCHIP_VCODEC_HW_INFO_H
18 #define __ARCH_ARM_MACH_ROCKCHIP_VCODEC_HW_INFO_H
19
20 /*
21  * Hardware id is for hardware detection
22  * Driver will read the hardware ID register first, then try to find a mactch
23  * hardware from the enum ID below.
24  */
25 enum VPU_HW_ID {
26         VPU_DEC_ID_9190         = 0x6731,
27         VPU_ID_8270             = 0x8270,
28         VPU_ID_4831             = 0x4831,
29         HEVC_ID                 = 0x6867,
30         RKV_DEC_ID              = 0x6876,
31         VPU2_ID                 = 0x0000,
32 };
33
34 /*
35  * Different hardware has different feature. So we catalogue these features
36  * into three class:
37  *
38  * 1. register io feature determined by hardware type
39  *    including register offset, register file size, etc
40  *
41  * 2. runtime register config feature determined by task type
42  *    including irq / enable / length register, bit mask, etc
43  *
44  * 3. file handle translate feature determined by vcodec format type
45  *    register translation map table
46  *
47  * These three type features composite a complete codec information structure
48  */
49 enum HW_TYPE {
50         HW_VPU,
51         HW_VPU2,
52         HW_RKV,
53         HW_TYPE_BUTT,
54 };
55
56 enum TASK_TYPE {
57         TASK_ENC,
58         TASK_DEC,
59         TASK_PP,
60         TASK_DEC_PP,
61         TASK_TYPE_BUTT,
62 };
63
64 enum FORMAT_TYPE {
65         FMT_DEC_BASE = 0,
66         FMT_JPEGD = FMT_DEC_BASE,
67
68         FMT_H263D,
69         FMT_H264D,
70         FMT_H265D,
71
72         FMT_MPEG1D,
73         FMT_MPEG2D,
74         FMT_MPEG4D,
75
76         FMT_VP6D,
77         FMT_VP7D,
78         FMT_VP8D,
79         FMT_VP9D,
80
81         FMT_VC1D,
82         FMT_AVSD,
83
84         FMT_DEC_BUTT,
85
86         FMT_PP_BASE = FMT_DEC_BUTT,
87         FMT_PP = FMT_PP_BASE,
88         FMT_PP_BUTT,
89
90         FMT_ENC_BASE = FMT_PP_BUTT,
91         FMT_JPEGE = FMT_ENC_BASE,
92
93         FMT_H264E,
94
95         FMT_VP8E,
96
97         FMT_ENC_BUTT,
98         FMT_TYPE_BUTT = FMT_ENC_BUTT,
99 };
100
101 /**
102  * struct for hardware task operation
103  */
104 struct vpu_hw_info {
105         enum VPU_HW_ID  hw_id;
106         u32             enc_offset;
107         u32             enc_reg_num;
108         u32             enc_io_size;
109
110         u32             dec_offset;
111         u32             dec_reg_num;
112         u32             dec_io_size;
113
114         /*
115          * register range for enc/dec/pp/dec_pp
116          * base/end of dec/pp/dec_pp specify the register range to config
117          */
118         u32             base_dec;
119         u32             base_pp;
120         u32             base_dec_pp;
121         u32             end_dec;
122         u32             end_pp;
123         u32             end_dec_pp;
124 };
125
126 struct vpu_task_info {
127         char *name;
128         struct timeval start;
129         struct timeval end;
130
131         /*
132          * task enable register
133          * use for enable hardware task process
134          *  -1 for invalid
135          */
136         int reg_en;
137
138         /* register of task auto gating, alway valid */
139         int reg_gating;
140
141         /* register of task irq, alway valid */
142         int reg_irq;
143
144         /*
145          * stream length register
146          * only valid for decoder task
147          * -1 for invalid (encoder)
148          */
149         int reg_len;
150
151         /*
152          * direct mv register
153          * special offset scale, offset multiply by 16
154          *
155          * valid on vpu & vpu2
156          * -1 for invalid
157          */
158         int reg_dir_mv;
159
160         /*
161          * pps register
162          * special register for scaling list address process
163          *
164          * valid on rkv
165          * -1 for invalid
166          */
167         int reg_pps;
168
169         /*
170          * decoder pipeline mode register
171          *
172          * valid on vpu & vpu2
173          * -1 for invalid
174          */
175         int reg_pipe;
176
177         /* task enable bit mask for enable register */
178         u32 enable_mask;
179
180         /* task auto gating mask for enable register */
181         u32 gating_mask;
182
183         /* task pipeline mode mask for pipe register */
184         u32 pipe_mask;
185
186         /* task inturrpt bit mask for irq register */
187         u32 irq_mask;
188
189         /* task ready bit mask for irq register */
190         u32 ready_mask;
191
192         /* task error bit mask for irq register */
193         u32 error_mask;
194
195         enum FORMAT_TYPE (*get_fmt)(u32 *regs);
196 };
197
198 struct vpu_trans_info {
199         const int count;
200         const char * const table;
201 };
202
203 struct vcodec_info {
204         enum VPU_HW_ID                  hw_id;
205         struct vpu_hw_info              *hw_info;
206         struct vpu_task_info            *task_info;
207         const struct vpu_trans_info     *trans_info;
208 };
209
210 #define DEF_FMT_TRANS_TBL(fmt, args...) \
211         static const char trans_tbl_##fmt[] = { \
212                 args \
213         }
214
215 #define SETUP_FMT_TBL(id, fmt) \
216         [id] = { \
217                 .count = sizeof(trans_tbl_##fmt), \
218                 .table = trans_tbl_##fmt, \
219         }
220
221 #define EMPTY_FMT_TBL(id) \
222         [id] = { \
223                 .count = 0, \
224                 .table = NULL, \
225         }
226
227 #endif