]> Git Repo - qemu.git/blob - hw/spapr.c
cpu: Move numa_node field to CPUState
[qemu.git] / hw / spapr.c
1 /*
2  * QEMU PowerPC pSeries Logical Partition (aka sPAPR) hardware System Emulator
3  *
4  * Copyright (c) 2004-2007 Fabrice Bellard
5  * Copyright (c) 2007 Jocelyn Mayer
6  * Copyright (c) 2010 David Gibson, IBM Corporation.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  *
26  */
27 #include "sysemu/sysemu.h"
28 #include "hw.h"
29 #include "elf.h"
30 #include "net/net.h"
31 #include "sysemu/blockdev.h"
32 #include "sysemu/cpus.h"
33 #include "sysemu/kvm.h"
34 #include "kvm_ppc.h"
35
36 #include "hw/boards.h"
37 #include "hw/ppc.h"
38 #include "hw/loader.h"
39
40 #include "hw/spapr.h"
41 #include "hw/spapr_vio.h"
42 #include "hw/spapr_pci.h"
43 #include "hw/xics.h"
44 #include "hw/pci/msi.h"
45
46 #include "sysemu/kvm.h"
47 #include "kvm_ppc.h"
48 #include "pci/pci.h"
49
50 #include "exec/address-spaces.h"
51 #include "hw/usb.h"
52 #include "qemu/config-file.h"
53
54 #include <libfdt.h>
55
56 /* SLOF memory layout:
57  *
58  * SLOF raw image loaded at 0, copies its romfs right below the flat
59  * device-tree, then position SLOF itself 31M below that
60  *
61  * So we set FW_OVERHEAD to 40MB which should account for all of that
62  * and more
63  *
64  * We load our kernel at 4M, leaving space for SLOF initial image
65  */
66 #define FDT_MAX_SIZE            0x10000
67 #define RTAS_MAX_SIZE           0x10000
68 #define FW_MAX_SIZE             0x400000
69 #define FW_FILE_NAME            "slof.bin"
70 #define FW_OVERHEAD             0x2800000
71 #define KERNEL_LOAD_ADDR        FW_MAX_SIZE
72
73 #define MIN_RMA_SLOF            128UL
74
75 #define TIMEBASE_FREQ           512000000ULL
76
77 #define MAX_CPUS                256
78 #define XICS_IRQS               1024
79
80 #define SPAPR_PCI_BUID          0x800000020000001ULL
81 #define SPAPR_PCI_MEM_WIN_ADDR  (0x10000000000ULL + 0xA0000000)
82 #define SPAPR_PCI_MEM_WIN_SIZE  0x20000000
83 #define SPAPR_PCI_IO_WIN_ADDR   (0x10000000000ULL + 0x80000000)
84 #define SPAPR_PCI_MSI_WIN_ADDR  (0x10000000000ULL + 0x90000000)
85
86 #define PHANDLE_XICP            0x00001111
87
88 #define HTAB_SIZE(spapr)        (1ULL << ((spapr)->htab_shift))
89
90 sPAPREnvironment *spapr;
91
92 int spapr_allocate_irq(int hint, bool lsi)
93 {
94     int irq;
95
96     if (hint) {
97         irq = hint;
98         /* FIXME: we should probably check for collisions somehow */
99     } else {
100         irq = spapr->next_irq++;
101     }
102
103     /* Configure irq type */
104     if (!xics_get_qirq(spapr->icp, irq)) {
105         return 0;
106     }
107
108     xics_set_irq_type(spapr->icp, irq, lsi);
109
110     return irq;
111 }
112
113 /* Allocate block of consequtive IRQs, returns a number of the first */
114 int spapr_allocate_irq_block(int num, bool lsi)
115 {
116     int first = -1;
117     int i;
118
119     for (i = 0; i < num; ++i) {
120         int irq;
121
122         irq = spapr_allocate_irq(0, lsi);
123         if (!irq) {
124             return -1;
125         }
126
127         if (0 == i) {
128             first = irq;
129         }
130
131         /* If the above doesn't create a consecutive block then that's
132          * an internal bug */
133         assert(irq == (first + i));
134     }
135
136     return first;
137 }
138
139 static int spapr_fixup_cpu_dt(void *fdt, sPAPREnvironment *spapr)
140 {
141     int ret = 0, offset;
142     CPUPPCState *env;
143     CPUState *cpu;
144     char cpu_model[32];
145     int smt = kvmppc_smt_threads();
146     uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)};
147
148     assert(spapr->cpu_model);
149
150     for (env = first_cpu; env != NULL; env = env->next_cpu) {
151         cpu = ENV_GET_CPU(env);
152         uint32_t associativity[] = {cpu_to_be32(0x5),
153                                     cpu_to_be32(0x0),
154                                     cpu_to_be32(0x0),
155                                     cpu_to_be32(0x0),
156                                     cpu_to_be32(cpu->numa_node),
157                                     cpu_to_be32(env->cpu_index)};
158
159         if ((env->cpu_index % smt) != 0) {
160             continue;
161         }
162
163         snprintf(cpu_model, 32, "/cpus/%s@%x", spapr->cpu_model,
164                  env->cpu_index);
165
166         offset = fdt_path_offset(fdt, cpu_model);
167         if (offset < 0) {
168             return offset;
169         }
170
171         if (nb_numa_nodes > 1) {
172             ret = fdt_setprop(fdt, offset, "ibm,associativity", associativity,
173                               sizeof(associativity));
174             if (ret < 0) {
175                 return ret;
176             }
177         }
178
179         ret = fdt_setprop(fdt, offset, "ibm,pft-size",
180                           pft_size_prop, sizeof(pft_size_prop));
181         if (ret < 0) {
182             return ret;
183         }
184     }
185     return ret;
186 }
187
188
189 static size_t create_page_sizes_prop(CPUPPCState *env, uint32_t *prop,
190                                      size_t maxsize)
191 {
192     size_t maxcells = maxsize / sizeof(uint32_t);
193     int i, j, count;
194     uint32_t *p = prop;
195
196     for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
197         struct ppc_one_seg_page_size *sps = &env->sps.sps[i];
198
199         if (!sps->page_shift) {
200             break;
201         }
202         for (count = 0; count < PPC_PAGE_SIZES_MAX_SZ; count++) {
203             if (sps->enc[count].page_shift == 0) {
204                 break;
205             }
206         }
207         if ((p - prop) >= (maxcells - 3 - count * 2)) {
208             break;
209         }
210         *(p++) = cpu_to_be32(sps->page_shift);
211         *(p++) = cpu_to_be32(sps->slb_enc);
212         *(p++) = cpu_to_be32(count);
213         for (j = 0; j < count; j++) {
214             *(p++) = cpu_to_be32(sps->enc[j].page_shift);
215             *(p++) = cpu_to_be32(sps->enc[j].pte_enc);
216         }
217     }
218
219     return (p - prop) * sizeof(uint32_t);
220 }
221
222 #define _FDT(exp) \
223     do { \
224         int ret = (exp);                                           \
225         if (ret < 0) {                                             \
226             fprintf(stderr, "qemu: error creating device tree: %s: %s\n", \
227                     #exp, fdt_strerror(ret));                      \
228             exit(1);                                               \
229         }                                                          \
230     } while (0)
231
232
233 static void *spapr_create_fdt_skel(const char *cpu_model,
234                                    hwaddr initrd_base,
235                                    hwaddr initrd_size,
236                                    hwaddr kernel_size,
237                                    const char *boot_device,
238                                    const char *kernel_cmdline,
239                                    uint32_t epow_irq)
240 {
241     void *fdt;
242     CPUPPCState *env;
243     uint32_t start_prop = cpu_to_be32(initrd_base);
244     uint32_t end_prop = cpu_to_be32(initrd_base + initrd_size);
245     char hypertas_prop[] = "hcall-pft\0hcall-term\0hcall-dabr\0hcall-interrupt"
246         "\0hcall-tce\0hcall-vio\0hcall-splpar\0hcall-bulk";
247     char qemu_hypertas_prop[] = "hcall-memop1";
248     uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)};
249     uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(smp_cpus)};
250     char *modelname;
251     int i, smt = kvmppc_smt_threads();
252     unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80};
253
254     fdt = g_malloc0(FDT_MAX_SIZE);
255     _FDT((fdt_create(fdt, FDT_MAX_SIZE)));
256
257     if (kernel_size) {
258         _FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, kernel_size)));
259     }
260     if (initrd_size) {
261         _FDT((fdt_add_reservemap_entry(fdt, initrd_base, initrd_size)));
262     }
263     _FDT((fdt_finish_reservemap(fdt)));
264
265     /* Root node */
266     _FDT((fdt_begin_node(fdt, "")));
267     _FDT((fdt_property_string(fdt, "device_type", "chrp")));
268     _FDT((fdt_property_string(fdt, "model", "IBM pSeries (emulated by qemu)")));
269
270     _FDT((fdt_property_cell(fdt, "#address-cells", 0x2)));
271     _FDT((fdt_property_cell(fdt, "#size-cells", 0x2)));
272
273     /* /chosen */
274     _FDT((fdt_begin_node(fdt, "chosen")));
275
276     /* Set Form1_affinity */
277     _FDT((fdt_property(fdt, "ibm,architecture-vec-5", vec5, sizeof(vec5))));
278
279     _FDT((fdt_property_string(fdt, "bootargs", kernel_cmdline)));
280     _FDT((fdt_property(fdt, "linux,initrd-start",
281                        &start_prop, sizeof(start_prop))));
282     _FDT((fdt_property(fdt, "linux,initrd-end",
283                        &end_prop, sizeof(end_prop))));
284     if (kernel_size) {
285         uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR),
286                               cpu_to_be64(kernel_size) };
287
288         _FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop))));
289     }
290     _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
291     _FDT((fdt_property_cell(fdt, "qemu,graphic-width", graphic_width)));
292     _FDT((fdt_property_cell(fdt, "qemu,graphic-height", graphic_height)));
293     _FDT((fdt_property_cell(fdt, "qemu,graphic-depth", graphic_depth)));
294
295     _FDT((fdt_end_node(fdt)));
296
297     /* cpus */
298     _FDT((fdt_begin_node(fdt, "cpus")));
299
300     _FDT((fdt_property_cell(fdt, "#address-cells", 0x1)));
301     _FDT((fdt_property_cell(fdt, "#size-cells", 0x0)));
302
303     modelname = g_strdup(cpu_model);
304
305     for (i = 0; i < strlen(modelname); i++) {
306         modelname[i] = toupper(modelname[i]);
307     }
308
309     /* This is needed during FDT finalization */
310     spapr->cpu_model = g_strdup(modelname);
311
312     for (env = first_cpu; env != NULL; env = env->next_cpu) {
313         int index = env->cpu_index;
314         uint32_t servers_prop[smp_threads];
315         uint32_t gservers_prop[smp_threads * 2];
316         char *nodename;
317         uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
318                            0xffffffff, 0xffffffff};
319         uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ;
320         uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;
321         uint32_t page_sizes_prop[64];
322         size_t page_sizes_prop_size;
323
324         if ((index % smt) != 0) {
325             continue;
326         }
327
328         if (asprintf(&nodename, "%s@%x", modelname, index) < 0) {
329             fprintf(stderr, "Allocation failure\n");
330             exit(1);
331         }
332
333         _FDT((fdt_begin_node(fdt, nodename)));
334
335         free(nodename);
336
337         _FDT((fdt_property_cell(fdt, "reg", index)));
338         _FDT((fdt_property_string(fdt, "device_type", "cpu")));
339
340         _FDT((fdt_property_cell(fdt, "cpu-version", env->spr[SPR_PVR])));
341         _FDT((fdt_property_cell(fdt, "dcache-block-size",
342                                 env->dcache_line_size)));
343         _FDT((fdt_property_cell(fdt, "icache-block-size",
344                                 env->icache_line_size)));
345         _FDT((fdt_property_cell(fdt, "timebase-frequency", tbfreq)));
346         _FDT((fdt_property_cell(fdt, "clock-frequency", cpufreq)));
347         _FDT((fdt_property_cell(fdt, "ibm,slb-size", env->slb_nr)));
348         _FDT((fdt_property_string(fdt, "status", "okay")));
349         _FDT((fdt_property(fdt, "64-bit", NULL, 0)));
350
351         /* Build interrupt servers and gservers properties */
352         for (i = 0; i < smp_threads; i++) {
353             servers_prop[i] = cpu_to_be32(index + i);
354             /* Hack, direct the group queues back to cpu 0 */
355             gservers_prop[i*2] = cpu_to_be32(index + i);
356             gservers_prop[i*2 + 1] = 0;
357         }
358         _FDT((fdt_property(fdt, "ibm,ppc-interrupt-server#s",
359                            servers_prop, sizeof(servers_prop))));
360         _FDT((fdt_property(fdt, "ibm,ppc-interrupt-gserver#s",
361                            gservers_prop, sizeof(gservers_prop))));
362
363         if (env->mmu_model & POWERPC_MMU_1TSEG) {
364             _FDT((fdt_property(fdt, "ibm,processor-segment-sizes",
365                                segs, sizeof(segs))));
366         }
367
368         /* Advertise VMX/VSX (vector extensions) if available
369          *   0 / no property == no vector extensions
370          *   1               == VMX / Altivec available
371          *   2               == VSX available */
372         if (env->insns_flags & PPC_ALTIVEC) {
373             uint32_t vmx = (env->insns_flags2 & PPC2_VSX) ? 2 : 1;
374
375             _FDT((fdt_property_cell(fdt, "ibm,vmx", vmx)));
376         }
377
378         /* Advertise DFP (Decimal Floating Point) if available
379          *   0 / no property == no DFP
380          *   1               == DFP available */
381         if (env->insns_flags2 & PPC2_DFP) {
382             _FDT((fdt_property_cell(fdt, "ibm,dfp", 1)));
383         }
384
385         page_sizes_prop_size = create_page_sizes_prop(env, page_sizes_prop,
386                                                       sizeof(page_sizes_prop));
387         if (page_sizes_prop_size) {
388             _FDT((fdt_property(fdt, "ibm,segment-page-sizes",
389                                page_sizes_prop, page_sizes_prop_size)));
390         }
391
392         _FDT((fdt_end_node(fdt)));
393     }
394
395     g_free(modelname);
396
397     _FDT((fdt_end_node(fdt)));
398
399     /* RTAS */
400     _FDT((fdt_begin_node(fdt, "rtas")));
401
402     _FDT((fdt_property(fdt, "ibm,hypertas-functions", hypertas_prop,
403                        sizeof(hypertas_prop))));
404     _FDT((fdt_property(fdt, "qemu,hypertas-functions", qemu_hypertas_prop,
405                        sizeof(qemu_hypertas_prop))));
406
407     _FDT((fdt_property(fdt, "ibm,associativity-reference-points",
408         refpoints, sizeof(refpoints))));
409
410     _FDT((fdt_property_cell(fdt, "rtas-error-log-max", RTAS_ERROR_LOG_MAX)));
411
412     _FDT((fdt_end_node(fdt)));
413
414     /* interrupt controller */
415     _FDT((fdt_begin_node(fdt, "interrupt-controller")));
416
417     _FDT((fdt_property_string(fdt, "device_type",
418                               "PowerPC-External-Interrupt-Presentation")));
419     _FDT((fdt_property_string(fdt, "compatible", "IBM,ppc-xicp")));
420     _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0)));
421     _FDT((fdt_property(fdt, "ibm,interrupt-server-ranges",
422                        interrupt_server_ranges_prop,
423                        sizeof(interrupt_server_ranges_prop))));
424     _FDT((fdt_property_cell(fdt, "#interrupt-cells", 2)));
425     _FDT((fdt_property_cell(fdt, "linux,phandle", PHANDLE_XICP)));
426     _FDT((fdt_property_cell(fdt, "phandle", PHANDLE_XICP)));
427
428     _FDT((fdt_end_node(fdt)));
429
430     /* vdevice */
431     _FDT((fdt_begin_node(fdt, "vdevice")));
432
433     _FDT((fdt_property_string(fdt, "device_type", "vdevice")));
434     _FDT((fdt_property_string(fdt, "compatible", "IBM,vdevice")));
435     _FDT((fdt_property_cell(fdt, "#address-cells", 0x1)));
436     _FDT((fdt_property_cell(fdt, "#size-cells", 0x0)));
437     _FDT((fdt_property_cell(fdt, "#interrupt-cells", 0x2)));
438     _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0)));
439
440     _FDT((fdt_end_node(fdt)));
441
442     /* event-sources */
443     spapr_events_fdt_skel(fdt, epow_irq);
444
445     _FDT((fdt_end_node(fdt))); /* close root node */
446     _FDT((fdt_finish(fdt)));
447
448     return fdt;
449 }
450
451 static int spapr_populate_memory(sPAPREnvironment *spapr, void *fdt)
452 {
453     uint32_t associativity[] = {cpu_to_be32(0x4), cpu_to_be32(0x0),
454                                 cpu_to_be32(0x0), cpu_to_be32(0x0),
455                                 cpu_to_be32(0x0)};
456     char mem_name[32];
457     hwaddr node0_size, mem_start;
458     uint64_t mem_reg_property[2];
459     int i, off;
460
461     /* memory node(s) */
462     node0_size = (nb_numa_nodes > 1) ? node_mem[0] : ram_size;
463     if (spapr->rma_size > node0_size) {
464         spapr->rma_size = node0_size;
465     }
466
467     /* RMA */
468     mem_reg_property[0] = 0;
469     mem_reg_property[1] = cpu_to_be64(spapr->rma_size);
470     off = fdt_add_subnode(fdt, 0, "memory@0");
471     _FDT(off);
472     _FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
473     _FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
474                       sizeof(mem_reg_property))));
475     _FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
476                       sizeof(associativity))));
477
478     /* RAM: Node 0 */
479     if (node0_size > spapr->rma_size) {
480         mem_reg_property[0] = cpu_to_be64(spapr->rma_size);
481         mem_reg_property[1] = cpu_to_be64(node0_size - spapr->rma_size);
482
483         sprintf(mem_name, "memory@" TARGET_FMT_lx, spapr->rma_size);
484         off = fdt_add_subnode(fdt, 0, mem_name);
485         _FDT(off);
486         _FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
487         _FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
488                           sizeof(mem_reg_property))));
489         _FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
490                           sizeof(associativity))));
491     }
492
493     /* RAM: Node 1 and beyond */
494     mem_start = node0_size;
495     for (i = 1; i < nb_numa_nodes; i++) {
496         mem_reg_property[0] = cpu_to_be64(mem_start);
497         mem_reg_property[1] = cpu_to_be64(node_mem[i]);
498         associativity[3] = associativity[4] = cpu_to_be32(i);
499         sprintf(mem_name, "memory@" TARGET_FMT_lx, mem_start);
500         off = fdt_add_subnode(fdt, 0, mem_name);
501         _FDT(off);
502         _FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
503         _FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
504                           sizeof(mem_reg_property))));
505         _FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
506                           sizeof(associativity))));
507         mem_start += node_mem[i];
508     }
509
510     return 0;
511 }
512
513 static void spapr_finalize_fdt(sPAPREnvironment *spapr,
514                                hwaddr fdt_addr,
515                                hwaddr rtas_addr,
516                                hwaddr rtas_size)
517 {
518     int ret;
519     void *fdt;
520     sPAPRPHBState *phb;
521
522     fdt = g_malloc(FDT_MAX_SIZE);
523
524     /* open out the base tree into a temp buffer for the final tweaks */
525     _FDT((fdt_open_into(spapr->fdt_skel, fdt, FDT_MAX_SIZE)));
526
527     ret = spapr_populate_memory(spapr, fdt);
528     if (ret < 0) {
529         fprintf(stderr, "couldn't setup memory nodes in fdt\n");
530         exit(1);
531     }
532
533     ret = spapr_populate_vdevice(spapr->vio_bus, fdt);
534     if (ret < 0) {
535         fprintf(stderr, "couldn't setup vio devices in fdt\n");
536         exit(1);
537     }
538
539     QLIST_FOREACH(phb, &spapr->phbs, list) {
540         ret = spapr_populate_pci_dt(phb, PHANDLE_XICP, fdt);
541     }
542
543     if (ret < 0) {
544         fprintf(stderr, "couldn't setup PCI devices in fdt\n");
545         exit(1);
546     }
547
548     /* RTAS */
549     ret = spapr_rtas_device_tree_setup(fdt, rtas_addr, rtas_size);
550     if (ret < 0) {
551         fprintf(stderr, "Couldn't set up RTAS device tree properties\n");
552     }
553
554     /* Advertise NUMA via ibm,associativity */
555     ret = spapr_fixup_cpu_dt(fdt, spapr);
556     if (ret < 0) {
557         fprintf(stderr, "Couldn't finalize CPU device tree properties\n");
558     }
559
560     if (!spapr->has_graphics) {
561         spapr_populate_chosen_stdout(fdt, spapr->vio_bus);
562     }
563
564     _FDT((fdt_pack(fdt)));
565
566     if (fdt_totalsize(fdt) > FDT_MAX_SIZE) {
567         hw_error("FDT too big ! 0x%x bytes (max is 0x%x)\n",
568                  fdt_totalsize(fdt), FDT_MAX_SIZE);
569         exit(1);
570     }
571
572     cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt));
573
574     g_free(fdt);
575 }
576
577 static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
578 {
579     return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR;
580 }
581
582 static void emulate_spapr_hypercall(PowerPCCPU *cpu)
583 {
584     CPUPPCState *env = &cpu->env;
585
586     if (msr_pr) {
587         hcall_dprintf("Hypercall made with MSR[PR]=1\n");
588         env->gpr[3] = H_PRIVILEGE;
589     } else {
590         env->gpr[3] = spapr_hypercall(cpu, env->gpr[3], &env->gpr[4]);
591     }
592 }
593
594 static void spapr_reset_htab(sPAPREnvironment *spapr)
595 {
596     long shift;
597
598     /* allocate hash page table.  For now we always make this 16mb,
599      * later we should probably make it scale to the size of guest
600      * RAM */
601
602     shift = kvmppc_reset_htab(spapr->htab_shift);
603
604     if (shift > 0) {
605         /* Kernel handles htab, we don't need to allocate one */
606         spapr->htab_shift = shift;
607     } else {
608         if (!spapr->htab) {
609             /* Allocate an htab if we don't yet have one */
610             spapr->htab = qemu_memalign(HTAB_SIZE(spapr), HTAB_SIZE(spapr));
611         }
612
613         /* And clear it */
614         memset(spapr->htab, 0, HTAB_SIZE(spapr));
615     }
616
617     /* Update the RMA size if necessary */
618     if (spapr->vrma_adjust) {
619         spapr->rma_size = kvmppc_rma_size(ram_size, spapr->htab_shift);
620     }
621 }
622
623 static void ppc_spapr_reset(void)
624 {
625     /* Reset the hash table & recalc the RMA */
626     spapr_reset_htab(spapr);
627
628     qemu_devices_reset();
629
630     /* Load the fdt */
631     spapr_finalize_fdt(spapr, spapr->fdt_addr, spapr->rtas_addr,
632                        spapr->rtas_size);
633
634     /* Set up the entry state */
635     first_cpu->gpr[3] = spapr->fdt_addr;
636     first_cpu->gpr[5] = 0;
637     first_cpu->halted = 0;
638     first_cpu->nip = spapr->entry_point;
639
640 }
641
642 static void spapr_cpu_reset(void *opaque)
643 {
644     PowerPCCPU *cpu = opaque;
645     CPUPPCState *env = &cpu->env;
646
647     cpu_reset(CPU(cpu));
648
649     /* All CPUs start halted.  CPU0 is unhalted from the machine level
650      * reset code and the rest are explicitly started up by the guest
651      * using an RTAS call */
652     env->halted = 1;
653
654     env->spr[SPR_HIOR] = 0;
655
656     env->external_htab = spapr->htab;
657     env->htab_base = -1;
658     env->htab_mask = HTAB_SIZE(spapr) - 1;
659     env->spr[SPR_SDR1] = (unsigned long)spapr->htab |
660         (spapr->htab_shift - 18);
661 }
662
663 static void spapr_create_nvram(sPAPREnvironment *spapr)
664 {
665     QemuOpts *machine_opts;
666     DeviceState *dev;
667
668     dev = qdev_create(&spapr->vio_bus->bus, "spapr-nvram");
669
670     machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
671     if (machine_opts) {
672         const char *drivename;
673
674         drivename = qemu_opt_get(machine_opts, "nvram");
675         if (drivename) {
676             BlockDriverState *bs;
677
678             bs = bdrv_find(drivename);
679             if (!bs) {
680                 fprintf(stderr, "No such block device \"%s\" for nvram\n",
681                         drivename);
682                 exit(1);
683             }
684             qdev_prop_set_drive_nofail(dev, "drive", bs);
685         }
686     }
687
688     qdev_init_nofail(dev);
689
690     spapr->nvram = (struct sPAPRNVRAM *)dev;
691 }
692
693 /* Returns whether we want to use VGA or not */
694 static int spapr_vga_init(PCIBus *pci_bus)
695 {
696     switch (vga_interface_type) {
697     case VGA_NONE:
698     case VGA_STD:
699         return pci_vga_init(pci_bus) != NULL;
700     default:
701         fprintf(stderr, "This vga model is not supported,"
702                 "currently it only supports -vga std\n");
703         exit(0);
704         break;
705     }
706 }
707
708 /* pSeries LPAR / sPAPR hardware init */
709 static void ppc_spapr_init(QEMUMachineInitArgs *args)
710 {
711     ram_addr_t ram_size = args->ram_size;
712     const char *cpu_model = args->cpu_model;
713     const char *kernel_filename = args->kernel_filename;
714     const char *kernel_cmdline = args->kernel_cmdline;
715     const char *initrd_filename = args->initrd_filename;
716     const char *boot_device = args->boot_device;
717     PowerPCCPU *cpu;
718     CPUPPCState *env;
719     PCIHostState *phb;
720     int i;
721     MemoryRegion *sysmem = get_system_memory();
722     MemoryRegion *ram = g_new(MemoryRegion, 1);
723     hwaddr rma_alloc_size;
724     uint32_t initrd_base = 0;
725     long kernel_size = 0, initrd_size = 0;
726     long load_limit, rtas_limit, fw_size;
727     char *filename;
728
729     msi_supported = true;
730
731     spapr = g_malloc0(sizeof(*spapr));
732     QLIST_INIT(&spapr->phbs);
733
734     cpu_ppc_hypercall = emulate_spapr_hypercall;
735
736     /* Allocate RMA if necessary */
737     rma_alloc_size = kvmppc_alloc_rma("ppc_spapr.rma", sysmem);
738
739     if (rma_alloc_size == -1) {
740         hw_error("qemu: Unable to create RMA\n");
741         exit(1);
742     }
743
744     if (rma_alloc_size && (rma_alloc_size < ram_size)) {
745         spapr->rma_size = rma_alloc_size;
746     } else {
747         spapr->rma_size = ram_size;
748
749         /* With KVM, we don't actually know whether KVM supports an
750          * unbounded RMA (PR KVM) or is limited by the hash table size
751          * (HV KVM using VRMA), so we always assume the latter
752          *
753          * In that case, we also limit the initial allocations for RTAS
754          * etc... to 256M since we have no way to know what the VRMA size
755          * is going to be as it depends on the size of the hash table
756          * isn't determined yet.
757          */
758         if (kvm_enabled()) {
759             spapr->vrma_adjust = 1;
760             spapr->rma_size = MIN(spapr->rma_size, 0x10000000);
761         }
762     }
763
764     /* We place the device tree and RTAS just below either the top of the RMA,
765      * or just below 2GB, whichever is lowere, so that it can be
766      * processed with 32-bit real mode code if necessary */
767     rtas_limit = MIN(spapr->rma_size, 0x80000000);
768     spapr->rtas_addr = rtas_limit - RTAS_MAX_SIZE;
769     spapr->fdt_addr = spapr->rtas_addr - FDT_MAX_SIZE;
770     load_limit = spapr->fdt_addr - FW_OVERHEAD;
771
772     /* We aim for a hash table of size 1/128 the size of RAM.  The
773      * normal rule of thumb is 1/64 the size of RAM, but that's much
774      * more than needed for the Linux guests we support. */
775     spapr->htab_shift = 18; /* Minimum architected size */
776     while (spapr->htab_shift <= 46) {
777         if ((1ULL << (spapr->htab_shift + 7)) >= ram_size) {
778             break;
779         }
780         spapr->htab_shift++;
781     }
782
783     /* init CPUs */
784     if (cpu_model == NULL) {
785         cpu_model = kvm_enabled() ? "host" : "POWER7";
786     }
787     for (i = 0; i < smp_cpus; i++) {
788         cpu = cpu_ppc_init(cpu_model);
789         if (cpu == NULL) {
790             fprintf(stderr, "Unable to find PowerPC CPU definition\n");
791             exit(1);
792         }
793         env = &cpu->env;
794
795         /* Set time-base frequency to 512 MHz */
796         cpu_ppc_tb_init(env, TIMEBASE_FREQ);
797
798         /* PAPR always has exception vectors in RAM not ROM */
799         env->hreset_excp_prefix = 0;
800
801         /* Tell KVM that we're in PAPR mode */
802         if (kvm_enabled()) {
803             kvmppc_set_papr(cpu);
804         }
805
806         qemu_register_reset(spapr_cpu_reset, cpu);
807     }
808
809     /* allocate RAM */
810     spapr->ram_limit = ram_size;
811     if (spapr->ram_limit > rma_alloc_size) {
812         ram_addr_t nonrma_base = rma_alloc_size;
813         ram_addr_t nonrma_size = spapr->ram_limit - rma_alloc_size;
814
815         memory_region_init_ram(ram, "ppc_spapr.ram", nonrma_size);
816         vmstate_register_ram_global(ram);
817         memory_region_add_subregion(sysmem, nonrma_base, ram);
818     }
819
820     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "spapr-rtas.bin");
821     spapr->rtas_size = load_image_targphys(filename, spapr->rtas_addr,
822                                            rtas_limit - spapr->rtas_addr);
823     if (spapr->rtas_size < 0) {
824         hw_error("qemu: could not load LPAR rtas '%s'\n", filename);
825         exit(1);
826     }
827     if (spapr->rtas_size > RTAS_MAX_SIZE) {
828         hw_error("RTAS too big ! 0x%lx bytes (max is 0x%x)\n",
829                  spapr->rtas_size, RTAS_MAX_SIZE);
830         exit(1);
831     }
832     g_free(filename);
833
834
835     /* Set up Interrupt Controller */
836     spapr->icp = xics_system_init(XICS_IRQS);
837     spapr->next_irq = XICS_IRQ_BASE;
838
839     /* Set up EPOW events infrastructure */
840     spapr_events_init(spapr);
841
842     /* Set up IOMMU */
843     spapr_iommu_init();
844
845     /* Set up VIO bus */
846     spapr->vio_bus = spapr_vio_bus_init();
847
848     for (i = 0; i < MAX_SERIAL_PORTS; i++) {
849         if (serial_hds[i]) {
850             spapr_vty_create(spapr->vio_bus, serial_hds[i]);
851         }
852     }
853
854     /* We always have at least the nvram device on VIO */
855     spapr_create_nvram(spapr);
856
857     /* Set up PCI */
858     spapr_pci_rtas_init();
859
860     spapr_create_phb(spapr, "pci", SPAPR_PCI_BUID,
861                      SPAPR_PCI_MEM_WIN_ADDR,
862                      SPAPR_PCI_MEM_WIN_SIZE,
863                      SPAPR_PCI_IO_WIN_ADDR,
864                      SPAPR_PCI_MSI_WIN_ADDR);
865     phb = PCI_HOST_BRIDGE(QLIST_FIRST(&spapr->phbs));
866
867     for (i = 0; i < nb_nics; i++) {
868         NICInfo *nd = &nd_table[i];
869
870         if (!nd->model) {
871             nd->model = g_strdup("ibmveth");
872         }
873
874         if (strcmp(nd->model, "ibmveth") == 0) {
875             spapr_vlan_create(spapr->vio_bus, nd);
876         } else {
877             pci_nic_init_nofail(&nd_table[i], nd->model, NULL);
878         }
879     }
880
881     for (i = 0; i <= drive_get_max_bus(IF_SCSI); i++) {
882         spapr_vscsi_create(spapr->vio_bus);
883     }
884
885     /* Graphics */
886     if (spapr_vga_init(phb->bus)) {
887         spapr->has_graphics = true;
888     }
889
890     if (usb_enabled(spapr->has_graphics)) {
891         pci_create_simple(phb->bus, -1, "pci-ohci");
892         if (spapr->has_graphics) {
893             usbdevice_create("keyboard");
894             usbdevice_create("mouse");
895         }
896     }
897
898     if (spapr->rma_size < (MIN_RMA_SLOF << 20)) {
899         fprintf(stderr, "qemu: pSeries SLOF firmware requires >= "
900                 "%ldM guest RMA (Real Mode Area memory)\n", MIN_RMA_SLOF);
901         exit(1);
902     }
903
904     if (kernel_filename) {
905         uint64_t lowaddr = 0;
906
907         kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
908                                NULL, &lowaddr, NULL, 1, ELF_MACHINE, 0);
909         if (kernel_size < 0) {
910             kernel_size = load_image_targphys(kernel_filename,
911                                               KERNEL_LOAD_ADDR,
912                                               load_limit - KERNEL_LOAD_ADDR);
913         }
914         if (kernel_size < 0) {
915             fprintf(stderr, "qemu: could not load kernel '%s'\n",
916                     kernel_filename);
917             exit(1);
918         }
919
920         /* load initrd */
921         if (initrd_filename) {
922             /* Try to locate the initrd in the gap between the kernel
923              * and the firmware. Add a bit of space just in case
924              */
925             initrd_base = (KERNEL_LOAD_ADDR + kernel_size + 0x1ffff) & ~0xffff;
926             initrd_size = load_image_targphys(initrd_filename, initrd_base,
927                                               load_limit - initrd_base);
928             if (initrd_size < 0) {
929                 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
930                         initrd_filename);
931                 exit(1);
932             }
933         } else {
934             initrd_base = 0;
935             initrd_size = 0;
936         }
937     }
938
939     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, FW_FILE_NAME);
940     fw_size = load_image_targphys(filename, 0, FW_MAX_SIZE);
941     if (fw_size < 0) {
942         hw_error("qemu: could not load LPAR rtas '%s'\n", filename);
943         exit(1);
944     }
945     g_free(filename);
946
947     spapr->entry_point = 0x100;
948
949     /* Prepare the device tree */
950     spapr->fdt_skel = spapr_create_fdt_skel(cpu_model,
951                                             initrd_base, initrd_size,
952                                             kernel_size,
953                                             boot_device, kernel_cmdline,
954                                             spapr->epow_irq);
955     assert(spapr->fdt_skel != NULL);
956 }
957
958 static QEMUMachine spapr_machine = {
959     .name = "pseries",
960     .desc = "pSeries Logical Partition (PAPR compliant)",
961     .init = ppc_spapr_init,
962     .reset = ppc_spapr_reset,
963     .block_default_type = IF_SCSI,
964     .max_cpus = MAX_CPUS,
965     .no_parallel = 1,
966 };
967
968 static void spapr_machine_init(void)
969 {
970     qemu_register_machine(&spapr_machine);
971 }
972
973 machine_init(spapr_machine_init);
This page took 0.076714 seconds and 4 git commands to generate.