qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] pci: fix requester id to be the one on root bus


From: Michael S. Tsirkin
Subject: Re: [Qemu-devel] [PATCH] pci: fix requester id to be the one on root bus
Date: Wed, 11 May 2016 16:53:54 +0300

On Wed, May 11, 2016 at 02:40:31PM +0800, Peter Xu wrote:
> When there are devices under PCI bridge (or bridges), PCI requester ID
> should be the one that hooked on the root PCI bus, not the PCI device
> itself.
> 
> Signed-off-by: Peter Xu <address@hidden>

I think this is only correct for pci bridges, and wrong for pci express bridges.

How exactly do you test this?

> ---
>  hw/pci/msi.c         | 2 +-
>  hw/pci/pci.c         | 9 +++++++++
>  include/hw/pci/pci.h | 2 ++
>  3 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/pci/msi.c b/hw/pci/msi.c
> index e0e64c2..1719716 100644
> --- a/hw/pci/msi.c
> +++ b/hw/pci/msi.c
> @@ -315,7 +315,7 @@ void msi_send_message(PCIDevice *dev, MSIMessage msg)
>  {
>      MemTxAttrs attrs = {};
>  
> -    attrs.requester_id = pci_requester_id(dev);
> +    attrs.requester_id = pci_requester_id_recursive(dev);
>      address_space_stl_le(&dev->bus_master_as, msg.address, msg.data,
>                           attrs, NULL);
>  }
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index bb605ef..c14299b 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -2498,6 +2498,15 @@ PCIDevice *pci_get_function_0(PCIDevice *pci_dev)
>      }
>  }
>  
> +uint16_t pci_requester_id_recursive(PCIDevice *dev)
> +{
> +    while (pci_bus_num(dev->bus)) {
> +        /* This is not on root PCI bus, we find its parent */
> +        dev = dev->bus->parent_dev;
> +    }
> +    return pci_requester_id(dev);
> +}
> +
>  static const TypeInfo pci_device_type_info = {
>      .name = TYPE_PCI_DEVICE,
>      .parent = TYPE_DEVICE,
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index ef6ba51..4cb5b50 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -776,4 +776,6 @@ extern const VMStateDescription vmstate_pci_device;
>      .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
>  }
>  
> +uint16_t pci_requester_id_recursive(PCIDevice *dev);
> +
>  #endif
> -- 
> 2.4.11



reply via email to

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