0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <linux/sched.h>
0010 #include <linux/smp.h>
0011 #include <linux/string.h>
0012 #include <linux/spinlock.h>
0013 #include <linux/irqflags.h>
0014
0015 #include <asm/openprom.h>
0016 #include <asm/oplib.h>
0017 #include <asm/spitfire.h>
0018 #include <asm/pstate.h>
0019 #include <asm/ldc.h>
0020
0021 struct {
0022 long prom_callback;
0023 void (*prom_cif_handler)(long *);
0024 } p1275buf;
0025
0026 extern void prom_world(int);
0027
0028 extern void prom_cif_direct(unsigned long *args);
0029 extern void prom_cif_callback(void);
0030
0031
0032
0033
0034 DEFINE_RAW_SPINLOCK(prom_entry_lock);
0035
0036 void p1275_cmd_direct(unsigned long *args)
0037 {
0038 unsigned long flags;
0039
0040 local_save_flags(flags);
0041 local_irq_restore((unsigned long)PIL_NMI);
0042 raw_spin_lock(&prom_entry_lock);
0043
0044 prom_world(1);
0045 prom_cif_direct(args);
0046 prom_world(0);
0047
0048 raw_spin_unlock(&prom_entry_lock);
0049 local_irq_restore(flags);
0050 }
0051
0052 void prom_cif_init(void *cif_handler, void *cif_stack)
0053 {
0054 p1275buf.prom_cif_handler = (void (*)(long *))cif_handler;
0055 }