1#include "viddec_emitter.h" 2#include "viddec_fw_workload.h" 3#include "viddec_fw_debug.h" 4 5int32_t viddec_emit_flush_current_wkld(viddec_emitter *emit) 6{ 7 if(emit->cur.data != NULL) 8 { 9 emit->cur.data->num_items = emit->cur.num_items; 10 } 11 if(emit->next.data != NULL) 12 { 13 emit->next.data->num_items = emit->next.num_items; 14 } 15 emit->cur.num_items = emit->next.num_items; 16 emit->next.num_items = 0; 17 if(emit->cur.data != NULL) 18 { 19 emit->cur.data->result = emit->cur.result; 20 } 21 if(emit->next.data != NULL) 22 { 23 emit->next.data->result = emit->next.result; 24 } 25 emit->cur.result = emit->next.result; 26 emit->next.result = 0; 27 return 1; 28} 29 30int32_t viddec_emit_append(viddec_emitter_wkld *cxt, viddec_workload_item_t *item) 31{ 32 int32_t ret =0; 33 if((cxt->num_items < cxt->max_items) && (cxt->data != NULL)) 34 { 35 cxt->data->item[cxt->num_items] = *item; 36 cxt->num_items++; 37 ret = 1; 38 CDEB(0, "%s: item(%02d) = [%08x %08x %08x %08x]\n",__FUNCTION__, cxt->num_items - 1, item->vwi_type, item->vwi_payload[0], item->vwi_payload[1], item->vwi_payload[2]); 39 } 40 else 41 { 42 cxt->result |= (VIDDEC_FW_WORKLOAD_ERR_ITEMS_OVERFLOW | VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE); 43 WRITE_SVEN(SVEN_MODULE_EVENT_GV_FW_FATAL_WKLD_OVERLFOW, (int)item->vwi_type, (int)(cxt->data), 0, 0, 0, 0); 44 } 45 return ret; 46} 47 48int32_t viddec_emit_contr_tag(viddec_emitter *emit, viddec_input_buffer_t *ibuf, uint8_t incomplete, uint32_t using_next) 49{ 50 viddec_workload_item_t item; 51 viddec_emitter_wkld *cur_wkld; 52 53 cur_wkld = (using_next == 0)? &(emit->cur):&(emit->next); 54 55 if(!incomplete) 56 item.vwi_type = VIDDEC_WORKLOAD_IBUF_DONE; 57 else 58 item.vwi_type = VIDDEC_WORKLOAD_IBUF_CONTINUED; 59 item.tag.tag_phys_addr = ibuf->phys; 60 item.tag.tag_phys_len = ibuf->len; 61 item.tag.tag_value = ibuf->id; 62 63 return viddec_emit_append(cur_wkld, &item); 64} 65 66int32_t viddec_emit_assoc_tag(viddec_emitter *emit, uint32_t id, uint32_t using_next) 67{ 68 viddec_workload_item_t item; 69 viddec_emitter_wkld *cur_wkld; 70 71 cur_wkld = (using_next == false)? &(emit->cur):&(emit->next); 72 item.vwi_type = VIDDEC_WORKLOAD_TAG; 73 item.tag.tag_phys_addr = -1; 74 item.tag.tag_phys_len = -1; 75 item.tag.tag_value = id; 76 return viddec_emit_append(cur_wkld, &item); 77} 78 79