Skip to content

Commit 9061ee2

Browse files
committed
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>
2 parents 0e3327b + bb81f23 commit 9061ee2

File tree

9 files changed

+203
-59
lines changed

9 files changed

+203
-59
lines changed

hw/intc/loongarch_ipi.c

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,83 @@
77

88
#include "qemu/osdep.h"
99
#include "hw/boards.h"
10+
#include "qapi/error.h"
1011
#include "hw/intc/loongarch_ipi.h"
12+
#include "hw/qdev-properties.h"
1113
#include "target/loongarch/cpu.h"
1214

1315
static AddressSpace *get_iocsr_as(CPUState *cpu)
1416
{
1517
return LOONGARCH_CPU(cpu)->env.address_space_iocsr;
1618
}
1719

18-
static int archid_cmp(const void *a, const void *b)
20+
static int loongarch_ipi_cmp(const void *a, const void *b)
1921
{
20-
CPUArchId *archid_a = (CPUArchId *)a;
21-
CPUArchId *archid_b = (CPUArchId *)b;
22+
IPICore *ipi_a = (IPICore *)a;
23+
IPICore *ipi_b = (IPICore *)b;
2224

23-
return archid_a->arch_id - archid_b->arch_id;
25+
return ipi_a->arch_id - ipi_b->arch_id;
2426
}
2527

26-
static CPUArchId *find_cpu_by_archid(MachineState *ms, uint32_t id)
28+
static int loongarch_cpu_by_arch_id(LoongsonIPICommonState *lics,
29+
int64_t arch_id, int *index, CPUState **pcs)
2730
{
28-
CPUArchId apic_id, *found_cpu;
31+
IPICore ipi, *found;
2932

30-
apic_id.arch_id = id;
31-
found_cpu = bsearch(&apic_id, ms->possible_cpus->cpus,
32-
ms->possible_cpus->len,
33-
sizeof(*ms->possible_cpus->cpus),
34-
archid_cmp);
33+
ipi.arch_id = arch_id;
34+
found = bsearch(&ipi, lics->cpu, lics->num_cpu, sizeof(IPICore),
35+
loongarch_ipi_cmp);
36+
if (found && found->cpu) {
37+
if (index) {
38+
*index = found - lics->cpu;
39+
}
3540

36-
return found_cpu;
41+
if (pcs) {
42+
*pcs = found->cpu;
43+
}
44+
45+
return MEMTX_OK;
46+
}
47+
48+
return MEMTX_ERROR;
3749
}
3850

