~ubuntu-branches/ubuntu/trusty/qemu/trusty

« back to all changes in this revision

Viewing changes to hw/ppc/e500.c

  • Committer: Package Import Robot
  • Author(s): Serge Hallyn
  • Date: 2013-10-22 22:47:07 UTC
  • mfrom: (1.8.3) (10.1.42 sid)
  • Revision ID: package-import@ubuntu.com-20131022224707-1lya34fw3k3f24tv
Tags: 1.6.0+dfsg-2ubuntu1
* Merge 1.6.0~rc0+dfsg-2exp from debian experimental.  Remaining changes:
  - debian/control
    * update maintainer
    * remove libiscsi, usb-redir, vde, vnc-jpeg, and libssh2-1-dev
      from build-deps
    * enable rbd
    * add qemu-system and qemu-common B/R to qemu-keymaps
    * add D:udev, R:qemu, R:qemu-common and B:qemu-common to
      qemu-system-common
    * qemu-system-arm, qemu-system-ppc, qemu-system-sparc:
      - add qemu-kvm to Provides
      - add qemu-common, qemu-kvm, kvm to B/R
      - remove openbios-sparc from qemu-system-sparc D
      - drop openbios-ppc and openhackware Depends to Suggests (for now)
    * qemu-system-x86:
      - add qemu-common to Breaks/Replaces.
      - add cpu-checker to Recommends.
    * qemu-user: add B/R:qemu-kvm
    * qemu-kvm:
      - add armhf armel powerpc sparc to Architecture
      - C/R/P: qemu-kvm-spice
    * add qemu-common package
    * drop qemu-slof which is not packaged in ubuntu
  - add qemu-system-common.links for tap ifup/down scripts and OVMF link.
  - qemu-system-x86.links:
    * remove pxe rom links which are in kvm-ipxe
    * add symlink for kvm.1 manpage
  - debian/rules
    * add kvm-spice symlink to qemu-kvm
    * call dh_installmodules for qemu-system-x86
    * update dh_installinit to install upstart script
    * run dh_installman (Closes: #709241) (cherrypicked from 1.5.0+dfsg-2)
  - Add qemu-utils.links for kvm-* symlinks.
  - Add qemu-system-x86.qemu-kvm.upstart and .default
  - Add qemu-system-x86.modprobe to set nesting=1
  - Add qemu-system-common.preinst to add kvm group
  - qemu-system-common.postinst: remove bad group acl if there, then have
    udev relabel /dev/kvm.
  - New linaro patches from qemu-linaro rebasing branch
  - Dropped patches:
    * xen-simplify-xen_enabled.patch
    * sparc-linux-user-fix-missing-symbols-in-.rel-.rela.plt-sections.patch
    * main_loop-do-not-set-nonblocking-if-xen_enabled.patch
    * xen_machine_pv-do-not-create-a-dummy-CPU-in-machine-.patch
    * virtio-rng-fix-crash
  - Kept patches:
    * expose_vms_qemu64cpu.patch - updated
    * linaro arm patches from qemu-linaro rebasing branch
  - New patches:
    * fix-pci-add: change CONFIG variable in ifdef to make sure that
      pci_add is defined.
* Add linaro patches
* Add experimental mach-virt patches for arm virtualization.
* qemu-system-common.install: add debian/tmp/usr/lib to install the
  qemu-bridge-helper

Show diffs side-by-side

added added

removed removed

Lines of Context:
137
137
    uint32_t clock_freq = 400000000;
138
138
    uint32_t tb_freq = 400000000;
139
139
    int i;
140
 
    const char *toplevel_compat = NULL; /* user override */
141
140
    char compatible_sb[] = "fsl,mpc8544-immr\0simple-bus";
142
141
    char soc[128];
143
142
    char mpic[128];
158
157
            0x0, 0xe1000000,
159
158
            0x0, 0x10000,
160
159
        };
