From: Laurent Vivier <lvivier@redhat.com>
To: Alexander Graf <agraf@suse.de>
Cc: qemu-devel@nongnu.org, David Gibson <david@gibson.dropbear.id.au>,
qemu-ppc@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCH v3] pci: allow 0 address for PCI IO/MEM regions
Date: Mon, 27 Jul 2015 10:19:43 +0200 [thread overview]
Message-ID: <55B5E99F.5090901@redhat.com> (raw)
In-Reply-To: <1437726913-4534-1-git-send-email-lvivier@redhat.com>
Alex,
could you ACK this patch ?
It's not perfect and it will be removed later, but for the moment it
allows to hotplug PCI card in pseries.
Laurent
On 24/07/2015 10:35, Laurent Vivier wrote:
> Some kernels program a 0 address for io regions. PCI 3.0 spec
> section 6.2.5.1 doesn't seem to disallow this.
>
> based on patch by Michael Roth <mdroth@linux.vnet.ibm.com>
>
> Add pci_allow_0_addr in MachineClass to conditionally
> allow addr 0 for pseries, as this can break other architectures.
>
> This patch allows to hotplug PCI card in pseries machine, as the first
> added card BAR0 is always set to 0 address.
>
> This as a temporary hack, waiting to fix PCI memory priorities for more
> machine types...
>
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
> v2: move flag from PCIBus to MachineClass, rename it pci_allow_0_address
> v3: change author, update commit message.
> hw/pci/pci.c | 12 +++++++++---
> hw/ppc/spapr.c | 1 +
> include/hw/boards.h | 3 ++-
> 3 files changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index a017614..9f57aea 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -38,6 +38,7 @@
> #include "hw/pci/msix.h"
> #include "exec/address-spaces.h"
> #include "hw/hotplug.h"
> +#include "hw/boards.h"
>
> //#define DEBUG_PCI
> #ifdef DEBUG_PCI
> @@ -1065,6 +1066,10 @@ static pcibus_t pci_bar_address(PCIDevice *d,
> pcibus_t new_addr, last_addr;
> int bar = pci_bar(d, reg);
> uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
> + Object *machine = qdev_get_machine();
> + ObjectClass *oc = object_get_class(machine);
> + MachineClass *mc = MACHINE_CLASS(oc);
> + bool allow_0_address = mc->pci_allow_0_address;
>
> if (type & PCI_BASE_ADDRESS_SPACE_IO) {
> if (!(cmd & PCI_COMMAND_IO)) {
> @@ -1075,7 +1080,8 @@ static pcibus_t pci_bar_address(PCIDevice *d,
> /* Check if 32 bit BAR wraps around explicitly.
> * TODO: make priorities correct and remove this work around.
> */
> - if (last_addr <= new_addr || new_addr == 0 || last_addr >= UINT32_MAX) {
> + if (last_addr <= new_addr || last_addr >= UINT32_MAX ||
> + (!allow_0_address && new_addr == 0)) {
> return PCI_BAR_UNMAPPED;
> }
> return new_addr;
> @@ -1099,8 +1105,8 @@ static pcibus_t pci_bar_address(PCIDevice *d,
> /* XXX: as we cannot support really dynamic
> mappings, we handle specific values as invalid
> mappings. */
> - if (last_addr <= new_addr || new_addr == 0 ||
> - last_addr == PCI_BAR_UNMAPPED) {
> + if (last_addr <= new_addr || last_addr == PCI_BAR_UNMAPPED ||
> + (!allow_0_address && new_addr == 0)) {
> return PCI_BAR_UNMAPPED;
> }
>
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index a6f1947..bf0c64f 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1835,6 +1835,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
> mc->default_ram_size = 512 * M_BYTE;
> mc->kvm_type = spapr_kvm_type;
> mc->has_dynamic_sysbus = true;
> + mc->pci_allow_0_address = true;
>
> fwc->get_dev_path = spapr_get_fw_dev_path;
> nc->nmi_monitor_handler = spapr_nmi;
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 2aec9cb..3f84afd 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -100,7 +100,8 @@ struct MachineClass {
> no_cdrom:1,
> no_sdcard:1,
> has_dynamic_sysbus:1,
> - no_tco:1;
> + no_tco:1,
> + pci_allow_0_address:1;
> int is_default;
> const char *default_machine_opts;
> const char *default_boot_order;
>
next prev parent reply other threads:[~2015-07-27 8:19 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1437566099-10004-1-git-send-email-lvivier@redhat.com>
2015-07-23 18:24 ` [Qemu-devel] [PATCH v2] pci: allow 0 address for PCI IO/MEM regions Laurent Vivier
2015-07-23 18:30 ` Michael S. Tsirkin
2015-07-23 20:48 ` [Qemu-devel] [Qemu-ppc] " Benjamin Herrenschmidt
2015-07-23 21:18 ` Michael S. Tsirkin
2015-07-23 20:46 ` Benjamin Herrenschmidt
2015-07-23 21:00 ` Peter Maydell
2015-07-23 21:10 ` Michael S. Tsirkin
2015-07-23 21:19 ` Peter Maydell
2015-07-23 21:24 ` Peter Maydell
2015-07-23 21:38 ` Michael Roth
2015-07-23 21:49 ` Michael Roth
2015-07-24 8:46 ` Peter Maydell
2015-07-24 8:58 ` Laurent Vivier
2015-07-23 21:46 ` Benjamin Herrenschmidt
2015-07-23 22:42 ` Michael S. Tsirkin
2015-07-24 8:35 ` [Qemu-devel] [PATCH v3] " Laurent Vivier
2015-07-27 8:19 ` Laurent Vivier [this message]
2015-08-06 8:08 ` [Qemu-devel] [Qemu-ppc] " Laurent Vivier
2015-08-11 8:50 ` Alexander Graf
2015-08-11 9:04 ` Laurent Vivier
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=55B5E99F.5090901@redhat.com \
--to=lvivier@redhat.com \
--cc=agraf@suse.de \
--cc=david@gibson.dropbear.id.au \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/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.