#ifndef KERNEL_API_INC_SPINLOCK_H_
#define KERNEL_API_INC_SPINLOCK_H_

#include <ucps2-intrin.h>


typedef enum
{
    SLOCK_L3 = 0,
    SLOCK_MAX = 15
}ape_spin_lock_index;


typedef struct{
    union
    {
    	unsigned int slock;

    };
}spinlock_t;

#define APE_NR  12

typedef struct{
	unsigned int spinlock_count;
	unsigned int unspinlock_count;
	unsigned int spinlock_loop;
    unsigned int g_spin_count;
//    unsigned int unspinlock_loop;

}spin_db_info ;

typedef struct{
//	spin_db_info spin_per_ape[APE_NR];
	spin_db_info spin_per_ape;
	
}spin_debug_t;

typedef struct
{
    int lock_addr;  //锁物理地址
    int flag_addr;  // 锁标志物理地址

}ddr_spinlock_t;

extern int smart_spinlock_init(int lock_index);
extern void smart_spinlock(int lock_index);
extern void smart_spinunlock(int lock_index);
extern int smart_spin_debug_init(int lock_idx,unsigned int debug_base_addr, int len_bytes);


/*
    参数:lock_idx
    参数范围：1--15
*/
extern int smart_get_spin_loop_cnt(int lock_idx);
/*
    参数:lock_idx
    参数范围：1--15
*/
extern int smart_get_spin_cnt(int lock_idx);
/*
    参数:lock_idx
    参数范围：1--15
*/

extern int smart_get_spinlock_cnt(int lock_idx);
/*
    参数:lock_idx
    参数范围：1--15
*/

extern int smart_get_unspinlock_cnt(int lock_idx);


extern int smart_ddr_spin_lock_init(ddr_spinlock_t *val);
extern void smart_ddr_spinlock(ddr_spinlock_t *val);
extern void smart_ddr_spinunlock(ddr_spinlock_t *val);

static inline void smart_ddr_spinlock_irq(ddr_spinlock_t *val)
{

    __ucps2_IntEn(f_Disable); 
   smart_ddr_spinlock(val);

}

static inline void smart_ddr_spinunlock_irqrestore(ddr_spinlock_t *val)
{
    smart_ddr_spinunlock(val);
    __ucps2_IntEn(f_Enable);

}


static inline void smart_spinlock_irq(int lock)
{

    __ucps2_IntEn(f_Disable); 
    smart_spinlock(lock);	

}

static inline void smart_spinunlock_irqrestore(int lock)
{
    smart_spinunlock(lock);	
    __ucps2_IntEn(f_Enable);

}

#endif /* KERNEL_API_INC_SPINLOCK_H_ */