161
 
    QemuOpts *machine_opts;
162
 
    const char *dtb_file = NULL;
163
 
 
164
 
    machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
165
 
    if (machine_opts) {
166
 
        dtb_file = qemu_opt_get(machine_opts, "dtb");
167
 
        toplevel_compat = qemu_opt_get(machine_opts, "dt_compatible");
168
 
    }
 
160
    QemuOpts *machine_opts = qemu_get_machine_opts();
 
161
    const char *dtb_file = qemu_opt_get(machine_opts, "dtb");
 
162
    const char *toplevel_compat = qemu_opt_get(machine_opts, "dt_compatible");
169
163
 
170
164
    if (dtb_file) {
171
165
        char *filename;
472
466
    mmubooke_create_initial_mapping(env);
473
467
}
474
468
 
 
469
static DeviceState *ppce500_init_mpic_qemu(PPCE500Params *params,
 
470
                                           qemu_irq **irqs)
 
471
{
 
472
    DeviceState *dev;
 
473
    SysBusDevice *s;
 
474
    int i, j, k;
 
475
 
 
476
    dev = qdev_create(NULL, TYPE_OPENPIC);
 
477
    qdev_prop_set_uint32(dev, "model", params->mpic_version);
 
478
    qdev_prop_set_uint32(dev, "nb_cpus", smp_cpus);
 
479
 
 
480
    qdev_init_nofail(dev);
 
481
    s = SYS_BUS_DEVICE(dev);
 
482
 
 
483
    k = 0;
 
484
    for (i = 0; i < smp_cpus; i++) {
 
485
        for (j = 0; j < OPENPIC_OUTPUT_NB; j++) {
 
486
            sysbus_connect_irq(s, k++, irqs[i][j]);
 
487
        }
 
488
    }
 
489
 
 
490
    return dev;
 
491
}
 
492
 
 
493
static DeviceState *ppce500_init_mpic_kvm(PPCE500Params *params,
 
494
                                          qemu_irq **irqs)
 
495
{
 
496
    DeviceState *dev;
 
497
    CPUState *cs;
 
498
    int r;
 
499
 
 
500
    dev = qdev_create(NULL, TYPE_KVM_OPENPIC);
 
501
    qdev_prop_set_uint32(dev, "model", params->mpic_version);
 
502
 
 
503
    r = qdev_init(dev);
 
504
    if (r) {
 
505
        return NULL;
 
506
    }
 
507
 
 
508
    for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) {
 
509
        if (kvm_openpic_connect_vcpu(dev, cs)) {
 
510
            fprintf(stderr, "%s: failed to connect vcpu to irqchip\n",
 
511
                    __func__);
 
512
            abort();
 
513
        }
 
514
    }
 
515
 
 
516
    return dev;
 
517
}
 
518
 
 
519
static qemu_irq *ppce500_init_mpic(PPCE500Params *params, MemoryRegion *ccsr,
 
520
                                   qemu_irq **irqs)
 
521
{
 
522
    qemu_irq *mpic;
 
523
    DeviceState *dev = NULL;
 
524
    SysBusDevice *s;
 
525
    int i;
 
526
 
 
527
    mpic = g_new(qemu_irq, 256);
 
528
 
 
529
    if (kvm_enabled()) {
 
530
        QemuOpts *machine_opts = qemu_get_machine_opts();
 
531
        bool irqchip_allowed = qemu_opt_get_bool(machine_opts,
 
532
                                                "kernel_irqchip", true);
 
533
        bool irqchip_required = qemu_opt_get_bool(machine_opts,
 
534
                                                  "kernel_irqchip", false);
 
535
 
 
536
        if (irqchip_allowed) {
 
537
            dev = ppce500_init_mpic_kvm(params, irqs);
 
538
        }
 
539
 
 
540
        if (irqchip_required && !dev) {
 
541
            fprintf(stderr, "%s: irqchip requested but unavailable\n",
 
542
                    __func__);
 
543
            abort();
 
544
        }
 
545
    }
 
546
 
 
547
    if (!dev) {
 
548
        dev = ppce500_init_mpic_qemu(params, irqs);
 
549
    }
 
550
 
 
551
    for (i = 0; i < 256; i++) {
 
552
        mpic[i] = qdev_get_gpio_in(dev, i);
 
553
    }
 
554
 
 
555
    s = SYS_BUS_DEVICE(dev);
 
556
    memory_region_add_subregion(ccsr, MPC8544_MPIC_REGS_OFFSET,
 
557
                                s->mmio[0].memory);
 
558
 
 
559
    return mpic;
 
560
}
 
