treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 283
[linux-block.git] / drivers / media / platform / qcom / venus / hfi.h
CommitLineData
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
30struct 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
40struct 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
55union 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 */
67struct 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
101struct venus_core;
102struct venus_inst;
103
104struct hfi_core_ops {
105 void (*event_notify)(struct venus_core *core, u32 event);
106};
107
108struct 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
116struct 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
154int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops);
155void hfi_destroy(struct venus_core *core);
156
157int hfi_core_init(struct venus_core *core);
158int hfi_core_deinit(struct venus_core *core, bool blocking);
159int hfi_core_suspend(struct venus_core *core);
160int hfi_core_resume(struct venus_core *core, bool force);
161int hfi_core_trigger_ssr(struct venus_core *core, u32 type);
162int hfi_core_ping(struct venus_core *core);
163int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops);
164void hfi_session_destroy(struct venus_inst *inst);
165int hfi_session_init(struct venus_inst *inst, u32 pixfmt);
166int hfi_session_deinit(struct venus_inst *inst);
167int hfi_session_start(struct venus_inst *inst);
168int hfi_session_stop(struct venus_inst *inst);
169int hfi_session_continue(struct venus_inst *inst);
170int hfi_session_abort(struct venus_inst *inst);
171int hfi_session_load_res(struct venus_inst *inst);
172int hfi_session_unload_res(struct venus_inst *inst);
173int hfi_session_flush(struct venus_inst *inst);
174int hfi_session_set_buffers(struct venus_inst *inst,
175 struct hfi_buffer_desc *bd);
176int hfi_session_unset_buffers(struct venus_inst *inst,
177 struct hfi_buffer_desc *bd);
178int hfi_session_get_property(struct venus_inst *inst, u32 ptype,
179 union hfi_get_property *hprop);
180int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata);
181int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f);
182irqreturn_t hfi_isr_thread(int irq, void *dev_id);
183irqreturn_t hfi_isr(int irq, void *dev);
184
185#endif