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