blob: e1a42155f84596b4738787ebdd6ccbcd3373062c [file] [log] [blame]
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#ifndef _MSM_VIDC_INTERNAL_H_
15#define _MSM_VIDC_INTERNAL_H_
16
17#include <linux/atomic.h>
18#include <linux/list.h>
19#include <linux/time.h>
20#include <linux/types.h>
21#include <linux/completion.h>
22#include <linux/wait.h>
23#include <linux/workqueue.h>
24#include <linux/msm-bus.h>
25#include <linux/msm-bus-board.h>
26#include <linux/kref.h>
27#include <media/v4l2-dev.h>
28#include <media/v4l2-device.h>
29#include <media/v4l2-ioctl.h>
30#include <media/v4l2-event.h>
31#include <media/v4l2-ctrls.h>
32#include <media/videobuf2-core.h>
33#include <media/videobuf2-v4l2.h>
34#include <media/msm_vidc.h>
35#include <media/msm_media_info.h>
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080036#include "vidc_hfi_api.h"
37
38#define MSM_VIDC_DRV_NAME "msm_vidc_driver"
39#define MSM_VIDC_VERSION KERNEL_VERSION(0, 0, 1)
40#define MAX_DEBUGFS_NAME 50
41#define DEFAULT_TIMEOUT 3
42#define DEFAULT_HEIGHT 1088
43#define DEFAULT_WIDTH 1920
44#define MIN_SUPPORTED_WIDTH 32
45#define MIN_SUPPORTED_HEIGHT 32
46#define DEFAULT_FPS 15
Praneeth Paladugudefea4e2017-02-09 23:44:08 -080047#define MIN_NUM_OUTPUT_BUFFERS 1
48#define MIN_NUM_CAPTURE_BUFFERS 1
49#define MAX_NUM_OUTPUT_BUFFERS VIDEO_MAX_FRAME // same as VB2_MAX_FRAME
50#define MAX_NUM_CAPTURE_BUFFERS VIDEO_MAX_FRAME // same as VB2_MAX_FRAME
51
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080052
53/* Maintains the number of FTB's between each FBD over a window */
Praneeth Paladugue5fd0872017-04-19 11:24:28 -070054#define DCVS_FTB_WINDOW 16
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080055
56#define V4L2_EVENT_VIDC_BASE 10
57
58#define SYS_MSG_START HAL_SYS_INIT_DONE
59#define SYS_MSG_END HAL_SYS_ERROR
60#define SESSION_MSG_START HAL_SESSION_EVENT_CHANGE
61#define SESSION_MSG_END HAL_SESSION_ERROR
62#define SYS_MSG_INDEX(__msg) (__msg - SYS_MSG_START)
63#define SESSION_MSG_INDEX(__msg) (__msg - SESSION_MSG_START)
64
65
66#define MAX_NAME_LENGTH 64
67
68#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
69
70#define NUM_MBS_PER_SEC(__height, __width, __fps) \
71 (NUM_MBS_PER_FRAME(__height, __width) * __fps)
72
73#define NUM_MBS_PER_FRAME(__height, __width) \
74 ((ALIGN(__height, 16) / 16) * (ALIGN(__width, 16) / 16))
75
76enum vidc_ports {
77 OUTPUT_PORT,
78 CAPTURE_PORT,
79 MAX_PORT_NUM
80};
81
82enum vidc_core_state {
83 VIDC_CORE_UNINIT = 0,
84 VIDC_CORE_INIT,
85 VIDC_CORE_INIT_DONE,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080086};
87
88/*
89 * Do not change the enum values unless
90 * you know what you are doing
91 */
92enum instance_state {
93 MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
94 MSM_VIDC_CORE_INIT,
95 MSM_VIDC_CORE_INIT_DONE,
96 MSM_VIDC_OPEN,
97 MSM_VIDC_OPEN_DONE,
98 MSM_VIDC_LOAD_RESOURCES,
99 MSM_VIDC_LOAD_RESOURCES_DONE,
100 MSM_VIDC_START,
101 MSM_VIDC_START_DONE,
102 MSM_VIDC_STOP,
103 MSM_VIDC_STOP_DONE,
104 MSM_VIDC_RELEASE_RESOURCES,
105 MSM_VIDC_RELEASE_RESOURCES_DONE,
106 MSM_VIDC_CLOSE,
107 MSM_VIDC_CLOSE_DONE,
108 MSM_VIDC_CORE_UNINIT,
109 MSM_VIDC_CORE_INVALID
110};
111
112struct buf_info {
113 struct list_head list;
114 struct vb2_buffer *buf;
115};
116
117struct msm_vidc_list {
118 struct list_head list;
119 struct mutex lock;
120};
121
122static inline void INIT_MSM_VIDC_LIST(struct msm_vidc_list *mlist)
123{
124 mutex_init(&mlist->lock);
125 INIT_LIST_HEAD(&mlist->list);
126}
127
128static inline void DEINIT_MSM_VIDC_LIST(struct msm_vidc_list *mlist)
129{
130 mutex_destroy(&mlist->lock);
131}
132
133enum buffer_owner {
134 DRIVER,
135 FIRMWARE,
136 CLIENT,
137 MAX_OWNER
138};
139
Praneeth Paladugub71968b2015-08-19 20:47:57 -0700140struct vidc_freq_data {
141 struct list_head list;
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700142 u32 device_addr;
Praneeth Paladugub71968b2015-08-19 20:47:57 -0700143 unsigned long freq;
144};
145
Praneeth Paladugu319e7922017-03-16 11:09:06 -0700146struct recon_buf {
147 struct list_head list;
148 u32 buffer_index;
149 u32 CR;
150 u32 CF;
151};
152
Praneeth Paladuguf9ef8172017-07-18 22:55:59 -0700153struct eos_buf {
154 struct list_head list;
155 struct msm_smem smem;
156};
157
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800158struct internal_buf {
159 struct list_head list;
160 enum hal_buffer buffer_type;
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700161 struct msm_smem smem;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800162 enum buffer_owner buffer_ownership;
163};
164
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700165struct msm_vidc_common_data {
166 char key[128];
167 int value;
168};
169
170struct msm_vidc_codec_data {
171 u32 fourcc;
172 enum session_type session_type;
173 int vpp_cycles;
174 int vsp_cycles;
175 int low_power_cycles;
176};
177
178struct msm_vidc_platform_data {
179 struct msm_vidc_common_data *common_data;
180 unsigned int common_data_length;
181 struct msm_vidc_codec_data *codec_data;
182 unsigned int codec_data_length;
183};
184
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800185struct msm_vidc_format {
186 char name[MAX_NAME_LENGTH];
187 u8 description[32];
188 u32 fourcc;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800189 int type;
190 u32 (*get_frame_size)(int plane, u32 height, u32 width);
Vaibhav Deshu Venkatesh8c9b6db2017-02-08 11:22:36 -0800191 bool defer_outputs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800192};
193
194struct msm_vidc_drv {
195 struct mutex lock;
196 struct list_head cores;
197 int num_cores;
198 struct dentry *debugfs_root;
199 int thermal_level;
200 u32 platform_version;
201};
202
203struct msm_video_device {
204 int type;
205 struct video_device vdev;
206};
207
Praneeth Paladugu520e9b22017-05-31 13:25:18 -0700208struct session_crop {
209 u32 left;
210 u32 top;
211 u32 width;
212 u32 height;
213};
214
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800215struct session_prop {
216 u32 width[MAX_PORT_NUM];
217 u32 height[MAX_PORT_NUM];
Praneeth Paladugu520e9b22017-05-31 13:25:18 -0700218 struct session_crop crop_info;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800219 u32 fps;
220 u32 bitrate;
221};
222
223struct buf_queue {
224 struct vb2_queue vb2_bufq;
225 struct mutex lock;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -0800226 unsigned int plane_sizes[VB2_MAX_PLANES];
227 int num_planes;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800228};
229
230enum profiling_points {
231 SYS_INIT = 0,
232 SESSION_INIT,
233 LOAD_RESOURCES,
234 FRAME_PROCESSING,
235 FW_IDLE,
236 MAX_PROFILING_POINTS,
237};
238
239struct buf_count {
240 int etb;
241 int ftb;
242 int fbd;
243 int ebd;
244};
245
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700246struct clock_data {
Praneeth Paladugu75cf18e2016-12-08 16:12:11 -0800247 int buffer_counter;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800248 int load;
249 int load_low;
Praneeth Paladugu04e77722017-06-21 11:38:31 -0700250 int load_norm;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800251 int load_high;
252 int min_threshold;
253 int max_threshold;
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -0700254 unsigned int extra_capture_buffer_count;
255 unsigned int extra_output_buffer_count;
Praneeth Paladugu75cf18e2016-12-08 16:12:11 -0800256 enum hal_buffer buffer_type;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700257 bool dcvs_mode;
258 unsigned long bitrate;
259 unsigned long min_freq;
260 unsigned long curr_freq;
261 u32 operating_rate;
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700262 struct msm_vidc_codec_data *entry;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700263 u32 core_id;
Praneeth Paladugu319e7922017-03-16 11:09:06 -0700264 u32 dpb_fourcc;
265 u32 opb_fourcc;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700266 enum hal_work_mode work_mode;
267 bool low_latency_mode;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800268};
269
270struct profile_data {
271 int start;
272 int stop;
273 int cumulative;
274 char name[64];
275 int sampling;
276 int average;
277};
278
279struct msm_vidc_debug {
280 struct profile_data pdata[MAX_PROFILING_POINTS];
281 int profile;
282 int samples;
283};
284
285enum msm_vidc_modes {
286 VIDC_SECURE = BIT(0),
287 VIDC_TURBO = BIT(1),
288 VIDC_THUMBNAIL = BIT(2),
289 VIDC_LOW_POWER = BIT(3),
290 VIDC_REALTIME = BIT(4),
291};
292
293struct msm_vidc_core {
294 struct list_head list;
295 struct mutex lock;
296 int id;
297 struct hfi_device *device;
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700298 struct msm_vidc_platform_data *platform_data;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800299 struct msm_video_device vdev[MSM_VIDC_MAX_DEVICES];
300 struct v4l2_device v4l2_dev;
301 struct list_head instances;
302 struct dentry *debugfs_root;
303 enum vidc_core_state state;
304 struct completion completions[SYS_MSG_END - SYS_MSG_START + 1];
305 enum msm_vidc_hfi_type hfi_type;
306 struct msm_vidc_platform_resources resources;
307 u32 enc_codec_supported;
308 u32 dec_codec_supported;
309 u32 codec_count;
310 struct msm_vidc_capability *capabilities;
311 struct delayed_work fw_unload_work;
312 bool smmu_fault_handled;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700313 unsigned long min_freq;
314 unsigned long curr_freq;
Praneeth Paladugu319e7922017-03-16 11:09:06 -0700315 struct vidc_bus_vote_data *vote_data;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800316};
317
318struct msm_vidc_inst {
319 struct list_head list;
320 struct mutex sync_lock, lock;
321 struct msm_vidc_core *core;
322 enum session_type session_type;
323 void *session;
324 struct session_prop prop;
325 enum instance_state state;
326 struct msm_vidc_format fmts[MAX_PORT_NUM];
327 struct buf_queue bufq[MAX_PORT_NUM];
Praneeth Paladugub71968b2015-08-19 20:47:57 -0700328 struct msm_vidc_list freqs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800329 struct msm_vidc_list scratchbufs;
330 struct msm_vidc_list persistbufs;
331 struct msm_vidc_list pending_getpropq;
332 struct msm_vidc_list outputbufs;
Praneeth Paladugu319e7922017-03-16 11:09:06 -0700333 struct msm_vidc_list reconbufs;
Praneeth Paladuguf9ef8172017-07-18 22:55:59 -0700334 struct msm_vidc_list eosbufs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800335 struct msm_vidc_list registeredbufs;
336 struct buffer_requirements buff_req;
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700337 struct smem_client *mem_client;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800338 struct v4l2_ctrl_handler ctrl_handler;
339 struct completion completions[SESSION_MSG_END - SESSION_MSG_START + 1];
340 struct v4l2_ctrl **cluster;
341 struct v4l2_fh event_handler;
342 struct msm_smem *extradata_handle;
343 bool in_reconfig;
344 u32 reconfig_width;
345 u32 reconfig_height;
346 struct dentry *debugfs_root;
347 void *priv;
348 struct msm_vidc_debug debug;
349 struct buf_count count;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700350 struct clock_data clk_data;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800351 enum msm_vidc_modes flags;
352 struct msm_vidc_capability capability;
353 u32 buffer_size_limit;
354 enum buffer_mode_type buffer_mode_set[MAX_PORT_NUM];
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800355 struct v4l2_ctrl **ctrls;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800356 enum msm_vidc_pixel_depth bit_depth;
357 struct kref kref;
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700358 bool in_flush;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800359 u32 pic_struct;
360 u32 colour_space;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -0800361 u32 profile;
362 u32 level;
363 u32 entropy_mode;
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700364 struct msm_vidc_codec_data *codec_data;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800365};
366
367extern struct msm_vidc_drv *vidc_driver;
368
369struct msm_vidc_ctrl_cluster {
370 struct v4l2_ctrl **cluster;
371 struct list_head list;
372};
373
374struct msm_vidc_ctrl {
375 u32 id;
376 char name[MAX_NAME_LENGTH];
377 enum v4l2_ctrl_type type;
378 s32 minimum;
379 s32 maximum;
380 s32 default_value;
381 u32 step;
382 u32 menu_skip_mask;
383 u32 flags;
384 const char * const *qmenu;
385};
386
387void handle_cmd_response(enum hal_command_response cmd, void *data);
388int msm_vidc_trigger_ssr(struct msm_vidc_core *core,
389 enum hal_ssr_trigger_type type);
390int msm_vidc_check_session_supported(struct msm_vidc_inst *inst);
391int msm_vidc_check_scaling_supported(struct msm_vidc_inst *inst);
392void msm_vidc_queue_v4l2_event(struct msm_vidc_inst *inst, int event_type);
393
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700394struct msm_vidc_buffer {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800395 struct list_head list;
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700396 struct msm_smem smem[VIDEO_MAX_PLANES];
397 struct vb2_v4l2_buffer vvb;
398 bool deferred;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800399};
400
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800401void msm_comm_handle_thermal_event(void);
402void *msm_smem_new_client(enum smem_type mtype,
403 void *platform_resources, enum session_type stype);
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700404int msm_smem_alloc(struct smem_client *client,
405 size_t size, u32 align, u32 flags, enum hal_buffer buffer_type,
406 int map_kernel, struct msm_smem *smem);
407int msm_smem_free(void *clt, struct msm_smem *mem);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800408void msm_smem_delete_client(void *clt);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800409struct context_bank_info *msm_smem_get_context_bank(void *clt,
410 bool is_secure, enum hal_buffer buffer_type);
Maheshwar Ajjac6407c02017-06-09 18:53:20 -0700411int msm_smem_map_dma_buf(struct msm_vidc_inst *inst, struct msm_smem *smem);
412int msm_smem_unmap_dma_buf(struct msm_vidc_inst *inst, struct msm_smem *smem);
413void *msm_smem_get_dma_buf(int fd);
414void msm_smem_put_dma_buf(void *dma_buf);
415void *msm_smem_get_handle(struct smem_client *client, void *dma_buf);
416void msm_smem_put_handle(struct smem_client *client, void *handle);
417int msm_smem_cache_operations(struct smem_client *client,
418 void *handle, unsigned long offset, unsigned long size,
419 enum smem_cache_ops cache_op);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800420void msm_vidc_fw_unload_handler(struct work_struct *work);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800421/*
422 * XXX: normally should be in msm_vidc.h, but that's meant for public APIs,
423 * whereas this is private
424 */
425int msm_vidc_destroy(struct msm_vidc_inst *inst);
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700426void *vidc_get_drv_data(struct device *dev);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800427#endif