From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Ira Weiny <ira.weiny@intel.com>
Cc: Ben Widawsky <ben.widawsky@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Bjorn Helgaas <bhelgaas@google.com>,
"Alison Schofield" <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
<linux-kernel@vger.kernel.org>, <linux-cxl@vger.kernel.org>,
<linux-pci@vger.kernel.org>
Subject: Re: [PATCH V6 06/10] cxl/pci: Find the DOE mailbox which supports CDAT
Date: Fri, 4 Feb 2022 14:04:48 +0000 [thread overview]
Message-ID: <20220204140448.00003c23@Huawei.com> (raw)
In-Reply-To: <20220201221841.GO785175@iweiny-DESK2.sc.intel.com>
On Tue, 1 Feb 2022 14:18:41 -0800
Ira Weiny <ira.weiny@intel.com> wrote:
> On Tue, Feb 01, 2022 at 10:49:47AM -0800, Widawsky, Ben wrote:
> > On 22-01-31 23:19:48, ira.weiny@intel.com wrote:
> > > From: Ira Weiny <ira.weiny@intel.com>
> > >
> > > Memory devices need the CDAT data from the device. This data is read
> > > from a DOE mailbox which supports the CDAT protocol.
> > >
> > > Search the DOE auxiliary devices for the one which supports the CDAT
> > > protocol. Cache that device to be used for future queries.
> > >
> > > Signed-off-by: Ira Weiny <ira.weiny@intel.com>
>
> [snip]
>
> > >
> > > diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
> > > index d4ae79b62a14..dcc55c4efd85 100644
> > > --- a/drivers/cxl/pci.c
> > > +++ b/drivers/cxl/pci.c
> > > @@ -536,12 +536,53 @@ static int cxl_dvsec_ranges(struct cxl_dev_state *cxlds)
> > > return rc;
> > > }
> > >
> > > +static int cxl_match_cdat_doe_device(struct device *dev, const void *data)
> > > +{
> > > + const struct cxl_dev_state *cxlds = data;
> > > + struct auxiliary_device *adev;
> > > + struct pci_doe_dev *doe_dev;
> > > +
> > > + /* First determine if this auxiliary device belongs to the cxlds */
> > > + if (cxlds->dev != dev->parent)
> > > + return 0;
> >
> > I don't understand auxiliary bus but I'm wondering why it's checking the parent
> > of the device?
>
> auxiliary_find_device() iterates all the auxiliary devices in the system. This
> check was a way for the match function to know if the auxiliary device belongs
> to the cxlds we are interested in...
>
> But now that I think about it we could have other auxiliary devices attached
> which are not DOE... :-/ So this check is not complete.
>
> FWIW I'm not thrilled with the way auxiliary_find_device() is defined. And now
> that I look at it I think the only user of it currently is wrong. They too
> have a check like this but it is after another check... :-/
>
> I was hoping to avoid having a list of DOE devices in the cxlds and simply let
> the auxiliary bus infrastructure do that somehow. IIRC Jonathan was thinking
> along the same lines. I think he actually suggested auxiliary_find_device()...
Ah.. I think I'd been thinking it was scoped to a single parent rather than
all devices in the system. Definitely rather horrible.
Can we do something with device_for_each_child() instead with a match on
bus type to check its an auxilliary bus device then I guess a name based
check on whether that is a doe. etc.
>
> It would be nice if I could have an aux_find_child() or something which
> iterated the auxiliary devices attached to a particular parent device. I've
> just not figured out exactly how to implement that better than what I did here.
>
> >
> > > +
> > > + adev = to_auxiliary_dev(dev);
> > > + doe_dev = container_of(adev, struct pci_doe_dev, adev);
> > > +
> > > + /* If it is one of ours check for the CDAT protocol */
> > > + if (pci_doe_supports_prot(doe_dev, PCI_DVSEC_VENDOR_ID_CXL,
> > > + CXL_DOE_PROTOCOL_TABLE_ACCESS))
> > > + return 1;
> > > +
> > > + return 0;
> > > +}
> > > +
> > > static int cxl_setup_doe_devices(struct cxl_dev_state *cxlds)
> > > {
> > > struct device *dev = cxlds->dev;
> > > struct pci_dev *pdev = to_pci_dev(dev);
> > > + struct auxiliary_device *adev;
> > > + int rc;
> > >
> > > - return pci_doe_create_doe_devices(pdev);
> > > + rc = pci_doe_create_doe_devices(pdev);
> > > + if (rc)
> > > + return rc;
> > > +
> > > + adev = auxiliary_find_device(NULL, cxlds, &cxl_match_cdat_doe_device);
> > > +
> > > + if (adev) {
> > > + struct pci_doe_dev *doe_dev = container_of(adev,
> > > + struct pci_doe_dev,
> > > + adev);
> > > +
> > > + /*
> > > + * No reference need be taken. The DOE device lifetime is
> > > + * longer that the CXL device state lifetime
> > > + */
> >
> > You're holding a reference to the adev here. Did you mean to drop it?
>
> Does find device get a reference? ... Ah shoot I did not see that.
>
> Yea the reference should be dropped somewhere.
>
> Thanks,
> Ira
>
> >
> > > + cxlds->cdat_doe = doe_dev;
> > > + }
> > > +
> > > + return 0;
> > > }
> > >
> > > static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> > > --
> > > 2.31.1
> > >
next prev parent reply other threads:[~2022-02-04 14:04 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-01 7:19 [PATCH V6 00/10] CXL: Read CDAT and DSMAS data from the device ira.weiny
2022-02-01 7:19 ` [PATCH V6 01/10] PCI: Add vendor ID for the PCI SIG ira.weiny
2022-02-03 17:11 ` Bjorn Helgaas
2022-02-03 20:28 ` Ira Weiny
2022-02-01 7:19 ` [PATCH V6 02/10] PCI: Replace magic constant for PCI Sig Vendor ID ira.weiny
2022-02-04 21:16 ` Dan Williams
2022-02-04 21:49 ` Bjorn Helgaas
2022-03-15 21:48 ` Ira Weiny
2022-02-01 7:19 ` [PATCH V6 03/10] PCI/DOE: Add Data Object Exchange Aux Driver ira.weiny
2022-02-03 22:40 ` Bjorn Helgaas
2022-03-15 21:48 ` Ira Weiny
2022-02-09 0:59 ` Dan Williams
2022-02-09 10:13 ` Jonathan Cameron
2022-02-09 16:26 ` Dan Williams
2022-02-09 16:57 ` Jonathan Cameron
2022-02-09 19:57 ` Dan Williams
2022-02-10 21:51 ` Ira Weiny
2022-03-16 22:50 ` Ira Weiny
2022-03-17 19:37 ` Ira Weiny
2022-02-01 7:19 ` [PATCH V6 04/10] PCI/DOE: Introduce pci_doe_create_doe_devices ira.weiny
2022-02-03 22:44 ` Bjorn Helgaas
2022-02-04 14:51 ` Jonathan Cameron
2022-02-04 16:27 ` Bjorn Helgaas
2022-02-11 2:54 ` Dan Williams
2022-03-24 0:26 ` Ira Weiny
2022-03-24 14:05 ` Jonathan Cameron
2022-03-24 23:44 ` Ira Weiny
2022-03-25 12:02 ` Jonathan Cameron
2022-02-01 7:19 ` [PATCH V6 05/10] cxl/pci: Create DOE auxiliary devices ira.weiny
2022-02-01 7:19 ` [PATCH V6 06/10] cxl/pci: Find the DOE mailbox which supports CDAT ira.weiny
2022-02-01 18:49 ` Ben Widawsky
2022-02-01 22:18 ` Ira Weiny
2022-02-04 14:04 ` Jonathan Cameron [this message]
2022-02-01 7:19 ` [PATCH V6 07/10] cxl/mem: Read CDAT table ira.weiny
2022-02-04 13:46 ` Jonathan Cameron
2022-02-01 7:19 ` [PATCH V6 08/10] cxl/cdat: Introduce cdat_hdr_valid() ira.weiny
2022-02-01 18:56 ` Ben Widawsky
2022-02-01 22:29 ` Ira Weiny
2022-02-04 13:17 ` Jonathan Cameron
2022-02-01 7:19 ` [PATCH V6 09/10] cxl/mem: Retry reading CDAT on failure ira.weiny
2022-02-01 18:59 ` Ben Widawsky
2022-02-01 22:31 ` Ira Weiny
2022-02-04 13:20 ` Jonathan Cameron
2022-02-01 7:19 ` [PATCH V6 10/10] cxl/cdat: Parse out DSMAS data from CDAT table ira.weiny
2022-02-01 19:05 ` Ben Widawsky
2022-02-01 22:37 ` Ira Weiny
2022-02-04 13:33 ` Jonathan Cameron
2022-02-04 13:41 ` Jonathan Cameron
2022-02-04 13:40 ` 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=20220204140448.00003c23@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=ben.widawsky@intel.com \
--cc=bhelgaas@google.com \
--cc=dan.j.williams@intel.com \
--cc=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--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 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.