|
@@ -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);
|