diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2016-07-07 11:50:05 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-07-13 17:06:24 +1000 |
commit | 24cd81df5b0bf584a0d382b84f45099db46aa727 (patch) | |
tree | f53317c37af8c0f18a205f00e2e4dafd5fac004f /include/interrupts.h | |
parent | 1d5643c568f444c52e914013bc090ea55469cf49 (diff) | |
download | skiboot-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.h | 23 |
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); |