All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Laurent Vivier <lvivier@redhat.com>
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 v2] pci: allow 0 address for PCI IO/MEM regions
Date: Fri, 24 Jul 2015 06:46:46 +1000	[thread overview]
Message-ID: <1437684406.7562.62.camel@kernel.crashing.org> (raw)
In-Reply-To: <1437675858-14070-1-git-send-email-lvivier@redhat.com>

On Thu, 2015-07-23 at 20:24 +0200, Laurent Vivier wrote:
> From: Michael Roth <mdroth@linux.vnet.ibm.com>
> 
> Some kernels program a 0 address for io regions. PCI 3.0 spec
> section 6.2.5.1 doesn't seem to disallow this.
> 
> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> [lvivier: add pci_allow_0_addr in MachineClass to conditionally
> allow addr 0 for pseries, as this can break other architectures]
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---

Why would it break other architectures ? The PCI bus will forward
address 0 just fine and some devices will decode it just fine too,
regardless of the architecture they are put on. I don't see why
having BARs capable of decoding it would break anything...

> v2: move flag from PCIBus to MachineClass, rename it pci_allow_0_address
>  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;

  parent reply	other threads:[~2015-07-23 20:47 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 [this message]
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   ` [Qemu-devel] [Qemu-ppc] " Laurent Vivier
2015-08-06  8:08     ` 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=1437684406.7562.62.camel@kernel.crashing.org \
    --to=benh@kernel.crashing.org \
    --cc=david@gibson.dropbear.id.au \
    --cc=lvivier@redhat.com \
    --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.