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