• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * drivers/amlogic/media/stream_input/parser/streambuf.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 STREAMBUF_H
19 #define STREAMBUF_H
20 #include <linux/amlogic/media/utils/amports_config.h>
21 
22 #define BUF_FLAG_ALLOC          0x01
23 #define BUF_FLAG_IN_USE         0x02
24 #define BUF_FLAG_PARSER         0x04
25 #define BUF_FLAG_FIRST_TSTAMP   0x08
26 #define BUF_FLAG_IOMEM          0x10
27 
28 #define BUF_TYPE_VIDEO      0
29 #define BUF_TYPE_AUDIO      1
30 #define BUF_TYPE_SUBTITLE   2
31 #define BUF_TYPE_USERDATA   3
32 #define BUF_TYPE_HEVC       4
33 #define BUF_MAX_NUM         5
34 
35 #define INVALID_PTS 0xffffffff
36 
37 #define FETCHBUF_SIZE   (64*1024)
38 #define USER_DATA_SIZE  (8*1024)
39 
40 struct vdec_s;
41 struct stream_buf_s;
42 
43 struct parser_args {
44 	u32 vid;
45 	u32 aid;
46 	u32 sid;
47 	u32 pcrid;
48 };
49 
50 struct stream_buf_ops {
51 	int (*init) (struct stream_buf_s *, struct vdec_s *);
52 	void (*release) (struct stream_buf_s *);
53 	int (*write) (struct stream_buf_s *, const u8 *, u32);
54 	u32 (*get_wp) (struct stream_buf_s *);
55 	void (*set_wp) (struct stream_buf_s *, u32);
56 	u32 (*get_rp) (struct stream_buf_s *);
57 	void (*set_rp) (struct stream_buf_s *, u32);
58 };
59 
60 struct stream_buf_s {
61 	int id;
62 	u8 name[16];
63 	s32 flag;
64 	u32 type;
65 	unsigned long buf_start;
66 	struct page *buf_pages;
67 	int buf_page_num;
68 	u32 buf_size;
69 	u32 default_buf_size;
70 	u32 canusebuf_size;
71 	u32 first_tstamp;
72 	const ulong reg_base;
73 	wait_queue_head_t wq;
74 	struct timer_list timer;
75 	u32 wcnt;
76 	u32 buf_wp;
77 	u32 buf_rp;
78 	u32 max_buffer_delay_ms;
79 	u64 last_write_jiffies64;
80 	void *write_thread;
81 	int for_4k;
82 	bool is_secure;
83 	bool is_multi_inst;
84 	bool no_parser;
85 	bool is_phybuf;
86 	bool is_hevc;
87 	u32 drm_flag;
88 	ulong ext_buf_addr;
89 	atomic_t payload;
90 	struct parser_args pars;
91 	struct stream_buf_ops *ops;
92 } /*stream_buf_t */;
93 
94 struct stream_port_s {
95 	/* driver info */
96 	const char *name;
97 	struct device *class_dev;
98 	const struct file_operations *fops;
99 
100 	/* ports control */
101 	s32 type;
102 	s32 flag;
103 	s32 pcr_inited;
104 
105 	/* decoder info */
106 	s32 vformat;
107 	s32 aformat;
108 	s32 achanl;
109 	s32 asamprate;
110 	s32 adatawidth;
111 
112 	/* parser info */
113 	u32 vid;
114 	u32 aid;
115 	u32 sid;
116 	u32 pcrid;
117 	bool is_4k;
118 } /*stream_port_t */;
119 enum drm_level_e {
120 	DRM_LEVEL1 = 1,
121 	DRM_LEVEL2 = 2,
122 	DRM_LEVEL3 = 3,
123 	DRM_NONE = 4,
124 };
125 
126 struct drm_info {
127 	enum drm_level_e drm_level;
128 	u32 drm_flag;
129 	u32 drm_hasesdata;
130 	u32 drm_priv;
131 	u32 drm_pktsize;
132 	u32 drm_pktpts;
133 	u32 drm_phy;
134 	u32 drm_vir;
135 	u32 drm_remap;
136 	u32 data_offset;
137 	u32 handle;
138 	u32 extpad[7];
139 } /*drminfo_t */;
140 
141 #define TYPE_DRMINFO_V2  0x100
142 #define TYPE_DRMINFO   0x80
143 #define TYPE_PATTERN   0x40
144 
145 struct vdec_s;
146 
147 extern void *fetchbuf;
148 
149 extern u32 stbuf_level(struct stream_buf_s *buf);
150 extern u32 stbuf_rp(struct stream_buf_s *buf);
151 extern u32 stbuf_space(struct stream_buf_s *buf);
152 extern u32 stbuf_size(struct stream_buf_s *buf);
153 extern u32 stbuf_canusesize(struct stream_buf_s *buf);
154 extern s32 stbuf_init(struct stream_buf_s *buf, struct vdec_s *vdec);
155 extern s32 stbuf_wait_space(struct stream_buf_s *stream_buf, size_t count);
156 extern void stbuf_release(struct stream_buf_s *buf);
157 extern int stbuf_change_size(struct stream_buf_s *buf, int size,
158 				bool is_secure);
159 extern int stbuf_fetch_init(void);
160 extern void stbuf_fetch_release(void);
161 extern u32 stbuf_sub_rp_get(void);
162 extern void stbuf_sub_rp_set(unsigned int sub_rp);
163 extern u32 stbuf_sub_wp_get(void);
164 extern u32 stbuf_sub_start_get(void);
165 extern u32 stbuf_userdata_start_get(void);
166 extern struct stream_buf_s *get_stream_buffer(int id);
167 
168 extern void stbuf_vdec2_init(struct stream_buf_s *buf);
169 
170 u32 parser_get_wp(struct stream_buf_s *vb);
171 void parser_set_wp(struct stream_buf_s *vb, u32 val);
172 u32 parser_get_rp(struct stream_buf_s *vb);
173 void parser_set_rp(struct stream_buf_s *vb, u32 val);
174 
175 #endif /* STREAMBUF_H */
176