VPU: fix the code cannot be built in 32bits environment.
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rockchip / vcodec_service.c
1 /**
2  * Copyright (C) 2014 ROCKCHIP, Inc.
3  * author: chenhengming chm@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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19 #include <linux/clk.h>
20 #include <linux/compat.h>
21 #include <linux/delay.h>
22 #include <linux/init.h>
23 #include <linux/interrupt.h>
24 #include <linux/io.h>
25 #include <linux/kernel.h>
26 #include <linux/module.h>
27 #include <linux/fs.h>
28 #include <linux/ioport.h>
29 #include <linux/miscdevice.h>
30 #include <linux/mm.h>
31 #include <linux/poll.h>
32 #include <linux/platform_device.h>
33 #include <linux/sched.h>
34 #include <linux/slab.h>
35 #include <linux/wakelock.h>
36 #include <linux/cdev.h>
37 #include <linux/of.h>
38 #include <linux/of_platform.h>
39 #include <linux/of_irq.h>
40 #include <linux/rockchip/cpu.h>
41 #include <linux/rockchip/cru.h>
42 #include <linux/rockchip/pmu.h>
43 #ifdef CONFIG_MFD_SYSCON
44 #include <linux/regmap.h>
45 #endif
46 #include <linux/mfd/syscon.h>
47
48 #include <asm/cacheflush.h>
49 #include <linux/uaccess.h>
50 #include <linux/rockchip/grf.h>
51
52 #if defined(CONFIG_ION_ROCKCHIP)
53 #include <linux/rockchip_ion.h>
54 #endif
55
56 #if defined(CONFIG_ROCKCHIP_IOMMU) & defined(CONFIG_ION_ROCKCHIP)
57 #define CONFIG_VCODEC_MMU
58 #endif
59
60 #ifdef CONFIG_VCODEC_MMU
61 #include <linux/rockchip-iovmm.h>
62 #include <linux/dma-buf.h>
63 #endif
64
65 #ifdef CONFIG_DEBUG_FS
66 #include <linux/debugfs.h>
67 #endif
68
69 #if defined(CONFIG_ARCH_RK319X)
70 #include <mach/grf.h>
71 #endif
72
73 #include "vcodec_service.h"
74
75 /*
76  * debug flag usage:
77  * +------+-------------------+
78  * | 8bit |      24bit        |
79  * +------+-------------------+
80  *  0~23 bit is for different information type
81  * 24~31 bit is for information print format
82  */
83
84 #define DEBUG_POWER                             0x00000001
85 #define DEBUG_CLOCK                             0x00000002
86 #define DEBUG_IRQ_STATUS                        0x00000004
87 #define DEBUG_IOMMU                             0x00000008
88 #define DEBUG_IOCTL                             0x00000010
89 #define DEBUG_FUNCTION                          0x00000020
90 #define DEBUG_REGISTER                          0x00000040
91 #define DEBUG_EXTRA_INFO                        0x00000080
92 #define DEBUG_TIMING                            0x00000100
93
94 #define PRINT_FUNCTION                          0x80000000
95 #define PRINT_LINE                              0x40000000
96
97 static int debug;
98 module_param(debug, int, S_IRUGO | S_IWUSR);
99 MODULE_PARM_DESC(debug,
100                  "Debug level - higher value produces more verbose messages");
101
102 #define HEVC_TEST_ENABLE        0
103 #define VCODEC_CLOCK_ENABLE     1
104
105 typedef enum {
106         VPU_DEC_ID_9190         = 0x6731,
107         VPU_ID_8270             = 0x8270,
108         VPU_ID_4831             = 0x4831,
109         HEVC_ID                 = 0x6867,
110 } VPU_HW_ID;
111
112 enum VPU_HW_SPEC {
113         VPU_TYPE_VPU,
114         VPU_TYPE_HEVC,
115         VPU_TYPE_COMBO_NOENC,
116         VPU_TYPE_COMBO
117 };
118
119 typedef enum {
120         VPU_DEC_TYPE_9190       = 0,
121         VPU_ENC_TYPE_8270       = 0x100,
122         VPU_ENC_TYPE_4831       ,
123 } VPU_HW_TYPE_E;
124
125 typedef enum VPU_FREQ {
126         VPU_FREQ_200M,
127         VPU_FREQ_266M,
128         VPU_FREQ_300M,
129         VPU_FREQ_400M,
130         VPU_FREQ_500M,
131         VPU_FREQ_600M,
132         VPU_FREQ_DEFAULT,
133         VPU_FREQ_BUT,
134 } VPU_FREQ;
135
136 typedef struct {
137         VPU_HW_ID               hw_id;
138         unsigned long           hw_addr;
139         unsigned long           enc_offset;
140         unsigned long           enc_reg_num;
141         unsigned long           enc_io_size;
142         unsigned long           dec_offset;
143         unsigned long           dec_reg_num;
144         unsigned long           dec_io_size;
145 } VPU_HW_INFO_E;
146
147 struct extra_info_elem {
148         u32 index;
149         u32 offset;
150 };
151
152 #define EXTRA_INFO_MAGIC        0x4C4A46
153
154 struct extra_info_for_iommu {
155         u32 magic;
156         u32 cnt;
157         struct extra_info_elem elem[20];
158 };
159
160 #define MHZ                                     (1000*1000)
161
162 #define REG_NUM_9190_DEC                        (60)
163 #define REG_NUM_9190_PP                         (41)
164 #define REG_NUM_9190_DEC_PP                     (REG_NUM_9190_DEC+REG_NUM_9190_PP)
165
166 #define REG_NUM_DEC_PP                          (REG_NUM_9190_DEC+REG_NUM_9190_PP)
167
168 #define REG_NUM_ENC_8270                        (96)
169 #define REG_SIZE_ENC_8270                       (0x200)
170 #define REG_NUM_ENC_4831                        (164)
171 #define REG_SIZE_ENC_4831                       (0x400)
172
173 #define REG_NUM_HEVC_DEC                        (68)
174
175 #define SIZE_REG(reg)                           ((reg)*4)
176
177 static VPU_HW_INFO_E vpu_hw_set[] = {
178         [0] = {
179                 .hw_id          = VPU_ID_8270,
180                 .hw_addr        = 0,
181                 .enc_offset     = 0x0,
182                 .enc_reg_num    = REG_NUM_ENC_8270,
183                 .enc_io_size    = REG_NUM_ENC_8270 * 4,
184                 .dec_offset     = REG_SIZE_ENC_8270,
185                 .dec_reg_num    = REG_NUM_9190_DEC_PP,
186                 .dec_io_size    = REG_NUM_9190_DEC_PP * 4,
187         },
188         [1] = {
189                 .hw_id          = VPU_ID_4831,
190                 .hw_addr        = 0,
191                 .enc_offset     = 0x0,
192                 .enc_reg_num    = REG_NUM_ENC_4831,
193                 .enc_io_size    = REG_NUM_ENC_4831 * 4,
194                 .dec_offset     = REG_SIZE_ENC_4831,
195                 .dec_reg_num    = REG_NUM_9190_DEC_PP,
196                 .dec_io_size    = REG_NUM_9190_DEC_PP * 4,
197         },
198         [2] = {
199                 .hw_id          = HEVC_ID,
200                 .hw_addr        = 0,
201                 .dec_offset     = 0x0,
202                 .dec_reg_num    = REG_NUM_HEVC_DEC,
203                 .dec_io_size    = REG_NUM_HEVC_DEC * 4,
204         },
205         [3] = {
206                 .hw_id          = VPU_DEC_ID_9190,
207                 .hw_addr        = 0,
208                 .enc_offset     = 0x0,
209                 .enc_reg_num    = 0,
210                 .enc_io_size    = 0,
211                 .dec_offset     = 0,
212                 .dec_reg_num    = REG_NUM_9190_DEC_PP,
213                 .dec_io_size    = REG_NUM_9190_DEC_PP * 4,
214         },
215 };
216
217 #ifndef BIT
218 #define BIT(x)                                  (1<<(x))
219 #endif
220
221 // interrupt and error status register
222 #define DEC_INTERRUPT_REGISTER                  1
223 #define DEC_INTERRUPT_BIT                       BIT(8)
224 #define DEC_READY_BIT                           BIT(12)
225 #define DEC_BUS_ERROR_BIT                       BIT(13)
226 #define DEC_BUFFER_EMPTY_BIT                    BIT(14)
227 #define DEC_ASO_ERROR_BIT                       BIT(15)
228 #define DEC_STREAM_ERROR_BIT                    BIT(16)
229 #define DEC_SLICE_DONE_BIT                      BIT(17)
230 #define DEC_TIMEOUT_BIT                         BIT(18)
231 #define DEC_ERR_MASK                            DEC_BUS_ERROR_BIT \
232                                                 |DEC_BUFFER_EMPTY_BIT \
233                                                 |DEC_STREAM_ERROR_BIT \
234                                                 |DEC_TIMEOUT_BIT
235
236 #define PP_INTERRUPT_REGISTER                   60
237 #define PP_INTERRUPT_BIT                        BIT(8)
238 #define PP_READY_BIT                            BIT(12)
239 #define PP_BUS_ERROR_BIT                        BIT(13)
240 #define PP_ERR_MASK                             PP_BUS_ERROR_BIT
241
242 #define ENC_INTERRUPT_REGISTER                  1
243 #define ENC_INTERRUPT_BIT                       BIT(0)
244 #define ENC_READY_BIT                           BIT(2)
245 #define ENC_BUS_ERROR_BIT                       BIT(3)
246 #define ENC_BUFFER_FULL_BIT                     BIT(5)
247 #define ENC_TIMEOUT_BIT                         BIT(6)
248 #define ENC_ERR_MASK                            ENC_BUS_ERROR_BIT \
249                                                 |ENC_BUFFER_FULL_BIT \
250                                                 |ENC_TIMEOUT_BIT
251
252 #define HEVC_INTERRUPT_REGISTER                 1
253 #define HEVC_DEC_INT_RAW_BIT                    BIT(9)
254 #define HEVC_DEC_BUS_ERROR_BIT                  BIT(13)
255 #define HEVC_DEC_STR_ERROR_BIT                  BIT(14)
256 #define HEVC_DEC_TIMEOUT_BIT                    BIT(15)
257 #define HEVC_DEC_BUFFER_EMPTY_BIT               BIT(16)
258 #define HEVC_DEC_COLMV_ERROR_BIT                BIT(17)
259 #define HEVC_DEC_ERR_MASK                       HEVC_DEC_BUS_ERROR_BIT \
260                                                 |HEVC_DEC_STR_ERROR_BIT \
261                                                 |HEVC_DEC_TIMEOUT_BIT \
262                                                 |HEVC_DEC_BUFFER_EMPTY_BIT \
263                                                 |HEVC_DEC_COLMV_ERROR_BIT
264
265
266 // gating configuration set
267 #define VPU_REG_EN_ENC                          14
268 #define VPU_REG_ENC_GATE                        2
269 #define VPU_REG_ENC_GATE_BIT                    (1<<4)
270
271 #define VPU_REG_EN_DEC                          1
272 #define VPU_REG_DEC_GATE                        2
273 #define VPU_REG_DEC_GATE_BIT                    (1<<10)
274 #define VPU_REG_EN_PP                           0
275 #define VPU_REG_PP_GATE                         1
276 #define VPU_REG_PP_GATE_BIT                     (1<<8)
277 #define VPU_REG_EN_DEC_PP                       1
278 #define VPU_REG_DEC_PP_GATE                     61
279 #define VPU_REG_DEC_PP_GATE_BIT                 (1<<8)
280
281 #define DEBUG
282 #ifdef DEBUG
283 #define vpu_debug_func(type, fmt, args...)                      \
284         do {                                                    \
285                 if (unlikely(debug & type)) {                   \
286                         pr_info("%s:%d: " fmt,                  \
287                                  __func__, __LINE__, ##args);   \
288                 }                                               \
289         } while (0)
290 #define vpu_debug(type, fmt, args...)                           \
291         do {                                                    \
292                 if (unlikely(debug & type)) {                   \
293                         pr_info(fmt, ##args);                   \
294                 }                                               \
295         } while (0)
296 #else
297 #define vpu_debug_func(level, fmt, args...)
298 #define vpu_debug(level, fmt, args...)
299 #endif
300
301 #define vpu_debug_enter() vpu_debug_func(DEBUG_FUNCTION, "enter\n")
302 #define vpu_debug_leave() vpu_debug_func(DEBUG_FUNCTION, "leave\n")
303
304 #define vpu_err(fmt, args...)                           \
305                 pr_err("%s:%d: " fmt, __func__, __LINE__, ##args)
306
307 #if defined(CONFIG_VCODEC_MMU)
308 static u8 addr_tbl_vpu_h264dec[] = {
309         12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
310         25, 26, 27, 28, 29, 40, 41
311 };
312
313 static u8 addr_tbl_vpu_vp8dec[] = {
314         10, 12, 13, 14, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 40
315 };
316
317 static u8 addr_tbl_vpu_vp6dec[] = {
318         12, 13, 14, 18, 27, 40
319 };
320
321 static u8 addr_tbl_vpu_vc1dec[] = {
322         12, 13, 14, 15, 16, 17, 27, 41
323 };
324
325 static u8 addr_tbl_vpu_jpegdec[] = {
326         12, 40, 66, 67
327 };
328
329 static u8 addr_tbl_vpu_defaultdec[] = {
330         12, 13, 14, 15, 16, 17, 40, 41
331 };
332
333 static u8 addr_tbl_vpu_enc[] = {
334         5, 6, 7, 8, 9, 10, 11, 12, 13, 51
335 };
336
337 static u8 addr_tbl_hevc_dec[] = {
338         4, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
339         21, 22, 23, 24, 42, 43
340 };
341 #endif
342
343 enum VPU_DEC_FMT {
344         VPU_DEC_FMT_H264,
345         VPU_DEC_FMT_MPEG4,
346         VPU_DEC_FMT_H263,
347         VPU_DEC_FMT_JPEG,
348         VPU_DEC_FMT_VC1,
349         VPU_DEC_FMT_MPEG2,
350         VPU_DEC_FMT_MPEG1,
351         VPU_DEC_FMT_VP6,
352         VPU_DEC_FMT_RV,
353         VPU_DEC_FMT_VP7,
354         VPU_DEC_FMT_VP8,
355         VPU_DEC_FMT_AVS,
356         VPU_DEC_FMT_SVC,
357         VPU_DEC_FMT_VC2,
358         VPU_DEC_FMT_MVC,
359         VPU_DEC_FMT_THEORA,
360         VPU_DEC_FMT_RES
361 };
362
363 /**
364  * struct for process session which connect to vpu
365  *
366  * @author ChenHengming (2011-5-3)
367  */
368 typedef struct vpu_session {
369         enum VPU_CLIENT_TYPE type;
370         /* a linked list of data so we can access them for debugging */
371         struct list_head list_session;
372         /* a linked list of register data waiting for process */
373         struct list_head waiting;
374         /* a linked list of register data in processing */
375         struct list_head running;
376         /* a linked list of register data processed */
377         struct list_head done;
378         wait_queue_head_t wait;
379         pid_t pid;
380         atomic_t task_running;
381 } vpu_session;
382
383 /**
384  * struct for process register set
385  *
386  * @author ChenHengming (2011-5-4)
387  */
388 typedef struct vpu_reg {
389         enum VPU_CLIENT_TYPE type;
390         VPU_FREQ freq;
391         vpu_session *session;
392         struct vpu_subdev_data *data;
393         struct list_head session_link;          /* link to vpu service session */
394         struct list_head status_link;           /* link to register set list */
395         unsigned long size;
396 #if defined(CONFIG_VCODEC_MMU)
397         struct list_head mem_region_list;
398 #endif
399         u32 *reg;
400 } vpu_reg;
401
402 typedef struct vpu_device {
403         atomic_t                irq_count_codec;
404         atomic_t                irq_count_pp;
405         unsigned long           iobaseaddr;
406         unsigned int            iosize;
407         volatile u32            *hwregs;
408 } vpu_device;
409
410 enum vcodec_device_id {
411         VCODEC_DEVICE_ID_VPU,
412         VCODEC_DEVICE_ID_HEVC,
413         VCODEC_DEVICE_ID_COMBO
414 };
415
416 enum VCODEC_RUNNING_MODE {
417         VCODEC_RUNNING_MODE_NONE = -1,
418         VCODEC_RUNNING_MODE_VPU,
419         VCODEC_RUNNING_MODE_HEVC,
420 };
421
422 struct vcodec_mem_region {
423         struct list_head srv_lnk;
424         struct list_head reg_lnk;
425         struct list_head session_lnk;
426         unsigned long iova;     /* virtual address for iommu */
427         unsigned long len;
428         u32 reg_idx;
429         struct ion_handle *hdl;
430 };
431
432 enum vpu_ctx_state {
433         MMU_ACTIVATED   = BIT(0)
434 };
435
436 struct vpu_subdev_data {
437         struct cdev cdev;
438         dev_t dev_t;
439         struct class *cls;
440         struct device *child_dev;
441
442         int irq_enc;
443         int irq_dec;
444         struct vpu_service_info *pservice;
445
446         u32 *regs;
447         enum VCODEC_RUNNING_MODE mode;
448         struct list_head lnk_service;
449
450         struct device *dev;
451
452         vpu_device enc_dev;
453         vpu_device dec_dev;
454         VPU_HW_INFO_E *hw_info;
455
456         u32 reg_size;
457         unsigned long state;
458
459 #ifdef CONFIG_DEBUG_FS
460         struct dentry *debugfs_dir;
461         struct dentry *debugfs_file_regs;
462 #endif
463
464 #if defined(CONFIG_VCODEC_MMU)
465         struct device *mmu_dev;
466 #endif
467 };
468
469 typedef struct vpu_service_info {
470         struct wake_lock wake_lock;
471         struct delayed_work power_off_work;
472         struct mutex lock;
473         struct list_head waiting;               /* link to link_reg in struct vpu_reg */
474         struct list_head running;               /* link to link_reg in struct vpu_reg */
475         struct list_head done;                  /* link to link_reg in struct vpu_reg */
476         struct list_head session;               /* link to list_session in struct vpu_session */
477         atomic_t total_running;
478         atomic_t enabled;
479         atomic_t power_on_cnt;
480         atomic_t power_off_cnt;
481         vpu_reg *reg_codec;
482         vpu_reg *reg_pproc;
483         vpu_reg *reg_resev;
484         struct vpu_dec_config dec_config;
485         struct vpu_enc_config enc_config;
486
487         bool auto_freq;
488         bool bug_dec_addr;
489         atomic_t freq_status;
490
491         struct clk *aclk_vcodec;
492         struct clk *hclk_vcodec;
493         struct clk *clk_core;
494         struct clk *clk_cabac;
495         struct clk *pd_video;
496
497         struct device *dev;
498
499         u32 irq_status;
500         atomic_t reset_request;
501 #if defined(CONFIG_VCODEC_MMU)
502         struct ion_client *ion_client;
503         struct list_head mem_region_list;
504 #endif
505
506         enum vcodec_device_id dev_id;
507
508         enum VCODEC_RUNNING_MODE curr_mode;
509         u32 prev_mode;
510
511         struct delayed_work simulate_work;
512
513         u32 mode_bit;
514         u32 mode_ctrl;
515         u32 *reg_base;
516         u32 ioaddr;
517 #ifdef CONFIG_MFD_SYSCON
518         struct regmap *grf_base;
519 #else
520         u32 *grf_base;
521 #endif
522         char *name;
523
524         u32 subcnt;
525         struct list_head subdev_list;
526 } vpu_service_info;
527
528 struct vcodec_combo {
529         struct vpu_service_info *vpu_srv;
530         struct vpu_service_info *hevc_srv;
531         struct list_head waiting;
532         struct list_head running;
533         struct mutex run_lock;
534         vpu_reg *reg_codec;
535         enum vcodec_device_id current_hw_mode;
536 };
537
538 struct vpu_request {
539         u32 *req;
540         u32 size;
541 };
542
543 #ifdef CONFIG_COMPAT
544 struct compat_vpu_request {
545         compat_uptr_t req;
546         u32 size;
547 };
548 #endif
549
550 /* debugfs root directory for all device (vpu, hevc).*/
551 static struct dentry *parent;
552
553 #ifdef CONFIG_DEBUG_FS
554 static int vcodec_debugfs_init(void);
555 static void vcodec_debugfs_exit(void);
556 static struct dentry* vcodec_debugfs_create_device_dir(char *dirname, struct dentry *parent);
557 static int debug_vcodec_open(struct inode *inode, struct file *file);
558
559 static const struct file_operations debug_vcodec_fops = {
560         .open = debug_vcodec_open,
561         .read = seq_read,
562         .llseek = seq_lseek,
563         .release = single_release,
564 };
565 #endif
566
567 #define VDPU_SOFT_RESET_REG     101
568 #define VDPU_CLEAN_CACHE_REG    516
569 #define VEPU_CLEAN_CACHE_REG    772
570 #define HEVC_CLEAN_CACHE_REG    260
571
572 #define VPU_REG_ENABLE(base, reg)       do { \
573                                                 base[reg] = 1; \
574                                         } while (0)
575
576 #define VDPU_SOFT_RESET(base)   VPU_REG_ENABLE(base, VDPU_SOFT_RESET_REG)
577 #define VDPU_CLEAN_CACHE(base)  VPU_REG_ENABLE(base, VDPU_CLEAN_CACHE_REG)
578 #define VEPU_CLEAN_CACHE(base)  VPU_REG_ENABLE(base, VEPU_CLEAN_CACHE_REG)
579 #define HEVC_CLEAN_CACHE(base)  VPU_REG_ENABLE(base, HEVC_CLEAN_CACHE_REG)
580
581 #define VPU_POWER_OFF_DELAY             4*HZ /* 4s */
582 #define VPU_TIMEOUT_DELAY               2*HZ /* 2s */
583
584 typedef struct {
585         char *name;
586         struct timeval start;
587         struct timeval end;
588         u32 error_mask;
589 } task_info;
590
591 typedef enum {
592         TASK_VPU_ENC,
593         TASK_VPU_DEC,
594         TASK_VPU_PP,
595         TASK_RKDEC_HEVC,
596         TASK_TYPE_BUTT,
597 } TASK_TYPE;
598
599 task_info tasks[TASK_TYPE_BUTT] = {
600         {
601                 .name = "enc",
602                 .error_mask = ENC_ERR_MASK
603         },
604         {
605                 .name = "dec",
606                 .error_mask = DEC_ERR_MASK
607         },
608         {
609                 .name = "pp",
610                 .error_mask = PP_ERR_MASK
611         },
612         {
613                 .name = "hevc",
614                 .error_mask = HEVC_DEC_ERR_MASK
615         },
616 };
617
618 static void time_record(task_info *task, int is_end)
619 {
620         if (unlikely(debug & DEBUG_TIMING)) {
621                 do_gettimeofday((is_end)?(&task->end):(&task->start));
622         }
623 }
624
625 static void time_diff(task_info *task)
626 {
627         vpu_debug(DEBUG_TIMING, "%s task: %ld ms\n", task->name,
628                         (task->end.tv_sec  - task->start.tv_sec)  * 1000 +
629                         (task->end.tv_usec - task->start.tv_usec) / 1000);
630 }
631
632 static void vcodec_enter_mode(struct vpu_subdev_data *data)
633 {
634         int bits;
635         u32 raw = 0;
636         struct vpu_service_info *pservice = data->pservice;
637         struct vpu_subdev_data *subdata, *n;
638         if (pservice->subcnt < 2) {
639 #if defined(CONFIG_VCODEC_MMU)
640                 if (data->mmu_dev && !test_bit(MMU_ACTIVATED, &data->state)) {
641                         set_bit(MMU_ACTIVATED, &data->state);
642                         if (atomic_read(&pservice->enabled))
643                                 rockchip_iovmm_activate(data->dev);
644                         else
645                                 BUG_ON(!atomic_read(&pservice->enabled));
646                 }
647 #endif
648                 return;
649         }
650
651         if (pservice->curr_mode == data->mode)
652                 return;
653
654         vpu_debug(DEBUG_IOMMU, "vcodec enter mode %d\n", data->mode);
655 #if defined(CONFIG_VCODEC_MMU)
656         list_for_each_entry_safe(subdata, n, &pservice->subdev_list, lnk_service) {
657                 if (data != subdata && subdata->mmu_dev &&
658                     test_bit(MMU_ACTIVATED, &subdata->state)) {
659                         clear_bit(MMU_ACTIVATED, &subdata->state);
660                         rockchip_iovmm_deactivate(subdata->dev);
661                 }
662         }
663 #endif
664         bits = 1 << pservice->mode_bit;
665 #ifdef CONFIG_MFD_SYSCON
666         regmap_read(pservice->grf_base, pservice->mode_ctrl, &raw);
667
668         if (data->mode == VCODEC_RUNNING_MODE_HEVC)
669                 regmap_write(pservice->grf_base, pservice->mode_ctrl,
670                         raw | bits | (bits << 16));
671         else
672                 regmap_write(pservice->grf_base, pservice->mode_ctrl,
673                         (raw & (~bits)) | (bits << 16));
674 #else
675         raw = readl_relaxed(pservice->grf_base + pservice->mode_ctrl / 4);
676         if (data->mode == VCODEC_RUNNING_MODE_HEVC)
677                 writel_relaxed(raw | bits | (bits << 16),
678                         pservice->grf_base + pservice->mode_ctrl / 4);
679         else
680                 writel_relaxed((raw & (~bits)) | (bits << 16),
681                         pservice->grf_base + pservice->mode_ctrl / 4);
682 #endif
683 #if defined(CONFIG_VCODEC_MMU)
684         if (data->mmu_dev && !test_bit(MMU_ACTIVATED, &data->state)) {
685                 set_bit(MMU_ACTIVATED, &data->state);
686                 if (atomic_read(&pservice->enabled))
687                         rockchip_iovmm_activate(data->dev);
688                 else
689                         BUG_ON(!atomic_read(&pservice->enabled));
690         }
691 #endif
692         pservice->prev_mode = pservice->curr_mode;
693         pservice->curr_mode = data->mode;
694 }
695
696 static void vcodec_exit_mode(struct vpu_subdev_data *data)
697 {
698         if (data->mmu_dev && test_bit(MMU_ACTIVATED, &data->state)) {
699                 clear_bit(MMU_ACTIVATED, &data->state);
700                 rockchip_iovmm_deactivate(data->dev);
701                 data->pservice->curr_mode = VCODEC_RUNNING_MODE_NONE;
702         }
703 }
704
705 static int vpu_get_clk(struct vpu_service_info *pservice)
706 {
707 #if VCODEC_CLOCK_ENABLE
708         switch (pservice->dev_id) {
709         case VCODEC_DEVICE_ID_HEVC:
710                 pservice->pd_video = devm_clk_get(pservice->dev, "pd_hevc");
711                 if (IS_ERR(pservice->pd_video)) {
712                         dev_err(pservice->dev, "failed on clk_get pd_hevc\n");
713                         return -1;
714                 }
715         case VCODEC_DEVICE_ID_COMBO:
716                 pservice->clk_cabac = devm_clk_get(pservice->dev, "clk_cabac");
717                 if (IS_ERR(pservice->clk_cabac)) {
718                         dev_err(pservice->dev, "failed on clk_get clk_cabac\n");
719                         pservice->clk_cabac = NULL;
720                 }
721                 pservice->clk_core = devm_clk_get(pservice->dev, "clk_core");
722                 if (IS_ERR(pservice->clk_core)) {
723                         dev_err(pservice->dev, "failed on clk_get clk_core\n");
724                         return -1;
725                 }
726         case VCODEC_DEVICE_ID_VPU:
727                 pservice->aclk_vcodec = devm_clk_get(pservice->dev, "aclk_vcodec");
728                 if (IS_ERR(pservice->aclk_vcodec)) {
729                         dev_err(pservice->dev, "failed on clk_get aclk_vcodec\n");
730                         return -1;
731                 }
732
733                 pservice->hclk_vcodec = devm_clk_get(pservice->dev, "hclk_vcodec");
734                 if (IS_ERR(pservice->hclk_vcodec)) {
735                         dev_err(pservice->dev, "failed on clk_get hclk_vcodec\n");
736                         return -1;
737                 }
738                 if (pservice->pd_video == NULL) {
739                         pservice->pd_video = devm_clk_get(pservice->dev, "pd_video");
740                         if (IS_ERR(pservice->pd_video)) {
741                                 pservice->pd_video = NULL;
742                                 dev_info(pservice->dev, "do not have pd_video\n");
743                         }
744                 }
745                 break;
746         default:
747                 ;
748         }
749
750         return 0;
751 #else
752         return 0;
753 #endif
754 }
755
756 static void vpu_put_clk(struct vpu_service_info *pservice)
757 {
758 #if VCODEC_CLOCK_ENABLE
759         if (pservice->pd_video)
760                 devm_clk_put(pservice->dev, pservice->pd_video);
761         if (pservice->aclk_vcodec)
762                 devm_clk_put(pservice->dev, pservice->aclk_vcodec);
763         if (pservice->hclk_vcodec)
764                 devm_clk_put(pservice->dev, pservice->hclk_vcodec);
765         if (pservice->clk_core)
766                 devm_clk_put(pservice->dev, pservice->clk_core);
767         if (pservice->clk_cabac)
768                 devm_clk_put(pservice->dev, pservice->clk_cabac);
769 #endif
770 }
771
772 static const u8 pmu_idle_map[] = {
773         [IDLE_REQ_VIDEO] = 7,
774 };
775
776 extern void __iomem *rk_cru_base;
777 static void cru_writel(u32 val, u32 offset)
778 {
779         writel_relaxed(val, rk_cru_base + (offset));
780         dsb(sy);
781 }
782
783 extern int rk3368_pmu_set_idle_request(enum pmu_idle_req req, bool idle);
784 static inline void rk3368_cru_set_soft_reset(u32 idx, bool on)
785 {
786         u32 val = on ? 0x10001U << (idx & 0xf) : 0x10000U << (idx & 0xf);
787         cru_writel(val, 0x31c);
788 }
789 #define SOFT_RST_VCODEC_AXI     (7*16)
790 #define SOFT_RST_VCODEC_AHB     (7*16+1)
791
792 static void vpu_reset(struct vpu_subdev_data *data)
793 {
794         struct vpu_service_info *pservice = data->pservice;
795         pr_info("%s: resetting...", dev_name(pservice->dev));
796
797 #if defined(CONFIG_ARCH_RK29)
798         clk_disable(aclk_ddr_vepu);
799         cru_set_soft_reset(SOFT_RST_CPU_VODEC_A2A_AHB, true);
800         cru_set_soft_reset(SOFT_RST_DDR_VCODEC_PORT, true);
801         cru_set_soft_reset(SOFT_RST_VCODEC_AHB_BUS, true);
802         cru_set_soft_reset(SOFT_RST_VCODEC_AXI_BUS, true);
803         mdelay(10);
804         cru_set_soft_reset(SOFT_RST_VCODEC_AXI_BUS, false);
805         cru_set_soft_reset(SOFT_RST_VCODEC_AHB_BUS, false);
806         cru_set_soft_reset(SOFT_RST_DDR_VCODEC_PORT, false);
807         cru_set_soft_reset(SOFT_RST_CPU_VODEC_A2A_AHB, false);
808         clk_enable(aclk_ddr_vepu);
809 #elif defined(CONFIG_ARCH_RK30)
810         pmu_set_idle_request(IDLE_REQ_VIDEO, true);
811         cru_set_soft_reset(SOFT_RST_CPU_VCODEC, true);
812         cru_set_soft_reset(SOFT_RST_VCODEC_NIU_AXI, true);
813         cru_set_soft_reset(SOFT_RST_VCODEC_AHB, true);
814         cru_set_soft_reset(SOFT_RST_VCODEC_AXI, true);
815         mdelay(1);
816         cru_set_soft_reset(SOFT_RST_VCODEC_AXI, false);
817         cru_set_soft_reset(SOFT_RST_VCODEC_AHB, false);
818         cru_set_soft_reset(SOFT_RST_VCODEC_NIU_AXI, false);
819         cru_set_soft_reset(SOFT_RST_CPU_VCODEC, false);
820         pmu_set_idle_request(IDLE_REQ_VIDEO, false);
821 #else
822 #endif
823         WARN_ON(pservice->reg_codec != NULL);
824         WARN_ON(pservice->reg_pproc != NULL);
825         WARN_ON(pservice->reg_resev != NULL);
826         pservice->reg_codec = NULL;
827         pservice->reg_pproc = NULL;
828         pservice->reg_resev = NULL;
829
830         pr_info("for 3288/3368...");
831         /**rk3368_pmu_set_idle_request(IDLE_REQ_VIDEO, true);*/
832         /*rockchip_pmu_ops.set_idle_request(IDLE_REQ_VIDEO, true);*/
833         /**rockchip_pmu_ops.set_power_domain(PD_VIDEO, false);*/
834         /*rk3368_cru_set_soft_reset(SOFT_RST_VCODEC_AHB, true);
835         rk3368_cru_set_soft_reset(SOFT_RST_VCODEC_AXI, true);
836         mdelay(1);
837         rk3368_cru_set_soft_reset(SOFT_RST_VCODEC_AXI, false);
838         rk3368_cru_set_soft_reset(SOFT_RST_VCODEC_AHB, false);*/
839         /**rockchip_pmu_ops.set_power_domain(PD_VIDEO, true);*/
840         /*rockchip_pmu_ops.set_idle_request(IDLE_REQ_VIDEO, false);*/
841         /**rk3368_pmu_set_idle_request(IDLE_REQ_VIDEO, false);*/
842
843 #if defined(CONFIG_VCODEC_MMU)
844         if (data->mmu_dev && test_bit(MMU_ACTIVATED, &data->state)) {
845                 clear_bit(MMU_ACTIVATED, &data->state);
846                 if (atomic_read(&pservice->enabled))
847                         rockchip_iovmm_deactivate(data->dev);
848                 else
849                         BUG_ON(!atomic_read(&pservice->enabled));
850         }
851 #endif
852         atomic_set(&pservice->reset_request, 0);
853         pr_info("done\n");
854 }
855
856 static void reg_deinit(struct vpu_subdev_data *data, vpu_reg *reg);
857 static void vpu_service_session_clear(struct vpu_subdev_data *data, vpu_session *session)
858 {
859         vpu_reg *reg, *n;
860         list_for_each_entry_safe(reg, n, &session->waiting, session_link) {
861                 reg_deinit(data, reg);
862         }
863         list_for_each_entry_safe(reg, n, &session->running, session_link) {
864                 reg_deinit(data, reg);
865         }
866         list_for_each_entry_safe(reg, n, &session->done, session_link) {
867                 reg_deinit(data, reg);
868         }
869 }
870
871 static void vpu_service_dump(struct vpu_service_info *pservice)
872 {
873 }
874
875 static void vpu_service_power_off(struct vpu_service_info *pservice)
876 {
877         int total_running;
878         struct vpu_subdev_data *data = NULL, *n;
879         int ret = atomic_add_unless(&pservice->enabled, -1, 0);
880         if (!ret)
881                 return;
882
883         total_running = atomic_read(&pservice->total_running);
884         if (total_running) {
885                 pr_alert("alert: power off when %d task running!!\n", total_running);
886                 mdelay(50);
887                 pr_alert("alert: delay 50 ms for running task\n");
888                 vpu_service_dump(pservice);
889         }
890
891         pr_info("%s: power off...", dev_name(pservice->dev));
892         udelay(10);
893 #if defined(CONFIG_VCODEC_MMU)
894         list_for_each_entry_safe(data, n, &pservice->subdev_list, lnk_service) {
895                 if (data->mmu_dev && test_bit(MMU_ACTIVATED, &data->state)) {
896                         clear_bit(MMU_ACTIVATED, &data->state);
897                         rockchip_iovmm_deactivate(data->dev);
898                 }
899         }
900         pservice->curr_mode = VCODEC_RUNNING_MODE_NONE;
901 #endif
902
903 #if VCODEC_CLOCK_ENABLE
904         if (pservice->pd_video)
905                 clk_disable_unprepare(pservice->pd_video);
906         if (pservice->hclk_vcodec)
907                 clk_disable_unprepare(pservice->hclk_vcodec);
908         if (pservice->aclk_vcodec)
909                 clk_disable_unprepare(pservice->aclk_vcodec);
910         if (pservice->clk_core)
911                 clk_disable_unprepare(pservice->clk_core);
912         if (pservice->clk_cabac)
913                 clk_disable_unprepare(pservice->clk_cabac);
914 #endif
915
916         atomic_add(1, &pservice->power_off_cnt);
917         wake_unlock(&pservice->wake_lock);
918         pr_info("done\n");
919 }
920
921 static inline void vpu_queue_power_off_work(struct vpu_service_info *pservice)
922 {
923         queue_delayed_work(system_nrt_wq, &pservice->power_off_work, VPU_POWER_OFF_DELAY);
924 }
925
926 static void vpu_power_off_work(struct work_struct *work_s)
927 {
928         struct delayed_work *dlwork = container_of(work_s, struct delayed_work, work);
929         struct vpu_service_info *pservice = container_of(dlwork, struct vpu_service_info, power_off_work);
930
931         if (mutex_trylock(&pservice->lock)) {
932                 vpu_service_power_off(pservice);
933                 mutex_unlock(&pservice->lock);
934         } else {
935                 /* Come back later if the device is busy... */
936                 vpu_queue_power_off_work(pservice);
937         }
938 }
939
940 static void vpu_service_power_on(struct vpu_service_info *pservice)
941 {
942         int ret;
943         static ktime_t last;
944         ktime_t now = ktime_get();
945         if (ktime_to_ns(ktime_sub(now, last)) > NSEC_PER_SEC) {
946                 cancel_delayed_work_sync(&pservice->power_off_work);
947                 vpu_queue_power_off_work(pservice);
948                 last = now;
949         }
950         ret = atomic_add_unless(&pservice->enabled, 1, 1);
951         if (!ret)
952                 return ;
953
954         pr_info("%s: power on\n", dev_name(pservice->dev));
955
956 #define BIT_VCODEC_CLK_SEL      (1<<10)
957         if (cpu_is_rk312x())
958                 writel_relaxed(readl_relaxed(RK_GRF_VIRT + RK312X_GRF_SOC_CON1) |
959                         BIT_VCODEC_CLK_SEL | (BIT_VCODEC_CLK_SEL << 16),
960                         RK_GRF_VIRT + RK312X_GRF_SOC_CON1);
961
962 #if VCODEC_CLOCK_ENABLE
963         if (pservice->aclk_vcodec)
964                 clk_prepare_enable(pservice->aclk_vcodec);
965         if (pservice->hclk_vcodec)
966                 clk_prepare_enable(pservice->hclk_vcodec);
967         if (pservice->clk_core)
968                 clk_prepare_enable(pservice->clk_core);
969         if (pservice->clk_cabac)
970                 clk_prepare_enable(pservice->clk_cabac);
971         if (pservice->pd_video)
972                 clk_prepare_enable(pservice->pd_video);
973 #endif
974
975         udelay(10);
976         atomic_add(1, &pservice->power_on_cnt);
977         wake_lock(&pservice->wake_lock);
978 }
979
980 static inline bool reg_check_rmvb_wmv(vpu_reg *reg)
981 {
982         u32 type = (reg->reg[3] & 0xF0000000) >> 28;
983         return ((type == 8) || (type == 4));
984 }
985
986 static inline bool reg_check_interlace(vpu_reg *reg)
987 {
988         u32 type = (reg->reg[3] & (1 << 23));
989         return (type > 0);
990 }
991
992 static inline enum VPU_DEC_FMT reg_check_fmt(vpu_reg *reg)
993 {
994         enum VPU_DEC_FMT type = (enum VPU_DEC_FMT)((reg->reg[3] & 0xF0000000) >> 28);
995         return type;
996 }
997
998 static inline int reg_probe_width(vpu_reg *reg)
999 {
1000         int width_in_mb = reg->reg[4] >> 23;
1001         return width_in_mb * 16;
1002 }
1003
1004 #if defined(CONFIG_VCODEC_MMU)
1005 static int vcodec_fd_to_iova(struct vpu_subdev_data *data, vpu_reg *reg,int fd)
1006 {
1007         struct vpu_service_info *pservice = data->pservice;
1008         struct ion_handle *hdl;
1009         int ret = 0;
1010         struct vcodec_mem_region *mem_region;
1011
1012         hdl = ion_import_dma_buf(pservice->ion_client, fd);
1013         if (IS_ERR(hdl)) {
1014                 vpu_err("import dma-buf from fd %d failed\n", fd);
1015                 return PTR_ERR(hdl);
1016         }
1017         mem_region = kzalloc(sizeof(struct vcodec_mem_region), GFP_KERNEL);
1018
1019         if (mem_region == NULL) {
1020                 vpu_err("allocate memory for iommu memory region failed\n");
1021                 ion_free(pservice->ion_client, hdl);
1022                 return -1;
1023         }
1024
1025         mem_region->hdl = hdl;
1026         ret = ion_map_iommu(data->dev, pservice->ion_client,
1027                 mem_region->hdl, &mem_region->iova, &mem_region->len);
1028
1029         if (ret < 0) {
1030                 vpu_err("ion map iommu failed\n");
1031                 kfree(mem_region);
1032                 ion_free(pservice->ion_client, hdl);
1033                 return ret;
1034         }
1035         INIT_LIST_HEAD(&mem_region->reg_lnk);
1036         list_add_tail(&mem_region->reg_lnk, &reg->mem_region_list);
1037         return mem_region->iova;
1038 }
1039
1040 static int vcodec_bufid_to_iova(struct vpu_subdev_data *data, u8 *tbl,
1041                                 int size, vpu_reg *reg,
1042                                 struct extra_info_for_iommu *ext_inf)
1043 {
1044         struct vpu_service_info *pservice = data->pservice;
1045         int i;
1046         int usr_fd = 0;
1047         int offset = 0;
1048
1049         if (tbl == NULL || size <= 0) {
1050                 dev_err(pservice->dev, "input arguments invalidate\n");
1051                 return -1;
1052         }
1053
1054         for (i = 0; i < size; i++) {
1055                 usr_fd = reg->reg[tbl[i]] & 0x3FF;
1056
1057                 if (tbl[i] == 41 && data->hw_info->hw_id != HEVC_ID &&
1058                     (reg->type == VPU_DEC || reg->type == VPU_DEC_PP))
1059                         /* special for vpu dec num 41 regitster */
1060                         offset = reg->reg[tbl[i]] >> 10 << 4;
1061                 else
1062                         offset = reg->reg[tbl[i]] >> 10;
1063
1064                 if (usr_fd != 0) {
1065                         struct ion_handle *hdl;
1066                         int ret = 0;
1067                         struct vcodec_mem_region *mem_region;
1068
1069                         hdl = ion_import_dma_buf(pservice->ion_client, usr_fd);
1070                         if (IS_ERR(hdl)) {
1071                                 dev_err(pservice->dev, "import dma-buf from fd %d failed, reg[%d]\n", usr_fd, tbl[i]);
1072                                 return PTR_ERR(hdl);
1073                         }
1074
1075                         if (tbl[i] == 42 && data->hw_info->hw_id == HEVC_ID){
1076                                 int i = 0;
1077                                 char *pps;
1078                                 pps = (char *)ion_map_kernel(pservice->ion_client,hdl);
1079                                 for (i=0; i<64; i++) {
1080                                         u32 scaling_offset;
1081                                         u32 tmp;
1082                                         int scaling_fd= 0;
1083                                         scaling_offset = (u32)pps[i*80+74];
1084                                         scaling_offset += (u32)pps[i*80+75] << 8;
1085                                         scaling_offset += (u32)pps[i*80+76] << 16;
1086                                         scaling_offset += (u32)pps[i*80+77] << 24;
1087                                         scaling_fd = scaling_offset&0x3ff;
1088                                         scaling_offset = scaling_offset >> 10;
1089                                         if(scaling_fd > 0) {
1090                                                 tmp = vcodec_fd_to_iova(data, reg, scaling_fd);
1091                                                 tmp += scaling_offset;
1092                                                 pps[i*80+74] = tmp & 0xff;
1093                                                 pps[i*80+75] = (tmp >> 8) & 0xff;
1094                                                 pps[i*80+76] = (tmp >> 16) & 0xff;
1095                                                 pps[i*80+77] = (tmp >> 24) & 0xff;
1096                                         }
1097                                 }
1098                         }
1099
1100                         mem_region = kzalloc(sizeof(struct vcodec_mem_region), GFP_KERNEL);
1101
1102                         if (mem_region == NULL) {
1103                                 dev_err(pservice->dev, "allocate memory for iommu memory region failed\n");
1104                                 ion_free(pservice->ion_client, hdl);
1105                                 return -1;
1106                         }
1107
1108                         mem_region->hdl = hdl;
1109                         mem_region->reg_idx = tbl[i];
1110                         ret = ion_map_iommu(data->dev,
1111                                             pservice->ion_client,
1112                                             mem_region->hdl,
1113                                             &mem_region->iova,
1114                                             &mem_region->len);
1115
1116                         if (ret < 0) {
1117                                 dev_err(pservice->dev, "ion map iommu failed\n");
1118                                 kfree(mem_region);
1119                                 ion_free(pservice->ion_client, hdl);
1120                                 return ret;
1121                         }
1122                         reg->reg[tbl[i]] = mem_region->iova + offset;
1123                         INIT_LIST_HEAD(&mem_region->reg_lnk);
1124                         list_add_tail(&mem_region->reg_lnk, &reg->mem_region_list);
1125                 }
1126         }
1127
1128         if (ext_inf != NULL && ext_inf->magic == EXTRA_INFO_MAGIC) {
1129                 for (i=0; i<ext_inf->cnt; i++) {
1130                         vpu_debug(DEBUG_IOMMU, "reg[%d] + offset %d\n",
1131                                   ext_inf->elem[i].index,
1132                                   ext_inf->elem[i].offset);
1133                         reg->reg[ext_inf->elem[i].index] +=
1134                                 ext_inf->elem[i].offset;
1135                 }
1136         }
1137
1138         return 0;
1139 }
1140
1141 static int vcodec_reg_address_translate(struct vpu_subdev_data *data,
1142                                         vpu_reg *reg,
1143                                         struct extra_info_for_iommu *ext_inf)
1144 {
1145         VPU_HW_ID hw_id;
1146         u8 *tbl;
1147         int size = 0;
1148
1149         hw_id = data->hw_info->hw_id;
1150
1151         if (hw_id == HEVC_ID) {
1152                 tbl = addr_tbl_hevc_dec;
1153                 size = sizeof(addr_tbl_hevc_dec);
1154         } else {
1155                 if (reg->type == VPU_DEC || reg->type == VPU_DEC_PP) {
1156                         switch (reg_check_fmt(reg)) {
1157                         case VPU_DEC_FMT_H264:
1158                                 {
1159                                         tbl = addr_tbl_vpu_h264dec;
1160                                         size = sizeof(addr_tbl_vpu_h264dec);
1161                                         break;
1162                                 }
1163                         case VPU_DEC_FMT_VP8:
1164                         case VPU_DEC_FMT_VP7:
1165                                 {
1166                                         tbl = addr_tbl_vpu_vp8dec;
1167                                         size = sizeof(addr_tbl_vpu_vp8dec);
1168                                         break;
1169                                 }
1170
1171                         case VPU_DEC_FMT_VP6:
1172                                 {
1173                                         tbl = addr_tbl_vpu_vp6dec;
1174                                         size = sizeof(addr_tbl_vpu_vp6dec);
1175                                         break;
1176                                 }
1177                         case VPU_DEC_FMT_VC1:
1178                                 {
1179                                         tbl = addr_tbl_vpu_vc1dec;
1180                                         size = sizeof(addr_tbl_vpu_vc1dec);
1181                                         break;
1182                                 }
1183
1184                         case VPU_DEC_FMT_JPEG:
1185                                 {
1186                                         tbl = addr_tbl_vpu_jpegdec;
1187                                         size = sizeof(addr_tbl_vpu_jpegdec);
1188                                         break;
1189                                 }
1190                         default:
1191                                 tbl = addr_tbl_vpu_defaultdec;
1192                                 size = sizeof(addr_tbl_vpu_defaultdec);
1193                                 break;
1194                         }
1195                 } else if (reg->type == VPU_ENC) {
1196                         tbl = addr_tbl_vpu_enc;
1197                         size = sizeof(addr_tbl_vpu_enc);
1198                 }
1199         }
1200
1201         if (size != 0) {
1202                 return vcodec_bufid_to_iova(data, tbl, size, reg, ext_inf);
1203         } else {
1204                 return -1;
1205         }
1206 }
1207 #endif
1208
1209 static vpu_reg *reg_init(struct vpu_subdev_data *data,
1210         vpu_session *session, void __user *src, u32 size)
1211 {
1212         struct vpu_service_info *pservice = data->pservice;
1213         int extra_size = 0;
1214         struct extra_info_for_iommu extra_info;
1215         vpu_reg *reg = kmalloc(sizeof(vpu_reg) + data->reg_size, GFP_KERNEL);
1216
1217         vpu_debug_enter();
1218
1219         if (NULL == reg) {
1220                 vpu_err("error: kmalloc fail in reg_init\n");
1221                 return NULL;
1222         }
1223
1224         if (size > data->reg_size) {
1225                 /*printk("warning: vpu reg size %u is larger than hw reg size %u\n",
1226                   size, data->reg_size);*/
1227                 extra_size = size - data->reg_size;
1228                 size = data->reg_size;
1229         }
1230         reg->session = session;
1231         reg->data = data;
1232         reg->type = session->type;
1233         reg->size = size;
1234         reg->freq = VPU_FREQ_DEFAULT;
1235         reg->reg = (u32 *)&reg[1];
1236         INIT_LIST_HEAD(&reg->session_link);
1237         INIT_LIST_HEAD(&reg->status_link);
1238
1239 #if defined(CONFIG_VCODEC_MMU)
1240         if (data->mmu_dev)
1241                 INIT_LIST_HEAD(&reg->mem_region_list);
1242 #endif
1243
1244         if (copy_from_user(&reg->reg[0], (void __user *)src, size)) {
1245                 vpu_err("error: copy_from_user failed in reg_init\n");
1246                 kfree(reg);
1247                 return NULL;
1248         }
1249
1250         if (copy_from_user(&extra_info, (u8 *)src + size, extra_size)) {
1251                 vpu_err("error: copy_from_user failed in reg_init\n");
1252                 kfree(reg);
1253                 return NULL;
1254         }
1255
1256 #if defined(CONFIG_VCODEC_MMU)
1257         if (data->mmu_dev &&
1258             0 > vcodec_reg_address_translate(data, reg, &extra_info)) {
1259                 vpu_err("error: translate reg address failed\n");
1260                 kfree(reg);
1261                 return NULL;
1262         }
1263 #endif
1264
1265         mutex_lock(&pservice->lock);
1266         list_add_tail(&reg->status_link, &pservice->waiting);
1267         list_add_tail(&reg->session_link, &session->waiting);
1268         mutex_unlock(&pservice->lock);
1269
1270         if (pservice->auto_freq) {
1271                 if (!soc_is_rk2928g()) {
1272                         if (reg->type == VPU_DEC || reg->type == VPU_DEC_PP) {
1273                                 if (reg_check_rmvb_wmv(reg)) {
1274                                         reg->freq = VPU_FREQ_200M;
1275                                 } else if (reg_check_fmt(reg) == VPU_DEC_FMT_H264) {
1276                                         if (reg_probe_width(reg) > 3200) {
1277                                                 /*raise frequency for 4k avc.*/
1278                                                 reg->freq = VPU_FREQ_500M;
1279                                         }
1280                                 } else {
1281                                         if (reg_check_interlace(reg)) {
1282                                                 reg->freq = VPU_FREQ_400M;
1283                                         }
1284                                 }
1285                         }
1286                         if (reg->type == VPU_PP) {
1287                                 reg->freq = VPU_FREQ_400M;
1288                         }
1289                 }
1290         }
1291         vpu_debug_leave();
1292         return reg;
1293 }
1294
1295 static void reg_deinit(struct vpu_subdev_data *data, vpu_reg *reg)
1296 {
1297         struct vpu_service_info *pservice = data->pservice;
1298 #if defined(CONFIG_VCODEC_MMU)
1299         struct vcodec_mem_region *mem_region = NULL, *n;
1300 #endif
1301
1302         list_del_init(&reg->session_link);
1303         list_del_init(&reg->status_link);
1304         if (reg == pservice->reg_codec)
1305                 pservice->reg_codec = NULL;
1306         if (reg == pservice->reg_pproc)
1307                 pservice->reg_pproc = NULL;
1308
1309 #if defined(CONFIG_VCODEC_MMU)
1310         /* release memory region attach to this registers table. */
1311         if (data->mmu_dev) {
1312                 list_for_each_entry_safe(mem_region, n,
1313                         &reg->mem_region_list, reg_lnk) {
1314                         /* do not unmap iommu manually,
1315                            unmap will proccess when memory release */
1316                         /*vcodec_enter_mode(data);
1317                         ion_unmap_iommu(data->dev,
1318                                         pservice->ion_client,
1319                                         mem_region->hdl);
1320                         vcodec_exit_mode();*/
1321                         ion_free(pservice->ion_client, mem_region->hdl);
1322                         list_del_init(&mem_region->reg_lnk);
1323                         kfree(mem_region);
1324                 }
1325         }
1326 #endif
1327
1328         kfree(reg);
1329 }
1330
1331 static void reg_from_wait_to_run(struct vpu_service_info *pservice, vpu_reg *reg)
1332 {
1333         vpu_debug_enter();
1334         list_del_init(&reg->status_link);
1335         list_add_tail(&reg->status_link, &pservice->running);
1336
1337         list_del_init(&reg->session_link);
1338         list_add_tail(&reg->session_link, &reg->session->running);
1339         vpu_debug_leave();
1340 }
1341
1342 static void reg_copy_from_hw(vpu_reg *reg, volatile u32 *src, u32 count)
1343 {
1344         int i;
1345         u32 *dst = (u32 *)&reg->reg[0];
1346         vpu_debug_enter();
1347         for (i = 0; i < count; i++)
1348                 *dst++ = *src++;
1349         vpu_debug_leave();
1350 }
1351
1352 static void reg_from_run_to_done(struct vpu_subdev_data *data,
1353         vpu_reg *reg)
1354 {
1355         struct vpu_service_info *pservice = data->pservice;
1356         int irq_reg = -1;
1357
1358         vpu_debug_enter();
1359
1360         list_del_init(&reg->status_link);
1361         list_add_tail(&reg->status_link, &pservice->done);
1362
1363         list_del_init(&reg->session_link);
1364         list_add_tail(&reg->session_link, &reg->session->done);
1365
1366         /*vcodec_enter_mode(data);*/
1367         switch (reg->type) {
1368         case VPU_ENC : {
1369                 pservice->reg_codec = NULL;
1370                 reg_copy_from_hw(reg, data->enc_dev.hwregs, data->hw_info->enc_reg_num);
1371                 irq_reg = ENC_INTERRUPT_REGISTER;
1372                 break;
1373         }
1374         case VPU_DEC : {
1375                 int reg_len = REG_NUM_9190_DEC;
1376                 pservice->reg_codec = NULL;
1377                 reg_copy_from_hw(reg, data->dec_dev.hwregs, reg_len);
1378                 irq_reg = DEC_INTERRUPT_REGISTER;
1379                 break;
1380         }
1381         case VPU_PP : {
1382                 pservice->reg_pproc = NULL;
1383                 reg_copy_from_hw(reg, data->dec_dev.hwregs + PP_INTERRUPT_REGISTER, REG_NUM_9190_PP);
1384                 data->dec_dev.hwregs[PP_INTERRUPT_REGISTER] = 0;
1385                 break;
1386         }
1387         case VPU_DEC_PP : {
1388                 pservice->reg_codec = NULL;
1389                 pservice->reg_pproc = NULL;
1390                 reg_copy_from_hw(reg, data->dec_dev.hwregs, REG_NUM_9190_DEC_PP);
1391                 data->dec_dev.hwregs[PP_INTERRUPT_REGISTER] = 0;
1392                 break;
1393         }
1394         default : {
1395                 vpu_err("error: copy reg from hw with unknown type %d\n", reg->type);
1396                 break;
1397         }
1398         }
1399         vcodec_exit_mode(data);
1400
1401         if (irq_reg != -1)
1402                 reg->reg[irq_reg] = pservice->irq_status;
1403
1404         atomic_sub(1, &reg->session->task_running);
1405         atomic_sub(1, &pservice->total_running);
1406         wake_up(&reg->session->wait);
1407
1408         vpu_debug_leave();
1409 }
1410
1411 static void vpu_service_set_freq(struct vpu_service_info *pservice, vpu_reg *reg)
1412 {
1413         VPU_FREQ curr = atomic_read(&pservice->freq_status);
1414         if (curr == reg->freq)
1415                 return;
1416         atomic_set(&pservice->freq_status, reg->freq);
1417         switch (reg->freq) {
1418         case VPU_FREQ_200M : {
1419                 clk_set_rate(pservice->aclk_vcodec, 200*MHZ);
1420         } break;
1421         case VPU_FREQ_266M : {
1422                 clk_set_rate(pservice->aclk_vcodec, 266*MHZ);
1423         } break;
1424         case VPU_FREQ_300M : {
1425                 clk_set_rate(pservice->aclk_vcodec, 300*MHZ);
1426         } break;
1427         case VPU_FREQ_400M : {
1428                 clk_set_rate(pservice->aclk_vcodec, 400*MHZ);
1429         } break;
1430         case VPU_FREQ_500M : {
1431                 clk_set_rate(pservice->aclk_vcodec, 500*MHZ);
1432         } break;
1433         case VPU_FREQ_600M : {
1434                 clk_set_rate(pservice->aclk_vcodec, 600*MHZ);
1435         } break;
1436         default : {
1437                 if (soc_is_rk2928g())
1438                         clk_set_rate(pservice->aclk_vcodec, 400*MHZ);
1439                 else
1440                         clk_set_rate(pservice->aclk_vcodec, 300*MHZ);
1441         } break;
1442         }
1443 }
1444
1445 static void reg_copy_to_hw(struct vpu_subdev_data *data, vpu_reg *reg)
1446 {
1447         struct vpu_service_info *pservice = data->pservice;
1448         int i;
1449         u32 *src = (u32 *)&reg->reg[0];
1450         vpu_debug_enter();
1451
1452         atomic_add(1, &pservice->total_running);
1453         atomic_add(1, &reg->session->task_running);
1454         if (pservice->auto_freq)
1455                 vpu_service_set_freq(pservice, reg);
1456
1457         vcodec_enter_mode(data);
1458
1459         switch (reg->type) {
1460         case VPU_ENC : {
1461                 int enc_count = data->hw_info->enc_reg_num;
1462                 u32 *dst = (u32 *)data->enc_dev.hwregs;
1463
1464                 pservice->reg_codec = reg;
1465
1466                 dst[VPU_REG_EN_ENC] = src[VPU_REG_EN_ENC] & 0x6;
1467
1468                 for (i = 0; i < VPU_REG_EN_ENC; i++)
1469                         dst[i] = src[i];
1470
1471                 for (i = VPU_REG_EN_ENC + 1; i < enc_count; i++)
1472                         dst[i] = src[i];
1473
1474                 VEPU_CLEAN_CACHE(dst);
1475
1476                 dsb(sy);
1477
1478                 dst[VPU_REG_ENC_GATE] = src[VPU_REG_ENC_GATE] | VPU_REG_ENC_GATE_BIT;
1479                 dst[VPU_REG_EN_ENC]   = src[VPU_REG_EN_ENC];
1480
1481                 time_record(&tasks[TASK_VPU_ENC], 0);
1482         } break;
1483         case VPU_DEC : {
1484                 u32 *dst = (u32 *)data->dec_dev.hwregs;
1485
1486                 pservice->reg_codec = reg;
1487
1488                 if (data->hw_info->hw_id != HEVC_ID) {
1489                         for (i = REG_NUM_9190_DEC - 1; i > VPU_REG_DEC_GATE; i--)
1490                                 dst[i] = src[i];
1491                         VDPU_CLEAN_CACHE(dst);
1492                 } else {
1493                         for (i = REG_NUM_HEVC_DEC - 1; i > VPU_REG_EN_DEC; i--)
1494                                 dst[i] = src[i];
1495                         HEVC_CLEAN_CACHE(dst);
1496                 }
1497
1498                 dsb(sy);
1499
1500                 if (data->hw_info->hw_id != HEVC_ID) {
1501                         dst[VPU_REG_DEC_GATE] = src[VPU_REG_DEC_GATE] | VPU_REG_DEC_GATE_BIT;
1502                         dst[VPU_REG_EN_DEC] = src[VPU_REG_EN_DEC];
1503                 } else {
1504                         dst[VPU_REG_EN_DEC] = src[VPU_REG_EN_DEC];
1505                 }
1506                 dsb(sy);
1507                 dmb(sy);
1508
1509                 time_record(&tasks[TASK_VPU_DEC], 0);
1510         } break;
1511         case VPU_PP : {
1512                 u32 *dst = (u32 *)data->dec_dev.hwregs + PP_INTERRUPT_REGISTER;
1513                 pservice->reg_pproc = reg;
1514
1515                 dst[VPU_REG_PP_GATE] = src[VPU_REG_PP_GATE] | VPU_REG_PP_GATE_BIT;
1516
1517                 for (i = VPU_REG_PP_GATE + 1; i < REG_NUM_9190_PP; i++)
1518                         dst[i] = src[i];
1519
1520                 dsb(sy);
1521
1522                 dst[VPU_REG_EN_PP] = src[VPU_REG_EN_PP];
1523
1524                 time_record(&tasks[TASK_VPU_PP], 0);
1525         } break;
1526         case VPU_DEC_PP : {
1527                 u32 *dst = (u32 *)data->dec_dev.hwregs;
1528                 pservice->reg_codec = reg;
1529                 pservice->reg_pproc = reg;
1530
1531                 VDPU_SOFT_RESET(dst);
1532                 VDPU_CLEAN_CACHE(dst);
1533
1534                 for (i = VPU_REG_EN_DEC_PP + 1; i < REG_NUM_9190_DEC_PP; i++)
1535                         dst[i] = src[i];
1536
1537                 dst[VPU_REG_EN_DEC_PP]   = src[VPU_REG_EN_DEC_PP] | 0x2;
1538                 dsb(sy);
1539
1540                 dst[VPU_REG_DEC_PP_GATE] = src[VPU_REG_DEC_PP_GATE] | VPU_REG_PP_GATE_BIT;
1541                 dst[VPU_REG_DEC_GATE]    = src[VPU_REG_DEC_GATE]    | VPU_REG_DEC_GATE_BIT;
1542                 dst[VPU_REG_EN_DEC]      = src[VPU_REG_EN_DEC];
1543
1544                 time_record(&tasks[TASK_VPU_DEC], 0);
1545         } break;
1546         default : {
1547                 vpu_err("error: unsupport session type %d", reg->type);
1548                 atomic_sub(1, &pservice->total_running);
1549                 atomic_sub(1, &reg->session->task_running);
1550         } break;
1551         }
1552
1553         /*vcodec_exit_mode(data);*/
1554         vpu_debug_leave();
1555 }
1556
1557 static void try_set_reg(struct vpu_subdev_data *data)
1558 {
1559         struct vpu_service_info *pservice = data->pservice;
1560         vpu_debug_enter();
1561         if (!list_empty(&pservice->waiting)) {
1562                 int can_set = 0;
1563                 bool change_able = (NULL == pservice->reg_codec) && (NULL == pservice->reg_pproc);
1564                 int reset_request = atomic_read(&pservice->reset_request);
1565                 vpu_reg *reg = list_entry(pservice->waiting.next, vpu_reg, status_link);
1566
1567                 vpu_service_power_on(pservice);
1568
1569                 // first check can_set flag
1570                 if (change_able || !reset_request) {
1571                         switch (reg->type) {
1572                         case VPU_ENC : {
1573                                 if (change_able)
1574                                         can_set = 1;
1575                         } break;
1576                         case VPU_DEC : {
1577                                 if (NULL == pservice->reg_codec)
1578                                         can_set = 1;
1579                                 if (pservice->auto_freq && (NULL != pservice->reg_pproc))
1580                                         can_set = 0;
1581                         } break;
1582                         case VPU_PP : {
1583                                 if (NULL == pservice->reg_codec) {
1584                                         if (NULL == pservice->reg_pproc)
1585                                                 can_set = 1;
1586                                 } else {
1587                                         if ((VPU_DEC == pservice->reg_codec->type) && (NULL == pservice->reg_pproc))
1588                                                 can_set = 1;
1589                                         /* can not charge frequency when vpu is working */
1590                                         if (pservice->auto_freq)
1591                                                 can_set = 0;
1592                                 }
1593                         } break;
1594                         case VPU_DEC_PP : {
1595                                 if (change_able)
1596                                         can_set = 1;
1597                                 } break;
1598                         default : {
1599                                 printk("undefined reg type %d\n", reg->type);
1600                         } break;
1601                         }
1602                 }
1603
1604                 // then check reset request
1605                 if (reset_request && !change_able)
1606                         reset_request = 0;
1607
1608                 // do reset before setting registers
1609                 if (reset_request)
1610                         vpu_reset(data);
1611
1612                 if (can_set) {
1613                         reg_from_wait_to_run(pservice, reg);
1614                         reg_copy_to_hw(reg->data, reg);
1615                 }
1616         }
1617         vpu_debug_leave();
1618 }
1619
1620 static int return_reg(struct vpu_subdev_data *data,
1621         vpu_reg *reg, u32 __user *dst)
1622 {
1623         int ret = 0;
1624         vpu_debug_enter();
1625         switch (reg->type) {
1626         case VPU_ENC : {
1627                 if (copy_to_user(dst, &reg->reg[0], data->hw_info->enc_io_size))
1628                         ret = -EFAULT;
1629                 break;
1630         }
1631         case VPU_DEC : {
1632                 int reg_len = data->hw_info->hw_id == HEVC_ID ? REG_NUM_HEVC_DEC : REG_NUM_9190_DEC;
1633                 if (copy_to_user(dst, &reg->reg[0], SIZE_REG(reg_len)))
1634                         ret = -EFAULT;
1635                 break;
1636         }
1637         case VPU_PP : {
1638                 if (copy_to_user(dst, &reg->reg[0], SIZE_REG(REG_NUM_9190_PP)))
1639                         ret = -EFAULT;
1640                 break;
1641         }
1642         case VPU_DEC_PP : {
1643                 if (copy_to_user(dst, &reg->reg[0], SIZE_REG(REG_NUM_9190_DEC_PP)))
1644                         ret = -EFAULT;
1645                 break;
1646         }
1647         default : {
1648                 ret = -EFAULT;
1649                 vpu_err("error: copy reg to user with unknown type %d\n", reg->type);
1650                 break;
1651         }
1652         }
1653         reg_deinit(data, reg);
1654         vpu_debug_leave();
1655         return ret;
1656 }
1657
1658 static long vpu_service_ioctl(struct file *filp, unsigned int cmd,
1659         unsigned long arg)
1660 {
1661         struct vpu_subdev_data *data =
1662                 container_of(filp->f_dentry->d_inode->i_cdev,
1663                         struct vpu_subdev_data, cdev);
1664         struct vpu_service_info *pservice = data->pservice;
1665         vpu_session *session = (vpu_session *)filp->private_data;
1666         vpu_debug_enter();
1667         if (NULL == session)
1668                 return -EINVAL;
1669
1670         switch (cmd) {
1671         case VPU_IOC_SET_CLIENT_TYPE : {
1672                 session->type = (enum VPU_CLIENT_TYPE)arg;
1673                 vpu_debug(DEBUG_IOCTL, "VPU_IOC_SET_CLIENT_TYPE %d\n", session->type);
1674                 break;
1675         }
1676         case VPU_IOC_GET_HW_FUSE_STATUS : {
1677                 struct vpu_request req;
1678                 vpu_debug(DEBUG_IOCTL, "VPU_IOC_GET_HW_FUSE_STATUS type %d\n", session->type);
1679                 if (copy_from_user(&req, (void __user *)arg, sizeof(struct vpu_request))) {
1680                         vpu_err("error: VPU_IOC_GET_HW_FUSE_STATUS copy_from_user failed\n");
1681                         return -EFAULT;
1682                 } else {
1683                         if (VPU_ENC != session->type) {
1684                                 if (copy_to_user((void __user *)req.req,
1685                                         &pservice->dec_config,
1686                                         sizeof(struct vpu_dec_config))) {
1687                                         vpu_err("error: VPU_IOC_GET_HW_FUSE_STATUS copy_to_user failed type %d\n",
1688                                                 session->type);
1689                                         return -EFAULT;
1690                                 }
1691                         } else {
1692                                 if (copy_to_user((void __user *)req.req,
1693                                         &pservice->enc_config,
1694                                         sizeof(struct vpu_enc_config ))) {
1695                                         vpu_err("error: VPU_IOC_GET_HW_FUSE_STATUS copy_to_user failed type %d\n",
1696                                                 session->type);
1697                                         return -EFAULT;
1698                                 }
1699                         }
1700                 }
1701
1702                 break;
1703         }
1704         case VPU_IOC_SET_REG : {
1705                 struct vpu_request req;
1706                 vpu_reg *reg;
1707                 vpu_debug(DEBUG_IOCTL, "VPU_IOC_SET_REG type %d\n", session->type);
1708                 if (copy_from_user(&req, (void __user *)arg,
1709                         sizeof(struct vpu_request))) {
1710                         vpu_err("error: VPU_IOC_SET_REG copy_from_user failed\n");
1711                         return -EFAULT;
1712                 }
1713                 reg = reg_init(data, session,
1714                         (void __user *)req.req, req.size);
1715                 if (NULL == reg) {
1716                         return -EFAULT;
1717                 } else {
1718                         mutex_lock(&pservice->lock);
1719                         try_set_reg(data);
1720                         mutex_unlock(&pservice->lock);
1721                 }
1722
1723                 break;
1724         }
1725         case VPU_IOC_GET_REG : {
1726                 struct vpu_request req;
1727                 vpu_reg *reg;
1728                 vpu_debug(DEBUG_IOCTL, "VPU_IOC_GET_REG type %d\n", session->type);
1729                 if (copy_from_user(&req, (void __user *)arg,
1730                         sizeof(struct vpu_request))) {
1731                         vpu_err("error: VPU_IOC_GET_REG copy_from_user failed\n");
1732                         return -EFAULT;
1733                 } else {
1734                         int ret = wait_event_timeout(session->wait, !list_empty(&session->done), VPU_TIMEOUT_DELAY);
1735                         if (!list_empty(&session->done)) {
1736                                 if (ret < 0) {
1737                                         vpu_err("warning: pid %d wait task sucess but wait_evernt ret %d\n", session->pid, ret);
1738                                 }
1739                                 ret = 0;
1740                         } else {
1741                                 if (unlikely(ret < 0)) {
1742                                         vpu_err("error: pid %d wait task ret %d\n", session->pid, ret);
1743                                 } else if (0 == ret) {
1744                                         vpu_err("error: pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));
1745                                         ret = -ETIMEDOUT;
1746                                 }
1747                         }
1748                         if (ret < 0) {
1749                                 int task_running = atomic_read(&session->task_running);
1750                                 mutex_lock(&pservice->lock);
1751                                 vpu_service_dump(pservice);
1752                                 if (task_running) {
1753                                         atomic_set(&session->task_running, 0);
1754                                         atomic_sub(task_running, &pservice->total_running);
1755                                         printk("%d task is running but not return, reset hardware...", task_running);
1756                                         vpu_reset(data);
1757                                         printk("done\n");
1758                                 }
1759                                 vpu_service_session_clear(data, session);
1760                                 mutex_unlock(&pservice->lock);
1761                                 return ret;
1762                         }
1763                 }
1764                 mutex_lock(&pservice->lock);
1765                 reg = list_entry(session->done.next, vpu_reg, session_link);
1766                 return_reg(data, reg, (u32 __user *)req.req);
1767                 mutex_unlock(&pservice->lock);
1768                 break;
1769         }
1770         case VPU_IOC_PROBE_IOMMU_STATUS: {
1771                 int iommu_enable = 0;
1772
1773                 vpu_debug(DEBUG_IOCTL, "VPU_IOC_PROBE_IOMMU_STATUS\n");
1774
1775 #if defined(CONFIG_VCODEC_MMU)
1776                 iommu_enable = data->mmu_dev ? 1 : 0;
1777 #endif
1778
1779                 if (copy_to_user((void __user *)arg, &iommu_enable, sizeof(int))) {
1780                         vpu_err("error: VPU_IOC_PROBE_IOMMU_STATUS copy_to_user failed\n");
1781                         return -EFAULT;
1782                 }
1783                 break;
1784         }
1785         default : {
1786                 vpu_err("error: unknow vpu service ioctl cmd %x\n", cmd);
1787                 break;
1788         }
1789         }
1790         vpu_debug_leave();
1791         return 0;
1792 }
1793
1794 #ifdef CONFIG_COMPAT
1795 static long compat_vpu_service_ioctl(struct file *filp, unsigned int cmd,
1796         unsigned long arg)
1797 {
1798         struct vpu_subdev_data *data =
1799                 container_of(filp->f_dentry->d_inode->i_cdev,
1800                         struct vpu_subdev_data, cdev);
1801         struct vpu_service_info *pservice = data->pservice;
1802         vpu_session *session = (vpu_session *)filp->private_data;
1803         vpu_debug_enter();
1804         vpu_debug(3, "cmd %x, COMPAT_VPU_IOC_SET_CLIENT_TYPE %x\n", cmd,
1805                   (u32)COMPAT_VPU_IOC_SET_CLIENT_TYPE);
1806         if (NULL == session)
1807                 return -EINVAL;
1808
1809         switch (cmd) {
1810         case COMPAT_VPU_IOC_SET_CLIENT_TYPE : {
1811                 session->type = (enum VPU_CLIENT_TYPE)arg;
1812                 vpu_debug(DEBUG_IOCTL, "COMPAT_VPU_IOC_SET_CLIENT_TYPE type %d\n", session->type);
1813                 break;
1814         }
1815         case COMPAT_VPU_IOC_GET_HW_FUSE_STATUS : {
1816                 struct compat_vpu_request req;
1817                 vpu_debug(DEBUG_IOCTL, "COMPAT_VPU_IOC_GET_HW_FUSE_STATUS type %d\n", session->type);
1818                 if (copy_from_user(&req, compat_ptr((compat_uptr_t)arg),
1819                                    sizeof(struct compat_vpu_request))) {
1820                         vpu_err("error: VPU_IOC_GET_HW_FUSE_STATUS"
1821                                 " copy_from_user failed\n");
1822                         return -EFAULT;
1823                 } else {
1824                         if (VPU_ENC != session->type) {
1825                                 if (copy_to_user(compat_ptr((compat_uptr_t)req.req),
1826                                                  &pservice->dec_config,
1827                                                  sizeof(struct vpu_dec_config))) {
1828                                         vpu_err("error: VPU_IOC_GET_HW_FUSE_STATUS "
1829                                                 "copy_to_user failed type %d\n",
1830                                                 session->type);
1831                                         return -EFAULT;
1832                                 }
1833                         } else {
1834                                 if (copy_to_user(compat_ptr((compat_uptr_t)req.req),
1835                                                  &pservice->enc_config,
1836                                                  sizeof(struct vpu_enc_config ))) {
1837                                         vpu_err("error: VPU_IOC_GET_HW_FUSE_STATUS"
1838                                                 " copy_to_user failed type %d\n",
1839                                                 session->type);
1840                                         return -EFAULT;
1841                                 }
1842                         }
1843                 }
1844
1845                 break;
1846         }
1847         case COMPAT_VPU_IOC_SET_REG : {
1848                 struct compat_vpu_request req;
1849                 vpu_reg *reg;
1850                 vpu_debug(DEBUG_IOCTL, "COMPAT_VPU_IOC_SET_REG type %d\n", session->type);
1851                 if (copy_from_user(&req, compat_ptr((compat_uptr_t)arg),
1852                                    sizeof(struct compat_vpu_request))) {
1853                         vpu_err("VPU_IOC_SET_REG copy_from_user failed\n");
1854                         return -EFAULT;
1855                 }
1856                 reg = reg_init(data, session,
1857                                compat_ptr((compat_uptr_t)req.req), req.size);
1858                 if (NULL == reg) {
1859                         return -EFAULT;
1860                 } else {
1861                         mutex_lock(&pservice->lock);
1862                         try_set_reg(data);
1863                         mutex_unlock(&pservice->lock);
1864                 }
1865
1866                 break;
1867         }
1868         case COMPAT_VPU_IOC_GET_REG : {
1869                 struct compat_vpu_request req;
1870                 vpu_reg *reg;
1871                 vpu_debug(DEBUG_IOCTL, "COMPAT_VPU_IOC_GET_REG type %d\n", session->type);
1872                 if (copy_from_user(&req, compat_ptr((compat_uptr_t)arg),
1873                                    sizeof(struct compat_vpu_request))) {
1874                         vpu_err("VPU_IOC_GET_REG copy_from_user failed\n");
1875                         return -EFAULT;
1876                 } else {
1877                         int ret = wait_event_timeout(session->wait, !list_empty(&session->done), VPU_TIMEOUT_DELAY);
1878                         if (!list_empty(&session->done)) {
1879                                 if (ret < 0) {
1880                                         vpu_err("warning: pid %d wait task sucess but wait_evernt ret %d\n", session->pid, ret);
1881                                 }
1882                                 ret = 0;
1883                         } else {
1884                                 if (unlikely(ret < 0)) {
1885                                         vpu_err("error: pid %d wait task ret %d\n", session->pid, ret);
1886                                 } else if (0 == ret) {
1887                                         vpu_err("error: pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));
1888                                         ret = -ETIMEDOUT;
1889                                 }
1890                         }
1891                         if (ret < 0) {
1892                                 int task_running = atomic_read(&session->task_running);
1893                                 mutex_lock(&pservice->lock);
1894                                 vpu_service_dump(pservice);
1895                                 if (task_running) {
1896                                         atomic_set(&session->task_running, 0);
1897                                         atomic_sub(task_running, &pservice->total_running);
1898                                         printk("%d task is running but not return, reset hardware...", task_running);
1899                                         vpu_reset(data);
1900                                         printk("done\n");
1901                                 }
1902                                 vpu_service_session_clear(data, session);
1903                                 mutex_unlock(&pservice->lock);
1904                                 return ret;
1905                         }
1906                 }
1907                 mutex_lock(&pservice->lock);
1908                 reg = list_entry(session->done.next, vpu_reg, session_link);
1909                 return_reg(data, reg, compat_ptr((compat_uptr_t)req.req));
1910                 mutex_unlock(&pservice->lock);
1911                 break;
1912         }
1913         case COMPAT_VPU_IOC_PROBE_IOMMU_STATUS : {
1914                 int iommu_enable = 0;
1915
1916                 vpu_debug(DEBUG_IOCTL, "COMPAT_VPU_IOC_PROBE_IOMMU_STATUS\n");
1917 #if defined(CONFIG_VCODEC_MMU)
1918                 iommu_enable = data->mmu_dev ? 1 : 0;
1919 #endif
1920
1921                 if (copy_to_user(compat_ptr((compat_uptr_t)arg), &iommu_enable, sizeof(int))) {
1922                         vpu_err("error: VPU_IOC_PROBE_IOMMU_STATUS copy_to_user failed\n");
1923                         return -EFAULT;
1924                 }
1925                 break;
1926         }
1927         default : {
1928                 vpu_err("error: unknow vpu service ioctl cmd %x\n", cmd);
1929                 break;
1930         }
1931         }
1932         vpu_debug_leave();
1933         return 0;
1934 }
1935 #endif
1936
1937 static int vpu_service_check_hw(struct vpu_subdev_data *data, u32 hw_addr)
1938 {
1939         int ret = -EINVAL, i = 0;
1940         volatile u32 *tmp = (volatile u32 *)ioremap_nocache(hw_addr, 0x4);
1941         u32 enc_id = *tmp;
1942
1943         enc_id = (enc_id >> 16) & 0xFFFF;
1944         pr_info("checking hw id %x\n", enc_id);
1945         data->hw_info = NULL;
1946         for (i = 0; i < ARRAY_SIZE(vpu_hw_set); i++) {
1947                 if (enc_id == vpu_hw_set[i].hw_id) {
1948                         data->hw_info = &vpu_hw_set[i];
1949                         ret = 0;
1950                         break;
1951                 }
1952         }
1953         iounmap((void *)tmp);
1954         return ret;
1955 }
1956
1957 static int vpu_service_open(struct inode *inode, struct file *filp)
1958 {
1959         struct vpu_subdev_data *data = container_of(inode->i_cdev, struct vpu_subdev_data, cdev);
1960         struct vpu_service_info *pservice = data->pservice;
1961         vpu_session *session = (vpu_session *)kmalloc(sizeof(vpu_session), GFP_KERNEL);
1962
1963         vpu_debug_enter();
1964
1965         if (NULL == session) {
1966                 vpu_err("error: unable to allocate memory for vpu_session.");
1967                 return -ENOMEM;
1968         }
1969
1970         session->type   = VPU_TYPE_BUTT;
1971         session->pid    = current->pid;
1972         INIT_LIST_HEAD(&session->waiting);
1973         INIT_LIST_HEAD(&session->running);
1974         INIT_LIST_HEAD(&session->done);
1975         INIT_LIST_HEAD(&session->list_session);
1976         init_waitqueue_head(&session->wait);
1977         atomic_set(&session->task_running, 0);
1978         mutex_lock(&pservice->lock);
1979         list_add_tail(&session->list_session, &pservice->session);
1980         filp->private_data = (void *)session;
1981         mutex_unlock(&pservice->lock);
1982
1983         pr_debug("dev opened\n");
1984         vpu_debug_leave();
1985         return nonseekable_open(inode, filp);
1986 }
1987
1988 static int vpu_service_release(struct inode *inode, struct file *filp)
1989 {
1990         struct vpu_subdev_data *data = container_of(inode->i_cdev, struct vpu_subdev_data, cdev);
1991         struct vpu_service_info *pservice = data->pservice;
1992         int task_running;
1993         vpu_session *session = (vpu_session *)filp->private_data;
1994         vpu_debug_enter();
1995         if (NULL == session)
1996                 return -EINVAL;
1997
1998         task_running = atomic_read(&session->task_running);
1999         if (task_running) {
2000                 vpu_err("error: vpu_service session %d still has %d task running when closing\n", session->pid, task_running);
2001                 msleep(50);
2002         }
2003         wake_up(&session->wait);
2004
2005         mutex_lock(&pservice->lock);
2006         /* remove this filp from the asynchronusly notified filp's */
2007         list_del_init(&session->list_session);
2008         vpu_service_session_clear(data, session);
2009         kfree(session);
2010         filp->private_data = NULL;
2011         mutex_unlock(&pservice->lock);
2012
2013         pr_debug("dev closed\n");
2014         vpu_debug_leave();
2015         return 0;
2016 }
2017
2018 static const struct file_operations vpu_service_fops = {
2019         .unlocked_ioctl = vpu_service_ioctl,
2020         .open           = vpu_service_open,
2021         .release        = vpu_service_release,
2022 #ifdef CONFIG_COMPAT
2023         .compat_ioctl   = compat_vpu_service_ioctl,
2024 #endif
2025 };
2026
2027 static irqreturn_t vdpu_irq(int irq, void *dev_id);
2028 static irqreturn_t vdpu_isr(int irq, void *dev_id);
2029 static irqreturn_t vepu_irq(int irq, void *dev_id);
2030 static irqreturn_t vepu_isr(int irq, void *dev_id);
2031 static void get_hw_info(struct vpu_subdev_data *data);
2032
2033 #ifdef CONFIG_VCODEC_MMU
2034 static struct device *rockchip_get_sysmmu_dev(const char *compt)
2035 {
2036         struct device_node *dn = NULL;
2037         struct platform_device *pd = NULL;
2038         struct device *ret = NULL ;
2039
2040         dn = of_find_compatible_node(NULL,NULL,compt);
2041         if(!dn) {
2042                 printk("can't find device node %s \r\n",compt);
2043                 return NULL;
2044         }
2045
2046         pd = of_find_device_by_node(dn);
2047         if(!pd) {
2048                 printk("can't find platform device in device node %s\n",compt);
2049                 return  NULL;
2050         }
2051         ret = &pd->dev;
2052
2053         return ret;
2054
2055 }
2056 #ifdef CONFIG_IOMMU_API
2057 static inline void platform_set_sysmmu(struct device *iommu,
2058         struct device *dev)
2059 {
2060         dev->archdata.iommu = iommu;
2061 }
2062 #else
2063 static inline void platform_set_sysmmu(struct device *iommu,
2064         struct device *dev)
2065 {
2066 }
2067 #endif
2068
2069 int vcodec_sysmmu_fault_hdl(struct device *dev,
2070                                 enum rk_iommu_inttype itype,
2071                                 unsigned long pgtable_base,
2072                                 unsigned long fault_addr, unsigned int status)
2073 {
2074         struct platform_device *pdev;
2075         struct vpu_subdev_data *data;
2076         struct vpu_service_info *pservice;
2077
2078         vpu_debug_enter();
2079
2080         pdev = container_of(dev, struct platform_device, dev);
2081
2082         data = platform_get_drvdata(pdev);
2083         pservice = data->pservice;
2084
2085         if (pservice->reg_codec) {
2086                 struct vcodec_mem_region *mem, *n;
2087                 int i = 0;
2088                 vpu_debug(DEBUG_IOMMU, "vcodec, fault addr 0x%08x\n", (u32)fault_addr);
2089                 list_for_each_entry_safe(mem, n,
2090                                          &pservice->reg_codec->mem_region_list,
2091                                          reg_lnk) {
2092                         vpu_debug(DEBUG_IOMMU, "vcodec, reg[%02u] mem region [%02d] 0x%08x %ld\n",
2093                                 mem->reg_idx, i, (u32)mem->iova, mem->len);
2094                         i++;
2095                 }
2096
2097                 pr_alert("vcodec, page fault occur, reset hw\n");
2098                 pservice->reg_codec->reg[101] = 1;
2099                 vpu_reset(data);
2100         }
2101
2102         return 0;
2103 }
2104 #endif
2105
2106 #if HEVC_TEST_ENABLE
2107 static int hevc_test_case0(vpu_service_info *pservice);
2108 #endif
2109 #if defined(CONFIG_ION_ROCKCHIP)
2110 extern struct ion_client *rockchip_ion_client_create(const char * name);
2111 #endif
2112
2113 static int vcodec_subdev_probe(struct platform_device *pdev,
2114         struct vpu_service_info *pservice)
2115 {
2116         int ret = 0;
2117         struct resource *res = NULL;
2118         u32 ioaddr = 0;
2119         struct device *dev = &pdev->dev;
2120         char *name = (char*)dev_name(dev);
2121         struct device_node *np = pdev->dev.of_node;
2122         struct vpu_subdev_data *data =
2123                 devm_kzalloc(dev, sizeof(struct vpu_subdev_data), GFP_KERNEL);
2124 #if defined(CONFIG_VCODEC_MMU)
2125         u32 iommu_en = 0;
2126         char mmu_dev_dts_name[40];
2127         of_property_read_u32(np, "iommu_enabled", &iommu_en);
2128 #endif
2129         pr_info("probe device %s\n", dev_name(dev));
2130
2131         data->pservice = pservice;
2132         data->dev = dev;
2133
2134         of_property_read_string(np, "name", (const char**)&name);
2135         of_property_read_u32(np, "dev_mode", (u32*)&data->mode);
2136         /*dev_set_name(dev, name);*/
2137
2138         if (pservice->reg_base == 0) {
2139                 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2140                 data->regs = devm_ioremap_resource(dev, res);
2141                 if (IS_ERR(data->regs)) {
2142                         ret = PTR_ERR(data->regs);
2143                         goto err;
2144                 }
2145                 ioaddr = res->start;
2146         } else {
2147                 data->regs = pservice->reg_base;
2148                 ioaddr = pservice->ioaddr;
2149         }
2150
2151         clear_bit(MMU_ACTIVATED, &data->state);
2152         vcodec_enter_mode(data);
2153         ret = vpu_service_check_hw(data, ioaddr);
2154         if (ret < 0) {
2155                 vpu_err("error: hw info check faild\n");
2156                 goto err;
2157         }
2158
2159         data->dec_dev.iosize = data->hw_info->dec_io_size;
2160         data->dec_dev.hwregs = (volatile u32 *)((u8 *)data->regs + data->hw_info->dec_offset);
2161         data->reg_size = data->dec_dev.iosize;
2162
2163         if (data->mode == VCODEC_RUNNING_MODE_VPU) {
2164                 data->enc_dev.iosize = data->hw_info->enc_io_size;
2165                 data->reg_size = data->reg_size > data->enc_dev.iosize ? data->reg_size : data->enc_dev.iosize;
2166                 data->enc_dev.hwregs = (volatile u32 *)((u8 *)data->regs + data->hw_info->enc_offset);
2167         }
2168
2169         data->irq_enc = platform_get_irq_byname(pdev, "irq_enc");
2170         if (data->irq_enc > 0) {
2171                 ret = devm_request_threaded_irq(dev,
2172                         data->irq_enc, vepu_irq, vepu_isr,
2173                         IRQF_SHARED, dev_name(dev),
2174                         (void *)data);
2175                 if (ret) {
2176                         dev_err(dev,
2177                                 "error: can't request vepu irq %d\n",
2178                                 data->irq_enc);
2179                         goto err;
2180                 }
2181         }
2182         data->irq_dec = platform_get_irq_byname(pdev, "irq_dec");
2183         if (data->irq_dec > 0) {
2184                 ret = devm_request_threaded_irq(dev,
2185                         data->irq_dec, vdpu_irq, vdpu_isr,
2186                         IRQF_SHARED, dev_name(dev),
2187                         (void *)data);
2188                 if (ret) {
2189                         dev_err(dev,
2190                                 "error: can't request vdpu irq %d\n",
2191                                 data->irq_dec);
2192                         goto err;
2193                 }
2194         }
2195         atomic_set(&data->dec_dev.irq_count_codec, 0);
2196         atomic_set(&data->dec_dev.irq_count_pp, 0);
2197         atomic_set(&data->enc_dev.irq_count_codec, 0);
2198         atomic_set(&data->enc_dev.irq_count_pp, 0);
2199 #if defined(CONFIG_VCODEC_MMU)
2200         if (iommu_en) {
2201                 if (data->mode == VCODEC_RUNNING_MODE_HEVC)
2202                         sprintf(mmu_dev_dts_name,
2203                                 HEVC_IOMMU_COMPATIBLE_NAME);
2204                 else
2205                         sprintf(mmu_dev_dts_name,
2206                                 VPU_IOMMU_COMPATIBLE_NAME);
2207
2208                 data->mmu_dev =
2209                         rockchip_get_sysmmu_dev(mmu_dev_dts_name);
2210
2211                 if (data->mmu_dev)
2212                         platform_set_sysmmu(data->mmu_dev, dev);
2213
2214                 rockchip_iovmm_set_fault_handler(dev, vcodec_sysmmu_fault_hdl);
2215         }
2216 #endif
2217         vcodec_exit_mode(data);
2218         /* create device node */
2219         ret = alloc_chrdev_region(&data->dev_t, 0, 1, name);
2220         if (ret) {
2221                 dev_err(dev, "alloc dev_t failed\n");
2222                 goto err;
2223         }
2224
2225         cdev_init(&data->cdev, &vpu_service_fops);
2226
2227         data->cdev.owner = THIS_MODULE;
2228         data->cdev.ops = &vpu_service_fops;
2229
2230         ret = cdev_add(&data->cdev, data->dev_t, 1);
2231
2232         if (ret) {
2233                 dev_err(dev, "add dev_t failed\n");
2234                 goto err;
2235         }
2236
2237         data->cls = class_create(THIS_MODULE, name);
2238
2239         if (IS_ERR(data->cls)) {
2240                 ret = PTR_ERR(data->cls);
2241                 dev_err(dev, "class_create err:%d\n", ret);
2242                 goto err;
2243         }
2244
2245         data->child_dev = device_create(data->cls, dev,
2246                 data->dev_t, NULL, name);
2247
2248         get_hw_info(data);
2249
2250         platform_set_drvdata(pdev, data);
2251
2252         INIT_LIST_HEAD(&data->lnk_service);
2253         list_add_tail(&data->lnk_service, &pservice->subdev_list);
2254
2255 #ifdef CONFIG_DEBUG_FS
2256         data->debugfs_dir =
2257                 vcodec_debugfs_create_device_dir((char*)name, parent);
2258         if (data->debugfs_dir == NULL)
2259                 vpu_err("create debugfs dir %s failed\n", name);
2260
2261         data->debugfs_file_regs =
2262                 debugfs_create_file("regs", 0664,
2263                                     data->debugfs_dir, data,
2264                                     &debug_vcodec_fops);
2265 #endif
2266         return 0;
2267 err:
2268         if (data->irq_enc > 0)
2269                 free_irq(data->irq_enc, (void *)data);
2270         if (data->irq_dec > 0)
2271                 free_irq(data->irq_dec, (void *)data);
2272
2273         if (data->child_dev) {
2274                 device_destroy(data->cls, data->dev_t);
2275                 cdev_del(&data->cdev);
2276                 unregister_chrdev_region(data->dev_t, 1);
2277         }
2278
2279         if (data->cls)
2280                 class_destroy(data->cls);
2281         return -1;
2282 }
2283
2284 static void vcodec_subdev_remove(struct vpu_subdev_data *data)
2285 {
2286         device_destroy(data->cls, data->dev_t);
2287         class_destroy(data->cls);
2288         cdev_del(&data->cdev);
2289         unregister_chrdev_region(data->dev_t, 1);
2290
2291         free_irq(data->irq_enc, (void *)&data);
2292         free_irq(data->irq_dec, (void *)&data);
2293
2294 #ifdef CONFIG_DEBUG_FS
2295         debugfs_remove_recursive(data->debugfs_dir);
2296 #endif
2297 }
2298
2299 static void vcodec_read_property(struct device_node *np,
2300         struct vpu_service_info *pservice)
2301 {
2302         pservice->mode_bit = 0;
2303         pservice->mode_ctrl = 0;
2304         pservice->subcnt = 0;
2305
2306         of_property_read_u32(np, "subcnt", &pservice->subcnt);
2307
2308         if (pservice->subcnt > 1) {
2309                 of_property_read_u32(np, "mode_bit", &pservice->mode_bit);
2310                 of_property_read_u32(np, "mode_ctrl", &pservice->mode_ctrl);
2311         }
2312 #ifdef CONFIG_MFD_SYSCON
2313         pservice->grf_base = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
2314 #else
2315         pservice->grf_base = (u32*)RK_GRF_VIRT;
2316 #endif
2317         if (IS_ERR(pservice->grf_base)) {
2318 #ifdef CONFIG_ARM
2319                 pservice->grf_base = RK_GRF_VIRT;
2320 #else
2321                 vpu_err("can't find vpu grf property\n");
2322                 return;
2323 #endif
2324         }
2325         of_property_read_string(np, "name", (const char**)&pservice->name);
2326 }
2327
2328 static void vcodec_init_drvdata(struct vpu_service_info *pservice)
2329 {
2330         pservice->dev_id = VCODEC_DEVICE_ID_VPU;
2331         pservice->curr_mode = -1;
2332
2333         wake_lock_init(&pservice->wake_lock, WAKE_LOCK_SUSPEND, "vpu");
2334         INIT_LIST_HEAD(&pservice->waiting);
2335         INIT_LIST_HEAD(&pservice->running);
2336         mutex_init(&pservice->lock);
2337
2338         INIT_LIST_HEAD(&pservice->done);
2339         INIT_LIST_HEAD(&pservice->session);
2340         INIT_LIST_HEAD(&pservice->subdev_list);
2341
2342         pservice->reg_pproc     = NULL;
2343         atomic_set(&pservice->total_running, 0);
2344         atomic_set(&pservice->enabled,       0);
2345         atomic_set(&pservice->power_on_cnt,  0);
2346         atomic_set(&pservice->power_off_cnt, 0);
2347         atomic_set(&pservice->reset_request, 0);
2348
2349         INIT_DELAYED_WORK(&pservice->power_off_work, vpu_power_off_work);
2350
2351         pservice->ion_client = rockchip_ion_client_create("vpu");
2352         if (IS_ERR(pservice->ion_client)) {
2353                 vpu_err("failed to create ion client for vcodec ret %ld\n",
2354                         PTR_ERR(pservice->ion_client));
2355         } else {
2356                 vpu_debug(DEBUG_IOMMU, "vcodec ion client create success!\n");
2357         }
2358 }
2359
2360 static int vcodec_probe(struct platform_device *pdev)
2361 {
2362         int i;
2363         int ret = 0;
2364         struct resource *res = NULL;
2365         struct device *dev = &pdev->dev;
2366         struct device_node *np = pdev->dev.of_node;
2367         struct vpu_service_info *pservice =
2368                 devm_kzalloc(dev, sizeof(struct vpu_service_info), GFP_KERNEL);
2369
2370         pr_info("probe device %s\n", dev_name(dev));
2371
2372         vcodec_read_property(np, pservice);
2373         vcodec_init_drvdata(pservice);
2374
2375         if (strncmp(pservice->name, "hevc_service", 12) == 0)
2376                 pservice->dev_id = VCODEC_DEVICE_ID_HEVC;
2377         else if (strncmp(pservice->name, "vpu_service", 11) == 0)
2378                 pservice->dev_id = VCODEC_DEVICE_ID_VPU;
2379         else
2380                 pservice->dev_id = VCODEC_DEVICE_ID_COMBO;
2381
2382         pservice->dev = dev;
2383
2384         if (0 > vpu_get_clk(pservice))
2385                 goto err;
2386
2387         vpu_service_power_on(pservice);
2388
2389         if (of_property_read_bool(np, "reg")) {
2390                 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2391
2392                 pservice->reg_base = devm_ioremap_resource(pservice->dev, res);
2393                 if (IS_ERR(pservice->reg_base)) {
2394                         vpu_err("ioremap registers base failed\n");
2395                         ret = PTR_ERR(pservice->reg_base);
2396                         goto err;
2397                 }
2398                 pservice->ioaddr = res->start;
2399         } else {
2400                 pservice->reg_base = 0;
2401         }
2402
2403         if (of_property_read_bool(np, "subcnt")) {
2404                 for (i = 0; i<pservice->subcnt; i++) {
2405                         struct device_node *sub_np;
2406                         struct platform_device *sub_pdev;
2407                         sub_np = of_parse_phandle(np, "rockchip,sub", i);
2408                         sub_pdev = of_find_device_by_node(sub_np);
2409
2410                         vcodec_subdev_probe(sub_pdev, pservice);
2411                 }
2412         } else {
2413                 vcodec_subdev_probe(pdev, pservice);
2414         }
2415         platform_set_drvdata(pdev, pservice);
2416
2417         vpu_service_power_off(pservice);
2418
2419         pr_info("init success\n");
2420
2421         return 0;
2422
2423 err:
2424         pr_info("init failed\n");
2425         vpu_service_power_off(pservice);
2426         vpu_put_clk(pservice);
2427         wake_lock_destroy(&pservice->wake_lock);
2428
2429         if (res)
2430                 devm_release_mem_region(&pdev->dev, res->start, resource_size(res));
2431
2432         return ret;
2433 }
2434
2435 static int vcodec_remove(struct platform_device *pdev)
2436 {
2437         struct vpu_service_info *pservice = platform_get_drvdata(pdev);
2438         struct resource *res;
2439         struct vpu_subdev_data *data, *n;
2440
2441         list_for_each_entry_safe(data, n, &pservice->subdev_list, lnk_service) {
2442                 vcodec_subdev_remove(data);
2443         }
2444
2445         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2446         devm_release_mem_region(&pdev->dev, res->start, resource_size(res));
2447         vpu_put_clk(pservice);
2448         wake_lock_destroy(&pservice->wake_lock);
2449
2450         return 0;
2451 }
2452
2453 #if defined(CONFIG_OF)
2454 static const struct of_device_id vcodec_service_dt_ids[] = {
2455         {.compatible = "vpu_service",},
2456         {.compatible = "rockchip,hevc_service",},
2457         {.compatible = "rockchip,vpu_combo",},
2458         {},
2459 };
2460 #endif
2461
2462 static struct platform_driver vcodec_driver = {
2463         .probe = vcodec_probe,
2464         .remove = vcodec_remove,
2465         .driver = {
2466                 .name = "vcodec",
2467                 .owner = THIS_MODULE,
2468 #if defined(CONFIG_OF)
2469                 .of_match_table = of_match_ptr(vcodec_service_dt_ids),
2470 #endif
2471         },
2472 };
2473
2474 static void get_hw_info(struct vpu_subdev_data *data)
2475 {
2476         struct vpu_service_info *pservice = data->pservice;
2477         struct vpu_dec_config *dec = &pservice->dec_config;
2478         struct vpu_enc_config *enc = &pservice->enc_config;
2479         if (data->mode == VCODEC_RUNNING_MODE_VPU) {
2480                 u32 configReg   = data->dec_dev.hwregs[VPU_DEC_HWCFG0];
2481                 u32 asicID      = data->dec_dev.hwregs[0];
2482
2483                 dec->h264_support    = (configReg >> DWL_H264_E) & 0x3U;
2484                 dec->jpegSupport    = (configReg >> DWL_JPEG_E) & 0x01U;
2485                 if (dec->jpegSupport && ((configReg >> DWL_PJPEG_E) & 0x01U))
2486                         dec->jpegSupport = JPEG_PROGRESSIVE;
2487                 dec->mpeg4Support   = (configReg >> DWL_MPEG4_E) & 0x3U;
2488                 dec->vc1Support     = (configReg >> DWL_VC1_E) & 0x3U;
2489                 dec->mpeg2Support   = (configReg >> DWL_MPEG2_E) & 0x01U;
2490                 dec->sorensonSparkSupport = (configReg >> DWL_SORENSONSPARK_E) & 0x01U;
2491                 dec->refBufSupport  = (configReg >> DWL_REF_BUFF_E) & 0x01U;
2492                 dec->vp6Support     = (configReg >> DWL_VP6_E) & 0x01U;
2493
2494                 dec->maxDecPicWidth = 4096;
2495
2496                 /* 2nd Config register */
2497                 configReg   = data->dec_dev.hwregs[VPU_DEC_HWCFG1];
2498                 if (dec->refBufSupport) {
2499                         if ((configReg >> DWL_REF_BUFF_ILACE_E) & 0x01U)
2500                                 dec->refBufSupport |= 2;
2501                         if ((configReg >> DWL_REF_BUFF_DOUBLE_E) & 0x01U)
2502                                 dec->refBufSupport |= 4;
2503                 }
2504                 dec->customMpeg4Support = (configReg >> DWL_MPEG4_CUSTOM_E) & 0x01U;
2505                 dec->vp7Support     = (configReg >> DWL_VP7_E) & 0x01U;
2506                 dec->vp8Support     = (configReg >> DWL_VP8_E) & 0x01U;
2507                 dec->avsSupport     = (configReg >> DWL_AVS_E) & 0x01U;
2508
2509                 /* JPEG xtensions */
2510                 if (((asicID >> 16) >= 0x8190U) || ((asicID >> 16) == 0x6731U))
2511                         dec->jpegESupport = (configReg >> DWL_JPEG_EXT_E) & 0x01U;
2512                 else
2513                         dec->jpegESupport = JPEG_EXT_NOT_SUPPORTED;
2514
2515                 if (((asicID >> 16) >= 0x9170U) || ((asicID >> 16) == 0x6731U) )
2516                         dec->rvSupport = (configReg >> DWL_RV_E) & 0x03U;
2517                 else
2518                         dec->rvSupport = RV_NOT_SUPPORTED;
2519                 dec->mvcSupport = (configReg >> DWL_MVC_E) & 0x03U;
2520
2521                 if (dec->refBufSupport && (asicID >> 16) == 0x6731U )
2522                         dec->refBufSupport |= 8; /* enable HW support for offset */
2523
2524                 if (!cpu_is_rk3036()) {
2525                         configReg = data->enc_dev.hwregs[63];
2526                         enc->maxEncodedWidth = configReg & ((1 << 11) - 1);
2527                         enc->h264Enabled = (configReg >> 27) & 1;
2528                         enc->mpeg4Enabled = (configReg >> 26) & 1;
2529                         enc->jpegEnabled = (configReg >> 25) & 1;
2530                         enc->vsEnabled = (configReg >> 24) & 1;
2531                         enc->rgbEnabled = (configReg >> 28) & 1;
2532                         enc->reg_size = data->reg_size;
2533                         enc->reserv[0] = enc->reserv[1] = 0;
2534                 }
2535                 pservice->auto_freq = true;
2536                 vpu_debug(DEBUG_EXTRA_INFO, "vpu_service set to auto frequency mode\n");
2537                 atomic_set(&pservice->freq_status, VPU_FREQ_BUT);
2538
2539                 pservice->bug_dec_addr = cpu_is_rk30xx();
2540         } else {
2541                 if (cpu_is_rk3036()  || cpu_is_rk312x())
2542                         dec->maxDecPicWidth = 1920;
2543                 else
2544                         dec->maxDecPicWidth = 4096;
2545                 /* disable frequency switch in hevc.*/
2546                 pservice->auto_freq = false;
2547         }
2548 }
2549
2550 static bool check_irq_err(task_info *task, u32 irq_status)
2551 {
2552         return (task->error_mask & irq_status) ? true : false;
2553 }
2554
2555 static irqreturn_t vdpu_irq(int irq, void *dev_id)
2556 {
2557         struct vpu_subdev_data *data = (struct vpu_subdev_data*)dev_id;
2558         struct vpu_service_info *pservice = data->pservice;
2559         vpu_device *dev = &data->dec_dev;
2560         u32 raw_status;
2561         u32 dec_status;
2562
2563         /*vcodec_enter_mode(data);*/
2564
2565         dec_status = raw_status = readl(dev->hwregs + DEC_INTERRUPT_REGISTER);
2566
2567         if (dec_status & DEC_INTERRUPT_BIT) {
2568                 time_record(&tasks[TASK_VPU_DEC], 1);
2569                 vpu_debug(DEBUG_IRQ_STATUS, "vdpu_irq dec status %08x\n", dec_status);
2570                 if ((dec_status & 0x40001) == 0x40001) {
2571                         do {
2572                                 dec_status =
2573                                         readl(dev->hwregs +
2574                                                 DEC_INTERRUPT_REGISTER);
2575                         } while ((dec_status & 0x40001) == 0x40001);
2576                 }
2577
2578                 if (check_irq_err((data->hw_info->hw_id == HEVC_ID)?
2579                                         (&tasks[TASK_RKDEC_HEVC]) : (&tasks[TASK_VPU_DEC]),
2580                                         dec_status)) {
2581                         atomic_add(1, &pservice->reset_request);
2582                 }
2583
2584                 writel(0, dev->hwregs + DEC_INTERRUPT_REGISTER);
2585                 atomic_add(1, &dev->irq_count_codec);
2586                 time_diff(&tasks[TASK_VPU_DEC]);
2587         }
2588
2589         if (data->hw_info->hw_id != HEVC_ID) {
2590                 u32 pp_status = readl(dev->hwregs + PP_INTERRUPT_REGISTER);
2591                 if (pp_status & PP_INTERRUPT_BIT) {
2592                         time_record(&tasks[TASK_VPU_PP], 1);
2593                         vpu_debug(DEBUG_IRQ_STATUS, "vdpu_irq pp status %08x\n", pp_status);
2594
2595                         if (check_irq_err(&tasks[TASK_VPU_PP], dec_status))
2596                                 atomic_add(1, &pservice->reset_request);
2597
2598                         /* clear pp IRQ */
2599                         writel(pp_status & (~DEC_INTERRUPT_BIT), dev->hwregs + PP_INTERRUPT_REGISTER);
2600                         atomic_add(1, &dev->irq_count_pp);
2601                         time_diff(&tasks[TASK_VPU_PP]);
2602                 }
2603         }
2604
2605         pservice->irq_status = raw_status;
2606
2607         /*vcodec_exit_mode(pservice);*/
2608
2609         if (atomic_read(&dev->irq_count_pp) ||
2610             atomic_read(&dev->irq_count_codec))
2611                 return IRQ_WAKE_THREAD;
2612         else
2613                 return IRQ_NONE;
2614 }
2615
2616 static irqreturn_t vdpu_isr(int irq, void *dev_id)
2617 {
2618         struct vpu_subdev_data *data = (struct vpu_subdev_data*)dev_id;
2619         struct vpu_service_info *pservice = data->pservice;
2620         vpu_device *dev = &data->dec_dev;
2621
2622         mutex_lock(&pservice->lock);
2623         if (atomic_read(&dev->irq_count_codec)) {
2624                 atomic_sub(1, &dev->irq_count_codec);
2625                 if (NULL == pservice->reg_codec) {
2626                         vpu_err("error: dec isr with no task waiting\n");
2627                 } else {
2628                         reg_from_run_to_done(data, pservice->reg_codec);
2629                         /* avoid vpu timeout and can't recover problem */
2630                         VDPU_SOFT_RESET(data->regs);
2631                 }
2632         }
2633
2634         if (atomic_read(&dev->irq_count_pp)) {
2635                 atomic_sub(1, &dev->irq_count_pp);
2636                 if (NULL == pservice->reg_pproc) {
2637                         vpu_err("error: pp isr with no task waiting\n");
2638                 } else {
2639                         reg_from_run_to_done(data, pservice->reg_pproc);
2640                 }
2641         }
2642         try_set_reg(data);
2643         mutex_unlock(&pservice->lock);
2644         return IRQ_HANDLED;
2645 }
2646
2647 static irqreturn_t vepu_irq(int irq, void *dev_id)
2648 {
2649         struct vpu_subdev_data *data = (struct vpu_subdev_data*)dev_id;
2650         struct vpu_service_info *pservice = data->pservice;
2651         vpu_device *dev = &data->enc_dev;
2652         u32 irq_status;
2653
2654         /*vcodec_enter_mode(data);*/
2655         irq_status= readl(dev->hwregs + ENC_INTERRUPT_REGISTER);
2656
2657         vpu_debug(DEBUG_IRQ_STATUS, "vepu_irq irq status %x\n", irq_status);
2658
2659         if (likely(irq_status & ENC_INTERRUPT_BIT)) {
2660                 time_record(&tasks[TASK_VPU_ENC], 1);
2661
2662                 if (check_irq_err(&tasks[TASK_VPU_ENC], irq_status))
2663                         atomic_add(1, &pservice->reset_request);
2664
2665                 /* clear enc IRQ */
2666                 writel(irq_status & (~ENC_INTERRUPT_BIT), dev->hwregs + ENC_INTERRUPT_REGISTER);
2667                 atomic_add(1, &dev->irq_count_codec);
2668                 time_diff(&tasks[TASK_VPU_ENC]);
2669         }
2670
2671         pservice->irq_status = irq_status;
2672
2673         /*vcodec_exit_mode(pservice);*/
2674
2675         if (atomic_read(&dev->irq_count_codec))
2676                 return IRQ_WAKE_THREAD;
2677         else
2678                 return IRQ_NONE;
2679 }
2680
2681 static irqreturn_t vepu_isr(int irq, void *dev_id)
2682 {
2683         struct vpu_subdev_data *data = (struct vpu_subdev_data*)dev_id;
2684         struct vpu_service_info *pservice = data->pservice;
2685         vpu_device *dev = &data->enc_dev;
2686
2687         mutex_lock(&pservice->lock);
2688         if (atomic_read(&dev->irq_count_codec)) {
2689                 atomic_sub(1, &dev->irq_count_codec);
2690                 if (NULL == pservice->reg_codec) {
2691                         vpu_err("error: enc isr with no task waiting\n");
2692                 } else {
2693                         reg_from_run_to_done(data, pservice->reg_codec);
2694                 }
2695         }
2696         try_set_reg(data);
2697         mutex_unlock(&pservice->lock);
2698         return IRQ_HANDLED;
2699 }
2700
2701 static int __init vcodec_service_init(void)
2702 {
2703         int ret;
2704
2705         if ((ret = platform_driver_register(&vcodec_driver)) != 0) {
2706                 vpu_err("Platform device register failed (%d).\n", ret);
2707                 return ret;
2708         }
2709
2710 #ifdef CONFIG_DEBUG_FS
2711         vcodec_debugfs_init();
2712 #endif
2713
2714         return ret;
2715 }
2716
2717 static void __exit vcodec_service_exit(void)
2718 {
2719 #ifdef CONFIG_DEBUG_FS
2720         vcodec_debugfs_exit();
2721 #endif
2722
2723         platform_driver_unregister(&vcodec_driver);
2724 }
2725
2726 module_init(vcodec_service_init);
2727 module_exit(vcodec_service_exit);
2728
2729 #ifdef CONFIG_DEBUG_FS
2730 #include <linux/seq_file.h>
2731
2732 static int vcodec_debugfs_init()
2733 {
2734         parent = debugfs_create_dir("vcodec", NULL);
2735         if (!parent)
2736                 return -1;
2737
2738         return 0;
2739 }
2740
2741 static void vcodec_debugfs_exit()
2742 {
2743         debugfs_remove(parent);
2744 }
2745
2746 static struct dentry* vcodec_debugfs_create_device_dir(char *dirname, struct dentry *parent)
2747 {
2748         return debugfs_create_dir(dirname, parent);
2749 }
2750
2751 static int debug_vcodec_show(struct seq_file *s, void *unused)
2752 {
2753         struct vpu_subdev_data *data = s->private;
2754         struct vpu_service_info *pservice = data->pservice;
2755         unsigned int i, n;
2756         vpu_reg *reg, *reg_tmp;
2757         vpu_session *session, *session_tmp;
2758
2759         mutex_lock(&pservice->lock);
2760         vpu_service_power_on(pservice);
2761         if (data->hw_info->hw_id != HEVC_ID) {
2762                 seq_printf(s, "\nENC Registers:\n");
2763                 n = data->enc_dev.iosize >> 2;
2764                 for (i = 0; i < n; i++)
2765                         seq_printf(s, "\tswreg%d = %08X\n", i, readl(data->enc_dev.hwregs + i));
2766         }
2767         seq_printf(s, "\nDEC Registers:\n");
2768         n = data->dec_dev.iosize >> 2;
2769         for (i = 0; i < n; i++)
2770                 seq_printf(s, "\tswreg%d = %08X\n", i, readl(data->dec_dev.hwregs + i));
2771
2772         seq_printf(s, "\nvpu service status:\n");
2773         list_for_each_entry_safe(session, session_tmp, &pservice->session, list_session) {
2774                 seq_printf(s, "session pid %d type %d:\n", session->pid, session->type);
2775                 /*seq_printf(s, "waiting reg set %d\n");*/
2776                 list_for_each_entry_safe(reg, reg_tmp, &session->waiting, session_link) {
2777                         seq_printf(s, "waiting register set\n");
2778                 }
2779                 list_for_each_entry_safe(reg, reg_tmp, &session->running, session_link) {
2780                         seq_printf(s, "running register set\n");
2781                 }
2782                 list_for_each_entry_safe(reg, reg_tmp, &session->done, session_link) {
2783                         seq_printf(s, "done    register set\n");
2784                 }
2785         }
2786
2787         seq_printf(s, "\npower counter: on %d off %d\n",
2788                         atomic_read(&pservice->power_on_cnt),
2789                         atomic_read(&pservice->power_off_cnt));
2790         mutex_unlock(&pservice->lock);
2791         vpu_service_power_off(pservice);
2792
2793         return 0;
2794 }
2795
2796 static int debug_vcodec_open(struct inode *inode, struct file *file)
2797 {
2798         return single_open(file, debug_vcodec_show, inode->i_private);
2799 }
2800
2801 #endif
2802
2803 #if HEVC_TEST_ENABLE & defined(CONFIG_ION_ROCKCHIP)
2804 #include "hevc_test_inc/pps_00.h"
2805 #include "hevc_test_inc/register_00.h"
2806 #include "hevc_test_inc/rps_00.h"
2807 #include "hevc_test_inc/scaling_list_00.h"
2808 #include "hevc_test_inc/stream_00.h"
2809
2810 #include "hevc_test_inc/pps_01.h"
2811 #include "hevc_test_inc/register_01.h"
2812 #include "hevc_test_inc/rps_01.h"
2813 #include "hevc_test_inc/scaling_list_01.h"
2814 #include "hevc_test_inc/stream_01.h"
2815
2816 #include "hevc_test_inc/cabac.h"
2817
2818 extern struct ion_client *rockchip_ion_client_create(const char * name);
2819
2820 static struct ion_client *ion_client = NULL;
2821 u8* get_align_ptr(u8* tbl, int len, u32 *phy)
2822 {
2823         int size = (len+15) & (~15);
2824         struct ion_handle *handle;
2825         u8 *ptr;
2826
2827         if (ion_client == NULL)
2828                 ion_client = rockchip_ion_client_create("vcodec");
2829
2830         handle = ion_alloc(ion_client, (size_t)len, 16, ION_HEAP(ION_CMA_HEAP_ID), 0);
2831
2832         ptr = ion_map_kernel(ion_client, handle);
2833
2834         ion_phys(ion_client, handle, phy, &size);
2835
2836         memcpy(ptr, tbl, len);
2837
2838         return ptr;
2839 }
2840
2841 u8* get_align_ptr_no_copy(int len, u32 *phy)
2842 {
2843         int size = (len+15) & (~15);
2844         struct ion_handle *handle;
2845         u8 *ptr;
2846
2847         if (ion_client == NULL)
2848                 ion_client = rockchip_ion_client_create("vcodec");
2849
2850         handle = ion_alloc(ion_client, (size_t)len, 16, ION_HEAP(ION_CMA_HEAP_ID), 0);
2851
2852         ptr = ion_map_kernel(ion_client, handle);
2853
2854         ion_phys(ion_client, handle, phy, &size);
2855
2856         return ptr;
2857 }
2858
2859 #define TEST_CNT    2
2860 static int hevc_test_case0(vpu_service_info *pservice)
2861 {
2862         vpu_session session;
2863         vpu_reg *reg;
2864         unsigned long size = 272;
2865         int testidx = 0;
2866         int ret = 0;
2867         u8 *pps_tbl[TEST_CNT];
2868         u8 *register_tbl[TEST_CNT];
2869         u8 *rps_tbl[TEST_CNT];
2870         u8 *scaling_list_tbl[TEST_CNT];
2871         u8 *stream_tbl[TEST_CNT];
2872
2873         int stream_size[2];
2874         int pps_size[2];
2875         int rps_size[2];
2876         int scl_size[2];
2877         int cabac_size[2];
2878
2879         u32 phy_pps;
2880         u32 phy_rps;
2881         u32 phy_scl;
2882         u32 phy_str;
2883         u32 phy_yuv;
2884         u32 phy_ref;
2885         u32 phy_cabac;
2886
2887         volatile u8 *stream_buf;
2888         volatile u8 *pps_buf;
2889         volatile u8 *rps_buf;
2890         volatile u8 *scl_buf;
2891         volatile u8 *yuv_buf;
2892         volatile u8 *cabac_buf;
2893         volatile u8 *ref_buf;
2894
2895         u8 *pps;
2896         u8 *yuv[2];
2897         int i;
2898
2899         pps_tbl[0] = pps_00;
2900         pps_tbl[1] = pps_01;
2901
2902         register_tbl[0] = register_00;
2903         register_tbl[1] = register_01;
2904
2905         rps_tbl[0] = rps_00;
2906         rps_tbl[1] = rps_01;
2907
2908         scaling_list_tbl[0] = scaling_list_00;
2909         scaling_list_tbl[1] = scaling_list_01;
2910
2911         stream_tbl[0] = stream_00;
2912         stream_tbl[1] = stream_01;
2913
2914         stream_size[0] = sizeof(stream_00);
2915         stream_size[1] = sizeof(stream_01);
2916
2917         pps_size[0] = sizeof(pps_00);
2918         pps_size[1] = sizeof(pps_01);
2919
2920         rps_size[0] = sizeof(rps_00);
2921         rps_size[1] = sizeof(rps_01);
2922
2923         scl_size[0] = sizeof(scaling_list_00);
2924         scl_size[1] = sizeof(scaling_list_01);
2925
2926         cabac_size[0] = sizeof(Cabac_table);
2927         cabac_size[1] = sizeof(Cabac_table);
2928
2929         /* create session */
2930         session.pid = current->pid;
2931         session.type = VPU_DEC;
2932         INIT_LIST_HEAD(&session.waiting);
2933         INIT_LIST_HEAD(&session.running);
2934         INIT_LIST_HEAD(&session.done);
2935         INIT_LIST_HEAD(&session.list_session);
2936         init_waitqueue_head(&session.wait);
2937         atomic_set(&session.task_running, 0);
2938         list_add_tail(&session.list_session, &pservice->session);
2939
2940         yuv[0] = get_align_ptr_no_copy(256*256*2, &phy_yuv);
2941         yuv[1] = get_align_ptr_no_copy(256*256*2, &phy_ref);
2942
2943         while (testidx < TEST_CNT) {
2944                 /* create registers */
2945                 reg = kmalloc(sizeof(vpu_reg)+pservice->reg_size, GFP_KERNEL);
2946                 if (NULL == reg) {
2947                         vpu_err("error: kmalloc fail in reg_init\n");
2948                         return -1;
2949                 }
2950
2951                 if (size > pservice->reg_size) {
2952                         printk("warning: vpu reg size %lu is larger than hw reg size %lu\n", size, pservice->reg_size);
2953                         size = pservice->reg_size;
2954                 }
2955                 reg->session = &session;
2956                 reg->type = session.type;
2957                 reg->size = size;
2958                 reg->freq = VPU_FREQ_DEFAULT;
2959                 reg->reg = (unsigned long *)&reg[1];
2960                 INIT_LIST_HEAD(&reg->session_link);
2961                 INIT_LIST_HEAD(&reg->status_link);
2962
2963                 /* TODO: stuff registers */
2964                 memcpy(&reg->reg[0], register_tbl[testidx], /*sizeof(register_00)*/ 176);
2965
2966                 stream_buf = get_align_ptr(stream_tbl[testidx], stream_size[testidx], &phy_str);
2967                 pps_buf = get_align_ptr(pps_tbl[0], pps_size[0], &phy_pps);
2968                 rps_buf = get_align_ptr(rps_tbl[testidx], rps_size[testidx], &phy_rps);
2969                 scl_buf = get_align_ptr(scaling_list_tbl[testidx], scl_size[testidx], &phy_scl);
2970                 cabac_buf = get_align_ptr(Cabac_table, cabac_size[testidx], &phy_cabac);
2971
2972                 pps = pps_buf;
2973
2974                 /* TODO: replace reigster address */
2975                 for (i=0; i<64; i++) {
2976                         u32 scaling_offset;
2977                         u32 tmp;
2978
2979                         scaling_offset = (u32)pps[i*80+74];
2980                         scaling_offset += (u32)pps[i*80+75] << 8;
2981                         scaling_offset += (u32)pps[i*80+76] << 16;
2982                         scaling_offset += (u32)pps[i*80+77] << 24;
2983
2984                         tmp = phy_scl + scaling_offset;
2985
2986                         pps[i*80+74] = tmp & 0xff;
2987                         pps[i*80+75] = (tmp >> 8) & 0xff;
2988                         pps[i*80+76] = (tmp >> 16) & 0xff;
2989                         pps[i*80+77] = (tmp >> 24) & 0xff;
2990                 }
2991
2992                 printk("%s %d, phy stream %08x, phy pps %08x, phy rps %08x\n",
2993                         __func__, __LINE__, phy_str, phy_pps, phy_rps);
2994
2995                 reg->reg[1] = 0x21;
2996                 reg->reg[4] = phy_str;
2997                 reg->reg[5] = ((stream_size[testidx]+15)&(~15))+64;
2998                 reg->reg[6] = phy_cabac;
2999                 reg->reg[7] = testidx?phy_ref:phy_yuv;
3000                 reg->reg[42] = phy_pps;
3001                 reg->reg[43] = phy_rps;
3002                 for (i = 10; i <= 24; i++)
3003                         reg->reg[i] = phy_yuv;
3004
3005                 mutex_lock(pservice->lock);
3006                 list_add_tail(&reg->status_link, &pservice->waiting);
3007                 list_add_tail(&reg->session_link, &session.waiting);
3008                 mutex_unlock(pservice->lock);
3009
3010                 /* stuff hardware */
3011                 try_set_reg(data);
3012
3013                 /* wait for result */
3014                 ret = wait_event_timeout(session.wait, !list_empty(&session.done), VPU_TIMEOUT_DELAY);
3015                 if (!list_empty(&session.done)) {
3016                         if (ret < 0)
3017                                 vpu_err("warning: pid %d wait task sucess but wait_evernt ret %d\n", session.pid, ret);
3018                         ret = 0;
3019                 } else {
3020                         if (unlikely(ret < 0)) {
3021                                 vpu_err("error: pid %d wait task ret %d\n", session.pid, ret);
3022                         } else if (0 == ret) {
3023                                 vpu_err("error: pid %d wait %d task done timeout\n", session.pid, atomic_read(&session.task_running));
3024                                 ret = -ETIMEDOUT;
3025                         }
3026                 }
3027                 if (ret < 0) {
3028                         int task_running = atomic_read(&session.task_running);
3029                         int n;
3030                         mutex_lock(pservice->lock);
3031                         vpu_service_dump(pservice);
3032                         if (task_running) {
3033                                 atomic_set(&session.task_running, 0);
3034                                 atomic_sub(task_running, &pservice->total_running);
3035                                 printk("%d task is running but not return, reset hardware...", task_running);
3036                                 vpu_reset(data);
3037                                 printk("done\n");
3038                         }
3039                         vpu_service_session_clear(pservice, &session);
3040                         mutex_unlock(pservice->lock);
3041
3042                         printk("\nDEC Registers:\n");
3043                         n = data->dec_dev.iosize >> 2;
3044                         for (i=0; i<n; i++)
3045                                 printk("\tswreg%d = %08X\n", i, readl(data->dec_dev.hwregs + i));
3046
3047                         vpu_err("test index %d failed\n", testidx);
3048                         break;
3049                 } else {
3050                         vpu_debug(DEBUG_EXTRA_INFO, "test index %d success\n", testidx);
3051
3052                         vpu_reg *reg = list_entry(session.done.next, vpu_reg, session_link);
3053
3054                         for (i=0; i<68; i++) {
3055                                 if (i % 4 == 0)
3056                                         printk("%02d: ", i);
3057                                 printk("%08x ", reg->reg[i]);
3058                                 if ((i+1) % 4 == 0)
3059                                         printk("\n");
3060                         }
3061
3062                         testidx++;
3063                 }
3064
3065                 reg_deinit(data, reg);
3066         }
3067
3068         return 0;
3069 }
3070
3071 #endif
3072