15de18cdeSSam Ravnborg /* 25de18cdeSSam Ravnborg * p1275.c: Sun IEEE 1275 PROM low level interface routines 35de18cdeSSam Ravnborg * 45de18cdeSSam Ravnborg * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 55de18cdeSSam Ravnborg */ 65de18cdeSSam Ravnborg 75de18cdeSSam Ravnborg #include <linux/kernel.h> 85de18cdeSSam Ravnborg #include <linux/sched.h> 95de18cdeSSam Ravnborg #include <linux/smp.h> 105de18cdeSSam Ravnborg #include <linux/string.h> 115de18cdeSSam Ravnborg #include <linux/spinlock.h> 12bdcf81b6SDavid S. Miller #include <linux/irqflags.h> 135de18cdeSSam Ravnborg 145de18cdeSSam Ravnborg #include <asm/openprom.h> 155de18cdeSSam Ravnborg #include <asm/oplib.h> 165de18cdeSSam Ravnborg #include <asm/spitfire.h> 175de18cdeSSam Ravnborg #include <asm/pstate.h> 185de18cdeSSam Ravnborg #include <asm/ldc.h> 195de18cdeSSam Ravnborg 205de18cdeSSam Ravnborg struct { 215de18cdeSSam Ravnborg long prom_callback; /* 0x00 */ 225de18cdeSSam Ravnborg void (*prom_cif_handler)(long *); /* 0x08 */ 235de18cdeSSam Ravnborg unsigned long prom_cif_stack; /* 0x10 */ 245de18cdeSSam Ravnborg } p1275buf; 255de18cdeSSam Ravnborg 265de18cdeSSam Ravnborg extern void prom_world(int); 275de18cdeSSam Ravnborg 2825edd694SDavid S. Miller extern void prom_cif_direct(unsigned long *args); 295de18cdeSSam Ravnborg extern void prom_cif_callback(void); 305de18cdeSSam Ravnborg 315de18cdeSSam Ravnborg /* 328a4fd1e4SDavid S. Miller * This provides SMP safety on the p1275buf. 335de18cdeSSam Ravnborg */ 348a4fd1e4SDavid S. Miller DEFINE_RAW_SPINLOCK(prom_entry_lock); 355de18cdeSSam Ravnborg 3625edd694SDavid S. Miller void p1275_cmd_direct(unsigned long *args) 375de18cdeSSam Ravnborg { 385de18cdeSSam Ravnborg unsigned long flags; 395de18cdeSSam Ravnborg 40bdcf81b6SDavid S. Miller local_save_flags(flags); 41bdcf81b6SDavid S. Miller local_irq_restore((unsigned long)PIL_NMI); 428a4fd1e4SDavid S. Miller raw_spin_lock(&prom_entry_lock); 435de18cdeSSam Ravnborg 445de18cdeSSam Ravnborg prom_world(1); 4525edd694SDavid S. Miller prom_cif_direct(args); 465de18cdeSSam Ravnborg prom_world(0); 475de18cdeSSam Ravnborg 488a4fd1e4SDavid S. Miller raw_spin_unlock(&prom_entry_lock); 49bdcf81b6SDavid S. Miller local_irq_restore(flags); 505de18cdeSSam Ravnborg } 515de18cdeSSam Ravnborg 525de18cdeSSam Ravnborg void prom_cif_init(void *cif_handler, void *cif_stack) 535de18cdeSSam Ravnborg { 545de18cdeSSam Ravnborg p1275buf.prom_cif_handler = (void (*)(long *))cif_handler; 555de18cdeSSam Ravnborg p1275buf.prom_cif_stack = (unsigned long)cif_stack; 565de18cdeSSam Ravnborg } 57