diff options
author | David Vrabel <david.vrabel@citrix.com> | 2013-03-18 12:54:57 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2014-01-06 10:07:46 -0500 |
commit | 083858758f67bb20ef6be5bc8442be91cca8ee2d (patch) | |
tree | b45bb4bda1a207678ccff684c5910c21bf85d897 /drivers/xen | |
parent | 96d4c5881806ebb993a3d84991af9c96fa9cd576 (diff) |
xen/events: add a evtchn_op for port setup
Add a hook for port-specific setup and call it from
xen_irq_info_common_setup().
The FIFO-based ABIs may need to perform additional setup (expanding
the event array) before a bound event channel can start to receive
events.
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Diffstat (limited to 'drivers/xen')
-rw-r--r-- | drivers/xen/events/events_base.c | 2 | ||||
-rw-r--r-- | drivers/xen/events/events_internal.h | 12 |
2 files changed, 13 insertions, 1 deletions
diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c index 4f7d94abe82c..929eccb77270 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c | |||
@@ -117,7 +117,7 @@ static int xen_irq_info_common_setup(struct irq_info *info, | |||
117 | 117 | ||
118 | irq_clear_status_flags(irq, IRQ_NOREQUEST|IRQ_NOAUTOEN); | 118 | irq_clear_status_flags(irq, IRQ_NOREQUEST|IRQ_NOAUTOEN); |
119 | 119 | ||
120 | return 0; | 120 | return xen_evtchn_port_setup(info); |
121 | } | 121 | } |
122 | 122 | ||
123 | static int xen_irq_info_evtchn_setup(unsigned irq, | 123 | static int xen_irq_info_evtchn_setup(unsigned irq, |
diff --git a/drivers/xen/events/events_internal.h b/drivers/xen/events/events_internal.h index ba8142f0c635..dc9650265e04 100644 --- a/drivers/xen/events/events_internal.h +++ b/drivers/xen/events/events_internal.h | |||
@@ -55,6 +55,7 @@ struct irq_info { | |||
55 | #define PIRQ_SHAREABLE (1 << 1) | 55 | #define PIRQ_SHAREABLE (1 << 1) |
56 | 56 | ||
57 | struct evtchn_ops { | 57 | struct evtchn_ops { |
58 | int (*setup)(struct irq_info *info); | ||
58 | void (*bind_to_cpu)(struct irq_info *info, unsigned cpu); | 59 | void (*bind_to_cpu)(struct irq_info *info, unsigned cpu); |
59 | 60 | ||
60 | void (*clear_pending)(unsigned port); | 61 | void (*clear_pending)(unsigned port); |
@@ -75,6 +76,17 @@ struct irq_info *info_for_irq(unsigned irq); | |||
75 | unsigned cpu_from_irq(unsigned irq); | 76 | unsigned cpu_from_irq(unsigned irq); |
76 | unsigned cpu_from_evtchn(unsigned int evtchn); | 77 | unsigned cpu_from_evtchn(unsigned int evtchn); |
77 | 78 | ||
79 | /* | ||
80 | * Do any ABI specific setup for a bound event channel before it can | ||
81 | * be unmasked and used. | ||
82 | */ | ||
83 | static inline int xen_evtchn_port_setup(struct irq_info *info) | ||
84 | { | ||
85 | if (evtchn_ops->setup) | ||
86 | return evtchn_ops->setup(info); | ||
87 | return 0; | ||
88 | } | ||
89 | |||
78 | static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info, | 90 | static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info, |
79 | unsigned cpu) | 91 | unsigned cpu) |
80 | { | 92 | { |