GNU Linux-libre 4.19.295-gnu1
[releases.git] / drivers / media / platform / qcom / venus / hfi.h
1 /*
2  * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
3  * Copyright (C) 2017 Linaro Ltd.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 and
7  * only version 2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  */
15 #ifndef __HFI_H__
16 #define __HFI_H__
17
18 #include <linux/interrupt.h>
19
20 #include "hfi_helper.h"
21
22 #define VIDC_SESSION_TYPE_VPE                   0
23 #define VIDC_SESSION_TYPE_ENC                   1
24 #define VIDC_SESSION_TYPE_DEC                   2
25
26 #define VIDC_RESOURCE_NONE                      0
27 #define VIDC_RESOURCE_OCMEM                     1
28 #define VIDC_RESOURCE_VMEM                      2
29
30 struct hfi_buffer_desc {
31         u32 buffer_type;
32         u32 buffer_size;
33         u32 num_buffers;
34         u32 device_addr;
35         u32 extradata_addr;
36         u32 extradata_size;
37         u32 response_required;
38 };
39
40 struct hfi_frame_data {
41         u32 buffer_type;
42         u32 device_addr;
43         u32 extradata_addr;
44         u64 timestamp;
45         u32 flags;
46         u32 offset;
47         u32 alloc_len;
48         u32 filled_len;
49         u32 mark_target;
50         u32 mark_data;
51         u32 clnt_data;
52         u32 extradata_size;
53 };
54
55 union hfi_get_property {
56         struct hfi_profile_level profile_level;
57         struct hfi_buffer_requirements bufreq[HFI_BUFFER_TYPE_MAX];
58 };
59
60 /* HFI events */
61 #define EVT_SYS_EVENT_CHANGE                    1
62 #define EVT_SYS_WATCHDOG_TIMEOUT                2
63 #define EVT_SYS_ERROR                           3
64 #define EVT_SESSION_ERROR                       4
65
66 /* HFI event callback structure */
67 struct hfi_event_data {
68         u32 error;
69         u32 height;
70         u32 width;
71         u32 event_type;
72         u32 packet_buffer;
73         u32 extradata_buffer;
74         u32 tag;
75         u32 profile;
76         u32 level;
77         /* the following properties start appear from v4 onwards */
78         u32 bit_depth;
79         u32 pic_struct;
80         u32 colour_space;
81         u32 entropy_mode;
82         u32 buf_count;
83         struct {
84                 u32 left, top;
85                 u32 width, height;
86         } input_crop;
87 };
88
89 /* define core states */
90 #define CORE_UNINIT                             0
91 #define CORE_INIT                               1
92
93 /* define instance states */
94 #define INST_UNINIT                             2
95 #define INST_INIT                               3
96 #define INST_LOAD_RESOURCES                     4
97 #define INST_START                              5
98 #define INST_STOP                               6
99 #define INST_RELEASE_RESOURCES                  7
100
101 struct venus_core;
102 struct venus_inst;
103
104 struct hfi_core_ops {
105         void (*event_notify)(struct venus_core *core, u32 event);
106 };
107
108 struct hfi_inst_ops {
109         void (*buf_done)(struct venus_inst *inst, unsigned int buf_type,
110                          u32 tag, u32 bytesused, u32 data_offset, u32 flags,
111                          u32 hfi_flags, u64 timestamp_us);
112         void (*event_notify)(struct venus_inst *inst, u32 event,
113                              struct hfi_event_data *data);
114 };
115
116 struct hfi_ops {
117         int (*core_init)(struct venus_core *core);
118         int (*core_deinit)(struct venus_core *core);
119         int (*core_ping)(struct venus_core *core, u32 cookie);
120         int (*core_trigger_ssr)(struct venus_core *core, u32 trigger_type);
121
122         int (*session_init)(struct venus_inst *inst, u32 session_type,
123                             u32 codec);
124         int (*session_end)(struct venus_inst *inst);
125         int (*session_abort)(struct venus_inst *inst);
126         int (*session_flush)(struct venus_inst *inst, u32 flush_mode);
127         int (*session_start)(struct venus_inst *inst);
128         int (*session_stop)(struct venus_inst *inst);
129         int (*session_continue)(struct venus_inst *inst);
130         int (*session_etb)(struct venus_inst *inst, struct hfi_frame_data *fd);
131         int (*session_ftb)(struct venus_inst *inst, struct hfi_frame_data *fd);
132         int (*session_set_buffers)(struct venus_inst *inst,
133                                    struct hfi_buffer_desc *bd);
134         int (*session_unset_buffers)(struct venus_inst *inst,
135                                      struct hfi_buffer_desc *bd);
136         int (*session_load_res)(struct venus_inst *inst);
137         int (*session_release_res)(struct venus_inst *inst);
138         int (*session_parse_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
139                                      u32 seq_hdr_len);
140         int (*session_get_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
141                                    u32 seq_hdr_len);
142         int (*session_set_property)(struct venus_inst *inst, u32 ptype,
143                                     void *pdata);
144         int (*session_get_property)(struct venus_inst *inst, u32 ptype);
145
146         int (*resume)(struct venus_core *core);
147         int (*suspend)(struct venus_core *core);
148
149         /* interrupt operations */
150         irqreturn_t (*isr)(struct venus_core *core);
151         irqreturn_t (*isr_thread)(struct venus_core *core);
152 };
153
154 int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops);
155 void hfi_destroy(struct venus_core *core);
156
157 int hfi_core_init(struct venus_core *core);
158 int hfi_core_deinit(struct venus_core *core, bool blocking);
159 int hfi_core_suspend(struct venus_core *core);
160 int hfi_core_resume(struct venus_core *core, bool force);
161 int hfi_core_trigger_ssr(struct venus_core *core, u32 type);
162 int hfi_core_ping(struct venus_core *core);
163 int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops);
164 void hfi_session_destroy(struct venus_inst *inst);
165 int hfi_session_init(struct venus_inst *inst, u32 pixfmt);
166 int hfi_session_deinit(struct venus_inst *inst);
167 int hfi_session_start(struct venus_inst *inst);
168 int hfi_session_stop(struct venus_inst *inst);
169 int hfi_session_continue(struct venus_inst *inst);
170 int hfi_session_abort(struct venus_inst *inst);
171 int hfi_session_load_res(struct venus_inst *inst);
172 int hfi_session_unload_res(struct venus_inst *inst);
173 int hfi_session_flush(struct venus_inst *inst);
174 int hfi_session_set_buffers(struct venus_inst *inst,
175                             struct hfi_buffer_desc *bd);
176 int hfi_session_unset_buffers(struct venus_inst *inst,
177                               struct hfi_buffer_desc *bd);
178 int hfi_session_get_property(struct venus_inst *inst, u32 ptype,
179                              union hfi_get_property *hprop);
180 int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata);
181 int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f);
182 irqreturn_t hfi_isr_thread(int irq, void *dev_id);
183 irqreturn_t hfi_isr(int irq, void *dev);
184
185 #endif