qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

raven.c (14369B)


      1 /*
      2  * QEMU PREP PCI host
      3  *
      4  * Copyright (c) 2006 Fabrice Bellard
      5  * Copyright (c) 2011-2013 Andreas Färber
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a copy
      8  * of this software and associated documentation files (the "Software"), to deal
      9  * in the Software without restriction, including without limitation the rights
     10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11  * copies of the Software, and to permit persons to whom the Software is
     12  * furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23  * THE SOFTWARE.
     24  */
     25 
     26 #include "qemu/osdep.h"
     27 #include "qemu/datadir.h"
     28 #include "qemu/units.h"
     29 #include "qemu/log.h"
     30 #include "qapi/error.h"
     31 #include "hw/pci/pci.h"
     32 #include "hw/pci/pci_bus.h"
     33 #include "hw/pci/pci_host.h"
     34 #include "hw/qdev-properties.h"
     35 #include "migration/vmstate.h"
     36 #include "hw/intc/i8259.h"
     37 #include "hw/irq.h"
     38 #include "hw/loader.h"
     39 #include "hw/or-irq.h"
     40 #include "elf.h"
     41 #include "qom/object.h"
     42 
     43 #define TYPE_RAVEN_PCI_DEVICE "raven"
     44 #define TYPE_RAVEN_PCI_HOST_BRIDGE "raven-pcihost"
     45 
     46 OBJECT_DECLARE_SIMPLE_TYPE(RavenPCIState, RAVEN_PCI_DEVICE)
     47 
     48 struct RavenPCIState {
     49     PCIDevice dev;
     50 
     51     uint32_t elf_machine;
     52     char *bios_name;
     53     MemoryRegion bios;
     54 };
     55 
     56 typedef struct PRePPCIState PREPPCIState;
     57 DECLARE_INSTANCE_CHECKER(PREPPCIState, RAVEN_PCI_HOST_BRIDGE,
     58                          TYPE_RAVEN_PCI_HOST_BRIDGE)
     59 
     60 struct PRePPCIState {
     61     PCIHostState parent_obj;
     62 
     63     qemu_or_irq *or_irq;
     64     qemu_irq pci_irqs[PCI_NUM_PINS];
     65     PCIBus pci_bus;
     66     AddressSpace pci_io_as;
     67     MemoryRegion pci_io;
     68     MemoryRegion pci_io_non_contiguous;
     69     MemoryRegion pci_memory;
     70     MemoryRegion pci_intack;
     71     MemoryRegion bm;
     72     MemoryRegion bm_ram_alias;
     73     MemoryRegion bm_pci_memory_alias;
     74     AddressSpace bm_as;
     75     RavenPCIState pci_dev;
     76 
     77     int contiguous_map;
     78     bool is_legacy_prep;
     79 };
     80 
     81 #define BIOS_SIZE (1 * MiB)
     82 
     83 #define PCI_IO_BASE_ADDR    0x80000000  /* Physical address on main bus */
     84 
     85 static inline uint32_t raven_pci_io_config(hwaddr addr)
     86 {
     87     int i;
     88 
     89     for (i = 0; i < 11; i++) {
     90         if ((addr & (1 << (11 + i))) != 0) {
     91             break;
     92         }
     93     }
     94     return (addr & 0x7ff) |  (i << 11);
     95 }
     96 
     97 static void raven_pci_io_write(void *opaque, hwaddr addr,
     98                                uint64_t val, unsigned int size)
     99 {
    100     PREPPCIState *s = opaque;
    101     PCIHostState *phb = PCI_HOST_BRIDGE(s);
    102     pci_data_write(phb->bus, raven_pci_io_config(addr), val, size);
    103 }
    104 
    105 static uint64_t raven_pci_io_read(void *opaque, hwaddr addr,
    106                                   unsigned int size)
    107 {
    108     PREPPCIState *s = opaque;
    109     PCIHostState *phb = PCI_HOST_BRIDGE(s);
    110     return pci_data_read(phb->bus, raven_pci_io_config(addr), size);
    111 }
    112 
    113 static const MemoryRegionOps raven_pci_io_ops = {
    114     .read = raven_pci_io_read,
    115     .write = raven_pci_io_write,
    116     .endianness = DEVICE_LITTLE_ENDIAN,
    117 };
    118 
    119 static uint64_t raven_intack_read(void *opaque, hwaddr addr,
    120                                   unsigned int size)
    121 {
    122     return pic_read_irq(isa_pic);
    123 }
    124 
    125 static void raven_intack_write(void *opaque, hwaddr addr,
    126                                         uint64_t data, unsigned size)
    127 {
    128     qemu_log_mask(LOG_UNIMP, "%s not implemented\n", __func__);
    129 }
    130 
    131 static const MemoryRegionOps raven_intack_ops = {
    132     .read = raven_intack_read,
    133     .write = raven_intack_write,
    134     .valid = {
    135         .max_access_size = 1,
    136     },
    137 };
    138 
    139 static inline hwaddr raven_io_address(PREPPCIState *s,
    140                                       hwaddr addr)
    141 {
    142     if (s->contiguous_map == 0) {
    143         /* 64 KB contiguous space for IOs */
    144         addr &= 0xFFFF;
    145     } else {
    146         /* 8 MB non-contiguous space for IOs */
    147         addr = (addr & 0x1F) | ((addr & 0x007FFF000) >> 7);
    148     }
    149 
    150     /* FIXME: handle endianness switch */
    151 
    152     return addr;
    153 }
    154 
    155 static uint64_t raven_io_read(void *opaque, hwaddr addr,
    156                               unsigned int size)
    157 {
    158     PREPPCIState *s = opaque;
    159     uint8_t buf[4];
    160 
    161     addr = raven_io_address(s, addr);
    162     address_space_read(&s->pci_io_as, addr + PCI_IO_BASE_ADDR,
    163                        MEMTXATTRS_UNSPECIFIED, buf, size);
    164 
    165     if (size == 1) {
    166         return buf[0];
    167     } else if (size == 2) {
    168         return lduw_le_p(buf);
    169     } else if (size == 4) {
    170         return ldl_le_p(buf);
    171     } else {
    172         g_assert_not_reached();
    173     }
    174 }
    175 
    176 static void raven_io_write(void *opaque, hwaddr addr,
    177                            uint64_t val, unsigned int size)
    178 {
    179     PREPPCIState *s = opaque;
    180     uint8_t buf[4];
    181 
    182     addr = raven_io_address(s, addr);
    183 
    184     if (size == 1) {
    185         buf[0] = val;
    186     } else if (size == 2) {
    187         stw_le_p(buf, val);
    188     } else if (size == 4) {
    189         stl_le_p(buf, val);
    190     } else {
    191         g_assert_not_reached();
    192     }
    193 
    194     address_space_write(&s->pci_io_as, addr + PCI_IO_BASE_ADDR,
    195                         MEMTXATTRS_UNSPECIFIED, buf, size);
    196 }
    197 
    198 static const MemoryRegionOps raven_io_ops = {
    199     .read = raven_io_read,
    200     .write = raven_io_write,
    201     .endianness = DEVICE_LITTLE_ENDIAN,
    202     .impl.max_access_size = 4,
    203     .valid.unaligned = true,
    204 };
    205 
    206 static int raven_map_irq(PCIDevice *pci_dev, int irq_num)
    207 {
    208     return (irq_num + (pci_dev->devfn >> 3)) & 1;
    209 }
    210 
    211 static void raven_set_irq(void *opaque, int irq_num, int level)
    212 {
    213     PREPPCIState *s = opaque;
    214 
    215     qemu_set_irq(s->pci_irqs[irq_num], level);
    216 }
    217 
    218 static AddressSpace *raven_pcihost_set_iommu(PCIBus *bus, void *opaque,
    219                                              int devfn)
    220 {
    221     PREPPCIState *s = opaque;
    222 
    223     return &s->bm_as;
    224 }
    225 
    226 static void raven_change_gpio(void *opaque, int n, int level)
    227 {
    228     PREPPCIState *s = opaque;
    229 
    230     s->contiguous_map = level;
    231 }
    232 
    233 static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
    234 {
    235     SysBusDevice *dev = SYS_BUS_DEVICE(d);
    236     PCIHostState *h = PCI_HOST_BRIDGE(dev);
    237     PREPPCIState *s = RAVEN_PCI_HOST_BRIDGE(dev);
    238     MemoryRegion *address_space_mem = get_system_memory();
    239     int i;
    240 
    241     if (s->is_legacy_prep) {
    242         for (i = 0; i < PCI_NUM_PINS; i++) {
    243             sysbus_init_irq(dev, &s->pci_irqs[i]);
    244         }
    245     } else {
    246         /* According to PReP specification section 6.1.6 "System Interrupt
    247          * Assignments", all PCI interrupts are routed via IRQ 15 */
    248         s->or_irq = OR_IRQ(object_new(TYPE_OR_IRQ));
    249         object_property_set_int(OBJECT(s->or_irq), "num-lines", PCI_NUM_PINS,
    250                                 &error_fatal);
    251         qdev_realize(DEVICE(s->or_irq), NULL, &error_fatal);
    252         sysbus_init_irq(dev, &s->or_irq->out_irq);
    253 
    254         for (i = 0; i < PCI_NUM_PINS; i++) {
    255             s->pci_irqs[i] = qdev_get_gpio_in(DEVICE(s->or_irq), i);
    256         }
    257     }
    258 
    259     qdev_init_gpio_in(d, raven_change_gpio, 1);
    260 
    261     pci_bus_irqs(&s->pci_bus, raven_set_irq, raven_map_irq, s, PCI_NUM_PINS);
    262 
    263     memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_le_ops, s,
    264                           "pci-conf-idx", 4);
    265     memory_region_add_subregion(&s->pci_io, 0xcf8, &h->conf_mem);
    266 
    267     memory_region_init_io(&h->data_mem, OBJECT(h), &pci_host_data_le_ops, s,
    268                           "pci-conf-data", 4);
    269     memory_region_add_subregion(&s->pci_io, 0xcfc, &h->data_mem);
    270 
    271     memory_region_init_io(&h->mmcfg, OBJECT(s), &raven_pci_io_ops, s,
    272                           "pciio", 0x00400000);
    273     memory_region_add_subregion(address_space_mem, 0x80800000, &h->mmcfg);
    274 
    275     memory_region_init_io(&s->pci_intack, OBJECT(s), &raven_intack_ops, s,
    276                           "pci-intack", 1);
    277     memory_region_add_subregion(address_space_mem, 0xbffffff0, &s->pci_intack);
    278 
    279     /* TODO Remove once realize propagates to child devices. */
    280     qdev_realize(DEVICE(&s->pci_dev), BUS(&s->pci_bus), errp);
    281 }
    282 
    283 static void raven_pcihost_initfn(Object *obj)
    284 {
    285     PCIHostState *h = PCI_HOST_BRIDGE(obj);
    286     PREPPCIState *s = RAVEN_PCI_HOST_BRIDGE(obj);
    287     MemoryRegion *address_space_mem = get_system_memory();
    288     DeviceState *pci_dev;
    289 
    290     memory_region_init(&s->pci_io, obj, "pci-io", 0x3f800000);
    291     memory_region_init_io(&s->pci_io_non_contiguous, obj, &raven_io_ops, s,
    292                           "pci-io-non-contiguous", 0x00800000);
    293     memory_region_init(&s->pci_memory, obj, "pci-memory", 0x3f000000);
    294     address_space_init(&s->pci_io_as, &s->pci_io, "raven-io");
    295 
    296     /* CPU address space */
    297     memory_region_add_subregion(address_space_mem, PCI_IO_BASE_ADDR,
    298                                 &s->pci_io);
    299     memory_region_add_subregion_overlap(address_space_mem, PCI_IO_BASE_ADDR,
    300                                         &s->pci_io_non_contiguous, 1);
    301     memory_region_add_subregion(address_space_mem, 0xc0000000, &s->pci_memory);
    302     pci_root_bus_init(&s->pci_bus, sizeof(s->pci_bus), DEVICE(obj), NULL,
    303                       &s->pci_memory, &s->pci_io, 0, TYPE_PCI_BUS);
    304 
    305     /* Bus master address space */
    306     memory_region_init(&s->bm, obj, "bm-raven", 4 * GiB);
    307     memory_region_init_alias(&s->bm_pci_memory_alias, obj, "bm-pci-memory",
    308                              &s->pci_memory, 0,
    309                              memory_region_size(&s->pci_memory));
    310     memory_region_init_alias(&s->bm_ram_alias, obj, "bm-system",
    311                              get_system_memory(), 0, 0x80000000);
    312     memory_region_add_subregion(&s->bm, 0         , &s->bm_pci_memory_alias);
    313     memory_region_add_subregion(&s->bm, 0x80000000, &s->bm_ram_alias);
    314     address_space_init(&s->bm_as, &s->bm, "raven-bm");
    315     pci_setup_iommu(&s->pci_bus, raven_pcihost_set_iommu, s);
    316 
    317     h->bus = &s->pci_bus;
    318 
    319     object_initialize(&s->pci_dev, sizeof(s->pci_dev), TYPE_RAVEN_PCI_DEVICE);
    320     pci_dev = DEVICE(&s->pci_dev);
    321     object_property_set_int(OBJECT(&s->pci_dev), "addr", PCI_DEVFN(0, 0),
    322                             NULL);
    323     qdev_prop_set_bit(pci_dev, "multifunction", false);
    324 }
    325 
    326 static void raven_realize(PCIDevice *d, Error **errp)
    327 {
    328     RavenPCIState *s = RAVEN_PCI_DEVICE(d);
    329     char *filename;
    330     int bios_size = -1;
    331 
    332     d->config[0x0C] = 0x08; // cache_line_size
    333     d->config[0x0D] = 0x10; // latency_timer
    334     d->config[0x34] = 0x00; // capabilities_pointer
    335 
    336     memory_region_init_rom_nomigrate(&s->bios, OBJECT(s), "bios", BIOS_SIZE,
    337                                      &error_fatal);
    338     memory_region_add_subregion(get_system_memory(), (uint32_t)(-BIOS_SIZE),
    339                                 &s->bios);
    340     if (s->bios_name) {
    341         filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, s->bios_name);
    342         if (filename) {
    343             if (s->elf_machine != EM_NONE) {
    344                 bios_size = load_elf(filename, NULL, NULL, NULL, NULL,
    345                                      NULL, NULL, NULL, 1, s->elf_machine,
    346                                      0, 0);
    347             }
    348             if (bios_size < 0) {
    349                 bios_size = get_image_size(filename);
    350                 if (bios_size > 0 && bios_size <= BIOS_SIZE) {
    351                     hwaddr bios_addr;
    352                     bios_size = (bios_size + 0xfff) & ~0xfff;
    353                     bios_addr = (uint32_t)(-BIOS_SIZE);
    354                     bios_size = load_image_targphys(filename, bios_addr,
    355                                                     bios_size);
    356                 }
    357             }
    358         }
    359         g_free(filename);
    360         if (bios_size < 0 || bios_size > BIOS_SIZE) {
    361             memory_region_del_subregion(get_system_memory(), &s->bios);
    362             error_setg(errp, "Could not load bios image '%s'", s->bios_name);
    363             return;
    364         }
    365     }
    366 
    367     vmstate_register_ram_global(&s->bios);
    368 }
    369 
    370 static const VMStateDescription vmstate_raven = {
    371     .name = "raven",
    372     .version_id = 0,
    373     .minimum_version_id = 0,
    374     .fields = (VMStateField[]) {
    375         VMSTATE_PCI_DEVICE(dev, RavenPCIState),
    376         VMSTATE_END_OF_LIST()
    377     },
    378 };
    379 
    380 static void raven_class_init(ObjectClass *klass, void *data)
    381 {
    382     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
    383     DeviceClass *dc = DEVICE_CLASS(klass);
    384 
    385     k->realize = raven_realize;
    386     k->vendor_id = PCI_VENDOR_ID_MOTOROLA;
    387     k->device_id = PCI_DEVICE_ID_MOTOROLA_RAVEN;
    388     k->revision = 0x00;
    389     k->class_id = PCI_CLASS_BRIDGE_HOST;
    390     dc->desc = "PReP Host Bridge - Motorola Raven";
    391     dc->vmsd = &vmstate_raven;
    392     /*
    393      * Reason: PCI-facing part of the host bridge, not usable without
    394      * the host-facing part, which can't be device_add'ed, yet.
    395      */
    396     dc->user_creatable = false;
    397 }
    398 
    399 static const TypeInfo raven_info = {
    400     .name = TYPE_RAVEN_PCI_DEVICE,
    401     .parent = TYPE_PCI_DEVICE,
    402     .instance_size = sizeof(RavenPCIState),
    403     .class_init = raven_class_init,
    404     .interfaces = (InterfaceInfo[]) {
    405         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
    406         { },
    407     },
    408 };
    409 
    410 static Property raven_pcihost_properties[] = {
    411     DEFINE_PROP_UINT32("elf-machine", PREPPCIState, pci_dev.elf_machine,
    412                        EM_NONE),
    413     DEFINE_PROP_STRING("bios-name", PREPPCIState, pci_dev.bios_name),
    414     /* Temporary workaround until legacy prep machine is removed */
    415     DEFINE_PROP_BOOL("is-legacy-prep", PREPPCIState, is_legacy_prep,
    416                      false),
    417     DEFINE_PROP_END_OF_LIST()
    418 };
    419 
    420 static void raven_pcihost_class_init(ObjectClass *klass, void *data)
    421 {
    422     DeviceClass *dc = DEVICE_CLASS(klass);
    423 
    424     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
    425     dc->realize = raven_pcihost_realizefn;
    426     device_class_set_props(dc, raven_pcihost_properties);
    427     dc->fw_name = "pci";
    428 }
    429 
    430 static const TypeInfo raven_pcihost_info = {
    431     .name = TYPE_RAVEN_PCI_HOST_BRIDGE,
    432     .parent = TYPE_PCI_HOST_BRIDGE,
    433     .instance_size = sizeof(PREPPCIState),
    434     .instance_init = raven_pcihost_initfn,
    435     .class_init = raven_pcihost_class_init,
    436 };
    437 
    438 static void raven_register_types(void)
    439 {
    440     type_register_static(&raven_pcihost_info);
    441     type_register_static(&raven_info);
    442 }
    443 
    444 type_init(raven_register_types)