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