diff options
| -rw-r--r-- | content.tex | 74 | 
1 files changed, 40 insertions, 34 deletions
diff --git a/content.tex b/content.tex index 999ebbd..aa191a3 100644 --- a/content.tex +++ b/content.tex @@ -654,14 +654,14 @@ free descriptors before beginning the mappings.  The descriptor chain head is the first d in the algorithm  above, ie. the index of the descriptor table entry referring to the first -part of the buffer.  A naive implementation would do the following (with the +part of the buffer.  A naive driver implementation MAY do the following (with the  appropriate conversion to-and-from little-endian assumed):  \begin{lstlisting}  avail->ring[avail->idx % qsz] = head;  \end{lstlisting} -However, in general the driver can add many descriptor chains before it updates +However, in general the driver MAY add many descriptor chains before it updates  \field{idx} (at which point they become visible to the  device), so it is common to keep a counter of how many the driver has added: @@ -671,13 +671,13 @@ avail->ring[(avail->idx + added++) % qsz] = head;  \subsubsection{Updating \field{idx}}\label{sec:General Initialization And Device Operation / Device Operation / Supplying Buffers to The Device / Updating idx} -Once \field{idx} is updated, the device will -be able to access the descriptor chains the driver created and the -memory they refer to. This is why a memory barrier is generally -used before the \field{idx} update, to ensure it sees the most up-to-date -copy. +Once available \field{idx} is updated by driver, the device MAY +access the descriptor chains the driver created and the +memory they refer to. This is why the driver SHOULD generally +use a memory barrier before the \field{idx} update, to ensure the +device sees the most up-to-date copy. -\field{idx} always increments, and the driver can let it wrap naturally at +\field{idx} always increments, and wraps naturally at  65536:  \begin{lstlisting} @@ -718,7 +718,8 @@ similar to the algorithm used for the driver to send the device a  buffer:  \begin{enumerate} -\item Write the head descriptor number to the next entry in the used +\item Write the head descriptor number to the next free entry +  (pointed to by the used ring \field{idx}) in the used    ring.  \item Update the used ring \field{idx}. @@ -946,7 +947,7 @@ The fields are interpreted as follows:  \item[\field{offset}]          indicates where the structure begins relative to the base address associated -        with the BAR.  The alignment requirement of \field{offset} are indicated +        with the BAR.  The alignment requirements of \field{offset} are indicated          in each structure-specific section below.  \item[\field{length}] @@ -1096,14 +1097,14 @@ struct virtio_pci_notify_cap {  The device MUST either present \field{notify_off_multiplier} as an even power of 2,  or present \field{notify_off_multiplier} as 0. -\field{notify_off_multiplier} field is combined with the \field{queue_notify_off} to +\field{notify_off_multiplier} is combined with the \field{queue_notify_off} to  derive the Queue Notify address within a BAR for a specific queue:  \begin{lstlisting}          cap.offset + queue_notify_off * notify_off_multiplier  \end{lstlisting} -The BAR, \field{offset} and \field{notify_off_multiplier} are taken from the +The \field{cap.offset} and \field{notify_off_multiplier} are taken from the  notification capability structure above, and the \field{queue_notify_off} is  taken from the common configuration structure. @@ -1123,10 +1124,12 @@ cap.length >= queue_notify_off * notify_off_multiplier + 2  The device MUST present at least one VIRTIO_PCI_CAP_ISR_CFG capability.  This  refers to at least a single byte, which contains the 8-bit ISR status field. -The \field{offset} for the ISR status field has no specific alignment requirements. +The \field{offset} for the \field{ISR status} has no specific alignment requirements. -The ISR status field is used for INT\#x interrupt handling. -The driver MUST NOT access the ISR field when MSI-X capability +\subsection{ISR status field}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / ISR status field} + +\field{ISR status} is used for INT\#x interrupt handling. +Driver MUST NOT access \field{ISR status} when MSI-X capability  is enabled.  \begin{tabular}{ |l||l|l|l| } @@ -1139,15 +1142,17 @@ Purpose    & Device Configuration Interrupt  & Queue Interrupt & Reserved \\  If MSI-X capability is disabled, device MUST set Interrupt Status  bit in the PCI Status register in the PCI Configuration Header of -the device to the logical OR of all bits in ISR status field of +the device to the logical OR of all bits in \field{ISR status} of  the device.  Device then asserts/deasserts INT\#x interrupts unless masked  according to standard PCI rules \hyperref[intro:PCI]{[PCI]}. -Device MUST reset the ISR status field to 0 on read. +Device MUST reset \field{ISR status} to 0 on read. -In this way, driver read of ISR status causes the device to de-assert +In this way, driver read of \field{ISR status} causes the device to de-assert  an interrupt. +See sections \ref{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Virtqueue Interrupts From The Device} and \ref{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Notification of Device Configuration Changes} for how this is used. +  \subsubsection{Device specific structure}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / Device specific structure}  The device MAY present at least one VIRTIO_PCI_CAP_DEVICE_CFG capability (some @@ -1170,10 +1175,10 @@ struct virtio_pci_cfg_cap {  };  \end{lstlisting} -The fields \field{cap.bar}, \field{cap.length}, \field{cap.offset} and \field{pci_cfg_data} -are read-write (RW). +The fields \field{cap.bar}, \field{cap.legth}, \field{cap.offset} and +\field{pci_cfg_data} are read-write (RW). -To access to a device region, the driver writes into the capability +To access a device region, the driver writes into the capability  structure (ie. within the PCI configuration space) as follows:  \begin{itemize} @@ -1207,12 +1212,11 @@ Transitional devices should present part of configuration  registers in a legacy configuration structure in BAR0 in the first I/O  region of the PCI device, as documented below. -There may be different widths of accesses to the I/O region; the -“natural” access method for each field in the virtio common configuration structure must be -used (i.e. 32-bit accesses for 32-bit fields, etc), but  -when accessed through the legacy interface the -device-specific region can be accessed using any width accesses, and -should obtain the same results. +When accessed through the legacy interface the driver MAY access +the device-specific region using any width accesses, and +a transitional device MUST present it with the same results as +when accessed using the “natural” access method (i.e. +32-bit accesses for 32-bit fields, etc).  Note that this is possible because while the virtio common configuration structure is PCI  (i.e. little) endian, when using the legacy interface the device-specific @@ -1334,7 +1338,7 @@ Writing a valid MSI-X Table entry number, 0 to 0x7FF, to  \field{config_msix_vector}/\field{queue_msix_vector} maps interrupts triggered  by the configuration change/selected queue events respectively to  the corresponding MSI-X vector. To disable interrupts for a -specific event type, unmap it by writing a special NO_VECTOR +specific event type, unmap this event by writing a special NO_VECTOR  value:  \begin{lstlisting} @@ -1346,14 +1350,15 @@ Reading these registers returns vector mapped to a given event,  or NO_VECTOR if unmapped. All queue and configuration change  events are unmapped by default. -Note that mapping an event to vector might require allocating -internal device resources, and might fail. Devices MUST report such +Note that mapping an event to vector might require device to +allocate internal device resources, and MAY fail. Devices MUST report such  failures by returning the NO_VECTOR value when the relevant  Vector field is read. After mapping an event to vector, the  driver MUST verify success by reading the Vector field value: on  success, the previously written value is returned, and on  failure, NO_VECTOR is returned. If a mapping failure is detected, -the driver can retry mapping with fewer vectors, or disable MSI-X. +the driver MAY retry mapping with fewer vectors, disable MSI-X +or report device failure.  \paragraph{Virtqueue Configuration}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Device Initialization / Virtqueue Configuration} @@ -1415,7 +1420,7 @@ If an interrupt is necessary for a virtqueue, the device SHOULD:        device, \field{queue_msix_vector} sets the MSI-X Table entry        number. -    \item If the vector field value is NO_VECTOR, no interrupt +    \item If the vector value is NO_VECTOR, no interrupt        message is requested for this event, so the device MUST NOT        deliver an interrupt.      \end{enumerate} @@ -1439,7 +1444,8 @@ The driver interrupt handler SHOULD:  \subsubsection{Notification of Device Configuration Changes}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Notification of Device Configuration Changes} -Some devices can change the device configuration space. In this case: +Some virtio PCI devices can change the device configuration +state, as reflected in the device-specific region of the device. In this case:  \begin{itemize}    \item If MSI-X capability is disabled: an interrupt is delivered and @@ -3616,7 +3622,7 @@ configuration change interrupt.  \item In either case, once the device has completed the inflation or    deflation, \field{actual} should be -  updated to reflect the new number of pages in the balloon.\footnote{As updates to device configuration space are not atomic, this field +  updated to reflect the new number of pages in the balloon.\footnote{As updates to device-specific configuration space are not atomic, this field  isn't particularly reliable, but can be used to diagnose buggy guests.  }  \end{enumerate}  | 
