All of lore.kernel.org
 help / color / mirror / Atom feed
From: Demi Marie Obenour <demiobenour@gmail.com>
To: Alistair <alistair@alistair23.me>,
	alistair23@gmail.com, virtio-comment@lists.linux.dev
Subject: Re: [PATCH] transport-pci: Allow storing the configuration in the BAR
Date: Thu, 22 Oct 2026 03:07:11 -0400	[thread overview]
Message-ID: <cb8fa241-b02b-425f-89e2-bdb3d3c6bf30@gmail.com> (raw)
In-Reply-To: <fac44696a94a41a715a0f725cafb44a54d2eef4c.camel@alistair23.me>


[-- Attachment #1.1: Type: text/plain, Size: 8154 bytes --]

On 10/22/26 00:27, Alistair wrote:
> On Fri, 2026-10-02 at 01:48 -0400, Demi Marie Obenour wrote:
>> On 10/1/26 21:04, alistair23@gmail.com wrote:
>>> From: Alistair Francis <alistair.francis@wdc.com>
>>>
>>> Most physical PCI endpoint capable PCIe controllers do not allow
>>> modifying the
>>> capability list, and thus are unable to advertise the Common
>>> configuration
>>> capability.
>>>
>>> This results in physical PCIe endpoints implementing virtio-pci
>>> falling
>>> back to the legacy interface and then needing hacks to deal with
>>> DMA
>>> issues [1].
>>>
>>> One solution to this is to allow the device to store the
>>> configuration
>>> data in the BAR [2]. This can be used as a fallback mechanism so we
>>> don't break any existing setups. New drivers and devices can
>>> attempt
>>> to read the configuration from the capabilities first and then
>>> fallback
>>> to the BAR.
>>>
>>> We also need to add a go_busy field so that the driver and device
>>> have a
>>> basic message box to communicate. This is required for
>>> device_feature_select for example.
>>>
>>> 1: https://lkml.org/lkml/2026/9/1/185
>>> 2: https://lkml.org/lkml/2026/9/1/2370
>>>
>>> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
>>> ---
>>>  transport-pci.tex | 85
>>> +++++++++++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 85 insertions(+)
>>>
>>> diff --git a/transport-pci.tex b/transport-pci.tex
>>> index 95b08b8..7d09169 100644
>>> --- a/transport-pci.tex
>>> +++ b/transport-pci.tex
>>> @@ -262,6 +262,83 @@ \subsection{Virtio Structure PCI
>>> Capabilities}\label{sec:Virtio Transport Option
>>>  fields provide the most significant 32 bits of a total 64 bit
>>> offset and
>>>  length within the BAR specified by \field{cap.bar}.
>>>  
>>> +\subsubsection{Virtio Structure Capabilities in a memory
>>> BAR}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI
>>> Device Layout / Capabilities in a memory BAR}
>>> +
>>> +Some devices, for example implementions using physical PCI
>>> endpoint
>>> +controllers, are unable to add capabilities to the existing PCI
>>> capability
>>> +list. This means they are unable to advertise the virtio structure
>>> +capabilities as described above.
>>> +
>>> +In this case a device MAY instead publish the same capability
>>> structures in
>>> +one of its memory BARs, at offset VIRTIO_PCI_CAP_BAR_OFFSET (0),
>>> prefixed by
>>> +the following header:
>>> +
>>> +\begin{lstlisting}
>>> +#define VIRTIO_PCI_CAP_BAR_OFFSET 0
>>> +#define VIRTIO_PCI_CAP_BAR_MAGIC  0x74726976 /* "virt" */
>>> +#define VIRTIO_PCI_CAP_BAR_VERSION_ONE  1
>>> +
>>> +struct virtio_pci_bar_cap_hdr {
>>> +        le32 magic;             /* VIRTIO_PCI_CAP_BAR_MAGIC */
>>> +        u8 hdr_ver;             /* Version of this header */
>>> +        u8 num_caps;            /* Number of capability entries
>>> that follow */
>>> +        u8 go_busy;             /* Indicates to start an operation
>>> and when it's ongoing */
>>> +        u8 padding[1];
>>> +};
>>> +\end{lstlisting}
>>> +
>>> +The fields are interpreted as follows:
>>> +
>>> +\begin{description}
>>> +\item[\field{magic}]
>>> +        Magic value that identifies the presence of capabilities
>>> in this BAR.
>>> +        Must be set to VIRTIO_PCI_CAP_BAR_MAGIC.
>>> +
>>> +\item[\field{hdr_ver}]
>>> +        The version of this header (virtio_pci_bar_cap_hdr),
>>> currently
>>> +        only version VIRTIO_PCI_CAP_BAR_VERSION_ONE is supported.
>>> +
>>> +\item[\field{num_caps}]
>>> +        The number of struct virtio_pci_cap entries that follow
>>> this header.
>>> +
>>> +\item[\field{go_busy}]
>>> +        The driver writes VIRTIO_PCI_CAP_BAR_VERSION_ONE to this
>>> field to indicate
>>> +        that the device should take action. The device is
>>> considered busy until
>>> +        the driver reads this as 0.
>>> +\end{description}
>>> +
>>> +The header is followed by \field{num_caps} struct virtio_pci_cap
>>> entries
>>> +(see \ref{sec:Virtio Transport Options / Virtio Over PCI Bus /
>>> Virtio Structure PCI Capabilities}),
>>> +the first of which begins immediately after struct
>>> +virtio_pci_bar_cap_hdr.
>>> +
>>> +The entries are packed one immediately after another. Each entry
>>> is interpreted
>>> +the same as if they are in configuration space and locate the
>>> +corresponding structure within a memory BAR.
>>> +
>>> +Note that the \field{cap_vndr} and \field{cap_next} fields are not
>>> used in
>>> +this case.
>>> +
>>> +For read-write communication with the device, for example
>>> \field{device_feature_select},
>>> +the driver should set the value of the field then write the header
>>> version to
>>> +\field{go_busy}. This indicates to the device that an action is
>>> required.
>>> +
>>> +The device will then read the fields, take action according to the
>>> sections above
>>> +and when complete clear the \field{go_busy}. The driver MUST NOT
>>> read or write
>>> +other fields until \field{go_busy} has been cleared by the device.
>>> +
>>> +Note the driver can write to multiple fields before triggering
>>> \field{go_busy}. The
>>> +device MUST then take all actions before clearing \field{go_busy}.
>>> +
>>> +A device that publishes capabilities in a memory BAR MUST place
>>> struct
>>> +virtio_pci_bar_cap_hdr at offset VIRTIO_PCI_CAP_BAR_OFFSET within
>>> a memory
>>> +BAR.
>>> +
>>> +A device MUST follow struct virtio_pci_bar_cap_hdr with
>>> \field{num_caps} struct virtio_pci_cap entries.
>>> +
>>> +The device MUST provide the same capabilities it usually would,
>>> just in the memory
>>> +BAR.
>>> +
>>>  \drivernormative{\subsubsection}{Virtio Structure PCI
>>> Capabilities}{Virtio Transport Options / Virtio Over PCI Bus /
>>> Virtio Structure PCI Capabilities}
>>>  
>>>  The driver MUST ignore any vendor-specific capability structure
>>> which has
>>> @@ -270,6 +347,14 @@ \subsection{Virtio Structure PCI
>>> Capabilities}\label{sec:Virtio Transport Option
>>>  The driver SHOULD use the first instance of each virtio structure
>>> type they can
>>>  support.
>>>  
>>> +The driver SHOULD first attempt to use the virtio structure
>>> capabilities in
>>> +the PCI configuration space. If no common configuration capability
>>> is
>>> +present, the driver MAY scan each memory BAR at offset
>>> +VIRTIO_PCI_CAP_BAR_OFFSET for a struct virtio_pci_bar_cap_hdr
>>> whose
>>> +\field{magic} equals VIRTIO_PCI_CAP_BAR_MAGIC. If found, use the
>>> +capability entries published there as described in
>>> +\ref{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI
>>> Device Layout / Capabilities in a memory BAR}.
>>> +
>>>  The driver MUST accept a \field{cap_len} value which is larger
>>> than specified here.
>>>  
>>>  The driver MUST ignore any vendor-specific capability structure
>>> which has
>>
>> How is the driver supposed to know that the memory BAR contains that
>> structure, and not unrelated data that happens to be correctly
>> formed?
> 
> Sorry for the delay, I lost this email while I was travelling.
> 
> I don't have an answer here. The driver is supposed to search for
> VIRTIO_PCI_CAP_BAR_MAGIC at offset VIRTIO_PCI_CAP_BAR_OFFSET, which
> could exist independently.
> 
>>
>> From what I can tell, feature bit 31 is currently not used for any
>> purpose.  Setting it could be used to indicate that the structure
>> is present.
> 
> Do you mean have the driver probe for feature bit 31 (after searching
> for VIRTIO_PCI_CAP_BAR_MAGIC at offset VIRTIO_PCI_CAP_BAR_OFFSET) to
> confirm that it is supported?
> 
> Alistair

I meant having a feature bit that is compatible with the legacy
interface, but which tells the driver that the device is really
a modern driver with its common configuration capability in a
specified BAR.
-- 
Sincerely,
Demi Marie Obenour (she/her/hers)

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  parent reply	other threads:[~2026-10-22  7:07 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02  1:04 [PATCH] transport-pci: Allow storing the configuration in the BAR alistair23
2026-10-02  5:48 ` Demi Marie Obenour
2026-10-22  4:30   ` Alistair Francis
     [not found]   ` <fac44696a94a41a715a0f725cafb44a54d2eef4c.camel@alistair23.me>
2026-10-22  7:07     ` Demi Marie Obenour [this message]
2026-10-27  6:05       ` Alistair Francis
2026-10-28  0:54         ` Demi Marie Obenour

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=cb8fa241-b02b-425f-89e2-bdb3d3c6bf30@gmail.com \
    --to=demiobenour@gmail.com \
    --cc=alistair23@gmail.com \
    --cc=alistair@alistair23.me \
    --cc=virtio-comment@lists.linux.dev \
    /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.