/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (C) 2018 Linaro Ltd. */ #ifndef __VENUS_HFI_PARSER_H__ #define __VENUS_HFI_PARSER_H__ #include "core.h" u32 hfi_parser(struct venus_core *core, struct venus_inst *inst, void *buf, u32 size); #define WHICH_CAP_MIN 0 #define WHICH_CAP_MAX 1 #define WHICH_CAP_STEP 2 static inline u32 get_cap(struct venus_inst *inst, u32 type, u32 which) { struct venus_core *core = inst->core; struct hfi_capability *cap = NULL; struct hfi_plat_caps *caps; unsigned int i; caps = venus_caps_by_codec(core, inst->hfi_codec, inst->session_type); if (!caps) return 0; for (i = 0; i < caps->num_caps; i++) { if (caps->caps[i].capability_type == type) { cap = &caps->caps[i]; break; } } if (!cap) return 0; switch (which) { case WHICH_CAP_MIN: return cap->min; case WHICH_CAP_MAX: return cap->max; case WHICH_CAP_STEP: return cap->step_size; default: break; } return 0; } static inline u32 cap_min(struct venus_inst *inst, u32 type) { return get_cap(inst, type, WHICH_CAP_MIN); } static inline u32 cap_max(struct venus_inst *inst, u32 type) { return get_cap(inst, type, WHICH_CAP_MAX); } static inline u32 cap_step(struct venus_inst *inst, u32 type) { return get_cap(inst, type, WHICH_CAP_STEP); } static inline u32 frame_width_min(struct venus_inst *inst) { return cap_min(inst, HFI_CAPABILITY_FRAME_WIDTH); } static inline u32 frame_width_max(struct venus_inst *inst) { return cap_max(inst, HFI_CAPABILITY_FRAME_WIDTH); } static inline u32 frame_width_step(struct venus_inst *inst) { return cap_step(inst, HFI_CAPABILITY_FRAME_WIDTH); } static inline u32 frame_height_min(struct venus_inst *inst) { return cap_min(inst, HFI_CAPABILITY_FRAME_HEIGHT); } static inline u32 frame_height_max(struct venus_inst *inst) { return cap_max(inst, HFI_CAPABILITY_FRAME_HEIGHT); } static inline u32 frame_height_step(struct venus_inst *inst) { return cap_step(inst, HFI_CAPABILITY_FRAME_HEIGHT); } static inline u32 frate_min(struct venus_inst *inst) { return cap_min(inst, HFI_CAPABILITY_FRAMERATE); } static inline u32 frate_max(struct venus_inst *inst) { return cap_max(inst, HFI_CAPABILITY_FRAMERATE); } static inline u32 frate_step(struct venus_inst *inst) { return cap_step(inst, HFI_CAPABILITY_FRAMERATE); } static inline u32 core_num_max(struct venus_inst *inst) { return cap_max(inst, HFI_CAPABILITY_MAX_VIDEOCORES); } static inline u32 mbs_per_frame_max(struct venus_inst *inst) { return cap_max(inst, HFI_CAPABILITY_MBS_PER_FRAME); } #endif