#ifndef __DUP_APE_COM_H__
#define __DUP_APE_COM_H__



/*error code*/
#define EQUEEMPTY  20

#define EMATCH     21

#define EINVAL     22     /*invalid argment*/

#define EREREG     23    /*re registration*/


enum hwque_status{
	hwque_false,
	hwque_true

};


typedef unsigned int       uint32_t;
typedef unsigned short     uint16_t;
typedef unsigned char      uint8_t;
typedef unsigned long long uint64_t;


#define NULL ((void*)0)

#define QUE_MAX_NR 16

#define HW_QUE_NR 8

#define QUE_NR 16

#define B_128_16BLCOKS  8     

#define B_256_32BLOCKS  32   
#define BLOCKS_64       64  

//#define QUE_NR 32


#define SHM_QUE_MAX 8
#define MAP_QUE_MAX 16

typedef enum{
	CPSM_SM = 0,
	JSSM_SM,
	SM_NR
	
}ENUM_SHM;

typedef struct hw_que_reg_msg{

	uint32_t hw_base_reg;
	uint32_t hw_size_reg;
	uint32_t hw_depth_reg;
	uint32_t hw_start_addr;
	int 	 cpuid;
	uint32_t ape_vector_id;
	uint32_t arm_vector_id;

}hw_reg_desc_t;

typedef struct shm_desc{
	hw_reg_desc_t queid[SHM_QUE_MAX];
	uint32_t hw_sm_ctrl_reg;
	uint32_t width_bits;
	uint32_t que_depths;

}shm_obj;

typedef struct mpu_shm{
	shm_obj shm_type_s[SM_NR];
	int v_map_queid[MAP_QUE_MAX];

}mpu_shm_obj;


typedef struct{
    unsigned int out_failed_cnt;
    unsigned int in_failed_cnt;
    unsigned int out_success_cnt;
    unsigned int in_success_cnt;
    unsigned int in_que_depth_addr;
    unsigned int out_que_depth_addr;

}hwq_db_info ;

typedef struct{
    hwq_db_info per_hwq[QUE_MAX_NR];

}hwq_debug_t;



/*
    函数名称：smart_hq_init
    输入参数: cpuid
    返回类型: int
    返回值：  小于0 表示失败
    返回值：等于0 表示成功
    函数功能：硬件队列初始化
*/

extern int smart_hq_init(int cpuid);

/*
    函数名称：smart_get_hq_vector
    输入参数: cpuid
    输入参数：queid
    返回类型: int
    返回值：小于等于0 表示失败
    函数功能：获取当前硬件队列中断号

*/

extern int smart_get_hq_vector(int cpuid,int queid);


/********************

    函数名称：smart_in_que
    函数参数：queid 队列编号
    函数参数：val 入队值
    函数功能：硬件队列入队
    函数使用注意点1： 多核生产者入队时需要加锁

******************/


extern int smart_in_que(int queid,uint32_t val);


/*
    函数名称：smart_que_is_full
    输入参数: queid
    返回类型：int
    返回值：  1 表示 true
    返回值: 0 表示 false
*/

extern int smart_que_is_full(int queid);

/*********************
    函数名称：smart_out_que
    函数参数：queid 队列编号
    输出参数：idx 获取当前队列的索引值
    函数功能：队列出队获取当前队列的索引值

*********************/

extern int smart_out_que(int queid,uint32_t *val);

/*
    函数名称：smart_que_is_empty
    输入参数: queid
    返回类型: int
    返回值：  1 表示true
    返回值：0     表示false 

*/
extern int smart_que_is_empty(int queid);

/*
    函数名称：smart_get_que_info
    输入参数: queid
    输出参数      *dep
    输出参数: *width
    输出参数: *used
    输出参数: *cpuid
    返回类型: int
    返回值:0 表示成功，非0 表示失败

*/

extern int smart_get_que_info(int queid,int *dep,int *width,int *used,int *cpuid);

/*
//    函数名称：smart_enable_q_nempty
    函数名称：smart_hq_nempty_int_enable
    输入参数: queid
    返回值：int
    函数功能:使能非空中断
	
*/

//extern void smart_enable_q_nempty(int queid);
//extern void smart_hq_nempty_int_enable(int queid);
extern int smart_enable_q_nempty(int queid);


/*
//    函数名称：smart_disable_q_nempty
    函数名称:smart_hq_nempty_int_disable
    输入参数: queid
    返回值：int
    函数功能:去使能非空中断

*/

extern void smart_disable_q_nempty(int queid);
//extern void smart_hq_nempty_int_disable(int queid);


/*
    函数名称：smart_que_bind
    输入参数: queid
    输入参数；cpuid
    返回类型：int
    返回值 : 0 表示返回成功，非0 表示返回失败

    函数功能：去使能非空中断

*/

extern int smart_que_bind(int cpuid,int queid);


/*
    函数名称：smart_hq_debug_init
    输入参数: debug_base_addr
    输入参数；len_bytes
    返回类型：int
    返回值：0 表示成功
    函数功能：调试初始化接口	

    注意:
    通过地址与，长度指定相应的buf 数据空间，存放相应的中断调试信息
    这些调试信息已经格式化，地址由用户指定，len_bytes  不能小于sizeof(hwq_debug_t)
    数据格式化结构是:     hwq_debug_t

    数据格式 example:
    typedef struct{
        unsigned int out_failed_cnt;
        unsigned int in_failed_cnt;
        unsigned int out_success_cnt;
        unsigned int in_success_cnt;
        unsigned int cur_que_depth;
        unsigned int bind_cpuid;

    }hwq_db_info ;

    typedef struct{
        hwq_db_info per_hwq[HW_QUE_NR];

    }hwq_debug_t;

*/

extern int smart_hq_debug_init( uint32_t debug_base_addr, uint32_t len_bytes);

/*
    函数名称：smart_get_inque_ok_cnt
    输入参数: queid
    返回类型：int
    返回值 :  小于等于0表示失败
    函数功能：获取当前入队成功计数
*/

extern int smart_get_inque_ok_cnt(int queid);

/*
    函数名称：smart_get_inque_failed_cnt
    输入参数: queid
    返回类型：int
    返回值 :    小于等于0表示失败
    函数功能：获取当前入队失败计数
*/

extern int smart_get_inque_failed_cnt(int queid);

/*
    函数名称：smart_get_outque_ok_cnt
    输入参数: queid
    返回类型：int
    返回值：小于等于0表示失败
    函数功能：获取当前出队成功计数
*/

extern int smart_get_outque_ok_cnt(int queid);

/*
    函数名称：smart_get_outque_failed_cnt
    输入参数: queid
    返回类型：int
    返回值:     0表示成功，非0表示失败
    函数功能：获取当前出队失败计数
*/

extern int smart_get_outque_failed_cnt(int queid);


#endif
