1186557Skmacy/* -*-  Mode:C; c-basic-offset:4; tab-width:4 -*- */
2186557Skmacy#ifndef _XEN_INTR_H_
3186557Skmacy#define _XEN_INTR_H_
4186557Skmacy
5186557Skmacy/*
6186557Skmacy* The flat IRQ space is divided into two regions:
7186557Skmacy*  1. A one-to-one mapping of real physical IRQs. This space is only used
8186557Skmacy*     if we have physical device-access privilege. This region is at the
9186557Skmacy*     start of the IRQ space so that existing device drivers do not need
10186557Skmacy*     to be modified to translate physical IRQ numbers into our IRQ space.
11186557Skmacy*  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
12186557Skmacy*     are bound using the provided bind/unbind functions.
13186557Skmacy*
14186557Skmacy*
15186557Skmacy* $FreeBSD$
16186557Skmacy*/
17186557Skmacy
18186557Skmacy#define PIRQ_BASE   0
19186557Skmacy#define NR_PIRQS  128
20186557Skmacy
21186557Skmacy#define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS)
22186557Skmacy#define NR_DYNIRQS  128
23186557Skmacy
24186557Skmacy#define NR_IRQS   (NR_PIRQS + NR_DYNIRQS)
25186557Skmacy
26186557Skmacy#define pirq_to_irq(_x)   ((_x) + PIRQ_BASE)
27186557Skmacy#define irq_to_pirq(_x)   ((_x) - PIRQ_BASE)
28186557Skmacy
29186557Skmacy#define dynirq_to_irq(_x) ((_x) + DYNIRQ_BASE)
30186557Skmacy#define irq_to_dynirq(_x) ((_x) - DYNIRQ_BASE)
31186557Skmacy
32189699Sdfr/*
33189699Sdfr * Dynamic binding of event channels and VIRQ sources to guest IRQ space.
34189699Sdfr */
35186557Skmacy
36189699Sdfr/*
37189699Sdfr * Bind a caller port event channel to an interrupt handler. If
38189699Sdfr * successful, the guest IRQ number is returned in *irqp. Return zero
39189699Sdfr * on success or errno otherwise.
40189699Sdfr */
41186557Skmacyextern int bind_caller_port_to_irqhandler(unsigned int caller_port,
42186557Skmacy	const char *devname, driver_intr_t handler, void *arg,
43186557Skmacy	unsigned long irqflags, unsigned int *irqp);
44189699Sdfr
45189699Sdfr/*
46189699Sdfr * Bind a listening port to an interrupt handler. If successful, the
47189699Sdfr * guest IRQ number is returned in *irqp. Return zero on success or
48189699Sdfr * errno otherwise.
49189699Sdfr */
50186557Skmacyextern int bind_listening_port_to_irqhandler(unsigned int remote_domain,
51189699Sdfr	const char *devname, driver_intr_t handler, void *arg,
52189699Sdfr	unsigned long irqflags, unsigned int *irqp);
53189699Sdfr
54189699Sdfr/*
55189699Sdfr * Bind a VIRQ to an interrupt handler. If successful, the guest IRQ
56189699Sdfr * number is returned in *irqp. Return zero on success or errno
57189699Sdfr * otherwise.
58189699Sdfr */
59186557Skmacyextern int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu,
60186557Skmacy	const char *devname, driver_filter_t filter, driver_intr_t handler,
61186557Skmacy	void *arg, unsigned long irqflags,	unsigned int *irqp);
62186557Skmacy
63189699Sdfr/*
64189699Sdfr * Bind an IPI to an interrupt handler. If successful, the guest
65189699Sdfr * IRQ number is returned in *irqp. Return zero on success or errno
66189699Sdfr * otherwise.
67189699Sdfr */
68189699Sdfrextern int bind_ipi_to_irqhandler(unsigned int ipi, unsigned int cpu,
69189699Sdfr	const char *devname, driver_filter_t filter,
70189699Sdfr	unsigned long irqflags, unsigned int *irqp);
71189699Sdfr
72189699Sdfr/*
73189699Sdfr * Bind an interdomain event channel to an interrupt handler. If
74189699Sdfr * successful, the guest IRQ number is returned in *irqp. Return zero
75189699Sdfr * on success or errno otherwise.
76189699Sdfr */
77186557Skmacyextern int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
78189699Sdfr	unsigned int remote_port, const char *devname,
79214077Sgibbs	driver_intr_t handler, void *arg,
80189699Sdfr	unsigned long irqflags, unsigned int *irqp);
81186557Skmacy
82189699Sdfr/*
83189699Sdfr * Unbind an interrupt handler using the guest IRQ number returned
84189699Sdfr * when it was bound.
85189699Sdfr */
86189699Sdfrextern void unbind_from_irqhandler(unsigned int irq);
87186557Skmacy
88189699Sdfrstatic __inline__ int irq_cannonicalize(unsigned int irq)
89186557Skmacy{
90186557Skmacy    return (irq == 2) ? 9 : irq;
91186557Skmacy}
92186557Skmacy
93186557Skmacyextern void disable_irq(unsigned int);
94186557Skmacyextern void disable_irq_nosync(unsigned int);
95186557Skmacyextern void enable_irq(unsigned int);
96186557Skmacy
97186557Skmacyextern void irq_suspend(void);
98186557Skmacyextern void irq_resume(void);
99186557Skmacy
100186557Skmacyextern void	idle_block(void);
101186557Skmacyextern int	ap_cpu_initclocks(int cpu);
102186557Skmacy
103186557Skmacy#endif /* _XEN_INTR_H_ */
104