From: Alex Williamson <alex.williamson@redhat.com>
To: Cao jin <caoj.fnst@cn.fujitsu.com>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/2] PCI-e device multi-function hot-add support
Date: Thu, 10 Sep 2015 09:29:27 -0600 [thread overview]
Message-ID: <1441898967.20355.578.camel@redhat.com> (raw)
In-Reply-To: <1441887143-26756-2-git-send-email-caoj.fnst@cn.fujitsu.com>
On Thu, 2015-09-10 at 20:12 +0800, Cao jin wrote:
> Enable PCI-e device multifunction hot, just ensure the function 0
> added last, then driver will got the notification to scan all the
> function in the slot.
>
> Signed-off-by: Cao jin <caoj.fnst@cn.fujitsu.com>
> ---
> hw/pci/pcie.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
> index 6e28985..61ebefd 100644
> --- a/hw/pci/pcie.c
> +++ b/hw/pci/pcie.c
> @@ -249,16 +249,20 @@ void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> return;
> }
>
> - /* TODO: multifunction hot-plug.
> - * Right now, only a device of function = 0 is allowed to be
> - * hot plugged/unplugged.
> + /* To enable multifunction hot-plug, we just ensure the function
> + * 0 added last. Until function 0 added, we set the sltsta and
> + * inform OS via event notification.
> */
> - assert(PCI_FUNC(pci_dev->devfn) == 0);
> -
> - pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA,
> - PCI_EXP_SLTSTA_PDS);
> - pcie_cap_slot_event(PCI_DEVICE(hotplug_dev),
> - PCI_EXP_HP_EV_PDC | PCI_EXP_HP_EV_ABP);
> + if (!(pci_dev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) &&
> + PCI_FUNC(pci_dev->devfn) > 0) {
The PCI spec is actually not entirely clear about whether each function
in a multifunction device needs to have the multifunction bit set or if
only function 0 needs to set it. From a discovery perspective, a kernel
should only scan for function 0 and only scan non-zero funcions if
function 0 reports the multifunction bit set. Therefore, it doesn't
particularly matter what non-zero functions report for the multifunction
bit. QEMU allows either interpretation (see comment in
pci_init_multifunction), so this appears to be a new requirement that
breaks assumptions elsewhere. Thanks,
Alex
> + error_setg(errp, "single function device, function number must be 0,"
> + "but got %d", PCI_FUNC(pci_dev->devfn));
> + } else if (PCI_FUNC(pci_dev->devfn) == 0) {
> + pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA,
> + PCI_EXP_SLTSTA_PDS);
> + pcie_cap_slot_event(PCI_DEVICE(hotplug_dev),
> + PCI_EXP_HP_EV_PDC | PCI_EXP_HP_EV_ABP);
> + }
> }
>
> void pcie_cap_slot_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
next prev parent reply other threads:[~2015-09-10 15:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-10 12:12 [Qemu-devel] [PATCH 0/2] PCI-e device multi-function hot-add support Cao jin
2015-09-10 12:12 ` [Qemu-devel] [PATCH 1/2] " Cao jin
2015-09-10 15:29 ` Alex Williamson [this message]
2015-09-15 6:23 ` Cao jin
2015-09-10 12:12 ` [Qemu-devel] [PATCH 2/2] " Cao jin
2015-09-10 15:29 ` Alex Williamson
2015-09-11 14:35 ` Igor Mammedov
2015-09-16 2:17 ` Cao jin
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=1441898967.20355.578.camel@redhat.com \
--to=alex.williamson@redhat.com \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@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.