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