1fea46db1SBibo Mao /* SPDX-License-Identifier: GPL-2.0-or-later */ 2fea46db1SBibo Mao /* 3fea46db1SBibo Mao * LoongArch 3A5000 ext interrupt controller definitions 4fea46db1SBibo Mao * Copyright (C) 2024 Loongson Technology Corporation Limited 5fea46db1SBibo Mao */ 6fea46db1SBibo Mao 7fea46db1SBibo Mao #ifndef LOONGARCH_EXTIOI_COMMON_H 8fea46db1SBibo Mao #define LOONGARCH_EXTIOI_COMMON_H 9fea46db1SBibo Mao 10272c467aSBibo Mao #include "qom/object.h" 11fea46db1SBibo Mao #include "hw/sysbus.h" 12fea46db1SBibo Mao #include "hw/loongarch/virt.h" 13fea46db1SBibo Mao 14fea46db1SBibo Mao #define LS3A_INTC_IP 8 15fea46db1SBibo Mao #define EXTIOI_IRQS (256) 16fea46db1SBibo Mao #define EXTIOI_IRQS_BITMAP_SIZE (256 / 8) 17fea46db1SBibo Mao /* irq from EXTIOI is routed to no more than 4 cpus */ 18fea46db1SBibo Mao #define EXTIOI_CPUS (4) 19fea46db1SBibo Mao /* map to ipnum per 32 irqs */ 20fea46db1SBibo Mao #define EXTIOI_IRQS_IPMAP_SIZE (256 / 32) 21fea46db1SBibo Mao #define EXTIOI_IRQS_COREMAP_SIZE 256 22fea46db1SBibo Mao #define EXTIOI_IRQS_NODETYPE_COUNT 16 23fea46db1SBibo Mao #define EXTIOI_IRQS_GROUP_COUNT 8 24fea46db1SBibo Mao 25fea46db1SBibo Mao #define APIC_OFFSET 0x400 26fea46db1SBibo Mao #define APIC_BASE (0x1000ULL + APIC_OFFSET) 27fea46db1SBibo Mao #define EXTIOI_NODETYPE_START (0x4a0 - APIC_OFFSET) 28fea46db1SBibo Mao #define EXTIOI_NODETYPE_END (0x4c0 - APIC_OFFSET) 29fea46db1SBibo Mao #define EXTIOI_IPMAP_START (0x4c0 - APIC_OFFSET) 30fea46db1SBibo Mao #define EXTIOI_IPMAP_END (0x4c8 - APIC_OFFSET) 31fea46db1SBibo Mao #define EXTIOI_ENABLE_START (0x600 - APIC_OFFSET) 32fea46db1SBibo Mao #define EXTIOI_ENABLE_END (0x620 - APIC_OFFSET) 33fea46db1SBibo Mao #define EXTIOI_BOUNCE_START (0x680 - APIC_OFFSET) 34fea46db1SBibo Mao #define EXTIOI_BOUNCE_END (0x6a0 - APIC_OFFSET) 35fea46db1SBibo Mao #define EXTIOI_ISR_START (0x700 - APIC_OFFSET) 36fea46db1SBibo Mao #define EXTIOI_ISR_END (0x720 - APIC_OFFSET) 37fea46db1SBibo Mao #define EXTIOI_COREISR_START (0x800 - APIC_OFFSET) 38fea46db1SBibo Mao #define EXTIOI_COREISR_END (0xB20 - APIC_OFFSET) 39fea46db1SBibo Mao #define EXTIOI_COREMAP_START (0xC00 - APIC_OFFSET) 40fea46db1SBibo Mao #define EXTIOI_COREMAP_END (0xD00 - APIC_OFFSET) 41fea46db1SBibo Mao #define EXTIOI_SIZE 0x800 42fea46db1SBibo Mao 43fea46db1SBibo Mao #define EXTIOI_VIRT_BASE (0x40000000) 44fea46db1SBibo Mao #define EXTIOI_VIRT_SIZE (0x1000) 45fea46db1SBibo Mao #define EXTIOI_VIRT_FEATURES (0x0) 46fea46db1SBibo Mao #define EXTIOI_HAS_VIRT_EXTENSION (0) 47fea46db1SBibo Mao #define EXTIOI_HAS_ENABLE_OPTION (1) 48fea46db1SBibo Mao #define EXTIOI_HAS_INT_ENCODE (2) 49fea46db1SBibo Mao #define EXTIOI_HAS_CPU_ENCODE (3) 50fea46db1SBibo Mao #define EXTIOI_VIRT_HAS_FEATURES (BIT(EXTIOI_HAS_VIRT_EXTENSION) \ 51fea46db1SBibo Mao | BIT(EXTIOI_HAS_ENABLE_OPTION) \ 52fea46db1SBibo Mao | BIT(EXTIOI_HAS_CPU_ENCODE)) 53fea46db1SBibo Mao #define EXTIOI_VIRT_CONFIG (0x4) 54fea46db1SBibo Mao #define EXTIOI_ENABLE (1) 55fea46db1SBibo Mao #define EXTIOI_ENABLE_INT_ENCODE (2) 56fea46db1SBibo Mao #define EXTIOI_ENABLE_CPU_ENCODE (3) 57fea46db1SBibo Mao #define EXTIOI_VIRT_COREMAP_START (0x40) 58fea46db1SBibo Mao #define EXTIOI_VIRT_COREMAP_END (0x240) 59593c6b86SBibo Mao 60272c467aSBibo Mao #define TYPE_LOONGARCH_EXTIOI_COMMON "loongarch_extioi_common" 61272c467aSBibo Mao OBJECT_DECLARE_TYPE(LoongArchExtIOICommonState, 62272c467aSBibo Mao LoongArchExtIOICommonClass, LOONGARCH_EXTIOI_COMMON) 63272c467aSBibo Mao 64593c6b86SBibo Mao typedef struct ExtIOICore { 65593c6b86SBibo Mao uint32_t coreisr[EXTIOI_IRQS_GROUP_COUNT]; 66593c6b86SBibo Mao DECLARE_BITMAP(sw_isr[LS3A_INTC_IP], EXTIOI_IRQS); 67593c6b86SBibo Mao qemu_irq parent_irq[LS3A_INTC_IP]; 68*5a3e068dSBibo Mao uint64_t arch_id; 69*5a3e068dSBibo Mao CPUState *cpu; 70593c6b86SBibo Mao } ExtIOICore; 71593c6b86SBibo Mao 726f54d920SBibo Mao struct LoongArchExtIOICommonState { 73593c6b86SBibo Mao SysBusDevice parent_obj; 74593c6b86SBibo Mao uint32_t num_cpu; 75593c6b86SBibo Mao uint32_t features; 76593c6b86SBibo Mao uint32_t status; 77593c6b86SBibo Mao /* hardware state */ 78593c6b86SBibo Mao uint32_t nodetype[EXTIOI_IRQS_NODETYPE_COUNT / 2]; 79593c6b86SBibo Mao uint32_t bounce[EXTIOI_IRQS_GROUP_COUNT]; 80593c6b86SBibo Mao uint32_t isr[EXTIOI_IRQS / 32]; 81593c6b86SBibo Mao uint32_t enable[EXTIOI_IRQS / 32]; 82593c6b86SBibo Mao uint32_t ipmap[EXTIOI_IRQS_IPMAP_SIZE / 4]; 83593c6b86SBibo Mao uint32_t coremap[EXTIOI_IRQS / 4]; 84593c6b86SBibo Mao uint32_t sw_pending[EXTIOI_IRQS / 32]; 85593c6b86SBibo Mao uint8_t sw_ipmap[EXTIOI_IRQS_IPMAP_SIZE]; 86593c6b86SBibo Mao uint8_t sw_coremap[EXTIOI_IRQS]; 87593c6b86SBibo Mao qemu_irq irq[EXTIOI_IRQS]; 88593c6b86SBibo Mao ExtIOICore *cpu; 89593c6b86SBibo Mao MemoryRegion extioi_system_mem; 90593c6b86SBibo Mao MemoryRegion virt_extend; 91593c6b86SBibo Mao }; 92272c467aSBibo Mao 93272c467aSBibo Mao struct LoongArchExtIOICommonClass { 94272c467aSBibo Mao SysBusDeviceClass parent_class; 95272c467aSBibo Mao 96272c467aSBibo Mao DeviceRealize parent_realize; 97ff09444aSBibo Mao int (*pre_save)(void *s); 98272c467aSBibo Mao int (*post_load)(void *s, int version_id); 99272c467aSBibo Mao }; 100fea46db1SBibo Mao #endif /* LOONGARCH_EXTIOI_H */ 101