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