Home | History | Annotate | Download | only in include
      1 #ifndef VIDDEC_EMITTER_H
      2 #define VIDDEC_EMITTER_H
      3 
      4 #include <stdint.h>
      5 #ifndef HOST_ONLY
      6 #define DDR_MEM_MASK 0x80000000
      7 #else
      8 #define DDR_MEM_MASK 0x0
      9 #endif
     10 #include "viddec_fw_workload.h"
     11 #include "viddec_fw_common_defs.h"
     12 #include "viddec_fw_debug.h"
     13 
     14 typedef struct
     15 {
     16     viddec_workload_t *data;
     17     uint32_t  max_items;
     18     uint32_t  num_items;
     19     uint32_t result;
     20 }viddec_emitter_wkld;
     21 
     22 typedef struct
     23 {
     24     viddec_emitter_wkld cur;
     25     viddec_emitter_wkld next;
     26 }viddec_emitter;
     27 
     28 /*
     29   whats this for? Emitting current tag for ES buffer
     30 */
     31 int32_t viddec_emit_assoc_tag(viddec_emitter *emit, uint32_t id, uint32_t using_next);
     32 
     33 int32_t viddec_emit_contr_tag(viddec_emitter *emit, viddec_input_buffer_t *ibuf, uint8_t incomplete, uint32_t using_next);
     34 
     35 int32_t viddec_emit_flush_current_wkld(viddec_emitter *emit);
     36 
     37 int32_t viddec_emit_append(viddec_emitter_wkld *cxt, viddec_workload_item_t *item);
     38 
     39 /*
     40   Init function for setting up emitter context.
     41 */
     42 static inline void viddec_emit_init(viddec_emitter *cxt)
     43 {
     44     cxt->cur.data = cxt->next.data = 0;
     45     cxt->cur.max_items = cxt->next.max_items = 0;
     46     cxt->cur.num_items = cxt->next.num_items = 0;
     47     cxt->cur.result = cxt->next.result = VIDDEC_FW_WORKLOAD_SUCCESS;
     48 }
     49 
     50 static inline void viddec_emit_update(viddec_emitter *cxt, uint32_t cur, uint32_t next, uint32_t cur_size, uint32_t next_size)
     51 {
     52     cxt->cur.data = (cur != 0) ? (viddec_workload_t *)(cur | DDR_MEM_MASK) : NULL;
     53     cxt->next.data = (next != 0) ? (viddec_workload_t *)(next | DDR_MEM_MASK): NULL;
     54     cxt->cur.max_items = (cur_size - sizeof(viddec_workload_t))/sizeof(viddec_workload_item_t);
     55     cxt->next.max_items = (next_size - sizeof(viddec_workload_t))/sizeof(viddec_workload_item_t);
     56 }
     57 
     58 static inline void viddec_emit_time(viddec_emitter *cxt, uint32_t time)
     59 {
     60     viddec_emitter_wkld *cur;
     61     cur = &(cxt->cur);
     62     cur->data->time = time;
     63 }
     64 
     65 static inline void viddec_emit_set_codec(viddec_emitter *emit, uint32_t codec_type)
     66 {
     67     emit->cur.data->codec = codec_type;
     68 }
     69 
     70 static inline void viddec_emit_set_codec_errors(viddec_emitter *emit, uint32_t codec_error)
     71 {
     72     emit->cur.result |= codec_error;
     73     WRITE_SVEN(SVEN_MODULE_EVENT_GV_FW_PM_WORKLOAD_STATUS, (int)emit->cur.result, (int)emit->cur.data,
     74                (int)emit->cur.num_items, 0, 0, 0);
     75 }
     76 
     77 static inline void viddec_emit_set_workload_error(viddec_emitter *emit, uint32_t error, uint32_t using_next)
     78 {
     79     viddec_emitter_wkld *cur_wkld;
     80     cur_wkld = (using_next == false)? &(emit->cur):&(emit->next);
     81     cur_wkld->result |= error;
     82     WRITE_SVEN(SVEN_MODULE_EVENT_GV_FW_PM_WORKLOAD_STATUS, (int)cur_wkld->result, (int)cur_wkld->data,
     83                (int)cur_wkld->num_items, using_next, 0, 0);
     84 }
     85 
     86 static inline void viddec_emit_set_inband_tag(viddec_emitter *emit, uint32_t type, uint32_t using_next)
     87 {
     88     viddec_emitter_wkld *cur_wkld;
     89     viddec_workload_item_t item;
     90     cur_wkld = (using_next == false)? &(emit->cur):&(emit->next);
     91     item.vwi_type = type;
     92     item.vwi_payload[0] = item.vwi_payload[1] = item.vwi_payload[2] = 0;
     93     viddec_emit_append(cur_wkld, &item);
     94 }
     95 
     96 #endif /* VIDDEC_EMITTER_H */
     97