YB_Platform/public/rtos/inc/spinlock.h

160 lines
3.4 KiB
C
Raw Normal View History

#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
{
unsigned int lock_addr; //锁物理地址
unsigned 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);
/*
smart_spin_debug_init
: lock_idx
debug_base_addr
: len_bytes
: int
0
: 0
lock_idx ,buf
len_bytes sizeof(spin_debug_t)
spin_debug_t
*/
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_spinlock_init(ddr_spinlock_t *val);
extern void smart_ddr_spinlock(ddr_spinlock_t *val);
extern void smart_ddr_spinunlock(ddr_spinlock_t *val);
/*
smart_ddr_spinlock_irq
: val
: ddr_spinlock_t
:
: 使
*/
static inline void smart_ddr_spinlock_irq(ddr_spinlock_t *d_lock)
{
__ucps2_IntEn(f_Disable);
smart_ddr_spinlock(d_lock);
}
/*
smart_ddr_spinunlock_irqrestore
: d_lock
: ddr_spinlock_t
:
: 使
*/
static inline void smart_ddr_spinunlock_irqrestore(ddr_spinlock_t *d_lock)
{
smart_ddr_spinunlock(d_lock);
__ucps2_IntEn(f_Enable);
}
/*
smart_spinlock_irq
: lock
: int
:
: 使
*/
static inline void smart_spinlock_irq(int lock)
{
__ucps2_IntEn(f_Disable);
smart_spinlock(lock);
}
/*
smart_spinunlock_irqrestore
: d_lock
: int
:
: 使
*/
static inline void smart_spinunlock_irqrestore(int lock)
{
smart_spinunlock(lock);
__ucps2_IntEn(f_Enable);
}
#endif /* KERNEL_API_INC_SPINLOCK_H_ */