diff mbox

[SeaBIOS,v3] hw/pci: reserve IO and mem for pci express downstream ports with no devices attached

Message ID 1403537391-32514-1-git-send-email-marcel.a@redhat.com
State New
Headers show

Commit Message

Marcel Apfelbaum June 23, 2014, 3:29 p.m. UTC
Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830
    hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached

introduced support for hot-plugging devices behind pci-2-pci bridges.
Extend hotplug support also for pci express downstream ports.

Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
v2 -> v3:
 Addressed Michael S. Tsirkin comments:
 - Refactored pci_bus_hotplug_support function.
 - Removed PCI_EXP_FLAGS_TYPE_SHIFT macro.

v1 -> v2:
 Wrong prefix on first patch.

 src/fw/pciinit.c | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

Comments

Michael S. Tsirkin June 23, 2014, 3:55 p.m. UTC | #1
On Mon, Jun 23, 2014 at 06:29:51PM +0300, Marcel Apfelbaum wrote:
> Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830
>     hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached
> 
> introduced support for hot-plugging devices behind pci-2-pci bridges.
> Extend hotplug support also for pci express downstream ports.
> 
> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>


Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

Gerd, is there a plan to do a release for QEMU 2.1?
It would be nice to have this patch there.

Thanks,

> ---
> v2 -> v3:
>  Addressed Michael S. Tsirkin comments:
>  - Refactored pci_bus_hotplug_support function.
>  - Removed PCI_EXP_FLAGS_TYPE_SHIFT macro.
> 
> v1 -> v2:
>  Wrong prefix on first patch.
> 
>  src/fw/pciinit.c | 34 ++++++++++++++++++++++++++++++++--
>  1 file changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
> index 0ad548f..fd5dfb9 100644
> --- a/src/fw/pciinit.c
> +++ b/src/fw/pciinit.c
> @@ -636,6 +636,36 @@ pci_region_create_entry(struct pci_bus *bus, struct pci_device *dev,
>      return entry;
>  }
>  
> +static int pci_bus_hotplug_support(struct pci_bus *bus)
> +{
> +    u8 pcie_cap = pci_find_capability(bus->bus_dev, PCI_CAP_ID_EXP);
> +    u8 shpc_cap;
> +
> +    if (pcie_cap) {
> +        u16 pcie_flags = pci_config_readw(bus->bus_dev->bdf,
> +                                          pcie_cap + PCI_EXP_FLAGS);
> +        u8 port_type = ((pcie_flags & PCI_EXP_FLAGS_TYPE) >>
> +                       (__builtin_ffs(PCI_EXP_FLAGS_TYPE) - 1));
> +        u8 downstream_port = (port_type == PCI_EXP_TYPE_DOWNSTREAM) ||
> +                             (port_type == PCI_EXP_TYPE_ROOT_PORT);
> +        /*
> +         * PCI Express SPEC, 7.8.2:
> +         *   Slot Implemented – When Set, this bit indicates that the Link
> +         *   HwInit associated with this Port is connected to a slot (as
> +         *   compared to being connected to a system-integrated device or
> +         *   being disabled).
> +         *   This bit is valid for Downstream Ports. This bit is undefined
> +         *   for Upstream Ports.
> +         */
> +        u16 slot_implemented = pcie_flags & PCI_EXP_FLAGS_SLOT;
> +
> +        return downstream_port && slot_implemented;
> +    }
> +
> +    shpc_cap = pci_find_capability(bus->bus_dev, PCI_CAP_ID_SHPC);
> +    return !!shpc_cap;
> +}
> +
>  static int pci_bios_check_devices(struct pci_bus *busses)
>  {
>      dprintf(1, "PCI: check devices\n");
> @@ -678,7 +708,7 @@ static int pci_bios_check_devices(struct pci_bus *busses)
>              continue;
>          struct pci_bus *parent = &busses[pci_bdf_to_bus(s->bus_dev->bdf)];
>          int type;
> -        u8 shpc_cap = pci_find_capability(s->bus_dev, PCI_CAP_ID_SHPC);
> +        int hotplug_support = pci_bus_hotplug_support(s);
>          for (type = 0; type < PCI_REGION_TYPE_COUNT; type++) {
>              u64 align = (type == PCI_REGION_TYPE_IO) ?
>                  PCI_BRIDGE_IO_MIN : PCI_BRIDGE_MEM_MIN;
> @@ -687,7 +717,7 @@ static int pci_bios_check_devices(struct pci_bus *busses)
>              if (pci_region_align(&s->r[type]) > align)
>                   align = pci_region_align(&s->r[type]);
>              u64 sum = pci_region_sum(&s->r[type]);
> -            if (!sum && shpc_cap)
> +            if (!sum && hotplug_support)
>                  sum = align; /* reserve min size for hot-plug */
>              u64 size = ALIGN(sum, align);
>              int is64 = pci_bios_bridge_region_is64(&s->r[type],
> -- 
> 1.8.3.1
Gerd Hoffmann June 30, 2014, 9:55 a.m. UTC | #2
On Mo, 2014-06-23 at 18:55 +0300, Michael S. Tsirkin wrote:
> On Mon, Jun 23, 2014 at 06:29:51PM +0300, Marcel Apfelbaum wrote:
> > Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830
> >     hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached
> > 
> > introduced support for hot-plugging devices behind pci-2-pci bridges.
> > Extend hotplug support also for pci express downstream ports.
> > 
> > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> 
> 
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> 
> Gerd, is there a plan to do a release for QEMU 2.1?
> It would be nice to have this patch there.

It's in already (seabios 1.7.5 release & qemu git master).

cheers,
  Gerd
Gerd Hoffmann June 30, 2014, 3:56 p.m. UTC | #3
On Mo, 2014-06-30 at 11:55 +0200, Gerd Hoffmann wrote:
> On Mo, 2014-06-23 at 18:55 +0300, Michael S. Tsirkin wrote:
> > On Mon, Jun 23, 2014 at 06:29:51PM +0300, Marcel Apfelbaum wrote:
> > > Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830
> > >     hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached
> > > 
> > > introduced support for hot-plugging devices behind pci-2-pci bridges.
> > > Extend hotplug support also for pci express downstream ports.
> > > 
> > > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > 
> > 
> > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> > 
> > Gerd, is there a plan to do a release for QEMU 2.1?
> > It would be nice to have this patch there.
> 
> It's in already (seabios 1.7.5 release & qemu git master).

Oops, now seeing the full thread on the mailing list.

c6e298e1f12e0f4ca02b6da5e42919ae055f6830 is in, but the pcie extension
isn't committed yet.  Timing for 2.1 is a bit tight though, especially
as I have some backlog atm due to having been sick for a week.

Guess we should have a stable-1.7.5 branch for bugfixes and minor
improvements like this one, while the master branch is shaked up a bit
with the smm / 32bit merge ...

cheers,
  Gerd
Michael S. Tsirkin June 30, 2014, 4:04 p.m. UTC | #4
On Mon, Jun 30, 2014 at 05:56:56PM +0200, Gerd Hoffmann wrote:
> On Mo, 2014-06-30 at 11:55 +0200, Gerd Hoffmann wrote:
> > On Mo, 2014-06-23 at 18:55 +0300, Michael S. Tsirkin wrote:
> > > On Mon, Jun 23, 2014 at 06:29:51PM +0300, Marcel Apfelbaum wrote:
> > > > Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830
> > > >     hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached
> > > > 
> > > > introduced support for hot-plugging devices behind pci-2-pci bridges.
> > > > Extend hotplug support also for pci express downstream ports.
> > > > 
> > > > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > > 
> > > 
> > > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> > > 
> > > Gerd, is there a plan to do a release for QEMU 2.1?
> > > It would be nice to have this patch there.
> > 
> > It's in already (seabios 1.7.5 release & qemu git master).
> 
> Oops, now seeing the full thread on the mailing list.
> 
> c6e298e1f12e0f4ca02b6da5e42919ae055f6830 is in, but the pcie extension
> isn't committed yet.  Timing for 2.1 is a bit tight though, especially
> as I have some backlog atm due to having been sick for a week.
> 
> Guess we should have a stable-1.7.5 branch for bugfixes and minor
> improvements like this one, while the master branch is shaked up a bit
> with the smm / 32bit merge ...
> 
> cheers,
>   Gerd
> 

And then update bios with fixes from that branch around rc2?
Please do, Marcel fixed up most of pcie hotplug, would be
sad for it all to wait another quarter.
Gerd Hoffmann July 2, 2014, 6:54 a.m. UTC | #5
On Mo, 2014-06-23 at 18:29 +0300, Marcel Apfelbaum wrote:
> Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830
>     hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached
> 
> introduced support for hot-plugging devices behind pci-2-pci bridges.
> Extend hotplug support also for pci express downstream ports.

Committed to master.

Also created a 1.7.5 stable branch and cherry-picked the patch into that
branch.

cheers,
  Gerd
diff mbox

Patch

diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
index 0ad548f..fd5dfb9 100644
--- a/src/fw/pciinit.c
+++ b/src/fw/pciinit.c
@@ -636,6 +636,36 @@  pci_region_create_entry(struct pci_bus *bus, struct pci_device *dev,
     return entry;
 }
 
+static int pci_bus_hotplug_support(struct pci_bus *bus)
+{
+    u8 pcie_cap = pci_find_capability(bus->bus_dev, PCI_CAP_ID_EXP);
+    u8 shpc_cap;
+
+    if (pcie_cap) {
+        u16 pcie_flags = pci_config_readw(bus->bus_dev->bdf,
+                                          pcie_cap + PCI_EXP_FLAGS);
+        u8 port_type = ((pcie_flags & PCI_EXP_FLAGS_TYPE) >>
+                       (__builtin_ffs(PCI_EXP_FLAGS_TYPE) - 1));
+        u8 downstream_port = (port_type == PCI_EXP_TYPE_DOWNSTREAM) ||
+                             (port_type == PCI_EXP_TYPE_ROOT_PORT);
+        /*
+         * PCI Express SPEC, 7.8.2:
+         *   Slot Implemented – When Set, this bit indicates that the Link
+         *   HwInit associated with this Port is connected to a slot (as
+         *   compared to being connected to a system-integrated device or
+         *   being disabled).
+         *   This bit is valid for Downstream Ports. This bit is undefined
+         *   for Upstream Ports.
+         */
+        u16 slot_implemented = pcie_flags & PCI_EXP_FLAGS_SLOT;
+
+        return downstream_port && slot_implemented;
+    }
+
+    shpc_cap = pci_find_capability(bus->bus_dev, PCI_CAP_ID_SHPC);
+    return !!shpc_cap;
+}
+
 static int pci_bios_check_devices(struct pci_bus *busses)
 {
     dprintf(1, "PCI: check devices\n");
@@ -678,7 +708,7 @@  static int pci_bios_check_devices(struct pci_bus *busses)
             continue;
         struct pci_bus *parent = &busses[pci_bdf_to_bus(s->bus_dev->bdf)];
         int type;
-        u8 shpc_cap = pci_find_capability(s->bus_dev, PCI_CAP_ID_SHPC);
+        int hotplug_support = pci_bus_hotplug_support(s);
         for (type = 0; type < PCI_REGION_TYPE_COUNT; type++) {
             u64 align = (type == PCI_REGION_TYPE_IO) ?
                 PCI_BRIDGE_IO_MIN : PCI_BRIDGE_MEM_MIN;
@@ -687,7 +717,7 @@  static int pci_bios_check_devices(struct pci_bus *busses)
             if (pci_region_align(&s->r[type]) > align)
                  align = pci_region_align(&s->r[type]);
             u64 sum = pci_region_sum(&s->r[type]);
-            if (!sum && shpc_cap)
+            if (!sum && hotplug_support)
                 sum = align; /* reserve min size for hot-plug */
             u64 size = ALIGN(sum, align);
             int is64 = pci_bios_bridge_region_is64(&s->r[type],