1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-01-30     GuEe-GUI     first version
9  */
10 
11 #ifndef __PIC_GIC_COMMON_H__
12 #define __PIC_GIC_COMMON_H__
13 
14 #include <rtdef.h>
15 
16 #ifdef RT_PCI_MSI
17 #include <drivers/pci_msi.h>
18 #endif
19 #include <drivers/ofw.h>
20 
21 #define GIC_SGI_NR  16
22 
23 #define GICD_INT_DEF_PRI        0xa0U
24 #define GICD_INT_DEF_PRI_X4     \
25 (                               \
26     (GICD_INT_DEF_PRI << 24) |  \
27     (GICD_INT_DEF_PRI << 16) |  \
28     (GICD_INT_DEF_PRI << 8) |   \
29     GICD_INT_DEF_PRI            \
30 )
31 
32 struct gic_quirk
33 {
34     const char *desc;
35     const char *compatible;
36     rt_err_t (*init)(void *data);
37 
38     rt_uint32_t iidr;
39     rt_uint32_t iidr_mask;
40 };
41 
42 void gic_common_init_quirk_ofw(const struct rt_ofw_node *ic_np, const struct gic_quirk *quirks, void *data);
43 void gic_common_init_quirk_hw(rt_uint32_t iidr, const struct gic_quirk *quirks, void *data);
44 
45 void gic_common_sgi_config(void *base, void *data, int irq_base);
46 rt_err_t gic_common_configure_irq(void *base, int irq, rt_uint32_t mode, void (*sync_access)(void *), void *data);
47 void gic_common_dist_config(void *base, int max_irqs, void (*sync_access)(void *), void *data);
48 void gic_common_cpu_config(void *base, int nr, void (*sync_access)(void *), void *data);
49 
50 void gic_fill_ppi_affinity(rt_bitmap_t *affinity);
51 
52 #ifdef RT_PIC_ARM_GIC_V2M
53 rt_err_t gicv2m_ofw_probe(struct rt_ofw_node *ic_np, const struct rt_ofw_node_id *id);
54 #endif
55 #ifdef RT_PIC_ARM_GIC_V3_ITS
56 rt_err_t gicv3_its_ofw_probe(struct rt_ofw_node *ic_np, const struct rt_ofw_node_id *id);
57 #endif
58 
59 #endif /* __PIC_GIC_COMMON_H__ */
60