From: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
To: marcel@redhat.com, Cao jin <caoj.fnst@cn.fujitsu.com>,
qemu-devel@nongnu.org
Cc: izumi.taku@jp.fujitsu.com, alex.williamson@redhat.com, mst@redhat.com
Subject: Re: [Qemu-devel] [PATCH v16 07/14] vfio: add aer support for vfio device
Date: Tue, 19 Jan 2016 17:47:34 +0800 [thread overview]
Message-ID: <569E0636.5060406@cn.fujitsu.com> (raw)
In-Reply-To: <569CAC6E.8080802@gmail.com>
On 01/18/2016 05:12 PM, Marcel Apfelbaum wrote:
> On 01/12/2016 04:43 AM, Cao jin wrote:
>> From: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
>>
>> Calling pcie_aer_init to initilize aer related registers for
>> vfio device, then reload physical related registers to expose
>> device capability.
>>
>> Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
>> ---
>> hw/vfio/pci.c | 81
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>> hw/vfio/pci.h | 3 +++
>> 2 files changed, 81 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
>> index 64b0867..38b0aa5 100644
>> --- a/hw/vfio/pci.c
>> +++ b/hw/vfio/pci.c
>> @@ -1832,6 +1832,62 @@ static int vfio_add_std_cap(VFIOPCIDevice
>> *vdev, uint8_t pos)
>> return 0;
>> }
>>
>> +static int vfio_setup_aer(VFIOPCIDevice *vdev, uint8_t cap_ver,
>> + int pos, uint16_t size)
>> +{
>> + PCIDevice *pdev = &vdev->pdev;
>> + PCIDevice *dev_iter;
>> + uint8_t type;
>> + uint32_t errcap;
>> +
>> + if (!(vdev->features & VFIO_FEATURE_ENABLE_AER)) {
>> + pcie_add_capability(pdev, PCI_EXT_CAP_ID_ERR,
>> + cap_ver, pos, size);
>> + return 0;
>> + }
>> +
>> + dev_iter = pci_bridge_get_device(pdev->bus);
>> + if (!dev_iter) {
>> + goto error;
>> + }
>> +
>> + while (dev_iter) {
>> + type = pcie_cap_get_type(dev_iter);
>> + if ((type != PCI_EXP_TYPE_ROOT_PORT &&
>> + type != PCI_EXP_TYPE_UPSTREAM &&
>> + type != PCI_EXP_TYPE_DOWNSTREAM)) {
>> + goto error;
>> + }
>> +
>> + if (!dev_iter->exp.aer_cap) {
>> + goto error;
>> + }
>> +
>> + dev_iter = pci_bridge_get_device(dev_iter->bus);
>> + }
>> +
>> + errcap = vfio_pci_read_config(pdev, pos + PCI_ERR_CAP, 4);
>> + /*
>> + * The ability to record multiple headers is depending on
>> + * the state of the Multiple Header Recording Capable bit and
>> + * enabled by the Multiple Header Recording Enable bit.
>> + */
>> + if ((errcap & PCI_ERR_CAP_MHRC) &&
>> + (errcap & PCI_ERR_CAP_MHRE)) {
>> + pdev->exp.aer_log.log_max = PCIE_AER_LOG_MAX_DEFAULT;
>> + } else {
>> + pdev->exp.aer_log.log_max = 0;
>> + }
>> +
>> + pcie_cap_deverr_init(pdev);
>> + return pcie_aer_init(pdev, pos, size);
>> +
>> +error:
>> + error_report("vfio: Unable to enable AER for device %s, parent
>> bus "
>> + "does not support AER signaling",
>> vdev->vbasedev.name);
>> + return -1;
>> +}
>> +
>> static int vfio_add_ext_cap(VFIOPCIDevice *vdev)
>> {
>> PCIDevice *pdev = &vdev->pdev;
>> @@ -1839,6 +1895,7 @@ static int vfio_add_ext_cap(VFIOPCIDevice *vdev)
>> uint16_t cap_id, next, size;
>> uint8_t cap_ver;
>> uint8_t *config;
>> + int ret = 0;
>>
>> /*
>> * In order to avoid breaking config space, create a copy to
>> @@ -1860,16 +1917,29 @@ static int vfio_add_ext_cap(VFIOPCIDevice *vdev)
>> */
>> size = vfio_ext_cap_max_size(config, next);
>>
>> - pcie_add_capability(pdev, cap_id, cap_ver, next, size);
>> - pci_set_long(dev->config + next, PCI_EXT_CAP(cap_id,
>> cap_ver, 0));
>> + switch (cap_id) {
>> + case PCI_EXT_CAP_ID_ERR:
>> + ret = vfio_setup_aer(vdev, cap_ver, next, size);
>> + break;
>> + default:
>> + pcie_add_capability(pdev, cap_id, cap_ver, next, size);
>> + break;
>> + }
>> +
>> + if (ret) {
>> + goto out;
>> + }
>> +
>> + pci_set_long(pdev->config + next, PCI_EXT_CAP(cap_id,
>> cap_ver, 0));
>>
>> /* Use emulated next pointer to allow dropping extended
>> caps */
>> pci_long_test_and_set_mask(vdev->emulated_config_bits + next,
>> PCI_EXT_CAP_NEXT_MASK);
>> }
>>
>> +out:
>> g_free(config);
>> - return 0;
>> + return ret;
>> }
>>
>> static int vfio_add_capabilities(VFIOPCIDevice *vdev)
>> @@ -2624,6 +2694,11 @@ static int vfio_initfn(PCIDevice *pdev)
>> goto out_teardown;
>> }
>>
>> + if ((vdev->features & VFIO_FEATURE_ENABLE_AER) &&
>> + !pdev->exp.aer_cap) {
>
> Hi,
>
> I think we need an error_report here, otherwise the init
> will fail without knowing the reason.
maybe we need to exclude this case. if the device hasn't the aer cap,
the ENABLE_AER would be not affected.
Thanks,
Chen
>
>
> Thanks,
> Marcel
>
>
>> + goto out_teardown;
>> + }
>> +
>> /* QEMU emulates all of MSI & MSIX */
>> if (pdev->cap_present & QEMU_PCI_CAP_MSIX) {
>> memset(vdev->emulated_config_bits + pdev->msix_cap, 0xff,
>> diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
>> index f004d52..48c1f69 100644
>> --- a/hw/vfio/pci.h
>> +++ b/hw/vfio/pci.h
>> @@ -15,6 +15,7 @@
>> #include "qemu-common.h"
>> #include "exec/memory.h"
>> #include "hw/pci/pci.h"
>> +#include "hw/pci/pci_bridge.h"
>> #include "hw/vfio/vfio-common.h"
>> #include "qemu/event_notifier.h"
>> #include "qemu/queue.h"
>> @@ -127,6 +128,8 @@ typedef struct VFIOPCIDevice {
>> #define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT)
>> #define VFIO_FEATURE_ENABLE_REQ_BIT 1
>> #define VFIO_FEATURE_ENABLE_REQ (1 << VFIO_FEATURE_ENABLE_REQ_BIT)
>> +#define VFIO_FEATURE_ENABLE_AER_BIT 2
>> +#define VFIO_FEATURE_ENABLE_AER (1 << VFIO_FEATURE_ENABLE_AER_BIT)
>> int32_t bootindex;
>> uint8_t pm_cap;
>> bool has_vga;
>>
>
>
>
> .
>
next prev parent reply other threads:[~2016-01-19 9:52 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-12 2:43 [Qemu-devel] [PATCH v16 00/14] vfio-pci: pass the aer error to guest Cao jin
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 01/14] vfio: extract vfio_get_hot_reset_info as a single function Cao jin
2016-01-17 12:48 ` Marcel Apfelbaum
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 02/14] vfio: squeeze out vfio_pci_do_hot_reset for support bus reset Cao jin
2016-01-17 13:01 ` Marcel Apfelbaum
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 03/14] pcie: modify the capability size assert Cao jin
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 04/14] vfio: make the 4 bytes aligned for capability size Cao jin
2016-01-17 12:30 ` Marcel Apfelbaum
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 05/14] vfio: add pcie extanded capability support Cao jin
2016-01-17 13:22 ` Marcel Apfelbaum
2016-01-19 9:44 ` Chen Fan
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 06/14] aer: impove pcie_aer_init to support vfio device Cao jin
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 07/14] vfio: add aer support for " Cao jin
2016-01-18 9:12 ` Marcel Apfelbaum
2016-01-19 9:47 ` Chen Fan [this message]
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 08/14] vfio: add check host bus reset is support or not Cao jin
2016-01-18 10:32 ` Marcel Apfelbaum
2016-01-19 9:55 ` Chen Fan
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 09/14] add check reset mechanism when hotplug vfio device Cao jin
2016-01-18 11:03 ` Marcel Apfelbaum
2016-01-19 1:46 ` Cao jin
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 10/14] pci: introduce pci bus pre reset Cao jin
2016-01-14 20:36 ` Alex Williamson
2016-01-19 10:15 ` Chen Fan
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 11/14] vfio: introduce last reset sequence id Cao jin
2016-01-14 20:43 ` Alex Williamson
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 12/14] pcie_aer: expose pcie_aer_msg() interface Cao jin
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 13/14] vfio-pci: pass the aer error to guest Cao jin
2016-01-18 10:45 ` Marcel Apfelbaum
2016-01-19 9:27 ` Chen Fan
2016-01-12 2:43 ` [Qemu-devel] [PATCH v16 14/14] vfio: add 'aer' property to expose aercap Cao jin
2016-01-18 10:46 ` Marcel Apfelbaum
2016-01-16 18:34 ` [Qemu-devel] [PATCH v16 00/14] vfio-pci: pass the aer error to guest Michael S. Tsirkin
2016-01-19 9:09 ` Chen Fan
2016-02-03 8:54 ` Chen Fan
2016-02-03 13:57 ` Michael S. Tsirkin
2016-02-04 2:04 ` Chen Fan
2016-02-04 11:21 ` Michael S. Tsirkin
2016-02-04 17:46 ` Alex Williamson
2016-02-04 18:09 ` Michael S. Tsirkin
2016-02-04 20:15 ` Alex Williamson
2016-02-04 21:58 ` Michael S. Tsirkin
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=569E0636.5060406@cn.fujitsu.com \
--to=chen.fan.fnst@cn.fujitsu.com \
--cc=alex.williamson@redhat.com \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=izumi.taku@jp.fujitsu.com \
--cc=marcel@redhat.com \
--cc=mst@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.