aboutsummaryrefslogtreecommitdiff
path: root/include/interrupts.h
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2016-07-07 11:50:05 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2016-07-13 17:06:24 +1000
commit24cd81df5b0bf584a0d382b84f45099db46aa727 (patch)
treef53317c37af8c0f18a205f00e2e4dafd5fac004f /include/interrupts.h
parent1d5643c568f444c52e914013bc090ea55469cf49 (diff)
downloadskiboot-24cd81df5b0bf584a0d382b84f45099db46aa727.zip
skiboot-24cd81df5b0bf584a0d382b84f45099db46aa727.tar.gz
skiboot-24cd81df5b0bf584a0d382b84f45099db46aa727.tar.bz2
interrupts: Expose irq_source and change prototypes of all ops
This makes irq_source public, and change all irq_source_ops to take the source pointer as a first argument (they can still dig the void * data out of that). This will allow us to embed/wrap it for XIVE later on. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'include/interrupts.h')
-rw-r--r--include/interrupts.h23
1 files changed, 17 insertions, 6 deletions
diff --git a/include/interrupts.h b/include/interrupts.h
index daa9747..3fba9d9 100644
--- a/include/interrupts.h
+++ b/include/interrupts.h
@@ -256,6 +256,8 @@ uint32_t p8_irq_to_phb(uint32_t irq);
* functions in this file (or the corresponding core/interrupts.c).
*/
+struct irq_source;
+
/*
* IRQ sources register themselves here. If an "interrupts" callback
* is provided, then all interrupts in that source will appear in
@@ -266,18 +268,27 @@ uint32_t p8_irq_to_phb(uint32_t irq);
* be used for XIVE interrupts coming from PHBs.
*/
struct irq_source_ops {
- int64_t (*set_xive)(void *data, uint32_t isn, uint16_t server,
- uint8_t priority);
- int64_t (*get_xive)(void *data, uint32_t isn, uint16_t *server,
- uint8_t *priority);
- void (*interrupt)(void *data, uint32_t isn);
+ int64_t (*set_xive)(struct irq_source *is, uint32_t isn,
+ uint16_t server, uint8_t priority);
+ int64_t (*get_xive)(struct irq_source *is, uint32_t isn,
+ uint16_t *server, uint8_t *priority);
+ void (*interrupt)(struct irq_source *is, uint32_t isn);
+ void (*eoi)(struct irq_source *is, uint32_t isn);
+};
- void (*eoi)(void *data, uint32_t isn);
+struct irq_source {
+ uint32_t start;
+ uint32_t end;
+ const struct irq_source_ops *ops;
+ void *data;
+ struct list_node link;
};
+extern void __register_irq_source(struct irq_source *is);
extern void register_irq_source(const struct irq_source_ops *ops, void *data,
uint32_t start, uint32_t count);
extern void unregister_irq_source(uint32_t start, uint32_t count);
+extern void adjust_irq_source(struct irq_source *is, uint32_t new_count);
extern uint32_t get_psi_interrupt(uint32_t chip_id);