#ifndef u_kernel_h_
#define u_kernel_h_

/* Xilinx includes */
#include <stdio.h>
#include <pvr.h>
#include <fsl.h>
#include <xparameters.h>
#include <mb_interface.h>

#define NUM_CORES 4
#define MASTER_CPU_SYNC_MAGIC_CODE 	31628
#define SLAVE_CPU_SYNC_MAGIC_CODE 	54766
#define KERNEL_TABLE_ADDR (XPAR_KERNEL_BRAM_IF_CNTLR_BASEADDR)

//#define write_into_fsl(val, id)  putfsl(val, id)
//#define read_from_fsl(val, id)  getfsl(val, id)
//#define input_slot_id   1
//#define output_slot_id  0
#define KENEL_MEM_MUTEX_NUM   0

#define input_slot_id   1
#define output_slot_id  0



typedef struct
{
    volatile long bootSync;
    volatile void *applicationThreadPtr[NUM_CORES];
} kernelTable;

unsigned int getCurrentCoreID();
void enableCaches();
void disableCaches();
void sleep(unsigned long msec);
int mutex_lock(int mutex_num);
int mutex_unlock(int mutex_num);

int mutex_lock_id(int mutex_num, int task_id);
int mutex_unlock_id(int mutex_num, int task_id);

void producer_write_0(int n);
int producer_read_0(void);
void producer_write_1(int n);
int producer_read_1(void);
void producer_write_2(int n);
int producer_read_2(void);
void consumer_write_1(int n);
int consumer_read_1(void);
void consumer_write_2(int n);
int consumer_read_2(void);
void consumer_write_3(int n);
int consumer_read_3(void);

void *smp_malloc(size_t xWantedSize);
void smp_free(void *pv);

void smp_sleep(volatile long count);


#endif