39-
static CPUState *loongarch_cpu_by_arch_id(int64_t arch_id)
51+
static void loongarch_ipi_realize(DeviceState *dev, Error **errp)
4052
{
53+
LoongsonIPICommonState *lics = LOONGSON_IPI_COMMON(dev);
54+
LoongarchIPIClass *lic = LOONGARCH_IPI_GET_CLASS(dev);
4155
MachineState *machine = MACHINE(qdev_get_machine());
42-
CPUArchId *archid;
56+
MachineClass *mc = MACHINE_GET_CLASS(machine);
57+
const CPUArchIdList *id_list;
58+
Error *local_err = NULL;
59+
int i;
4360

44-
archid = find_cpu_by_archid(machine, arch_id);
45-
if (archid) {
46-
return CPU(archid->cpu);
61+
lic->parent_realize(dev, &local_err);
62+
if (local_err) {
63+
error_propagate(errp, local_err);
64+
return;
4765
}
4866

49-
return NULL;
67+
assert(mc->possible_cpu_arch_ids);
68+
id_list = mc->possible_cpu_arch_ids(machine);
69+
lics->num_cpu = id_list->len;
70+
lics->cpu = g_new0(IPICore, lics->num_cpu);
71+
for (i = 0; i < lics->num_cpu; i++) {
72+
lics->cpu[i].arch_id = id_list->cpus[i].arch_id;
73+
lics->cpu[i].cpu = CPU(id_list->cpus[i].cpu);
74+
lics->cpu[i].ipi = lics;
75+
qdev_init_gpio_out(dev, &lics->cpu[i].irq, 1);
76+
}
5077
}
5178

5279
static void loongarch_ipi_class_init(ObjectClass *klass, void *data)
5380
{
5481
LoongsonIPICommonClass *licc = LOONGSON_IPI_COMMON_CLASS(klass);
82+
LoongarchIPIClass *lic = LOONGARCH_IPI_CLASS(klass);
83+
DeviceClass *dc = DEVICE_CLASS(klass);
5584

85+
device_class_set_parent_realize(dc, loongarch_ipi_realize,
86+
&lic->parent_realize);
5687
licc->get_iocsr_as = get_iocsr_as;
5788
licc->cpu_by_arch_id = loongarch_cpu_by_arch_id;
5889
}
@@ -61,6 +92,8 @@ static const TypeInfo loongarch_ipi_types[] = {
6192
{
6293
.name = TYPE_LOONGARCH_IPI,
6394
.parent = TYPE_LOONGSON_IPI_COMMON,
95+
.instance_size = sizeof(LoongarchIPIState),
96+
.class_size = sizeof(LoongarchIPIClass),
6497
.class_init = loongarch_ipi_class_init,
6598
}
6699
};

hw/intc/loongson_ipi.c

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "qemu/osdep.h"
99
#include "hw/intc/loongson_ipi.h"
10+
#include "hw/qdev-properties.h"
1011
#include "qapi/error.h"
1112
#include "target/mips/cpu.h"
1213

@@ -19,6 +20,27 @@ static AddressSpace *get_iocsr_as(CPUState *cpu)
1920
return NULL;
2021
}
2122

