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