1 // Copyright 2017 The Fuchsia Authors 2 // 3 // Use of this source code is governed by a MIT-style 4 // license that can be found in the LICENSE file or at 5 // https://opensource.org/licenses/MIT 6 7 #pragma once 8 9 #include <dev/interrupt.h> 10 #include <zircon/compiler.h> 11 #include <zircon/types.h> 12 13 __BEGIN_CDECLS 14 15 struct int_handler_struct { 16 int_handler handler; 17 void* arg; 18 }; 19 20 struct int_handler_struct* pdev_get_int_handler(unsigned int vector); 21 22 // Interrupt Controller interface 23 struct pdev_interrupt_ops { 24 zx_status_t (*mask)(unsigned int vector); 25 zx_status_t (*unmask)(unsigned int vector); 26 zx_status_t (*configure)(unsigned int vector, 27 enum interrupt_trigger_mode tm, 28 enum interrupt_polarity pol); 29 zx_status_t (*get_config)(unsigned int vector, 30 enum interrupt_trigger_mode* tm, 31 enum interrupt_polarity* pol); 32 bool (*is_valid)(unsigned int vector, uint32_t flags); 33 uint32_t (*get_base_vector)(void); 34 uint32_t (*get_max_vector)(void); 35 unsigned int (*remap)(unsigned int vector); 36 zx_status_t (*send_ipi)(cpu_mask_t target, mp_ipi_t ipi); 37 void (*init_percpu_early)(void); 38 void (*init_percpu)(void); 39 void (*handle_irq)(iframe* frame); 40 void (*handle_fiq)(iframe* frame); 41 void (*shutdown)(void); 42 void (*shutdown_cpu)(void); 43 bool (*msi_is_supported)(void); 44 bool (*msi_supports_masking)(void); 45 void (*msi_mask_unmask)(const msi_block_t* block, uint msi_id, bool mask); 46 zx_status_t (*msi_alloc_block)(uint requested_irqs, 47 bool can_target_64bit, 48 bool is_msix, 49 msi_block_t* out_block); 50 void (*msi_free_block)(msi_block_t* block); 51 void (*msi_register_handler)(const msi_block_t* block, 52 uint msi_id, 53 int_handler handler, 54 void* ctx); 55 }; 56 57 void pdev_register_interrupts(const struct pdev_interrupt_ops* ops); 58 59 __END_CDECLS 60