xref: /qemu/include/hw/intc/aspeed_intc.h (revision 38ba38d87df3421ee0b28f9dfaf393456861a8e0)
1d831c5fdSJamin Lin /*
2d831c5fdSJamin Lin  * ASPEED INTC Controller
3d831c5fdSJamin Lin  *
4d831c5fdSJamin Lin  * Copyright (C) 2024 ASPEED Technology Inc.
5d831c5fdSJamin Lin  *
6d831c5fdSJamin Lin  * SPDX-License-Identifier: GPL-2.0-or-later
7d831c5fdSJamin Lin  */
8d831c5fdSJamin Lin #ifndef ASPEED_INTC_H
9d831c5fdSJamin Lin #define ASPEED_INTC_H
10d831c5fdSJamin Lin 
11d831c5fdSJamin Lin #include "hw/sysbus.h"
12d831c5fdSJamin Lin #include "qom/object.h"
13d831c5fdSJamin Lin #include "hw/or-irq.h"
14d831c5fdSJamin Lin 
15d831c5fdSJamin Lin #define TYPE_ASPEED_INTC "aspeed.intc"
16d831c5fdSJamin Lin #define TYPE_ASPEED_2700_INTC TYPE_ASPEED_INTC "-ast2700"
17*38ba38d8SJamin Lin #define TYPE_ASPEED_2700_INTCIO TYPE_ASPEED_INTC "io-ast2700"
18d831c5fdSJamin Lin OBJECT_DECLARE_TYPE(AspeedINTCState, AspeedINTCClass, ASPEED_INTC)
19d831c5fdSJamin Lin 
209178ff91SJamin Lin #define ASPEED_INTC_MAX_INPINS 10
219178ff91SJamin Lin #define ASPEED_INTC_MAX_OUTPINS 19
22d831c5fdSJamin Lin 
23ab24c6a2SJamin Lin typedef struct AspeedINTCIRQ {
24ab24c6a2SJamin Lin     int inpin_idx;
25ab24c6a2SJamin Lin     int outpin_idx;
26ab24c6a2SJamin Lin     int num_outpins;
27ab24c6a2SJamin Lin     uint32_t enable_reg;
28ab24c6a2SJamin Lin     uint32_t status_reg;
29ab24c6a2SJamin Lin } AspeedINTCIRQ;
30ab24c6a2SJamin Lin 
31d831c5fdSJamin Lin struct AspeedINTCState {
32d831c5fdSJamin Lin     /*< private >*/
33d831c5fdSJamin Lin     SysBusDevice parent_obj;
34d831c5fdSJamin Lin 
35d831c5fdSJamin Lin     /*< public >*/
36d831c5fdSJamin Lin     MemoryRegion iomem;
37c5728c34SJamin Lin     MemoryRegion iomem_container;
38c5728c34SJamin Lin 
39563afea0SJamin Lin     uint32_t *regs;
4063f3618fSJamin Lin     OrIRQState orgates[ASPEED_INTC_MAX_INPINS];
4135c909cdSJamin Lin     qemu_irq output_pins[ASPEED_INTC_MAX_OUTPINS];
42d831c5fdSJamin Lin 
4363f3618fSJamin Lin     uint32_t enable[ASPEED_INTC_MAX_INPINS];
4463f3618fSJamin Lin     uint32_t mask[ASPEED_INTC_MAX_INPINS];
4563f3618fSJamin Lin     uint32_t pending[ASPEED_INTC_MAX_INPINS];
46d831c5fdSJamin Lin };
47d831c5fdSJamin Lin 
48d831c5fdSJamin Lin struct AspeedINTCClass {
49d831c5fdSJamin Lin     SysBusDeviceClass parent_class;
50d831c5fdSJamin Lin 
51d831c5fdSJamin Lin     uint32_t num_lines;
5263f3618fSJamin Lin     uint32_t num_inpins;
5335c909cdSJamin Lin     uint32_t num_outpins;
54c5728c34SJamin Lin     uint64_t mem_size;
55b008465dSJamin Lin     uint64_t nr_regs;
567ffee511SJamin Lin     uint64_t reg_offset;
5728194d5dSJamin Lin     const MemoryRegionOps *reg_ops;
58ab24c6a2SJamin Lin     const AspeedINTCIRQ *irq_table;
59ab24c6a2SJamin Lin     int irq_table_count;
60d831c5fdSJamin Lin };
61d831c5fdSJamin Lin 
62d831c5fdSJamin Lin #endif /* ASPEED_INTC_H */
63