561
 
475
562
void ppce500_init(PPCE500Params *params)
476
563
{
477
564
    MemoryRegion *address_space_mem = get_system_memory();
487
574
    target_ulong initrd_base = 0;
488
575
    target_long initrd_size = 0;
489
576
    target_ulong cur_base = 0;
490
 
    int i = 0, j, k;
 
577
    int i;
491
578
    unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
492
579
    qemu_irq **irqs, *mpic;
493
580
    DeviceState *dev;
550
637
    params->ram_size = ram_size;
551
638
 
552
639
    /* Register Memory */
553
 
    memory_region_init_ram(ram, "mpc8544ds.ram", ram_size);
 
640
    memory_region_init_ram(ram, NULL, "mpc8544ds.ram", ram_size);
554
641
    vmstate_register_ram_global(ram);
555
642
    memory_region_add_subregion(address_space_mem, 0, ram);
556
643
 
563
650
    memory_region_add_subregion(address_space_mem, MPC8544_CCSRBAR_BASE,
564
651
                                ccsr_addr_space);
565
652
 
566
 
    /* MPIC */
567
 
    mpic = g_new(qemu_irq, 256);
568
 
    dev = qdev_create(NULL, "openpic");
569
 
    qdev_prop_set_uint32(dev, "nb_cpus", smp_cpus);
570
 
    qdev_prop_set_uint32(dev, "model", params->mpic_version);
571
 
    qdev_init_nofail(dev);
572
 
    s = SYS_BUS_DEVICE(dev);
573
 
 
574
 
    k = 0;
575
 
    for (i = 0; i < smp_cpus; i++) {
576
 
        for (j = 0; j < OPENPIC_OUTPUT_NB; j++) {
577
 
            sysbus_connect_irq(s, k++, irqs[i][j]);
578
 
        }
579
 
    }
580
 
 
581
 
    for (i = 0; i < 256; i++) {
582
 
        mpic[i] = qdev_get_gpio_in(dev, i);
583
 
    }
584
 
 
585
 
    memory_region_add_subregion(ccsr_addr_space, MPC8544_MPIC_REGS_OFFSET,
586
 
                                s->mmio[0].memory);
 
653
    mpic = ppce500_init_mpic(params, ccsr_addr_space, irqs);
587
654
 
588
655
    /* Serial */
589
656
    if (serial_hds[0]) {
626
693
    if (pci_bus) {
627
694
        /* Register network interfaces. */
628
695
        for (i = 0; i < nb_nics; i++) {
629
 
            pci_nic_init_nofail(&nd_table[i], "virtio", NULL);
 
696
            pci_nic_init_nofail(&nd_table[i], pci_bus, "virtio", NULL);
630
697
        }
631
698
    }
632
699
 
702
769
    PPCE500CCSRState *ccsr;
703
770
 
704
771
    ccsr = CCSR(dev);
705
 
    memory_region_init(&ccsr->ccsr_space, "e500-ccsr",
 
772
    memory_region_init(&ccsr->ccsr_space, OBJECT(ccsr), "e500-ccsr",
706
773
                       MPC8544_CCSRBAR_SIZE);
707
774
    return 0;
708
775
}