summaryrefslogtreecommitdiff
path: root/drivers/frame_provider/decoder/utils/vdec.h (plain)
blob: 80fa8dc628c6dee9b9c4221b46e4b1ee221f6f11
1/*
2 * drivers/amlogic/media/frame_provider/decoder/utils/vdec.h
3 *
4 * Copyright (C) 2016 Amlogic, Inc. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 */
17
18#ifndef VDEC_H
19#define VDEC_H
20#include <linux/amlogic/media/utils/amports_config.h>
21#include <linux/interrupt.h>
22#include <linux/platform_device.h>
23#include <linux/list.h>
24#include <linux/completion.h>
25#include <linux/irqreturn.h>
26
27#include <linux/amlogic/media/utils/amstream.h>
28#include <linux/amlogic/media/vfm/vframe.h>
29#include <linux/amlogic/media/vfm/vframe_provider.h>
30#include <linux/amlogic/media/vfm/vframe_receiver.h>
31#define KERNEL_ATRACE_TAG KERNEL_ATRACE_TAG_VDEC
32#include <trace/events/meson_atrace.h>
33/*#define CONFIG_AM_VDEC_DV*/
34
35#include "vdec_input.h"
36#include "frame_check.h"
37
38s32 vdec_dev_register(void);
39s32 vdec_dev_unregister(void);
40
41int vdec_source_changed(int format, int width, int height, int fps);
42int vdec2_source_changed(int format, int width, int height, int fps);
43int hevc_source_changed(int format, int width, int height, int fps);
44struct device *get_vdec_device(void);
45int vdec_module_init(void);
46void vdec_module_exit(void);
47
48#define MAX_INSTANCE_MUN 9
49
50#define VDEC_DEBUG_SUPPORT
51
52#define DEC_FLAG_HEVC_WORKAROUND 0x01
53
54#define VDEC_FIFO_ALIGN 8
55
56enum vdec_type_e {
57 VDEC_1 = 0,
58 VDEC_HCODEC,
59 VDEC_2,
60 VDEC_HEVC,
61 VDEC_HEVCB,
62 VDEC_MAX
63};
64
65#define CORE_MASK_VDEC_1 (1 << VDEC_1)
66#define CORE_MASK_HCODEC (1 << VDEC_HCODEC)
67#define CORE_MASK_VDEC_2 (1 << VDEC_2)
68#define CORE_MASK_HEVC (1 << VDEC_HEVC)
69#define CORE_MASK_HEVC_FRONT (1 << VDEC_HEVC)
70#define CORE_MASK_HEVC_BACK (1 << VDEC_HEVCB)
71#define CORE_MASK_COMBINE (1UL << 31)
72
73extern void vdec2_power_mode(int level);
74extern void vdec_poweron(enum vdec_type_e core);
75extern void vdec_poweroff(enum vdec_type_e core);
76extern bool vdec_on(enum vdec_type_e core);
77extern void vdec_power_reset(void);
78
79/*irq num as same as .dts*/
80
81/*
82 * interrupts = <0 3 1
83 * 0 23 1
84 * 0 32 1
85 * 0 43 1
86 * 0 44 1
87 * 0 45 1>;
88 * interrupt-names = "vsync",
89 * "demux",
90 * "parser",
91 * "mailbox_0",
92 * "mailbox_1",
93 * "mailbox_2";
94 */
95enum vdec_irq_num {
96 VSYNC_IRQ = 0,
97 DEMUX_IRQ,
98 PARSER_IRQ,
99 VDEC_IRQ_0,
100 VDEC_IRQ_1,
101 VDEC_IRQ_2,
102 VDEC_IRQ_HEVC_BACK,
103 VDEC_IRQ_MAX,
104};
105
106enum vdec_fr_hint_state {
107 VDEC_NO_NEED_HINT = 0,
108 VDEC_NEED_HINT,
109 VDEC_HINTED,
110};
111extern s32 vdec_request_threaded_irq(enum vdec_irq_num num,
112 irq_handler_t handler,
113 irq_handler_t thread_fn,
114 unsigned long irqflags,
115 const char *devname, void *dev);
116extern s32 vdec_request_irq(enum vdec_irq_num num, irq_handler_t handler,
117 const char *devname, void *dev);
118extern void vdec_free_irq(enum vdec_irq_num num, void *dev);
119
120extern void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size);
121unsigned int get_vdec_clk_config_settings(void);
122void update_vdec_clk_config_settings(unsigned int config);
123//unsigned int get_mmu_mode(void);//DEBUG_TMP
124extern void vdec_fill_frame_info(struct vframe_qos_s *vframe_qos, int debug);
125
126struct vdec_s;
127enum vformat_t;
128
129/* stream based with single instance decoder driver */
130#define VDEC_TYPE_SINGLE 0
131
132/* stream based with multi-instance decoder with HW resouce sharing */
133#define VDEC_TYPE_STREAM_PARSER 1
134
135/* frame based with multi-instance decoder, input block list based */
136#define VDEC_TYPE_FRAME_BLOCK 2
137
138/* frame based with multi-instance decoder, single circular input block */
139#define VDEC_TYPE_FRAME_CIRCULAR 3
140
141/* decoder status: uninitialized */
142#define VDEC_STATUS_UNINITIALIZED 0
143
144/* decoder status: before the decoder can start consuming data */
145#define VDEC_STATUS_DISCONNECTED 1
146
147/* decoder status: decoder should become disconnected once it's not active */
148#define VDEC_STATUS_CONNECTED 2
149
150/* decoder status: decoder owns HW resource and is running */
151#define VDEC_STATUS_ACTIVE 3
152
153#define VDEC_PROVIDER_NAME_SIZE 16
154#define VDEC_RECEIVER_NAME_SIZE 16
155#define VDEC_MAP_NAME_SIZE 90
156
157#define VDEC_FLAG_OTHER_INPUT_CONTEXT 0x0
158#define VDEC_FLAG_SELF_INPUT_CONTEXT 0x01
159
160#define VDEC_NEED_MORE_DATA_RUN 0x01
161#define VDEC_NEED_MORE_DATA_DIRTY 0x02
162#define VDEC_NEED_MORE_DATA 0x04
163
164struct vdec_s {
165 u32 magic;
166 struct list_head list;
167 unsigned long core_mask;
168 unsigned long active_mask;
169 unsigned long sched_mask;
170 int id;
171
172 struct vdec_s *master;
173 struct vdec_s *slave;
174 struct stream_port_s *port;
175 int status;
176 int next_status;
177 int type;
178 int port_flag;
179 int format;
180 u32 pts;
181 u64 pts64;
182 bool pts_valid;
183 u64 timestamp;
184 bool timestamp_valid;
185 int flag;
186 int sched;
187 int need_more_data;
188 u32 canvas_mode;
189
190 struct completion inactive_done;
191
192 /* config (temp) */
193 unsigned long mem_start;
194 unsigned long mem_end;
195
196 void *mm_blk_handle;
197
198 struct device *cma_dev;
199 struct platform_device *dev;
200 struct dec_sysinfo sys_info_store;
201 struct dec_sysinfo *sys_info;
202
203 /* input */
204 struct vdec_input_s input;
205
206 /*frame check*/
207 struct pic_check_mgr_t vfc;
208
209 /* mc cache */
210 u32 mc[4096 * 4];
211 bool mc_loaded;
212 u32 mc_type;
213 /* frame provider/receiver interface */
214 char vf_provider_name[VDEC_PROVIDER_NAME_SIZE];
215 struct vframe_provider_s vframe_provider;
216 char *vf_receiver_name;
217 char vfm_map_id[VDEC_MAP_NAME_SIZE];
218 char vfm_map_chain[VDEC_MAP_NAME_SIZE];
219 int vf_receiver_inst;
220 enum FRAME_BASE_VIDEO_PATH frame_base_video_path;
221 enum vdec_fr_hint_state fr_hint_state;
222 bool use_vfm_path;
223 char config[PAGE_SIZE];
224 int config_len;
225 bool is_reset;
226 bool dolby_meta_with_el;
227
228 /* canvas */
229 int (*get_canvas)(unsigned int index, unsigned int base);
230 int (*get_canvas_ex)(int type, int id);
231 void (*free_canvas_ex)(int index, int id);
232
233 int (*dec_status)(struct vdec_s *vdec, struct vdec_info *vstatus);
234 int (*set_trickmode)(struct vdec_s *vdec, unsigned long trickmode);
235 int (*set_isreset)(struct vdec_s *vdec, int isreset);
236 void (*vdec_fps_detec)(int id);
237
238 unsigned long (*run_ready)(struct vdec_s *vdec, unsigned long mask);
239 void (*run)(struct vdec_s *vdec, unsigned long mask,
240 void (*callback)(struct vdec_s *, void *), void *);
241 void (*reset)(struct vdec_s *vdec);
242 void (*dump_state)(struct vdec_s *vdec);
243 irqreturn_t (*irq_handler)(struct vdec_s *vdec, int irq);
244 irqreturn_t (*threaded_irq_handler)(struct vdec_s *vdec, int irq);
245
246 int (*user_data_read)(struct vdec_s *vdec,
247 struct userdata_param_t *puserdata_para);
248 void (*reset_userdata_fifo)(struct vdec_s *vdec, int bInit);
249 void (*wakeup_userdata_poll)(struct vdec_s *vdec);
250 /* private */
251 void *private; /* decoder per instance specific data */
252#ifdef VDEC_DEBUG_SUPPORT
253 u64 profile_start_clk[VDEC_MAX];
254 u64 total_clk[VDEC_MAX];
255 u32 check_count[VDEC_MAX];
256 u32 not_run_ready_count[VDEC_MAX];
257 u32 input_underrun_count[VDEC_MAX];
258 u32 run_count[VDEC_MAX];
259 u64 run_clk[VDEC_MAX];
260 u64 start_run_clk[VDEC_MAX];
261#endif
262 atomic_t inirq_thread_flag;
263 atomic_t inirq_flag;
264 int parallel_dec;
265 volatile u64 isr_ns;
266 volatile u64 tfn_ns;
267};
268
269/* common decoder vframe provider name to use default vfm path */
270#define VFM_DEC_PROVIDER_NAME "decoder"
271#define VFM_DEC_DVBL_PROVIDER_NAME "dvbldec"
272#define VFM_DEC_DVEL_PROVIDER_NAME "dveldec"
273
274#define hw_to_vdec(hw) ((struct vdec_s *) \
275 (platform_get_drvdata(hw->platform_dev)))
276
277#define canvas_y(canvas) ((canvas) & 0xff)
278#define canvas_u(canvas) (((canvas) >> 8) & 0xff)
279#define canvas_v(canvas) (((canvas) >> 16) & 0xff)
280#define canvas_y2(canvas) (((canvas) >> 16) & 0xff)
281#define canvas_u2(canvas) (((canvas) >> 24) & 0xff)
282
283#define vdec_frame_based(vdec) \
284 (((vdec)->type == VDEC_TYPE_FRAME_BLOCK) || \
285 ((vdec)->type == VDEC_TYPE_FRAME_CIRCULAR))
286#define vdec_stream_based(vdec) \
287 (((vdec)->type == VDEC_TYPE_STREAM_PARSER) || \
288 ((vdec)->type == VDEC_TYPE_SINGLE))
289#define vdec_single(vdec) \
290 ((vdec)->type == VDEC_TYPE_SINGLE)
291#define vdec_dual(vdec) \
292 (((vdec)->port->type & PORT_TYPE_DUALDEC) ||\
293 (vdec_get_debug_flags() & 0x100))
294#define vdec_secure(vdec) \
295 (((vdec)->port_flag & PORT_FLAG_DRM))
296
297/* construct vdec strcture */
298extern struct vdec_s *vdec_create(struct stream_port_s *port,
299 struct vdec_s *master);
300
301/* set video format */
302extern int vdec_set_format(struct vdec_s *vdec, int format);
303
304/* set PTS */
305extern int vdec_set_pts(struct vdec_s *vdec, u32 pts);
306
307extern int vdec_set_pts64(struct vdec_s *vdec, u64 pts64);
308
309/* set vfm map when use frame base decoder */
310extern int vdec_set_video_path(struct vdec_s *vdec, int video_path);
311
312/* set receive id when receive is ionvideo or amlvideo */
313extern int vdec_set_receive_id(struct vdec_s *vdec, int receive_id);
314
315/* add frame data to input chain */
316extern int vdec_write_vframe(struct vdec_s *vdec, const char *buf,
317 size_t count);
318
319/* mark the vframe_chunk as consumed */
320extern void vdec_vframe_dirty(struct vdec_s *vdec,
321 struct vframe_chunk_s *chunk);
322
323/* prepare decoder input */
324extern int vdec_prepare_input(struct vdec_s *vdec, struct vframe_chunk_s **p);
325
326/* clean decoder input */
327extern void vdec_clean_input(struct vdec_s *vdec);
328
329/* sync decoder input */
330extern int vdec_sync_input(struct vdec_s *vdec);
331
332/* enable decoder input */
333extern void vdec_enable_input(struct vdec_s *vdec);
334
335/* set decoder input prepare level */
336extern void vdec_set_prepare_level(struct vdec_s *vdec, int level);
337
338/* set vdec input */
339extern int vdec_set_input_buffer(struct vdec_s *vdec, u32 start, u32 size);
340
341/* check if decoder can get more input */
342extern bool vdec_has_more_input(struct vdec_s *vdec);
343
344/* allocate input chain
345 * register vdec_device
346 * create output, vfm or create ionvideo output
347 * insert vdec to vdec_manager for scheduling
348 */
349extern int vdec_connect(struct vdec_s *vdec);
350
351/* remove vdec from vdec_manager scheduling
352 * release input chain
353 * disconnect video output from ionvideo
354 */
355extern int vdec_disconnect(struct vdec_s *vdec);
356
357/* release vdec structure */
358extern int vdec_destroy(struct vdec_s *vdec);
359
360/* reset vdec */
361extern int vdec_reset(struct vdec_s *vdec);
362
363extern void vdec_set_status(struct vdec_s *vdec, int status);
364
365extern void vdec_set_next_status(struct vdec_s *vdec, int status);
366
367extern int vdec_set_decinfo(struct vdec_s *vdec, struct dec_sysinfo *p);
368
369extern int vdec_init(struct vdec_s *vdec, int is_4k);
370
371extern void vdec_release(struct vdec_s *vdec);
372
373extern int vdec_status(struct vdec_s *vdec, struct vdec_info *vstatus);
374
375extern int vdec_set_trickmode(struct vdec_s *vdec, unsigned long trickmode);
376
377extern int vdec_set_isreset(struct vdec_s *vdec, int isreset);
378
379extern int vdec_set_dv_metawithel(struct vdec_s *vdec, int isdvmetawithel);
380
381extern void vdec_set_no_powerdown(int flag);
382
383extern int vdec_is_support_4k(void);
384extern void vdec_set_flag(struct vdec_s *vdec, u32 flag);
385
386extern void vdec_set_eos(struct vdec_s *vdec, bool eos);
387
388extern void vdec_set_next_sched(struct vdec_s *vdec, struct vdec_s *next_vdec);
389
390extern const char *vdec_status_str(struct vdec_s *vdec);
391
392extern const char *vdec_type_str(struct vdec_s *vdec);
393
394extern const char *vdec_device_name_str(struct vdec_s *vdec);
395
396extern void vdec_schedule_work(struct work_struct *work);
397
398extern void vdec_count_info(struct vdec_info *vs, unsigned int err,
399 unsigned int offset);
400
401extern bool vdec_need_more_data(struct vdec_s *vdec);
402
403extern void vdec_reset_core(struct vdec_s *vdec);
404
405extern void hevc_reset_core(struct vdec_s *vdec);
406
407extern void vdec_set_suspend_clk(int mode, int hevc);
408
409extern unsigned long vdec_ready_to_run(struct vdec_s *vdec, unsigned long mask);
410
411extern void vdec_prepare_run(struct vdec_s *vdec, unsigned long mask);
412
413extern void vdec_core_request(struct vdec_s *vdec, unsigned long mask);
414
415extern int vdec_core_release(struct vdec_s *vdec, unsigned long mask);
416
417extern bool vdec_core_with_input(unsigned long mask);
418
419extern void vdec_core_finish_run(struct vdec_s *vdec, unsigned long mask);
420
421#ifdef VDEC_DEBUG_SUPPORT
422extern void vdec_set_step_mode(void);
423#endif
424extern void hevc_mmu_dma_check(struct vdec_s *vdec);
425int vdec_read_user_data(struct vdec_s *vdec,
426 struct userdata_param_t *p_userdata_param);
427
428int vdec_wakeup_userdata_poll(struct vdec_s *vdec);
429
430void vdec_reset_userdata_fifo(struct vdec_s *vdec, int bInit);
431
432struct vdec_s *vdec_get_vdec_by_id(int vdec_id);
433
434#ifdef VDEC_DEBUG_SUPPORT
435extern void vdec_set_step_mode(void);
436#endif
437int vdec_get_debug_flags(void);
438
439unsigned char is_mult_inc(unsigned int);
440
441int vdec_get_status(struct vdec_s *vdec);
442
443void vdec_set_timestamp(struct vdec_s *vdec, u64 timestamp);
444
445extern struct vframe_qos_s *vdec_get_qos_info(void);
446
447int vdec_get_frame_num(struct vdec_s *vdec);
448
449#endif /* VDEC_H */
450