xref: /OK3568_Linux_fs/kernel/drivers/media/platform/qcom/venus/hfi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 #ifndef __HFI_H__
7*4882a593Smuzhiyun #define __HFI_H__
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/interrupt.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include "hfi_helper.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define VIDC_SESSION_TYPE_VPE			0
14*4882a593Smuzhiyun #define VIDC_SESSION_TYPE_ENC			1
15*4882a593Smuzhiyun #define VIDC_SESSION_TYPE_DEC			2
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define VIDC_RESOURCE_NONE			0
18*4882a593Smuzhiyun #define VIDC_RESOURCE_OCMEM			1
19*4882a593Smuzhiyun #define VIDC_RESOURCE_VMEM			2
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun struct hfi_buffer_desc {
22*4882a593Smuzhiyun 	u32 buffer_type;
23*4882a593Smuzhiyun 	u32 buffer_size;
24*4882a593Smuzhiyun 	u32 num_buffers;
25*4882a593Smuzhiyun 	u32 device_addr;
26*4882a593Smuzhiyun 	u32 extradata_addr;
27*4882a593Smuzhiyun 	u32 extradata_size;
28*4882a593Smuzhiyun 	u32 response_required;
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct hfi_frame_data {
32*4882a593Smuzhiyun 	u32 buffer_type;
33*4882a593Smuzhiyun 	u32 device_addr;
34*4882a593Smuzhiyun 	u32 extradata_addr;
35*4882a593Smuzhiyun 	u64 timestamp;
36*4882a593Smuzhiyun 	u32 flags;
37*4882a593Smuzhiyun 	u32 offset;
38*4882a593Smuzhiyun 	u32 alloc_len;
39*4882a593Smuzhiyun 	u32 filled_len;
40*4882a593Smuzhiyun 	u32 mark_target;
41*4882a593Smuzhiyun 	u32 mark_data;
42*4882a593Smuzhiyun 	u32 clnt_data;
43*4882a593Smuzhiyun 	u32 extradata_size;
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun union hfi_get_property {
47*4882a593Smuzhiyun 	struct hfi_profile_level profile_level;
48*4882a593Smuzhiyun 	struct hfi_buffer_requirements bufreq[HFI_BUFFER_TYPE_MAX];
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* HFI events */
52*4882a593Smuzhiyun #define EVT_SYS_EVENT_CHANGE			1
53*4882a593Smuzhiyun #define EVT_SYS_WATCHDOG_TIMEOUT		2
54*4882a593Smuzhiyun #define EVT_SYS_ERROR				3
55*4882a593Smuzhiyun #define EVT_SESSION_ERROR			4
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* HFI event callback structure */
58*4882a593Smuzhiyun struct hfi_event_data {
59*4882a593Smuzhiyun 	u32 error;
60*4882a593Smuzhiyun 	u32 height;
61*4882a593Smuzhiyun 	u32 width;
62*4882a593Smuzhiyun 	u32 event_type;
63*4882a593Smuzhiyun 	u32 packet_buffer;
64*4882a593Smuzhiyun 	u32 extradata_buffer;
65*4882a593Smuzhiyun 	u32 tag;
66*4882a593Smuzhiyun 	u32 profile;
67*4882a593Smuzhiyun 	u32 level;
68*4882a593Smuzhiyun 	/* the following properties start appear from v4 onwards */
69*4882a593Smuzhiyun 	u32 bit_depth;
70*4882a593Smuzhiyun 	u32 pic_struct;
71*4882a593Smuzhiyun 	u32 colour_space;
72*4882a593Smuzhiyun 	u32 entropy_mode;
73*4882a593Smuzhiyun 	u32 buf_count;
74*4882a593Smuzhiyun 	struct {
75*4882a593Smuzhiyun 		u32 left, top;
76*4882a593Smuzhiyun 		u32 width, height;
77*4882a593Smuzhiyun 	} input_crop;
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* define core states */
81*4882a593Smuzhiyun #define CORE_UNINIT				0
82*4882a593Smuzhiyun #define CORE_INIT				1
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* define instance states */
85*4882a593Smuzhiyun #define INST_UNINIT				2
86*4882a593Smuzhiyun #define INST_INIT				3
87*4882a593Smuzhiyun #define INST_LOAD_RESOURCES			4
88*4882a593Smuzhiyun #define INST_START				5
89*4882a593Smuzhiyun #define INST_STOP				6
90*4882a593Smuzhiyun #define INST_RELEASE_RESOURCES			7
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct venus_core;
93*4882a593Smuzhiyun struct venus_inst;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct hfi_core_ops {
96*4882a593Smuzhiyun 	void (*event_notify)(struct venus_core *core, u32 event);
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun struct hfi_inst_ops {
100*4882a593Smuzhiyun 	void (*buf_done)(struct venus_inst *inst, unsigned int buf_type,
101*4882a593Smuzhiyun 			 u32 tag, u32 bytesused, u32 data_offset, u32 flags,
102*4882a593Smuzhiyun 			 u32 hfi_flags, u64 timestamp_us);
103*4882a593Smuzhiyun 	void (*event_notify)(struct venus_inst *inst, u32 event,
104*4882a593Smuzhiyun 			     struct hfi_event_data *data);
105*4882a593Smuzhiyun 	void (*flush_done)(struct venus_inst *inst);
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct hfi_ops {
109*4882a593Smuzhiyun 	int (*core_init)(struct venus_core *core);
110*4882a593Smuzhiyun 	int (*core_deinit)(struct venus_core *core);
111*4882a593Smuzhiyun 	int (*core_ping)(struct venus_core *core, u32 cookie);
112*4882a593Smuzhiyun 	int (*core_trigger_ssr)(struct venus_core *core, u32 trigger_type);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	int (*session_init)(struct venus_inst *inst, u32 session_type,
115*4882a593Smuzhiyun 			    u32 codec);
116*4882a593Smuzhiyun 	int (*session_end)(struct venus_inst *inst);
117*4882a593Smuzhiyun 	int (*session_abort)(struct venus_inst *inst);
118*4882a593Smuzhiyun 	int (*session_flush)(struct venus_inst *inst, u32 flush_mode);
119*4882a593Smuzhiyun 	int (*session_start)(struct venus_inst *inst);
120*4882a593Smuzhiyun 	int (*session_stop)(struct venus_inst *inst);
121*4882a593Smuzhiyun 	int (*session_continue)(struct venus_inst *inst);
122*4882a593Smuzhiyun 	int (*session_etb)(struct venus_inst *inst, struct hfi_frame_data *fd);
123*4882a593Smuzhiyun 	int (*session_ftb)(struct venus_inst *inst, struct hfi_frame_data *fd);
124*4882a593Smuzhiyun 	int (*session_set_buffers)(struct venus_inst *inst,
125*4882a593Smuzhiyun 				   struct hfi_buffer_desc *bd);
126*4882a593Smuzhiyun 	int (*session_unset_buffers)(struct venus_inst *inst,
127*4882a593Smuzhiyun 				     struct hfi_buffer_desc *bd);
128*4882a593Smuzhiyun 	int (*session_load_res)(struct venus_inst *inst);
129*4882a593Smuzhiyun 	int (*session_release_res)(struct venus_inst *inst);
130*4882a593Smuzhiyun 	int (*session_parse_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
131*4882a593Smuzhiyun 				     u32 seq_hdr_len);
132*4882a593Smuzhiyun 	int (*session_get_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
133*4882a593Smuzhiyun 				   u32 seq_hdr_len);
134*4882a593Smuzhiyun 	int (*session_set_property)(struct venus_inst *inst, u32 ptype,
135*4882a593Smuzhiyun 				    void *pdata);
136*4882a593Smuzhiyun 	int (*session_get_property)(struct venus_inst *inst, u32 ptype);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	int (*resume)(struct venus_core *core);
139*4882a593Smuzhiyun 	int (*suspend)(struct venus_core *core);
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	/* interrupt operations */
142*4882a593Smuzhiyun 	irqreturn_t (*isr)(struct venus_core *core);
143*4882a593Smuzhiyun 	irqreturn_t (*isr_thread)(struct venus_core *core);
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops);
147*4882a593Smuzhiyun void hfi_destroy(struct venus_core *core);
148*4882a593Smuzhiyun void hfi_reinit(struct venus_core *core);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun int hfi_core_init(struct venus_core *core);
151*4882a593Smuzhiyun int hfi_core_deinit(struct venus_core *core, bool blocking);
152*4882a593Smuzhiyun int hfi_core_suspend(struct venus_core *core);
153*4882a593Smuzhiyun int hfi_core_resume(struct venus_core *core, bool force);
154*4882a593Smuzhiyun int hfi_core_trigger_ssr(struct venus_core *core, u32 type);
155*4882a593Smuzhiyun int hfi_core_ping(struct venus_core *core);
156*4882a593Smuzhiyun int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops);
157*4882a593Smuzhiyun void hfi_session_destroy(struct venus_inst *inst);
158*4882a593Smuzhiyun int hfi_session_init(struct venus_inst *inst, u32 pixfmt);
159*4882a593Smuzhiyun int hfi_session_deinit(struct venus_inst *inst);
160*4882a593Smuzhiyun int hfi_session_start(struct venus_inst *inst);
161*4882a593Smuzhiyun int hfi_session_stop(struct venus_inst *inst);
162*4882a593Smuzhiyun int hfi_session_continue(struct venus_inst *inst);
163*4882a593Smuzhiyun int hfi_session_abort(struct venus_inst *inst);
164*4882a593Smuzhiyun int hfi_session_load_res(struct venus_inst *inst);
165*4882a593Smuzhiyun int hfi_session_unload_res(struct venus_inst *inst);
166*4882a593Smuzhiyun int hfi_session_flush(struct venus_inst *inst, u32 type, bool block);
167*4882a593Smuzhiyun int hfi_session_set_buffers(struct venus_inst *inst,
168*4882a593Smuzhiyun 			    struct hfi_buffer_desc *bd);
169*4882a593Smuzhiyun int hfi_session_unset_buffers(struct venus_inst *inst,
170*4882a593Smuzhiyun 			      struct hfi_buffer_desc *bd);
171*4882a593Smuzhiyun int hfi_session_get_property(struct venus_inst *inst, u32 ptype,
172*4882a593Smuzhiyun 			     union hfi_get_property *hprop);
173*4882a593Smuzhiyun int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata);
174*4882a593Smuzhiyun int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f);
175*4882a593Smuzhiyun irqreturn_t hfi_isr_thread(int irq, void *dev_id);
176*4882a593Smuzhiyun irqreturn_t hfi_isr(int irq, void *dev);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #endif
179