From: Igor Mammedov <imammedo@redhat.com>
To: Bibo Mao <maobibo@loongson.cn>
Cc: Song Gao <gaosong@loongson.cn>,
Paolo Bonzini <pbonzini@redhat.com>,
Zhao Liu <zhao1.liu@intel.com>,
Jiaxun Yang <jiaxun.yang@flygoat.com>,
Xianglai Li <lixianglai@loongson.cn>,
qemu-devel@nongnu.org
Subject: Re: [PATCH v4 3/6] hw/loongarch/virt: Add generic function to init interrupt pin of CPU
Date: Mon, 18 Nov 2024 17:43:46 +0100 [thread overview]
Message-ID: <20241118174346.23b6d2ee@imammedo.users.ipa.redhat.com> (raw)
In-Reply-To: <20241112021738.1952851-4-maobibo@loongson.cn>
On Tue, 12 Nov 2024 10:17:35 +0800
Bibo Mao <maobibo@loongson.cn> wrote:
> Here generic function virt_init_cpu_irq() is added to init interrupt
> pin of CPU object, IPI and extioi interrupt controllers are connected
> to interrupt pin of CPU object.
>
> The generic function can be used to both cold-plug and hot-plug CPUs.
this patch is heavily depends on cpu_index and specific order CPUs
are created.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
> hw/loongarch/virt.c | 78 ++++++++++++++++++++++++-------------
> include/hw/loongarch/virt.h | 2 +
> 2 files changed, 53 insertions(+), 27 deletions(-)
>
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index b6b616d278..621380e2b3 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -58,6 +58,20 @@ static bool virt_is_veiointc_enabled(LoongArchVirtMachineState *lvms)
> return true;
> }
>
> +static CPUState *virt_get_cpu(MachineState *ms, int index)
> +{
> + MachineClass *mc = MACHINE_GET_CLASS(ms);
> + const CPUArchIdList *possible_cpus;
> +
> + /* Init CPUs */
> + possible_cpus = mc->possible_cpu_arch_ids(ms);
> + if (index < 0 || index >= possible_cpus->len) {
> + return NULL;
> + }
> +
> + return possible_cpus->cpus[index].cpu;
> +}
instead of adding this helper I'd suggest to try reusing
virt_find_cpu_slot() added in previous patch.
> +
> static void virt_get_veiointc(Object *obj, Visitor *v, const char *name,
> void *opaque, Error **errp)
> {
> @@ -365,7 +379,7 @@ static void create_fdt(LoongArchVirtMachineState *lvms)
> static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
> {
> int num;
> - const MachineState *ms = MACHINE(lvms);
> + MachineState *ms = MACHINE(lvms);
> int smp_cpus = ms->smp.cpus;
>
> qemu_fdt_add_subnode(ms->fdt, "/cpus");
> @@ -375,7 +389,7 @@ static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
> /* cpu nodes */
> for (num = smp_cpus - 1; num >= 0; num--) {
loops based on smp_cpus become broken as soon as you have
'-smp x, -device your-cpu,...
since it doesn't take in account '-device' created CPUs.
You likely need to replace such loops to iterate over possible_cpus
(in a separate patch please)
> char *nodename = g_strdup_printf("/cpus/cpu@%d", num);
> - LoongArchCPU *cpu = LOONGARCH_CPU(qemu_get_cpu(num));
> + LoongArchCPU *cpu = LOONGARCH_CPU(virt_get_cpu(ms, num));
> CPUState *cs = CPU(cpu);
>
> qemu_fdt_add_subnode(ms->fdt, nodename);
> @@ -783,16 +797,42 @@ static void virt_devices_init(DeviceState *pch_pic,
> lvms->platform_bus_dev = create_platform_bus(pch_pic);
> }
>
> +static void virt_init_cpu_irq(MachineState *ms, CPUState *cs)
> +{
> + LoongArchCPU *cpu = LOONGARCH_CPU(cs);
> + CPULoongArchState *env;
> + LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
> + int pin;
> +
> + if (!lvms->ipi || !lvms->extioi) {
> + return;
> + }
> +
> + env = &(cpu->env);
> + env->address_space_iocsr = &lvms->as_iocsr;
> + env->ipistate = lvms->ipi;
> + /* connect ipi irq to cpu irq, logic cpu index used here */
> + qdev_connect_gpio_out(lvms->ipi, cs->cpu_index,
I'd try to avoid using cpu_index (basically internal CPU detail) when
wiring components together. It would be better to implement this the way
the real hw does it.
> + qdev_get_gpio_in(DEVICE(cs), IRQ_IPI));
> +
> + /*
> + * connect ext irq to the cpu irq
> + * cpu_pin[9:2] <= intc_pin[7:0]
> + */
> + for (pin = 0; pin < LS3A_INTC_IP; pin++) {
> + qdev_connect_gpio_out(lvms->extioi, cs->cpu_index * LS3A_INTC_IP + pin,
> + qdev_get_gpio_in(DEVICE(cs), pin + 2));
> + }
> +}
> +
> static void virt_irq_init(LoongArchVirtMachineState *lvms)
> {
> MachineState *ms = MACHINE(lvms);
> - DeviceState *pch_pic, *pch_msi, *cpudev;
> + DeviceState *pch_pic, *pch_msi;
> DeviceState *ipi, *extioi;
> SysBusDevice *d;
> - LoongArchCPU *lacpu;
> - CPULoongArchState *env;
> CPUState *cpu_state;
> - int cpu, pin, i, start, num;
> + int cpu, i, start, num;
> uint32_t cpuintc_phandle, eiointc_phandle, pch_pic_phandle, pch_msi_phandle;
>
> /*
> @@ -843,6 +883,7 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
> ipi = qdev_new(TYPE_LOONGARCH_IPI);
> qdev_prop_set_uint32(ipi, "num-cpu", ms->smp.cpus);
> sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
> + lvms->ipi = ipi;
>
> /* IPI iocsr memory region */
> memory_region_add_subregion(&lvms->system_iocsr, SMP_IPI_MAILBOX,
> @@ -853,18 +894,6 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
> /* Add cpu interrupt-controller */
> fdt_add_cpuic_node(lvms, &cpuintc_phandle);
>
> - for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> - cpu_state = qemu_get_cpu(cpu);
> - cpudev = DEVICE(cpu_state);
> - lacpu = LOONGARCH_CPU(cpu_state);
> - env = &(lacpu->env);
> - env->address_space_iocsr = &lvms->as_iocsr;
> -
> - /* connect ipi irq to cpu irq */
> - qdev_connect_gpio_out(ipi, cpu, qdev_get_gpio_in(cpudev, IRQ_IPI));
> - env->ipistate = ipi;
> - }
> -
> /* Create EXTIOI device */
> extioi = qdev_new(TYPE_LOONGARCH_EXTIOI);
> qdev_prop_set_uint32(extioi, "num-cpu", ms->smp.cpus);
> @@ -872,6 +901,7 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
> qdev_prop_set_bit(extioi, "has-virtualization-extension", true);
> }
> sysbus_realize_and_unref(SYS_BUS_DEVICE(extioi), &error_fatal);
> + lvms->extioi = extioi;
> memory_region_add_subregion(&lvms->system_iocsr, APIC_BASE,
> sysbus_mmio_get_region(SYS_BUS_DEVICE(extioi), 0));
> if (virt_is_veiointc_enabled(lvms)) {
> @@ -879,16 +909,10 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
> sysbus_mmio_get_region(SYS_BUS_DEVICE(extioi), 1));
> }
>
> - /*
> - * connect ext irq to the cpu irq
> - * cpu_pin[9:2] <= intc_pin[7:0]
> - */
> + /* Connect irq to cpu, including ipi and extioi irqchip */
> for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
> - cpudev = DEVICE(qemu_get_cpu(cpu));
> - for (pin = 0; pin < LS3A_INTC_IP; pin++) {
> - qdev_connect_gpio_out(extioi, (cpu * 8 + pin),
> - qdev_get_gpio_in(cpudev, pin + 2));
> - }
> + cpu_state = virt_get_cpu(ms, cpu);
> + virt_init_cpu_irq(ms, cpu_state);
> }
>
> /* Add Extend I/O Interrupt Controller node */
> diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
> index 9ba47793ef..260e6bd7cf 100644
> --- a/include/hw/loongarch/virt.h
> +++ b/include/hw/loongarch/virt.h
> @@ -60,6 +60,8 @@ struct LoongArchVirtMachineState {
> MemoryRegion iocsr_mem;
> AddressSpace as_iocsr;
> struct loongarch_boot_info bootinfo;
> + DeviceState *ipi;
> + DeviceState *extioi;
> };
>
> #define TYPE_LOONGARCH_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
next prev parent reply other threads:[~2024-11-18 16:44 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-12 2:17 [PATCH v4 0/6] hw/loongarch/virt: Add cpu hotplug support Bibo Mao
2024-11-12 2:17 ` [PATCH v4 1/6] hw/loongarch/virt: Add CPU topology support Bibo Mao
2024-11-18 16:10 ` Igor Mammedov
2024-11-18 16:22 ` Igor Mammedov
2024-11-19 8:12 ` bibo mao
2024-11-19 8:01 ` bibo mao
2024-11-22 13:31 ` Igor Mammedov
2024-11-25 1:47 ` bibo mao
2024-11-25 2:20 ` bibo mao
2024-11-12 2:17 ` [PATCH v4 2/6] hw/loongarch/virt: Implement cpu plug interface Bibo Mao
2024-11-12 2:17 ` [PATCH v4 3/6] hw/loongarch/virt: Add generic function to init interrupt pin of CPU Bibo Mao
2024-11-18 16:43 ` Igor Mammedov [this message]
2024-11-19 10:02 ` bibo mao
2024-11-22 13:45 ` Igor Mammedov
2024-11-25 1:54 ` bibo mao
2024-11-28 9:02 ` bibo mao
2024-11-12 2:17 ` [PATCH v4 4/6] hw/loongarch/virt: Init interrupt pin of CPU during plug interface Bibo Mao
2024-11-12 2:17 ` [PATCH v4 5/6] hw/loongarch/virt: Update the ACPI table for hotplug cpu Bibo Mao
2024-11-18 16:51 ` Igor Mammedov
2024-11-19 10:05 ` bibo mao
2024-11-12 2:17 ` [PATCH v4 6/6] hw/loongarch/virt: Enable cpu hotplug feature on virt machine Bibo Mao
2024-11-18 17:03 ` Igor Mammedov
2024-11-19 10:18 ` bibo mao
2024-11-22 13:50 ` Igor Mammedov
2024-11-25 2:16 ` bibo mao
2024-11-29 7:02 ` [PATCH v4 0/6] hw/loongarch/virt: Add cpu hotplug support lixianglai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241118174346.23b6d2ee@imammedo.users.ipa.redhat.com \
--to=imammedo@redhat.com \
--cc=gaosong@loongson.cn \
--cc=jiaxun.yang@flygoat.com \
--cc=lixianglai@loongson.cn \
--cc=maobibo@loongson.cn \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=zhao1.liu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).