1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef FW_PVT_H 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define FW_PVT_H 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <stdint.h> 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_parser_fw_ipc.h" 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_parser_ipclib_config.h" 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_emitter.h" 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm.h" 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h" 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define GET_IPC_HANDLE(x) (FW_IPC_Handle *)&(x.fwIpc) 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define GV_DDR_MEM_MASK 0x80000000 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Macros for Interrupts */ 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define TRAPS_ENABLE __asm__ volatile ("mov %%psr, %%l0; or %%l0, 0x20, %%l0; mov %%l0, %%psr; nop; nop; nop;":::"l0") 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define TRAPS_DISABLE __asm__ volatile ("mov %%psr, %%l0; and %%l0, ~0x20, %%l0; mov %%l0, %%psr; nop; nop; nop;":::"l0") 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define TRAPS_INT_ENABLE __asm__ volatile ("mov %%psr, %%l0; and %%l0, ~0xF00, %%l0; mov %%l0, %%psr; nop; nop; nop;":::"l0") 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define TRAPS_INT_DISABLE __asm__ volatile ("mov %%psr, %%l0; or %%l0, 0xF00, %%l0; mov %%l0, %%psr; nop; nop; nop;":::"l0") 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define TRAPS_ENABLED(enabled) __asm__ volatile ("mov %%psr, %0; and %0, 0x20, %0": "=r" (enabled):) 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define TRAPS_INT_DISABLED(enabled) __asm__ volatile ("mov %%psr, %0; and %0, 0xF00, %0": "=r" (enabled):) 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define VIDDEC_WATCHDOG_COUNTER_MAX (0x000FFFFF) 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Synchronous message buffer, which is shared by both Host and Fw for handling synchronous messages */ 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t data[CONFIG_IPC_SYNC_MESSAGE_BUF_SIZE]; 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mfd_sync_msg_t; 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Required Information needed by Parser Kernel for each stream */ 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t ddr_cxt; /* phys addr of swap space where Parser kernel stores pvt information */ 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t cxt_size; /* size of context buffer */ 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t strm_type; /* Current stream information*/ 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t wl_time; /* ticks for processing current workload */ 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t es_time; /* ticks for processing current workload */ 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t low_watermark; /* On crossing this value we generate low watermark interrupt */ 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t state; /* Current state of stream ... start(1), stop(0).. */ 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t priority; /* Priority of current stream Real time or Non real time */ 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t buffered_data;/* Do we have data from past buffer */ 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t pending_interrupt;/* Whether an Interrupt needs to be generated for this stream */ 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mfd_stream_info; 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Global data for Parser kernel */ 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t low_id; /* last scheduled low priority stream id */ 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t high_id;/* last scheduled high priority stream id */ 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t g_parser_tables; /* should point to global_parser_table in DDR */ 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mfd_pk_data_t; 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ipc_msg_data input; 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ipc_msg_data wkld1; 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ipc_msg_data wkld2; 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t pm; 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mfd_pk_strm_cxt; 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* This structure defines the layout of local memory */ 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mfd_sync_msg_t buf; 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee _IPC_int_state_t int_status[FW_SUPPORTED_STREAMS]; 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee FW_IPC_Handle fwIpc; 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mfd_stream_info stream_info[FW_SUPPORTED_STREAMS]; 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mfd_pk_data_t g_pk_data; 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mfd_pk_strm_cxt srm_cxt; 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}dmem_t; 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Pvt Functions which will be used by multiple modules */ 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic inline void reg_write(uint32_t offset, uint32_t value) 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *((volatile uint32_t*) (GV_SI_MMR_BASE_ADDRESS + offset)) = value; 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic inline uint32_t reg_read(uint32_t offset) 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t value=0; 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee value = *((volatile uint32_t*) (GV_SI_MMR_BASE_ADDRESS + offset)); 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return value; 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic inline void DEBUG(uint32_t print, uint32_t code, uint32_t val) 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(print > 0) 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DUMP_TO_MEM(code); 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DUMP_TO_MEM(val); 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dump_ptr = (dump_ptr + 7) & ~0x7; 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid *memcpy(void *dest, const void *src, uint32_t n); 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid *memset(void *s, int32_t c, uint32_t n); 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t cp_using_dma(uint32_t ddr_addr, uint32_t local_addr, uint32_t size, char to_ddr, char swap); 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t set_wdog(uint32_t offset); 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid get_wdog(uint32_t *value); 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid enable_intr(void); 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t get_total_ticks(uint32_t start, uint32_t end); 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_fw_init_swap_memory(unsigned int stream_id, unsigned int swap, unsigned int clean); 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 115