162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2020-2021 NXP 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _AMPHION_VPU_RPC_H 762306a36Sopenharmony_ci#define _AMPHION_VPU_RPC_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <media/videobuf2-core.h> 1062306a36Sopenharmony_ci#include "vpu_codec.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct vpu_rpc_buffer_desc { 1362306a36Sopenharmony_ci u32 wptr; 1462306a36Sopenharmony_ci u32 rptr; 1562306a36Sopenharmony_ci u32 start; 1662306a36Sopenharmony_ci u32 end; 1762306a36Sopenharmony_ci}; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistruct vpu_shared_addr { 2062306a36Sopenharmony_ci void *iface; 2162306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *cmd_desc; 2262306a36Sopenharmony_ci void *cmd_mem_vir; 2362306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *msg_desc; 2462306a36Sopenharmony_ci void *msg_mem_vir; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci unsigned long boot_addr; 2762306a36Sopenharmony_ci struct vpu_core *core; 2862306a36Sopenharmony_ci void *priv; 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistruct vpu_rpc_event_header { 3262306a36Sopenharmony_ci u32 index; 3362306a36Sopenharmony_ci u32 id; 3462306a36Sopenharmony_ci u32 num; 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistruct vpu_rpc_event { 3862306a36Sopenharmony_ci struct vpu_rpc_event_header hdr; 3962306a36Sopenharmony_ci u32 data[128]; 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct vpu_iface_ops { 4362306a36Sopenharmony_ci bool (*check_codec)(enum vpu_core_type type); 4462306a36Sopenharmony_ci bool (*check_fmt)(enum vpu_core_type type, u32 pixelfmt); 4562306a36Sopenharmony_ci u32 (*get_data_size)(void); 4662306a36Sopenharmony_ci int (*check_memory_region)(dma_addr_t base, dma_addr_t addr, u32 size); 4762306a36Sopenharmony_ci int (*boot_core)(struct vpu_core *core); 4862306a36Sopenharmony_ci int (*shutdown_core)(struct vpu_core *core); 4962306a36Sopenharmony_ci int (*restore_core)(struct vpu_core *core); 5062306a36Sopenharmony_ci int (*get_power_state)(struct vpu_core *core); 5162306a36Sopenharmony_ci int (*on_firmware_loaded)(struct vpu_core *core); 5262306a36Sopenharmony_ci void (*init_rpc)(struct vpu_shared_addr *shared, 5362306a36Sopenharmony_ci struct vpu_buffer *rpc, dma_addr_t boot_addr); 5462306a36Sopenharmony_ci void (*set_log_buf)(struct vpu_shared_addr *shared, 5562306a36Sopenharmony_ci struct vpu_buffer *log); 5662306a36Sopenharmony_ci void (*set_system_cfg)(struct vpu_shared_addr *shared, 5762306a36Sopenharmony_ci u32 regs_base, void __iomem *regs, u32 index); 5862306a36Sopenharmony_ci void (*set_stream_cfg)(struct vpu_shared_addr *shared, u32 index); 5962306a36Sopenharmony_ci u32 (*get_version)(struct vpu_shared_addr *shared); 6062306a36Sopenharmony_ci u32 (*get_max_instance_count)(struct vpu_shared_addr *shared); 6162306a36Sopenharmony_ci int (*get_stream_buffer_size)(struct vpu_shared_addr *shared); 6262306a36Sopenharmony_ci int (*send_cmd_buf)(struct vpu_shared_addr *shared, 6362306a36Sopenharmony_ci struct vpu_rpc_event *cmd); 6462306a36Sopenharmony_ci int (*receive_msg_buf)(struct vpu_shared_addr *shared, 6562306a36Sopenharmony_ci struct vpu_rpc_event *msg); 6662306a36Sopenharmony_ci int (*pack_cmd)(struct vpu_rpc_event *pkt, u32 index, u32 id, void *data); 6762306a36Sopenharmony_ci int (*convert_msg_id)(u32 msg_id); 6862306a36Sopenharmony_ci int (*unpack_msg_data)(struct vpu_rpc_event *pkt, void *data); 6962306a36Sopenharmony_ci int (*input_frame)(struct vpu_shared_addr *shared, 7062306a36Sopenharmony_ci struct vpu_inst *inst, struct vb2_buffer *vb); 7162306a36Sopenharmony_ci int (*config_memory_resource)(struct vpu_shared_addr *shared, 7262306a36Sopenharmony_ci u32 instance, 7362306a36Sopenharmony_ci u32 type, 7462306a36Sopenharmony_ci u32 index, 7562306a36Sopenharmony_ci struct vpu_buffer *buf); 7662306a36Sopenharmony_ci int (*config_stream_buffer)(struct vpu_shared_addr *shared, 7762306a36Sopenharmony_ci u32 instance, 7862306a36Sopenharmony_ci struct vpu_buffer *buf); 7962306a36Sopenharmony_ci int (*update_stream_buffer)(struct vpu_shared_addr *shared, 8062306a36Sopenharmony_ci u32 instance, u32 ptr, bool write); 8162306a36Sopenharmony_ci int (*get_stream_buffer_desc)(struct vpu_shared_addr *shared, 8262306a36Sopenharmony_ci u32 instance, 8362306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *desc); 8462306a36Sopenharmony_ci int (*set_encode_params)(struct vpu_shared_addr *shared, 8562306a36Sopenharmony_ci u32 instance, 8662306a36Sopenharmony_ci struct vpu_encode_params *params, 8762306a36Sopenharmony_ci u32 update); 8862306a36Sopenharmony_ci int (*set_decode_params)(struct vpu_shared_addr *shared, 8962306a36Sopenharmony_ci u32 instance, 9062306a36Sopenharmony_ci struct vpu_decode_params *params, 9162306a36Sopenharmony_ci u32 update); 9262306a36Sopenharmony_ci int (*add_scode)(struct vpu_shared_addr *shared, 9362306a36Sopenharmony_ci u32 instance, 9462306a36Sopenharmony_ci struct vpu_buffer *stream_buffer, 9562306a36Sopenharmony_ci u32 pixelformat, 9662306a36Sopenharmony_ci u32 scode_type); 9762306a36Sopenharmony_ci int (*pre_send_cmd)(struct vpu_shared_addr *shared, u32 instance); 9862306a36Sopenharmony_ci int (*post_send_cmd)(struct vpu_shared_addr *shared, u32 instance); 9962306a36Sopenharmony_ci int (*init_instance)(struct vpu_shared_addr *shared, u32 instance); 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cienum { 10362306a36Sopenharmony_ci VPU_CORE_MEMORY_INVALID = 0, 10462306a36Sopenharmony_ci VPU_CORE_MEMORY_CACHED, 10562306a36Sopenharmony_ci VPU_CORE_MEMORY_UNCACHED 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistruct vpu_rpc_region_t { 10962306a36Sopenharmony_ci dma_addr_t start; 11062306a36Sopenharmony_ci dma_addr_t end; 11162306a36Sopenharmony_ci dma_addr_t type; 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistruct vpu_iface_ops *vpu_core_get_iface(struct vpu_core *core); 11562306a36Sopenharmony_cistruct vpu_iface_ops *vpu_inst_get_iface(struct vpu_inst *inst); 11662306a36Sopenharmony_ciint vpu_iface_check_memory_region(struct vpu_core *core, dma_addr_t addr, u32 size); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic inline bool vpu_iface_check_codec(struct vpu_core *core) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci if (ops && ops->check_codec) 12362306a36Sopenharmony_ci return ops->check_codec(core->type); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci return true; 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic inline bool vpu_iface_check_format(struct vpu_inst *inst, u32 pixelfmt) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_inst_get_iface(inst); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci if (ops && ops->check_fmt) 13362306a36Sopenharmony_ci return ops->check_fmt(inst->type, pixelfmt); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci return true; 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistatic inline int vpu_iface_boot_core(struct vpu_core *core) 13962306a36Sopenharmony_ci{ 14062306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci if (ops && ops->boot_core) 14362306a36Sopenharmony_ci return ops->boot_core(core); 14462306a36Sopenharmony_ci return 0; 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistatic inline int vpu_iface_get_power_state(struct vpu_core *core) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci if (ops && ops->get_power_state) 15262306a36Sopenharmony_ci return ops->get_power_state(core); 15362306a36Sopenharmony_ci return 1; 15462306a36Sopenharmony_ci} 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic inline int vpu_iface_shutdown_core(struct vpu_core *core) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci if (ops && ops->shutdown_core) 16162306a36Sopenharmony_ci return ops->shutdown_core(core); 16262306a36Sopenharmony_ci return 0; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic inline int vpu_iface_restore_core(struct vpu_core *core) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci if (ops && ops->restore_core) 17062306a36Sopenharmony_ci return ops->restore_core(core); 17162306a36Sopenharmony_ci return 0; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline int vpu_iface_on_firmware_loaded(struct vpu_core *core) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci if (ops && ops->on_firmware_loaded) 17962306a36Sopenharmony_ci return ops->on_firmware_loaded(core); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci return 0; 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistatic inline u32 vpu_iface_get_data_size(struct vpu_core *core) 18562306a36Sopenharmony_ci{ 18662306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci if (!ops || !ops->get_data_size) 18962306a36Sopenharmony_ci return 0; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci return ops->get_data_size(); 19262306a36Sopenharmony_ci} 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistatic inline int vpu_iface_init(struct vpu_core *core, 19562306a36Sopenharmony_ci struct vpu_shared_addr *shared, 19662306a36Sopenharmony_ci struct vpu_buffer *rpc, 19762306a36Sopenharmony_ci dma_addr_t boot_addr) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci if (!ops || !ops->init_rpc) 20262306a36Sopenharmony_ci return -EINVAL; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci ops->init_rpc(shared, rpc, boot_addr); 20562306a36Sopenharmony_ci core->iface = shared; 20662306a36Sopenharmony_ci shared->core = core; 20762306a36Sopenharmony_ci if (rpc->bytesused > rpc->length) 20862306a36Sopenharmony_ci return -ENOSPC; 20962306a36Sopenharmony_ci return 0; 21062306a36Sopenharmony_ci} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistatic inline int vpu_iface_set_log_buf(struct vpu_core *core, 21362306a36Sopenharmony_ci struct vpu_buffer *log) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci if (!ops) 21862306a36Sopenharmony_ci return -EINVAL; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci if (ops->set_log_buf) 22162306a36Sopenharmony_ci ops->set_log_buf(core->iface, log); 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci return 0; 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic inline int vpu_iface_config_system(struct vpu_core *core, u32 regs_base, void __iomem *regs) 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci if (!ops) 23162306a36Sopenharmony_ci return -EINVAL; 23262306a36Sopenharmony_ci if (ops->set_system_cfg) 23362306a36Sopenharmony_ci ops->set_system_cfg(core->iface, regs_base, regs, core->id); 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci return 0; 23662306a36Sopenharmony_ci} 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistatic inline int vpu_iface_get_stream_buffer_size(struct vpu_core *core) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci if (!ops || !ops->get_stream_buffer_size) 24362306a36Sopenharmony_ci return 0; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci return ops->get_stream_buffer_size(core->iface); 24662306a36Sopenharmony_ci} 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic inline int vpu_iface_config_stream(struct vpu_inst *inst) 24962306a36Sopenharmony_ci{ 25062306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci if (!ops || inst->id < 0) 25362306a36Sopenharmony_ci return -EINVAL; 25462306a36Sopenharmony_ci if (ops->set_stream_cfg) 25562306a36Sopenharmony_ci ops->set_stream_cfg(inst->core->iface, inst->id); 25662306a36Sopenharmony_ci return 0; 25762306a36Sopenharmony_ci} 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistatic inline int vpu_iface_send_cmd(struct vpu_core *core, struct vpu_rpc_event *cmd) 26062306a36Sopenharmony_ci{ 26162306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci if (!ops || !ops->send_cmd_buf) 26462306a36Sopenharmony_ci return -EINVAL; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci return ops->send_cmd_buf(core->iface, cmd); 26762306a36Sopenharmony_ci} 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_cistatic inline int vpu_iface_receive_msg(struct vpu_core *core, struct vpu_rpc_event *msg) 27062306a36Sopenharmony_ci{ 27162306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci if (!ops || !ops->receive_msg_buf) 27462306a36Sopenharmony_ci return -EINVAL; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci return ops->receive_msg_buf(core->iface, msg); 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cistatic inline int vpu_iface_pack_cmd(struct vpu_core *core, 28062306a36Sopenharmony_ci struct vpu_rpc_event *pkt, 28162306a36Sopenharmony_ci u32 index, u32 id, void *data) 28262306a36Sopenharmony_ci{ 28362306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci if (!ops || !ops->pack_cmd) 28662306a36Sopenharmony_ci return -EINVAL; 28762306a36Sopenharmony_ci return ops->pack_cmd(pkt, index, id, data); 28862306a36Sopenharmony_ci} 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistatic inline int vpu_iface_convert_msg_id(struct vpu_core *core, u32 msg_id) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci if (!ops || !ops->convert_msg_id) 29562306a36Sopenharmony_ci return -EINVAL; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci return ops->convert_msg_id(msg_id); 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistatic inline int vpu_iface_unpack_msg_data(struct vpu_core *core, 30162306a36Sopenharmony_ci struct vpu_rpc_event *pkt, void *data) 30262306a36Sopenharmony_ci{ 30362306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci if (!ops || !ops->unpack_msg_data) 30662306a36Sopenharmony_ci return -EINVAL; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci return ops->unpack_msg_data(pkt, data); 30962306a36Sopenharmony_ci} 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistatic inline int vpu_iface_input_frame(struct vpu_inst *inst, 31262306a36Sopenharmony_ci struct vb2_buffer *vb) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 31562306a36Sopenharmony_ci int ret; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci if (!ops || !ops->input_frame) 31862306a36Sopenharmony_ci return -EINVAL; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci ret = ops->input_frame(inst->core->iface, inst, vb); 32162306a36Sopenharmony_ci if (ret < 0) 32262306a36Sopenharmony_ci return ret; 32362306a36Sopenharmony_ci inst->total_input_count++; 32462306a36Sopenharmony_ci return ret; 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cistatic inline int vpu_iface_config_memory_resource(struct vpu_inst *inst, 32862306a36Sopenharmony_ci u32 type, 32962306a36Sopenharmony_ci u32 index, 33062306a36Sopenharmony_ci struct vpu_buffer *buf) 33162306a36Sopenharmony_ci{ 33262306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci if (!ops || !ops->config_memory_resource || inst->id < 0) 33562306a36Sopenharmony_ci return -EINVAL; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci return ops->config_memory_resource(inst->core->iface, 33862306a36Sopenharmony_ci inst->id, 33962306a36Sopenharmony_ci type, index, buf); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic inline int vpu_iface_config_stream_buffer(struct vpu_inst *inst, 34362306a36Sopenharmony_ci struct vpu_buffer *buf) 34462306a36Sopenharmony_ci{ 34562306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci if (!ops || !ops->config_stream_buffer || inst->id < 0) 34862306a36Sopenharmony_ci return -EINVAL; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci if ((buf->phys % 4) || (buf->length % 4)) 35162306a36Sopenharmony_ci return -EINVAL; 35262306a36Sopenharmony_ci if (buf->phys + buf->length > (u64)UINT_MAX) 35362306a36Sopenharmony_ci return -EINVAL; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci return ops->config_stream_buffer(inst->core->iface, inst->id, buf); 35662306a36Sopenharmony_ci} 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_cistatic inline int vpu_iface_update_stream_buffer(struct vpu_inst *inst, 35962306a36Sopenharmony_ci u32 ptr, bool write) 36062306a36Sopenharmony_ci{ 36162306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci if (!ops || !ops->update_stream_buffer || inst->id < 0) 36462306a36Sopenharmony_ci return -EINVAL; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci return ops->update_stream_buffer(inst->core->iface, inst->id, ptr, write); 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistatic inline int vpu_iface_get_stream_buffer_desc(struct vpu_inst *inst, 37062306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *desc) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci if (!ops || !ops->get_stream_buffer_desc || inst->id < 0) 37562306a36Sopenharmony_ci return -EINVAL; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci if (!desc) 37862306a36Sopenharmony_ci return 0; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci return ops->get_stream_buffer_desc(inst->core->iface, inst->id, desc); 38162306a36Sopenharmony_ci} 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic inline u32 vpu_iface_get_version(struct vpu_core *core) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci if (!ops || !ops->get_version) 38862306a36Sopenharmony_ci return 0; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci return ops->get_version(core->iface); 39162306a36Sopenharmony_ci} 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistatic inline u32 vpu_iface_get_max_instance_count(struct vpu_core *core) 39462306a36Sopenharmony_ci{ 39562306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(core); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci if (!ops || !ops->get_max_instance_count) 39862306a36Sopenharmony_ci return 0; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci return ops->get_max_instance_count(core->iface); 40162306a36Sopenharmony_ci} 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic inline int vpu_iface_set_encode_params(struct vpu_inst *inst, 40462306a36Sopenharmony_ci struct vpu_encode_params *params, u32 update) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci if (!ops || !ops->set_encode_params || inst->id < 0) 40962306a36Sopenharmony_ci return -EINVAL; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci return ops->set_encode_params(inst->core->iface, inst->id, params, update); 41262306a36Sopenharmony_ci} 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_cistatic inline int vpu_iface_set_decode_params(struct vpu_inst *inst, 41562306a36Sopenharmony_ci struct vpu_decode_params *params, u32 update) 41662306a36Sopenharmony_ci{ 41762306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci if (!ops || !ops->set_decode_params || inst->id < 0) 42062306a36Sopenharmony_ci return -EINVAL; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci return ops->set_decode_params(inst->core->iface, inst->id, params, update); 42362306a36Sopenharmony_ci} 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_cistatic inline int vpu_iface_add_scode(struct vpu_inst *inst, u32 scode_type) 42662306a36Sopenharmony_ci{ 42762306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci if (!ops || !ops->add_scode || inst->id < 0) 43062306a36Sopenharmony_ci return -EINVAL; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci return ops->add_scode(inst->core->iface, inst->id, 43362306a36Sopenharmony_ci &inst->stream_buffer, 43462306a36Sopenharmony_ci inst->out_format.pixfmt, 43562306a36Sopenharmony_ci scode_type); 43662306a36Sopenharmony_ci} 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic inline int vpu_iface_pre_send_cmd(struct vpu_inst *inst) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci if (ops && ops->pre_send_cmd && inst->id >= 0) 44362306a36Sopenharmony_ci return ops->pre_send_cmd(inst->core->iface, inst->id); 44462306a36Sopenharmony_ci return 0; 44562306a36Sopenharmony_ci} 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistatic inline int vpu_iface_post_send_cmd(struct vpu_inst *inst) 44862306a36Sopenharmony_ci{ 44962306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci if (ops && ops->post_send_cmd && inst->id >= 0) 45262306a36Sopenharmony_ci return ops->post_send_cmd(inst->core->iface, inst->id); 45362306a36Sopenharmony_ci return 0; 45462306a36Sopenharmony_ci} 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistatic inline int vpu_iface_init_instance(struct vpu_inst *inst) 45762306a36Sopenharmony_ci{ 45862306a36Sopenharmony_ci struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci if (ops && ops->init_instance && inst->id >= 0) 46162306a36Sopenharmony_ci return ops->init_instance(inst->core->iface, inst->id); 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci return 0; 46462306a36Sopenharmony_ci} 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci#endif 467