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/init.h> 95de18cdeSSam Ravnborg #include <linux/sched.h> 105de18cdeSSam Ravnborg #include <linux/smp.h> 115de18cdeSSam Ravnborg #include <linux/string.h> 125de18cdeSSam Ravnborg #include <linux/spinlock.h> 135de18cdeSSam Ravnborg 145de18cdeSSam Ravnborg #include <asm/openprom.h> 155de18cdeSSam Ravnborg #include <asm/oplib.h> 165de18cdeSSam Ravnborg #include <asm/system.h> 175de18cdeSSam Ravnborg #include <asm/spitfire.h> 185de18cdeSSam Ravnborg #include <asm/pstate.h> 195de18cdeSSam Ravnborg #include <asm/ldc.h> 205de18cdeSSam Ravnborg 215de18cdeSSam Ravnborg struct { 225de18cdeSSam Ravnborg long prom_callback; /* 0x00 */ 235de18cdeSSam Ravnborg void (*prom_cif_handler)(long *); /* 0x08 */ 245de18cdeSSam Ravnborg unsigned long prom_cif_stack; /* 0x10 */ 255de18cdeSSam Ravnborg } p1275buf; 265de18cdeSSam Ravnborg 275de18cdeSSam Ravnborg extern void prom_world(int); 285de18cdeSSam Ravnborg 2925edd694SDavid S. Miller extern void prom_cif_direct(unsigned long *args); 305de18cdeSSam Ravnborg extern void prom_cif_callback(void); 315de18cdeSSam Ravnborg 325de18cdeSSam Ravnborg /* 338a4fd1e4SDavid S. Miller * This provides SMP safety on the p1275buf. 345de18cdeSSam Ravnborg */ 358a4fd1e4SDavid S. Miller DEFINE_RAW_SPINLOCK(prom_entry_lock); 365de18cdeSSam Ravnborg 3725edd694SDavid S. Miller void p1275_cmd_direct(unsigned long *args) 385de18cdeSSam Ravnborg { 395de18cdeSSam Ravnborg unsigned long flags; 405de18cdeSSam Ravnborg 418a4fd1e4SDavid S. Miller raw_local_save_flags(flags); 428a4fd1e4SDavid S. Miller raw_local_irq_restore(PIL_NMI); 438a4fd1e4SDavid S. Miller raw_spin_lock(&prom_entry_lock); 445de18cdeSSam Ravnborg 455de18cdeSSam Ravnborg prom_world(1); 4625edd694SDavid S. Miller prom_cif_direct(args); 475de18cdeSSam Ravnborg prom_world(0); 485de18cdeSSam Ravnborg 498a4fd1e4SDavid S. Miller raw_spin_unlock(&prom_entry_lock); 508a4fd1e4SDavid S. Miller raw_local_irq_restore(flags); 515de18cdeSSam Ravnborg } 525de18cdeSSam Ravnborg 535de18cdeSSam Ravnborg void prom_cif_init(void *cif_handler, void *cif_stack) 545de18cdeSSam Ravnborg { 555de18cdeSSam Ravnborg p1275buf.prom_cif_handler = (void (*)(long *))cif_handler; 565de18cdeSSam Ravnborg p1275buf.prom_cif_stack = (unsigned long)cif_stack; 575de18cdeSSam Ravnborg } 58