/*
 * 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-2006 Silicon Graphics, Inc. All rights reserved.
 */

#ifndef _ASM_IA64_SN_INTR_H
#define _ASM_IA64_SN_INTR_H

#include <linux/rcupdate.h>
#include <asm/sn/types.h>

#define SGI_UART_VECTOR		0xe9

/* Reserved IRQs : Note, not to exceed IA64_SN2_FIRST_DEVICE_VECTOR */
#define SGI_XPC_ACTIVATE	0x30
#define SGI_II_ERROR		0x31
#define SGI_XBOW_ERROR		0x32
#define SGI_PCIASIC_ERROR	0x33
#define SGI_ACPI_SCI_INT	0x34
#define SGI_TIOCA_ERROR		0x35
#define SGI_TIO_ERROR		0x36
#define SGI_TIOCX_ERROR		0x37
#define SGI_MMTIMER_VECTOR	0x38
#define SGI_XPC_NOTIFY		0xe7

#define IA64_SN2_FIRST_DEVICE_VECTOR	0x3c
#define IA64_SN2_LAST_DEVICE_VECTOR	0xe6

#define SN2_IRQ_RESERVED	0x1
#define SN2_IRQ_CONNECTED	0x2
#define SN2_IRQ_SHARED		0x4

// The SN PROM irq struct
struct sn_irq_info {
	struct sn_irq_info *irq_next;	/* deprecated DO NOT USE     */
	short		irq_nasid;	/* Nasid IRQ is assigned to  */
	int		irq_slice;	/* slice IRQ is assigned to  */
	int		irq_cpuid;	/* kernel logical cpuid	     */
	int		irq_irq;	/* the IRQ number */
	int		irq_int_bit;	/* Bridge interrupt pin */
					/* <0 means MSI */
	u64	irq_xtalkaddr;	/* xtalkaddr IRQ is sent to  */
	int		irq_bridge_type;/* pciio asic type (pciio.h) */
	void	       *irq_bridge;	/* bridge generating irq     */
	void	       *irq_pciioinfo;	/* associated pciio_info_t   */
	int		irq_last_intr;	/* For Shub lb lost intr WAR */
	int		irq_cookie;	/* unique cookie 	     */
	int		irq_flags;	/* flags */
	int		irq_share_cnt;	/* num devices sharing IRQ   */
	struct list_head	list;	/* list of sn_irq_info structs */
	struct rcu_head		rcu;	/* rcu callback list */
};

extern void sn_send_IPI_phys(int, long, int, int);
extern u64 sn_intr_alloc(nasid_t, int,
			      struct sn_irq_info *,
			      int, nasid_t, int);
extern void sn_intr_free(nasid_t, int, struct sn_irq_info *);
extern struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *, nasid_t, int);
extern void sn_set_err_irq_affinity(unsigned int);
extern struct list_head **sn_irq_lh;

#define CPU_VECTOR_TO_IRQ(cpuid,vector) (vector)

#endif /* _ASM_IA64_SN_INTR_H */
