12a6a4076SMarkus Armbruster #ifndef SH_INTC_H 22a6a4076SMarkus Armbruster #define SH_INTC_H 30d09e41aSPaolo Bonzini 4ec150c7eSMarkus Armbruster #include "exec/memory.h" 50d09e41aSPaolo Bonzini 60d09e41aSPaolo Bonzini typedef unsigned char intc_enum; 70d09e41aSPaolo Bonzini 80d09e41aSPaolo Bonzini struct intc_vect { 90d09e41aSPaolo Bonzini intc_enum enum_id; 100d09e41aSPaolo Bonzini unsigned short vect; 110d09e41aSPaolo Bonzini }; 120d09e41aSPaolo Bonzini 130d09e41aSPaolo Bonzini #define INTC_VECT(enum_id, vect) { enum_id, vect } 140d09e41aSPaolo Bonzini 150d09e41aSPaolo Bonzini struct intc_group { 160d09e41aSPaolo Bonzini intc_enum enum_id; 170d09e41aSPaolo Bonzini intc_enum enum_ids[32]; 180d09e41aSPaolo Bonzini }; 190d09e41aSPaolo Bonzini 200d09e41aSPaolo Bonzini #define INTC_GROUP(enum_id, ...) { enum_id, { __VA_ARGS__ } } 210d09e41aSPaolo Bonzini 220d09e41aSPaolo Bonzini struct intc_mask_reg { 230d09e41aSPaolo Bonzini unsigned long set_reg, clr_reg, reg_width; 240d09e41aSPaolo Bonzini intc_enum enum_ids[32]; 250d09e41aSPaolo Bonzini unsigned long value; 260d09e41aSPaolo Bonzini }; 270d09e41aSPaolo Bonzini 280d09e41aSPaolo Bonzini struct intc_prio_reg { 290d09e41aSPaolo Bonzini unsigned long set_reg, clr_reg, reg_width, field_width; 300d09e41aSPaolo Bonzini intc_enum enum_ids[16]; 310d09e41aSPaolo Bonzini unsigned long value; 320d09e41aSPaolo Bonzini }; 330d09e41aSPaolo Bonzini 340d09e41aSPaolo Bonzini #define _INTC_ARRAY(a) a, ARRAY_SIZE(a) 350d09e41aSPaolo Bonzini 360d09e41aSPaolo Bonzini struct intc_source { 370d09e41aSPaolo Bonzini unsigned short vect; 380d09e41aSPaolo Bonzini intc_enum next_enum_id; 390d09e41aSPaolo Bonzini 400d09e41aSPaolo Bonzini int asserted; /* emulates the interrupt signal line from device to intc */ 410d09e41aSPaolo Bonzini int enable_count; 420d09e41aSPaolo Bonzini int enable_max; 430d09e41aSPaolo Bonzini int pending; /* emulates the result of signal and masking */ 440d09e41aSPaolo Bonzini struct intc_desc *parent; 450d09e41aSPaolo Bonzini }; 460d09e41aSPaolo Bonzini 470d09e41aSPaolo Bonzini struct intc_desc { 480d09e41aSPaolo Bonzini MemoryRegion iomem; 490d09e41aSPaolo Bonzini MemoryRegion *iomem_aliases; 500d09e41aSPaolo Bonzini qemu_irq *irqs; 510d09e41aSPaolo Bonzini struct intc_source *sources; 520d09e41aSPaolo Bonzini int nr_sources; 530d09e41aSPaolo Bonzini struct intc_mask_reg *mask_regs; 540d09e41aSPaolo Bonzini int nr_mask_regs; 550d09e41aSPaolo Bonzini struct intc_prio_reg *prio_regs; 560d09e41aSPaolo Bonzini int nr_prio_regs; 570d09e41aSPaolo Bonzini int pending; /* number of interrupt sources that has pending set */ 580d09e41aSPaolo Bonzini }; 590d09e41aSPaolo Bonzini 600d09e41aSPaolo Bonzini int sh_intc_get_pending_vector(struct intc_desc *desc, int imask); 61*9b12fb10SBALATON Zoltan 620d09e41aSPaolo Bonzini void sh_intc_toggle_source(struct intc_source *source, 630d09e41aSPaolo Bonzini int enable_adj, int assert_adj); 640d09e41aSPaolo Bonzini 650d09e41aSPaolo Bonzini void sh_intc_register_sources(struct intc_desc *desc, 660d09e41aSPaolo Bonzini struct intc_vect *vectors, 670d09e41aSPaolo Bonzini int nr_vectors, 680d09e41aSPaolo Bonzini struct intc_group *groups, 690d09e41aSPaolo Bonzini int nr_groups); 700d09e41aSPaolo Bonzini 710d09e41aSPaolo Bonzini int sh_intc_init(MemoryRegion *sysmem, 720d09e41aSPaolo Bonzini struct intc_desc *desc, 730d09e41aSPaolo Bonzini int nr_sources, 740d09e41aSPaolo Bonzini struct intc_mask_reg *mask_regs, 750d09e41aSPaolo Bonzini int nr_mask_regs, 760d09e41aSPaolo Bonzini struct intc_prio_reg *prio_regs, 770d09e41aSPaolo Bonzini int nr_prio_regs); 780d09e41aSPaolo Bonzini 790d09e41aSPaolo Bonzini void sh_intc_set_irl(void *opaque, int n, int level); 800d09e41aSPaolo Bonzini 812a6a4076SMarkus Armbruster #endif /* SH_INTC_H */ 82