1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2017 Linaro Ltd.
9 #include <linux/interrupt.h>
11 #include "hfi_helper.h"
13 #define VIDC_SESSION_TYPE_VPE 0
14 #define VIDC_SESSION_TYPE_ENC 1
15 #define VIDC_SESSION_TYPE_DEC 2
17 #define VIDC_RESOURCE_NONE 0
18 #define VIDC_RESOURCE_OCMEM 1
19 #define VIDC_RESOURCE_VMEM 2
21 struct hfi_buffer_desc {
28 u32 response_required;
31 struct hfi_frame_data {
46 union hfi_get_property {
47 struct hfi_profile_level profile_level;
48 struct hfi_buffer_requirements bufreq[HFI_BUFFER_TYPE_MAX];
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
57 /* HFI event callback structure */
58 struct hfi_event_data {
68 /* the following properties start appear from v4 onwards */
80 /* define core states */
84 /* define instance states */
87 #define INST_LOAD_RESOURCES 4
90 #define INST_RELEASE_RESOURCES 7
96 void (*event_notify)(struct venus_core *core, u32 event);
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);
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);
114 int (*session_init)(struct venus_inst *inst, u32 session_type,
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,
132 int (*session_get_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
134 int (*session_set_property)(struct venus_inst *inst, u32 ptype,
136 int (*session_get_property)(struct venus_inst *inst, u32 ptype);
138 int (*resume)(struct venus_core *core);
139 int (*suspend)(struct venus_core *core);
141 /* interrupt operations */
142 irqreturn_t (*isr)(struct venus_core *core);
143 irqreturn_t (*isr_thread)(struct venus_core *core);
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);
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);