From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: <linux-cxl@vger.kernel.org>, <linux-pci@vger.kernel.org>,
Dan Williams <dan.j.williams@intel.com>,
Bjorn Helgaas <helgaas@kernel.org>,
"Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>
Cc: Ben Widawsky <ben.widawsky@intel.com>,
Chris Browy <cbrowy@avery-design.com>,
<linux-acpi@vger.kernel.org>, <alison.schofield@intel.com>,
<vishal.l.verma@intel.com>, <ira.weiny@intel.com>,
<linuxarm@huawei.com>, Fangjian <f.fangjian@huawei.com>
Subject: Re: [RFC PATCH v3 2/4] PCI/doe: Add Data Object Exchange support
Date: Fri, 7 May 2021 10:36:38 +0100 [thread overview]
Message-ID: <20210507103638.00006c89@Huawei.com> (raw)
In-Reply-To: <20210419165451.2176200-3-Jonathan.Cameron@huawei.com>
On Tue, 20 Apr 2021 00:54:49 +0800
Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
> Introduced in a PCI ECN [1], DOE provides a config space
> based mailbox with standard protocol discovery. Each mailbox
> is accessed through a DOE Extended Capability.
>
> A device may have 1 or more DOE mailboxes, each of which is allowed
> to support any number of protocols (some DOE protocol
> specifications apply additional restrictions). A given protocol
> may be supported on more than one DOE mailbox on a given function.
>
> If a driver wishes to access any number of DOE instances / protocols
> it makes a single call to pcie_doe_register_all() which will find
> available DOEs, create the required infrastructure and cache the
> protocols they support. pcie_doe_find() can then retrieve a
> pointer to an appropriate DOE instance.
>
> A synchronous interface is provided in pcie_doe_exchange_sync() to
> perform a single query / response exchange.
>
> Testing conducted against QEMU using:
>
> https://lore.kernel.org/qemu-devel/1612900760-7361-1-git-send-email-cbrowy@avery-design.com/
> + fix for interrupt flag mentioned in that thread and a whole load
> of hacks to exercise error paths etc.
>
> [1] https://members.pcisig.com/wg/PCI-SIG/document/14143
> Data Object Exchange (DOE) - Approved 12 March 2020
>
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> ---
...
> +static int pci_doe_recv_resp(struct pci_doe *doe, struct pci_doe_exchange *ex)
> +{
> + struct pci_dev *pdev = doe->pdev;
> + size_t length;
> + u32 val;
> + int i;
> +
> + /* Read the first two dwords to get the length and protocol */
> + pci_read_config_dword(pdev, doe->cap + PCI_DOE_READ, &val);
> + if ((FIELD_GET(PCI_DOE_DATA_OBJECT_HEADER_1_VID, val) != ex->vid) ||
> + (FIELD_GET(PCI_DOE_DATA_OBJECT_HEADER_1_TYPE, val) != ex->protocol)) {
> + pci_err(pdev,
> + "Expected [VID, Protocol] = [%x, %x], got [%x, %x]\n",
> + ex->vid, ex->protocol,
> + FIELD_GET(PCI_DOE_DATA_OBJECT_HEADER_1_VID, val),
> + FIELD_GET(PCI_DOE_DATA_OBJECT_HEADER_1_TYPE, val));
> + return -EIO;
> + }
> +
> + pci_write_config_dword(pdev, doe->cap + PCI_DOE_READ, 0);
> + pci_read_config_dword(pdev, doe->cap + PCI_DOE_READ, &val);
> + pci_write_config_dword(pdev, doe->cap + PCI_DOE_READ, 0);
> +
> + length = FIELD_GET(PCI_DOE_DATA_OBJECT_HEADER_2_LENGTH, val);
> + if (length > SZ_1M)
> + return -EIO;
> +
> + /* Read the rest of the response payload */
> + for (i = 0; i < min(length, ex->response_pl_sz / sizeof(u32)); i++) {
Note for anyone testing these that there is a bug here which leads to
a buffer underflow triggered reset with the latest QEMU patches
(I've not figured out yet why this didn't trigger a problem with the earlier
QEMU patch versions).
This needs to take into account that length includes the two header DW, but
the response_pl_sz does not.
> + pci_read_config_dword(pdev, doe->cap + PCI_DOE_READ,
> + &ex->response_pl[i]);
> + pci_write_config_dword(pdev, doe->cap + PCI_DOE_READ, 0);
> + }
> +
> + /* Flush excess length */
> + for (; i < length; i++) {
> + pci_read_config_dword(pdev, doe->cap + PCI_DOE_READ, &val);
> + pci_write_config_dword(pdev, doe->cap + PCI_DOE_READ, 0);
> + }
> + /* Final error check to pick up on any since Data Object Ready */
> + pci_read_config_dword(pdev, doe->cap + PCI_DOE_STATUS, &val);
> + if (FIELD_GET(PCI_DOE_STATUS_ERROR, val))
> + return -EIO;
> +
> + return min(length, ex->response_pl_sz / sizeof(u32)) * sizeof(u32);
> +}
> +
next prev parent reply other threads:[~2021-05-07 9:38 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-19 16:54 [RFC PATCH v3 0/4] PCI Data Object Exchange support + CXL CDAT Jonathan Cameron
2021-04-19 16:54 ` [RFC PATCH v3 1/4] PCI: Add vendor ID for the PCI SIG Jonathan Cameron
2021-04-19 16:54 ` [RFC PATCH v3 2/4] PCI/doe: Add Data Object Exchange support Jonathan Cameron
2021-05-06 21:59 ` Ira Weiny
2021-05-11 16:50 ` Jonathan Cameron
2021-05-13 21:20 ` Dan Williams
2021-05-14 8:47 ` Jonathan Cameron
2021-05-14 11:15 ` Lorenzo Pieralisi
2021-05-14 12:39 ` Jonathan Cameron
2021-05-14 18:37 ` Dan Williams
2021-05-17 8:40 ` Jonathan Cameron
2021-05-17 8:51 ` Greg KH
2021-05-17 17:21 ` Dan Williams
2021-05-18 10:04 ` Jonathan Cameron
2021-05-19 14:18 ` Dan Williams
2021-05-19 15:11 ` Jonathan Cameron
2021-05-19 15:29 ` Dan Williams
2021-05-19 16:20 ` Jonathan Cameron
2021-05-19 16:33 ` Jonathan Cameron
2021-05-19 16:53 ` Dan Williams
2021-05-19 17:00 ` Jonathan Cameron
2021-05-19 19:20 ` Dan Williams
2021-05-19 20:18 ` Jonathan Cameron
2021-05-19 23:51 ` Dan Williams
2021-05-20 0:16 ` Dan Williams
2021-05-20 8:22 ` Jonathan Cameron
2021-05-07 9:36 ` Jonathan Cameron [this message]
2021-05-07 23:10 ` Bjorn Helgaas
2021-05-12 12:44 ` Jonathan Cameron
2021-04-19 16:54 ` [RFC PATCH v3 3/4] cxl/mem: Add CDAT table reading from DOE Jonathan Cameron
2021-04-19 16:54 ` [RFC PATCH v3 4/4] cxl/mem: Add a debug parser for CDAT commands Jonathan Cameron
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=20210507103638.00006c89@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=ben.widawsky@intel.com \
--cc=cbrowy@avery-design.com \
--cc=dan.j.williams@intel.com \
--cc=f.fangjian@huawei.com \
--cc=helgaas@kernel.org \
--cc=ira.weiny@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=vishal.l.verma@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).