23+
static int loongson_cpu_by_arch_id(LoongsonIPICommonState *lics,
24+
int64_t arch_id, int *index, CPUState **pcs)
25+
{
26+
CPUState *cs;
27+
28+
cs = cpu_by_arch_id(arch_id);
29+
if (cs == NULL) {
30+
return MEMTX_ERROR;
31+
}
32+
33+
if (index) {
34+
*index = cs->cpu_index;
35+
}
36+
37+
if (pcs) {
38+
*pcs = cs;
39+
}
40+
41+
return MEMTX_OK;
42+
}
43+
2244
static const MemoryRegionOps loongson_ipi_core_ops = {
2345
.read_with_attrs = loongson_ipi_core_readl,
2446
.write_with_attrs = loongson_ipi_core_writel,
@@ -36,15 +58,27 @@ static void loongson_ipi_realize(DeviceState *dev, Error **errp)
3658
LoongsonIPIClass *lic = LOONGSON_IPI_GET_CLASS(dev);
3759
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
3860
Error *local_err = NULL;
61+
int i;
3962

4063
lic->parent_realize(dev, &local_err);
4164
if (local_err) {
4265
error_propagate(errp, local_err);
4366
return;
4467
}
4568

69+
if (sc->num_cpu == 0) {
70+
error_setg(errp, "num-cpu must be at least 1");
71+
return;
72+
}
73+
74+
sc->cpu = g_new0(IPICore, sc->num_cpu);
75+
for (i = 0; i < sc->num_cpu; i++) {
76+
sc->cpu[i].ipi = sc;
77+
qdev_init_gpio_out(dev, &sc->cpu[i].irq, 1);
78+
}
79+
4680
s->ipi_mmio_mem = g_new0(MemoryRegion, sc->num_cpu);
47-
for (unsigned i = 0; i < sc->num_cpu; i++) {
81+
for (i = 0; i < sc->num_cpu; i++) {
4882
g_autofree char *name = g_strdup_printf("loongson_ipi_cpu%d_mmio", i);
4983

5084
memory_region_init_io(&s->ipi_mmio_mem[i], OBJECT(dev),
@@ -63,6 +97,10 @@ static void loongson_ipi_unrealize(DeviceState *dev)
6397
k->parent_unrealize(dev);
6498
}
6599

100+
static const Property loongson_ipi_properties[] = {
101+
DEFINE_PROP_UINT32("num-cpu", LoongsonIPICommonState, num_cpu, 1),
102+
};
103+
66104
static void loongson_ipi_class_init(ObjectClass *klass, void *data)
67105
{
68106
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -73,8 +111,9 @@ static void loongson_ipi_class_init(ObjectClass *klass, void *data)
73111
&lic->parent_realize);
74112
device_class_set_parent_unrealize(dc, loongson_ipi_unrealize,
75113
&lic->parent_unrealize);
114+
device_class_set_props(dc, loongson_ipi_properties);
76115
licc->get_iocsr_as = get_iocsr_as;
77-
licc->cpu_by_arch_id = cpu_by_arch_id;
116+
licc->cpu_by_arch_id = loongson_cpu_by_arch_id;
78117
}
79118

80119
static const TypeInfo loongson_ipi_types[] = {

hw/intc/loongson_ipi_common.c

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
#include "hw/sysbus.h"
1010
#include "hw/intc/loongson_ipi_common.h"
1111
#include "hw/irq.h"
12-
#include "hw/qdev-properties.h"
13-
#include "qapi/error.h"
1412
#include "qemu/log.h"
1513
#include "migration/vmstate.h"
1614
#include "trace.h"
@@ -105,16 +103,17 @@ static MemTxResult mail_send(LoongsonIPICommonState *ipi,
105103
uint32_t cpuid;
106104
hwaddr addr;
107105
CPUState *cs;
106+
int cpu, ret;
108107

109108
cpuid = extract32(val, 16, 10);
110-
cs = licc->cpu_by_arch_id(cpuid);
111-
if (cs == NULL) {
109+
ret = licc->cpu_by_arch_id(ipi, cpuid, &cpu, &cs);
110+
if (ret != MEMTX_OK) {
112111
return MEMTX_DECODE_ERROR;
113112
}
114113

115114
/* override requester_id */
116115
addr = SMP_IPI_MAILBOX + CORE_BUF_20 + (val & 0x1c);
117-
attrs.requester_id = cs->cpu_index;
116+
attrs.requester_id = cpu;
118117
return send_ipi_data(ipi, cs, val, addr, attrs);
119118
}
120119

@@ -125,16 +124,17 @@ static MemTxResult any_send(LoongsonIPICommonState *ipi,
125124
uint32_t cpuid;
126125
hwaddr addr;
127126
CPUState *cs;
127+
int cpu, ret;
128128

129129
cpuid = extract32(val, 16, 10);
130-
cs = licc->cpu_by_arch_id(cpuid);
131-
if (cs == NULL) {
130+
ret = licc->cpu_by_arch_id(ipi, cpuid, &cpu, &cs);
131+
if (ret != MEMTX_OK) {
132132
return MEMTX_DECODE_ERROR;
133133
}
134134

135135
/* override requester_id */
136136
addr = val & 0xffff;
137-
attrs.requester_id = cs->cpu_index;
137+
attrs.requester_id = cpu;
138138
return send_ipi_data(ipi, cs, val, addr, attrs);
139139
}
140140

@@ -148,6 +148,7 @@ MemTxResult loongson_ipi_core_writel(void *opaque, hwaddr addr, uint64_t val,
148148
uint32_t cpuid;
149149
uint8_t vector;
150150
CPUState *cs;
151+
int cpu, ret;
151152

152153
addr &= 0xff;
153154
trace_loongson_ipi_write(size, (uint64_t)addr, val);
@@ -178,11 +179,11 @@ MemTxResult loongson_ipi_core_writel(void *opaque, hwaddr addr, uint64_t val,
178179
cpuid = extract32(val, 16, 10);
179180
/* IPI status vector */
180181
vector = extract8(val, 0, 5);
181-
cs = licc->cpu_by_arch_id(cpuid);
182-
if (cs == NULL || cs->cpu_index >= ipi->num_cpu) {
182+
ret = licc->cpu_by_arch_id(ipi, cpuid, &cpu, &cs);
183+
if (ret != MEMTX_OK || cpu >= ipi->num_cpu) {
183184
return MEMTX_DECODE_ERROR;
184185
}
185-
loongson_ipi_core_writel(&ipi->cpu[cs->cpu_index], CORE_SET_OFF,
186+
loongson_ipi_core_writel(&ipi->cpu[cpu], CORE_SET_OFF,
186187
BIT(vector), 4, attrs);
187188
break;
188189
default:
@@ -253,12 +254,6 @@ static void loongson_ipi_common_realize(DeviceState *dev, Error **errp)
253254
{
254255
LoongsonIPICommonState *s = LOONGSON_IPI_COMMON(dev);
255256
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
256-
int i;
257-
258-
if (s->num_cpu == 0) {
259-
error_setg(errp, "num-cpu must be at least 1");
260-
return;
261-
}
262257

263258
memory_region_init_io(&s->ipi_iocsr_mem, OBJECT(dev),
264259
&loongson_ipi_iocsr_ops,
@@ -273,13 +268,6 @@ static void loongson_ipi_common_realize(DeviceState *dev, Error **errp)
273268
&loongson_ipi64_ops,
274269
s, "loongson_ipi64_iocsr", 0x118);
275270
sysbus_init_mmio(sbd, &s->ipi64_iocsr_mem);
276-
277-
s->cpu = g_new0(IPICore, s->num_cpu);
278-
for (i = 0; i < s->num_cpu; i++) {
279-
s->cpu[i].ipi = s;
280-
281-
qdev_init_gpio_out(dev, &s->cpu[i].irq, 1);
282-
}
283271
}
284272

285273
static void loongson_ipi_common_unrealize(DeviceState *dev)
@@ -315,10 +303,6 @@ static const VMStateDescription vmstate_loongson_ipi_common = {
315303
}
316304
};
317305

318-
static const Property ipi_common_properties[] = {
319-
DEFINE_PROP_UINT32("num-cpu", LoongsonIPICommonState, num_cpu, 1),
320-
};
321-
322306
static void loongson_ipi_common_class_init(ObjectClass *klass, void *data)
323307
{
324308
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -328,7 +312,6 @@ static void loongson_ipi_common_class_init(ObjectClass *klass, void *data)
328312
&licc->parent_realize);
329313
device_class_set_parent_unrealize(dc, loongson_ipi_common_unrealize,
330314
&licc->parent_unrealize);
331-
device_class_set_props(dc, ipi_common_properties);
332315
dc->vmsd = &vmstate_loongson_ipi_common;
333316
}
334317

hw/loongarch/virt.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,6 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
899899

900900
/* Create IPI device */
901901
ipi = qdev_new(TYPE_LOONGARCH_IPI);
902-
qdev_prop_set_uint32(ipi, "num-cpu", ms->smp.cpus);
903902
sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
904903

905904
/* IPI iocsr memory region */

include/hw/intc/loongarch_ipi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct LoongarchIPIState {
2020

2121
struct LoongarchIPIClass {
2222
LoongsonIPICommonClass parent_class;
23+
DeviceRealize parent_realize;
2324
};
2425

2526
#endif

include/hw/intc/loongson_ipi_common.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ typedef struct IPICore {
2727
/* 64bit buf divide into 2 32-bit buf */
2828
uint32_t buf[IPI_MBX_NUM * 2];
2929
qemu_irq irq;
30+
uint64_t arch_id;
31+
CPUState *cpu;
3032
} IPICore;
3133

3234
struct LoongsonIPICommonState {
@@ -44,7 +46,8 @@ struct LoongsonIPICommonClass {
4446
DeviceRealize parent_realize;
4547
DeviceUnrealize parent_unrealize;
4648
AddressSpace *(*get_iocsr_as)(CPUState *cpu);
47-
CPUState *(*cpu_by_arch_id)(int64_t id);
49+
int (*cpu_by_arch_id)(LoongsonIPICommonState *lics, int64_t id,
50+
int *index, CPUState **pcs);
4851
};
4952

5053
MemTxResult loongson_ipi_core_readl(void *opaque, hwaddr addr, uint64_t *data,

0 commit comments

Comments
 (0)