Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * p1275.c: Sun IEEE 1275 PROM low level interface routines
0004  *
0005  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
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;         /* 0x00 */
0023     void (*prom_cif_handler)(long *);   /* 0x08 */
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  * This provides SMP safety on the p1275buf.
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 }