Commit | Line | Data |
---|---|---|
b00dc837 | 1 | /* |
1da177e4 LT |
2 | * p1275.c: Sun IEEE 1275 PROM low level interface routines |
3 | * | |
4 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | |
5 | */ | |
6 | ||
7 | #include <linux/kernel.h> | |
8 | #include <linux/init.h> | |
9 | #include <linux/sched.h> | |
10 | #include <linux/smp.h> | |
11 | #include <linux/string.h> | |
12 | #include <linux/spinlock.h> | |
13 | ||
14 | #include <asm/openprom.h> | |
15 | #include <asm/oplib.h> | |
1da177e4 LT |
16 | #include <asm/spitfire.h> |
17 | #include <asm/pstate.h> | |
4f0234f4 | 18 | #include <asm/ldc.h> |
1da177e4 LT |
19 | |
20 | struct { | |
21 | long prom_callback; /* 0x00 */ | |
22 | void (*prom_cif_handler)(long *); /* 0x08 */ | |
23 | unsigned long prom_cif_stack; /* 0x10 */ | |
1da177e4 LT |
24 | } p1275buf; |
25 | ||
26 | extern void prom_world(int); | |
27 | ||
25edd694 | 28 | extern void prom_cif_direct(unsigned long *args); |
1da177e4 LT |
29 | extern void prom_cif_callback(void); |
30 | ||
1da177e4 | 31 | /* |
8a4fd1e4 | 32 | * This provides SMP safety on the p1275buf. |
1da177e4 | 33 | */ |
8a4fd1e4 | 34 | DEFINE_RAW_SPINLOCK(prom_entry_lock); |
1da177e4 | 35 | |
25edd694 | 36 | void p1275_cmd_direct(unsigned long *args) |
1da177e4 | 37 | { |
1da177e4 | 38 | unsigned long flags; |
1da177e4 | 39 | |
8a4fd1e4 | 40 | raw_local_save_flags(flags); |
df9ee292 | 41 | raw_local_irq_restore((unsigned long)PIL_NMI); |
8a4fd1e4 | 42 | raw_spin_lock(&prom_entry_lock); |
1da177e4 | 43 | |
1da177e4 | 44 | prom_world(1); |
25edd694 | 45 | prom_cif_direct(args); |
1da177e4 LT |
46 | prom_world(0); |
47 | ||
8a4fd1e4 DM |
48 | raw_spin_unlock(&prom_entry_lock); |
49 | raw_local_irq_restore(flags); | |
1da177e4 LT |
50 | } |
51 | ||
52 | void prom_cif_init(void *cif_handler, void *cif_stack) | |
53 | { | |
54 | p1275buf.prom_cif_handler = (void (*)(long *))cif_handler; | |
55 | p1275buf.prom_cif_stack = (unsigned long)cif_stack; | |
56 | } |