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