/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1992 - 1997, 2000 Silicon Graphics, Inc.
 * Copyright (C) 2000 by Colin Ngam
 */
#ifndef _ASM_SN_LAUNCH_H
#define _ASM_SN_LAUNCH_H

#include <asm/sn/types.h>
#include <asm/sn/addrs.h>

/*
 * The launch data structure resides at a fixed place in each node's memory
 * and is used to communicate between the master processor and the slave
 * processors.
 *
 * The master stores launch parameters in the launch structure
 * corresponding to a target processor that is in a slave loop, then sends
 * an interrupt to the slave processor.	 The slave calls the desired
 * function, then returns to the slave loop.  The master may poll or wait
 * for the slaves to finish.
 *
 * There is an array of launch structures, one per CPU on the node.  One
 * interrupt level is used per local CPU.
 */

#define LAUNCH_MAGIC		0xaddbead2addbead3
#ifdef CONFIG_SGI_IP27
#define LAUNCH_SIZEOF		0x100
#define LAUNCH_PADSZ		0xa0
#endif

#define LAUNCH_OFF_MAGIC	0x00	/* Struct offsets for assembly	    */
#define LAUNCH_OFF_BUSY		0x08
#define LAUNCH_OFF_CALL		0x10
#define LAUNCH_OFF_CALLC	0x18
#define LAUNCH_OFF_CALLPARM	0x20
#define LAUNCH_OFF_STACK	0x28
#define LAUNCH_OFF_GP		0x30
#define LAUNCH_OFF_BEVUTLB	0x38
#define LAUNCH_OFF_BEVNORMAL	0x40
#define LAUNCH_OFF_BEVECC	0x48

#define LAUNCH_STATE_DONE	0	/* Return value of LAUNCH_POLL	    */
#define LAUNCH_STATE_SENT	1
#define LAUNCH_STATE_RECD	2

/*
 * The launch routine is called only if the complement address is correct.
 *
 * Before control is transferred to a routine, the complement address
 * is zeroed (invalidated) to prevent an accidental call from a spurious
 * interrupt.
 *
 * The slave_launch routine turns on the BUSY flag, and the slave loop
 * clears the BUSY flag after control is returned to it.
 */

#ifndef __ASSEMBLY__

typedef int launch_state_t;
typedef void (*launch_proc_t)(u64 call_parm);

typedef struct launch_s {
	volatile u64		magic;	/* Magic number			    */
	volatile u64		busy;	/* Slave currently active	    */
	volatile launch_proc_t	call_addr;	/* Func. for slave to call  */
	volatile u64		call_addr_c;	/* 1's complement of call_addr*/
	volatile u64		call_parm;	/* Single parm passed to call*/
	volatile void *stack_addr;	/* Stack pointer for slave function */
	volatile void *gp_addr;		/* Global pointer for slave func.   */
	volatile char		*bevutlb;/* Address of bev utlb ex handler   */
	volatile char		*bevnormal;/*Address of bev normal ex handler */
	volatile char		*bevecc;/* Address of bev cache err handler */
	volatile char		pad[160];	/* Pad to LAUNCH_SIZEOF	    */
} launch_t;

/*
 * PROM entry points for launch routines are determined by IPxxprom/start.s
 */

#define LAUNCH_SLAVE	(*(void (*)(int nasid, int cpu, \
				    launch_proc_t call_addr, \
				    u64 call_parm, \
				    void *stack_addr, \
				    void *gp_addr)) \
			 IP27PROM_LAUNCHSLAVE)

#define LAUNCH_WAIT	(*(void (*)(int nasid, int cpu, int timeout_msec)) \
			 IP27PROM_WAITSLAVE)

#define LAUNCH_POLL	(*(launch_state_t (*)(int nasid, int cpu)) \
			 IP27PROM_POLLSLAVE)

#define LAUNCH_LOOP	(*(void (*)(void)) \
			 IP27PROM_SLAVELOOP)

#define LAUNCH_FLASH	(*(void (*)(void)) \
			 IP27PROM_FLASHLEDS)

#endif /* !__ASSEMBLY__ */

#endif /* _ASM_SN_LAUNCH_H */
