diff options
| author | Stefan Hajnoczi <stefanha@redhat.com> | 2025-01-16 09:02:39 -0500 |
|---|---|---|
| committer | Stefan Hajnoczi <stefanha@redhat.com> | 2025-01-16 09:02:40 -0500 |
| commit | 9061ee2a180a7ae24dfea44e2469ce47cc6cd23c (patch) | |
| tree | 58f7b9e8bf07ce215440e05c2e6ce275d9542655 /hw/intc/loongarch_ipi.c | |
| parent | 0e3327b690b76b7c3966b028110ee053cc16a385 (diff) | |
| parent | bb81f237401b5f89f6bba21d9d4f50e0073372a6 (diff) | |
| download | focaccia-qemu-9061ee2a180a7ae24dfea44e2469ce47cc6cd23c.tar.gz focaccia-qemu-9061ee2a180a7ae24dfea44e2469ce47cc6cd23c.zip | |
Merge tag 'pull-loongarch-20250116' of https://gitlab.com/bibo-mao/qemu into staging
loongarch queue # -----BEGIN PGP SIGNATURE----- # # iHUEABYKAB0WIQQNhkKjomWfgLCz0aQfewwSUazn0QUCZ4hk/QAKCRAfewwSUazn # 0WagAQDgJaWBLQxZkyQR2FQm3WHg3Uf/qolab9nDGo3b2BpixgD/RdvZf+mZpAwf # 2ipAQ7g5GqGTKtTAdqO/aBAqTCZCqQU= # =7KKt # -----END PGP SIGNATURE----- # gpg: Signature made Wed 15 Jan 2025 20:46:37 EST # gpg: using EDDSA key 0D8642A3A2659F80B0B3D1A41F7B0C1251ACE7D1 # gpg: Good signature from "bibo mao <maobibo@loongson.cn>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 7044 3A00 19C0 E97A 31C7 13C4 8E86 8FB7 A176 9D4C # Subkey fingerprint: 0D86 42A3 A265 9F80 B0B3 D1A4 1F7B 0C12 51AC E7D1 * tag 'pull-loongarch-20250116' of https://gitlab.com/bibo-mao/qemu: hw/intc/loongarch_ipi: Use alternative implemation for cpu_by_arch_id hw/intc/loongson_ipi: Add more input parameter for cpu_by_arch_id hw/intc/loongarch_ipi: Remove property num-cpu hw/intc/loongarch_ipi: Get cpu number from possible_cpu_arch_ids hw/intc/loongson_ipi: Remove property num_cpu from loongson_ipi_common hw/intc/loongson_ipi: Remove num_cpu from loongson_ipi_common hw/intc/loongarch_ipi: Implement realize interface target/loongarch: Add page table walker support for debugger usage Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'hw/intc/loongarch_ipi.c')
| -rw-r--r-- | hw/intc/loongarch_ipi.c | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/hw/intc/loongarch_ipi.c b/hw/intc/loongarch_ipi.c index 2ae1a42c46..5376f1e084 100644 --- a/hw/intc/loongarch_ipi.c +++ b/hw/intc/loongarch_ipi.c @@ -7,7 +7,9 @@ #include "qemu/osdep.h" #include "hw/boards.h" +#include "qapi/error.h" #include "hw/intc/loongarch_ipi.h" +#include "hw/qdev-properties.h" #include "target/loongarch/cpu.h" static AddressSpace *get_iocsr_as(CPUState *cpu) @@ -15,44 +17,73 @@ static AddressSpace *get_iocsr_as(CPUState *cpu) return LOONGARCH_CPU(cpu)->env.address_space_iocsr; } -static int archid_cmp(const void *a, const void *b) +static int loongarch_ipi_cmp(const void *a, const void *b) { - CPUArchId *archid_a = (CPUArchId *)a; - CPUArchId *archid_b = (CPUArchId *)b; + IPICore *ipi_a = (IPICore *)a; + IPICore *ipi_b = (IPICore *)b; - return archid_a->arch_id - archid_b->arch_id; + return ipi_a->arch_id - ipi_b->arch_id; } -static CPUArchId *find_cpu_by_archid(MachineState *ms, uint32_t id) +static int loongarch_cpu_by_arch_id(LoongsonIPICommonState *lics, + int64_t arch_id, int *index, CPUState **pcs) { - CPUArchId apic_id, *found_cpu; + IPICore ipi, *found; - apic_id.arch_id = id; - found_cpu = bsearch(&apic_id, ms->possible_cpus->cpus, - ms->possible_cpus->len, - sizeof(*ms->possible_cpus->cpus), - archid_cmp); + ipi.arch_id = arch_id; + found = bsearch(&ipi, lics->cpu, lics->num_cpu, sizeof(IPICore), + loongarch_ipi_cmp); + if (found && found->cpu) { + if (index) { + *index = found - lics->cpu; + } - return found_cpu; + if (pcs) { + *pcs = found->cpu; + } + + return MEMTX_OK; + } + + return MEMTX_ERROR; } -static CPUState *loongarch_cpu_by_arch_id(int64_t arch_id) +static void loongarch_ipi_realize(DeviceState *dev, Error **errp) { + LoongsonIPICommonState *lics = LOONGSON_IPI_COMMON(dev); + LoongarchIPIClass *lic = LOONGARCH_IPI_GET_CLASS(dev); MachineState *machine = MACHINE(qdev_get_machine()); - CPUArchId *archid; + MachineClass *mc = MACHINE_GET_CLASS(machine); + const CPUArchIdList *id_list; + Error *local_err = NULL; + int i; - archid = find_cpu_by_archid(machine, arch_id); - if (archid) { - return CPU(archid->cpu); + lic->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; } - return NULL; + assert(mc->possible_cpu_arch_ids); + id_list = mc->possible_cpu_arch_ids(machine); + lics->num_cpu = id_list->len; + lics->cpu = g_new0(IPICore, lics->num_cpu); + for (i = 0; i < lics->num_cpu; i++) { + lics->cpu[i].arch_id = id_list->cpus[i].arch_id; + lics->cpu[i].cpu = CPU(id_list->cpus[i].cpu); + lics->cpu[i].ipi = lics; + qdev_init_gpio_out(dev, &lics->cpu[i].irq, 1); + } } static void loongarch_ipi_class_init(ObjectClass *klass, void *data) { LoongsonIPICommonClass *licc = LOONGSON_IPI_COMMON_CLASS(klass); + LoongarchIPIClass *lic = LOONGARCH_IPI_CLASS(klass); + DeviceClass *dc = DEVICE_CLASS(klass); + device_class_set_parent_realize(dc, loongarch_ipi_realize, + &lic->parent_realize); licc->get_iocsr_as = get_iocsr_as; licc->cpu_by_arch_id = loongarch_cpu_by_arch_id; } @@ -61,6 +92,8 @@ static const TypeInfo loongarch_ipi_types[] = { { .name = TYPE_LOONGARCH_IPI, .parent = TYPE_LOONGSON_IPI_COMMON, + .instance_size = sizeof(LoongarchIPIState), + .class_size = sizeof(LoongarchIPIClass), .class_init = loongarch_ipi_class_init, } }; |