1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 25de18cdeSSam Ravnborg /* 35de18cdeSSam Ravnborg * p1275.c: Sun IEEE 1275 PROM low level interface routines 45de18cdeSSam Ravnborg * 55de18cdeSSam Ravnborg * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 65de18cdeSSam Ravnborg */ 75de18cdeSSam Ravnborg 85de18cdeSSam Ravnborg #include <linux/kernel.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> 13bdcf81b6SDavid S. Miller #include <linux/irqflags.h> 145de18cdeSSam Ravnborg 155de18cdeSSam Ravnborg #include <asm/openprom.h> 165de18cdeSSam Ravnborg #include <asm/oplib.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 } 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 p1275_cmd_direct(unsigned long * args)3625edd694SDavid S. Millervoid 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 prom_cif_init(void * cif_handler)52*a6c3ea1eSAndreas Larssonvoid prom_cif_init(void *cif_handler) 535de18cdeSSam Ravnborg { 545de18cdeSSam Ravnborg p1275buf.prom_cif_handler = (void (*)(long *))cif_handler; 555de18cdeSSam Ravnborg } 56