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