Commit d2685fb7 authored by Philippe Gerum's avatar Philippe Gerum Committed by Mike Frysinger

Blackfin/ipipe: prepare status bitops for SMP support

Signed-off-by: default avatarPhilippe Gerum <rpm@xenomai.org>
Signed-off-by: default avatarLi Yi <yi.li@analog.com>
Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent ab843c79
......@@ -124,16 +124,6 @@ static inline int __ipipe_check_tickdev(const char *devname)
return 1;
}
static inline void __ipipe_lock_root(void)
{
set_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status));
}
static inline void __ipipe_unlock_root(void)
{
clear_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status));
}
void __ipipe_enable_pipeline(void);
#define __ipipe_hook_critical_ipi(ipd) do { } while (0)
......
......@@ -51,23 +51,15 @@
extern unsigned long __ipipe_root_status; /* Alias to ipipe_root_cpudom_var(status) */
#define __ipipe_stall_root() \
do { \
volatile unsigned long *p = &__ipipe_root_status; \
set_bit(0, p); \
} while (0)
#define __ipipe_test_and_stall_root() \
({ \
volatile unsigned long *p = &__ipipe_root_status; \
test_and_set_bit(0, p); \
})
#define __ipipe_test_root() \
({ \
const unsigned long *p = &__ipipe_root_status; \
test_bit(0, p); \
})
void __ipipe_stall_root(void);
unsigned long __ipipe_test_and_stall_root(void);
unsigned long __ipipe_test_root(void);
void __ipipe_lock_root(void);
void __ipipe_unlock_root(void);
#endif /* !__ASSEMBLY__ */
......
......@@ -335,3 +335,70 @@ void __ipipe_enable_root_irqs_hw(void)
__clear_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status));
bfin_sti(bfin_irq_flags);
}
/*
* We could use standard atomic bitops in the following root status
* manipulation routines, but let's prepare for SMP support in the
* same move, preventing CPU migration as required.
*/
void __ipipe_stall_root(void)
{
unsigned long *p, flags;
local_irq_save_hw(flags);
p = &__ipipe_root_status;
__set_bit(IPIPE_STALL_FLAG, p);
local_irq_restore_hw(flags);
}
EXPORT_SYMBOL(__ipipe_stall_root);
unsigned long __ipipe_test_and_stall_root(void)
{
unsigned long *p, flags;
int x;
local_irq_save_hw(flags);
p = &__ipipe_root_status;
x = __test_and_set_bit(IPIPE_STALL_FLAG, p);
local_irq_restore_hw(flags);
return x;
}
EXPORT_SYMBOL(__ipipe_test_and_stall_root);
unsigned long __ipipe_test_root(void)
{
const unsigned long *p;
unsigned long flags;
int x;
local_irq_save_hw_smp(flags);
p = &__ipipe_root_status;
x = test_bit(IPIPE_STALL_FLAG, p);
local_irq_restore_hw_smp(flags);
return x;
}
EXPORT_SYMBOL(__ipipe_test_root);
void __ipipe_lock_root(void)
{
unsigned long *p, flags;
local_irq_save_hw(flags);
p = &__ipipe_root_status;
__set_bit(IPIPE_SYNCDEFER_FLAG, p);
local_irq_restore_hw(flags);
}
EXPORT_SYMBOL(__ipipe_lock_root);
void __ipipe_unlock_root(void)
{
unsigned long *p, flags;
local_irq_save_hw(flags);
p = &__ipipe_root_status;
__clear_bit(IPIPE_SYNCDEFER_FLAG, p);
local_irq_restore_hw(flags);
}
EXPORT_SYMBOL(__ipipe_unlock_root);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment