1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
4*4882a593Smuzhiyun * Copyright (C) 2017 Linaro Ltd.
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun #include <linux/slab.h>
7*4882a593Smuzhiyun #include <linux/mutex.h>
8*4882a593Smuzhiyun #include <linux/list.h>
9*4882a593Smuzhiyun #include <linux/completion.h>
10*4882a593Smuzhiyun #include <linux/platform_device.h>
11*4882a593Smuzhiyun #include <linux/videodev2.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include "core.h"
14*4882a593Smuzhiyun #include "hfi.h"
15*4882a593Smuzhiyun #include "hfi_cmds.h"
16*4882a593Smuzhiyun #include "hfi_venus.h"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #define TIMEOUT msecs_to_jiffies(1000)
19*4882a593Smuzhiyun
to_codec_type(u32 pixfmt)20*4882a593Smuzhiyun static u32 to_codec_type(u32 pixfmt)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun switch (pixfmt) {
23*4882a593Smuzhiyun case V4L2_PIX_FMT_H264:
24*4882a593Smuzhiyun case V4L2_PIX_FMT_H264_NO_SC:
25*4882a593Smuzhiyun return HFI_VIDEO_CODEC_H264;
26*4882a593Smuzhiyun case V4L2_PIX_FMT_H263:
27*4882a593Smuzhiyun return HFI_VIDEO_CODEC_H263;
28*4882a593Smuzhiyun case V4L2_PIX_FMT_MPEG1:
29*4882a593Smuzhiyun return HFI_VIDEO_CODEC_MPEG1;
30*4882a593Smuzhiyun case V4L2_PIX_FMT_MPEG2:
31*4882a593Smuzhiyun return HFI_VIDEO_CODEC_MPEG2;
32*4882a593Smuzhiyun case V4L2_PIX_FMT_MPEG4:
33*4882a593Smuzhiyun return HFI_VIDEO_CODEC_MPEG4;
34*4882a593Smuzhiyun case V4L2_PIX_FMT_VC1_ANNEX_G:
35*4882a593Smuzhiyun case V4L2_PIX_FMT_VC1_ANNEX_L:
36*4882a593Smuzhiyun return HFI_VIDEO_CODEC_VC1;
37*4882a593Smuzhiyun case V4L2_PIX_FMT_VP8:
38*4882a593Smuzhiyun return HFI_VIDEO_CODEC_VP8;
39*4882a593Smuzhiyun case V4L2_PIX_FMT_VP9:
40*4882a593Smuzhiyun return HFI_VIDEO_CODEC_VP9;
41*4882a593Smuzhiyun case V4L2_PIX_FMT_XVID:
42*4882a593Smuzhiyun return HFI_VIDEO_CODEC_DIVX;
43*4882a593Smuzhiyun case V4L2_PIX_FMT_HEVC:
44*4882a593Smuzhiyun return HFI_VIDEO_CODEC_HEVC;
45*4882a593Smuzhiyun default:
46*4882a593Smuzhiyun return 0;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
hfi_core_init(struct venus_core * core)50*4882a593Smuzhiyun int hfi_core_init(struct venus_core *core)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun int ret = 0;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun mutex_lock(&core->lock);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun if (core->state >= CORE_INIT)
57*4882a593Smuzhiyun goto unlock;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun reinit_completion(&core->done);
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun ret = core->ops->core_init(core);
62*4882a593Smuzhiyun if (ret)
63*4882a593Smuzhiyun goto unlock;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun ret = wait_for_completion_timeout(&core->done, TIMEOUT);
66*4882a593Smuzhiyun if (!ret) {
67*4882a593Smuzhiyun ret = -ETIMEDOUT;
68*4882a593Smuzhiyun goto unlock;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun ret = 0;
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun if (core->error != HFI_ERR_NONE) {
74*4882a593Smuzhiyun ret = -EIO;
75*4882a593Smuzhiyun goto unlock;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun core->state = CORE_INIT;
79*4882a593Smuzhiyun unlock:
80*4882a593Smuzhiyun mutex_unlock(&core->lock);
81*4882a593Smuzhiyun return ret;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
hfi_core_deinit(struct venus_core * core,bool blocking)84*4882a593Smuzhiyun int hfi_core_deinit(struct venus_core *core, bool blocking)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun int ret = 0, empty;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun mutex_lock(&core->lock);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun if (core->state == CORE_UNINIT)
91*4882a593Smuzhiyun goto unlock;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun empty = list_empty(&core->instances);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun if (!empty && !blocking) {
96*4882a593Smuzhiyun ret = -EBUSY;
97*4882a593Smuzhiyun goto unlock;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun if (!empty) {
101*4882a593Smuzhiyun mutex_unlock(&core->lock);
102*4882a593Smuzhiyun wait_var_event(&core->insts_count,
103*4882a593Smuzhiyun !atomic_read(&core->insts_count));
104*4882a593Smuzhiyun mutex_lock(&core->lock);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun if (!core->ops)
108*4882a593Smuzhiyun goto unlock;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun ret = core->ops->core_deinit(core);
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun if (!ret)
113*4882a593Smuzhiyun core->state = CORE_UNINIT;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun unlock:
116*4882a593Smuzhiyun mutex_unlock(&core->lock);
117*4882a593Smuzhiyun return ret;
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
hfi_core_suspend(struct venus_core * core)120*4882a593Smuzhiyun int hfi_core_suspend(struct venus_core *core)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun if (core->state != CORE_INIT)
123*4882a593Smuzhiyun return 0;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun return core->ops->suspend(core);
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
hfi_core_resume(struct venus_core * core,bool force)128*4882a593Smuzhiyun int hfi_core_resume(struct venus_core *core, bool force)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun if (!force && core->state != CORE_INIT)
131*4882a593Smuzhiyun return 0;
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun return core->ops->resume(core);
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
hfi_core_trigger_ssr(struct venus_core * core,u32 type)136*4882a593Smuzhiyun int hfi_core_trigger_ssr(struct venus_core *core, u32 type)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun return core->ops->core_trigger_ssr(core, type);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
hfi_core_ping(struct venus_core * core)141*4882a593Smuzhiyun int hfi_core_ping(struct venus_core *core)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun int ret;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun mutex_lock(&core->lock);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun ret = core->ops->core_ping(core, 0xbeef);
148*4882a593Smuzhiyun if (ret)
149*4882a593Smuzhiyun goto unlock;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun ret = wait_for_completion_timeout(&core->done, TIMEOUT);
152*4882a593Smuzhiyun if (!ret) {
153*4882a593Smuzhiyun ret = -ETIMEDOUT;
154*4882a593Smuzhiyun goto unlock;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun ret = 0;
157*4882a593Smuzhiyun if (core->error != HFI_ERR_NONE)
158*4882a593Smuzhiyun ret = -ENODEV;
159*4882a593Smuzhiyun unlock:
160*4882a593Smuzhiyun mutex_unlock(&core->lock);
161*4882a593Smuzhiyun return ret;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
wait_session_msg(struct venus_inst * inst)164*4882a593Smuzhiyun static int wait_session_msg(struct venus_inst *inst)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun int ret;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun ret = wait_for_completion_timeout(&inst->done, TIMEOUT);
169*4882a593Smuzhiyun if (!ret)
170*4882a593Smuzhiyun return -ETIMEDOUT;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun if (inst->error != HFI_ERR_NONE)
173*4882a593Smuzhiyun return -EIO;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun return 0;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
hfi_session_create(struct venus_inst * inst,const struct hfi_inst_ops * ops)178*4882a593Smuzhiyun int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun struct venus_core *core = inst->core;
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun if (!ops)
183*4882a593Smuzhiyun return -EINVAL;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun inst->state = INST_UNINIT;
186*4882a593Smuzhiyun init_completion(&inst->done);
187*4882a593Smuzhiyun inst->ops = ops;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun mutex_lock(&core->lock);
190*4882a593Smuzhiyun list_add_tail(&inst->list, &core->instances);
191*4882a593Smuzhiyun atomic_inc(&core->insts_count);
192*4882a593Smuzhiyun mutex_unlock(&core->lock);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun return 0;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_create);
197*4882a593Smuzhiyun
hfi_session_init(struct venus_inst * inst,u32 pixfmt)198*4882a593Smuzhiyun int hfi_session_init(struct venus_inst *inst, u32 pixfmt)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun struct venus_core *core = inst->core;
201*4882a593Smuzhiyun const struct hfi_ops *ops = core->ops;
202*4882a593Smuzhiyun int ret;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun if (inst->state != INST_UNINIT)
205*4882a593Smuzhiyun return -EINVAL;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun inst->hfi_codec = to_codec_type(pixfmt);
208*4882a593Smuzhiyun reinit_completion(&inst->done);
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun ret = ops->session_init(inst, inst->session_type, inst->hfi_codec);
211*4882a593Smuzhiyun if (ret)
212*4882a593Smuzhiyun return ret;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun ret = wait_session_msg(inst);
215*4882a593Smuzhiyun if (ret)
216*4882a593Smuzhiyun return ret;
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun inst->state = INST_INIT;
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun return 0;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_init);
223*4882a593Smuzhiyun
hfi_session_destroy(struct venus_inst * inst)224*4882a593Smuzhiyun void hfi_session_destroy(struct venus_inst *inst)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun struct venus_core *core = inst->core;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun mutex_lock(&core->lock);
229*4882a593Smuzhiyun list_del_init(&inst->list);
230*4882a593Smuzhiyun if (atomic_dec_and_test(&core->insts_count))
231*4882a593Smuzhiyun wake_up_var(&core->insts_count);
232*4882a593Smuzhiyun mutex_unlock(&core->lock);
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_destroy);
235*4882a593Smuzhiyun
hfi_session_deinit(struct venus_inst * inst)236*4882a593Smuzhiyun int hfi_session_deinit(struct venus_inst *inst)
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
239*4882a593Smuzhiyun int ret;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun if (inst->state == INST_UNINIT)
242*4882a593Smuzhiyun return 0;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun if (inst->state < INST_INIT)
245*4882a593Smuzhiyun return -EINVAL;
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun reinit_completion(&inst->done);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun ret = ops->session_end(inst);
250*4882a593Smuzhiyun if (ret)
251*4882a593Smuzhiyun return ret;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun ret = wait_session_msg(inst);
254*4882a593Smuzhiyun if (ret)
255*4882a593Smuzhiyun return ret;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun inst->state = INST_UNINIT;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun return 0;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_deinit);
262*4882a593Smuzhiyun
hfi_session_start(struct venus_inst * inst)263*4882a593Smuzhiyun int hfi_session_start(struct venus_inst *inst)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
266*4882a593Smuzhiyun int ret;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun if (inst->state != INST_LOAD_RESOURCES)
269*4882a593Smuzhiyun return -EINVAL;
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun reinit_completion(&inst->done);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun ret = ops->session_start(inst);
274*4882a593Smuzhiyun if (ret)
275*4882a593Smuzhiyun return ret;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun ret = wait_session_msg(inst);
278*4882a593Smuzhiyun if (ret)
279*4882a593Smuzhiyun return ret;
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun inst->state = INST_START;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun return 0;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_start);
286*4882a593Smuzhiyun
hfi_session_stop(struct venus_inst * inst)287*4882a593Smuzhiyun int hfi_session_stop(struct venus_inst *inst)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
290*4882a593Smuzhiyun int ret;
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun if (inst->state != INST_START)
293*4882a593Smuzhiyun return -EINVAL;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun reinit_completion(&inst->done);
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun ret = ops->session_stop(inst);
298*4882a593Smuzhiyun if (ret)
299*4882a593Smuzhiyun return ret;
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun ret = wait_session_msg(inst);
302*4882a593Smuzhiyun if (ret)
303*4882a593Smuzhiyun return ret;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun inst->state = INST_STOP;
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun return 0;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_stop);
310*4882a593Smuzhiyun
hfi_session_continue(struct venus_inst * inst)311*4882a593Smuzhiyun int hfi_session_continue(struct venus_inst *inst)
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun struct venus_core *core = inst->core;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun if (core->res->hfi_version == HFI_VERSION_1XX)
316*4882a593Smuzhiyun return 0;
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun return core->ops->session_continue(inst);
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_continue);
321*4882a593Smuzhiyun
hfi_session_abort(struct venus_inst * inst)322*4882a593Smuzhiyun int hfi_session_abort(struct venus_inst *inst)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
325*4882a593Smuzhiyun int ret;
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun reinit_completion(&inst->done);
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun ret = ops->session_abort(inst);
330*4882a593Smuzhiyun if (ret)
331*4882a593Smuzhiyun return ret;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun ret = wait_session_msg(inst);
334*4882a593Smuzhiyun if (ret)
335*4882a593Smuzhiyun return ret;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun return 0;
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_abort);
340*4882a593Smuzhiyun
hfi_session_load_res(struct venus_inst * inst)341*4882a593Smuzhiyun int hfi_session_load_res(struct venus_inst *inst)
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
344*4882a593Smuzhiyun int ret;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun if (inst->state != INST_INIT)
347*4882a593Smuzhiyun return -EINVAL;
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun reinit_completion(&inst->done);
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun ret = ops->session_load_res(inst);
352*4882a593Smuzhiyun if (ret)
353*4882a593Smuzhiyun return ret;
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun ret = wait_session_msg(inst);
356*4882a593Smuzhiyun if (ret)
357*4882a593Smuzhiyun return ret;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun inst->state = INST_LOAD_RESOURCES;
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun return 0;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
hfi_session_unload_res(struct venus_inst * inst)364*4882a593Smuzhiyun int hfi_session_unload_res(struct venus_inst *inst)
365*4882a593Smuzhiyun {
366*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
367*4882a593Smuzhiyun int ret;
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun if (inst->state != INST_STOP)
370*4882a593Smuzhiyun return -EINVAL;
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun reinit_completion(&inst->done);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun ret = ops->session_release_res(inst);
375*4882a593Smuzhiyun if (ret)
376*4882a593Smuzhiyun return ret;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun ret = wait_session_msg(inst);
379*4882a593Smuzhiyun if (ret)
380*4882a593Smuzhiyun return ret;
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun inst->state = INST_RELEASE_RESOURCES;
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun return 0;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_unload_res);
387*4882a593Smuzhiyun
hfi_session_flush(struct venus_inst * inst,u32 type,bool block)388*4882a593Smuzhiyun int hfi_session_flush(struct venus_inst *inst, u32 type, bool block)
389*4882a593Smuzhiyun {
390*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
391*4882a593Smuzhiyun int ret;
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun reinit_completion(&inst->done);
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun ret = ops->session_flush(inst, type);
396*4882a593Smuzhiyun if (ret)
397*4882a593Smuzhiyun return ret;
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun if (block) {
400*4882a593Smuzhiyun ret = wait_session_msg(inst);
401*4882a593Smuzhiyun if (ret)
402*4882a593Smuzhiyun return ret;
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun return 0;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_flush);
408*4882a593Smuzhiyun
hfi_session_set_buffers(struct venus_inst * inst,struct hfi_buffer_desc * bd)409*4882a593Smuzhiyun int hfi_session_set_buffers(struct venus_inst *inst, struct hfi_buffer_desc *bd)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun return ops->session_set_buffers(inst, bd);
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
hfi_session_unset_buffers(struct venus_inst * inst,struct hfi_buffer_desc * bd)416*4882a593Smuzhiyun int hfi_session_unset_buffers(struct venus_inst *inst,
417*4882a593Smuzhiyun struct hfi_buffer_desc *bd)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
420*4882a593Smuzhiyun int ret;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun reinit_completion(&inst->done);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun ret = ops->session_unset_buffers(inst, bd);
425*4882a593Smuzhiyun if (ret)
426*4882a593Smuzhiyun return ret;
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun if (!bd->response_required)
429*4882a593Smuzhiyun return 0;
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun ret = wait_session_msg(inst);
432*4882a593Smuzhiyun if (ret)
433*4882a593Smuzhiyun return ret;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun return 0;
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
hfi_session_get_property(struct venus_inst * inst,u32 ptype,union hfi_get_property * hprop)438*4882a593Smuzhiyun int hfi_session_get_property(struct venus_inst *inst, u32 ptype,
439*4882a593Smuzhiyun union hfi_get_property *hprop)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
442*4882a593Smuzhiyun int ret;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun if (inst->state < INST_INIT || inst->state >= INST_STOP)
445*4882a593Smuzhiyun return -EINVAL;
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun reinit_completion(&inst->done);
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun ret = ops->session_get_property(inst, ptype);
450*4882a593Smuzhiyun if (ret)
451*4882a593Smuzhiyun return ret;
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun ret = wait_session_msg(inst);
454*4882a593Smuzhiyun if (ret)
455*4882a593Smuzhiyun return ret;
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun *hprop = inst->hprop;
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun return 0;
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_get_property);
462*4882a593Smuzhiyun
hfi_session_set_property(struct venus_inst * inst,u32 ptype,void * pdata)463*4882a593Smuzhiyun int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun if (inst->state < INST_INIT || inst->state >= INST_STOP)
468*4882a593Smuzhiyun return -EINVAL;
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun return ops->session_set_property(inst, ptype, pdata);
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_set_property);
473*4882a593Smuzhiyun
hfi_session_process_buf(struct venus_inst * inst,struct hfi_frame_data * fd)474*4882a593Smuzhiyun int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *fd)
475*4882a593Smuzhiyun {
476*4882a593Smuzhiyun const struct hfi_ops *ops = inst->core->ops;
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun if (fd->buffer_type == HFI_BUFFER_INPUT)
479*4882a593Smuzhiyun return ops->session_etb(inst, fd);
480*4882a593Smuzhiyun else if (fd->buffer_type == HFI_BUFFER_OUTPUT ||
481*4882a593Smuzhiyun fd->buffer_type == HFI_BUFFER_OUTPUT2)
482*4882a593Smuzhiyun return ops->session_ftb(inst, fd);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun return -EINVAL;
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(hfi_session_process_buf);
487*4882a593Smuzhiyun
hfi_isr_thread(int irq,void * dev_id)488*4882a593Smuzhiyun irqreturn_t hfi_isr_thread(int irq, void *dev_id)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun struct venus_core *core = dev_id;
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun return core->ops->isr_thread(core);
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun
hfi_isr(int irq,void * dev)495*4882a593Smuzhiyun irqreturn_t hfi_isr(int irq, void *dev)
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun struct venus_core *core = dev;
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun return core->ops->isr(core);
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
hfi_create(struct venus_core * core,const struct hfi_core_ops * ops)502*4882a593Smuzhiyun int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops)
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun int ret;
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun if (!ops)
507*4882a593Smuzhiyun return -EINVAL;
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun atomic_set(&core->insts_count, 0);
510*4882a593Smuzhiyun core->core_ops = ops;
511*4882a593Smuzhiyun core->state = CORE_UNINIT;
512*4882a593Smuzhiyun init_completion(&core->done);
513*4882a593Smuzhiyun pkt_set_version(core->res->hfi_version);
514*4882a593Smuzhiyun ret = venus_hfi_create(core);
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun return ret;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
hfi_destroy(struct venus_core * core)519*4882a593Smuzhiyun void hfi_destroy(struct venus_core *core)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun venus_hfi_destroy(core);
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun
hfi_reinit(struct venus_core * core)524*4882a593Smuzhiyun void hfi_reinit(struct venus_core *core)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun venus_hfi_queues_reinit(core);
527*4882a593Smuzhiyun }
528