Commit | Line | Data |
---|---|---|
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 | ||
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; | |
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 | ||
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 | }; | |
106 | ||
107 | struct 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 | ||
145 | int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops); | |
146 | void hfi_destroy(struct venus_core *core); | |
147 | ||
148 | int hfi_core_init(struct venus_core *core); | |
149 | int hfi_core_deinit(struct venus_core *core, bool blocking); | |
150 | int hfi_core_suspend(struct venus_core *core); | |
151 | int hfi_core_resume(struct venus_core *core, bool force); | |
152 | int hfi_core_trigger_ssr(struct venus_core *core, u32 type); | |
153 | int hfi_core_ping(struct venus_core *core); | |
154 | int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops); | |
155 | void hfi_session_destroy(struct venus_inst *inst); | |
156 | int hfi_session_init(struct venus_inst *inst, u32 pixfmt); | |
157 | int hfi_session_deinit(struct venus_inst *inst); | |
158 | int hfi_session_start(struct venus_inst *inst); | |
159 | int hfi_session_stop(struct venus_inst *inst); | |
160 | int hfi_session_continue(struct venus_inst *inst); | |
161 | int hfi_session_abort(struct venus_inst *inst); | |
162 | int hfi_session_load_res(struct venus_inst *inst); | |
163 | int hfi_session_unload_res(struct venus_inst *inst); | |
164 | int hfi_session_flush(struct venus_inst *inst); | |
165 | int hfi_session_set_buffers(struct venus_inst *inst, | |
166 | struct hfi_buffer_desc *bd); | |
167 | int hfi_session_unset_buffers(struct venus_inst *inst, | |
168 | struct hfi_buffer_desc *bd); | |
169 | int hfi_session_get_property(struct venus_inst *inst, u32 ptype, | |
170 | union hfi_get_property *hprop); | |
171 | int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata); | |
172 | int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f); | |
173 | irqreturn_t hfi_isr_thread(int irq, void *dev_id); | |
174 | irqreturn_t hfi_isr(int irq, void *dev); | |
175 | ||
176 | #endif |