From: Lorenzo Pieralisi <lpieralisi@kernel.org>
To: "Pali Rohár" <pali@kernel.org>
Cc: "Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Rob Herring" <robh@kernel.org>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Marek Behún" <kabel@kernel.org>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] PCI: pci-bridge-emul: Set position of PCI capabilities to real HW value
Date: Wed, 24 Aug 2022 09:25:15 +0200 [thread overview]
Message-ID: <YwXSW4pDSMZeHhMm@lpieralisi> (raw)
In-Reply-To: <20220823163110.rtqz534otlzsziza@pali>
[...]
> > In other words: what if PCI express capability is lower in the address
> > space (config) than the subsystem ID vendor capability ?
>
> Current code expects that if host controller driver sets both pcie_start
> and ssid_start, those values are correct, non-overlapping and can be
> handled correctly.
>
> And if offset to PCI express capability is lower than offset to SSID
> capability then there should not be any issue. First capability is
> correctly set into capabilities_pointer (via min function) and then
> pci_bridge_emul_conf_read() should handle it.
I don't understand how the pointer to the SSID cap is set in this
specific case, I don't see any code doing that but that's most certainly
because I don't know in details the emul bridge internals.
IIUC, in pci_bridge_emul_read_ssid(), we set the next cap pointer if
the PCI express capability is at an address higher (current case) than
the SSID capability otherwise we set it to 0 (end of the list).
The other way around, I don't see the PCI express next cap pointer
being set anywhere (where, IIUC, it should be set to point to the
SSID cap) - I am not sure you are handling it.
That's the only question I have on this patch.
Lorenzo
> The whole my idea is to construct capabilities linked list structure
> correctly based on input requirements (e.g. fixed location of some
> capability, etc).
>
> > I am just trying to understand the patch, so forgive me if the question
> > is already addressed in the code.
> >
> > Thanks,
> > Lorenzo
> >
> > > + else
> > > + bridge->pcie_start = bridge->ssid_start + PCI_CAP_SSID_SIZEOF;
> > > + }
> > > +
> > > + bridge->conf.capabilities_pointer = min(bridge->ssid_start, bridge->pcie_start);
> > >
> > > if (bridge->conf.capabilities_pointer)
> > > bridge->conf.status |= cpu_to_le16(PCI_STATUS_CAP_LIST);
> > > @@ -459,15 +468,17 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where,
> > > read_op = bridge->ops->read_base;
> > > cfgspace = (__le32 *) &bridge->conf;
> > > behavior = bridge->pci_regs_behavior;
> > > - } else if (reg >= PCI_CAP_SSID_START && reg < PCI_CAP_SSID_END && bridge->subsystem_vendor_id) {
> > > + } else if (reg >= bridge->ssid_start && reg < bridge->ssid_start + PCI_CAP_SSID_SIZEOF &&
> > > + bridge->subsystem_vendor_id) {
> > > /* Emulated PCI Bridge Subsystem Vendor ID capability */
> > > - reg -= PCI_CAP_SSID_START;
> > > + reg -= bridge->ssid_start;
> > > read_op = pci_bridge_emul_read_ssid;
> > > cfgspace = NULL;
> > > behavior = NULL;
> > > - } else if (reg >= PCI_CAP_PCIE_START && reg < PCI_CAP_PCIE_END && bridge->has_pcie) {
> > > + } else if (reg >= bridge->pcie_start && reg < bridge->pcie_start + PCI_CAP_PCIE_SIZEOF &&
> > > + bridge->has_pcie) {
> > > /* Our emulated PCIe capability */
> > > - reg -= PCI_CAP_PCIE_START;
> > > + reg -= bridge->pcie_start;
> > > read_op = bridge->ops->read_pcie;
> > > cfgspace = (__le32 *) &bridge->pcie_conf;
> > > behavior = bridge->pcie_cap_regs_behavior;
> > > @@ -538,9 +549,10 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where,
> > > write_op = bridge->ops->write_base;
> > > cfgspace = (__le32 *) &bridge->conf;
> > > behavior = bridge->pci_regs_behavior;
> > > - } else if (reg >= PCI_CAP_PCIE_START && reg < PCI_CAP_PCIE_END && bridge->has_pcie) {
> > > + } else if (reg >= bridge->pcie_start && reg < bridge->pcie_start + PCI_CAP_PCIE_SIZEOF &&
> > > + bridge->has_pcie) {
> > > /* Our emulated PCIe capability */
> > > - reg -= PCI_CAP_PCIE_START;
> > > + reg -= bridge->pcie_start;
> > > write_op = bridge->ops->write_pcie;
> > > cfgspace = (__le32 *) &bridge->pcie_conf;
> > > behavior = bridge->pcie_cap_regs_behavior;
> > > diff --git a/drivers/pci/pci-bridge-emul.h b/drivers/pci/pci-bridge-emul.h
> > > index 71392b67471d..2a0e59c7f0d9 100644
> > > --- a/drivers/pci/pci-bridge-emul.h
> > > +++ b/drivers/pci/pci-bridge-emul.h
> > > @@ -131,6 +131,8 @@ struct pci_bridge_emul {
> > > struct pci_bridge_reg_behavior *pci_regs_behavior;
> > > struct pci_bridge_reg_behavior *pcie_cap_regs_behavior;
> > > void *data;
> > > + u8 pcie_start;
> > > + u8 ssid_start;
> > > bool has_pcie;
> > > u16 subsystem_vendor_id;
> > > u16 subsystem_id;
> > > --
> > > 2.20.1
> > >
next prev parent reply other threads:[~2022-08-24 7:25 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-03 10:46 [PATCH] PCI: pci-bridge-emul: Set position of PCI capabilities to real HW value Pali Rohár
2022-08-18 13:50 ` Pali Rohár
2022-08-18 22:31 ` Bjorn Helgaas
2022-08-18 22:36 ` Pali Rohár
2022-08-18 23:02 ` Bjorn Helgaas
2022-08-23 9:06 ` Lorenzo Pieralisi
2022-08-23 9:25 ` Pali Rohár
2022-08-23 10:14 ` [PATCH v2] " Pali Rohár
2022-08-23 15:55 ` Lorenzo Pieralisi
2022-08-23 16:31 ` Pali Rohár
2022-08-24 7:25 ` Lorenzo Pieralisi [this message]
2022-08-24 10:33 ` Pali Rohár
2022-08-24 11:21 ` [PATCH v3] " Pali Rohár
2022-08-25 10:09 ` Lorenzo Pieralisi
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=YwXSW4pDSMZeHhMm@lpieralisi \
--to=lpieralisi@kernel.org \
--cc=bhelgaas@google.com \
--cc=kabel@kernel.org \
--cc=kw@linux.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=pali@kernel.org \
--cc=robh@kernel.org \
--cc=thomas.petazzoni@bootlin.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