// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later /* * XIVE: eXternal Interrupt Virtualization Engine. POWER9 interrupt * controller * * Copyright (c) 2016-2019, IBM Corporation. */ #ifndef XIVE_H #define XIVE_H /* Internal APIs to other modules */ /* IRQ allocators return this on failure */ #define XIVE_IRQ_ERROR 0xffffffff void init_xive(void); int64_t xive_reset(void); /* Allocate a chunk of HW sources */ uint32_t xive_alloc_hw_irqs(uint32_t chip_id, uint32_t count, uint32_t align); /* Allocate a chunk of IPI sources */ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align); /* Get notification port address for a HW source entity */ #define XIVE_HW_SRC_PHBn(__n) (__n) #define XIVE_HW_SRC_PSI 8 uint64_t xive_get_notify_port(uint32_t chip_id, uint32_t ent); __attrconst uint32_t xive_get_notify_base(uint32_t girq); /* XIVE feature flag to de/activate store EOI */ #define XIVE_STORE_EOI_ENABLED 0 /* Internal IRQ flags */ #define XIVE_SRC_TRIGGER_PAGE 0x01 /* Trigger page exist (either separate * or not, so different from the OPAL * flag which is only set when the * trigger page is separate). */ #define XIVE_SRC_EOI_PAGE1 0x02 /* EOI on the second page */ #define XIVE_SRC_STORE_EOI 0x04 /* EOI using stores supported */ #define XIVE_SRC_LSI 0x08 /* Interrupt is an LSI */ struct irq_source_ops; void xive_register_hw_source(uint32_t base, uint32_t count, uint32_t shift, void *mmio, uint32_t flags, void *data, const struct irq_source_ops *ops); void xive_register_ipi_source(uint32_t base, uint32_t count, void *data, const struct irq_source_ops *ops); void xive_cpu_callin(struct cpu_thread *cpu); /* Get the trigger page address for an interrupt allocated with * xive_alloc_ipi_irqs() */ void *xive_get_trigger_port(uint32_t girq); /* To be used by PSI to prevent asserted LSI to constantly re-fire */ struct irq_source; void xive_source_mask(struct irq_source *is, uint32_t isn); void xive_cpu_reset(void); void xive_late_init(void); /* * POWER10 */ /* * StoreEOI requires the OS to enforce load-after-store ordering and * the PHB5 should be configured in Address-based trigger mode with PQ * state bit offloading. */ #define XIVE2_STORE_EOI_ENABLED xive2_cap_store_eoi() void xive2_init(void); bool xive2_cap_phb_pq_disable(void); bool xive2_cap_phb_abt(void); bool xive2_cap_store_eoi(void); int64_t xive2_reset(void); uint32_t xive2_get_phandle(void); uint32_t xive2_alloc_hw_irqs(uint32_t chip_id, uint32_t count, uint32_t align); uint32_t xive2_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align); uint64_t xive2_get_notify_port(uint32_t chip_id, uint32_t ent); __attrconst uint32_t xive2_get_notify_base(uint32_t girq); void xive2_register_hw_source(uint32_t base, uint32_t count, uint32_t shift, void *mmio, uint32_t flags, void *data, const struct irq_source_ops *ops); void xive2_register_ipi_source(uint32_t base, uint32_t count, void *data, const struct irq_source_ops *ops); void xive2_register_esb_source(uint32_t base, uint32_t count); uint64_t xive2_get_esb_base(uint32_t girq); void xive2_cpu_callin(struct cpu_thread *cpu); void *xive2_get_trigger_port(uint32_t girq); void xive2_source_mask(struct irq_source *is, uint32_t isn); void xive2_cpu_reset(void); void xive2_late_init(void); #endif /* XIVE_H */