From: "Michael S. Tsirkin" <mst@redhat.com>
To: Marcel Apfelbaum <marcel@redhat.com>
Cc: kraxel@redhat.com, quintela@redhat.com, qemu-devel@nongnu.org,
agraf@suse.de, alex.williamson@redhat.com, kevin@koconnor.net,
hare@suse.de, imammedo@redhat.com, amit.shah@redhat.com,
pbonzini@redhat.com, leon.alrae@imgtec.com, aurelien@aurel32.net,
rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH V6 for-2.3 09/26] hw/pci: move pci bus related code to separate files
Date: Mon, 27 Apr 2015 13:14:16 +0200 [thread overview]
Message-ID: <20150427130801-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1426791181-23831-10-git-send-email-marcel@redhat.com>
On Thu, Mar 19, 2015 at 08:52:44PM +0200, Marcel Apfelbaum wrote:
> @@ -2414,7 +1945,6 @@ static const TypeInfo pci_device_type_info = {
>
> static void pci_register_types(void)
> {
> - type_register_static(&pci_bus_info);
> type_register_static(&pcie_bus_info);
> type_register_static(&pci_device_type_info);
> }
So pcie bus is not moved. This seems pretty inconsistent.
> diff --git a/hw/pci/pci_bus.c b/hw/pci/pci_bus.c
> new file mode 100644
> index 0000000..d156194
> --- /dev/null
> +++ b/hw/pci/pci_bus.c
> @@ -0,0 +1,491 @@
> +/*
> + * PCI Bus
> + *
> + * Copyright (C) 2014 Red Hat Inc
It's 2015 isn't it?
> + *
> + * Authors:
> + * Marcel Apfelbaum <marcel.a@redhat.com> (split out from pci.c)
You don't become the only Author just by moving code around.
Better drop this line.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
The file you are moving this from is GPL only.
You will need to find who contributed this code you are moving
and get ack from them ...
> + */
> +#include "hw/pci/pci.h"
> +#include "hw/pci/pci_bus.h"
> +#include "hw/pci/pci_bridge.h"
> +#include "monitor/monitor.h"
> +
> +typedef struct {
> + uint16_t class;
> + const char *desc;
> + const char *fw_name;
> + uint16_t fw_ign_bits;
> +} pci_class_desc;
> +
> +static const pci_class_desc pci_class_descriptions[] = {
> + { 0x0001, "VGA controller", "display"},
> + { 0x0100, "SCSI controller", "scsi"},
> + { 0x0101, "IDE controller", "ide"},
> + { 0x0102, "Floppy controller", "fdc"},
> + { 0x0103, "IPI controller", "ipi"},
> + { 0x0104, "RAID controller", "raid"},
> + { 0x0106, "SATA controller"},
> + { 0x0107, "SAS controller"},
> + { 0x0180, "Storage controller"},
> + { 0x0200, "Ethernet controller", "ethernet"},
> + { 0x0201, "Token Ring controller", "token-ring"},
> + { 0x0202, "FDDI controller", "fddi"},
> + { 0x0203, "ATM controller", "atm"},
> + { 0x0280, "Network controller"},
> + { 0x0300, "VGA controller", "display", 0x00ff},
> + { 0x0301, "XGA controller"},
> + { 0x0302, "3D controller"},
> + { 0x0380, "Display controller"},
> + { 0x0400, "Video controller", "video"},
> + { 0x0401, "Audio controller", "sound"},
> + { 0x0402, "Phone"},
> + { 0x0403, "Audio controller", "sound"},
> + { 0x0480, "Multimedia controller"},
> + { 0x0500, "RAM controller", "memory"},
> + { 0x0501, "Flash controller", "flash"},
> + { 0x0580, "Memory controller"},
> + { 0x0600, "Host bridge", "host"},
> + { 0x0601, "ISA bridge", "isa"},
> + { 0x0602, "EISA bridge", "eisa"},
> + { 0x0603, "MC bridge", "mca"},
> + { 0x0604, "PCI bridge", "pci-bridge"},
> + { 0x0605, "PCMCIA bridge", "pcmcia"},
> + { 0x0606, "NUBUS bridge", "nubus"},
> + { 0x0607, "CARDBUS bridge", "cardbus"},
> + { 0x0608, "RACEWAY bridge"},
> + { 0x0680, "Bridge"},
> + { 0x0700, "Serial port", "serial"},
> + { 0x0701, "Parallel port", "parallel"},
> + { 0x0800, "Interrupt controller", "interrupt-controller"},
> + { 0x0801, "DMA controller", "dma-controller"},
> + { 0x0802, "Timer", "timer"},
> + { 0x0803, "RTC", "rtc"},
> + { 0x0900, "Keyboard", "keyboard"},
> + { 0x0901, "Pen", "pen"},
> + { 0x0902, "Mouse", "mouse"},
> + { 0x0A00, "Dock station", "dock", 0x00ff},
> + { 0x0B00, "i386 cpu", "cpu", 0x00ff},
> + { 0x0c00, "Fireware contorller", "fireware"},
> + { 0x0c01, "Access bus controller", "access-bus"},
> + { 0x0c02, "SSA controller", "ssa"},
> + { 0x0c03, "USB controller", "usb"},
> + { 0x0c04, "Fibre channel controller", "fibre-channel"},
> + { 0x0c05, "SMBus"},
> + { 0, NULL}
> +};
> +
> +/* Whether a given bus number is in range of the secondary
> + * bus of the given bridge device. */
> +static bool pci_secondary_bus_in_range(PCIDevice *dev, int bus_num)
> +{
> + return !(pci_get_word(dev->config + PCI_BRIDGE_CONTROL) &
> + PCI_BRIDGE_CTL_BUS_RESET) /* Don't walk the bus if it's reset. */ &&
> + dev->config[PCI_SECONDARY_BUS] < bus_num &&
> + bus_num <= dev->config[PCI_SUBORDINATE_BUS];
> +}
> +
> +PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num)
> +{
> + PCIBus *sec;
> +
> + if (!bus) {
> + return NULL;
> + }
> +
> + if (pci_bus_num(bus) == bus_num) {
> + return bus;
> + }
> +
> + /* Consider all bus numbers in range for the host pci bridge. */
> + if (!pci_bus_is_root(bus) &&
> + !pci_secondary_bus_in_range(bus->parent_dev, bus_num)) {
> + return NULL;
> + }
> +
> + /* try child bus */
> + for (; bus; bus = sec) {
> + QLIST_FOREACH(sec, &bus->child, sibling) {
> + assert(!pci_bus_is_root(sec));
> + if (sec->parent_dev->config[PCI_SECONDARY_BUS] == bus_num) {
> + return sec;
> + }
> + if (pci_secondary_bus_in_range(sec->parent_dev, bus_num)) {
> + break;
> + }
> + }
> + }
> +
> + return NULL;
> +}
> +
> +static const pci_class_desc *get_class_desc(int class)
> +{
> + const pci_class_desc *desc;
> +
> + desc = pci_class_descriptions;
> + while (desc->desc && class != desc->class) {
> + desc++;
> + }
> +
> + return desc;
> +}
> +
> +static PciMemoryRegionList *qmp_query_pci_regions(const PCIDevice *dev)
> +{
> + PciMemoryRegionList *head = NULL, *cur_item = NULL;
> + int i;
> +
> + for (i = 0; i < PCI_NUM_REGIONS; i++) {
> + const PCIIORegion *r = &dev->io_regions[i];
> + PciMemoryRegionList *region;
> +
> + if (!r->size) {
> + continue;
> + }
> +
> + region = g_malloc0(sizeof(*region));
> + region->value = g_malloc0(sizeof(*region->value));
> +
> + if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
> + region->value->type = g_strdup("io");
> + } else {
> + region->value->type = g_strdup("memory");
> + region->value->has_prefetch = true;
> + region->value->prefetch = !!(r->type & PCI_BASE_ADDRESS_MEM_PREFETCH);
> + region->value->has_mem_type_64 = true;
> + region->value->mem_type_64 = !!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64);
> + }
> +
> + region->value->bar = i;
> + region->value->address = r->addr;
> + region->value->size = r->size;
> +
> + /* XXX: waiting for the qapi to support GSList */
> + if (!cur_item) {
> + head = cur_item = region;
> + } else {
> + cur_item->next = region;
> + cur_item = region;
> + }
> + }
> +
> + return head;
> +}
> +
> +static PciBridgeInfo *qmp_query_pci_bridge(PCIDevice *dev, PCIBus *bus,
> + int bus_num)
> +{
> + PciBridgeInfo *info;
> +
> + info = g_malloc0(sizeof(*info));
> +
> + info->bus.number = dev->config[PCI_PRIMARY_BUS];
> + info->bus.secondary = dev->config[PCI_SECONDARY_BUS];
> + info->bus.subordinate = dev->config[PCI_SUBORDINATE_BUS];
> +
> + info->bus.io_range = g_malloc0(sizeof(*info->bus.io_range));
> + info->bus.io_range->base = pci_bridge_get_base(dev,
> + PCI_BASE_ADDRESS_SPACE_IO);
> + info->bus.io_range->limit =
> + pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO);
> +
> + info->bus.memory_range = g_malloc0(sizeof(*info->bus.memory_range));
> + info->bus.memory_range->base =
> + pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
> + info->bus.memory_range->limit =
> + pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
> +
> + info->bus.prefetchable_range =
> + g_malloc0(sizeof(*info->bus.prefetchable_range));
> + info->bus.prefetchable_range->base =
> + pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
> + info->bus.prefetchable_range->limit =
> + pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
> +
> + if (dev->config[PCI_SECONDARY_BUS] != 0) {
> + PCIBus *child_bus = pci_find_bus_nr(bus, dev->config[PCI_SECONDARY_BUS]);
> + if (child_bus) {
> + info->has_devices = true;
> + info->devices = qmp_query_pci_devices(child_bus,
> + dev->config[PCI_SECONDARY_BUS]);
> + }
> + }
> +
> + return info;
> +}
> +
> +static PciDeviceInfo *qmp_query_pci_device(PCIDevice *dev, PCIBus *bus,
> + int bus_num)
> +{
> + const pci_class_desc *desc;
> + PciDeviceInfo *info;
> + uint8_t type;
> + int class;
> +
> + info = g_malloc0(sizeof(*info));
> + info->bus = bus_num;
> + info->slot = PCI_SLOT(dev->devfn);
> + info->function = PCI_FUNC(dev->devfn);
> +
> + class = pci_get_word(dev->config + PCI_CLASS_DEVICE);
> + info->class_info.q_class = class;
> + desc = get_class_desc(class);
> + if (desc->desc) {
> + info->class_info.has_desc = true;
> + info->class_info.desc = g_strdup(desc->desc);
> + }
> +
> + info->id.vendor = pci_get_word(dev->config + PCI_VENDOR_ID);
> + info->id.device = pci_get_word(dev->config + PCI_DEVICE_ID);
> + info->regions = qmp_query_pci_regions(dev);
> + info->qdev_id = g_strdup(dev->qdev.id ? dev->qdev.id : "");
> +
> + if (dev->config[PCI_INTERRUPT_PIN] != 0) {
> + info->has_irq = true;
> + info->irq = dev->config[PCI_INTERRUPT_LINE];
> + }
> +
> + type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
> + if (type == PCI_HEADER_TYPE_BRIDGE) {
> + info->has_pci_bridge = true;
> + info->pci_bridge = qmp_query_pci_bridge(dev, bus, bus_num);
> + }
> +
> + return info;
> +}
> +
> +PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num)
> +{
> + PciDeviceInfoList *info, *head = NULL, *cur_item = NULL;
> + PCIDevice *dev;
> + int devfn;
> +
> + for (devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
> + dev = bus->devices[devfn];
> + if (dev) {
> + info = g_malloc0(sizeof(*info));
> + info->value = qmp_query_pci_device(dev, bus, bus_num);
> +
> + /* XXX: waiting for the qapi to support GSList */
> + if (!cur_item) {
> + head = cur_item = info;
> + } else {
> + cur_item->next = info;
> + cur_item = info;
> + }
> + }
> + }
> +
> + return head;
> +}
> +
> +
> +static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
> +{
> + PCIDevice *d = (PCIDevice *)dev;
> + const pci_class_desc *desc;
> + char ctxt[64];
> + PCIIORegion *r;
> + int i, class;
> +
> + class = pci_get_word(d->config + PCI_CLASS_DEVICE);
> + desc = pci_class_descriptions;
> + while (desc->desc && class != desc->class) {
> + desc++;
> + }
> + if (desc->desc) {
> + snprintf(ctxt, sizeof(ctxt), "%s", desc->desc);
> + } else {
> + snprintf(ctxt, sizeof(ctxt), "Class %04x", class);
> + }
> +
> + monitor_printf(mon, "%*sclass %s, addr %02x:%02x.%x, "
> + "pci id %04x:%04x (sub %04x:%04x)\n",
> + indent, "", ctxt, pci_bus_num(d->bus),
> + PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> + pci_get_word(d->config + PCI_VENDOR_ID),
> + pci_get_word(d->config + PCI_DEVICE_ID),
> + pci_get_word(d->config + PCI_SUBSYSTEM_VENDOR_ID),
> + pci_get_word(d->config + PCI_SUBSYSTEM_ID));
> + for (i = 0; i < PCI_NUM_REGIONS; i++) {
> + r = &d->io_regions[i];
> + if (!r->size) {
> + continue;
> + }
> + monitor_printf(mon, "%*sbar %d: %s at 0x%"FMT_PCIBUS
> + " [0x%"FMT_PCIBUS"]\n",
> + indent, "",
> + i, r->type & PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
> + r->addr, r->addr + r->size - 1);
> + }
> +}
> +
> +static char *pcibus_get_dev_path(DeviceState *dev)
> +{
> + PCIDevice *d = container_of(dev, PCIDevice, qdev);
> + PCIDevice *t;
> + int slot_depth;
> + /* Path format: Domain:00:Slot.Function:Slot.Function....:Slot.Function.
> + * 00 is added here to make this format compatible with
> + * domain:Bus:Slot.Func for systems without nested PCI bridges.
> + * Slot.Function list specifies the slot and function numbers for all
> + * devices on the path from root to the specific device. */
> + const char *root_bus_path;
> + int root_bus_len;
> + char slot[] = ":SS.F";
> + int slot_len = sizeof slot - 1 /* For '\0' */;
> + int path_len;
> + char *path, *p;
> + int s;
> +
> + root_bus_path = pci_root_bus_path(d);
> + root_bus_len = strlen(root_bus_path);
> +
> + /* Calculate # of slots on path between device and root. */;
> + slot_depth = 0;
> + for (t = d; t; t = t->bus->parent_dev) {
> + ++slot_depth;
> + }
> +
> + path_len = root_bus_len + slot_len * slot_depth;
> +
> + /* Allocate memory, fill in the terminating null byte. */
> + path = g_malloc(path_len + 1 /* For '\0' */);
> + path[path_len] = '\0';
> +
> + memcpy(path, root_bus_path, root_bus_len);
> +
> + /* Fill in slot numbers. We walk up from device to root, so need to print
> + * them in the reverse order, last to first. */
> + p = path + path_len;
> + for (t = d; t; t = t->bus->parent_dev) {
> + p -= slot_len;
> + s = snprintf(slot, sizeof slot, ":%02x.%x",
> + PCI_SLOT(t->devfn), PCI_FUNC(t->devfn));
> + assert(s == slot_len);
> + memcpy(p, slot, slot_len);
> + }
> +
> + return path;
> +}
> +
> +static char *pci_dev_fw_name(DeviceState *dev, char *buf, int len)
> +{
> + PCIDevice *d = (PCIDevice *)dev;
> + const char *name = NULL;
> + const pci_class_desc *desc = pci_class_descriptions;
> + int class = pci_get_word(d->config + PCI_CLASS_DEVICE);
> +
> + while (desc->desc &&
> + (class & ~desc->fw_ign_bits) !=
> + (desc->class & ~desc->fw_ign_bits)) {
> + desc++;
> + }
> +
> + if (desc->desc) {
> + name = desc->fw_name;
> + }
> +
> + if (name) {
> + pstrcpy(buf, len, name);
> + } else {
> + snprintf(buf, len, "pci%04x,%04x",
> + pci_get_word(d->config + PCI_VENDOR_ID),
> + pci_get_word(d->config + PCI_DEVICE_ID));
> + }
> +
> + return buf;
> +}
> +
> +static char *pcibus_get_fw_dev_path(DeviceState *dev)
> +{
> + PCIDevice *d = (PCIDevice *)dev;
> + char path[50], name[33];
> + int off;
> +
> + off = snprintf(path, sizeof(path), "%s@%x",
> + pci_dev_fw_name(dev, name, sizeof name),
> + PCI_SLOT(d->devfn));
> + if (PCI_FUNC(d->devfn)) {
> + snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn));
> + }
> + return g_strdup(path);
> +}
> +
> +static const VMStateDescription vmstate_pcibus = {
> + .name = "PCIBUS",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .fields = (VMStateField[]) {
> + VMSTATE_INT32_EQUAL(nirq, PCIBus),
> + VMSTATE_VARRAY_INT32(irq_count, PCIBus,
> + nirq, 0, vmstate_info_int32,
> + int32_t),
> + VMSTATE_END_OF_LIST()
> + }
> +};
> +
> +static void pci_bus_realize(BusState *qbus, Error **errp)
> +{
> + PCIBus *bus = PCI_BUS(qbus);
> +
> + vmstate_register(NULL, -1, &vmstate_pcibus, bus);
> +}
> +
> +static void pci_bus_unrealize(BusState *qbus, Error **errp)
> +{
> + PCIBus *bus = PCI_BUS(qbus);
> +
> + vmstate_unregister(NULL, &vmstate_pcibus, bus);
> +}
> +
> +/*
> + * Trigger pci bus reset under a given bus.
> + * Called via qbus_reset_all on RST# assert, after the devices
> + * have been reset qdev_reset_all-ed already.
> + */
> +static void pcibus_reset(BusState *qbus)
> +{
> + PCIBus *bus = DO_UPCAST(PCIBus, qbus, qbus);
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
> + if (bus->devices[i]) {
> + pci_do_device_reset(bus->devices[i]);
> + }
> + }
> +
> + for (i = 0; i < bus->nirq; i++) {
> + assert(bus->irq_count[i] == 0);
> + }
> +}
> +
> +static void pci_bus_class_init(ObjectClass *klass, void *data)
> +{
> + BusClass *k = BUS_CLASS(klass);
> +
> + k->print_dev = pcibus_dev_print;
> + k->get_dev_path = pcibus_get_dev_path;
> + k->get_fw_dev_path = pcibus_get_fw_dev_path;
> + k->realize = pci_bus_realize;
> + k->unrealize = pci_bus_unrealize;
> + k->reset = pcibus_reset;
> +}
> +
> +static const TypeInfo pci_bus_info = {
> + .name = TYPE_PCI_BUS,
> + .parent = TYPE_BUS,
> + .instance_size = sizeof(PCIBus),
> + .class_init = pci_bus_class_init,
> +};
> +
> +static void pci_bus_register_types(void)
> +{
> + type_register_static(&pci_bus_info);
> +}
> +
> +type_init(pci_bus_register_types)
> diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
> index 0bb3cdb..f5847bc 100644
> --- a/hw/ppc/ppc4xx_pci.c
> +++ b/hw/ppc/ppc4xx_pci.c
> @@ -23,6 +23,7 @@
> #include "hw/ppc/ppc.h"
> #include "hw/ppc/ppc4xx.h"
> #include "hw/pci/pci.h"
> +#include "hw/pci/pci_bus.h"
> #include "hw/pci/pci_host.h"
> #include "exec/address-spaces.h"
>
> diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
> index d1d0847..8dd2ce3 100644
> --- a/hw/sh4/r2d.c
> +++ b/hw/sh4/r2d.c
> @@ -30,6 +30,7 @@
> #include "sysemu/sysemu.h"
> #include "hw/boards.h"
> #include "hw/pci/pci.h"
> +#include "hw/pci/pci_bus.h"
> #include "net/net.h"
> #include "sh7750_regs.h"
> #include "hw/ide.h"
> diff --git a/hw/sh4/sh_pci.c b/hw/sh4/sh_pci.c
> index a2f6d9e..f02e998 100644
> --- a/hw/sh4/sh_pci.c
> +++ b/hw/sh4/sh_pci.c
> @@ -24,6 +24,7 @@
> #include "hw/sysbus.h"
> #include "hw/sh4/sh.h"
> #include "hw/pci/pci.h"
> +#include "hw/pci/pci_bus.h"
> #include "hw/pci/pci_host.h"
> #include "qemu/bswap.h"
> #include "exec/address-spaces.h"
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index be2d9b8..47077cd 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -337,8 +337,6 @@ typedef void (*pci_set_irq_fn)(void *opaque, int irq_num, int level);
> typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num);
> typedef PCIINTxRoute (*pci_route_irq_fn)(void *opaque, int pin);
>
> -#define TYPE_PCI_BUS "PCI"
> -#define PCI_BUS(obj) OBJECT_CHECK(PCIBus, (obj), TYPE_PCI_BUS)
> #define TYPE_PCIE_BUS "PCIE"
>
> bool pci_bus_is_express(PCIBus *bus);
> @@ -370,6 +368,7 @@ void pci_bus_fire_intx_routing_notifier(PCIBus *bus);
> void pci_device_set_intx_routing_notifier(PCIDevice *dev,
> PCIINTxRoutingNotifier notifier);
> void pci_device_reset(PCIDevice *dev);
> +void pci_do_device_reset(PCIDevice *dev);
I don't like it that there are two reset functions now.
>
> PCIDevice *pci_nic_init_nofail(NICInfo *nd, PCIBus *rootbus,
> const char *default_model,
> diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h
> index fabaeee..ea427a3 100644
> --- a/include/hw/pci/pci_bus.h
> +++ b/include/hw/pci/pci_bus.h
> @@ -1,6 +1,8 @@
> #ifndef QEMU_PCI_BUS_H
> #define QEMU_PCI_BUS_H
>
> +#include "hw/pci/pci.h"
> +
> /*
> * PCI Bus and Bridge datastructures.
> *
> @@ -8,6 +10,12 @@
> * use accessor functions in pci.h, pci_bridge.h
> */
>
> +PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
> +PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num);
> +
> +#define TYPE_PCI_BUS "PCI"
> +#define PCI_BUS(obj) OBJECT_CHECK(PCIBus, (obj), TYPE_PCI_BUS)
> +
> struct PCIBus {
> BusState qbus;
> PCIIOMMUFunc iommu_fn;
Can we drop this patch, do refactoring on top later?
> --
> 2.1.0
next prev parent reply other threads:[~2015-04-27 11:14 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-19 18:52 [Qemu-devel] [PATCH V6 for-2.3 00/26] hw/pc: implement multiple primary busses for pc machines Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 01/26] acpi: add aml_or() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 02/26] acpi: add aml_add() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 03/26] acpi: add aml_lless() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 04/26] acpi: add aml_index() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 05/26] acpi: add aml_shiftleft() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 06/26] acpi: add aml_shiftright() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 07/26] acpi: add aml_increment() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 08/26] acpi: add aml_while() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 09/26] hw/pci: move pci bus related code to separate files Marcel Apfelbaum
2015-04-27 11:14 ` Michael S. Tsirkin [this message]
2015-04-27 11:35 ` Paolo Bonzini
2015-04-27 11:49 ` Marcel Apfelbaum
2015-04-27 12:24 ` Michael S. Tsirkin
2015-04-28 7:31 ` Markus Armbruster
2015-04-28 8:25 ` Marcel Apfelbaum
2015-04-27 12:26 ` Marcel Apfelbaum
2015-04-28 8:30 ` Michael S. Tsirkin
2015-04-28 8:30 ` Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 10/26] hw/pci: made pci_bus_is_root a PCIBusClass method Marcel Apfelbaum
2015-04-27 11:37 ` Michael S. Tsirkin
2015-04-27 11:49 ` Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 11/26] hw/pci: made pci_bus_num " Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 12/26] hw/pci: introduce TYPE_PCI_MAIN_HOST_BRIDGE interface Marcel Apfelbaum
2015-04-27 11:24 ` Michael S. Tsirkin
2015-04-27 12:30 ` Marcel Apfelbaum
2015-04-27 12:48 ` Michael S. Tsirkin
2015-04-27 13:04 ` Marcel Apfelbaum
2015-04-27 20:54 ` Michael S. Tsirkin
2015-04-28 8:33 ` Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 13/26] hw/pci-host: introduce TYPE_PCI_HOST_BRIDGE_SNOOPED interface Marcel Apfelbaum
2015-04-27 12:14 ` Michael S. Tsirkin
2015-04-27 13:01 ` Marcel Apfelbaum
2015-04-27 14:45 ` Michael S. Tsirkin
2015-04-28 8:39 ` Marcel Apfelbaum
2015-04-28 8:43 ` Michael S. Tsirkin
2015-04-28 10:21 ` Marcel Apfelbaum
2015-04-28 10:44 ` Michael S. Tsirkin
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 14/26] hw/pci-host/piix: implement " Marcel Apfelbaum
2015-04-27 12:23 ` Michael S. Tsirkin
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 15/26] hw/acpi: add support for i440fx 'snooping' root busses Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 16/26] hw/apci: add _PRT method for extra PCI " Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 17/26] hw/acpi: add _CRS method for extra " Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 18/26] hw/acpi: remove from root bus 0 the crs resources used by other busses Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 19/26] hw/pci: removed 'rootbus nr is 0' assumption from qmp_pci_query Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 20/26] hw/pci: introduce PCI Expander Bridge (PXB) Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 21/26] hw/pci: inform bios if the system has extra pci root buses Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 22/26] hw/pxb: add map_irq func Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 23/26] hw/pci_bus: add support for NUMA nodes Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 24/26] hw/pxb: add numa_node parameter Marcel Apfelbaum
2015-03-19 18:53 ` [Qemu-devel] [PATCH V6 for-2.3 25/26] apci: fix PXB behaviour if used with unsupported BIOS Marcel Apfelbaum
2015-04-27 11:19 ` Michael S. Tsirkin
2015-04-27 11:51 ` Gerd Hoffmann
2015-03-19 18:53 ` [Qemu-devel] [PATCH V6 for-2.3 26/26] docs: Add PXB documentation Marcel Apfelbaum
2015-03-19 21:45 ` [Qemu-devel] [PATCH V6 for-2.3 00/26] hw/pc: implement multiple primary busses for pc machines Paolo Bonzini
2015-03-20 8:37 ` Marcel Apfelbaum
2015-03-20 17:56 ` Paolo Bonzini
2015-03-20 18:07 ` Peter Maydell
2015-03-20 7:44 ` Gerd Hoffmann
2015-03-20 8:25 ` Marcel Apfelbaum
2015-03-21 18:49 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150427130801-mutt-send-email-mst@redhat.com \
--to=mst@redhat.com \
--cc=agraf@suse.de \
--cc=alex.williamson@redhat.com \
--cc=amit.shah@redhat.com \
--cc=aurelien@aurel32.net \
--cc=hare@suse.de \
--cc=imammedo@redhat.com \
--cc=kevin@koconnor.net \
--cc=kraxel@redhat.com \
--cc=leon.alrae@imgtec.com \
--cc=marcel@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.