• Home
  • Raw
  • Download

Lines Matching refs:inst

210 static bool vp9_is_sf_ref_fb(struct vdec_vp9_inst *inst, struct vdec_fb *fb)  in vp9_is_sf_ref_fb()  argument
213 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_is_sf_ref_fb()
223 *inst, void *addr) in vp9_rm_from_fb_use_list()
228 list_for_each_entry(node, &inst->fb_use_list, list) { in vp9_rm_from_fb_use_list()
232 &inst->available_fb_node_list); in vp9_rm_from_fb_use_list()
239 static void vp9_add_to_fb_free_list(struct vdec_vp9_inst *inst, in vp9_add_to_fb_free_list() argument
245 node = list_first_entry_or_null(&inst->available_fb_node_list, in vp9_add_to_fb_free_list()
250 list_move_tail(&node->list, &inst->fb_free_list); in vp9_add_to_fb_free_list()
253 mtk_vcodec_debug(inst, "No free fb node"); in vp9_add_to_fb_free_list()
265 static void vp9_ref_cnt_fb(struct vdec_vp9_inst *inst, int *idx, in vp9_ref_cnt_fb() argument
268 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_ref_cnt_fb()
275 if (!vp9_is_sf_ref_fb(inst, in vp9_ref_cnt_fb()
279 fb = vp9_rm_from_fb_use_list(inst, in vp9_ref_cnt_fb()
281 vp9_add_to_fb_free_list(inst, fb); in vp9_ref_cnt_fb()
292 static void vp9_free_all_sf_ref_fb(struct vdec_vp9_inst *inst) in vp9_free_all_sf_ref_fb() argument
295 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_free_all_sf_ref_fb()
299 mtk_vcodec_mem_free(inst->ctx, in vp9_free_all_sf_ref_fb()
301 mtk_vcodec_mem_free(inst->ctx, in vp9_free_all_sf_ref_fb()
313 static int vp9_get_sf_ref_fb(struct vdec_vp9_inst *inst) in vp9_get_sf_ref_fb() argument
318 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_get_sf_ref_fb()
337 mtk_vcodec_err(inst, "List Full"); in vp9_get_sf_ref_fb()
345 if (mtk_vcodec_mem_alloc(inst->ctx, mem_basy_y)) { in vp9_get_sf_ref_fb()
346 mtk_vcodec_err(inst, "Cannot allocate sf_ref_buf y_buf"); in vp9_get_sf_ref_fb()
354 if (mtk_vcodec_mem_alloc(inst->ctx, mem_basy_c)) { in vp9_get_sf_ref_fb()
355 mtk_vcodec_err(inst, "Cannot allocate sf_ref_fb c_buf"); in vp9_get_sf_ref_fb()
363 static bool vp9_alloc_work_buf(struct vdec_vp9_inst *inst) in vp9_alloc_work_buf() argument
365 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_alloc_work_buf()
373 if (!(inst->ctx->dev->dec_capability & in vp9_alloc_work_buf()
384 mtk_vcodec_err(inst, "Invalid w/h %d/%d", in vp9_alloc_work_buf()
389 mtk_vcodec_debug(inst, "BUF CHG(%d): w/h/sb_w/sb_h=%d/%d/%d/%d", in vp9_alloc_work_buf()
396 mem = &inst->mv_buf; in vp9_alloc_work_buf()
398 mtk_vcodec_mem_free(inst->ctx, mem); in vp9_alloc_work_buf()
402 result = mtk_vcodec_mem_alloc(inst->ctx, mem); in vp9_alloc_work_buf()
405 mtk_vcodec_err(inst, "Cannot allocate mv_buf"); in vp9_alloc_work_buf()
414 mem = &inst->seg_id_buf; in vp9_alloc_work_buf()
416 mtk_vcodec_mem_free(inst->ctx, mem); in vp9_alloc_work_buf()
419 result = mtk_vcodec_mem_alloc(inst->ctx, mem); in vp9_alloc_work_buf()
422 mtk_vcodec_err(inst, "Cannot allocate seg_id_buf"); in vp9_alloc_work_buf()
431 vp9_free_all_sf_ref_fb(inst); in vp9_alloc_work_buf()
432 vsi->sf_next_ref_fb_idx = vp9_get_sf_ref_fb(inst); in vp9_alloc_work_buf()
437 static bool vp9_add_to_fb_disp_list(struct vdec_vp9_inst *inst, in vp9_add_to_fb_disp_list() argument
443 mtk_vcodec_err(inst, "fb == NULL"); in vp9_add_to_fb_disp_list()
447 node = list_first_entry_or_null(&inst->available_fb_node_list, in vp9_add_to_fb_disp_list()
451 list_move_tail(&node->list, &inst->fb_disp_list); in vp9_add_to_fb_disp_list()
453 mtk_vcodec_err(inst, "No available fb node"); in vp9_add_to_fb_disp_list()
461 static void vp9_swap_frm_bufs(struct vdec_vp9_inst *inst) in vp9_swap_frm_bufs() argument
463 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_swap_frm_bufs()
469 vp9_ref_cnt_fb(inst, &vsi->ref_frm_map[ref_index], in vp9_swap_frm_bufs()
477 if (frm_to_show->fb != inst->cur_fb) { in vp9_swap_frm_bufs()
483 (inst->cur_fb->base_y.size >= in vp9_swap_frm_bufs()
485 memcpy((void *)inst->cur_fb->base_y.va, in vp9_swap_frm_bufs()
489 memcpy((void *)inst->cur_fb->base_c.va, in vp9_swap_frm_bufs()
499 mtk_vcodec_err(inst, in vp9_swap_frm_bufs()
501 inst->cur_fb->base_y.size, in vp9_swap_frm_bufs()
504 if (!vp9_is_sf_ref_fb(inst, inst->cur_fb)) { in vp9_swap_frm_bufs()
506 vp9_add_to_fb_disp_list(inst, inst->cur_fb); in vp9_swap_frm_bufs()
509 if (!vp9_is_sf_ref_fb(inst, inst->cur_fb)) { in vp9_swap_frm_bufs()
511 vp9_add_to_fb_disp_list(inst, frm_to_show->fb); in vp9_swap_frm_bufs()
520 inst, vsi->frm_bufs[vsi->new_fb_idx].buf.fb)) { in vp9_swap_frm_bufs()
523 fb = vp9_rm_from_fb_use_list(inst, in vp9_swap_frm_bufs()
526 vp9_add_to_fb_free_list(inst, fb); in vp9_swap_frm_bufs()
537 vsi->sf_next_ref_fb_idx = vp9_get_sf_ref_fb(inst); in vp9_swap_frm_bufs()
540 static bool vp9_wait_dec_end(struct vdec_vp9_inst *inst) in vp9_wait_dec_end() argument
542 struct mtk_vcodec_ctx *ctx = inst->ctx; in vp9_wait_dec_end()
544 mtk_vcodec_wait_for_done_ctx(inst->ctx, in vp9_wait_dec_end()
558 struct vdec_vp9_inst *inst; in vp9_alloc_inst() local
566 inst = mem.va; in vp9_alloc_inst()
567 inst->mem = mem; in vp9_alloc_inst()
569 return inst; in vp9_alloc_inst()
572 static void vp9_free_inst(struct vdec_vp9_inst *inst) in vp9_free_inst() argument
576 mem = inst->mem; in vp9_free_inst()
578 mtk_vcodec_mem_free(inst->ctx, &mem); in vp9_free_inst()
581 static bool vp9_decode_end_proc(struct vdec_vp9_inst *inst) in vp9_decode_end_proc() argument
583 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_decode_end_proc()
587 ret = vp9_wait_dec_end(inst); in vp9_decode_end_proc()
589 mtk_vcodec_err(inst, "Decode failed, Decode Timeout @[%d]", in vp9_decode_end_proc()
594 if (vpu_dec_end(&inst->vpu)) { in vp9_decode_end_proc()
595 mtk_vcodec_err(inst, "vp9_dec_vpu_end failed"); in vp9_decode_end_proc()
598 mtk_vcodec_debug(inst, "Decode Ok @%d (%d/%d)", vsi->frm_num, in vp9_decode_end_proc()
601 mtk_vcodec_debug(inst, "Decode Ok @%d (show_existing_frame)", in vp9_decode_end_proc()
605 vp9_swap_frm_bufs(inst); in vp9_decode_end_proc()
610 static bool vp9_is_last_sub_frm(struct vdec_vp9_inst *inst) in vp9_is_last_sub_frm() argument
612 struct vdec_vp9_vsi *vsi = inst->vsi; in vp9_is_last_sub_frm()
620 static struct vdec_fb *vp9_rm_from_fb_disp_list(struct vdec_vp9_inst *inst) in vp9_rm_from_fb_disp_list() argument
625 node = list_first_entry_or_null(&inst->fb_disp_list, in vp9_rm_from_fb_disp_list()
630 list_move_tail(&node->list, &inst->available_fb_node_list); in vp9_rm_from_fb_disp_list()
631 mtk_vcodec_debug(inst, "[FB] get disp fb %p st=%d", in vp9_rm_from_fb_disp_list()
634 mtk_vcodec_debug(inst, "[FB] there is no disp fb"); in vp9_rm_from_fb_disp_list()
639 static bool vp9_add_to_fb_use_list(struct vdec_vp9_inst *inst, in vp9_add_to_fb_use_list() argument
645 mtk_vcodec_debug(inst, "fb == NULL"); in vp9_add_to_fb_use_list()
649 node = list_first_entry_or_null(&inst->available_fb_node_list, in vp9_add_to_fb_use_list()
653 list_move_tail(&node->list, &inst->fb_use_list); in vp9_add_to_fb_use_list()
655 mtk_vcodec_err(inst, "No free fb node"); in vp9_add_to_fb_use_list()
661 static void vp9_reset(struct vdec_vp9_inst *inst) in vp9_reset() argument
665 list_for_each_entry_safe(node, tmp, &inst->fb_use_list, list) in vp9_reset()
666 list_move_tail(&node->list, &inst->fb_free_list); in vp9_reset()
668 vp9_free_all_sf_ref_fb(inst); in vp9_reset()
669 inst->vsi->sf_next_ref_fb_idx = vp9_get_sf_ref_fb(inst); in vp9_reset()
671 if (vpu_dec_reset(&inst->vpu)) in vp9_reset()
672 mtk_vcodec_err(inst, "vp9_dec_vpu_reset failed"); in vp9_reset()
675 inst->vsi->mv_buf.va = (unsigned long)inst->mv_buf.va; in vp9_reset()
676 inst->vsi->mv_buf.pa = (unsigned long)inst->mv_buf.dma_addr; in vp9_reset()
677 inst->vsi->mv_buf.sz = (unsigned long)inst->mv_buf.size; in vp9_reset()
680 inst->vsi->seg_id_buf.va = (unsigned long)inst->seg_id_buf.va; in vp9_reset()
681 inst->vsi->seg_id_buf.pa = (unsigned long)inst->seg_id_buf.dma_addr; in vp9_reset()
682 inst->vsi->seg_id_buf.sz = (unsigned long)inst->seg_id_buf.size; in vp9_reset()
686 static void init_all_fb_lists(struct vdec_vp9_inst *inst) in init_all_fb_lists() argument
690 INIT_LIST_HEAD(&inst->available_fb_node_list); in init_all_fb_lists()
691 INIT_LIST_HEAD(&inst->fb_use_list); in init_all_fb_lists()
692 INIT_LIST_HEAD(&inst->fb_free_list); in init_all_fb_lists()
693 INIT_LIST_HEAD(&inst->fb_disp_list); in init_all_fb_lists()
695 for (i = 0; i < ARRAY_SIZE(inst->dec_fb); i++) { in init_all_fb_lists()
696 INIT_LIST_HEAD(&inst->dec_fb[i].list); in init_all_fb_lists()
697 inst->dec_fb[i].fb = NULL; in init_all_fb_lists()
698 list_add_tail(&inst->dec_fb[i].list, in init_all_fb_lists()
699 &inst->available_fb_node_list); in init_all_fb_lists()
703 static void get_pic_info(struct vdec_vp9_inst *inst, struct vdec_pic_info *pic) in get_pic_info() argument
705 pic->y_bs_sz = inst->vsi->buf_sz_y_bs; in get_pic_info()
706 pic->c_bs_sz = inst->vsi->buf_sz_c_bs; in get_pic_info()
707 pic->y_len_sz = inst->vsi->buf_len_sz_y; in get_pic_info()
708 pic->c_len_sz = inst->vsi->buf_len_sz_c; in get_pic_info()
710 pic->pic_w = inst->vsi->pic_w; in get_pic_info()
711 pic->pic_h = inst->vsi->pic_h; in get_pic_info()
712 pic->buf_w = inst->vsi->buf_w; in get_pic_info()
713 pic->buf_h = inst->vsi->buf_h; in get_pic_info()
715 mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)", in get_pic_info()
717 mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz, in get_pic_info()
721 static void get_disp_fb(struct vdec_vp9_inst *inst, struct vdec_fb **out_fb) in get_disp_fb() argument
724 *out_fb = vp9_rm_from_fb_disp_list(inst); in get_disp_fb()
729 static void get_free_fb(struct vdec_vp9_inst *inst, struct vdec_fb **out_fb) in get_free_fb() argument
734 node = list_first_entry_or_null(&inst->fb_free_list, in get_free_fb()
737 list_move_tail(&node->list, &inst->available_fb_node_list); in get_free_fb()
740 mtk_vcodec_debug(inst, "[FB] get free fb %p st=%d", in get_free_fb()
743 mtk_vcodec_debug(inst, "[FB] there is no free fb"); in get_free_fb()
749 static int validate_vsi_array_indexes(struct vdec_vp9_inst *inst, in validate_vsi_array_indexes() argument
752 mtk_vcodec_err(inst, "Invalid vsi->sf_frm_idx=%u.", in validate_vsi_array_indexes()
757 mtk_vcodec_err(inst, "Invalid vsi->frm_to_show_idx=%u.", in validate_vsi_array_indexes()
762 mtk_vcodec_err(inst, "Invalid vsi->new_fb_idx=%u.", in validate_vsi_array_indexes()
771 struct vdec_vp9_inst *inst = (struct vdec_vp9_inst *)h_vdec; in vdec_vp9_deinit() local
775 ret = vpu_dec_deinit(&inst->vpu); in vdec_vp9_deinit()
777 mtk_vcodec_err(inst, "vpu_dec_deinit failed"); in vdec_vp9_deinit()
779 mem = &inst->mv_buf; in vdec_vp9_deinit()
781 mtk_vcodec_mem_free(inst->ctx, mem); in vdec_vp9_deinit()
783 mem = &inst->seg_id_buf; in vdec_vp9_deinit()
785 mtk_vcodec_mem_free(inst->ctx, mem); in vdec_vp9_deinit()
787 vp9_free_all_sf_ref_fb(inst); in vdec_vp9_deinit()
788 vp9_free_inst(inst); in vdec_vp9_deinit()
793 struct vdec_vp9_inst *inst; in vdec_vp9_init() local
795 inst = vp9_alloc_inst(ctx); in vdec_vp9_init()
796 if (!inst) in vdec_vp9_init()
799 inst->total_frm_cnt = 0; in vdec_vp9_init()
800 inst->ctx = ctx; in vdec_vp9_init()
802 inst->vpu.id = IPI_VDEC_VP9; in vdec_vp9_init()
803 inst->vpu.dev = ctx->dev->vpu_plat_dev; in vdec_vp9_init()
804 inst->vpu.ctx = ctx; in vdec_vp9_init()
805 inst->vpu.handler = vpu_dec_ipi_handler; in vdec_vp9_init()
807 if (vpu_dec_init(&inst->vpu)) { in vdec_vp9_init()
808 mtk_vcodec_err(inst, "vp9_dec_vpu_init failed"); in vdec_vp9_init()
812 inst->vsi = (struct vdec_vp9_vsi *)inst->vpu.vsi; in vdec_vp9_init()
813 init_all_fb_lists(inst); in vdec_vp9_init()
815 (*h_vdec) = (unsigned long)inst; in vdec_vp9_init()
819 vp9_free_inst(inst); in vdec_vp9_init()
828 struct vdec_vp9_inst *inst = (struct vdec_vp9_inst *)h_vdec; in vdec_vp9_decode() local
829 struct vdec_vp9_vsi *vsi = inst->vsi; in vdec_vp9_decode()
836 mtk_vcodec_debug(inst, "[EOS]"); in vdec_vp9_decode()
837 vp9_reset(inst); in vdec_vp9_decode()
842 mtk_vcodec_err(inst, "bs == NULL"); in vdec_vp9_decode()
846 mtk_vcodec_debug(inst, "Input BS Size = %zu", bs->size); in vdec_vp9_decode()
883 memset(inst->seg_id_buf.va, 0, inst->seg_id_buf.size); in vdec_vp9_decode()
884 ret = vpu_dec_start(&inst->vpu, data, 3); in vdec_vp9_decode()
886 mtk_vcodec_err(inst, "vpu_dec_start failed"); in vdec_vp9_decode()
890 ret = validate_vsi_array_indexes(inst, vsi); in vdec_vp9_decode()
892 mtk_vcodec_err(inst, "Invalid values from VPU."); in vdec_vp9_decode()
897 if (!vp9_alloc_work_buf(inst)) { in vdec_vp9_decode()
907 inst->cur_fb = cur_fb; in vdec_vp9_decode()
909 inst->cur_fb = fb; in vdec_vp9_decode()
911 inst->cur_fb = fb; in vdec_vp9_decode()
914 vsi->frm_bufs[vsi->new_fb_idx].buf.fb = inst->cur_fb; in vdec_vp9_decode()
915 if (!vp9_is_sf_ref_fb(inst, inst->cur_fb)) in vdec_vp9_decode()
916 vp9_add_to_fb_use_list(inst, inst->cur_fb); in vdec_vp9_decode()
918 mtk_vcodec_debug(inst, "[#pic %d]", vsi->frm_num); in vdec_vp9_decode()
921 mtk_vcodec_debug(inst, in vdec_vp9_decode()
927 mtk_vcodec_err(inst, in vdec_vp9_decode()
931 vp9_ref_cnt_fb(inst, &vsi->new_fb_idx, in vdec_vp9_decode()
948 mtk_vcodec_debug(inst, "VDEC_ST_RESOLUTION_CHANGED"); in vdec_vp9_decode()
954 if (vp9_decode_end_proc(inst) != true) { in vdec_vp9_decode()
955 mtk_vcodec_err(inst, "vp9_decode_end_proc"); in vdec_vp9_decode()
960 if (vp9_is_last_sub_frm(inst)) in vdec_vp9_decode()
964 inst->total_frm_cnt++; in vdec_vp9_decode()
968 vp9_add_to_fb_free_list(inst, fb); in vdec_vp9_decode()
973 static void get_crop_info(struct vdec_vp9_inst *inst, struct v4l2_rect *cr) in get_crop_info() argument
977 cr->width = inst->vsi->pic_w; in get_crop_info()
978 cr->height = inst->vsi->pic_h; in get_crop_info()
979 mtk_vcodec_debug(inst, "get crop info l=%d, t=%d, w=%d, h=%d\n", in get_crop_info()
986 struct vdec_vp9_inst *inst = (struct vdec_vp9_inst *)h_vdec; in vdec_vp9_get_param() local
991 get_disp_fb(inst, out); in vdec_vp9_get_param()
994 get_free_fb(inst, out); in vdec_vp9_get_param()
997 get_pic_info(inst, out); in vdec_vp9_get_param()
1003 get_crop_info(inst, out); in vdec_vp9_get_param()
1006 mtk_vcodec_err(inst, "not supported param type %d", type); in vdec_vp9_get_param()