11a73374aSStanimir Varbanov /* SPDX-License-Identifier: GPL-2.0 */
21a73374aSStanimir Varbanov /* Copyright (C) 2018 Linaro Ltd. */
31a73374aSStanimir Varbanov #ifndef __VENUS_HFI_PARSER_H__
41a73374aSStanimir Varbanov #define __VENUS_HFI_PARSER_H__
51a73374aSStanimir Varbanov 
61a73374aSStanimir Varbanov #include "core.h"
71a73374aSStanimir Varbanov 
81a73374aSStanimir Varbanov u32 hfi_parser(struct venus_core *core, struct venus_inst *inst,
91a73374aSStanimir Varbanov 	       void *buf, u32 size);
101a73374aSStanimir Varbanov 
111a73374aSStanimir Varbanov #define WHICH_CAP_MIN	0
121a73374aSStanimir Varbanov #define WHICH_CAP_MAX	1
131a73374aSStanimir Varbanov #define WHICH_CAP_STEP	2
141a73374aSStanimir Varbanov 
get_cap(struct venus_inst * inst,u32 type,u32 which)151a73374aSStanimir Varbanov static inline u32 get_cap(struct venus_inst *inst, u32 type, u32 which)
161a73374aSStanimir Varbanov {
171a73374aSStanimir Varbanov 	struct venus_core *core = inst->core;
181a73374aSStanimir Varbanov 	struct hfi_capability *cap = NULL;
198f3b41dcSStanimir Varbanov 	struct hfi_plat_caps *caps;
201a73374aSStanimir Varbanov 	unsigned int i;
211a73374aSStanimir Varbanov 
221a73374aSStanimir Varbanov 	caps = venus_caps_by_codec(core, inst->hfi_codec, inst->session_type);
231a73374aSStanimir Varbanov 	if (!caps)
241a73374aSStanimir Varbanov 		return 0;
251a73374aSStanimir Varbanov 
261a73374aSStanimir Varbanov 	for (i = 0; i < caps->num_caps; i++) {
271a73374aSStanimir Varbanov 		if (caps->caps[i].capability_type == type) {
281a73374aSStanimir Varbanov 			cap = &caps->caps[i];
291a73374aSStanimir Varbanov 			break;
301a73374aSStanimir Varbanov 		}
311a73374aSStanimir Varbanov 	}
321a73374aSStanimir Varbanov 
331a73374aSStanimir Varbanov 	if (!cap)
341a73374aSStanimir Varbanov 		return 0;
351a73374aSStanimir Varbanov 
361a73374aSStanimir Varbanov 	switch (which) {
371a73374aSStanimir Varbanov 	case WHICH_CAP_MIN:
381a73374aSStanimir Varbanov 		return cap->min;
391a73374aSStanimir Varbanov 	case WHICH_CAP_MAX:
401a73374aSStanimir Varbanov 		return cap->max;
411a73374aSStanimir Varbanov 	case WHICH_CAP_STEP:
421a73374aSStanimir Varbanov 		return cap->step_size;
431a73374aSStanimir Varbanov 	default:
441a73374aSStanimir Varbanov 		break;
451a73374aSStanimir Varbanov 	}
461a73374aSStanimir Varbanov 
471a73374aSStanimir Varbanov 	return 0;
481a73374aSStanimir Varbanov }
491a73374aSStanimir Varbanov 
cap_min(struct venus_inst * inst,u32 type)501a73374aSStanimir Varbanov static inline u32 cap_min(struct venus_inst *inst, u32 type)
511a73374aSStanimir Varbanov {
521a73374aSStanimir Varbanov 	return get_cap(inst, type, WHICH_CAP_MIN);
531a73374aSStanimir Varbanov }
541a73374aSStanimir Varbanov 
cap_max(struct venus_inst * inst,u32 type)551a73374aSStanimir Varbanov static inline u32 cap_max(struct venus_inst *inst, u32 type)
561a73374aSStanimir Varbanov {
571a73374aSStanimir Varbanov 	return get_cap(inst, type, WHICH_CAP_MAX);
581a73374aSStanimir Varbanov }
591a73374aSStanimir Varbanov 
cap_step(struct venus_inst * inst,u32 type)601a73374aSStanimir Varbanov static inline u32 cap_step(struct venus_inst *inst, u32 type)
611a73374aSStanimir Varbanov {
621a73374aSStanimir Varbanov 	return get_cap(inst, type, WHICH_CAP_STEP);
631a73374aSStanimir Varbanov }
641a73374aSStanimir Varbanov 
frame_width_min(struct venus_inst * inst)651a73374aSStanimir Varbanov static inline u32 frame_width_min(struct venus_inst *inst)
661a73374aSStanimir Varbanov {
671a73374aSStanimir Varbanov 	return cap_min(inst, HFI_CAPABILITY_FRAME_WIDTH);
681a73374aSStanimir Varbanov }
691a73374aSStanimir Varbanov 
frame_width_max(struct venus_inst * inst)701a73374aSStanimir Varbanov static inline u32 frame_width_max(struct venus_inst *inst)
711a73374aSStanimir Varbanov {
721a73374aSStanimir Varbanov 	return cap_max(inst, HFI_CAPABILITY_FRAME_WIDTH);
731a73374aSStanimir Varbanov }
741a73374aSStanimir Varbanov 
frame_width_step(struct venus_inst * inst)751a73374aSStanimir Varbanov static inline u32 frame_width_step(struct venus_inst *inst)
761a73374aSStanimir Varbanov {
771a73374aSStanimir Varbanov 	return cap_step(inst, HFI_CAPABILITY_FRAME_WIDTH);
781a73374aSStanimir Varbanov }
791a73374aSStanimir Varbanov 
frame_height_min(struct venus_inst * inst)801a73374aSStanimir Varbanov static inline u32 frame_height_min(struct venus_inst *inst)
811a73374aSStanimir Varbanov {
821a73374aSStanimir Varbanov 	return cap_min(inst, HFI_CAPABILITY_FRAME_HEIGHT);
831a73374aSStanimir Varbanov }
841a73374aSStanimir Varbanov 
frame_height_max(struct venus_inst * inst)851a73374aSStanimir Varbanov static inline u32 frame_height_max(struct venus_inst *inst)
861a73374aSStanimir Varbanov {
871a73374aSStanimir Varbanov 	return cap_max(inst, HFI_CAPABILITY_FRAME_HEIGHT);
881a73374aSStanimir Varbanov }
891a73374aSStanimir Varbanov 
frame_height_step(struct venus_inst * inst)901a73374aSStanimir Varbanov static inline u32 frame_height_step(struct venus_inst *inst)
911a73374aSStanimir Varbanov {
921a73374aSStanimir Varbanov 	return cap_step(inst, HFI_CAPABILITY_FRAME_HEIGHT);
931a73374aSStanimir Varbanov }
941a73374aSStanimir Varbanov 
frate_min(struct venus_inst * inst)951a73374aSStanimir Varbanov static inline u32 frate_min(struct venus_inst *inst)
961a73374aSStanimir Varbanov {
971a73374aSStanimir Varbanov 	return cap_min(inst, HFI_CAPABILITY_FRAMERATE);
981a73374aSStanimir Varbanov }
991a73374aSStanimir Varbanov 
frate_max(struct venus_inst * inst)1001a73374aSStanimir Varbanov static inline u32 frate_max(struct venus_inst *inst)
1011a73374aSStanimir Varbanov {
1021a73374aSStanimir Varbanov 	return cap_max(inst, HFI_CAPABILITY_FRAMERATE);
1031a73374aSStanimir Varbanov }
1041a73374aSStanimir Varbanov 
frate_step(struct venus_inst * inst)1051a73374aSStanimir Varbanov static inline u32 frate_step(struct venus_inst *inst)
1061a73374aSStanimir Varbanov {
1071a73374aSStanimir Varbanov 	return cap_step(inst, HFI_CAPABILITY_FRAMERATE);
1081a73374aSStanimir Varbanov }
1091a73374aSStanimir Varbanov 
core_num_max(struct venus_inst * inst)1104ebf9693SAniket Masule static inline u32 core_num_max(struct venus_inst *inst)
1114ebf9693SAniket Masule {
1124ebf9693SAniket Masule 	return cap_max(inst, HFI_CAPABILITY_MAX_VIDEOCORES);
1134ebf9693SAniket Masule }
1144ebf9693SAniket Masule 
mbs_per_frame_max(struct venus_inst * inst)115*7371093fSStanimir Varbanov static inline u32 mbs_per_frame_max(struct venus_inst *inst)
116*7371093fSStanimir Varbanov {
117*7371093fSStanimir Varbanov 	return cap_max(inst, HFI_CAPABILITY_MBS_PER_FRAME);
118*7371093fSStanimir Varbanov }
119*7371093fSStanimir Varbanov 
1201a73374aSStanimir Varbanov #endif
121