xref: /linux/drivers/media/platform/amphion/vpu_rpc.h (revision e670f5d6)
19f599f35SMing Qian /* SPDX-License-Identifier: GPL-2.0 */
29f599f35SMing Qian /*
39f599f35SMing Qian  * Copyright 2020-2021 NXP
49f599f35SMing Qian  */
59f599f35SMing Qian 
69f599f35SMing Qian #ifndef _AMPHION_VPU_RPC_H
79f599f35SMing Qian #define _AMPHION_VPU_RPC_H
89f599f35SMing Qian 
99f599f35SMing Qian #include <media/videobuf2-core.h>
109f599f35SMing Qian #include "vpu_codec.h"
119f599f35SMing Qian 
129f599f35SMing Qian struct vpu_rpc_buffer_desc {
139f599f35SMing Qian 	u32 wptr;
149f599f35SMing Qian 	u32 rptr;
159f599f35SMing Qian 	u32 start;
169f599f35SMing Qian 	u32 end;
179f599f35SMing Qian };
189f599f35SMing Qian 
199f599f35SMing Qian struct vpu_shared_addr {
209f599f35SMing Qian 	void *iface;
219f599f35SMing Qian 	struct vpu_rpc_buffer_desc *cmd_desc;
229f599f35SMing Qian 	void *cmd_mem_vir;
239f599f35SMing Qian 	struct vpu_rpc_buffer_desc *msg_desc;
249f599f35SMing Qian 	void *msg_mem_vir;
259f599f35SMing Qian 
269f599f35SMing Qian 	unsigned long boot_addr;
279f599f35SMing Qian 	struct vpu_core *core;
289f599f35SMing Qian 	void *priv;
299f599f35SMing Qian };
309f599f35SMing Qian 
319f599f35SMing Qian struct vpu_rpc_event_header {
329f599f35SMing Qian 	u32 index;
339f599f35SMing Qian 	u32 id;
349f599f35SMing Qian 	u32 num;
359f599f35SMing Qian };
369f599f35SMing Qian 
379f599f35SMing Qian struct vpu_rpc_event {
389f599f35SMing Qian 	struct vpu_rpc_event_header hdr;
399f599f35SMing Qian 	u32 data[128];
409f599f35SMing Qian };
419f599f35SMing Qian 
429f599f35SMing Qian struct vpu_iface_ops {
439f599f35SMing Qian 	bool (*check_codec)(enum vpu_core_type type);
449f599f35SMing Qian 	bool (*check_fmt)(enum vpu_core_type type, u32 pixelfmt);
459f599f35SMing Qian 	u32 (*get_data_size)(void);
46a9f7224cSMing Qian 	int (*check_memory_region)(dma_addr_t base, dma_addr_t addr, u32 size);
479f599f35SMing Qian 	int (*boot_core)(struct vpu_core *core);
489f599f35SMing Qian 	int (*shutdown_core)(struct vpu_core *core);
499f599f35SMing Qian 	int (*restore_core)(struct vpu_core *core);
509f599f35SMing Qian 	int (*get_power_state)(struct vpu_core *core);
519f599f35SMing Qian 	int (*on_firmware_loaded)(struct vpu_core *core);
529f599f35SMing Qian 	void (*init_rpc)(struct vpu_shared_addr *shared,
539f599f35SMing Qian 			 struct vpu_buffer *rpc, dma_addr_t boot_addr);
549f599f35SMing Qian 	void (*set_log_buf)(struct vpu_shared_addr *shared,
559f599f35SMing Qian 			    struct vpu_buffer *log);
569f599f35SMing Qian 	void (*set_system_cfg)(struct vpu_shared_addr *shared,
579f599f35SMing Qian 			       u32 regs_base, void __iomem *regs, u32 index);
589f599f35SMing Qian 	void (*set_stream_cfg)(struct vpu_shared_addr *shared, u32 index);
599f599f35SMing Qian 	u32 (*get_version)(struct vpu_shared_addr *shared);
609f599f35SMing Qian 	u32 (*get_max_instance_count)(struct vpu_shared_addr *shared);
619f599f35SMing Qian 	int (*get_stream_buffer_size)(struct vpu_shared_addr *shared);
629f599f35SMing Qian 	int (*send_cmd_buf)(struct vpu_shared_addr *shared,
639f599f35SMing Qian 			    struct vpu_rpc_event *cmd);
649f599f35SMing Qian 	int (*receive_msg_buf)(struct vpu_shared_addr *shared,
659f599f35SMing Qian 			       struct vpu_rpc_event *msg);
669f599f35SMing Qian 	int (*pack_cmd)(struct vpu_rpc_event *pkt, u32 index, u32 id, void *data);
679f599f35SMing Qian 	int (*convert_msg_id)(u32 msg_id);
689f599f35SMing Qian 	int (*unpack_msg_data)(struct vpu_rpc_event *pkt, void *data);
699f599f35SMing Qian 	int (*input_frame)(struct vpu_shared_addr *shared,
709f599f35SMing Qian 			   struct vpu_inst *inst, struct vb2_buffer *vb);
719f599f35SMing Qian 	int (*config_memory_resource)(struct vpu_shared_addr *shared,
729f599f35SMing Qian 				      u32 instance,
739f599f35SMing Qian 				      u32 type,
749f599f35SMing Qian 				      u32 index,
759f599f35SMing Qian 				      struct vpu_buffer *buf);
769f599f35SMing Qian 	int (*config_stream_buffer)(struct vpu_shared_addr *shared,
779f599f35SMing Qian 				    u32 instance,
789f599f35SMing Qian 				    struct vpu_buffer *buf);
799f599f35SMing Qian 	int (*update_stream_buffer)(struct vpu_shared_addr *shared,
809f599f35SMing Qian 				    u32 instance, u32 ptr, bool write);
819f599f35SMing Qian 	int (*get_stream_buffer_desc)(struct vpu_shared_addr *shared,
829f599f35SMing Qian 				      u32 instance,
839f599f35SMing Qian 				      struct vpu_rpc_buffer_desc *desc);
849f599f35SMing Qian 	int (*set_encode_params)(struct vpu_shared_addr *shared,
859f599f35SMing Qian 				 u32 instance,
869f599f35SMing Qian 				 struct vpu_encode_params *params,
879f599f35SMing Qian 				 u32 update);
889f599f35SMing Qian 	int (*set_decode_params)(struct vpu_shared_addr *shared,
899f599f35SMing Qian 				 u32 instance,
909f599f35SMing Qian 				 struct vpu_decode_params *params,
919f599f35SMing Qian 				 u32 update);
929f599f35SMing Qian 	int (*add_scode)(struct vpu_shared_addr *shared,
939f599f35SMing Qian 			 u32 instance,
949f599f35SMing Qian 			 struct vpu_buffer *stream_buffer,
959f599f35SMing Qian 			 u32 pixelformat,
969f599f35SMing Qian 			 u32 scode_type);
979f599f35SMing Qian 	int (*pre_send_cmd)(struct vpu_shared_addr *shared, u32 instance);
989f599f35SMing Qian 	int (*post_send_cmd)(struct vpu_shared_addr *shared, u32 instance);
999f599f35SMing Qian 	int (*init_instance)(struct vpu_shared_addr *shared, u32 instance);
1009f599f35SMing Qian };
1019f599f35SMing Qian 
1029f599f35SMing Qian enum {
1039f599f35SMing Qian 	VPU_CORE_MEMORY_INVALID = 0,
1049f599f35SMing Qian 	VPU_CORE_MEMORY_CACHED,
1059f599f35SMing Qian 	VPU_CORE_MEMORY_UNCACHED
1069f599f35SMing Qian };
1079f599f35SMing Qian 
1089f599f35SMing Qian struct vpu_rpc_region_t {
1099f599f35SMing Qian 	dma_addr_t start;
1109f599f35SMing Qian 	dma_addr_t end;
1119f599f35SMing Qian 	dma_addr_t type;
1129f599f35SMing Qian };
1139f599f35SMing Qian 
1149f599f35SMing Qian struct vpu_iface_ops *vpu_core_get_iface(struct vpu_core *core);
1159f599f35SMing Qian struct vpu_iface_ops *vpu_inst_get_iface(struct vpu_inst *inst);
116a9f7224cSMing Qian int vpu_iface_check_memory_region(struct vpu_core *core, dma_addr_t addr, u32 size);
1179f599f35SMing Qian 
vpu_iface_check_codec(struct vpu_core * core)1189f599f35SMing Qian static inline bool vpu_iface_check_codec(struct vpu_core *core)
1199f599f35SMing Qian {
1209f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1219f599f35SMing Qian 
1229f599f35SMing Qian 	if (ops && ops->check_codec)
1239f599f35SMing Qian 		return ops->check_codec(core->type);
1249f599f35SMing Qian 
1259f599f35SMing Qian 	return true;
1269f599f35SMing Qian }
1279f599f35SMing Qian 
vpu_iface_check_format(struct vpu_inst * inst,u32 pixelfmt)1289f599f35SMing Qian static inline bool vpu_iface_check_format(struct vpu_inst *inst, u32 pixelfmt)
1299f599f35SMing Qian {
1309f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_inst_get_iface(inst);
1319f599f35SMing Qian 
1329f599f35SMing Qian 	if (ops && ops->check_fmt)
1339f599f35SMing Qian 		return ops->check_fmt(inst->type, pixelfmt);
1349f599f35SMing Qian 
1359f599f35SMing Qian 	return true;
1369f599f35SMing Qian }
1379f599f35SMing Qian 
vpu_iface_boot_core(struct vpu_core * core)1389f599f35SMing Qian static inline int vpu_iface_boot_core(struct vpu_core *core)
1399f599f35SMing Qian {
1409f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1419f599f35SMing Qian 
1429f599f35SMing Qian 	if (ops && ops->boot_core)
1439f599f35SMing Qian 		return ops->boot_core(core);
1449f599f35SMing Qian 	return 0;
1459f599f35SMing Qian }
1469f599f35SMing Qian 
vpu_iface_get_power_state(struct vpu_core * core)1479f599f35SMing Qian static inline int vpu_iface_get_power_state(struct vpu_core *core)
1489f599f35SMing Qian {
1499f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1509f599f35SMing Qian 
1519f599f35SMing Qian 	if (ops && ops->get_power_state)
1529f599f35SMing Qian 		return ops->get_power_state(core);
1539f599f35SMing Qian 	return 1;
1549f599f35SMing Qian }
1559f599f35SMing Qian 
vpu_iface_shutdown_core(struct vpu_core * core)1569f599f35SMing Qian static inline int vpu_iface_shutdown_core(struct vpu_core *core)
1579f599f35SMing Qian {
1589f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1599f599f35SMing Qian 
1609f599f35SMing Qian 	if (ops && ops->shutdown_core)
1619f599f35SMing Qian 		return ops->shutdown_core(core);
1629f599f35SMing Qian 	return 0;
1639f599f35SMing Qian }
1649f599f35SMing Qian 
vpu_iface_restore_core(struct vpu_core * core)1659f599f35SMing Qian static inline int vpu_iface_restore_core(struct vpu_core *core)
1669f599f35SMing Qian {
1679f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1689f599f35SMing Qian 
1699f599f35SMing Qian 	if (ops && ops->restore_core)
1709f599f35SMing Qian 		return ops->restore_core(core);
1719f599f35SMing Qian 	return 0;
1729f599f35SMing Qian }
1739f599f35SMing Qian 
vpu_iface_on_firmware_loaded(struct vpu_core * core)1749f599f35SMing Qian static inline int vpu_iface_on_firmware_loaded(struct vpu_core *core)
1759f599f35SMing Qian {
1769f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1779f599f35SMing Qian 
1789f599f35SMing Qian 	if (ops && ops->on_firmware_loaded)
1799f599f35SMing Qian 		return ops->on_firmware_loaded(core);
1809f599f35SMing Qian 
1819f599f35SMing Qian 	return 0;
1829f599f35SMing Qian }
1839f599f35SMing Qian 
vpu_iface_get_data_size(struct vpu_core * core)1849f599f35SMing Qian static inline u32 vpu_iface_get_data_size(struct vpu_core *core)
1859f599f35SMing Qian {
1869f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
1879f599f35SMing Qian 
1889f599f35SMing Qian 	if (!ops || !ops->get_data_size)
1899f599f35SMing Qian 		return 0;
1909f599f35SMing Qian 
1919f599f35SMing Qian 	return ops->get_data_size();
1929f599f35SMing Qian }
1939f599f35SMing Qian 
vpu_iface_init(struct vpu_core * core,struct vpu_shared_addr * shared,struct vpu_buffer * rpc,dma_addr_t boot_addr)1949f599f35SMing Qian static inline int vpu_iface_init(struct vpu_core *core,
1959f599f35SMing Qian 				 struct vpu_shared_addr *shared,
1969f599f35SMing Qian 				 struct vpu_buffer *rpc,
1979f599f35SMing Qian 				 dma_addr_t boot_addr)
1989f599f35SMing Qian {
1999f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2009f599f35SMing Qian 
2019f599f35SMing Qian 	if (!ops || !ops->init_rpc)
2029f599f35SMing Qian 		return -EINVAL;
2039f599f35SMing Qian 
2049f599f35SMing Qian 	ops->init_rpc(shared, rpc, boot_addr);
2059f599f35SMing Qian 	core->iface = shared;
2069f599f35SMing Qian 	shared->core = core;
2079f599f35SMing Qian 	if (rpc->bytesused > rpc->length)
2089f599f35SMing Qian 		return -ENOSPC;
2099f599f35SMing Qian 	return 0;
2109f599f35SMing Qian }
2119f599f35SMing Qian 
vpu_iface_set_log_buf(struct vpu_core * core,struct vpu_buffer * log)2129f599f35SMing Qian static inline int vpu_iface_set_log_buf(struct vpu_core *core,
2139f599f35SMing Qian 					struct vpu_buffer *log)
2149f599f35SMing Qian {
2159f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2169f599f35SMing Qian 
2179f599f35SMing Qian 	if (!ops)
2189f599f35SMing Qian 		return -EINVAL;
2199f599f35SMing Qian 
2209f599f35SMing Qian 	if (ops->set_log_buf)
2219f599f35SMing Qian 		ops->set_log_buf(core->iface, log);
2229f599f35SMing Qian 
2239f599f35SMing Qian 	return 0;
2249f599f35SMing Qian }
2259f599f35SMing Qian 
vpu_iface_config_system(struct vpu_core * core,u32 regs_base,void __iomem * regs)2269f599f35SMing Qian static inline int vpu_iface_config_system(struct vpu_core *core, u32 regs_base, void __iomem *regs)
2279f599f35SMing Qian {
2289f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2299f599f35SMing Qian 
2309f599f35SMing Qian 	if (!ops)
2319f599f35SMing Qian 		return -EINVAL;
2329f599f35SMing Qian 	if (ops->set_system_cfg)
2339f599f35SMing Qian 		ops->set_system_cfg(core->iface, regs_base, regs, core->id);
2349f599f35SMing Qian 
2359f599f35SMing Qian 	return 0;
2369f599f35SMing Qian }
2379f599f35SMing Qian 
vpu_iface_get_stream_buffer_size(struct vpu_core * core)2389f599f35SMing Qian static inline int vpu_iface_get_stream_buffer_size(struct vpu_core *core)
2399f599f35SMing Qian {
2409f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2419f599f35SMing Qian 
2429f599f35SMing Qian 	if (!ops || !ops->get_stream_buffer_size)
2439f599f35SMing Qian 		return 0;
2449f599f35SMing Qian 
2459f599f35SMing Qian 	return ops->get_stream_buffer_size(core->iface);
2469f599f35SMing Qian }
2479f599f35SMing Qian 
vpu_iface_config_stream(struct vpu_inst * inst)2489f599f35SMing Qian static inline int vpu_iface_config_stream(struct vpu_inst *inst)
2499f599f35SMing Qian {
2509f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
2519f599f35SMing Qian 
2529f599f35SMing Qian 	if (!ops || inst->id < 0)
2539f599f35SMing Qian 		return -EINVAL;
2549f599f35SMing Qian 	if (ops->set_stream_cfg)
2559f599f35SMing Qian 		ops->set_stream_cfg(inst->core->iface, inst->id);
2569f599f35SMing Qian 	return 0;
2579f599f35SMing Qian }
2589f599f35SMing Qian 
vpu_iface_send_cmd(struct vpu_core * core,struct vpu_rpc_event * cmd)2599f599f35SMing Qian static inline int vpu_iface_send_cmd(struct vpu_core *core, struct vpu_rpc_event *cmd)
2609f599f35SMing Qian {
2619f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2629f599f35SMing Qian 
2639f599f35SMing Qian 	if (!ops || !ops->send_cmd_buf)
2649f599f35SMing Qian 		return -EINVAL;
2659f599f35SMing Qian 
2669f599f35SMing Qian 	return ops->send_cmd_buf(core->iface, cmd);
2679f599f35SMing Qian }
2689f599f35SMing Qian 
vpu_iface_receive_msg(struct vpu_core * core,struct vpu_rpc_event * msg)2699f599f35SMing Qian static inline int vpu_iface_receive_msg(struct vpu_core *core, struct vpu_rpc_event *msg)
2709f599f35SMing Qian {
2719f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2729f599f35SMing Qian 
2739f599f35SMing Qian 	if (!ops || !ops->receive_msg_buf)
2749f599f35SMing Qian 		return -EINVAL;
2759f599f35SMing Qian 
2769f599f35SMing Qian 	return ops->receive_msg_buf(core->iface, msg);
2779f599f35SMing Qian }
2789f599f35SMing Qian 
vpu_iface_pack_cmd(struct vpu_core * core,struct vpu_rpc_event * pkt,u32 index,u32 id,void * data)2799f599f35SMing Qian static inline int vpu_iface_pack_cmd(struct vpu_core *core,
2809f599f35SMing Qian 				     struct vpu_rpc_event *pkt,
2819f599f35SMing Qian 				     u32 index, u32 id, void *data)
2829f599f35SMing Qian {
2839f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2849f599f35SMing Qian 
2859f599f35SMing Qian 	if (!ops || !ops->pack_cmd)
2869f599f35SMing Qian 		return -EINVAL;
2879f599f35SMing Qian 	return ops->pack_cmd(pkt, index, id, data);
2889f599f35SMing Qian }
2899f599f35SMing Qian 
vpu_iface_convert_msg_id(struct vpu_core * core,u32 msg_id)2909f599f35SMing Qian static inline int vpu_iface_convert_msg_id(struct vpu_core *core, u32 msg_id)
2919f599f35SMing Qian {
2929f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
2939f599f35SMing Qian 
2949f599f35SMing Qian 	if (!ops || !ops->convert_msg_id)
2959f599f35SMing Qian 		return -EINVAL;
2969f599f35SMing Qian 
2979f599f35SMing Qian 	return ops->convert_msg_id(msg_id);
2989f599f35SMing Qian }
2999f599f35SMing Qian 
vpu_iface_unpack_msg_data(struct vpu_core * core,struct vpu_rpc_event * pkt,void * data)3009f599f35SMing Qian static inline int vpu_iface_unpack_msg_data(struct vpu_core *core,
3019f599f35SMing Qian 					    struct vpu_rpc_event *pkt, void *data)
3029f599f35SMing Qian {
3039f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
3049f599f35SMing Qian 
3059f599f35SMing Qian 	if (!ops || !ops->unpack_msg_data)
3069f599f35SMing Qian 		return -EINVAL;
3079f599f35SMing Qian 
3089f599f35SMing Qian 	return ops->unpack_msg_data(pkt, data);
3099f599f35SMing Qian }
3109f599f35SMing Qian 
vpu_iface_input_frame(struct vpu_inst * inst,struct vb2_buffer * vb)3119f599f35SMing Qian static inline int vpu_iface_input_frame(struct vpu_inst *inst,
3129f599f35SMing Qian 					struct vb2_buffer *vb)
3139f599f35SMing Qian {
3149f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
315*e670f5d6SMing Qian 	int ret;
3169f599f35SMing Qian 
3179f599f35SMing Qian 	if (!ops || !ops->input_frame)
3189f599f35SMing Qian 		return -EINVAL;
3199f599f35SMing Qian 
320*e670f5d6SMing Qian 	ret = ops->input_frame(inst->core->iface, inst, vb);
321*e670f5d6SMing Qian 	if (ret < 0)
322*e670f5d6SMing Qian 		return ret;
323*e670f5d6SMing Qian 	inst->total_input_count++;
324*e670f5d6SMing Qian 	return ret;
3259f599f35SMing Qian }
3269f599f35SMing Qian 
vpu_iface_config_memory_resource(struct vpu_inst * inst,u32 type,u32 index,struct vpu_buffer * buf)3279f599f35SMing Qian static inline int vpu_iface_config_memory_resource(struct vpu_inst *inst,
3289f599f35SMing Qian 						   u32 type,
3299f599f35SMing Qian 						   u32 index,
3309f599f35SMing Qian 						   struct vpu_buffer *buf)
3319f599f35SMing Qian {
3329f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
3339f599f35SMing Qian 
3349f599f35SMing Qian 	if (!ops || !ops->config_memory_resource || inst->id < 0)
3359f599f35SMing Qian 		return -EINVAL;
3369f599f35SMing Qian 
3379f599f35SMing Qian 	return ops->config_memory_resource(inst->core->iface,
3389f599f35SMing Qian 					inst->id,
3399f599f35SMing Qian 					type, index, buf);
3409f599f35SMing Qian }
3419f599f35SMing Qian 
vpu_iface_config_stream_buffer(struct vpu_inst * inst,struct vpu_buffer * buf)3429f599f35SMing Qian static inline int vpu_iface_config_stream_buffer(struct vpu_inst *inst,
3439f599f35SMing Qian 						 struct vpu_buffer *buf)
3449f599f35SMing Qian {
3459f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
3469f599f35SMing Qian 
3479f599f35SMing Qian 	if (!ops || !ops->config_stream_buffer || inst->id < 0)
3489f599f35SMing Qian 		return -EINVAL;
3499f599f35SMing Qian 
350a9f7224cSMing Qian 	if ((buf->phys % 4) || (buf->length % 4))
351a9f7224cSMing Qian 		return -EINVAL;
352a9f7224cSMing Qian 	if (buf->phys + buf->length > (u64)UINT_MAX)
353a9f7224cSMing Qian 		return -EINVAL;
354a9f7224cSMing Qian 
3559f599f35SMing Qian 	return ops->config_stream_buffer(inst->core->iface, inst->id, buf);
3569f599f35SMing Qian }
3579f599f35SMing Qian 
vpu_iface_update_stream_buffer(struct vpu_inst * inst,u32 ptr,bool write)3589f599f35SMing Qian static inline int vpu_iface_update_stream_buffer(struct vpu_inst *inst,
3599f599f35SMing Qian 						 u32 ptr, bool write)
3609f599f35SMing Qian {
3619f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
3629f599f35SMing Qian 
3639f599f35SMing Qian 	if (!ops || !ops->update_stream_buffer || inst->id < 0)
3649f599f35SMing Qian 		return -EINVAL;
3659f599f35SMing Qian 
3669f599f35SMing Qian 	return ops->update_stream_buffer(inst->core->iface, inst->id, ptr, write);
3679f599f35SMing Qian }
3689f599f35SMing Qian 
vpu_iface_get_stream_buffer_desc(struct vpu_inst * inst,struct vpu_rpc_buffer_desc * desc)3699f599f35SMing Qian static inline int vpu_iface_get_stream_buffer_desc(struct vpu_inst *inst,
3709f599f35SMing Qian 						   struct vpu_rpc_buffer_desc *desc)
3719f599f35SMing Qian {
3729f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
3739f599f35SMing Qian 
3749f599f35SMing Qian 	if (!ops || !ops->get_stream_buffer_desc || inst->id < 0)
3759f599f35SMing Qian 		return -EINVAL;
3769f599f35SMing Qian 
3779f599f35SMing Qian 	if (!desc)
3789f599f35SMing Qian 		return 0;
3799f599f35SMing Qian 
3809f599f35SMing Qian 	return ops->get_stream_buffer_desc(inst->core->iface, inst->id, desc);
3819f599f35SMing Qian }
3829f599f35SMing Qian 
vpu_iface_get_version(struct vpu_core * core)3839f599f35SMing Qian static inline u32 vpu_iface_get_version(struct vpu_core *core)
3849f599f35SMing Qian {
3859f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
3869f599f35SMing Qian 
3879f599f35SMing Qian 	if (!ops || !ops->get_version)
3889f599f35SMing Qian 		return 0;
3899f599f35SMing Qian 
3909f599f35SMing Qian 	return ops->get_version(core->iface);
3919f599f35SMing Qian }
3929f599f35SMing Qian 
vpu_iface_get_max_instance_count(struct vpu_core * core)3939f599f35SMing Qian static inline u32 vpu_iface_get_max_instance_count(struct vpu_core *core)
3949f599f35SMing Qian {
3959f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(core);
3969f599f35SMing Qian 
3979f599f35SMing Qian 	if (!ops || !ops->get_max_instance_count)
3989f599f35SMing Qian 		return 0;
3999f599f35SMing Qian 
4009f599f35SMing Qian 	return ops->get_max_instance_count(core->iface);
4019f599f35SMing Qian }
4029f599f35SMing Qian 
vpu_iface_set_encode_params(struct vpu_inst * inst,struct vpu_encode_params * params,u32 update)4039f599f35SMing Qian static inline int vpu_iface_set_encode_params(struct vpu_inst *inst,
4049f599f35SMing Qian 					      struct vpu_encode_params *params, u32 update)
4059f599f35SMing Qian {
4069f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
4079f599f35SMing Qian 
4089f599f35SMing Qian 	if (!ops || !ops->set_encode_params || inst->id < 0)
4099f599f35SMing Qian 		return -EINVAL;
4109f599f35SMing Qian 
4119f599f35SMing Qian 	return ops->set_encode_params(inst->core->iface, inst->id, params, update);
4129f599f35SMing Qian }
4139f599f35SMing Qian 
vpu_iface_set_decode_params(struct vpu_inst * inst,struct vpu_decode_params * params,u32 update)4149f599f35SMing Qian static inline int vpu_iface_set_decode_params(struct vpu_inst *inst,
4159f599f35SMing Qian 					      struct vpu_decode_params *params, u32 update)
4169f599f35SMing Qian {
4179f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
4189f599f35SMing Qian 
4199f599f35SMing Qian 	if (!ops || !ops->set_decode_params  || inst->id < 0)
4209f599f35SMing Qian 		return -EINVAL;
4219f599f35SMing Qian 
4229f599f35SMing Qian 	return ops->set_decode_params(inst->core->iface, inst->id, params, update);
4239f599f35SMing Qian }
4249f599f35SMing Qian 
vpu_iface_add_scode(struct vpu_inst * inst,u32 scode_type)4259f599f35SMing Qian static inline int vpu_iface_add_scode(struct vpu_inst *inst, u32 scode_type)
4269f599f35SMing Qian {
4279f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
4289f599f35SMing Qian 
4299f599f35SMing Qian 	if (!ops || !ops->add_scode  || inst->id < 0)
4309f599f35SMing Qian 		return -EINVAL;
4319f599f35SMing Qian 
4329f599f35SMing Qian 	return ops->add_scode(inst->core->iface, inst->id,
4339f599f35SMing Qian 				&inst->stream_buffer,
4349f599f35SMing Qian 				inst->out_format.pixfmt,
4359f599f35SMing Qian 				scode_type);
4369f599f35SMing Qian }
4379f599f35SMing Qian 
vpu_iface_pre_send_cmd(struct vpu_inst * inst)4389f599f35SMing Qian static inline int vpu_iface_pre_send_cmd(struct vpu_inst *inst)
4399f599f35SMing Qian {
4409f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
4419f599f35SMing Qian 
4429f599f35SMing Qian 	if (ops && ops->pre_send_cmd && inst->id >= 0)
4439f599f35SMing Qian 		return ops->pre_send_cmd(inst->core->iface, inst->id);
4449f599f35SMing Qian 	return 0;
4459f599f35SMing Qian }
4469f599f35SMing Qian 
vpu_iface_post_send_cmd(struct vpu_inst * inst)4479f599f35SMing Qian static inline int vpu_iface_post_send_cmd(struct vpu_inst *inst)
4489f599f35SMing Qian {
4499f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
4509f599f35SMing Qian 
4519f599f35SMing Qian 	if (ops && ops->post_send_cmd && inst->id >= 0)
4529f599f35SMing Qian 		return ops->post_send_cmd(inst->core->iface, inst->id);
4539f599f35SMing Qian 	return 0;
4549f599f35SMing Qian }
4559f599f35SMing Qian 
vpu_iface_init_instance(struct vpu_inst * inst)4569f599f35SMing Qian static inline int vpu_iface_init_instance(struct vpu_inst *inst)
4579f599f35SMing Qian {
4589f599f35SMing Qian 	struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
4599f599f35SMing Qian 
4609f599f35SMing Qian 	if (ops && ops->init_instance && inst->id >= 0)
4619f599f35SMing Qian 		return ops->init_instance(inst->core->iface, inst->id);
4629f599f35SMing Qian 
4639f599f35SMing Qian 	return 0;
4649f599f35SMing Qian }
4659f599f35SMing Qian 
4669f599f35SMing Qian #endif
467