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