1
The following changes since commit 848a6caa88b9f082c89c9b41afa975761262981d:
1
The following changes since commit 8f6330a807f2642dc2a3cdf33347aa28a4c00a87:
2
2
3
Merge tag 'migration-20230602-pull-request' of https://gitlab.com/juan.quintela/qemu into staging (2023-06-02 17:33:29 -0700)
3
Merge tag 'pull-maintainer-updates-060324-1' of https://gitlab.com/stsquad/qemu into staging (2024-03-06 16:56:20 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://gitlab.com/gaosong/qemu.git tags/pull-loongarch-20230605
7
https://gitlab.com/gaosong/qemu.git tags/pull-loongarch-20240307
8
8
9
for you to fetch changes up to 8555ddc671203969b0e6eb651e538d02a9a79b3a:
9
for you to fetch changes up to 4dc2edfd6f8abfc38f0ba110502790aa5051b1b5:
10
10
11
hw/intc/loongarch_ipi: Bring back all 4 IPI mailboxes (2023-06-05 11:08:55 +0800)
11
hw/loongarch: Add cells missing from rtc node (2024-03-07 21:58:00 +0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Fixes Coverity CID: 1512452, 1512453
14
pull-loongarch-20240307
15
Fixes: 78464f023b54 ("hw/loongarch/virt: Modify ipi as percpu device")
16
15
17
----------------------------------------------------------------
16
----------------------------------------------------------------
18
Jiaxun Yang (1):
17
Song Gao (17):
19
hw/intc/loongarch_ipi: Bring back all 4 IPI mailboxes
18
hw/loongarch: Move boot fucntions to boot.c
19
hw/loongarch: Add load initrd
20
hw/loongarch: Add slave cpu boot_code
21
hw/loongarch: Add init_cmdline
22
hw/loongarch: Init efi_system_table
23
hw/loongarch: Init efi_boot_memmap table
24
hw/loongarch: Init efi_initrd table
25
hw/loongarch: Init efi_fdt table
26
hw/loongarch: Fix fdt memory node wrong 'reg'
27
hw/loongarch: fdt adds cpu interrupt controller node
28
hw/loongarch: fdt adds Extend I/O Interrupt Controller
29
hw/loongarch: fdt adds pch_pic Controller
30
hw/loongarch: fdt adds pch_msi Controller
31
hw/loongarch: fdt adds pcie irq_map node
32
hw/loongarch: fdt remove unused irqchip node
33
hw/loongarch: Add cells missing from uart node
34
hw/loongarch: Add cells missing from rtc node
20
35
21
hw/intc/loongarch_ipi.c | 6 +++---
36
hw/loongarch/boot.c | 330 +++++++++++++++++++++++++++++++++
22
include/hw/intc/loongarch_ipi.h | 4 +++-
37
hw/loongarch/meson.build | 1 +
23
2 files changed, 6 insertions(+), 4 deletions(-)
38
hw/loongarch/virt.c | 363 +++++++++++++++++++++----------------
39
include/hw/intc/loongarch_extioi.h | 1 +
40
include/hw/loongarch/boot.h | 109 +++++++++++
41
include/hw/loongarch/virt.h | 14 ++
42
include/hw/pci-host/ls7a.h | 2 +
43
target/loongarch/cpu.h | 2 +
44
8 files changed, 662 insertions(+), 160 deletions(-)
45
create mode 100644 hw/loongarch/boot.c
46
create mode 100644 include/hw/loongarch/boot.h
diff view generated by jsdifflib
New patch
1
Move some boot functions to boot.c and struct
2
loongarch_boot_info into struct LoongArchMachineState.
1
3
4
Signed-off-by: Song Gao <gaosong@loongson.cn>
5
Message-Id: <20240301093839.663947-2-gaosong@loongson.cn>
6
---
7
hw/loongarch/boot.c | 125 ++++++++++++++++++++++++++++++++++++
8
hw/loongarch/meson.build | 1 +
9
hw/loongarch/virt.c | 121 +++-------------------------------
10
include/hw/loongarch/boot.h | 21 ++++++
11
include/hw/loongarch/virt.h | 2 +
12
5 files changed, 157 insertions(+), 113 deletions(-)
13
create mode 100644 hw/loongarch/boot.c
14
create mode 100644 include/hw/loongarch/boot.h
15
16
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/hw/loongarch/boot.c
21
@@ -XXX,XX +XXX,XX @@
22
+/* SPDX-License-Identifier: GPL-2.0-or-later */
23
+/*
24
+ * LoongArch boot helper functions.
25
+ *
26
+ * Copyright (c) 2023 Loongson Technology Corporation Limited
27
+ */
28
+
29
+#include "qemu/osdep.h"
30
+#include "qemu/units.h"
31
+#include "target/loongarch/cpu.h"
32
+#include "hw/loongarch/virt.h"
33
+#include "hw/loader.h"
34
+#include "elf.h"
35
+#include "qemu/error-report.h"
36
+#include "sysemu/reset.h"
37
+
38
+static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
39
+{
40
+ return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS);
41
+}
42
+
43
+static int64_t load_kernel_info(struct loongarch_boot_info *info)
44
+{
45
+ uint64_t kernel_entry, kernel_low, kernel_high;
46
+ ssize_t kernel_size;
47
+
48
+ kernel_size = load_elf(info->kernel_filename, NULL,
49
+ cpu_loongarch_virt_to_phys, NULL,
50
+ &kernel_entry, &kernel_low,
51
+ &kernel_high, NULL, 0,
52
+ EM_LOONGARCH, 1, 0);
53
+
54
+ if (kernel_size < 0) {
55
+ error_report("could not load kernel '%s': %s",
56
+ info->kernel_filename,
57
+ load_elf_strerror(kernel_size));
58
+ exit(1);
59
+ }
60
+ return kernel_entry;
61
+}
62
+
63
+static void reset_load_elf(void *opaque)
64
+{
65
+ LoongArchCPU *cpu = opaque;
66
+ CPULoongArchState *env = &cpu->env;
67
+
68
+ cpu_reset(CPU(cpu));
69
+ if (env->load_elf) {
70
+ cpu_set_pc(CPU(cpu), env->elf_address);
71
+ }
72
+}
73
+
74
+static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
75
+ FWCfgState *fw_cfg)
76
+{
77
+ /*
78
+ * Expose the kernel, the command line, and the initrd in fw_cfg.
79
+ * We don't process them here at all, it's all left to the
80
+ * firmware.
81
+ */
82
+ load_image_to_fw_cfg(fw_cfg,
83
+ FW_CFG_KERNEL_SIZE, FW_CFG_KERNEL_DATA,
84
+ info->kernel_filename,
85
+ false);
86
+
87
+ if (info->initrd_filename) {
88
+ load_image_to_fw_cfg(fw_cfg,
89
+ FW_CFG_INITRD_SIZE, FW_CFG_INITRD_DATA,
90
+ info->initrd_filename, false);
91
+ }
92
+
93
+ if (info->kernel_cmdline) {
94
+ fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE,
95
+ strlen(info->kernel_cmdline) + 1);
96
+ fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA,
97
+ info->kernel_cmdline);
98
+ }
99
+}
100
+
101
+static void loongarch_firmware_boot(LoongArchMachineState *lams,
102
+ struct loongarch_boot_info *info)
103
+{
104
+ fw_cfg_add_kernel_info(info, lams->fw_cfg);
105
+}
106
+
107
+static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
108
+{
109
+ int64_t kernel_addr = 0;
110
+ LoongArchCPU *lacpu;
111
+ CPUState *cs;
112
+
113
+ if (info->kernel_filename) {
114
+ kernel_addr = load_kernel_info(info);
115
+ } else {
116
+ error_report("Need kernel filename\n");
117
+ exit(1);
118
+ }
119
+
120
+ CPU_FOREACH(cs) {
121
+ lacpu = LOONGARCH_CPU(cs);
122
+ lacpu->env.load_elf = true;
123
+ lacpu->env.elf_address = kernel_addr;
124
+ }
125
+}
126
+
127
+void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
128
+{
129
+ LoongArchMachineState *lams = LOONGARCH_MACHINE(ms);
130
+ int i;
131
+
132
+ /* register reset function */
133
+ for (i = 0; i < ms->smp.cpus; i++) {
134
+ qemu_register_reset(reset_load_elf, LOONGARCH_CPU(qemu_get_cpu(i)));
135
+ }
136
+
137
+ info->kernel_filename = ms->kernel_filename;
138
+ info->kernel_cmdline = ms->kernel_cmdline;
139
+ info->initrd_filename = ms->initrd_filename;
140
+
141
+ if (lams->bios_loaded) {
142
+ loongarch_firmware_boot(lams, info);
143
+ } else {
144
+ loongarch_direct_kernel_boot(info);
145
+ }
146
+}
147
diff --git a/hw/loongarch/meson.build b/hw/loongarch/meson.build
148
index XXXXXXX..XXXXXXX 100644
149
--- a/hw/loongarch/meson.build
150
+++ b/hw/loongarch/meson.build
151
@@ -XXX,XX +XXX,XX @@
152
loongarch_ss = ss.source_set()
153
loongarch_ss.add(files(
154
'fw_cfg.c',
155
+ 'boot.c',
156
))
157
loongarch_ss.add(when: 'CONFIG_LOONGARCH_VIRT', if_true: [files('virt.c'), fdt])
158
loongarch_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi-build.c'))
159
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
160
index XXXXXXX..XXXXXXX 100644
161
--- a/hw/loongarch/virt.c
162
+++ b/hw/loongarch/virt.c
163
@@ -XXX,XX +XXX,XX @@
164
#include "hw/block/flash.h"
165
#include "qemu/error-report.h"
166
167
-
168
-struct loaderparams {
169
- uint64_t ram_size;
170
- const char *kernel_filename;
171
- const char *kernel_cmdline;
172
- const char *initrd_filename;
173
-};
174
-
175
static PFlashCFI01 *virt_flash_create1(LoongArchMachineState *lams,
176
const char *name,
177
const char *alias_prop_name)
178
@@ -XXX,XX +XXX,XX @@ static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
179
memmap_entries++;
180
}
181
182
-static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
183
-{
184
- return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS);
185
-}
186
-
187
-static int64_t load_kernel_info(const struct loaderparams *loaderparams)
188
-{
189
- uint64_t kernel_entry, kernel_low, kernel_high;
190
- ssize_t kernel_size;
191
-
192
- kernel_size = load_elf(loaderparams->kernel_filename, NULL,
193
- cpu_loongarch_virt_to_phys, NULL,
194
- &kernel_entry, &kernel_low,
195
- &kernel_high, NULL, 0,
196
- EM_LOONGARCH, 1, 0);
197
-
198
- if (kernel_size < 0) {
199
- error_report("could not load kernel '%s': %s",
200
- loaderparams->kernel_filename,
201
- load_elf_strerror(kernel_size));
202
- exit(1);
203
- }
204
- return kernel_entry;
205
-}
206
-
207
static DeviceState *create_acpi_ged(DeviceState *pch_pic, LoongArchMachineState *lams)
208
{
209
DeviceState *dev;
210
@@ -XXX,XX +XXX,XX @@ static void loongarch_firmware_init(LoongArchMachineState *lams)
211
}
212
}
213
214
-static void reset_load_elf(void *opaque)
215
-{
216
- LoongArchCPU *cpu = opaque;
217
- CPULoongArchState *env = &cpu->env;
218
-
219
- cpu_reset(CPU(cpu));
220
- if (env->load_elf) {
221
- cpu_set_pc(CPU(cpu), env->elf_address);
222
- }
223
-}
224
-
225
-static void fw_cfg_add_kernel_info(const struct loaderparams *loaderparams,
226
- FWCfgState *fw_cfg)
227
-{
228
- /*
229
- * Expose the kernel, the command line, and the initrd in fw_cfg.
230
- * We don't process them here at all, it's all left to the
231
- * firmware.
232
- */
233
- load_image_to_fw_cfg(fw_cfg,
234
- FW_CFG_KERNEL_SIZE, FW_CFG_KERNEL_DATA,
235
- loaderparams->kernel_filename,
236
- false);
237
-
238
- if (loaderparams->initrd_filename) {
239
- load_image_to_fw_cfg(fw_cfg,
240
- FW_CFG_INITRD_SIZE, FW_CFG_INITRD_DATA,
241
- loaderparams->initrd_filename, false);
242
- }
243
-
244
- if (loaderparams->kernel_cmdline) {
245
- fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE,
246
- strlen(loaderparams->kernel_cmdline) + 1);
247
- fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA,
248
- loaderparams->kernel_cmdline);
249
- }
250
-}
251
-
252
-static void loongarch_firmware_boot(LoongArchMachineState *lams,
253
- const struct loaderparams *loaderparams)
254
-{
255
- fw_cfg_add_kernel_info(loaderparams, lams->fw_cfg);
256
-}
257
-
258
-static void loongarch_direct_kernel_boot(LoongArchMachineState *lams,
259
- const struct loaderparams *loaderparams)
260
-{
261
- MachineState *machine = MACHINE(lams);
262
- int64_t kernel_addr = 0;
263
- LoongArchCPU *lacpu;
264
- int i;
265
-
266
- kernel_addr = load_kernel_info(loaderparams);
267
- if (!machine->firmware) {
268
- for (i = 0; i < machine->smp.cpus; i++) {
269
- lacpu = LOONGARCH_CPU(qemu_get_cpu(i));
270
- lacpu->env.load_elf = true;
271
- lacpu->env.elf_address = kernel_addr;
272
- }
273
- }
274
-}
275
276
static void loongarch_qemu_write(void *opaque, hwaddr addr,
277
uint64_t val, unsigned size)
278
@@ -XXX,XX +XXX,XX @@ static void loongarch_init(MachineState *machine)
279
MachineClass *mc = MACHINE_GET_CLASS(machine);
280
CPUState *cpu;
281
char *ramName = NULL;
282
- struct loaderparams loaderparams = { };
283
284
if (!cpu_model) {
285
cpu_model = LOONGARCH_CPU_TYPE_NAME("la464");
286
@@ -XXX,XX +XXX,XX @@ static void loongarch_init(MachineState *machine)
287
sizeof(struct memmap_entry) * (memmap_entries));
288
}
289
fdt_add_fw_cfg_node(lams);
290
- loaderparams.ram_size = ram_size;
291
- loaderparams.kernel_filename = machine->kernel_filename;
292
- loaderparams.kernel_cmdline = machine->kernel_cmdline;
293
- loaderparams.initrd_filename = machine->initrd_filename;
294
- /* load the kernel. */
295
- if (loaderparams.kernel_filename) {
296
- if (lams->bios_loaded) {
297
- loongarch_firmware_boot(lams, &loaderparams);
298
- } else {
299
- loongarch_direct_kernel_boot(lams, &loaderparams);
300
- }
301
- }
302
fdt_add_flash_node(lams);
303
- /* register reset function */
304
- for (i = 0; i < machine->smp.cpus; i++) {
305
- lacpu = LOONGARCH_CPU(qemu_get_cpu(i));
306
- qemu_register_reset(reset_load_elf, lacpu);
307
- }
308
+
309
/* Initialize the IO interrupt subsystem */
310
loongarch_irq_init(lams);
311
fdt_add_irqchip_node(lams);
312
@@ -XXX,XX +XXX,XX @@ static void loongarch_init(MachineState *machine)
313
*/
314
fdt_base = 1 * MiB;
315
qemu_fdt_dumpdtb(machine->fdt, lams->fdt_size);
316
- rom_add_blob_fixed("fdt", machine->fdt, lams->fdt_size, fdt_base);
317
+ rom_add_blob_fixed_as("fdt", machine->fdt, lams->fdt_size, fdt_base,
318
+ &address_space_memory);
319
+ qemu_register_reset_nosnapshotload(qemu_fdt_randomize_seeds,
320
+ rom_ptr_for_as(&address_space_memory, fdt_base, lams->fdt_size));
321
+
322
+ lams->bootinfo.ram_size = ram_size;
323
+ loongarch_load_kernel(machine, &lams->bootinfo);
324
}
325
326
bool loongarch_is_acpi_enabled(LoongArchMachineState *lams)
327
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
328
new file mode 100644
329
index XXXXXXX..XXXXXXX
330
--- /dev/null
331
+++ b/include/hw/loongarch/boot.h
332
@@ -XXX,XX +XXX,XX @@
333
+/* SPDX-License-Identifier: GPL-2.0-or-later */
334
+/*
335
+ * Definitions for LoongArch boot.
336
+ *
337
+ * Copyright (C) 2023 Loongson Technology Corporation Limited
338
+ */
339
+
340
+#ifndef HW_LOONGARCH_BOOT_H
341
+#define HW_LOONGARCH_BOOT_H
342
+
343
+struct loongarch_boot_info {
344
+ uint64_t ram_size;
345
+ const char *kernel_filename;
346
+ const char *kernel_cmdline;
347
+ const char *initrd_filename;
348
+ uint64_t a0, a1, a2;
349
+};
350
+
351
+void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info);
352
+
353
+#endif /* HW_LOONGARCH_BOOT_H */
354
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
355
index XXXXXXX..XXXXXXX 100644
356
--- a/include/hw/loongarch/virt.h
357
+++ b/include/hw/loongarch/virt.h
358
@@ -XXX,XX +XXX,XX @@
359
#include "qemu/queue.h"
360
#include "hw/intc/loongarch_ipi.h"
361
#include "hw/block/flash.h"
362
+#include "hw/loongarch/boot.h"
363
364
#define LOONGARCH_MAX_CPUS 256
365
366
@@ -XXX,XX +XXX,XX @@ struct LoongArchMachineState {
367
MemoryRegion system_iocsr;
368
MemoryRegion iocsr_mem;
369
AddressSpace as_iocsr;
370
+ struct loongarch_boot_info bootinfo;
371
};
372
373
#define TYPE_LOONGARCH_MACHINE MACHINE_TYPE_NAME("virt")
374
--
375
2.34.1
diff view generated by jsdifflib
New patch
1
we load initrd ramdisk after kernel_high address
1
2
3
Signed-off-by: Song Gao <gaosong@loongson.cn>
4
Message-Id: <20240301093839.663947-3-gaosong@loongson.cn>
5
---
6
hw/loongarch/boot.c | 29 ++++++++++++++++++++++++++++-
7
1 file changed, 28 insertions(+), 1 deletion(-)
8
9
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/hw/loongarch/boot.c
12
+++ b/hw/loongarch/boot.c
13
@@ -XXX,XX +XXX,XX @@ static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
14
15
static int64_t load_kernel_info(struct loongarch_boot_info *info)
16
{
17
- uint64_t kernel_entry, kernel_low, kernel_high;
18
+ uint64_t kernel_entry, kernel_low, kernel_high, initrd_size;
19
+ ram_addr_t initrd_offset;
20
ssize_t kernel_size;
21
22
kernel_size = load_elf(info->kernel_filename, NULL,
23
@@ -XXX,XX +XXX,XX @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
24
load_elf_strerror(kernel_size));
25
exit(1);
26
}
27
+
28
+ if (info->initrd_filename) {
29
+ initrd_size = get_image_size(info->initrd_filename);
30
+ if (initrd_size > 0) {
31
+ initrd_offset = ROUND_UP(kernel_high + 4 * kernel_size, 64 * KiB);
32
+
33
+ if (initrd_offset + initrd_size > info->ram_size) {
34
+ error_report("memory too small for initial ram disk '%s'",
35
+ info->initrd_filename);
36
+ exit(1);
37
+ }
38
+
39
+ initrd_size = load_image_targphys(info->initrd_filename, initrd_offset,
40
+ info->ram_size - initrd_offset);
41
+ }
42
+
43
+ if (initrd_size == (target_ulong)-1) {
44
+ error_report("could not load initial ram disk '%s'",
45
+ info->initrd_filename);
46
+ exit(1);
47
+ }
48
+ } else {
49
+ error_report("Need initrd!");
50
+ exit(1);
51
+ }
52
+
53
return kernel_entry;
54
}
55
56
--
57
2.34.1
diff view generated by jsdifflib
New patch
1
Signed-off-by: Song Gao <gaosong@loongson.cn>
2
Message-Id: <20240301093839.663947-4-gaosong@loongson.cn>
3
---
4
hw/loongarch/boot.c | 70 ++++++++++++++++++++++++++++++++++++++++++++-
5
1 file changed, 69 insertions(+), 1 deletion(-)
1
6
7
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/hw/loongarch/boot.c
10
+++ b/hw/loongarch/boot.c
11
@@ -XXX,XX +XXX,XX @@
12
#include "qemu/error-report.h"
13
#include "sysemu/reset.h"
14
15
+static const unsigned int slave_boot_code[] = {
16
+ /* Configure reset ebase. */
17
+ 0x0400302c, /* csrwr $r12,0xc */
18
+
19
+ /* Disable interrupt. */
20
+ 0x0380100c, /* ori $r12,$r0,0x4 */
21
+ 0x04000180, /* csrxchg $r0,$r12,0x0 */
22
+
23
+ /* Clear mailbox. */
24
+ 0x1400002d, /* lu12i.w $r13,1(0x1) */
25
+ 0x038081ad, /* ori $r13,$r13,0x20 */
26
+ 0x06481da0, /* iocsrwr.d $r0,$r13 */
27
+
28
+ /* Enable IPI interrupt. */
29
+ 0x1400002c, /* lu12i.w $r12,1(0x1) */
30
+ 0x0400118c, /* csrxchg $r12,$r12,0x4 */
31
+ 0x02fffc0c, /* addi.d $r12,$r0,-1(0xfff) */
32
+ 0x1400002d, /* lu12i.w $r13,1(0x1) */
33
+ 0x038011ad, /* ori $r13,$r13,0x4 */
34
+ 0x064819ac, /* iocsrwr.w $r12,$r13 */
35
+ 0x1400002d, /* lu12i.w $r13,1(0x1) */
36
+ 0x038081ad, /* ori $r13,$r13,0x20 */
37
+
38
+ /* Wait for wakeup <.L11>: */
39
+ 0x06488000, /* idle 0x0 */
40
+ 0x03400000, /* andi $r0,$r0,0x0 */
41
+ 0x064809ac, /* iocsrrd.w $r12,$r13 */
42
+ 0x43fff59f, /* beqz $r12,-12(0x7ffff4) # 48 <.L11> */
43
+
44
+ /* Read and clear IPI interrupt. */
45
+ 0x1400002d, /* lu12i.w $r13,1(0x1) */
46
+ 0x064809ac, /* iocsrrd.w $r12,$r13 */
47
+ 0x1400002d, /* lu12i.w $r13,1(0x1) */
48
+ 0x038031ad, /* ori $r13,$r13,0xc */
49
+ 0x064819ac, /* iocsrwr.w $r12,$r13 */
50
+
51
+ /* Disable IPI interrupt. */
52
+ 0x1400002c, /* lu12i.w $r12,1(0x1) */
53
+ 0x04001180, /* csrxchg $r0,$r12,0x4 */
54
+
55
+ /* Read mail buf and jump to specified entry */
56
+ 0x1400002d, /* lu12i.w $r13,1(0x1) */
57
+ 0x038081ad, /* ori $r13,$r13,0x20 */
58
+ 0x06480dac, /* iocsrrd.d $r12,$r13 */
59
+ 0x00150181, /* move $r1,$r12 */
60
+ 0x4c000020, /* jirl $r0,$r1,0 */
61
+};
62
+
63
static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
64
{
65
return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS);
66
@@ -XXX,XX +XXX,XX @@ static void loongarch_firmware_boot(LoongArchMachineState *lams,
67
fw_cfg_add_kernel_info(info, lams->fw_cfg);
68
}
69
70
+static void init_boot_rom(struct loongarch_boot_info *info, void *p)
71
+{
72
+ memcpy(p, &slave_boot_code, sizeof(slave_boot_code));
73
+ p += sizeof(slave_boot_code);
74
+}
75
+
76
static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
77
{
78
+ void *p, *bp;
79
int64_t kernel_addr = 0;
80
LoongArchCPU *lacpu;
81
CPUState *cs;
82
@@ -XXX,XX +XXX,XX @@ static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
83
exit(1);
84
}
85
86
+ /* Load 'boot_rom' at [0 - 1MiB] */
87
+ p = g_malloc0(1 * MiB);
88
+ bp = p;
89
+ init_boot_rom(info, p);
90
+ rom_add_blob_fixed("boot_rom", bp, 1 * MiB, 0);
91
+
92
CPU_FOREACH(cs) {
93
lacpu = LOONGARCH_CPU(cs);
94
lacpu->env.load_elf = true;
95
- lacpu->env.elf_address = kernel_addr;
96
+ if (cs == first_cpu) {
97
+ lacpu->env.elf_address = kernel_addr;
98
+ } else {
99
+ lacpu->env.elf_address = 0;
100
+ }
101
+ lacpu->env.boot_info = info;
102
}
103
+
104
+ g_free(bp);
105
}
106
107
void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
108
--
109
2.34.1
diff view generated by jsdifflib
1
From: Jiaxun Yang <jiaxun.yang@flygoat.com>
1
Add init_cmline and set boot_info->a0, a1
2
2
3
As per "Loongson 3A5000/3B5000 Processor Reference Manual",
3
Signed-off-by: Song Gao <gaosong@loongson.cn>
4
Loongson 3A5000's IPI implementation have 4 mailboxes per
4
Message-Id: <20240301093839.663947-5-gaosong@loongson.cn>
5
core.
5
---
6
hw/loongarch/boot.c | 19 +++++++++++++++++++
7
include/hw/loongarch/virt.h | 2 ++
8
target/loongarch/cpu.h | 2 ++
9
3 files changed, 23 insertions(+)
6
10
7
However, in 78464f023b54 ("hw/loongarch/virt: Modify ipi as
11
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
8
percpu device"), the number of IPI mailboxes was reduced to
9
one, which mismatches actual hardware.
10
11
It won't affect LoongArch based system as LoongArch boot code
12
only uses the first mailbox, however MIPS based Loongson boot
13
code uses all 4 mailboxes.
14
15
Fixes Coverity CID: 1512452, 1512453
16
Fixes: 78464f023b54 ("hw/loongarch/virt: Modify ipi as percpu device")
17
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
18
Reviewed-by: Song Gao <gaosong@loongson.cn>
19
Message-Id: <20230521102307.87081-2-jiaxun.yang@flygoat.com>
20
Signed-off-by: Song Gao <gaosong@loongson.cn>
21
---
22
hw/intc/loongarch_ipi.c | 6 +++---
23
include/hw/intc/loongarch_ipi.h | 4 +++-
24
2 files changed, 6 insertions(+), 4 deletions(-)
25
26
diff --git a/hw/intc/loongarch_ipi.c b/hw/intc/loongarch_ipi.c
27
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/intc/loongarch_ipi.c
13
--- a/hw/loongarch/boot.c
29
+++ b/hw/intc/loongarch_ipi.c
14
+++ b/hw/loongarch/boot.c
30
@@ -XXX,XX +XXX,XX @@ static void loongarch_ipi_init(Object *obj)
15
@@ -XXX,XX +XXX,XX @@ static const unsigned int slave_boot_code[] = {
31
16
0x4c000020, /* jirl $r0,$r1,0 */
32
static const VMStateDescription vmstate_ipi_core = {
17
};
33
.name = "ipi-single",
18
34
- .version_id = 1,
19
+static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start)
35
- .minimum_version_id = 1,
20
+{
36
+ .version_id = 2,
21
+ hwaddr cmdline_addr = (hwaddr)p - (hwaddr)start;
37
+ .minimum_version_id = 2,
22
+
38
.fields = (VMStateField[]) {
23
+ info->a0 = 1;
39
VMSTATE_UINT32(status, IPICore),
24
+ info->a1 = cmdline_addr;
40
VMSTATE_UINT32(en, IPICore),
25
+
41
VMSTATE_UINT32(set, IPICore),
26
+ memcpy(p, info->kernel_cmdline, COMMAND_LINE_SIZE);
42
VMSTATE_UINT32(clear, IPICore),
27
+}
43
- VMSTATE_UINT32_ARRAY(buf, IPICore, 2),
28
+
44
+ VMSTATE_UINT32_ARRAY(buf, IPICore, IPI_MBX_NUM * 2),
29
static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
45
VMSTATE_END_OF_LIST()
30
{
31
return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS);
32
@@ -XXX,XX +XXX,XX @@ static void reset_load_elf(void *opaque)
33
34
cpu_reset(CPU(cpu));
35
if (env->load_elf) {
36
+    if (cpu == LOONGARCH_CPU(first_cpu)) {
37
+ env->gpr[4] = env->boot_info->a0;
38
+ env->gpr[5] = env->boot_info->a1;
39
+ }
40
cpu_set_pc(CPU(cpu), env->elf_address);
46
}
41
}
47
};
42
}
48
diff --git a/include/hw/intc/loongarch_ipi.h b/include/hw/intc/loongarch_ipi.h
43
@@ -XXX,XX +XXX,XX @@ static void loongarch_firmware_boot(LoongArchMachineState *lams,
44
45
static void init_boot_rom(struct loongarch_boot_info *info, void *p)
46
{
47
+ void *start = p;
48
+
49
memcpy(p, &slave_boot_code, sizeof(slave_boot_code));
50
p += sizeof(slave_boot_code);
51
+
52
+ init_cmdline(info, p, start);
53
+ p += COMMAND_LINE_SIZE;
54
}
55
56
static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
57
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
49
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/intc/loongarch_ipi.h
59
--- a/include/hw/loongarch/virt.h
51
+++ b/include/hw/intc/loongarch_ipi.h
60
+++ b/include/hw/loongarch/virt.h
52
@@ -XXX,XX +XXX,XX @@
61
@@ -XXX,XX +XXX,XX @@
53
#define MAIL_SEND_OFFSET 0
62
#define VIRT_GED_MEM_ADDR (VIRT_GED_EVT_ADDR + ACPI_GED_EVT_SEL_LEN)
54
#define ANY_SEND_OFFSET (IOCSR_ANY_SEND - IOCSR_MAIL_SEND)
63
#define VIRT_GED_REG_ADDR (VIRT_GED_MEM_ADDR + MEMORY_HOTPLUG_IO_LEN)
55
64
56
+#define IPI_MBX_NUM 4
65
+#define COMMAND_LINE_SIZE 512
57
+
66
+
58
#define TYPE_LOONGARCH_IPI "loongarch_ipi"
67
struct LoongArchMachineState {
59
OBJECT_DECLARE_SIMPLE_TYPE(LoongArchIPI, LOONGARCH_IPI)
68
/*< private >*/
60
69
MachineState parent_obj;
61
@@ -XXX,XX +XXX,XX @@ typedef struct IPICore {
70
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
62
uint32_t set;
71
index XXXXXXX..XXXXXXX 100644
63
uint32_t clear;
72
--- a/target/loongarch/cpu.h
64
/* 64bit buf divide into 2 32bit buf */
73
+++ b/target/loongarch/cpu.h
65
- uint32_t buf[2];
74
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
66
+ uint32_t buf[IPI_MBX_NUM * 2];
75
uint32_t mp_state;
67
qemu_irq irq;
76
/* Store ipistate to access from this struct */
68
} IPICore;
77
DeviceState *ipistate;
78
+
79
+ struct loongarch_boot_info *boot_info;
80
#endif
81
} CPULoongArchState;
69
82
70
--
83
--
71
2.39.1
84
2.34.1
diff view generated by jsdifflib
New patch
1
Add init_systab and set boot_info->a2
1
2
3
Signed-off-by: Song Gao <gaosong@loongson.cn>
4
Message-Id: <20240301093839.663947-6-gaosong@loongson.cn>
5
---
6
hw/loongarch/boot.c | 22 +++++++++++++++++
7
include/hw/loongarch/boot.h | 48 +++++++++++++++++++++++++++++++++++++
8
2 files changed, 70 insertions(+)
9
10
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/loongarch/boot.c
13
+++ b/hw/loongarch/boot.c
14
@@ -XXX,XX +XXX,XX @@ static const unsigned int slave_boot_code[] = {
15
0x4c000020, /* jirl $r0,$r1,0 */
16
};
17
18
+static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
19
+{
20
+ struct efi_system_table *systab = p;
21
+
22
+ info->a2 = (uint64_t)p - (uint64_t)start;
23
+
24
+ systab->hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE;
25
+ systab->hdr.revision = EFI_SPECIFICATION_VERSION;
26
+ systab->hdr.revision = sizeof(struct efi_system_table),
27
+ systab->fw_revision = FW_VERSION << 16 | FW_PATCHLEVEL << 8;
28
+ systab->runtime = 0;
29
+ systab->boottime = 0;
30
+ systab->nr_tables = 0;
31
+
32
+ p += ROUND_UP(sizeof(struct efi_system_table), 64);
33
+
34
+ systab->tables = p;
35
+}
36
+
37
static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start)
38
{
39
hwaddr cmdline_addr = (hwaddr)p - (hwaddr)start;
40
@@ -XXX,XX +XXX,XX @@ static void reset_load_elf(void *opaque)
41
    if (cpu == LOONGARCH_CPU(first_cpu)) {
42
env->gpr[4] = env->boot_info->a0;
43
env->gpr[5] = env->boot_info->a1;
44
+ env->gpr[6] = env->boot_info->a2;
45
}
46
cpu_set_pc(CPU(cpu), env->elf_address);
47
}
48
@@ -XXX,XX +XXX,XX @@ static void init_boot_rom(struct loongarch_boot_info *info, void *p)
49
50
init_cmdline(info, p, start);
51
p += COMMAND_LINE_SIZE;
52
+
53
+ init_systab(info, p, start);
54
}
55
56
static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
57
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
58
index XXXXXXX..XXXXXXX 100644
59
--- a/include/hw/loongarch/boot.h
60
+++ b/include/hw/loongarch/boot.h
61
@@ -XXX,XX +XXX,XX @@
62
#ifndef HW_LOONGARCH_BOOT_H
63
#define HW_LOONGARCH_BOOT_H
64
65
+/* UEFI 2.10 */
66
+#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
67
+#define EFI_2_100_SYSTEM_TABLE_REVISION ((2<<16) | (100))
68
+#define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION
69
+#define EFI_SYSTEM_TABLE_REVISION EFI_2_100_SYSTEM_TABLE_REVISION
70
+
71
+#define FW_VERSION 0x1
72
+#define FW_PATCHLEVEL 0x0
73
+
74
+typedef struct {
75
+ uint8_t b[16];
76
+} efi_guid_t __attribute__((aligned(8)));
77
+
78
+struct efi_config_table {
79
+ efi_guid_t guid;
80
+ uint64_t *ptr;
81
+ const char name[16];
82
+};
83
+
84
+typedef struct {
85
+ uint64_t signature;
86
+ uint32_t revision;
87
+ uint32_t headersize;
88
+ uint32_t crc32;
89
+ uint32_t reserved;
90
+} efi_table_hdr_t;
91
+
92
+struct efi_configuration_table {
93
+ efi_guid_t guid;
94
+ void *table;
95
+};
96
+
97
+struct efi_system_table {
98
+ efi_table_hdr_t hdr;
99
+ uint64_t fw_vendor; /* physical addr of CHAR16 vendor string */
100
+ uint32_t fw_revision;
101
+ uint64_t con_in_handle;
102
+ uint64_t *con_in;
103
+ uint64_t con_out_handle;
104
+ uint64_t *con_out;
105
+ uint64_t stderr_handle;
106
+ uint64_t stderr;
107
+ uint64_t *runtime;
108
+ uint64_t *boottime;
109
+ uint64_t nr_tables;
110
+ struct efi_configuration_table *tables;
111
+};
112
+
113
struct loongarch_boot_info {
114
uint64_t ram_size;
115
const char *kernel_filename;
116
--
117
2.34.1
diff view generated by jsdifflib
New patch
1
Signed-off-by: Song Gao <gaosong@loongson.cn>
2
Message-Id: <20240301093839.663947-7-gaosong@loongson.cn>
3
---
4
hw/loongarch/boot.c | 39 +++++++++++++++++++++++++++++++++++++
5
hw/loongarch/virt.c | 11 ++---------
6
include/hw/loongarch/boot.h | 27 +++++++++++++++++++++++++
7
include/hw/loongarch/virt.h | 10 ++++++++++
8
4 files changed, 78 insertions(+), 9 deletions(-)
1
9
10
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/loongarch/boot.c
13
+++ b/hw/loongarch/boot.c
14
@@ -XXX,XX +XXX,XX @@ static const unsigned int slave_boot_code[] = {
15
0x4c000020, /* jirl $r0,$r1,0 */
16
};
17
18
+static inline void *guidcpy(void *dst, const void *src)
19
+{
20
+ return memcpy(dst, src, sizeof(efi_guid_t));
21
+}
22
+
23
+static void init_efi_boot_memmap(struct efi_system_table *systab,
24
+ void *p, void *start)
25
+{
26
+ unsigned i;
27
+ struct efi_boot_memmap *boot_memmap = p;
28
+ efi_guid_t tbl_guid = LINUX_EFI_BOOT_MEMMAP_GUID;
29
+
30
+ /* efi_configuration_table 1 */
31
+ guidcpy(&systab->tables[0].guid, &tbl_guid);
32
+ systab->tables[0].table = (struct efi_configuration_table *)(p - start);
33
+ systab->nr_tables = 1;
34
+
35
+ boot_memmap->desc_size = sizeof(efi_memory_desc_t);
36
+ boot_memmap->desc_ver = 1;
37
+ boot_memmap->map_size = 0;
38
+
39
+ efi_memory_desc_t *map = p + sizeof(struct efi_boot_memmap);
40
+ for (i = 0; i < memmap_entries; i++) {
41
+ map = (void *)boot_memmap + sizeof(*map);
42
+ map[i].type = memmap_table[i].type;
43
+ map[i].phys_addr = memmap_table[i].address;
44
+ map[i].num_pages = memmap_table[i].length >> 16; /* 64KB align*/
45
+ p += sizeof(efi_memory_desc_t);
46
+ }
47
+}
48
+
49
static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
50
{
51
+ void *bp_tables_start;
52
struct efi_system_table *systab = p;
53
54
info->a2 = (uint64_t)p - (uint64_t)start;
55
@@ -XXX,XX +XXX,XX @@ static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
56
p += ROUND_UP(sizeof(struct efi_system_table), 64);
57
58
systab->tables = p;
59
+ bp_tables_start = p;
60
+
61
+ init_efi_boot_memmap(systab, p, start);
62
+ p += ROUND_UP(sizeof(struct efi_boot_memmap) +
63
+ sizeof(efi_memory_desc_t) * memmap_entries, 64);
64
+
65
+ systab->tables = (struct efi_configuration_table *)(bp_tables_start - start);
66
}
67
68
static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start)
69
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
70
index XXXXXXX..XXXXXXX 100644
71
--- a/hw/loongarch/virt.c
72
+++ b/hw/loongarch/virt.c
73
@@ -XXX,XX +XXX,XX @@ static void virt_powerdown_req(Notifier *notifier, void *opaque)
74
acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
75
}
76
77
-struct memmap_entry {
78
- uint64_t address;
79
- uint64_t length;
80
- uint32_t type;
81
- uint32_t reserved;
82
-};
83
-
84
-static struct memmap_entry *memmap_table;
85
-static unsigned memmap_entries;
86
+struct memmap_entry *memmap_table;
87
+unsigned memmap_entries;
88
89
static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
90
{
91
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
92
index XXXXXXX..XXXXXXX 100644
93
--- a/include/hw/loongarch/boot.h
94
+++ b/include/hw/loongarch/boot.h
95
@@ -XXX,XX +XXX,XX @@ typedef struct {
96
uint8_t b[16];
97
} efi_guid_t __attribute__((aligned(8)));
98
99
+#define EFI_GUID(a, b, c, d...) (efi_guid_t){ { \
100
+ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
101
+ (b) & 0xff, ((b) >> 8) & 0xff, \
102
+ (c) & 0xff, ((c) >> 8) & 0xff, d } }
103
+
104
+#define LINUX_EFI_BOOT_MEMMAP_GUID \
105
+ EFI_GUID(0x800f683f, 0xd08b, 0x423a, 0xa2, 0x93, \
106
+ 0x96, 0x5c, 0x3c, 0x6f, 0xe2, 0xb4)
107
+
108
struct efi_config_table {
109
efi_guid_t guid;
110
uint64_t *ptr;
111
@@ -XXX,XX +XXX,XX @@ struct efi_system_table {
112
struct efi_configuration_table *tables;
113
};
114
115
+typedef struct {
116
+ uint32_t type;
117
+ uint32_t pad;
118
+ uint64_t phys_addr;
119
+ uint64_t virt_addr;
120
+ uint64_t num_pages;
121
+ uint64_t attribute;
122
+} efi_memory_desc_t;
123
+
124
+struct efi_boot_memmap {
125
+ uint64_t map_size;
126
+ uint64_t desc_size;
127
+ uint32_t desc_ver;
128
+ uint64_t map_key;
129
+ uint64_t buff_size;
130
+ efi_memory_desc_t map[32];
131
+};
132
+
133
struct loongarch_boot_info {
134
uint64_t ram_size;
135
const char *kernel_filename;
136
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
137
index XXXXXXX..XXXXXXX 100644
138
--- a/include/hw/loongarch/virt.h
139
+++ b/include/hw/loongarch/virt.h
140
@@ -XXX,XX +XXX,XX @@
141
142
#define COMMAND_LINE_SIZE 512
143
144
+extern struct memmap_entry *memmap_table;
145
+extern unsigned memmap_entries;
146
+
147
+struct memmap_entry {
148
+ uint64_t address;
149
+ uint64_t length;
150
+ uint32_t type;
151
+ uint32_t reserved;
152
+};
153
+
154
struct LoongArchMachineState {
155
/*< private >*/
156
MachineState parent_obj;
157
--
158
2.34.1
diff view generated by jsdifflib
New patch
1
Signed-off-by: Song Gao <gaosong@loongson.cn>
2
Message-Id: <20240301093839.663947-8-gaosong@loongson.cn>
3
---
4
hw/loongarch/boot.c | 23 +++++++++++++++++++++--
5
include/hw/loongarch/boot.h | 9 +++++++++
6
2 files changed, 30 insertions(+), 2 deletions(-)
1
7
8
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
9
index XXXXXXX..XXXXXXX 100644
10
--- a/hw/loongarch/boot.c
11
+++ b/hw/loongarch/boot.c
12
@@ -XXX,XX +XXX,XX @@
13
#include "qemu/error-report.h"
14
#include "sysemu/reset.h"
15
16
+ram_addr_t initrd_offset;
17
+uint64_t initrd_size;
18
+
19
static const unsigned int slave_boot_code[] = {
20
/* Configure reset ebase. */
21
0x0400302c, /* csrwr $r12,0xc */
22
@@ -XXX,XX +XXX,XX @@ static void init_efi_boot_memmap(struct efi_system_table *systab,
23
}
24
}
25
26
+static void init_efi_initrd_table(struct efi_system_table *systab,
27
+ void *p, void *start)
28
+{
29
+ efi_guid_t tbl_guid = LINUX_EFI_INITRD_MEDIA_GUID;
30
+ struct efi_initrd *initrd_table = p;
31
+
32
+ /* efi_configuration_table 2 */
33
+ guidcpy(&systab->tables[1].guid, &tbl_guid);
34
+ systab->tables[1].table = (struct efi_configuration_table *)(p - start);
35
+ systab->nr_tables = 2;
36
+
37
+ initrd_table->base = initrd_offset;
38
+ initrd_table->size = initrd_size;
39
+}
40
+
41
static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
42
{
43
void *bp_tables_start;
44
@@ -XXX,XX +XXX,XX @@ static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
45
init_efi_boot_memmap(systab, p, start);
46
p += ROUND_UP(sizeof(struct efi_boot_memmap) +
47
sizeof(efi_memory_desc_t) * memmap_entries, 64);
48
+ init_efi_initrd_table(systab, p, start);
49
+ p += ROUND_UP(sizeof(struct efi_initrd), 64);
50
51
systab->tables = (struct efi_configuration_table *)(bp_tables_start - start);
52
}
53
@@ -XXX,XX +XXX,XX @@ static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
54
55
static int64_t load_kernel_info(struct loongarch_boot_info *info)
56
{
57
- uint64_t kernel_entry, kernel_low, kernel_high, initrd_size;
58
- ram_addr_t initrd_offset;
59
+ uint64_t kernel_entry, kernel_low, kernel_high;
60
ssize_t kernel_size;
61
62
kernel_size = load_elf(info->kernel_filename, NULL,
63
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
64
index XXXXXXX..XXXXXXX 100644
65
--- a/include/hw/loongarch/boot.h
66
+++ b/include/hw/loongarch/boot.h
67
@@ -XXX,XX +XXX,XX @@ typedef struct {
68
EFI_GUID(0x800f683f, 0xd08b, 0x423a, 0xa2, 0x93, \
69
0x96, 0x5c, 0x3c, 0x6f, 0xe2, 0xb4)
70
71
+#define LINUX_EFI_INITRD_MEDIA_GUID \
72
+ EFI_GUID(0x5568e427, 0x68fc, 0x4f3d, 0xac, 0x74, \
73
+ 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68)
74
+
75
struct efi_config_table {
76
efi_guid_t guid;
77
uint64_t *ptr;
78
@@ -XXX,XX +XXX,XX @@ struct efi_boot_memmap {
79
efi_memory_desc_t map[32];
80
};
81
82
+struct efi_initrd {
83
+ uint64_t base;
84
+ uint64_t size;
85
+};
86
+
87
struct loongarch_boot_info {
88
uint64_t ram_size;
89
const char *kernel_filename;
90
--
91
2.34.1
diff view generated by jsdifflib
New patch
1
Signed-off-by: Song Gao <gaosong@loongson.cn>
2
Message-Id: <20240301093839.663947-9-gaosong@loongson.cn>
3
---
4
hw/loongarch/boot.c | 11 +++++++++++
5
include/hw/loongarch/boot.h | 4 ++++
6
2 files changed, 15 insertions(+)
1
7
8
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
9
index XXXXXXX..XXXXXXX 100644
10
--- a/hw/loongarch/boot.c
11
+++ b/hw/loongarch/boot.c
12
@@ -XXX,XX +XXX,XX @@ static void init_efi_initrd_table(struct efi_system_table *systab,
13
initrd_table->size = initrd_size;
14
}
15
16
+static void init_efi_fdt_table(struct efi_system_table *systab)
17
+{
18
+ efi_guid_t tbl_guid = DEVICE_TREE_GUID;
19
+
20
+ /* efi_configuration_table 3 */
21
+ guidcpy(&systab->tables[2].guid, &tbl_guid);
22
+ systab->tables[2].table = (void *)0x100000; /* fdt_base 1MiB */
23
+ systab->nr_tables = 3;
24
+}
25
+
26
static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
27
{
28
void *bp_tables_start;
29
@@ -XXX,XX +XXX,XX @@ static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
30
sizeof(efi_memory_desc_t) * memmap_entries, 64);
31
init_efi_initrd_table(systab, p, start);
32
p += ROUND_UP(sizeof(struct efi_initrd), 64);
33
+ init_efi_fdt_table(systab);
34
35
systab->tables = (struct efi_configuration_table *)(bp_tables_start - start);
36
}
37
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
38
index XXXXXXX..XXXXXXX 100644
39
--- a/include/hw/loongarch/boot.h
40
+++ b/include/hw/loongarch/boot.h
41
@@ -XXX,XX +XXX,XX @@ typedef struct {
42
EFI_GUID(0x5568e427, 0x68fc, 0x4f3d, 0xac, 0x74, \
43
0xca, 0x55, 0x52, 0x31, 0xcc, 0x68)
44
45
+#define DEVICE_TREE_GUID \
46
+ EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, \
47
+ 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
48
+
49
struct efi_config_table {
50
efi_guid_t guid;
51
uint64_t *ptr;
52
--
53
2.34.1
diff view generated by jsdifflib
New patch
1
The right fdt memory node like [1], not [2]
1
2
3
[1]
4
memory@0 {
5
device_type = "memory";
6
reg = <0x00 0x00 0x00 0x10000000>;
7
};
8
[2]
9
memory@0 {
10
device_type = "memory";
11
reg = <0x02 0x00 0x02 0x10000000>;
12
};
13
14
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
15
Signed-off-by: Song Gao <gaosong@loongson.cn>
16
Message-Id: <20240301093839.663947-10-gaosong@loongson.cn>
17
---
18
hw/loongarch/virt.c | 2 +-
19
1 file changed, 1 insertion(+), 1 deletion(-)
20
21
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/loongarch/virt.c
24
+++ b/hw/loongarch/virt.c
25
@@ -XXX,XX +XXX,XX @@ static void fdt_add_memory_node(MachineState *ms,
26
char *nodename = g_strdup_printf("/memory@%" PRIx64, base);
27
28
qemu_fdt_add_subnode(ms->fdt, nodename);
29
- qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
30
+ qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0, base, 0, size);
31
qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory");
32
33
if (ms->numa_state && ms->numa_state->num_nodes) {
34
--
35
2.34.1
diff view generated by jsdifflib
New patch
1
fdt adds cpu interrupt controller node,
2
we use 'loongson,cpu-interrupt-controller'.
1
3
4
See:
5
https://github.com/torvalds/linux/blob/v6.7/drivers/irqchip/irq-loongarch-cpu.c
6
https://lore.kernel.org/r/20221114113824.1880-2-liupeibao@loongson.cn
7
8
Signed-off-by: Song Gao <gaosong@loongson.cn>
9
Message-Id: <20240301093839.663947-11-gaosong@loongson.cn>
10
---
11
hw/loongarch/virt.c | 21 +++++++++++++++++++++
12
1 file changed, 21 insertions(+)
13
14
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/loongarch/virt.c
17
+++ b/hw/loongarch/virt.c
18
@@ -XXX,XX +XXX,XX @@ static void virt_flash_map(LoongArchMachineState *lams,
19
virt_flash_map1(flash1, VIRT_FLASH1_BASE, VIRT_FLASH1_SIZE, sysmem);
20
}
21
22
+static void fdt_add_cpuic_node(LoongArchMachineState *lams,
23
+ uint32_t *cpuintc_phandle)
24
+{
25
+ MachineState *ms = MACHINE(lams);
26
+ char *nodename;
27
+
28
+ *cpuintc_phandle = qemu_fdt_alloc_phandle(ms->fdt);
29
+ nodename = g_strdup_printf("/cpuic");
30
+ qemu_fdt_add_subnode(ms->fdt, nodename);
31
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *cpuintc_phandle);
32
+ qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
33
+ "loongson,cpu-interrupt-controller");
34
+ qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0);
35
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 1);
36
+ g_free(nodename);
37
+}
38
+
39
static void fdt_add_flash_node(LoongArchMachineState *lams)
40
{
41
MachineState *ms = MACHINE(lams);
42
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
43
CPULoongArchState *env;
44
CPUState *cpu_state;
45
int cpu, pin, i, start, num;
46
+ uint32_t cpuintc_phandle;
47
48
/*
49
* The connection of interrupts:
50
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
51
memory_region_add_subregion(&lams->system_iocsr, MAIL_SEND_ADDR,
52
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 1));
53
54
+ /* Add cpu interrupt-controller */
55
+ fdt_add_cpuic_node(lams, &cpuintc_phandle);
56
+
57
for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
58
cpu_state = qemu_get_cpu(cpu);
59
cpudev = DEVICE(cpu_state);
60
--
61
2.34.1
diff view generated by jsdifflib
New patch
1
fdt adds Extend I/O Interrupt Controller,
2
we use 'loongson,ls2k2000-eiointc'.
1
3
4
See:
5
https://github.com/torvalds/linux/blob/v6.7/drivers/irqchip/irq-loongson-eiointc.c
6
https://lore.kernel.org/r/764e02d924094580ac0f1d15535f4b98308705c6.1683279769.git.zhoubinbin@loongson.cn
7
8
Signed-off-by: Song Gao <gaosong@loongson.cn>
9
Message-Id: <20240301093839.663947-12-gaosong@loongson.cn>
10
---
11
hw/loongarch/virt.c | 30 +++++++++++++++++++++++++++++-
12
include/hw/intc/loongarch_extioi.h | 1 +
13
2 files changed, 30 insertions(+), 1 deletion(-)
14
15
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/loongarch/virt.c
18
+++ b/hw/loongarch/virt.c
19
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpuic_node(LoongArchMachineState *lams,
20
g_free(nodename);
21
}
22
23
+static void fdt_add_eiointc_node(LoongArchMachineState *lams,
24
+ uint32_t *cpuintc_phandle,
25
+ uint32_t *eiointc_phandle)
26
+{
27
+ MachineState *ms = MACHINE(lams);
28
+ char *nodename;
29
+ hwaddr extioi_base = APIC_BASE;
30
+ hwaddr extioi_size = EXTIOI_SIZE;
31
+
32
+ *eiointc_phandle = qemu_fdt_alloc_phandle(ms->fdt);
33
+ nodename = g_strdup_printf("/eiointc@%" PRIx64, extioi_base);
34
+ qemu_fdt_add_subnode(ms->fdt, nodename);
35
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *eiointc_phandle);
36
+ qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
37
+ "loongson,ls2k2000-eiointc");
38
+ qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0);
39
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 1);
40
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent",
41
+ *cpuintc_phandle);
42
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupts", 3);
43
+ qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0x0,
44
+ extioi_base, 0x0, extioi_size);
45
+ g_free(nodename);
46
+}
47
+
48
static void fdt_add_flash_node(LoongArchMachineState *lams)
49
{
50
MachineState *ms = MACHINE(lams);
51
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
52
CPULoongArchState *env;
53
CPUState *cpu_state;
54
int cpu, pin, i, start, num;
55
- uint32_t cpuintc_phandle;
56
+ uint32_t cpuintc_phandle, eiointc_phandle;
57
58
/*
59
* The connection of interrupts:
60
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
61
}
62
}
63
64
+ /* Add Extend I/O Interrupt Controller node */
65
+ fdt_add_eiointc_node(lams, &cpuintc_phandle, &eiointc_phandle);
66
+
67
pch_pic = qdev_new(TYPE_LOONGARCH_PCH_PIC);
68
num = VIRT_PCH_PIC_IRQ_NUM;
69
qdev_prop_set_uint32(pch_pic, "pch_pic_irq_num", num);
70
diff --git a/include/hw/intc/loongarch_extioi.h b/include/hw/intc/loongarch_extioi.h
71
index XXXXXXX..XXXXXXX 100644
72
--- a/include/hw/intc/loongarch_extioi.h
73
+++ b/include/hw/intc/loongarch_extioi.h
74
@@ -XXX,XX +XXX,XX @@
75
#define EXTIOI_COREISR_END (0xB20 - APIC_OFFSET)
76
#define EXTIOI_COREMAP_START (0xC00 - APIC_OFFSET)
77
#define EXTIOI_COREMAP_END (0xD00 - APIC_OFFSET)
78
+#define EXTIOI_SIZE 0x800
79
80
typedef struct ExtIOICore {
81
uint32_t coreisr[EXTIOI_IRQS_GROUP_COUNT];
82
--
83
2.34.1
diff view generated by jsdifflib
New patch
1
fdt adds pch pic controller, we use 'loongson,pch-pic-1.0'
1
2
3
See:
4
https://github.com/torvalds/linux/blob/v6.7/drivers/irqchip/irq-loongson-pch-pic.c
5
https://lore.kernel.org/r/20200528152757.1028711-4-jiaxun.yang@flygoat.com
6
7
Signed-off-by: Song Gao <gaosong@loongson.cn>
8
Message-Id: <20240301093839.663947-13-gaosong@loongson.cn>
9
---
10
hw/loongarch/virt.c | 30 +++++++++++++++++++++++++++++-
11
include/hw/pci-host/ls7a.h | 1 +
12
2 files changed, 30 insertions(+), 1 deletion(-)
13
14
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/loongarch/virt.c
17
+++ b/hw/loongarch/virt.c
18
@@ -XXX,XX +XXX,XX @@ static void fdt_add_eiointc_node(LoongArchMachineState *lams,
19
g_free(nodename);
20
}
21
22
+static void fdt_add_pch_pic_node(LoongArchMachineState *lams,
23
+ uint32_t *eiointc_phandle,
24
+ uint32_t *pch_pic_phandle)
25
+{
26
+ MachineState *ms = MACHINE(lams);
27
+ char *nodename;
28
+ hwaddr pch_pic_base = VIRT_PCH_REG_BASE;
29
+ hwaddr pch_pic_size = VIRT_PCH_REG_SIZE;
30
+
31
+ *pch_pic_phandle = qemu_fdt_alloc_phandle(ms->fdt);
32
+ nodename = g_strdup_printf("/platic@%" PRIx64, pch_pic_base);
33
+ qemu_fdt_add_subnode(ms->fdt, nodename);
34
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *pch_pic_phandle);
35
+ qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
36
+ "loongson,pch-pic-1.0");
37
+ qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0,
38
+ pch_pic_base, 0, pch_pic_size);
39
+ qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0);
40
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 2);
41
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent",
42
+ *eiointc_phandle);
43
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "loongson,pic-base-vec", 0);
44
+ g_free(nodename);
45
+}
46
+
47
static void fdt_add_flash_node(LoongArchMachineState *lams)
48
{
49
MachineState *ms = MACHINE(lams);
50
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
51
CPULoongArchState *env;
52
CPUState *cpu_state;
53
int cpu, pin, i, start, num;
54
- uint32_t cpuintc_phandle, eiointc_phandle;
55
+ uint32_t cpuintc_phandle, eiointc_phandle, pch_pic_phandle;
56
57
/*
58
* The connection of interrupts:
59
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
60
qdev_connect_gpio_out(DEVICE(d), i, qdev_get_gpio_in(extioi, i));
61
}
62
63
+ /* Add PCH PIC node */
64
+ fdt_add_pch_pic_node(lams, &eiointc_phandle, &pch_pic_phandle);
65
+
66
pch_msi = qdev_new(TYPE_LOONGARCH_PCH_MSI);
67
start = num;
68
num = EXTIOI_IRQS - start;
69
diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h
70
index XXXXXXX..XXXXXXX 100644
71
--- a/include/hw/pci-host/ls7a.h
72
+++ b/include/hw/pci-host/ls7a.h
73
@@ -XXX,XX +XXX,XX @@
74
#define VIRT_PCH_REG_BASE 0x10000000UL
75
#define VIRT_IOAPIC_REG_BASE (VIRT_PCH_REG_BASE)
76
#define VIRT_PCH_MSI_ADDR_LOW 0x2FF00000UL
77
+#define VIRT_PCH_REG_SIZE 0x400
78
79
/*
80
* GSI_BASE is hard-coded with 64 in linux kernel, else kernel fails to boot
81
--
82
2.34.1
diff view generated by jsdifflib
New patch
1
fdt adds pch msi controller, we use 'loongson,pch-msi-1.0'.
1
2
3
See:
4
https://github.com/torvalds/linux/blob/v6.7/drivers/irqchip/irq-loongson-pch-msi.c
5
https://lore.kernel.org/r/20200528152757.1028711-6-jiaxun.yang@flygoat.com
6
7
Signed-off-by: Song Gao <gaosong@loongson.cn>
8
Message-Id: <20240301093839.663947-14-gaosong@loongson.cn>
9
---
10
hw/loongarch/virt.c | 33 ++++++++++++++++++++++++++++++++-
11
include/hw/pci-host/ls7a.h | 1 +
12
2 files changed, 33 insertions(+), 1 deletion(-)
13
14
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/loongarch/virt.c
17
+++ b/hw/loongarch/virt.c
18
@@ -XXX,XX +XXX,XX @@ static void fdt_add_pch_pic_node(LoongArchMachineState *lams,
19
g_free(nodename);
20
}
21
22
+static void fdt_add_pch_msi_node(LoongArchMachineState *lams,
23
+ uint32_t *eiointc_phandle,
24
+ uint32_t *pch_msi_phandle)
25
+{
26
+ MachineState *ms = MACHINE(lams);
27
+ char *nodename;
28
+ hwaddr pch_msi_base = VIRT_PCH_MSI_ADDR_LOW;
29
+ hwaddr pch_msi_size = VIRT_PCH_MSI_SIZE;
30
+
31
+ *pch_msi_phandle = qemu_fdt_alloc_phandle(ms->fdt);
32
+ nodename = g_strdup_printf("/msi@%" PRIx64, pch_msi_base);
33
+ qemu_fdt_add_subnode(ms->fdt, nodename);
34
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", *pch_msi_phandle);
35
+ qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
36
+ "loongson,pch-msi-1.0");
37
+ qemu_fdt_setprop_cells(ms->fdt, nodename, "reg",
38
+ 0, pch_msi_base,
39
+ 0, pch_msi_size);
40
+ qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0);
41
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent",
42
+ *eiointc_phandle);
43
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "loongson,msi-base-vec",
44
+ VIRT_PCH_PIC_IRQ_NUM);
45
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "loongson,msi-num-vecs",
46
+ EXTIOI_IRQS - VIRT_PCH_PIC_IRQ_NUM);
47
+ g_free(nodename);
48
+}
49
+
50
static void fdt_add_flash_node(LoongArchMachineState *lams)
51
{
52
MachineState *ms = MACHINE(lams);
53
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
54
CPULoongArchState *env;
55
CPUState *cpu_state;
56
int cpu, pin, i, start, num;
57
- uint32_t cpuintc_phandle, eiointc_phandle, pch_pic_phandle;
58
+ uint32_t cpuintc_phandle, eiointc_phandle, pch_pic_phandle, pch_msi_phandle;
59
60
/*
61
* The connection of interrupts:
62
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
63
qdev_get_gpio_in(extioi, i + start));
64
}
65
66
+ /* Add PCH MSI node */
67
+ fdt_add_pch_msi_node(lams, &eiointc_phandle, &pch_msi_phandle);
68
+
69
loongarch_devices_init(pch_pic, lams);
70
}
71
72
diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h
73
index XXXXXXX..XXXXXXX 100644
74
--- a/include/hw/pci-host/ls7a.h
75
+++ b/include/hw/pci-host/ls7a.h
76
@@ -XXX,XX +XXX,XX @@
77
#define VIRT_IOAPIC_REG_BASE (VIRT_PCH_REG_BASE)
78
#define VIRT_PCH_MSI_ADDR_LOW 0x2FF00000UL
79
#define VIRT_PCH_REG_SIZE 0x400
80
+#define VIRT_PCH_MSI_SIZE 0x8
81
82
/*
83
* GSI_BASE is hard-coded with 64 in linux kernel, else kernel fails to boot
84
--
85
2.34.1
diff view generated by jsdifflib
New patch
1
Signed-off-by: Song Gao <gaosong@loongson.cn>
2
Message-Id: <20240301093839.663947-15-gaosong@loongson.cn>
3
---
4
hw/loongarch/virt.c | 73 ++++++++++++++++++++++++++++++++++++++++++---
5
1 file changed, 69 insertions(+), 4 deletions(-)
1
6
7
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/hw/loongarch/virt.c
10
+++ b/hw/loongarch/virt.c
11
@@ -XXX,XX +XXX,XX @@ static void fdt_add_fw_cfg_node(const LoongArchMachineState *lams)
12
g_free(nodename);
13
}
14
15
-static void fdt_add_pcie_node(const LoongArchMachineState *lams)
16
+static void fdt_add_pcie_irq_map_node(const LoongArchMachineState *lams,
17
+ char *nodename,
18
+ uint32_t *pch_pic_phandle)
19
+{
20
+ int pin, dev;
21
+ uint32_t irq_map_stride = 0;
22
+ uint32_t full_irq_map[GPEX_NUM_IRQS *GPEX_NUM_IRQS * 10] = {};
23
+ uint32_t *irq_map = full_irq_map;
24
+ const MachineState *ms = MACHINE(lams);
25
+
26
+ /* This code creates a standard swizzle of interrupts such that
27
+ * each device's first interrupt is based on it's PCI_SLOT number.
28
+ * (See pci_swizzle_map_irq_fn())
29
+ *
30
+ * We only need one entry per interrupt in the table (not one per
31
+ * possible slot) seeing the interrupt-map-mask will allow the table
32
+ * to wrap to any number of devices.
33
+ */
34
+
35
+ for (dev = 0; dev < GPEX_NUM_IRQS; dev++) {
36
+ int devfn = dev * 0x8;
37
+
38
+ for (pin = 0; pin < GPEX_NUM_IRQS; pin++) {
39
+ int irq_nr = 16 + ((pin + PCI_SLOT(devfn)) % GPEX_NUM_IRQS);
40
+ int i = 0;
41
+
42
+ /* Fill PCI address cells */
43
+ irq_map[i] = cpu_to_be32(devfn << 8);
44
+ i += 3;
45
+
46
+ /* Fill PCI Interrupt cells */
47
+ irq_map[i] = cpu_to_be32(pin + 1);
48
+ i += 1;
49
+
50
+ /* Fill interrupt controller phandle and cells */
51
+ irq_map[i++] = cpu_to_be32(*pch_pic_phandle);
52
+ irq_map[i++] = cpu_to_be32(irq_nr);
53
+
54
+ if (!irq_map_stride) {
55
+ irq_map_stride = i;
56
+ }
57
+ irq_map += irq_map_stride;
58
+ }
59
+ }
60
+
61
+
62
+ qemu_fdt_setprop(ms->fdt, nodename, "interrupt-map", full_irq_map,
63
+ GPEX_NUM_IRQS * GPEX_NUM_IRQS *
64
+ irq_map_stride * sizeof(uint32_t));
65
+ qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupt-map-mask",
66
+ 0x1800, 0, 0, 0x7);
67
+}
68
+
69
+static void fdt_add_pcie_node(const LoongArchMachineState *lams,
70
+ uint32_t *pch_pic_phandle,
71
+ uint32_t *pch_msi_phandle)
72
{
73
char *nodename;
74
hwaddr base_mmio = VIRT_PCI_MEM_BASE;
75
@@ -XXX,XX +XXX,XX @@ static void fdt_add_pcie_node(const LoongArchMachineState *lams)
76
2, base_pio, 2, size_pio,
77
1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
78
2, base_mmio, 2, size_mmio);
79
+ qemu_fdt_setprop_cells(ms->fdt, nodename, "msi-map",
80
+ 0, *pch_msi_phandle, 0, 0x10000);
81
+
82
+ fdt_add_pcie_irq_map_node(lams, nodename, pch_pic_phandle);
83
+
84
g_free(nodename);
85
}
86
87
@@ -XXX,XX +XXX,XX @@ static DeviceState *create_platform_bus(DeviceState *pch_pic)
88
return dev;
89
}
90
91
-static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *lams)
92
+static void loongarch_devices_init(DeviceState *pch_pic,
93
+ LoongArchMachineState *lams,
94
+ uint32_t *pch_pic_phandle,
95
+ uint32_t *pch_msi_phandle)
96
{
97
MachineClass *mc = MACHINE_GET_CLASS(lams);
98
DeviceState *gpex_dev;
99
@@ -XXX,XX +XXX,XX @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *
100
gpex_set_irq_num(GPEX_HOST(gpex_dev), i, 16 + i);
101
}
102
103
+ /* Add pcie node */
104
+ fdt_add_pcie_node(lams, pch_pic_phandle, pch_msi_phandle);
105
+
106
serial_mm_init(get_system_memory(), VIRT_UART_BASE, 0,
107
qdev_get_gpio_in(pch_pic,
108
VIRT_UART_IRQ - VIRT_GSI_BASE),
109
@@ -XXX,XX +XXX,XX @@ static void loongarch_irq_init(LoongArchMachineState *lams)
110
/* Add PCH MSI node */
111
fdt_add_pch_msi_node(lams, &eiointc_phandle, &pch_msi_phandle);
112
113
- loongarch_devices_init(pch_pic, lams);
114
+ loongarch_devices_init(pch_pic, lams, &pch_pic_phandle, &pch_msi_phandle);
115
}
116
117
static void loongarch_firmware_init(LoongArchMachineState *lams)
118
@@ -XXX,XX +XXX,XX @@ static void loongarch_init(MachineState *machine)
119
lams->powerdown_notifier.notify = virt_powerdown_req;
120
qemu_register_powerdown_notifier(&lams->powerdown_notifier);
121
122
- fdt_add_pcie_node(lams);
123
/*
124
* Since lowmem region starts from 0 and Linux kernel legacy start address
125
* at 2 MiB, FDT base address is located at 1 MiB to avoid NULL pointer
126
--
127
2.34.1
diff view generated by jsdifflib
New patch
1
Signed-off-by: Song Gao <gaosong@loongson.cn>
2
Message-Id: <20240301093839.663947-16-gaosong@loongson.cn>
3
---
4
hw/loongarch/virt.c | 31 +------------------------------
5
1 file changed, 1 insertion(+), 30 deletions(-)
1
6
7
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/hw/loongarch/virt.c
10
+++ b/hw/loongarch/virt.c
11
@@ -XXX,XX +XXX,XX @@ static void fdt_add_pcie_node(const LoongArchMachineState *lams,
12
g_free(nodename);
13
}
14
15
-static void fdt_add_irqchip_node(LoongArchMachineState *lams)
16
-{
17
- MachineState *ms = MACHINE(lams);
18
- char *nodename;
19
- uint32_t irqchip_phandle;
20
-
21
- irqchip_phandle = qemu_fdt_alloc_phandle(ms->fdt);
22
- qemu_fdt_setprop_cell(ms->fdt, "/", "interrupt-parent", irqchip_phandle);
23
-
24
- nodename = g_strdup_printf("/intc@%lx", VIRT_IOAPIC_REG_BASE);
25
- qemu_fdt_add_subnode(ms->fdt, nodename);
26
- qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 3);
27
- qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0);
28
- qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 0x2);
29
- qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 0x2);
30
- qemu_fdt_setprop(ms->fdt, nodename, "ranges", NULL, 0);
31
-
32
- qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
33
- "loongarch,ls7a");
34
-
35
- qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
36
- 2, VIRT_IOAPIC_REG_BASE,
37
- 2, PCH_PIC_ROUTE_ENTRY_OFFSET);
38
-
39
- qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", irqchip_phandle);
40
- g_free(nodename);
41
-}
42
-
43
static void fdt_add_memory_node(MachineState *ms,
44
uint64_t base, uint64_t size, int node_id)
45
{
46
@@ -XXX,XX +XXX,XX @@ static void loongarch_init(MachineState *machine)
47
48
/* Initialize the IO interrupt subsystem */
49
loongarch_irq_init(lams);
50
- fdt_add_irqchip_node(lams);
51
- platform_bus_add_all_fdt_nodes(machine->fdt, "/intc",
52
+ platform_bus_add_all_fdt_nodes(machine->fdt, "/platic",
53
VIRT_PLATFORM_BUS_BASEADDRESS,
54
VIRT_PLATFORM_BUS_SIZE,
55
VIRT_PLATFORM_BUS_IRQ);
56
--
57
2.34.1
diff view generated by jsdifflib