1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include "qemu/osdep.h"
28#include "qapi/error.h"
29#include "qapi/visitor.h"
30#include "sysemu/sysemu.h"
31#include "sysemu/numa.h"
32#include "hw/hw.h"
33#include "qemu/log.h"
34#include "hw/fw-path-provider.h"
35#include "elf.h"
36#include "net/net.h"
37#include "sysemu/device_tree.h"
38#include "sysemu/block-backend.h"
39#include "sysemu/cpus.h"
40#include "sysemu/hw_accel.h"
41#include "kvm_ppc.h"
42#include "migration/misc.h"
43#include "migration/global_state.h"
44#include "migration/register.h"
45#include "mmu-hash64.h"
46#include "mmu-book3s-v3.h"
47#include "cpu-models.h"
48#include "qom/cpu.h"
49
50#include "hw/boards.h"
51#include "hw/ppc/ppc.h"
52#include "hw/loader.h"
53
54#include "hw/ppc/fdt.h"
55#include "hw/ppc/spapr.h"
56#include "hw/ppc/spapr_vio.h"
57#include "hw/pci-host/spapr.h"
58#include "hw/ppc/xics.h"
59#include "hw/pci/msi.h"
60
61#include "hw/pci/pci.h"
62#include "hw/scsi/scsi.h"
63#include "hw/virtio/virtio-scsi.h"
64#include "hw/virtio/vhost-scsi-common.h"
65
66#include "exec/address-spaces.h"
67#include "hw/usb.h"
68#include "qemu/config-file.h"
69#include "qemu/error-report.h"
70#include "trace.h"
71#include "hw/nmi.h"
72#include "hw/intc/intc.h"
73
74#include "hw/compat.h"
75#include "qemu/cutils.h"
76#include "hw/ppc/spapr_cpu_core.h"
77#include "qmp-commands.h"
78
79#include <libfdt.h>
80
81
82
83
84
85
86
87
88
89
90
91#define FDT_MAX_SIZE 0x100000
92#define RTAS_MAX_SIZE 0x10000
93#define RTAS_MAX_ADDR 0x80000000
94#define FW_MAX_SIZE 0x400000
95#define FW_FILE_NAME "slof.bin"
96#define FW_OVERHEAD 0x2800000
97#define KERNEL_LOAD_ADDR FW_MAX_SIZE
98
99#define MIN_RMA_SLOF 128UL
100
101#define PHANDLE_XICP 0x00001111
102
103static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
104 const char *type_ics,
105 int nr_irqs, Error **errp)
106{
107 Error *local_err = NULL;
108 Object *obj;
109
110 obj = object_new(type_ics);
111 object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
112 object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
113 &error_abort);
114 object_property_set_int(obj, nr_irqs, "nr-irqs", &local_err);
115 if (local_err) {
116 goto error;
117 }
118 object_property_set_bool(obj, true, "realized", &local_err);
119 if (local_err) {
120 goto error;
121 }
122
123 return ICS_SIMPLE(obj);
124
125error:
126 error_propagate(errp, local_err);
127 return NULL;
128}
129
130static bool pre_2_10_vmstate_dummy_icp_needed(void *opaque)
131{
132
133
134
135
136 return false;
137}
138
139static const VMStateDescription pre_2_10_vmstate_dummy_icp = {
140 .name = "icp/server",
141 .version_id = 1,
142 .minimum_version_id = 1,
143 .needed = pre_2_10_vmstate_dummy_icp_needed,
144 .fields = (VMStateField[]) {
145 VMSTATE_UNUSED(4),
146 VMSTATE_UNUSED(1),
147 VMSTATE_UNUSED(1),
148 VMSTATE_END_OF_LIST()
149 },
150};
151
152static void pre_2_10_vmstate_register_dummy_icp(int i)
153{
154 vmstate_register(NULL, i, &pre_2_10_vmstate_dummy_icp,
155 (void *)(uintptr_t) i);
156}
157
158static void pre_2_10_vmstate_unregister_dummy_icp(int i)
159{
160 vmstate_unregister(NULL, &pre_2_10_vmstate_dummy_icp,
161 (void *)(uintptr_t) i);
162}
163
164static inline int xics_max_server_number(void)
165{
166 return DIV_ROUND_UP(max_cpus * kvmppc_smt_threads(), smp_threads);
167}
168
169static void xics_system_init(MachineState *machine, int nr_irqs, Error **errp)
170{
171 sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
172 sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
173
174 if (kvm_enabled()) {
175 if (machine_kernel_irqchip_allowed(machine) &&
176 !xics_kvm_init(spapr, errp)) {
177 spapr->icp_type = TYPE_KVM_ICP;
178 spapr->ics = spapr_ics_create(spapr, TYPE_ICS_KVM, nr_irqs, errp);
179 }
180 if (machine_kernel_irqchip_required(machine) && !spapr->ics) {
181 error_prepend(errp, "kernel_irqchip requested but unavailable: ");
182 return;
183 }
184 }
185
186 if (!spapr->ics) {
187 xics_spapr_init(spapr);
188 spapr->icp_type = TYPE_ICP;
189 spapr->ics = spapr_ics_create(spapr, TYPE_ICS_SIMPLE, nr_irqs, errp);
190 if (!spapr->ics) {
191 return;
192 }
193 }
194
195 if (smc->pre_2_10_has_unused_icps) {
196 int i;
197
198 for (i = 0; i < xics_max_server_number(); i++) {
199
200
201
202 pre_2_10_vmstate_register_dummy_icp(i);
203 }
204 }
205}
206
207static int spapr_fixup_cpu_smt_dt(void *fdt, int offset, PowerPCCPU *cpu,
208 int smt_threads)
209{
210 int i, ret = 0;
211 uint32_t servers_prop[smt_threads];
212 uint32_t gservers_prop[smt_threads * 2];
213 int index = spapr_vcpu_id(cpu);
214
215 if (cpu->compat_pvr) {
216 ret = fdt_setprop_cell(fdt, offset, "cpu-version", cpu->compat_pvr);
217 if (ret < 0) {
218 return ret;
219 }
220 }
221
222
223 for (i = 0; i < smt_threads; i++) {
224 servers_prop[i] = cpu_to_be32(index + i);
225
226 gservers_prop[i*2] = cpu_to_be32(index + i);
227 gservers_prop[i*2 + 1] = 0;
228 }
229 ret = fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s",
230 servers_prop, sizeof(servers_prop));
231 if (ret < 0) {
232 return ret;
233 }
234 ret = fdt_setprop(fdt, offset, "ibm,ppc-interrupt-gserver#s",
235 gservers_prop, sizeof(gservers_prop));
236
237 return ret;
238}
239
240static int spapr_fixup_cpu_numa_dt(void *fdt, int offset, PowerPCCPU *cpu)
241{
242 int index = spapr_vcpu_id(cpu);
243 uint32_t associativity[] = {cpu_to_be32(0x5),
244 cpu_to_be32(0x0),
245 cpu_to_be32(0x0),
246 cpu_to_be32(0x0),
247 cpu_to_be32(cpu->node_id),
248 cpu_to_be32(index)};
249
250
251 return fdt_setprop(fdt, offset, "ibm,associativity", associativity,
252 sizeof(associativity));
253}
254
255
256static void spapr_populate_pa_features(sPAPRMachineState *spapr,
257 PowerPCCPU *cpu,
258 void *fdt, int offset,
259 bool legacy_guest)
260{
261 CPUPPCState *env = &cpu->env;
262 uint8_t pa_features_206[] = { 6, 0,
263 0xf6, 0x1f, 0xc7, 0x00, 0x80, 0xc0 };
264 uint8_t pa_features_207[] = { 24, 0,
265 0xf6, 0x1f, 0xc7, 0xc0, 0x80, 0xf0,
266 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
268 0x80, 0x00, 0x80, 0x00, 0x00, 0x00 };
269 uint8_t pa_features_300[] = { 66, 0,
270
271
272 0xf6, 0x1f, 0xc7, 0xc0, 0x80, 0xf0,
273
274 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
275
276 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
277
278 0x80, 0x00, 0x80, 0x00, 0x00, 0x00,
279
280 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
281
282 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00,
283
284 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
285
286 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
287
288 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
289
290 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
291
292 0x80, 0x00, 0x80, 0x00, 0x00, 0x00,
293 };
294 uint8_t *pa_features = NULL;
295 size_t pa_size;
296
297 if (ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_06, 0, cpu->compat_pvr)) {
298 pa_features = pa_features_206;
299 pa_size = sizeof(pa_features_206);
300 }
301 if (ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_07, 0, cpu->compat_pvr)) {
302 pa_features = pa_features_207;
303 pa_size = sizeof(pa_features_207);
304 }
305 if (ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00, 0, cpu->compat_pvr)) {
306 pa_features = pa_features_300;
307 pa_size = sizeof(pa_features_300);
308 }
309 if (!pa_features) {
310 return;
311 }
312
313 if (env->ci_large_pages) {
314
315
316
317
318
319
320
321 pa_features[3] |= 0x20;
322 }
323 if ((spapr_get_cap(spapr, SPAPR_CAP_HTM) != 0) && pa_size > 24) {
324 pa_features[24] |= 0x80;
325 }
326 if (legacy_guest && pa_size > 40) {
327
328
329
330 pa_features[40 + 2] &= ~0x80;
331 }
332
333 _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
334}
335
336static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
337{
338 int ret = 0, offset, cpus_offset;
339 CPUState *cs;
340 char cpu_model[32];
341 int smt = kvmppc_smt_threads();
342 uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)};
343
344 CPU_FOREACH(cs) {
345 PowerPCCPU *cpu = POWERPC_CPU(cs);
346 DeviceClass *dc = DEVICE_GET_CLASS(cs);
347 int index = spapr_vcpu_id(cpu);
348 int compat_smt = MIN(smp_threads, ppc_compat_max_threads(cpu));
349
350 if ((index % smt) != 0) {
351 continue;
352 }
353
354 snprintf(cpu_model, 32, "%s@%x", dc->fw_name, index);
355
356 cpus_offset = fdt_path_offset(fdt, "/cpus");
357 if (cpus_offset < 0) {
358 cpus_offset = fdt_add_subnode(fdt, 0, "cpus");
359 if (cpus_offset < 0) {
360 return cpus_offset;
361 }
362 }
363 offset = fdt_subnode_offset(fdt, cpus_offset, cpu_model);
364 if (offset < 0) {
365 offset = fdt_add_subnode(fdt, cpus_offset, cpu_model);
366 if (offset < 0) {
367 return offset;
368 }
369 }
370
371 ret = fdt_setprop(fdt, offset, "ibm,pft-size",
372 pft_size_prop, sizeof(pft_size_prop));
373 if (ret < 0) {
374 return ret;
375 }
376
377 if (nb_numa_nodes > 1) {
378 ret = spapr_fixup_cpu_numa_dt(fdt, offset, cpu);
379 if (ret < 0) {
380 return ret;
381 }
382 }
383
384 ret = spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt);
385 if (ret < 0) {
386 return ret;
387 }
388
389 spapr_populate_pa_features(spapr, cpu, fdt, offset,
390 spapr->cas_legacy_guest_workaround);
391 }
392 return ret;
393}
394
395static hwaddr spapr_node0_size(MachineState *machine)
396{
397 if (nb_numa_nodes) {
398 int i;
399 for (i = 0; i < nb_numa_nodes; ++i) {
400 if (numa_info[i].node_mem) {
401 return MIN(pow2floor(numa_info[i].node_mem),
402 machine->ram_size);
403 }
404 }
405 }
406 return machine->ram_size;
407}
408
409static void add_str(GString *s, const gchar *s1)
410{
411 g_string_append_len(s, s1, strlen(s1) + 1);
412}
413
414static int spapr_populate_memory_node(void *fdt, int nodeid, hwaddr start,
415 hwaddr size)
416{
417 uint32_t associativity[] = {
418 cpu_to_be32(0x4),
419 cpu_to_be32(0x0), cpu_to_be32(0x0),
420 cpu_to_be32(0x0), cpu_to_be32(nodeid)
421 };
422 char mem_name[32];
423 uint64_t mem_reg_property[2];
424 int off;
425
426 mem_reg_property[0] = cpu_to_be64(start);
427 mem_reg_property[1] = cpu_to_be64(size);
428
429 sprintf(mem_name, "memory@" TARGET_FMT_lx, start);
430 off = fdt_add_subnode(fdt, 0, mem_name);
431 _FDT(off);
432 _FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
433 _FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
434 sizeof(mem_reg_property))));
435 _FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
436 sizeof(associativity))));
437 return off;
438}
439
440static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
441{
442 MachineState *machine = MACHINE(spapr);
443 hwaddr mem_start, node_size;
444 int i, nb_nodes = nb_numa_nodes;
445 NodeInfo *nodes = numa_info;
446 NodeInfo ramnode;
447
448
449 if (!nb_numa_nodes) {
450 nb_nodes = 1;
451 ramnode.node_mem = machine->ram_size;
452 nodes = &ramnode;
453 }
454
455 for (i = 0, mem_start = 0; i < nb_nodes; ++i) {
456 if (!nodes[i].node_mem) {
457 continue;
458 }
459 if (mem_start >= machine->ram_size) {
460 node_size = 0;
461 } else {
462 node_size = nodes[i].node_mem;
463 if (node_size > machine->ram_size - mem_start) {
464 node_size = machine->ram_size - mem_start;
465 }
466 }
467 if (!mem_start) {
468
469 spapr_populate_memory_node(fdt, i, 0, spapr->rma_size);
470 mem_start += spapr->rma_size;
471 node_size -= spapr->rma_size;
472 }
473 for ( ; node_size; ) {
474 hwaddr sizetmp = pow2floor(node_size);
475
476
477 if (ctzl(mem_start) < ctzl(sizetmp)) {
478 sizetmp = 1ULL << ctzl(mem_start);
479 }
480
481 spapr_populate_memory_node(fdt, i, mem_start, sizetmp);
482 node_size -= sizetmp;
483 mem_start += sizetmp;
484 }
485 }
486
487 return 0;
488}
489
490static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
491 sPAPRMachineState *spapr)
492{
493 PowerPCCPU *cpu = POWERPC_CPU(cs);
494 CPUPPCState *env = &cpu->env;
495 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
496 int index = spapr_vcpu_id(cpu);
497 uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
498 0xffffffff, 0xffffffff};
499 uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq()
500 : SPAPR_TIMEBASE_FREQ;
501 uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;
502 uint32_t page_sizes_prop[64];
503 size_t page_sizes_prop_size;
504 uint32_t vcpus_per_socket = smp_threads * smp_cores;
505 uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)};
506 int compat_smt = MIN(smp_threads, ppc_compat_max_threads(cpu));
507 sPAPRDRConnector *drc;
508 int drc_index;
509 uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ];
510 int i;
511
512 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_CPU, index);
513 if (drc) {
514 drc_index = spapr_drc_index(drc);
515 _FDT((fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index)));
516 }
517
518 _FDT((fdt_setprop_cell(fdt, offset, "reg", index)));
519 _FDT((fdt_setprop_string(fdt, offset, "device_type", "cpu")));
520
521 _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", env->spr[SPR_PVR])));
522 _FDT((fdt_setprop_cell(fdt, offset, "d-cache-block-size",
523 env->dcache_line_size)));
524 _FDT((fdt_setprop_cell(fdt, offset, "d-cache-line-size",
525 env->dcache_line_size)));
526 _FDT((fdt_setprop_cell(fdt, offset, "i-cache-block-size",
527 env->icache_line_size)));
528 _FDT((fdt_setprop_cell(fdt, offset, "i-cache-line-size",
529 env->icache_line_size)));
530
531 if (pcc->l1_dcache_size) {
532 _FDT((fdt_setprop_cell(fdt, offset, "d-cache-size",
533 pcc->l1_dcache_size)));
534 } else {
535 warn_report("Unknown L1 dcache size for cpu");
536 }
537 if (pcc->l1_icache_size) {
538 _FDT((fdt_setprop_cell(fdt, offset, "i-cache-size",
539 pcc->l1_icache_size)));
540 } else {
541 warn_report("Unknown L1 icache size for cpu");
542 }
543
544 _FDT((fdt_setprop_cell(fdt, offset, "timebase-frequency", tbfreq)));
545 _FDT((fdt_setprop_cell(fdt, offset, "clock-frequency", cpufreq)));
546 _FDT((fdt_setprop_cell(fdt, offset, "slb-size", env->slb_nr)));
547 _FDT((fdt_setprop_cell(fdt, offset, "ibm,slb-size", env->slb_nr)));
548 _FDT((fdt_setprop_string(fdt, offset, "status", "okay")));
549 _FDT((fdt_setprop(fdt, offset, "64-bit", NULL, 0)));
550
551 if (env->spr_cb[SPR_PURR].oea_read) {
552 _FDT((fdt_setprop(fdt, offset, "ibm,purr", NULL, 0)));
553 }
554
555 if (env->mmu_model & POWERPC_MMU_1TSEG) {
556 _FDT((fdt_setprop(fdt, offset, "ibm,processor-segment-sizes",
557 segs, sizeof(segs))));
558 }
559
560
561
562
563
564
565
566 if (spapr_get_cap(spapr, SPAPR_CAP_VSX) != 0) {
567 _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 2)));
568 } else {
569 _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 1)));
570 }
571
572
573
574
575 if (spapr_get_cap(spapr, SPAPR_CAP_DFP) != 0) {
576 _FDT((fdt_setprop_cell(fdt, offset, "ibm,dfp", 1)));
577 }
578
579 page_sizes_prop_size = ppc_create_page_sizes_prop(env, page_sizes_prop,
580 sizeof(page_sizes_prop));
581 if (page_sizes_prop_size) {
582 _FDT((fdt_setprop(fdt, offset, "ibm,segment-page-sizes",
583 page_sizes_prop, page_sizes_prop_size)));
584 }
585
586 spapr_populate_pa_features(spapr, cpu, fdt, offset, false);
587
588 _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id",
589 cs->cpu_index / vcpus_per_socket)));
590
591 _FDT((fdt_setprop(fdt, offset, "ibm,pft-size",
592 pft_size_prop, sizeof(pft_size_prop))));
593
594 if (nb_numa_nodes > 1) {
595 _FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cpu));
596 }
597
598 _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt));
599
600 if (pcc->radix_page_info) {
601 for (i = 0; i < pcc->radix_page_info->count; i++) {
602 radix_AP_encodings[i] =
603 cpu_to_be32(pcc->radix_page_info->entries[i]);
604 }
605 _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
606 radix_AP_encodings,
607 pcc->radix_page_info->count *
608 sizeof(radix_AP_encodings[0]))));
609 }
610}
611
612static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
613{
614 CPUState *cs;
615 int cpus_offset;
616 char *nodename;
617 int smt = kvmppc_smt_threads();
618
619 cpus_offset = fdt_add_subnode(fdt, 0, "cpus");
620 _FDT(cpus_offset);
621 _FDT((fdt_setprop_cell(fdt, cpus_offset, "#address-cells", 0x1)));
622 _FDT((fdt_setprop_cell(fdt, cpus_offset, "#size-cells", 0x0)));
623
624
625
626
627
628
629 CPU_FOREACH_REVERSE(cs) {
630 PowerPCCPU *cpu = POWERPC_CPU(cs);
631 int index = spapr_vcpu_id(cpu);
632 DeviceClass *dc = DEVICE_GET_CLASS(cs);
633 int offset;
634
635 if ((index % smt) != 0) {
636 continue;
637 }
638
639 nodename = g_strdup_printf("%s@%x", dc->fw_name, index);
640 offset = fdt_add_subnode(fdt, cpus_offset, nodename);
641 g_free(nodename);
642 _FDT(offset);
643 spapr_populate_cpu_dt(cs, fdt, offset, spapr);
644 }
645
646}
647
648
649
650
651
652
653static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
654{
655 MachineState *machine = MACHINE(spapr);
656 int ret, i, offset;
657 uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE;
658 uint32_t prop_lmb_size[] = {0, cpu_to_be32(lmb_size)};
659 uint32_t hotplug_lmb_start = spapr->hotplug_memory.base / lmb_size;
660 uint32_t nr_lmbs = (spapr->hotplug_memory.base +
661 memory_region_size(&spapr->hotplug_memory.mr)) /
662 lmb_size;
663 uint32_t *int_buf, *cur_index, buf_len;
664 int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1;
665
666
667
668
669 if (machine->ram_size == machine->maxram_size) {
670 return 0;
671 }
672
673
674
675
676
677 buf_len = MAX(nr_lmbs * SPAPR_DR_LMB_LIST_ENTRY_SIZE + 1, nr_nodes * 4 + 2)
678 * sizeof(uint32_t);
679 cur_index = int_buf = g_malloc0(buf_len);
680
681 offset = fdt_add_subnode(fdt, 0, "ibm,dynamic-reconfiguration-memory");
682
683 ret = fdt_setprop(fdt, offset, "ibm,lmb-size", prop_lmb_size,
684 sizeof(prop_lmb_size));
685 if (ret < 0) {
686 goto out;
687 }
688
689 ret = fdt_setprop_cell(fdt, offset, "ibm,memory-flags-mask", 0xff);
690 if (ret < 0) {
691 goto out;
692 }
693
694 ret = fdt_setprop_cell(fdt, offset, "ibm,memory-preservation-time", 0x0);
695 if (ret < 0) {
696 goto out;
697 }
698
699
700 int_buf[0] = cpu_to_be32(nr_lmbs);
701 cur_index++;
702 for (i = 0; i < nr_lmbs; i++) {
703 uint64_t addr = i * lmb_size;
704 uint32_t *dynamic_memory = cur_index;
705
706 if (i >= hotplug_lmb_start) {
707 sPAPRDRConnector *drc;
708
709 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, i);
710 g_assert(drc);
711
712 dynamic_memory[0] = cpu_to_be32(addr >> 32);
713 dynamic_memory[1] = cpu_to_be32(addr & 0xffffffff);
714 dynamic_memory[2] = cpu_to_be32(spapr_drc_index(drc));
715 dynamic_memory[3] = cpu_to_be32(0);
716 dynamic_memory[4] = cpu_to_be32(numa_get_node(addr, NULL));
717 if (memory_region_present(get_system_memory(), addr)) {
718 dynamic_memory[5] = cpu_to_be32(SPAPR_LMB_FLAGS_ASSIGNED);
719 } else {
720 dynamic_memory[5] = cpu_to_be32(0);
721 }
722 } else {
723
724
725
726
727
728 dynamic_memory[0] = cpu_to_be32(addr >> 32);
729 dynamic_memory[1] = cpu_to_be32(addr & 0xffffffff);
730 dynamic_memory[2] = cpu_to_be32(0);
731 dynamic_memory[3] = cpu_to_be32(0);
732 dynamic_memory[4] = cpu_to_be32(-1);
733 dynamic_memory[5] = cpu_to_be32(SPAPR_LMB_FLAGS_RESERVED |
734 SPAPR_LMB_FLAGS_DRC_INVALID);
735 }
736
737 cur_index += SPAPR_DR_LMB_LIST_ENTRY_SIZE;
738 }
739 ret = fdt_setprop(fdt, offset, "ibm,dynamic-memory", int_buf, buf_len);
740 if (ret < 0) {
741 goto out;
742 }
743
744
745 cur_index = int_buf;
746 int_buf[0] = cpu_to_be32(nr_nodes);
747 int_buf[1] = cpu_to_be32(4);
748 cur_index += 2;
749 for (i = 0; i < nr_nodes; i++) {
750 uint32_t associativity[] = {
751 cpu_to_be32(0x0),
752 cpu_to_be32(0x0),
753 cpu_to_be32(0x0),
754 cpu_to_be32(i)
755 };
756 memcpy(cur_index, associativity, sizeof(associativity));
757 cur_index += 4;
758 }
759 ret = fdt_setprop(fdt, offset, "ibm,associativity-lookup-arrays", int_buf,
760 (cur_index - int_buf) * sizeof(uint32_t));
761out:
762 g_free(int_buf);
763 return ret;
764}
765
766static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt,
767 sPAPROptionVector *ov5_updates)
768{
769 sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
770 int ret = 0, offset;
771
772
773 if (spapr_ovec_test(ov5_updates, OV5_DRCONF_MEMORY)) {
774 g_assert(smc->dr_lmb_enabled);
775 ret = spapr_populate_drconf_memory(spapr, fdt);
776 if (ret) {
777 goto out;
778 }
779 }
780
781 offset = fdt_path_offset(fdt, "/chosen");
782 if (offset < 0) {
783 offset = fdt_add_subnode(fdt, 0, "chosen");
784 if (offset < 0) {
785 return offset;
786 }
787 }
788 ret = spapr_ovec_populate_dt(fdt, offset, spapr->ov5_cas,
789 "ibm,architecture-vec-5");
790
791out:
792 return ret;
793}
794
795static bool spapr_hotplugged_dev_before_cas(void)
796{
797 Object *drc_container, *obj;
798 ObjectProperty *prop;
799 ObjectPropertyIterator iter;
800
801 drc_container = container_get(object_get_root(), "/dr-connector");
802 object_property_iter_init(&iter, drc_container);
803 while ((prop = object_property_iter_next(&iter))) {
804 if (!strstart(prop->type, "link<", NULL)) {
805 continue;
806 }
807 obj = object_property_get_link(drc_container, prop->name, NULL);
808 if (spapr_drc_needed(obj)) {
809 return true;
810 }
811 }
812 return false;
813}
814
815int spapr_h_cas_compose_response(sPAPRMachineState *spapr,
816 target_ulong addr, target_ulong size,
817 sPAPROptionVector *ov5_updates)
818{
819 void *fdt, *fdt_skel;
820 sPAPRDeviceTreeUpdateHeader hdr = { .version_id = 1 };
821
822 if (spapr_hotplugged_dev_before_cas()) {
823 return 1;
824 }
825
826 if (size < sizeof(hdr) || size > FW_MAX_SIZE) {
827 error_report("SLOF provided an unexpected CAS buffer size "
828 TARGET_FMT_lu " (min: %zu, max: %u)",
829 size, sizeof(hdr), FW_MAX_SIZE);
830 exit(EXIT_FAILURE);
831 }
832
833 size -= sizeof(hdr);
834
835
836 fdt_skel = g_malloc0(size);
837 _FDT((fdt_create(fdt_skel, size)));
838 _FDT((fdt_begin_node(fdt_skel, "")));
839 _FDT((fdt_end_node(fdt_skel)));
840 _FDT((fdt_finish(fdt_skel)));
841 fdt = g_malloc0(size);
842 _FDT((fdt_open_into(fdt_skel, fdt, size)));
843 g_free(fdt_skel);
844
845
846 _FDT((spapr_fixup_cpu_dt(fdt, spapr)));
847
848 if (spapr_dt_cas_updates(spapr, fdt, ov5_updates)) {
849 return -1;
850 }
851
852
853 _FDT((fdt_pack(fdt)));
854
855 if (fdt_totalsize(fdt) + sizeof(hdr) > size) {
856 trace_spapr_cas_failed(size);
857 return -1;
858 }
859
860 cpu_physical_memory_write(addr, &hdr, sizeof(hdr));
861 cpu_physical_memory_write(addr + sizeof(hdr), fdt, fdt_totalsize(fdt));
862 trace_spapr_cas_continue(fdt_totalsize(fdt) + sizeof(hdr));
863 g_free(fdt);
864
865 return 0;
866}
867
868static void spapr_dt_rtas(sPAPRMachineState *spapr, void *fdt)
869{
870 int rtas;
871 GString *hypertas = g_string_sized_new(256);
872 GString *qemu_hypertas = g_string_sized_new(256);
873 uint32_t refpoints[] = { cpu_to_be32(0x4), cpu_to_be32(0x4) };
874 uint64_t max_hotplug_addr = spapr->hotplug_memory.base +
875 memory_region_size(&spapr->hotplug_memory.mr);
876 uint32_t lrdr_capacity[] = {
877 cpu_to_be32(max_hotplug_addr >> 32),
878 cpu_to_be32(max_hotplug_addr & 0xffffffff),
879 0, cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE),
880 cpu_to_be32(max_cpus / smp_threads),
881 };
882
883 _FDT(rtas = fdt_add_subnode(fdt, 0, "rtas"));
884
885
886 add_str(hypertas, "hcall-pft");
887 add_str(hypertas, "hcall-term");
888 add_str(hypertas, "hcall-dabr");
889 add_str(hypertas, "hcall-interrupt");
890 add_str(hypertas, "hcall-tce");
891 add_str(hypertas, "hcall-vio");
892 add_str(hypertas, "hcall-splpar");
893 add_str(hypertas, "hcall-bulk");
894 add_str(hypertas, "hcall-set-mode");
895 add_str(hypertas, "hcall-sprg0");
896 add_str(hypertas, "hcall-copy");
897 add_str(hypertas, "hcall-debug");
898 add_str(qemu_hypertas, "hcall-memop1");
899
900 if (!kvm_enabled() || kvmppc_spapr_use_multitce()) {
901 add_str(hypertas, "hcall-multi-tce");
902 }
903
904 if (spapr->resize_hpt != SPAPR_RESIZE_HPT_DISABLED) {
905 add_str(hypertas, "hcall-hpt-resize");
906 }
907
908 _FDT(fdt_setprop(fdt, rtas, "ibm,hypertas-functions",
909 hypertas->str, hypertas->len));
910 g_string_free(hypertas, TRUE);
911 _FDT(fdt_setprop(fdt, rtas, "qemu,hypertas-functions",
912 qemu_hypertas->str, qemu_hypertas->len));
913 g_string_free(qemu_hypertas, TRUE);
914
915 _FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points",
916 refpoints, sizeof(refpoints)));
917
918 _FDT(fdt_setprop_cell(fdt, rtas, "rtas-error-log-max",
919 RTAS_ERROR_LOG_MAX));
920 _FDT(fdt_setprop_cell(fdt, rtas, "rtas-event-scan-rate",
921 RTAS_EVENT_SCAN_RATE));
922
923 if (msi_nonbroken) {
924 _FDT(fdt_setprop(fdt, rtas, "ibm,change-msix-capable", NULL, 0));
925 }
926
927
928
929
930
931
932
933
934 _FDT(fdt_setprop(fdt, rtas, "ibm,extended-os-term", NULL, 0));
935
936 _FDT(fdt_setprop(fdt, rtas, "ibm,lrdr-capacity",
937 lrdr_capacity, sizeof(lrdr_capacity)));
938
939 spapr_dt_rtas_tokens(fdt, rtas);
940}
941
942
943
944
945static void spapr_dt_ov5_platform_support(void *fdt, int chosen)
946{
947 PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
948
949 char val[2 * 4] = {
950 23, 0x00,
951 24, 0x00,
952 25, 0x00,
953 26, 0x40,
954 };
955
956 if (!ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0,
957 first_ppc_cpu->compat_pvr)) {
958
959 val[3] = 0x00;
960 } else if (kvm_enabled()) {
961 if (kvmppc_has_cap_mmu_radix() && kvmppc_has_cap_mmu_hash_v3()) {
962 val[3] = 0x80;
963 } else if (kvmppc_has_cap_mmu_radix()) {
964 val[3] = 0x40;
965 } else {
966 val[3] = 0x00;
967 }
968 } else {
969
970 val[3] = 0xC0;
971 }
972 _FDT(fdt_setprop(fdt, chosen, "ibm,arch-vec-5-platform-support",
973 val, sizeof(val)));
974}
975
976static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt)
977{
978 MachineState *machine = MACHINE(spapr);
979 int chosen;
980 const char *boot_device = machine->boot_order;
981 char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus);
982 size_t cb = 0;
983 char *bootlist = get_boot_devices_list(&cb, true);
984
985 _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
986
987 _FDT(fdt_setprop_string(fdt, chosen, "bootargs", machine->kernel_cmdline));
988 _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-start",
989 spapr->initrd_base));
990 _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-end",
991 spapr->initrd_base + spapr->initrd_size));
992
993 if (spapr->kernel_size) {
994 uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR),
995 cpu_to_be64(spapr->kernel_size) };
996
997 _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel",
998 &kprop, sizeof(kprop)));
999 if (spapr->kernel_le) {
1000 _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel-le", NULL, 0));
1001 }
1002 }
1003 if (boot_menu) {
1004 _FDT((fdt_setprop_cell(fdt, chosen, "qemu,boot-menu", boot_menu)));
1005 }
1006 _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-width", graphic_width));
1007 _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-height", graphic_height));
1008 _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-depth", graphic_depth));
1009
1010 if (cb && bootlist) {
1011 int i;
1012
1013 for (i = 0; i < cb; i++) {
1014 if (bootlist[i] == '\n') {
1015 bootlist[i] = ' ';
1016 }
1017 }
1018 _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-list", bootlist));
1019 }
1020
1021 if (boot_device && strlen(boot_device)) {
1022 _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-device", boot_device));
1023 }
1024
1025 if (!spapr->has_graphics && stdout_path) {
1026 _FDT(fdt_setprop_string(fdt, chosen, "linux,stdout-path", stdout_path));
1027 }
1028
1029 spapr_dt_ov5_platform_support(fdt, chosen);
1030
1031 g_free(stdout_path);
1032 g_free(bootlist);
1033}
1034
1035static void spapr_dt_hypervisor(sPAPRMachineState *spapr, void *fdt)
1036{
1037
1038
1039 int hypervisor;
1040 uint8_t hypercall[16];
1041
1042 _FDT(hypervisor = fdt_add_subnode(fdt, 0, "hypervisor"));
1043
1044 _FDT(fdt_setprop_string(fdt, hypervisor, "compatible", "linux,kvm"));
1045 if (kvmppc_has_cap_fixup_hcalls()) {
1046
1047
1048
1049
1050 if (!kvmppc_get_hypercall(first_cpu->env_ptr, hypercall,
1051 sizeof(hypercall))) {
1052 _FDT(fdt_setprop(fdt, hypervisor, "hcall-instructions",
1053 hypercall, sizeof(hypercall)));
1054 }
1055 }
1056}
1057
1058static void *spapr_build_fdt(sPAPRMachineState *spapr,
1059 hwaddr rtas_addr,
1060 hwaddr rtas_size)
1061{
1062 MachineState *machine = MACHINE(spapr);
1063 MachineClass *mc = MACHINE_GET_CLASS(machine);
1064 sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
1065 int ret;
1066 void *fdt;
1067 sPAPRPHBState *phb;
1068 char *buf;
1069
1070 fdt = g_malloc0(FDT_MAX_SIZE);
1071 _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE)));
1072
1073
1074 _FDT(fdt_setprop_string(fdt, 0, "device_type", "chrp"));
1075 _FDT(fdt_setprop_string(fdt, 0, "model", "IBM pSeries (emulated by qemu)"));
1076 _FDT(fdt_setprop_string(fdt, 0, "compatible", "qemu,pseries"));
1077
1078
1079
1080
1081
1082 if (kvmppc_get_host_model(&buf)) {
1083 _FDT(fdt_setprop_string(fdt, 0, "host-model", buf));
1084 g_free(buf);
1085 }
1086 if (kvmppc_get_host_serial(&buf)) {
1087 _FDT(fdt_setprop_string(fdt, 0, "host-serial", buf));
1088 g_free(buf);
1089 }
1090
1091 buf = qemu_uuid_unparse_strdup(&qemu_uuid);
1092
1093 _FDT(fdt_setprop_string(fdt, 0, "vm,uuid", buf));
1094 if (qemu_uuid_set) {
1095 _FDT(fdt_setprop_string(fdt, 0, "system-id", buf));
1096 }
1097 g_free(buf);
1098
1099 if (qemu_get_vm_name()) {
1100 _FDT(fdt_setprop_string(fdt, 0, "ibm,partition-name",
1101 qemu_get_vm_name()));
1102 }
1103
1104 _FDT(fdt_setprop_cell(fdt, 0, "#address-cells", 2));
1105 _FDT(fdt_setprop_cell(fdt, 0, "#size-cells", 2));
1106
1107
1108 spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP);
1109
1110 ret = spapr_populate_memory(spapr, fdt);
1111 if (ret < 0) {
1112 error_report("couldn't setup memory nodes in fdt");
1113 exit(1);
1114 }
1115
1116
1117 spapr_dt_vdevice(spapr->vio_bus, fdt);
1118
1119 if (object_resolve_path_type("", TYPE_SPAPR_RNG, NULL)) {
1120 ret = spapr_rng_populate_dt(fdt);
1121 if (ret < 0) {
1122 error_report("could not set up rng device in the fdt");
1123 exit(1);
1124 }
1125 }
1126
1127 QLIST_FOREACH(phb, &spapr->phbs, list) {
1128 ret = spapr_populate_pci_dt(phb, PHANDLE_XICP, fdt);
1129 if (ret < 0) {
1130 error_report("couldn't setup PCI devices in fdt");
1131 exit(1);
1132 }
1133 }
1134
1135
1136 spapr_populate_cpus_dt_node(fdt, spapr);
1137
1138 if (smc->dr_lmb_enabled) {
1139 _FDT(spapr_drc_populate_dt(fdt, 0, NULL, SPAPR_DR_CONNECTOR_TYPE_LMB));
1140 }
1141
1142 if (mc->has_hotpluggable_cpus) {
1143 int offset = fdt_path_offset(fdt, "/cpus");
1144 ret = spapr_drc_populate_dt(fdt, offset, NULL,
1145 SPAPR_DR_CONNECTOR_TYPE_CPU);
1146 if (ret < 0) {
1147 error_report("Couldn't set up CPU DR device tree properties");
1148 exit(1);
1149 }
1150 }
1151
1152
1153 spapr_dt_events(spapr, fdt);
1154
1155
1156 spapr_dt_rtas(spapr, fdt);
1157
1158
1159 spapr_dt_chosen(spapr, fdt);
1160
1161
1162 if (kvm_enabled()) {
1163 spapr_dt_hypervisor(spapr, fdt);
1164 }
1165
1166
1167 if (spapr->kernel_size) {
1168 _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, spapr->kernel_size)));
1169 }
1170 if (spapr->initrd_size) {
1171 _FDT((fdt_add_mem_rsv(fdt, spapr->initrd_base, spapr->initrd_size)));
1172 }
1173
1174
1175 ret = spapr_dt_cas_updates(spapr, fdt, spapr->ov5_cas);
1176 if (ret < 0) {
1177 error_report("couldn't setup CAS properties fdt");
1178 exit(1);
1179 }
1180
1181 return fdt;
1182}
1183
1184static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
1185{
1186 return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR;
1187}
1188
1189static void emulate_spapr_hypercall(PPCVirtualHypervisor *vhyp,
1190 PowerPCCPU *cpu)
1191{
1192 CPUPPCState *env = &cpu->env;
1193
1194
1195 g_assert(qemu_mutex_iothread_locked());
1196
1197 if (msr_pr) {
1198 hcall_dprintf("Hypercall made with MSR[PR]=1\n");
1199 env->gpr[3] = H_PRIVILEGE;
1200 } else {
1201 env->gpr[3] = spapr_hypercall(cpu, env->gpr[3], &env->gpr[4]);
1202 }
1203}
1204
1205static uint64_t spapr_get_patbe(PPCVirtualHypervisor *vhyp)
1206{
1207 sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
1208
1209 return spapr->patb_entry;
1210}
1211
1212#define HPTE(_table, _i) (void *)(((uint64_t *)(_table)) + ((_i) * 2))
1213#define HPTE_VALID(_hpte) (tswap64(*((uint64_t *)(_hpte))) & HPTE64_V_VALID)
1214#define HPTE_DIRTY(_hpte) (tswap64(*((uint64_t *)(_hpte))) & HPTE64_V_HPTE_DIRTY)
1215#define CLEAN_HPTE(_hpte) ((*(uint64_t *)(_hpte)) &= tswap64(~HPTE64_V_HPTE_DIRTY))
1216#define DIRTY_HPTE(_hpte) ((*(uint64_t *)(_hpte)) |= tswap64(HPTE64_V_HPTE_DIRTY))
1217
1218
1219
1220
1221static int get_htab_fd(sPAPRMachineState *spapr)
1222{
1223 Error *local_err = NULL;
1224
1225 if (spapr->htab_fd >= 0) {
1226 return spapr->htab_fd;
1227 }
1228
1229 spapr->htab_fd = kvmppc_get_htab_fd(false, 0, &local_err);
1230 if (spapr->htab_fd < 0) {
1231 error_report_err(local_err);
1232 }
1233
1234 return spapr->htab_fd;
1235}
1236
1237void close_htab_fd(sPAPRMachineState *spapr)
1238{
1239 if (spapr->htab_fd >= 0) {
1240 close(spapr->htab_fd);
1241 }
1242 spapr->htab_fd = -1;
1243}
1244
1245static hwaddr spapr_hpt_mask(PPCVirtualHypervisor *vhyp)
1246{
1247 sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
1248
1249 return HTAB_SIZE(spapr) / HASH_PTEG_SIZE_64 - 1;
1250}
1251
1252static target_ulong spapr_encode_hpt_for_kvm_pr(PPCVirtualHypervisor *vhyp)
1253{
1254 sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
1255
1256 assert(kvm_enabled());
1257
1258 if (!spapr->htab) {
1259 return 0;
1260 }
1261
1262 return (target_ulong)(uintptr_t)spapr->htab | (spapr->htab_shift - 18);
1263}
1264
1265static const ppc_hash_pte64_t *spapr_map_hptes(PPCVirtualHypervisor *vhyp,
1266 hwaddr ptex, int n)
1267{
1268 sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
1269 hwaddr pte_offset = ptex * HASH_PTE_SIZE_64;
1270
1271 if (!spapr->htab) {
1272
1273
1274
1275 ppc_hash_pte64_t *hptes = g_malloc(n * HASH_PTE_SIZE_64);
1276 kvmppc_read_hptes(hptes, ptex, n);
1277 return hptes;
1278 }
1279
1280
1281
1282
1283
1284 return (const ppc_hash_pte64_t *)(spapr->htab + pte_offset);
1285}
1286
1287static void spapr_unmap_hptes(PPCVirtualHypervisor *vhyp,
1288 const ppc_hash_pte64_t *hptes,
1289 hwaddr ptex, int n)
1290{
1291 sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
1292
1293 if (!spapr->htab) {
1294 g_free((void *)hptes);
1295 }
1296
1297
1298}
1299
1300static void spapr_store_hpte(PPCVirtualHypervisor *vhyp, hwaddr ptex,
1301 uint64_t pte0, uint64_t pte1)
1302{
1303 sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
1304 hwaddr offset = ptex * HASH_PTE_SIZE_64;
1305
1306 if (!spapr->htab) {
1307 kvmppc_write_hpte(ptex, pte0, pte1);
1308 } else {
1309 stq_p(spapr->htab + offset, pte0);
1310 stq_p(spapr->htab + offset + HASH_PTE_SIZE_64 / 2, pte1);
1311 }
1312}
1313
1314int spapr_hpt_shift_for_ramsize(uint64_t ramsize)
1315{
1316 int shift;
1317
1318
1319
1320
1321 shift = ctz64(pow2ceil(ramsize)) - 7;
1322 shift = MAX(shift, 18);
1323 shift = MIN(shift, 46);
1324 return shift;
1325}
1326
1327void spapr_free_hpt(sPAPRMachineState *spapr)
1328{
1329 g_free(spapr->htab);
1330 spapr->htab = NULL;
1331 spapr->htab_shift = 0;
1332 close_htab_fd(spapr);
1333}
1334
1335void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
1336 Error **errp)
1337{
1338 long rc;
1339
1340
1341 spapr_free_hpt(spapr);
1342
1343 rc = kvmppc_reset_htab(shift);
1344 if (rc < 0) {
1345
1346 error_setg_errno(errp, errno,
1347 "Failed to allocate KVM HPT of order %d (try smaller maxmem?)",
1348 shift);
1349
1350
1351 } else if (rc > 0) {
1352
1353 if (rc != shift) {
1354 error_setg(errp,
1355 "Requested order %d HPT, but kernel allocated order %ld (try smaller maxmem?)",
1356 shift, rc);
1357 }
1358
1359 spapr->htab_shift = shift;
1360 spapr->htab = NULL;
1361 } else {
1362
1363 size_t size = 1ULL << shift;
1364 int i;
1365
1366 spapr->htab = qemu_memalign(size, size);
1367 if (!spapr->htab) {
1368 error_setg_errno(errp, errno,
1369 "Could not allocate HPT of order %d", shift);
1370 return;
1371 }
1372
1373 memset(spapr->htab, 0, size);
1374 spapr->htab_shift = shift;
1375
1376 for (i = 0; i < size / HASH_PTE_SIZE_64; i++) {
1377 DIRTY_HPTE(HPTE(spapr->htab, i));
1378 }
1379 }
1380
1381 spapr->patb_entry = 0;
1382}
1383
1384void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr)
1385{
1386 int hpt_shift;
1387
1388 if ((spapr->resize_hpt == SPAPR_RESIZE_HPT_DISABLED)
1389 || (spapr->cas_reboot
1390 && !spapr_ovec_test(spapr->ov5_cas, OV5_HPT_RESIZE))) {
1391 hpt_shift = spapr_hpt_shift_for_ramsize(MACHINE(spapr)->maxram_size);
1392 } else {
1393 uint64_t current_ram_size;
1394
1395 current_ram_size = MACHINE(spapr)->ram_size + get_plugged_memory_size();
1396 hpt_shift = spapr_hpt_shift_for_ramsize(current_ram_size);
1397 }
1398 spapr_reallocate_hpt(spapr, hpt_shift, &error_fatal);
1399
1400 if (spapr->vrma_adjust) {
1401 spapr->rma_size = kvmppc_rma_size(spapr_node0_size(MACHINE(spapr)),
1402 spapr->htab_shift);
1403 }
1404}
1405
1406static void find_unknown_sysbus_device(SysBusDevice *sbdev, void *opaque)
1407{
1408 bool matched = false;
1409
1410 if (object_dynamic_cast(OBJECT(sbdev), TYPE_SPAPR_PCI_HOST_BRIDGE)) {
1411 matched = true;
1412 }
1413
1414 if (!matched) {
1415 error_report("Device %s is not supported by this machine yet.",
1416 qdev_fw_name(DEVICE(sbdev)));
1417 exit(1);
1418 }
1419}
1420
1421static int spapr_reset_drcs(Object *child, void *opaque)
1422{
1423 sPAPRDRConnector *drc =
1424 (sPAPRDRConnector *) object_dynamic_cast(child,
1425 TYPE_SPAPR_DR_CONNECTOR);
1426
1427 if (drc) {
1428 spapr_drc_reset(drc);
1429 }
1430
1431 return 0;
1432}
1433
1434static void ppc_spapr_reset(void)
1435{
1436 MachineState *machine = MACHINE(qdev_get_machine());
1437 sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
1438 PowerPCCPU *first_ppc_cpu;
1439 uint32_t rtas_limit;
1440 hwaddr rtas_addr, fdt_addr;
1441 void *fdt;
1442 int rc;
1443
1444
1445 foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL);
1446
1447 spapr_caps_reset(spapr);
1448
1449 first_ppc_cpu = POWERPC_CPU(first_cpu);
1450 if (kvm_enabled() && kvmppc_has_cap_mmu_radix() &&
1451 ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0,
1452 spapr->max_compat_pvr)) {
1453
1454
1455
1456 spapr->patb_entry = PATBE1_GR;
1457 } else {
1458 spapr_setup_hpt_and_vrma(spapr);
1459 }
1460
1461
1462
1463 if (!spapr->cas_reboot) {
1464 spapr_ovec_cleanup(spapr->ov5_cas);
1465 spapr->ov5_cas = spapr_ovec_new();
1466
1467 ppc_set_compat(first_ppc_cpu, spapr->max_compat_pvr, &error_fatal);
1468 }
1469
1470 qemu_devices_reset();
1471
1472
1473
1474
1475
1476
1477 object_child_foreach_recursive(object_get_root(), spapr_reset_drcs, NULL);
1478
1479 spapr_clear_pending_events(spapr);
1480
1481
1482
1483
1484
1485
1486 rtas_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR);
1487 rtas_addr = rtas_limit - RTAS_MAX_SIZE;
1488 fdt_addr = rtas_addr - FDT_MAX_SIZE;
1489
1490 fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size);
1491
1492 spapr_load_rtas(spapr, fdt, rtas_addr);
1493
1494 rc = fdt_pack(fdt);
1495
1496
1497 assert(rc == 0);
1498
1499 if (fdt_totalsize(fdt) > FDT_MAX_SIZE) {
1500 error_report("FDT too big ! 0x%x bytes (max is 0x%x)",
1501 fdt_totalsize(fdt), FDT_MAX_SIZE);
1502 exit(1);
1503 }
1504
1505
1506 qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt));
1507 cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt));
1508 g_free(fdt);
1509
1510
1511 first_ppc_cpu->env.gpr[3] = fdt_addr;
1512 first_ppc_cpu->env.gpr[5] = 0;
1513 first_cpu->halted = 0;
1514 first_ppc_cpu->env.nip = SPAPR_ENTRY_POINT;
1515
1516 spapr->cas_reboot = false;
1517}
1518
1519static void spapr_create_nvram(sPAPRMachineState *spapr)
1520{
1521 DeviceState *dev = qdev_create(&spapr->vio_bus->bus, "spapr-nvram");
1522 DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
1523
1524 if (dinfo) {
1525 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo),
1526 &error_fatal);
1527 }
1528
1529 qdev_init_nofail(dev);
1530
1531 spapr->nvram = (struct sPAPRNVRAM *)dev;
1532}
1533
1534static void spapr_rtc_create(sPAPRMachineState *spapr)
1535{
1536 object_initialize(&spapr->rtc, sizeof(spapr->rtc), TYPE_SPAPR_RTC);
1537 object_property_add_child(OBJECT(spapr), "rtc", OBJECT(&spapr->rtc),
1538 &error_fatal);
1539 object_property_set_bool(OBJECT(&spapr->rtc), true, "realized",
1540 &error_fatal);
1541 object_property_add_alias(OBJECT(spapr), "rtc-time", OBJECT(&spapr->rtc),
1542 "date", &error_fatal);
1543}
1544
1545
1546static bool spapr_vga_init(PCIBus *pci_bus, Error **errp)
1547{
1548 switch (vga_interface_type) {
1549 case VGA_NONE:
1550 return false;
1551 case VGA_DEVICE:
1552 return true;
1553 case VGA_STD:
1554 case VGA_VIRTIO:
1555 return pci_vga_init(pci_bus) != NULL;
1556 default:
1557 error_setg(errp,
1558 "Unsupported VGA mode, only -vga std or -vga virtio is supported");
1559 return false;
1560 }
1561}
1562
1563static int spapr_pre_load(void *opaque)
1564{
1565 int rc;
1566
1567 rc = spapr_caps_pre_load(opaque);
1568 if (rc) {
1569 return rc;
1570 }
1571
1572 return 0;
1573}
1574
1575static int spapr_post_load(void *opaque, int version_id)
1576{
1577 sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
1578 int err = 0;
1579
1580 err = spapr_caps_post_migration(spapr);
1581 if (err) {
1582 return err;
1583 }
1584
1585 if (!object_dynamic_cast(OBJECT(spapr->ics), TYPE_ICS_KVM)) {
1586 CPUState *cs;
1587 CPU_FOREACH(cs) {
1588 PowerPCCPU *cpu = POWERPC_CPU(cs);
1589 icp_resend(ICP(cpu->intc));
1590 }
1591 }
1592
1593
1594
1595
1596
1597 if (version_id < 3) {
1598 err = spapr_rtc_import_offset(&spapr->rtc, spapr->rtc_offset);
1599 }
1600
1601 if (kvm_enabled() && spapr->patb_entry) {
1602 PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
1603 bool radix = !!(spapr->patb_entry & PATBE1_GR);
1604 bool gtse = !!(cpu->env.spr[SPR_LPCR] & LPCR_GTSE);
1605
1606 err = kvmppc_configure_v3_mmu(cpu, radix, gtse, spapr->patb_entry);
1607 if (err) {
1608 error_report("Process table config unsupported by the host");
1609 return -EINVAL;
1610 }
1611 }
1612
1613 return err;
1614}
1615
1616static int spapr_pre_save(void *opaque)
1617{
1618 int rc;
1619
1620 rc = spapr_caps_pre_save(opaque);
1621 if (rc) {
1622 return rc;
1623 }
1624
1625 return 0;
1626}
1627
1628static bool version_before_3(void *opaque, int version_id)
1629{
1630 return version_id < 3;
1631}
1632
1633static bool spapr_pending_events_needed(void *opaque)
1634{
1635 sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
1636 return !QTAILQ_EMPTY(&spapr->pending_events);
1637}
1638
1639static const VMStateDescription vmstate_spapr_event_entry = {
1640 .name = "spapr_event_log_entry",
1641 .version_id = 1,
1642 .minimum_version_id = 1,
1643 .fields = (VMStateField[]) {
1644 VMSTATE_UINT32(summary, sPAPREventLogEntry),
1645 VMSTATE_UINT32(extended_length, sPAPREventLogEntry),
1646 VMSTATE_VBUFFER_ALLOC_UINT32(extended_log, sPAPREventLogEntry, 0,
1647 NULL, extended_length),
1648 VMSTATE_END_OF_LIST()
1649 },
1650};
1651
1652static const VMStateDescription vmstate_spapr_pending_events = {
1653 .name = "spapr_pending_events",
1654 .version_id = 1,
1655 .minimum_version_id = 1,
1656 .needed = spapr_pending_events_needed,
1657 .fields = (VMStateField[]) {
1658 VMSTATE_QTAILQ_V(pending_events, sPAPRMachineState, 1,
1659 vmstate_spapr_event_entry, sPAPREventLogEntry, next),
1660 VMSTATE_END_OF_LIST()
1661 },
1662};
1663
1664static bool spapr_ov5_cas_needed(void *opaque)
1665{
1666 sPAPRMachineState *spapr = opaque;
1667 sPAPROptionVector *ov5_mask = spapr_ovec_new();
1668 sPAPROptionVector *ov5_legacy = spapr_ovec_new();
1669 sPAPROptionVector *ov5_removed = spapr_ovec_new();
1670 bool cas_needed;
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696 spapr_ovec_set(ov5_mask, OV5_FORM1_AFFINITY);
1697 spapr_ovec_set(ov5_mask, OV5_DRCONF_MEMORY);
1698
1699
1700
1701
1702
1703
1704 spapr_ovec_intersect(ov5_legacy, spapr->ov5, ov5_mask);
1705 cas_needed = spapr_ovec_diff(ov5_removed, spapr->ov5, ov5_legacy);
1706
1707 spapr_ovec_cleanup(ov5_mask);
1708 spapr_ovec_cleanup(ov5_legacy);
1709 spapr_ovec_cleanup(ov5_removed);
1710
1711 return cas_needed;
1712}
1713
1714static const VMStateDescription vmstate_spapr_ov5_cas = {
1715 .name = "spapr_option_vector_ov5_cas",
1716 .version_id = 1,
1717 .minimum_version_id = 1,
1718 .needed = spapr_ov5_cas_needed,
1719 .fields = (VMStateField[]) {
1720 VMSTATE_STRUCT_POINTER_V(ov5_cas, sPAPRMachineState, 1,
1721 vmstate_spapr_ovec, sPAPROptionVector),
1722 VMSTATE_END_OF_LIST()
1723 },
1724};
1725
1726static bool spapr_patb_entry_needed(void *opaque)
1727{
1728 sPAPRMachineState *spapr = opaque;
1729
1730 return !!spapr->patb_entry;
1731}
1732
1733static const VMStateDescription vmstate_spapr_patb_entry = {
1734 .name = "spapr_patb_entry",
1735 .version_id = 1,
1736 .minimum_version_id = 1,
1737 .needed = spapr_patb_entry_needed,
1738 .fields = (VMStateField[]) {
1739 VMSTATE_UINT64(patb_entry, sPAPRMachineState),
1740 VMSTATE_END_OF_LIST()
1741 },
1742};
1743
1744static const VMStateDescription vmstate_spapr = {
1745 .name = "spapr",
1746 .version_id = 3,
1747 .minimum_version_id = 1,
1748 .pre_load = spapr_pre_load,
1749 .post_load = spapr_post_load,
1750 .pre_save = spapr_pre_save,
1751 .fields = (VMStateField[]) {
1752
1753 VMSTATE_UNUSED_BUFFER(version_before_3, 0, 4),
1754
1755
1756 VMSTATE_UINT64_TEST(rtc_offset, sPAPRMachineState, version_before_3),
1757
1758 VMSTATE_PPC_TIMEBASE_V(tb, sPAPRMachineState, 2),
1759 VMSTATE_END_OF_LIST()
1760 },
1761 .subsections = (const VMStateDescription*[]) {
1762 &vmstate_spapr_ov5_cas,
1763 &vmstate_spapr_patb_entry,
1764 &vmstate_spapr_pending_events,
1765 &vmstate_spapr_cap_htm,
1766 &vmstate_spapr_cap_vsx,
1767 &vmstate_spapr_cap_dfp,
1768 &vmstate_spapr_cap_cfpc,
1769 &vmstate_spapr_cap_sbbc,
1770 &vmstate_spapr_cap_ibs,
1771 NULL
1772 }
1773};
1774
1775static int htab_save_setup(QEMUFile *f, void *opaque)
1776{
1777 sPAPRMachineState *spapr = opaque;
1778
1779
1780 if (!spapr->htab_shift) {
1781 qemu_put_be32(f, -1);
1782 } else {
1783 qemu_put_be32(f, spapr->htab_shift);
1784 }
1785
1786 if (spapr->htab) {
1787 spapr->htab_save_index = 0;
1788 spapr->htab_first_pass = true;
1789 } else {
1790 if (spapr->htab_shift) {
1791 assert(kvm_enabled());
1792 }
1793 }
1794
1795
1796 return 0;
1797}
1798
1799static void htab_save_chunk(QEMUFile *f, sPAPRMachineState *spapr,
1800 int chunkstart, int n_valid, int n_invalid)
1801{
1802 qemu_put_be32(f, chunkstart);
1803 qemu_put_be16(f, n_valid);
1804 qemu_put_be16(f, n_invalid);
1805 qemu_put_buffer(f, HPTE(spapr->htab, chunkstart),
1806 HASH_PTE_SIZE_64 * n_valid);
1807}
1808
1809static void htab_save_end_marker(QEMUFile *f)
1810{
1811 qemu_put_be32(f, 0);
1812 qemu_put_be16(f, 0);
1813 qemu_put_be16(f, 0);
1814}
1815
1816static void htab_save_first_pass(QEMUFile *f, sPAPRMachineState *spapr,
1817 int64_t max_ns)
1818{
1819 bool has_timeout = max_ns != -1;
1820 int htabslots = HTAB_SIZE(spapr) / HASH_PTE_SIZE_64;
1821 int index = spapr->htab_save_index;
1822 int64_t starttime = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
1823
1824 assert(spapr->htab_first_pass);
1825
1826 do {
1827 int chunkstart;
1828
1829
1830 while ((index < htabslots)
1831 && !HPTE_VALID(HPTE(spapr->htab, index))) {
1832 CLEAN_HPTE(HPTE(spapr->htab, index));
1833 index++;
1834 }
1835
1836
1837 chunkstart = index;
1838 while ((index < htabslots) && (index - chunkstart < USHRT_MAX)
1839 && HPTE_VALID(HPTE(spapr->htab, index))) {
1840 CLEAN_HPTE(HPTE(spapr->htab, index));
1841 index++;
1842 }
1843
1844 if (index > chunkstart) {
1845 int n_valid = index - chunkstart;
1846
1847 htab_save_chunk(f, spapr, chunkstart, n_valid, 0);
1848
1849 if (has_timeout &&
1850 (qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - starttime) > max_ns) {
1851 break;
1852 }
1853 }
1854 } while ((index < htabslots) && !qemu_file_rate_limit(f));
1855
1856 if (index >= htabslots) {
1857 assert(index == htabslots);
1858 index = 0;
1859 spapr->htab_first_pass = false;
1860 }
1861 spapr->htab_save_index = index;
1862}
1863
1864static int htab_save_later_pass(QEMUFile *f, sPAPRMachineState *spapr,
1865 int64_t max_ns)
1866{
1867 bool final = max_ns < 0;
1868 int htabslots = HTAB_SIZE(spapr) / HASH_PTE_SIZE_64;
1869 int examined = 0, sent = 0;
1870 int index = spapr->htab_save_index;
1871 int64_t starttime = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
1872
1873 assert(!spapr->htab_first_pass);
1874
1875 do {
1876 int chunkstart, invalidstart;
1877
1878
1879 while ((index < htabslots)
1880 && !HPTE_DIRTY(HPTE(spapr->htab, index))) {
1881 index++;
1882 examined++;
1883 }
1884
1885 chunkstart = index;
1886
1887 while ((index < htabslots) && (index - chunkstart < USHRT_MAX)
1888 && HPTE_DIRTY(HPTE(spapr->htab, index))
1889 && HPTE_VALID(HPTE(spapr->htab, index))) {
1890 CLEAN_HPTE(HPTE(spapr->htab, index));
1891 index++;
1892 examined++;
1893 }
1894
1895 invalidstart = index;
1896
1897 while ((index < htabslots) && (index - invalidstart < USHRT_MAX)
1898 && HPTE_DIRTY(HPTE(spapr->htab, index))
1899 && !HPTE_VALID(HPTE(spapr->htab, index))) {
1900 CLEAN_HPTE(HPTE(spapr->htab, index));
1901 index++;
1902 examined++;
1903 }
1904
1905 if (index > chunkstart) {
1906 int n_valid = invalidstart - chunkstart;
1907 int n_invalid = index - invalidstart;
1908
1909 htab_save_chunk(f, spapr, chunkstart, n_valid, n_invalid);
1910 sent += index - chunkstart;
1911
1912 if (!final && (qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - starttime) > max_ns) {
1913 break;
1914 }
1915 }
1916
1917 if (examined >= htabslots) {
1918 break;
1919 }
1920
1921 if (index >= htabslots) {
1922 assert(index == htabslots);
1923 index = 0;
1924 }
1925 } while ((examined < htabslots) && (!qemu_file_rate_limit(f) || final));
1926
1927 if (index >= htabslots) {
1928 assert(index == htabslots);
1929 index = 0;
1930 }
1931
1932 spapr->htab_save_index = index;
1933
1934 return (examined >= htabslots) && (sent == 0) ? 1 : 0;
1935}
1936
1937#define MAX_ITERATION_NS 5000000
1938#define MAX_KVM_BUF_SIZE 2048
1939
1940static int htab_save_iterate(QEMUFile *f, void *opaque)
1941{
1942 sPAPRMachineState *spapr = opaque;
1943 int fd;
1944 int rc = 0;
1945
1946
1947 if (!spapr->htab_shift) {
1948 qemu_put_be32(f, -1);
1949 return 1;
1950 } else {
1951 qemu_put_be32(f, 0);
1952 }
1953
1954 if (!spapr->htab) {
1955 assert(kvm_enabled());
1956
1957 fd = get_htab_fd(spapr);
1958 if (fd < 0) {
1959 return fd;
1960 }
1961
1962 rc = kvmppc_save_htab(f, fd, MAX_KVM_BUF_SIZE, MAX_ITERATION_NS);
1963 if (rc < 0) {
1964 return rc;
1965 }
1966 } else if (spapr->htab_first_pass) {
1967 htab_save_first_pass(f, spapr, MAX_ITERATION_NS);
1968 } else {
1969 rc = htab_save_later_pass(f, spapr, MAX_ITERATION_NS);
1970 }
1971
1972 htab_save_end_marker(f);
1973
1974 return rc;
1975}
1976
1977static int htab_save_complete(QEMUFile *f, void *opaque)
1978{
1979 sPAPRMachineState *spapr = opaque;
1980 int fd;
1981
1982
1983 if (!spapr->htab_shift) {
1984 qemu_put_be32(f, -1);
1985 return 0;
1986 } else {
1987 qemu_put_be32(f, 0);
1988 }
1989
1990 if (!spapr->htab) {
1991 int rc;
1992
1993 assert(kvm_enabled());
1994
1995 fd = get_htab_fd(spapr);
1996 if (fd < 0) {
1997 return fd;
1998 }
1999
2000 rc = kvmppc_save_htab(f, fd, MAX_KVM_BUF_SIZE, -1);
2001 if (rc < 0) {
2002 return rc;
2003 }
2004 } else {
2005 if (spapr->htab_first_pass) {
2006 htab_save_first_pass(f, spapr, -1);
2007 }
2008 htab_save_later_pass(f, spapr, -1);
2009 }
2010
2011
2012 htab_save_end_marker(f);
2013
2014 return 0;
2015}
2016
2017static int htab_load(QEMUFile *f, void *opaque, int version_id)
2018{
2019 sPAPRMachineState *spapr = opaque;
2020 uint32_t section_hdr;
2021 int fd = -1;
2022 Error *local_err = NULL;
2023
2024 if (version_id < 1 || version_id > 1) {
2025 error_report("htab_load() bad version");
2026 return -EINVAL;
2027 }
2028
2029 section_hdr = qemu_get_be32(f);
2030
2031 if (section_hdr == -1) {
2032 spapr_free_hpt(spapr);
2033 return 0;
2034 }
2035
2036 if (section_hdr) {
2037
2038 spapr_reallocate_hpt(spapr, section_hdr, &local_err);
2039 if (local_err) {
2040 error_report_err(local_err);
2041 return -EINVAL;
2042 }
2043 return 0;
2044 }
2045
2046 if (!spapr->htab) {
2047 assert(kvm_enabled());
2048
2049 fd = kvmppc_get_htab_fd(true, 0, &local_err);
2050 if (fd < 0) {
2051 error_report_err(local_err);
2052 return fd;
2053 }
2054 }
2055
2056 while (true) {
2057 uint32_t index;
2058 uint16_t n_valid, n_invalid;
2059
2060 index = qemu_get_be32(f);
2061 n_valid = qemu_get_be16(f);
2062 n_invalid = qemu_get_be16(f);
2063
2064 if ((index == 0) && (n_valid == 0) && (n_invalid == 0)) {
2065
2066 break;
2067 }
2068
2069 if ((index + n_valid + n_invalid) >
2070 (HTAB_SIZE(spapr) / HASH_PTE_SIZE_64)) {
2071
2072 error_report(
2073 "htab_load() bad index %d (%hd+%hd entries) in htab stream (htab_shift=%d)",
2074 index, n_valid, n_invalid, spapr->htab_shift);
2075 return -EINVAL;
2076 }
2077
2078 if (spapr->htab) {
2079 if (n_valid) {
2080 qemu_get_buffer(f, HPTE(spapr->htab, index),
2081 HASH_PTE_SIZE_64 * n_valid);
2082 }
2083 if (n_invalid) {
2084 memset(HPTE(spapr->htab, index + n_valid), 0,
2085 HASH_PTE_SIZE_64 * n_invalid);
2086 }
2087 } else {
2088 int rc;
2089
2090 assert(fd >= 0);
2091
2092 rc = kvmppc_load_htab_chunk(f, fd, index, n_valid, n_invalid);
2093 if (rc < 0) {
2094 return rc;
2095 }
2096 }
2097 }
2098
2099 if (!spapr->htab) {
2100 assert(fd >= 0);
2101 close(fd);
2102 }
2103
2104 return 0;
2105}
2106
2107static void htab_save_cleanup(void *opaque)
2108{
2109 sPAPRMachineState *spapr = opaque;
2110
2111 close_htab_fd(spapr);
2112}
2113
2114static SaveVMHandlers savevm_htab_handlers = {
2115 .save_setup = htab_save_setup,
2116 .save_live_iterate = htab_save_iterate,
2117 .save_live_complete_precopy = htab_save_complete,
2118 .save_cleanup = htab_save_cleanup,
2119 .load_state = htab_load,
2120};
2121
2122static void spapr_boot_set(void *opaque, const char *boot_device,
2123 Error **errp)
2124{
2125 MachineState *machine = MACHINE(opaque);
2126 machine->boot_order = g_strdup(boot_device);
2127}
2128
2129static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr)
2130{
2131 MachineState *machine = MACHINE(spapr);
2132 uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE;
2133 uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size;
2134 int i;
2135
2136 for (i = 0; i < nr_lmbs; i++) {
2137 uint64_t addr;
2138
2139 addr = i * lmb_size + spapr->hotplug_memory.base;
2140 spapr_dr_connector_new(OBJECT(spapr), TYPE_SPAPR_DRC_LMB,
2141 addr / lmb_size);
2142 }
2143}
2144
2145
2146
2147
2148
2149
2150static void spapr_validate_node_memory(MachineState *machine, Error **errp)
2151{
2152 int i;
2153
2154 if (machine->ram_size % SPAPR_MEMORY_BLOCK_SIZE) {
2155 error_setg(errp, "Memory size 0x" RAM_ADDR_FMT
2156 " is not aligned to %llu MiB",
2157 machine->ram_size,
2158 SPAPR_MEMORY_BLOCK_SIZE / M_BYTE);
2159 return;
2160 }
2161
2162 if (machine->maxram_size % SPAPR_MEMORY_BLOCK_SIZE) {
2163 error_setg(errp, "Maximum memory size 0x" RAM_ADDR_FMT
2164 " is not aligned to %llu MiB",
2165 machine->ram_size,
2166 SPAPR_MEMORY_BLOCK_SIZE / M_BYTE);
2167 return;
2168 }
2169
2170 for (i = 0; i < nb_numa_nodes; i++) {
2171 if (numa_info[i].node_mem % SPAPR_MEMORY_BLOCK_SIZE) {
2172 error_setg(errp,
2173 "Node %d memory size 0x%" PRIx64
2174 " is not aligned to %llu MiB",
2175 i, numa_info[i].node_mem,
2176 SPAPR_MEMORY_BLOCK_SIZE / M_BYTE);
2177 return;
2178 }
2179 }
2180}
2181
2182
2183static CPUArchId *spapr_find_cpu_slot(MachineState *ms, uint32_t id, int *idx)
2184{
2185 int index = id / smp_threads;
2186
2187 if (index >= ms->possible_cpus->len) {
2188 return NULL;
2189 }
2190 if (idx) {
2191 *idx = index;
2192 }
2193 return &ms->possible_cpus->cpus[index];
2194}
2195
2196static void spapr_init_cpus(sPAPRMachineState *spapr)
2197{
2198 MachineState *machine = MACHINE(spapr);
2199 MachineClass *mc = MACHINE_GET_CLASS(machine);
2200 const char *type = spapr_get_cpu_core_type(machine->cpu_type);
2201 int smt = kvmppc_smt_threads();
2202 const CPUArchIdList *possible_cpus;
2203 int boot_cores_nr = smp_cpus / smp_threads;
2204 int i;
2205
2206 if (!type) {
2207 error_report("Unable to find sPAPR CPU Core definition");
2208 exit(1);
2209 }
2210
2211 possible_cpus = mc->possible_cpu_arch_ids(machine);
2212 if (mc->has_hotpluggable_cpus) {
2213 if (smp_cpus % smp_threads) {
2214 error_report("smp_cpus (%u) must be multiple of threads (%u)",
2215 smp_cpus, smp_threads);
2216 exit(1);
2217 }
2218 if (max_cpus % smp_threads) {
2219 error_report("max_cpus (%u) must be multiple of threads (%u)",
2220 max_cpus, smp_threads);
2221 exit(1);
2222 }
2223 } else {
2224 if (max_cpus != smp_cpus) {
2225 error_report("This machine version does not support CPU hotplug");
2226 exit(1);
2227 }
2228 boot_cores_nr = possible_cpus->len;
2229 }
2230
2231 for (i = 0; i < possible_cpus->len; i++) {
2232 int core_id = i * smp_threads;
2233
2234 if (mc->has_hotpluggable_cpus) {
2235 spapr_dr_connector_new(OBJECT(spapr), TYPE_SPAPR_DRC_CPU,
2236 (core_id / smp_threads) * smt);
2237 }
2238
2239 if (i < boot_cores_nr) {
2240 Object *core = object_new(type);
2241 int nr_threads = smp_threads;
2242
2243
2244 if ((i + 1) * smp_threads >= smp_cpus) {
2245 nr_threads = smp_cpus - i * smp_threads;
2246 }
2247
2248 object_property_set_int(core, nr_threads, "nr-threads",
2249 &error_fatal);
2250 object_property_set_int(core, core_id, CPU_CORE_PROP_CORE_ID,
2251 &error_fatal);
2252 object_property_set_bool(core, true, "realized", &error_fatal);
2253 }
2254 }
2255}
2256
2257static void spapr_set_vsmt_mode(sPAPRMachineState *spapr, Error **errp)
2258{
2259 Error *local_err = NULL;
2260 bool vsmt_user = !!spapr->vsmt;
2261 int kvm_smt = kvmppc_smt_threads();
2262 int ret;
2263
2264 if (!kvm_enabled() && (smp_threads > 1)) {
2265 error_setg(&local_err, "TCG cannot support more than 1 thread/core "
2266 "on a pseries machine");
2267 goto out;
2268 }
2269 if (!is_power_of_2(smp_threads)) {
2270 error_setg(&local_err, "Cannot support %d threads/core on a pseries "
2271 "machine because it must be a power of 2", smp_threads);
2272 goto out;
2273 }
2274
2275
2276 if (vsmt_user) {
2277 if (spapr->vsmt < smp_threads) {
2278 error_setg(&local_err, "Cannot support VSMT mode %d"
2279 " because it must be >= threads/core (%d)",
2280 spapr->vsmt, smp_threads);
2281 goto out;
2282 }
2283
2284 } else {
2285
2286
2287 spapr->vsmt = MAX(kvm_smt, smp_threads);
2288 }
2289
2290
2291 if (kvm_enabled() && (spapr->vsmt != kvm_smt)) {
2292 ret = kvmppc_set_smt_threads(spapr->vsmt);
2293 if (ret) {
2294 error_setg(&local_err,
2295 "Failed to set KVM's VSMT mode to %d (errno %d)",
2296 spapr->vsmt, ret);
2297 if (!vsmt_user) {
2298 error_append_hint(&local_err, "On PPC, a VM with %d threads/"
2299 "core on a host with %d threads/core requires "
2300 " the use of VSMT mode %d.\n",
2301 smp_threads, kvm_smt, spapr->vsmt);
2302 }
2303 kvmppc_hint_smt_possible(&local_err);
2304 goto out;
2305 }
2306 }
2307
2308out:
2309 error_propagate(errp, local_err);
2310}
2311
2312
2313static void ppc_spapr_init(MachineState *machine)
2314{
2315 sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
2316 sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
2317 const char *kernel_filename = machine->kernel_filename;
2318 const char *initrd_filename = machine->initrd_filename;
2319 PCIHostState *phb;
2320 int i;
2321 MemoryRegion *sysmem = get_system_memory();
2322 MemoryRegion *ram = g_new(MemoryRegion, 1);
2323 MemoryRegion *rma_region;
2324 void *rma = NULL;
2325 hwaddr rma_alloc_size;
2326 hwaddr node0_size = spapr_node0_size(machine);
2327 long load_limit, fw_size;
2328 char *filename;
2329 Error *resize_hpt_err = NULL;
2330
2331 msi_nonbroken = true;
2332
2333 QLIST_INIT(&spapr->phbs);
2334 QTAILQ_INIT(&spapr->pending_dimm_unplugs);
2335
2336
2337 kvmppc_check_papr_resize_hpt(&resize_hpt_err);
2338 if (spapr->resize_hpt == SPAPR_RESIZE_HPT_DEFAULT) {
2339
2340
2341
2342
2343
2344
2345 if (resize_hpt_err) {
2346 spapr->resize_hpt = SPAPR_RESIZE_HPT_DISABLED;
2347 error_free(resize_hpt_err);
2348 resize_hpt_err = NULL;
2349 } else {
2350 spapr->resize_hpt = smc->resize_hpt_default;
2351 }
2352 }
2353
2354 assert(spapr->resize_hpt != SPAPR_RESIZE_HPT_DEFAULT);
2355
2356 if ((spapr->resize_hpt != SPAPR_RESIZE_HPT_DISABLED) && resize_hpt_err) {
2357
2358
2359
2360 error_report_err(resize_hpt_err);
2361 exit(1);
2362 }
2363
2364
2365 rma_alloc_size = kvmppc_alloc_rma(&rma);
2366
2367 if (rma_alloc_size == -1) {
2368 error_report("Unable to create RMA");
2369 exit(1);
2370 }
2371
2372 if (rma_alloc_size && (rma_alloc_size < node0_size)) {
2373 spapr->rma_size = rma_alloc_size;
2374 } else {
2375 spapr->rma_size = node0_size;
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386 if (kvm_enabled()) {
2387 spapr->vrma_adjust = 1;
2388 spapr->rma_size = MIN(spapr->rma_size, 0x10000000);
2389 }
2390
2391
2392
2393
2394
2395
2396 spapr->rma_size = MIN(spapr->rma_size, 0x400000000ull);
2397 }
2398
2399 if (spapr->rma_size > node0_size) {
2400 error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")",
2401 spapr->rma_size);
2402 exit(1);
2403 }
2404
2405
2406 load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD;
2407
2408
2409 xics_system_init(machine, XICS_IRQS_SPAPR, &error_fatal);
2410
2411
2412
2413 spapr->ov5 = spapr_ovec_new();
2414 spapr->ov5_cas = spapr_ovec_new();
2415
2416 if (smc->dr_lmb_enabled) {
2417 spapr_ovec_set(spapr->ov5, OV5_DRCONF_MEMORY);
2418 spapr_validate_node_memory(machine, &error_fatal);
2419 }
2420
2421 spapr_ovec_set(spapr->ov5, OV5_FORM1_AFFINITY);
2422 if (!kvm_enabled() || kvmppc_has_cap_mmu_radix()) {
2423
2424 spapr_ovec_set(spapr->ov5, OV5_MMU_RADIX_GTSE);
2425 }
2426
2427
2428
2429 if (spapr->use_hotplug_event_source) {
2430 spapr_ovec_set(spapr->ov5, OV5_HP_EVT);
2431 }
2432
2433
2434 if (spapr->resize_hpt != SPAPR_RESIZE_HPT_DISABLED) {
2435 spapr_ovec_set(spapr->ov5, OV5_HPT_RESIZE);
2436 }
2437
2438
2439 spapr_set_vsmt_mode(spapr, &error_fatal);
2440
2441 spapr_init_cpus(spapr);
2442
2443 if (kvm_enabled()) {
2444
2445 kvmppc_enable_logical_ci_hcalls();
2446 kvmppc_enable_set_mode_hcall();
2447
2448
2449 kvmppc_enable_clear_ref_mod_hcalls();
2450 }
2451
2452
2453 memory_region_allocate_system_memory(ram, NULL, "ppc_spapr.ram",
2454 machine->ram_size);
2455 memory_region_add_subregion(sysmem, 0, ram);
2456
2457 if (rma_alloc_size && rma) {
2458 rma_region = g_new(MemoryRegion, 1);
2459 memory_region_init_ram_ptr(rma_region, NULL, "ppc_spapr.rma",
2460 rma_alloc_size, rma);
2461 vmstate_register_ram_global(rma_region);
2462 memory_region_add_subregion(sysmem, 0, rma_region);
2463 }
2464
2465
2466 if (machine->ram_size < machine->maxram_size) {
2467 ram_addr_t hotplug_mem_size = machine->maxram_size - machine->ram_size;
2468
2469
2470
2471
2472
2473 int max_memslots = kvm_enabled() ? kvm_get_max_memslots() / 2 :
2474 SPAPR_MAX_RAM_SLOTS;
2475
2476 if (max_memslots < SPAPR_MAX_RAM_SLOTS) {
2477 max_memslots = SPAPR_MAX_RAM_SLOTS;
2478 }
2479 if (machine->ram_slots > max_memslots) {
2480 error_report("Specified number of memory slots %"
2481 PRIu64" exceeds max supported %d",
2482 machine->ram_slots, max_memslots);
2483 exit(1);
2484 }
2485
2486 spapr->hotplug_memory.base = ROUND_UP(machine->ram_size,
2487 SPAPR_HOTPLUG_MEM_ALIGN);
2488 memory_region_init(&spapr->hotplug_memory.mr, OBJECT(spapr),
2489 "hotplug-memory", hotplug_mem_size);
2490 memory_region_add_subregion(sysmem, spapr->hotplug_memory.base,
2491 &spapr->hotplug_memory.mr);
2492 }
2493
2494 if (smc->dr_lmb_enabled) {
2495 spapr_create_lmb_dr_connectors(spapr);
2496 }
2497
2498 filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "spapr-rtas.bin");
2499 if (!filename) {
2500 error_report("Could not find LPAR rtas '%s'", "spapr-rtas.bin");
2501 exit(1);
2502 }
2503 spapr->rtas_size = get_image_size(filename);
2504 if (spapr->rtas_size < 0) {
2505 error_report("Could not get size of LPAR rtas '%s'", filename);
2506 exit(1);
2507 }
2508 spapr->rtas_blob = g_malloc(spapr->rtas_size);
2509 if (load_image_size(filename, spapr->rtas_blob, spapr->rtas_size) < 0) {
2510 error_report("Could not load LPAR rtas '%s'", filename);
2511 exit(1);
2512 }
2513 if (spapr->rtas_size > RTAS_MAX_SIZE) {
2514 error_report("RTAS too big ! 0x%zx bytes (max is 0x%x)",
2515 (size_t)spapr->rtas_size, RTAS_MAX_SIZE);
2516 exit(1);
2517 }
2518 g_free(filename);
2519
2520
2521 spapr_events_init(spapr);
2522
2523
2524 spapr_rtc_create(spapr);
2525
2526
2527 spapr->vio_bus = spapr_vio_bus_init();
2528
2529 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
2530 if (serial_hds[i]) {
2531 spapr_vty_create(spapr->vio_bus, serial_hds[i]);
2532 }
2533 }
2534
2535
2536 spapr_create_nvram(spapr);
2537
2538
2539 spapr_pci_rtas_init();
2540
2541 phb = spapr_create_phb(spapr, 0);
2542
2543 for (i = 0; i < nb_nics; i++) {
2544 NICInfo *nd = &nd_table[i];
2545
2546 if (!nd->model) {
2547 nd->model = g_strdup("ibmveth");
2548 }
2549
2550 if (strcmp(nd->model, "ibmveth") == 0) {
2551 spapr_vlan_create(spapr->vio_bus, nd);
2552 } else {
2553 pci_nic_init_nofail(&nd_table[i], phb->bus, nd->model, NULL);
2554 }
2555 }
2556
2557 for (i = 0; i <= drive_get_max_bus(IF_SCSI); i++) {
2558 spapr_vscsi_create(spapr->vio_bus);
2559 }
2560
2561
2562 if (spapr_vga_init(phb->bus, &error_fatal)) {
2563 spapr->has_graphics = true;
2564 machine->usb |= defaults_enabled() && !machine->usb_disabled;
2565 }
2566
2567 if (machine->usb) {
2568 if (smc->use_ohci_by_default) {
2569 pci_create_simple(phb->bus, -1, "pci-ohci");
2570 } else {
2571 pci_create_simple(phb->bus, -1, "nec-usb-xhci");
2572 }
2573
2574 if (spapr->has_graphics) {
2575 USBBus *usb_bus = usb_bus_find(-1);
2576
2577 usb_create_simple(usb_bus, "usb-kbd");
2578 usb_create_simple(usb_bus, "usb-mouse");
2579 }
2580 }
2581
2582 if (spapr->rma_size < (MIN_RMA_SLOF << 20)) {
2583 error_report(
2584 "pSeries SLOF firmware requires >= %ldM guest RMA (Real Mode Area memory)",
2585 MIN_RMA_SLOF);
2586 exit(1);
2587 }
2588
2589 if (kernel_filename) {
2590 uint64_t lowaddr = 0;
2591
2592 spapr->kernel_size = load_elf(kernel_filename, translate_kernel_address,
2593 NULL, NULL, &lowaddr, NULL, 1,
2594 PPC_ELF_MACHINE, 0, 0);
2595 if (spapr->kernel_size == ELF_LOAD_WRONG_ENDIAN) {
2596 spapr->kernel_size = load_elf(kernel_filename,
2597 translate_kernel_address, NULL, NULL,
2598 &lowaddr, NULL, 0, PPC_ELF_MACHINE,
2599 0, 0);
2600 spapr->kernel_le = spapr->kernel_size > 0;
2601 }
2602 if (spapr->kernel_size < 0) {
2603 error_report("error loading %s: %s", kernel_filename,
2604 load_elf_strerror(spapr->kernel_size));
2605 exit(1);
2606 }
2607
2608
2609 if (initrd_filename) {
2610
2611
2612
2613 spapr->initrd_base = (KERNEL_LOAD_ADDR + spapr->kernel_size
2614 + 0x1ffff) & ~0xffff;
2615 spapr->initrd_size = load_image_targphys(initrd_filename,
2616 spapr->initrd_base,
2617 load_limit
2618 - spapr->initrd_base);
2619 if (spapr->initrd_size < 0) {
2620 error_report("could not load initial ram disk '%s'",
2621 initrd_filename);
2622 exit(1);
2623 }
2624 }
2625 }
2626
2627 if (bios_name == NULL) {
2628 bios_name = FW_FILE_NAME;
2629 }
2630 filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
2631 if (!filename) {
2632 error_report("Could not find LPAR firmware '%s'", bios_name);
2633 exit(1);
2634 }
2635 fw_size = load_image_targphys(filename, 0, FW_MAX_SIZE);
2636 if (fw_size <= 0) {
2637 error_report("Could not load LPAR firmware '%s'", filename);
2638 exit(1);
2639 }
2640 g_free(filename);
2641
2642
2643
2644
2645 vmstate_register(NULL, 0, &vmstate_spapr, spapr);
2646 register_savevm_live(NULL, "spapr/htab", -1, 1,
2647 &savevm_htab_handlers, spapr);
2648
2649 qemu_register_boot_set(spapr_boot_set, spapr);
2650
2651 if (kvm_enabled()) {
2652
2653 qemu_add_vm_change_state_handler(cpu_ppc_clock_vm_state_change,
2654 &spapr->tb);
2655
2656 kvmppc_spapr_enable_inkernel_multitce();
2657 }
2658}
2659
2660static int spapr_kvm_type(const char *vm_type)
2661{
2662 if (!vm_type) {
2663 return 0;
2664 }
2665
2666 if (!strcmp(vm_type, "HV")) {
2667 return 1;
2668 }
2669
2670 if (!strcmp(vm_type, "PR")) {
2671 return 2;
2672 }
2673
2674 error_report("Unknown kvm-type specified '%s'", vm_type);
2675 exit(1);
2676}
2677
2678
2679
2680
2681
2682static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
2683 DeviceState *dev)
2684{
2685#define CAST(type, obj, name) \
2686 ((type *)object_dynamic_cast(OBJECT(obj), (name)))
2687 SCSIDevice *d = CAST(SCSIDevice, dev, TYPE_SCSI_DEVICE);
2688 sPAPRPHBState *phb = CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE);
2689 VHostSCSICommon *vsc = CAST(VHostSCSICommon, dev, TYPE_VHOST_SCSI_COMMON);
2690
2691 if (d) {
2692 void *spapr = CAST(void, bus->parent, "spapr-vscsi");
2693 VirtIOSCSI *virtio = CAST(VirtIOSCSI, bus->parent, TYPE_VIRTIO_SCSI);
2694 USBDevice *usb = CAST(USBDevice, bus->parent, TYPE_USB_DEVICE);
2695
2696 if (spapr) {
2697
2698
2699
2700
2701
2702 unsigned id = 0x8000 | (d->id << 8) | d->lun;
2703 return g_strdup_printf("%s@%"PRIX64, qdev_fw_name(dev),
2704 (uint64_t)id << 48);
2705 } else if (virtio) {
2706
2707
2708
2709
2710
2711
2712
2713 unsigned id = 0x1000000 | (d->id << 16) | d->lun;
2714 if (d->lun >= 256) {
2715
2716 id |= 0x4000;
2717 }
2718 return g_strdup_printf("%s@%"PRIX64, qdev_fw_name(dev),
2719 (uint64_t)id << 32);
2720 } else if (usb) {
2721
2722
2723
2724
2725 unsigned usb_port = atoi(usb->port->path);
2726 unsigned id = 0x1000000 | (usb_port << 16) | d->lun;
2727 return g_strdup_printf("%s@%"PRIX64, qdev_fw_name(dev),
2728 (uint64_t)id << 32);
2729 }
2730 }
2731
2732
2733
2734
2735
2736
2737
2738 if (strcmp("usb-host", qdev_fw_name(dev)) == 0) {
2739 USBDevice *usbdev = CAST(USBDevice, dev, TYPE_USB_DEVICE);
2740 if (usb_host_dev_is_scsi_storage(usbdev)) {
2741 return g_strdup_printf("storage@%s/disk", usbdev->port->path);
2742 }
2743 }
2744
2745 if (phb) {
2746
2747 return g_strdup_printf("pci@%"PRIX64, phb->buid);
2748 }
2749
2750 if (vsc) {
2751
2752 unsigned id = 0x1000000 | (vsc->target << 16) | vsc->lun;
2753 return g_strdup_printf("disk@%"PRIX64, (uint64_t)id << 32);
2754 }
2755
2756 if (g_str_equal("pci-bridge", qdev_fw_name(dev))) {
2757
2758 PCIDevice *pcidev = CAST(PCIDevice, dev, TYPE_PCI_DEVICE);
2759 return g_strdup_printf("pci@%x", PCI_SLOT(pcidev->devfn));
2760 }
2761
2762 return NULL;
2763}
2764
2765static char *spapr_get_kvm_type(Object *obj, Error **errp)
2766{
2767 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2768
2769 return g_strdup(spapr->kvm_type);
2770}
2771
2772static void spapr_set_kvm_type(Object *obj, const char *value, Error **errp)
2773{
2774 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2775
2776 g_free(spapr->kvm_type);
2777 spapr->kvm_type = g_strdup(value);
2778}
2779
2780static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp)
2781{
2782 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2783
2784 return spapr->use_hotplug_event_source;
2785}
2786
2787static void spapr_set_modern_hotplug_events(Object *obj, bool value,
2788 Error **errp)
2789{
2790 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2791
2792 spapr->use_hotplug_event_source = value;
2793}
2794
2795static char *spapr_get_resize_hpt(Object *obj, Error **errp)
2796{
2797 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2798
2799 switch (spapr->resize_hpt) {
2800 case SPAPR_RESIZE_HPT_DEFAULT:
2801 return g_strdup("default");
2802 case SPAPR_RESIZE_HPT_DISABLED:
2803 return g_strdup("disabled");
2804 case SPAPR_RESIZE_HPT_ENABLED:
2805 return g_strdup("enabled");
2806 case SPAPR_RESIZE_HPT_REQUIRED:
2807 return g_strdup("required");
2808 }
2809 g_assert_not_reached();
2810}
2811
2812static void spapr_set_resize_hpt(Object *obj, const char *value, Error **errp)
2813{
2814 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2815
2816 if (strcmp(value, "default") == 0) {
2817 spapr->resize_hpt = SPAPR_RESIZE_HPT_DEFAULT;
2818 } else if (strcmp(value, "disabled") == 0) {
2819 spapr->resize_hpt = SPAPR_RESIZE_HPT_DISABLED;
2820 } else if (strcmp(value, "enabled") == 0) {
2821 spapr->resize_hpt = SPAPR_RESIZE_HPT_ENABLED;
2822 } else if (strcmp(value, "required") == 0) {
2823 spapr->resize_hpt = SPAPR_RESIZE_HPT_REQUIRED;
2824 } else {
2825 error_setg(errp, "Bad value for \"resize-hpt\" property");
2826 }
2827}
2828
2829static void spapr_get_vsmt(Object *obj, Visitor *v, const char *name,
2830 void *opaque, Error **errp)
2831{
2832 visit_type_uint32(v, name, (uint32_t *)opaque, errp);
2833}
2834
2835static void spapr_set_vsmt(Object *obj, Visitor *v, const char *name,
2836 void *opaque, Error **errp)
2837{
2838 visit_type_uint32(v, name, (uint32_t *)opaque, errp);
2839}
2840
2841static void spapr_machine_initfn(Object *obj)
2842{
2843 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2844
2845 spapr->htab_fd = -1;
2846 spapr->use_hotplug_event_source = true;
2847 object_property_add_str(obj, "kvm-type",
2848 spapr_get_kvm_type, spapr_set_kvm_type, NULL);
2849 object_property_set_description(obj, "kvm-type",
2850 "Specifies the KVM virtualization mode (HV, PR)",
2851 NULL);
2852 object_property_add_bool(obj, "modern-hotplug-events",
2853 spapr_get_modern_hotplug_events,
2854 spapr_set_modern_hotplug_events,
2855 NULL);
2856 object_property_set_description(obj, "modern-hotplug-events",
2857 "Use dedicated hotplug event mechanism in"
2858 " place of standard EPOW events when possible"
2859 " (required for memory hot-unplug support)",
2860 NULL);
2861
2862 ppc_compat_add_property(obj, "max-cpu-compat", &spapr->max_compat_pvr,
2863 "Maximum permitted CPU compatibility mode",
2864 &error_fatal);
2865
2866 object_property_add_str(obj, "resize-hpt",
2867 spapr_get_resize_hpt, spapr_set_resize_hpt, NULL);
2868 object_property_set_description(obj, "resize-hpt",
2869 "Resizing of the Hash Page Table (enabled, disabled, required)",
2870 NULL);
2871 object_property_add(obj, "vsmt", "uint32", spapr_get_vsmt,
2872 spapr_set_vsmt, NULL, &spapr->vsmt, &error_abort);
2873 object_property_set_description(obj, "vsmt",
2874 "Virtual SMT: KVM behaves as if this were"
2875 " the host's SMT mode", &error_abort);
2876}
2877
2878static void spapr_machine_finalizefn(Object *obj)
2879{
2880 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
2881
2882 g_free(spapr->kvm_type);
2883}
2884
2885void spapr_do_system_reset_on_cpu(CPUState *cs, run_on_cpu_data arg)
2886{
2887 cpu_synchronize_state(cs);
2888 ppc_cpu_do_system_reset(cs);
2889}
2890
2891static void spapr_nmi(NMIState *n, int cpu_index, Error **errp)
2892{
2893 CPUState *cs;
2894
2895 CPU_FOREACH(cs) {
2896 async_run_on_cpu(cs, spapr_do_system_reset_on_cpu, RUN_ON_CPU_NULL);
2897 }
2898}
2899
2900static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
2901 uint32_t node, bool dedicated_hp_event_source,
2902 Error **errp)
2903{
2904 sPAPRDRConnector *drc;
2905 uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE;
2906 int i, fdt_offset, fdt_size;
2907 void *fdt;
2908 uint64_t addr = addr_start;
2909 bool hotplugged = spapr_drc_hotplugged(dev);
2910 Error *local_err = NULL;
2911
2912 for (i = 0; i < nr_lmbs; i++) {
2913 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
2914 addr / SPAPR_MEMORY_BLOCK_SIZE);
2915 g_assert(drc);
2916
2917 fdt = create_device_tree(&fdt_size);
2918 fdt_offset = spapr_populate_memory_node(fdt, node, addr,
2919 SPAPR_MEMORY_BLOCK_SIZE);
2920
2921 spapr_drc_attach(drc, dev, fdt, fdt_offset, &local_err);
2922 if (local_err) {
2923 while (addr > addr_start) {
2924 addr -= SPAPR_MEMORY_BLOCK_SIZE;
2925 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
2926 addr / SPAPR_MEMORY_BLOCK_SIZE);
2927 spapr_drc_detach(drc);
2928 }
2929 g_free(fdt);
2930 error_propagate(errp, local_err);
2931 return;
2932 }
2933 if (!hotplugged) {
2934 spapr_drc_reset(drc);
2935 }
2936 addr += SPAPR_MEMORY_BLOCK_SIZE;
2937 }
2938
2939
2940
2941 if (hotplugged) {
2942 if (dedicated_hp_event_source) {
2943 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
2944 addr_start / SPAPR_MEMORY_BLOCK_SIZE);
2945 spapr_hotplug_req_add_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB,
2946 nr_lmbs,
2947 spapr_drc_index(drc));
2948 } else {
2949 spapr_hotplug_req_add_by_count(SPAPR_DR_CONNECTOR_TYPE_LMB,
2950 nr_lmbs);
2951 }
2952 }
2953}
2954
2955static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
2956 uint32_t node, Error **errp)
2957{
2958 Error *local_err = NULL;
2959 sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
2960 PCDIMMDevice *dimm = PC_DIMM(dev);
2961 PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
2962 MemoryRegion *mr;
2963 uint64_t align, size, addr;
2964
2965 mr = ddc->get_memory_region(dimm, &local_err);
2966 if (local_err) {
2967 goto out;
2968 }
2969 align = memory_region_get_alignment(mr);
2970 size = memory_region_size(mr);
2971
2972 pc_dimm_memory_plug(dev, &ms->hotplug_memory, mr, align, &local_err);
2973 if (local_err) {
2974 goto out;
2975 }
2976
2977 addr = object_property_get_uint(OBJECT(dimm),
2978 PC_DIMM_ADDR_PROP, &local_err);
2979 if (local_err) {
2980 goto out_unplug;
2981 }
2982
2983 spapr_add_lmbs(dev, addr, size, node,
2984 spapr_ovec_test(ms->ov5_cas, OV5_HP_EVT),
2985 &local_err);
2986 if (local_err) {
2987 goto out_unplug;
2988 }
2989
2990 return;
2991
2992out_unplug:
2993 pc_dimm_memory_unplug(dev, &ms->hotplug_memory, mr);
2994out:
2995 error_propagate(errp, local_err);
2996}
2997
2998static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
2999 Error **errp)
3000{
3001 PCDIMMDevice *dimm = PC_DIMM(dev);
3002 PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
3003 MemoryRegion *mr;
3004 uint64_t size;
3005 char *mem_dev;
3006
3007 mr = ddc->get_memory_region(dimm, errp);
3008 if (!mr) {
3009 return;
3010 }
3011 size = memory_region_size(mr);
3012
3013 if (size % SPAPR_MEMORY_BLOCK_SIZE) {
3014 error_setg(errp, "Hotplugged memory size must be a multiple of "
3015 "%lld MB", SPAPR_MEMORY_BLOCK_SIZE / M_BYTE);
3016 return;
3017 }
3018
3019 mem_dev = object_property_get_str(OBJECT(dimm), PC_DIMM_MEMDEV_PROP, NULL);
3020 if (mem_dev && !kvmppc_is_mem_backend_page_size_ok(mem_dev)) {
3021 error_setg(errp, "Memory backend has bad page size. "
3022 "Use 'memory-backend-file' with correct mem-path.");
3023 goto out;
3024 }
3025
3026out:
3027 g_free(mem_dev);
3028}
3029
3030struct sPAPRDIMMState {
3031 PCDIMMDevice *dimm;
3032 uint32_t nr_lmbs;
3033 QTAILQ_ENTRY(sPAPRDIMMState) next;
3034};
3035
3036static sPAPRDIMMState *spapr_pending_dimm_unplugs_find(sPAPRMachineState *s,
3037 PCDIMMDevice *dimm)
3038{
3039 sPAPRDIMMState *dimm_state = NULL;
3040
3041 QTAILQ_FOREACH(dimm_state, &s->pending_dimm_unplugs, next) {
3042 if (dimm_state->dimm == dimm) {
3043 break;
3044 }
3045 }
3046 return dimm_state;
3047}
3048
3049static sPAPRDIMMState *spapr_pending_dimm_unplugs_add(sPAPRMachineState *spapr,
3050 uint32_t nr_lmbs,
3051 PCDIMMDevice *dimm)
3052{
3053 sPAPRDIMMState *ds = NULL;
3054
3055
3056
3057
3058
3059
3060
3061 ds = spapr_pending_dimm_unplugs_find(spapr, dimm);
3062 if (!ds) {
3063 ds = g_malloc0(sizeof(sPAPRDIMMState));
3064 ds->nr_lmbs = nr_lmbs;
3065 ds->dimm = dimm;
3066 QTAILQ_INSERT_HEAD(&spapr->pending_dimm_unplugs, ds, next);
3067 }
3068 return ds;
3069}
3070
3071static void spapr_pending_dimm_unplugs_remove(sPAPRMachineState *spapr,
3072 sPAPRDIMMState *dimm_state)
3073{
3074 QTAILQ_REMOVE(&spapr->pending_dimm_unplugs, dimm_state, next);
3075 g_free(dimm_state);
3076}
3077
3078static sPAPRDIMMState *spapr_recover_pending_dimm_state(sPAPRMachineState *ms,
3079 PCDIMMDevice *dimm)
3080{
3081 sPAPRDRConnector *drc;
3082 PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
3083 MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
3084 uint64_t size = memory_region_size(mr);
3085 uint32_t nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
3086 uint32_t avail_lmbs = 0;
3087 uint64_t addr_start, addr;
3088 int i;
3089
3090 addr_start = object_property_get_int(OBJECT(dimm), PC_DIMM_ADDR_PROP,
3091 &error_abort);
3092
3093 addr = addr_start;
3094 for (i = 0; i < nr_lmbs; i++) {
3095 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
3096 addr / SPAPR_MEMORY_BLOCK_SIZE);
3097 g_assert(drc);
3098 if (drc->dev) {
3099 avail_lmbs++;
3100 }
3101 addr += SPAPR_MEMORY_BLOCK_SIZE;
3102 }
3103
3104 return spapr_pending_dimm_unplugs_add(ms, avail_lmbs, dimm);
3105}
3106
3107
3108void spapr_lmb_release(DeviceState *dev)
3109{
3110 sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_hotplug_handler(dev));
3111 PCDIMMDevice *dimm = PC_DIMM(dev);
3112 PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
3113 MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
3114 sPAPRDIMMState *ds = spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(dev));
3115
3116
3117
3118 if (ds == NULL) {
3119 ds = spapr_recover_pending_dimm_state(spapr, PC_DIMM(dev));
3120 g_assert(ds);
3121
3122 g_assert(ds->nr_lmbs);
3123 }
3124
3125 if (--ds->nr_lmbs) {
3126 return;
3127 }
3128
3129
3130
3131
3132
3133 pc_dimm_memory_unplug(dev, &spapr->hotplug_memory, mr);
3134 object_unparent(OBJECT(dev));
3135 spapr_pending_dimm_unplugs_remove(spapr, ds);
3136}
3137
3138static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
3139 DeviceState *dev, Error **errp)
3140{
3141 sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
3142 Error *local_err = NULL;
3143 PCDIMMDevice *dimm = PC_DIMM(dev);
3144 PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
3145 MemoryRegion *mr;
3146 uint32_t nr_lmbs;
3147 uint64_t size, addr_start, addr;
3148 int i;
3149 sPAPRDRConnector *drc;
3150
3151 mr = ddc->get_memory_region(dimm, &local_err);
3152 if (local_err) {
3153 goto out;
3154 }
3155 size = memory_region_size(mr);
3156 nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
3157
3158 addr_start = object_property_get_uint(OBJECT(dimm), PC_DIMM_ADDR_PROP,
3159 &local_err);
3160 if (local_err) {
3161 goto out;
3162 }
3163
3164
3165
3166
3167
3168
3169
3170 if (spapr_pending_dimm_unplugs_find(spapr, dimm)) {
3171 error_setg(&local_err,
3172 "Memory unplug already in progress for device %s",
3173 dev->id);
3174 goto out;
3175 }
3176
3177 spapr_pending_dimm_unplugs_add(spapr, nr_lmbs, dimm);
3178
3179 addr = addr_start;
3180 for (i = 0; i < nr_lmbs; i++) {
3181 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
3182 addr / SPAPR_MEMORY_BLOCK_SIZE);
3183 g_assert(drc);
3184
3185 spapr_drc_detach(drc);
3186 addr += SPAPR_MEMORY_BLOCK_SIZE;
3187 }
3188
3189 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
3190 addr_start / SPAPR_MEMORY_BLOCK_SIZE);
3191 spapr_hotplug_req_remove_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB,
3192 nr_lmbs, spapr_drc_index(drc));
3193out:
3194 error_propagate(errp, local_err);
3195}
3196
3197static void *spapr_populate_hotplug_cpu_dt(CPUState *cs, int *fdt_offset,
3198 sPAPRMachineState *spapr)
3199{
3200 PowerPCCPU *cpu = POWERPC_CPU(cs);
3201 DeviceClass *dc = DEVICE_GET_CLASS(cs);
3202 int id = spapr_vcpu_id(cpu);
3203 void *fdt;
3204 int offset, fdt_size;
3205 char *nodename;
3206
3207 fdt = create_device_tree(&fdt_size);
3208 nodename = g_strdup_printf("%s@%x", dc->fw_name, id);
3209 offset = fdt_add_subnode(fdt, 0, nodename);
3210
3211 spapr_populate_cpu_dt(cs, fdt, offset, spapr);
3212 g_free(nodename);
3213
3214 *fdt_offset = offset;
3215 return fdt;
3216}
3217
3218
3219void spapr_core_release(DeviceState *dev)
3220{
3221 MachineState *ms = MACHINE(qdev_get_hotplug_handler(dev));
3222 sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(ms);
3223 CPUCore *cc = CPU_CORE(dev);
3224 CPUArchId *core_slot = spapr_find_cpu_slot(ms, cc->core_id, NULL);
3225
3226 if (smc->pre_2_10_has_unused_icps) {
3227 sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
3228 sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(cc));
3229 size_t size = object_type_get_instance_size(scc->cpu_type);
3230 int i;
3231
3232 for (i = 0; i < cc->nr_threads; i++) {
3233 CPUState *cs = CPU(sc->threads + i * size);
3234
3235 pre_2_10_vmstate_register_dummy_icp(cs->cpu_index);
3236 }
3237 }
3238
3239 assert(core_slot);
3240 core_slot->cpu = NULL;
3241 object_unparent(OBJECT(dev));
3242}
3243
3244static
3245void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
3246 Error **errp)
3247{
3248 int index;
3249 sPAPRDRConnector *drc;
3250 CPUCore *cc = CPU_CORE(dev);
3251 int smt = kvmppc_smt_threads();
3252
3253 if (!spapr_find_cpu_slot(MACHINE(hotplug_dev), cc->core_id, &index)) {
3254 error_setg(errp, "Unable to find CPU core with core-id: %d",
3255 cc->core_id);
3256 return;
3257 }
3258 if (index == 0) {
3259 error_setg(errp, "Boot CPU core may not be unplugged");
3260 return;
3261 }
3262
3263 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_CPU, index * smt);
3264 g_assert(drc);
3265
3266 spapr_drc_detach(drc);
3267
3268 spapr_hotplug_req_remove_by_index(drc);
3269}
3270
3271static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
3272 Error **errp)
3273{
3274 sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
3275 MachineClass *mc = MACHINE_GET_CLASS(spapr);
3276 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
3277 sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
3278 CPUCore *cc = CPU_CORE(dev);
3279 CPUState *cs = CPU(core->threads);
3280 sPAPRDRConnector *drc;
3281 Error *local_err = NULL;
3282 int smt = kvmppc_smt_threads();
3283 CPUArchId *core_slot;
3284 int index;
3285 bool hotplugged = spapr_drc_hotplugged(dev);
3286
3287 core_slot = spapr_find_cpu_slot(MACHINE(hotplug_dev), cc->core_id, &index);
3288 if (!core_slot) {
3289 error_setg(errp, "Unable to find CPU core with core-id: %d",
3290 cc->core_id);
3291 return;
3292 }
3293 drc = spapr_drc_by_id(TYPE_SPAPR_DRC_CPU, index * smt);
3294
3295 g_assert(drc || !mc->has_hotpluggable_cpus);
3296
3297 if (drc) {
3298 void *fdt;
3299 int fdt_offset;
3300
3301 fdt = spapr_populate_hotplug_cpu_dt(cs, &fdt_offset, spapr);
3302
3303 spapr_drc_attach(drc, dev, fdt, fdt_offset, &local_err);
3304 if (local_err) {
3305 g_free(fdt);
3306 error_propagate(errp, local_err);
3307 return;
3308 }
3309
3310 if (hotplugged) {
3311
3312
3313
3314
3315 spapr_hotplug_req_add_by_index(drc);
3316 } else {
3317 spapr_drc_reset(drc);
3318 }
3319 }
3320
3321 core_slot->cpu = OBJECT(dev);
3322
3323 if (smc->pre_2_10_has_unused_icps) {
3324 sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(cc));
3325 size_t size = object_type_get_instance_size(scc->cpu_type);
3326 int i;
3327
3328 for (i = 0; i < cc->nr_threads; i++) {
3329 sPAPRCPUCore *sc = SPAPR_CPU_CORE(dev);
3330 void *obj = sc->threads + i * size;
3331
3332 cs = CPU(obj);
3333 pre_2_10_vmstate_unregister_dummy_icp(cs->cpu_index);
3334 }
3335 }
3336}
3337
3338static void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
3339 Error **errp)
3340{
3341 MachineState *machine = MACHINE(OBJECT(hotplug_dev));
3342 MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
3343 Error *local_err = NULL;
3344 CPUCore *cc = CPU_CORE(dev);
3345 const char *base_core_type = spapr_get_cpu_core_type(machine->cpu_type);
3346 const char *type = object_get_typename(OBJECT(dev));
3347 CPUArchId *core_slot;
3348 int index;
3349
3350 if (dev->hotplugged && !mc->has_hotpluggable_cpus) {
3351 error_setg(&local_err, "CPU hotplug not supported for this machine");
3352 goto out;
3353 }
3354
3355 if (strcmp(base_core_type, type)) {
3356 error_setg(&local_err, "CPU core type should be %s", base_core_type);
3357 goto out;
3358 }
3359
3360 if (cc->core_id % smp_threads) {
3361 error_setg(&local_err, "invalid core id %d", cc->core_id);
3362 goto out;
3363 }
3364
3365
3366
3367
3368
3369
3370
3371 if (mc->has_hotpluggable_cpus && (cc->nr_threads != smp_threads)) {
3372 error_setg(&local_err, "invalid nr-threads %d, must be %d",
3373 cc->nr_threads, smp_threads);
3374 goto out;
3375 }
3376
3377 core_slot = spapr_find_cpu_slot(MACHINE(hotplug_dev), cc->core_id, &index);
3378 if (!core_slot) {
3379 error_setg(&local_err, "core id %d out of range", cc->core_id);
3380 goto out;
3381 }
3382
3383 if (core_slot->cpu) {
3384 error_setg(&local_err, "core %d already populated", cc->core_id);
3385 goto out;
3386 }
3387
3388 numa_cpu_pre_plug(core_slot, dev, &local_err);
3389
3390out:
3391 error_propagate(errp, local_err);
3392}
3393
3394static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
3395 DeviceState *dev, Error **errp)
3396{
3397 MachineState *ms = MACHINE(hotplug_dev);
3398 sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(ms);
3399
3400 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
3401 int node;
3402
3403 if (!smc->dr_lmb_enabled) {
3404 error_setg(errp, "Memory hotplug not supported for this machine");
3405 return;
3406 }
3407 node = object_property_get_uint(OBJECT(dev), PC_DIMM_NODE_PROP, errp);
3408 if (*errp) {
3409 return;
3410 }
3411 if (node < 0 || node >= MAX_NODES) {
3412 error_setg(errp, "Invaild node %d", node);
3413 return;
3414 }
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432 if (nb_numa_nodes && !numa_info[node].node_mem) {
3433 error_setg(errp, "Can't hotplug memory to memory-less node %d",
3434 node);
3435 return;
3436 }
3437
3438 spapr_memory_plug(hotplug_dev, dev, node, errp);
3439 } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
3440 spapr_core_plug(hotplug_dev, dev, errp);
3441 }
3442}
3443
3444static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
3445 DeviceState *dev, Error **errp)
3446{
3447 sPAPRMachineState *sms = SPAPR_MACHINE(OBJECT(hotplug_dev));
3448 MachineClass *mc = MACHINE_GET_CLASS(sms);
3449
3450 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
3451 if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
3452 spapr_memory_unplug_request(hotplug_dev, dev, errp);
3453 } else {
3454
3455
3456
3457
3458
3459
3460 error_setg(errp, "Memory hot unplug not supported for this guest");
3461 }
3462 } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
3463 if (!mc->has_hotpluggable_cpus) {
3464 error_setg(errp, "CPU hot unplug not supported on this machine");
3465 return;
3466 }
3467 spapr_core_unplug_request(hotplug_dev, dev, errp);
3468 }
3469}
3470
3471static void spapr_machine_device_pre_plug(HotplugHandler *hotplug_dev,
3472 DeviceState *dev, Error **errp)
3473{
3474 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
3475 spapr_memory_pre_plug(hotplug_dev, dev, errp);
3476 } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
3477 spapr_core_pre_plug(hotplug_dev, dev, errp);
3478 }
3479}
3480
3481static HotplugHandler *spapr_get_hotplug_handler(MachineState *machine,
3482 DeviceState *dev)
3483{
3484 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
3485 object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
3486 return HOTPLUG_HANDLER(machine);
3487 }
3488 return NULL;
3489}
3490
3491static CpuInstanceProperties
3492spapr_cpu_index_to_props(MachineState *machine, unsigned cpu_index)
3493{
3494 CPUArchId *core_slot;
3495 MachineClass *mc = MACHINE_GET_CLASS(machine);
3496
3497
3498 mc->possible_cpu_arch_ids(machine);
3499
3500 core_slot = spapr_find_cpu_slot(machine, cpu_index, NULL);
3501 assert(core_slot);
3502 return core_slot->props;
3503}
3504
3505static int64_t spapr_get_default_cpu_node_id(const MachineState *ms, int idx)
3506{
3507 return idx / smp_cores % nb_numa_nodes;
3508}
3509
3510static const CPUArchIdList *spapr_possible_cpu_arch_ids(MachineState *machine)
3511{
3512 int i;
3513 int spapr_max_cores = max_cpus / smp_threads;
3514 MachineClass *mc = MACHINE_GET_CLASS(machine);
3515
3516 if (!mc->has_hotpluggable_cpus) {
3517 spapr_max_cores = QEMU_ALIGN_UP(smp_cpus, smp_threads) / smp_threads;
3518 }
3519 if (machine->possible_cpus) {
3520 assert(machine->possible_cpus->len == spapr_max_cores);
3521 return machine->possible_cpus;
3522 }
3523
3524 machine->possible_cpus = g_malloc0(sizeof(CPUArchIdList) +
3525 sizeof(CPUArchId) * spapr_max_cores);
3526 machine->possible_cpus->len = spapr_max_cores;
3527 for (i = 0; i < machine->possible_cpus->len; i++) {
3528 int core_id = i * smp_threads;
3529
3530 machine->possible_cpus->cpus[i].vcpus_count = smp_threads;
3531 machine->possible_cpus->cpus[i].arch_id = core_id;
3532 machine->possible_cpus->cpus[i].props.has_core_id = true;
3533 machine->possible_cpus->cpus[i].props.core_id = core_id;
3534 }
3535 return machine->possible_cpus;
3536}
3537
3538static void spapr_phb_placement(sPAPRMachineState *spapr, uint32_t index,
3539 uint64_t *buid, hwaddr *pio,
3540 hwaddr *mmio32, hwaddr *mmio64,
3541 unsigned n_dma, uint32_t *liobns, Error **errp)
3542{
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558 const uint64_t base_buid = 0x800000020000000ULL;
3559#define SPAPR_MAX_PHBS ((SPAPR_PCI_LIMIT - SPAPR_PCI_BASE) / \
3560 SPAPR_PCI_MEM64_WIN_SIZE - 1)
3561 int i;
3562
3563
3564 QEMU_BUILD_BUG_ON((SPAPR_PCI_BASE % SPAPR_PCI_MEM64_WIN_SIZE) != 0);
3565 QEMU_BUILD_BUG_ON((SPAPR_PCI_LIMIT % SPAPR_PCI_MEM64_WIN_SIZE) != 0);
3566 QEMU_BUILD_BUG_ON((SPAPR_PCI_MEM64_WIN_SIZE % SPAPR_PCI_MEM32_WIN_SIZE) != 0);
3567 QEMU_BUILD_BUG_ON((SPAPR_PCI_MEM32_WIN_SIZE % SPAPR_PCI_IO_WIN_SIZE) != 0);
3568
3569 QEMU_BUILD_BUG_ON((SPAPR_MAX_PHBS * SPAPR_PCI_IO_WIN_SIZE) >
3570 SPAPR_PCI_MEM32_WIN_SIZE);
3571 QEMU_BUILD_BUG_ON((SPAPR_MAX_PHBS * SPAPR_PCI_MEM32_WIN_SIZE) >
3572 SPAPR_PCI_MEM64_WIN_SIZE);
3573
3574 if (index >= SPAPR_MAX_PHBS) {
3575 error_setg(errp, "\"index\" for PAPR PHB is too large (max %llu)",
3576 SPAPR_MAX_PHBS - 1);
3577 return;
3578 }
3579
3580 *buid = base_buid + index;
3581 for (i = 0; i < n_dma; ++i) {
3582 liobns[i] = SPAPR_PCI_LIOBN(index, i);
3583 }
3584
3585 *pio = SPAPR_PCI_BASE + index * SPAPR_PCI_IO_WIN_SIZE;
3586 *mmio32 = SPAPR_PCI_BASE + (index + 1) * SPAPR_PCI_MEM32_WIN_SIZE;
3587 *mmio64 = SPAPR_PCI_BASE + (index + 1) * SPAPR_PCI_MEM64_WIN_SIZE;
3588}
3589
3590static ICSState *spapr_ics_get(XICSFabric *dev, int irq)
3591{
3592 sPAPRMachineState *spapr = SPAPR_MACHINE(dev);
3593
3594 return ics_valid_irq(spapr->ics, irq) ? spapr->ics : NULL;
3595}
3596
3597static void spapr_ics_resend(XICSFabric *dev)
3598{
3599 sPAPRMachineState *spapr = SPAPR_MACHINE(dev);
3600
3601 ics_resend(spapr->ics);
3602}
3603
3604static ICPState *spapr_icp_get(XICSFabric *xi, int vcpu_id)
3605{
3606 PowerPCCPU *cpu = spapr_find_cpu(vcpu_id);
3607
3608 return cpu ? ICP(cpu->intc) : NULL;
3609}
3610
3611static void spapr_pic_print_info(InterruptStatsProvider *obj,
3612 Monitor *mon)
3613{
3614 sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
3615 CPUState *cs;
3616
3617 CPU_FOREACH(cs) {
3618 PowerPCCPU *cpu = POWERPC_CPU(cs);
3619
3620 icp_pic_print_info(ICP(cpu->intc), mon);
3621 }
3622
3623 ics_pic_print_info(spapr->ics, mon);
3624}
3625
3626int spapr_vcpu_id(PowerPCCPU *cpu)
3627{
3628 CPUState *cs = CPU(cpu);
3629
3630 if (kvm_enabled()) {
3631 return kvm_arch_vcpu_id(cs);
3632 } else {
3633 return cs->cpu_index;
3634 }
3635}
3636
3637PowerPCCPU *spapr_find_cpu(int vcpu_id)
3638{
3639 CPUState *cs;
3640
3641 CPU_FOREACH(cs) {
3642 PowerPCCPU *cpu = POWERPC_CPU(cs);
3643
3644 if (spapr_vcpu_id(cpu) == vcpu_id) {
3645 return cpu;
3646 }
3647 }
3648
3649 return NULL;
3650}
3651
3652static void spapr_machine_class_init(ObjectClass *oc, void *data)
3653{
3654 MachineClass *mc = MACHINE_CLASS(oc);
3655 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(oc);
3656 FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(oc);
3657 NMIClass *nc = NMI_CLASS(oc);
3658 HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
3659 PPCVirtualHypervisorClass *vhc = PPC_VIRTUAL_HYPERVISOR_CLASS(oc);
3660 XICSFabricClass *xic = XICS_FABRIC_CLASS(oc);
3661 InterruptStatsProviderClass *ispc = INTERRUPT_STATS_PROVIDER_CLASS(oc);
3662
3663 mc->desc = "pSeries Logical Partition (PAPR compliant)";
3664
3665
3666
3667
3668
3669
3670 mc->init = ppc_spapr_init;
3671 mc->reset = ppc_spapr_reset;
3672 mc->block_default_type = IF_SCSI;
3673 mc->max_cpus = 1024;
3674 mc->no_parallel = 1;
3675 mc->default_boot_order = "";
3676 mc->default_ram_size = 512 * M_BYTE;
3677 mc->kvm_type = spapr_kvm_type;
3678 mc->has_dynamic_sysbus = true;
3679 mc->pci_allow_0_address = true;
3680 mc->get_hotplug_handler = spapr_get_hotplug_handler;
3681 hc->pre_plug = spapr_machine_device_pre_plug;
3682 hc->plug = spapr_machine_device_plug;
3683 mc->cpu_index_to_instance_props = spapr_cpu_index_to_props;
3684 mc->get_default_cpu_node_id = spapr_get_default_cpu_node_id;
3685 mc->possible_cpu_arch_ids = spapr_possible_cpu_arch_ids;
3686 hc->unplug_request = spapr_machine_device_unplug_request;
3687
3688 smc->dr_lmb_enabled = true;
3689 mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
3690 mc->has_hotpluggable_cpus = true;
3691 smc->resize_hpt_default = SPAPR_RESIZE_HPT_ENABLED;
3692 fwc->get_dev_path = spapr_get_fw_dev_path;
3693 nc->nmi_monitor_handler = spapr_nmi;
3694 smc->phb_placement = spapr_phb_placement;
3695 vhc->hypercall = emulate_spapr_hypercall;
3696 vhc->hpt_mask = spapr_hpt_mask;
3697 vhc->map_hptes = spapr_map_hptes;
3698 vhc->unmap_hptes = spapr_unmap_hptes;
3699 vhc->store_hpte = spapr_store_hpte;
3700 vhc->get_patbe = spapr_get_patbe;
3701 vhc->encode_hpt_for_kvm_pr = spapr_encode_hpt_for_kvm_pr;
3702 xic->ics_get = spapr_ics_get;
3703 xic->ics_resend = spapr_ics_resend;
3704 xic->icp_get = spapr_icp_get;
3705 ispc->print_info = spapr_pic_print_info;
3706
3707
3708
3709
3710 mc->numa_mem_align_shift = 28;
3711
3712 smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
3713 smc->default_caps.caps[SPAPR_CAP_VSX] = SPAPR_CAP_ON;
3714 smc->default_caps.caps[SPAPR_CAP_DFP] = SPAPR_CAP_ON;
3715 smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN;
3716 smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN;
3717 smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN;
3718 spapr_caps_add_properties(smc, &error_abort);
3719}
3720
3721static const TypeInfo spapr_machine_info = {
3722 .name = TYPE_SPAPR_MACHINE,
3723 .parent = TYPE_MACHINE,
3724 .abstract = true,
3725 .instance_size = sizeof(sPAPRMachineState),
3726 .instance_init = spapr_machine_initfn,
3727 .instance_finalize = spapr_machine_finalizefn,
3728 .class_size = sizeof(sPAPRMachineClass),
3729 .class_init = spapr_machine_class_init,
3730 .interfaces = (InterfaceInfo[]) {
3731 { TYPE_FW_PATH_PROVIDER },
3732 { TYPE_NMI },
3733 { TYPE_HOTPLUG_HANDLER },
3734 { TYPE_PPC_VIRTUAL_HYPERVISOR },
3735 { TYPE_XICS_FABRIC },
3736 { TYPE_INTERRUPT_STATS_PROVIDER },
3737 { }
3738 },
3739};
3740
3741#define DEFINE_SPAPR_MACHINE(suffix, verstr, latest) \
3742 static void spapr_machine_##suffix##_class_init(ObjectClass *oc, \
3743 void *data) \
3744 { \
3745 MachineClass *mc = MACHINE_CLASS(oc); \
3746 spapr_machine_##suffix##_class_options(mc); \
3747 if (latest) { \
3748 mc->alias = "pseries"; \
3749 mc->is_default = 1; \
3750 } \
3751 } \
3752 static void spapr_machine_##suffix##_instance_init(Object *obj) \
3753 { \
3754 MachineState *machine = MACHINE(obj); \
3755 spapr_machine_##suffix##_instance_options(machine); \
3756 } \
3757 static const TypeInfo spapr_machine_##suffix##_info = { \
3758 .name = MACHINE_TYPE_NAME("pseries-" verstr), \
3759 .parent = TYPE_SPAPR_MACHINE, \
3760 .class_init = spapr_machine_##suffix##_class_init, \
3761 .instance_init = spapr_machine_##suffix##_instance_init, \
3762 }; \
3763 static void spapr_machine_register_##suffix(void) \
3764 { \
3765 type_register(&spapr_machine_##suffix##_info); \
3766 } \
3767 type_init(spapr_machine_register_##suffix)
3768
3769
3770
3771
3772static void spapr_machine_2_12_instance_options(MachineState *machine)
3773{
3774}
3775
3776static void spapr_machine_2_12_class_options(MachineClass *mc)
3777{
3778
3779}
3780
3781DEFINE_SPAPR_MACHINE(2_12, "2.12", true);
3782
3783
3784
3785
3786#define SPAPR_COMPAT_2_11 \
3787 HW_COMPAT_2_11
3788
3789static void spapr_machine_2_11_instance_options(MachineState *machine)
3790{
3791 spapr_machine_2_12_instance_options(machine);
3792}
3793
3794static void spapr_machine_2_11_class_options(MachineClass *mc)
3795{
3796 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
3797
3798 spapr_machine_2_12_class_options(mc);
3799 smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_ON;
3800 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_11);
3801}
3802
3803DEFINE_SPAPR_MACHINE(2_11, "2.11", false);
3804
3805
3806
3807
3808#define SPAPR_COMPAT_2_10 \
3809 HW_COMPAT_2_10
3810
3811static void spapr_machine_2_10_instance_options(MachineState *machine)
3812{
3813 spapr_machine_2_11_instance_options(machine);
3814}
3815
3816static void spapr_machine_2_10_class_options(MachineClass *mc)
3817{
3818 spapr_machine_2_11_class_options(mc);
3819 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_10);
3820}
3821
3822DEFINE_SPAPR_MACHINE(2_10, "2.10", false);
3823
3824
3825
3826
3827#define SPAPR_COMPAT_2_9 \
3828 HW_COMPAT_2_9 \
3829 { \
3830 .driver = TYPE_POWERPC_CPU, \
3831 .property = "pre-2.10-migration", \
3832 .value = "on", \
3833 }, \
3834
3835static void spapr_machine_2_9_instance_options(MachineState *machine)
3836{
3837 spapr_machine_2_10_instance_options(machine);
3838}
3839
3840static void spapr_machine_2_9_class_options(MachineClass *mc)
3841{
3842 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
3843
3844 spapr_machine_2_10_class_options(mc);
3845 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_9);
3846 mc->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
3847 smc->pre_2_10_has_unused_icps = true;
3848 smc->resize_hpt_default = SPAPR_RESIZE_HPT_DISABLED;
3849}
3850
3851DEFINE_SPAPR_MACHINE(2_9, "2.9", false);
3852
3853
3854
3855
3856#define SPAPR_COMPAT_2_8 \
3857 HW_COMPAT_2_8 \
3858 { \
3859 .driver = TYPE_SPAPR_PCI_HOST_BRIDGE, \
3860 .property = "pcie-extended-configuration-space", \
3861 .value = "off", \
3862 },
3863
3864static void spapr_machine_2_8_instance_options(MachineState *machine)
3865{
3866 spapr_machine_2_9_instance_options(machine);
3867}
3868
3869static void spapr_machine_2_8_class_options(MachineClass *mc)
3870{
3871 spapr_machine_2_9_class_options(mc);
3872 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_8);
3873 mc->numa_mem_align_shift = 23;
3874}
3875
3876DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
3877
3878
3879
3880
3881#define SPAPR_COMPAT_2_7 \
3882 HW_COMPAT_2_7 \
3883 { \
3884 .driver = TYPE_SPAPR_PCI_HOST_BRIDGE, \
3885 .property = "mem_win_size", \
3886 .value = stringify(SPAPR_PCI_2_7_MMIO_WIN_SIZE),\
3887 }, \
3888 { \
3889 .driver = TYPE_SPAPR_PCI_HOST_BRIDGE, \
3890 .property = "mem64_win_size", \
3891 .value = "0", \
3892 }, \
3893 { \
3894 .driver = TYPE_POWERPC_CPU, \
3895 .property = "pre-2.8-migration", \
3896 .value = "on", \
3897 }, \
3898 { \
3899 .driver = TYPE_SPAPR_PCI_HOST_BRIDGE, \
3900 .property = "pre-2.8-migration", \
3901 .value = "on", \
3902 },
3903
3904static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index,
3905 uint64_t *buid, hwaddr *pio,
3906 hwaddr *mmio32, hwaddr *mmio64,
3907 unsigned n_dma, uint32_t *liobns, Error **errp)
3908{
3909
3910 const uint64_t base_buid = 0x800000020000000ULL;
3911 const hwaddr phb_spacing = 0x1000000000ULL;
3912 const hwaddr mmio_offset = 0xa0000000;
3913 const hwaddr pio_offset = 0x80000000;
3914 const uint32_t max_index = 255;
3915 const hwaddr phb0_alignment = 0x10000000000ULL;
3916
3917 uint64_t ram_top = MACHINE(spapr)->ram_size;
3918 hwaddr phb0_base, phb_base;
3919 int i;
3920
3921
3922 if (MACHINE(spapr)->maxram_size > ram_top) {
3923
3924
3925
3926 ram_top = spapr->hotplug_memory.base +
3927 memory_region_size(&spapr->hotplug_memory.mr);
3928 }
3929
3930 phb0_base = QEMU_ALIGN_UP(ram_top, phb0_alignment);
3931
3932 if (index > max_index) {
3933 error_setg(errp, "\"index\" for PAPR PHB is too large (max %u)",
3934 max_index);
3935 return;
3936 }
3937
3938 *buid = base_buid + index;
3939 for (i = 0; i < n_dma; ++i) {
3940 liobns[i] = SPAPR_PCI_LIOBN(index, i);
3941 }
3942
3943 phb_base = phb0_base + index * phb_spacing;
3944 *pio = phb_base + pio_offset;
3945 *mmio32 = phb_base + mmio_offset;
3946
3947
3948
3949
3950
3951}
3952
3953static void spapr_machine_2_7_instance_options(MachineState *machine)
3954{
3955 sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
3956
3957 spapr_machine_2_8_instance_options(machine);
3958 spapr->use_hotplug_event_source = false;
3959}
3960
3961static void spapr_machine_2_7_class_options(MachineClass *mc)
3962{
3963 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
3964
3965 spapr_machine_2_8_class_options(mc);
3966 mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power7_v2.3");
3967 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_7);
3968 smc->phb_placement = phb_placement_2_7;
3969}
3970
3971DEFINE_SPAPR_MACHINE(2_7, "2.7", false);
3972
3973
3974
3975
3976#define SPAPR_COMPAT_2_6 \
3977 HW_COMPAT_2_6 \
3978 { \
3979 .driver = TYPE_SPAPR_PCI_HOST_BRIDGE,\
3980 .property = "ddw",\
3981 .value = stringify(off),\
3982 },
3983
3984static void spapr_machine_2_6_instance_options(MachineState *machine)
3985{
3986 spapr_machine_2_7_instance_options(machine);
3987}
3988
3989static void spapr_machine_2_6_class_options(MachineClass *mc)
3990{
3991 spapr_machine_2_7_class_options(mc);
3992 mc->has_hotpluggable_cpus = false;
3993 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_6);
3994}
3995
3996DEFINE_SPAPR_MACHINE(2_6, "2.6", false);
3997
3998
3999
4000
4001#define SPAPR_COMPAT_2_5 \
4002 HW_COMPAT_2_5 \
4003 { \
4004 .driver = "spapr-vlan", \
4005 .property = "use-rx-buffer-pools", \
4006 .value = "off", \
4007 },
4008
4009static void spapr_machine_2_5_instance_options(MachineState *machine)
4010{
4011 spapr_machine_2_6_instance_options(machine);
4012}
4013
4014static void spapr_machine_2_5_class_options(MachineClass *mc)
4015{
4016 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
4017
4018 spapr_machine_2_6_class_options(mc);
4019 smc->use_ohci_by_default = true;
4020 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_5);
4021}
4022
4023DEFINE_SPAPR_MACHINE(2_5, "2.5", false);
4024
4025
4026
4027
4028#define SPAPR_COMPAT_2_4 \
4029 HW_COMPAT_2_4
4030
4031static void spapr_machine_2_4_instance_options(MachineState *machine)
4032{
4033 spapr_machine_2_5_instance_options(machine);
4034}
4035
4036static void spapr_machine_2_4_class_options(MachineClass *mc)
4037{
4038 sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
4039
4040 spapr_machine_2_5_class_options(mc);
4041 smc->dr_lmb_enabled = false;
4042 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_4);
4043}
4044
4045DEFINE_SPAPR_MACHINE(2_4, "2.4", false);
4046
4047
4048
4049
4050#define SPAPR_COMPAT_2_3 \
4051 HW_COMPAT_2_3 \
4052 {\
4053 .driver = "spapr-pci-host-bridge",\
4054 .property = "dynamic-reconfiguration",\
4055 .value = "off",\
4056 },
4057
4058static void spapr_machine_2_3_instance_options(MachineState *machine)
4059{
4060 spapr_machine_2_4_instance_options(machine);
4061}
4062
4063static void spapr_machine_2_3_class_options(MachineClass *mc)
4064{
4065 spapr_machine_2_4_class_options(mc);
4066 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_3);
4067}
4068DEFINE_SPAPR_MACHINE(2_3, "2.3", false);
4069
4070
4071
4072
4073
4074#define SPAPR_COMPAT_2_2 \
4075 HW_COMPAT_2_2 \
4076 {\
4077 .driver = TYPE_SPAPR_PCI_HOST_BRIDGE,\
4078 .property = "mem_win_size",\
4079 .value = "0x20000000",\
4080 },
4081
4082static void spapr_machine_2_2_instance_options(MachineState *machine)
4083{
4084 spapr_machine_2_3_instance_options(machine);
4085 machine->suppress_vmdesc = true;
4086}
4087
4088static void spapr_machine_2_2_class_options(MachineClass *mc)
4089{
4090 spapr_machine_2_3_class_options(mc);
4091 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_2);
4092}
4093DEFINE_SPAPR_MACHINE(2_2, "2.2", false);
4094
4095
4096
4097
4098#define SPAPR_COMPAT_2_1 \
4099 HW_COMPAT_2_1
4100
4101static void spapr_machine_2_1_instance_options(MachineState *machine)
4102{
4103 spapr_machine_2_2_instance_options(machine);
4104}
4105
4106static void spapr_machine_2_1_class_options(MachineClass *mc)
4107{
4108 spapr_machine_2_2_class_options(mc);
4109 SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_1);
4110}
4111DEFINE_SPAPR_MACHINE(2_1, "2.1", false);
4112
4113static void spapr_machine_register_types(void)
4114{
4115 type_register_static(&spapr_machine_info);
4116}
4117
4118type_init(spapr_machine_register_types)
4119