qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH qemu] spapr-pci: Stop providing assigned-addresses


From: David Gibson
Subject: Re: [PATCH qemu] spapr-pci: Stop providing assigned-addresses
Date: Fri, 27 Sep 2019 17:12:52 +1000
User-agent: Mutt/1.12.1 (2019-06-15)

On Fri, Sep 27, 2019 at 12:26:51PM +1000, Alexey Kardashevskiy wrote:
> QEMU does not allocate PCI resources (BARs) in any case - coldplug devices
> are configured by the firmware and hotplug devices rely on the guest
> system to do the assignment via the PCI rescan mechanism. Also in order
> to create non empty "assigned-addresses", the device has to be enabled
> (i.e. PCI_COMMAND needs the MMIO bit set) first as otherwise
> io_regions[i].addr are -1, and devices are not enabled at this point.
> 
> This removes "assigned-addresses" and leaves it to those who actually
> do resource allocation.
> 
> Signed-off-by: Alexey Kardashevskiy <address@hidden>
> ---
> 
> This replaces:
> [PATCH qemu] spapr-pci: Provide either correct assigned-addresses or
> none

Applied to ppc-for-4.2, along with your earlier full fdt render patch,
which this now unbreaks.

> 
> ---
>  hw/ppc/spapr_pci.c | 42 +++++++-----------------------------------
>  1 file changed, 7 insertions(+), 35 deletions(-)
> 
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index 6934d506a7e9..01ff41d4c43f 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -836,7 +836,7 @@ static char *spapr_phb_get_loc_code(SpaprPhbState *sphb, 
> PCIDevice *pdev)
>  #define b_fff(x)        b_x((x), 8, 3)  /* function number */
>  #define b_rrrrrrrr(x)   b_x((x), 0, 8)  /* register number */
>  
> -/* for 'reg'/'assigned-addresses' OF properties */
> +/* for 'reg' OF properties */
>  #define RESOURCE_CELLS_SIZE 2
>  #define RESOURCE_CELLS_ADDRESS 3
>  
> @@ -850,17 +850,14 @@ typedef struct ResourceFields {
>  
>  typedef struct ResourceProps {
>      ResourceFields reg[8];
> -    ResourceFields assigned[7];
>      uint32_t reg_len;
> -    uint32_t assigned_len;
>  } ResourceProps;
>  
> -/* fill in the 'reg'/'assigned-resources' OF properties for
> +/* fill in the 'reg' OF properties for
>   * a PCI device. 'reg' describes resource requirements for a
> - * device's IO/MEM regions, 'assigned-addresses' describes the
> - * actual resource assignments.
> + * device's IO/MEM regions.
>   *
> - * the properties are arrays of ('phys-addr', 'size') pairs describing
> + * the property is an array of ('phys-addr', 'size') pairs describing
>   * the addressable regions of the PCI device, where 'phys-addr' is a
>   * RESOURCE_CELLS_ADDRESS-tuple of 32-bit integers corresponding to
>   * (phys.hi, phys.mid, phys.lo), and 'size' is a
> @@ -889,18 +886,7 @@ typedef struct ResourceProps {
>   * phys.mid and phys.lo correspond respectively to the hi/lo portions
>   * of the actual address of the region.
>   *
> - * how the phys-addr/size values are used differ slightly between
> - * 'reg' and 'assigned-addresses' properties. namely, 'reg' has
> - * an additional description for the config space region of the
> - * device, and in the case of QEMU has n=0 and phys.mid=phys.lo=0
> - * to describe the region as relocatable, with an address-mapping
> - * that corresponds directly to the PHB's address space for the
> - * resource. 'assigned-addresses' always has n=1 set with an absolute
> - * address assigned for the resource. in general, 'assigned-addresses'
> - * won't be populated, since addresses for PCI devices are generally
> - * unmapped initially and left to the guest to assign.
> - *
> - * note also that addresses defined in these properties are, at least
> + * note also that addresses defined in this property are, at least
>   * for PAPR guests, relative to the PHBs IO/MEM windows, and
>   * correspond directly to the addresses in the BARs.
>   *
> @@ -914,8 +900,8 @@ static void populate_resource_props(PCIDevice *d, 
> ResourceProps *rp)
>      uint32_t dev_id = (b_bbbbbbbb(bus_num) |
>                         b_ddddd(PCI_SLOT(d->devfn)) |
>                         b_fff(PCI_FUNC(d->devfn)));
> -    ResourceFields *reg, *assigned;
> -    int i, reg_idx = 0, assigned_idx = 0;
> +    ResourceFields *reg;
> +    int i, reg_idx = 0;
>  
>      /* config space region */
>      reg = &rp->reg[reg_idx++];
> @@ -944,21 +930,9 @@ static void populate_resource_props(PCIDevice *d, 
> ResourceProps *rp)
>          reg->phys_lo = 0;
>          reg->size_hi = cpu_to_be32(d->io_regions[i].size >> 32);
>          reg->size_lo = cpu_to_be32(d->io_regions[i].size);
> -
> -        if (d->io_regions[i].addr == PCI_BAR_UNMAPPED) {
> -            continue;
> -        }
> -
> -        assigned = &rp->assigned[assigned_idx++];
> -        assigned->phys_hi = cpu_to_be32(be32_to_cpu(reg->phys_hi) | b_n(1));
> -        assigned->phys_mid = cpu_to_be32(d->io_regions[i].addr >> 32);
> -        assigned->phys_lo = cpu_to_be32(d->io_regions[i].addr);
> -        assigned->size_hi = reg->size_hi;
> -        assigned->size_lo = reg->size_lo;
>      }
>  
>      rp->reg_len = reg_idx * sizeof(ResourceFields);
> -    rp->assigned_len = assigned_idx * sizeof(ResourceFields);
>  }
>  
>  typedef struct PCIClass PCIClass;
> @@ -1472,8 +1446,6 @@ static int spapr_dt_pci_device(SpaprPhbState *sphb, 
> PCIDevice *dev,
>  
>      populate_resource_props(dev, &rp);
>      _FDT(fdt_setprop(fdt, offset, "reg", (uint8_t *)rp.reg, rp.reg_len));
> -    _FDT(fdt_setprop(fdt, offset, "assigned-addresses",
> -                     (uint8_t *)rp.assigned, rp.assigned_len));
>  
>      if (sphb->pcie_ecs && pci_is_express(dev)) {
>          _FDT(fdt_setprop_cell(fdt, offset, "ibm,pci-config-space-type", 
> 0x1));

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]