1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * LoongArch IPI interrupt support
5 * Copyright (C) 2024 Loongson Technology Corporation Limited
8 #include "qemu/osdep.h"
10 #include "hw/intc/loongarch_ipi.h"
11 #include "target/loongarch/cpu.h"
13 static AddressSpace
*get_iocsr_as(CPUState
*cpu
)
15 return LOONGARCH_CPU(cpu
)->env
.address_space_iocsr
;
18 static int archid_cmp(const void *a
, const void *b
)
20 CPUArchId
*archid_a
= (CPUArchId
*)a
;
21 CPUArchId
*archid_b
= (CPUArchId
*)b
;
23 return archid_a
->arch_id
- archid_b
->arch_id
;
26 static CPUArchId
*find_cpu_by_archid(MachineState
*ms
, uint32_t id
)
28 CPUArchId apic_id
, *found_cpu
;
31 found_cpu
= bsearch(&apic_id
, ms
->possible_cpus
->cpus
,
32 ms
->possible_cpus
->len
,
33 sizeof(*ms
->possible_cpus
->cpus
),
39 static CPUState
*loongarch_cpu_by_arch_id(int64_t arch_id
)
41 MachineState
*machine
= MACHINE(qdev_get_machine());
44 archid
= find_cpu_by_archid(machine
, arch_id
);
46 return CPU(archid
->cpu
);
52 static void loongarch_ipi_class_init(ObjectClass
*klass
, void *data
)
54 LoongsonIPICommonClass
*licc
= LOONGSON_IPI_COMMON_CLASS(klass
);
56 licc
->get_iocsr_as
= get_iocsr_as
;
57 licc
->cpu_by_arch_id
= loongarch_cpu_by_arch_id
;
60 static const TypeInfo loongarch_ipi_types
[] = {
62 .name
= TYPE_LOONGARCH_IPI
,
63 .parent
= TYPE_LOONGSON_IPI_COMMON
,
64 .class_init
= loongarch_ipi_class_init
,
68 DEFINE_TYPES(loongarch_ipi_types
)