treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284
[linux-block.git] / drivers / media / platform / qcom / venus / hfi.h
CommitLineData
97fb5e8d 1/* SPDX-License-Identifier: GPL-2.0-only */
09c2845e
SV
2/*
3 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2017 Linaro Ltd.
09c2845e
SV
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
21struct 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
31struct 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
46union 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 */
58struct 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;
9eb2146e
SV
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;
09c2845e
SV
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
92struct venus_core;
93struct venus_inst;
94
95struct hfi_core_ops {
96 void (*event_notify)(struct venus_core *core, u32 event);
97};
98
99struct 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};
106
107struct hfi_ops {
108 int (*core_init)(struct venus_core *core);
109 int (*core_deinit)(struct venus_core *core);
110 int (*core_ping)(struct venus_core *core, u32 cookie);
111 int (*core_trigger_ssr)(struct venus_core *core, u32 trigger_type);
112
113 int (*session_init)(struct venus_inst *inst, u32 session_type,
114 u32 codec);
115 int (*session_end)(struct venus_inst *inst);
116 int (*session_abort)(struct venus_inst *inst);
117 int (*session_flush)(struct venus_inst *inst, u32 flush_mode);
118 int (*session_start)(struct venus_inst *inst);
119 int (*session_stop)(struct venus_inst *inst);
120 int (*session_continue)(struct venus_inst *inst);
121 int (*session_etb)(struct venus_inst *inst, struct hfi_frame_data *fd);
122 int (*session_ftb)(struct venus_inst *inst, struct hfi_frame_data *fd);
123 int (*session_set_buffers)(struct venus_inst *inst,
124 struct hfi_buffer_desc *bd);
125 int (*session_unset_buffers)(struct venus_inst *inst,
126 struct hfi_buffer_desc *bd);
127 int (*session_load_res)(struct venus_inst *inst);
128 int (*session_release_res)(struct venus_inst *inst);
129 int (*session_parse_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
130 u32 seq_hdr_len);
131 int (*session_get_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
132 u32 seq_hdr_len);
133 int (*session_set_property)(struct venus_inst *inst, u32 ptype,
134 void *pdata);
135 int (*session_get_property)(struct venus_inst *inst, u32 ptype);
136
137 int (*resume)(struct venus_core *core);
138 int (*suspend)(struct venus_core *core);
139
140 /* interrupt operations */
141 irqreturn_t (*isr)(struct venus_core *core);
142 irqreturn_t (*isr_thread)(struct venus_core *core);
143};
144
145int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops);
146void hfi_destroy(struct venus_core *core);
147
148int hfi_core_init(struct venus_core *core);
149int hfi_core_deinit(struct venus_core *core, bool blocking);
150int hfi_core_suspend(struct venus_core *core);
151int hfi_core_resume(struct venus_core *core, bool force);
152int hfi_core_trigger_ssr(struct venus_core *core, u32 type);
153int hfi_core_ping(struct venus_core *core);
154int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops);
155void hfi_session_destroy(struct venus_inst *inst);
156int hfi_session_init(struct venus_inst *inst, u32 pixfmt);
157int hfi_session_deinit(struct venus_inst *inst);
158int hfi_session_start(struct venus_inst *inst);
159int hfi_session_stop(struct venus_inst *inst);
160int hfi_session_continue(struct venus_inst *inst);
161int hfi_session_abort(struct venus_inst *inst);
162int hfi_session_load_res(struct venus_inst *inst);
163int hfi_session_unload_res(struct venus_inst *inst);
164int hfi_session_flush(struct venus_inst *inst);
165int hfi_session_set_buffers(struct venus_inst *inst,
166 struct hfi_buffer_desc *bd);
167int hfi_session_unset_buffers(struct venus_inst *inst,
168 struct hfi_buffer_desc *bd);
169int hfi_session_get_property(struct venus_inst *inst, u32 ptype,
170 union hfi_get_property *hprop);
171int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata);
172int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f);
173irqreturn_t hfi_isr_thread(int irq, void *dev_id);
174irqreturn_t hfi_isr(int irq, void *dev);
175
176#endif