[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: [PATCH 1/1] ccw: ccw payload description
Move the ccw payload description to tables, instead of using C structures with gcc extensions or textual descriptions. Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com> Suggested-by: Thomas Huth <thuth@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> --- content.tex | 178 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 64 deletions(-) diff --git a/content.tex b/content.tex index 7091bf4..efc8035 100644 --- a/content.tex +++ b/content.tex @@ -1830,8 +1830,8 @@ virtio support is mainly a question of supporting a new control unit type. As the S/390 is a big endian machine, the data structures transmitted -via channel commands are big-endian: this is made clear by use of -the types be16, be32 and be64. +via channel commands are big-endian in the general case; deviations +are marked. \subsection{Basic Concepts}\label{sec:Virtio Transport Options / Virtio over channel I/O / Basic Concepts} @@ -1916,16 +1916,17 @@ CCW_CMD_SET_VIRTIO_REV is issued by the driver to set the revision of the virtio-ccw transport it intends to drive the device with. It uses the following communication structure: -\begin{lstlisting} - struct virtio_rev_info { - __u16 revision; - __u16 length; - __u8 data[]; - }; -\end{lstlisting} - -revision contains the desired revision id, length the length of the -data portion and data revision-dependent additional desired options. +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 2 & big & revision & desired revision id \\ +\hline +2 & 2 & big & length & length of data portion \\ +\hline +4 & <length> & big & data & revision-dependent additional desired options \\ +\hline +\end{tabular} The following values are supported: @@ -1988,12 +1989,15 @@ implies that the device MUST reject any command not valid for revision CCW_CMD_READ_VQ_CONF is issued by the driver to obtain information about a queue. It uses the following structure for communicating: -\begin{lstlisting} - struct vq_config_block { - be16 index; - be16 max_num; - } __attribute__ ((packed)); -\end{lstlisting} +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 2 & big & index & queue index for which the configuration is requested \\ +\hline +2 & 4 & big & max_num & number of buffers for queue \\ +\hline +\end{tabular} The requested number of buffers for queue index is returned in max_num. @@ -2002,16 +2006,23 @@ Afterwards, CCW_CMD_SET_VQ is issued by the driver to inform the device about the location used for its queue. The transmitted structure is -\begin{lstlisting} - struct vq_info_block { - be64 desc; - be32 res0; - be16 index; - be16 num; - be64 avail; - be64 used; - } __attribute__ ((packed)); -\end{lstlisting} +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 8 & big & desc & guest address for descriptor table \\ +\hline +8 & 4 & n/a & res0 & reserved \\ +\hline +12 & 2 & big & index & queue index information is set for \\ +\hline +14 & 2 & big & num & number of allocated virtqueue buffers \\ +\hline +16 & 8 & big & avail & guest address for available ring \\ +\hline +24 & 8 & big & used & guest address for used ring \\ +\hline +\end{tabular} desc, avail and used contain the guest addresses for the descriptor table, available ring and used ring for queue index, respectively. The actual @@ -2023,17 +2034,19 @@ res0 is reserved and MUST be ignored by the device. For a legacy driver or for a driver that selected revision 0, CCW_CMD_SET_VQ uses the following communication block: -\begin{lstlisting} - struct vq_info_block_legacy { - be64 queue; - be32 align; - be16 index; - be16 num; - } __attribute__ ((packed)); -\end{lstlisting} - -queue contains the guest address for queue index, num the number of buffers -and align the alignment. +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 8 & big & queue & guest address for virtqueue \\ +\hline +8 & 4 & big & align & alignment of virtqueue \\ +\hline +12 & 2 & big & index & queue index information is set for \\ +\hline +14 & 2 & big & num & number of allocated virtqueue buffers \\ +\hline +\end{tabular} \subsubsection{Virtqueue Layout}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Initialization / Virtqueue Layout} @@ -2062,8 +2075,15 @@ The calculation for total size is as follows: The driver changes the status of a device via the CCW_CMD_WRITE_STATUS command, which transmits an 8 bit status -value. +value: +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 1 & n/a & status & device status \\ +\hline +\end{tabular} \subsubsection{Handling Device Features}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Initialization / Handling Device Features} Feature bits are arranged in an array of 32 bit values, making @@ -2073,16 +2093,15 @@ little-endian byte order. The CCW commands dealing with features use the following communication block: -\begin{lstlisting} - struct virtio_feature_desc { - le32 features; - u8 index; - } __attribute__ ((packed)); -\end{lstlisting} - -features are the 32 bits of features currently accessed, while -index describes which of the feature bit values is to be -accessed. +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 4 & little & features & 32 bit value of features accessed \\ +\hline +4 & 1 & n/a & index & index of the 32 bit value \\ +\hline +\end{tabular} The guest obtains the device's device feature set via the CCW_CMD_READ_FEAT command. The device stores the features at index @@ -2097,6 +2116,17 @@ combination. The device's configuration space is located in host memory. It is the same size as the standard PCI configuration space. +The configuration-related CCW commands use the following communication +area: + +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & config space size & big & config & configuration space \\ +\hline +\end{tabular} + To obtain information from the configuration space, the driver uses CCW_CMD_READ_CONF, specifying the guest memory for the device to write to. @@ -2128,9 +2158,16 @@ Indicators for notification via classic I/O interrupts are contained in a 64 bit value per virtio-ccw proxy device. To communicate the location of the indicator bits for host->guest -notification, the driver uses the CCW_CMD_SET_IND command, -pointing to a location containing the guest address of the -indicators in a 64 bit value. +notification, the driver uses the CCW_CMD_SET_IND command with the +following communication block: + +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 8 & big & indicators & guest address of indicators \\ +\hline +\end{tabular} If the driver has already set up two-staged queue indicators via the CCW_CMD_SET_IND_ADAPTER command, the device MUST post a unit check @@ -2143,8 +2180,15 @@ contained in a 64 bit value per virtio-ccw proxy device. To communicate the location of the indicator bits used in the configuration change host->guest notification, the driver issues the -CCW_CMD_SET_CONF_IND command, pointing to a location containing the -guest address of the indicators in a 64 bit value. +CCW_CMD_SET_CONF_IND command with the following communication block: + +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 8 & big & indicators & guest address of indicators \\ +\hline +\end{tabular} \paragraph{Setting Up Two-Stage Queue Indicators}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Initialization / Setting Up Indicators / Setting Up Two-Stage Queue Indicators} @@ -2161,14 +2205,19 @@ To communicate the location of the summary and queue indicator bits, the driver uses the CCW_CMD_SET_IND_ADAPTER command with the following payload: -\begin{lstlisting} - struct virtio_thinint_area { - be64 summary_indicator; - be64 indicator; - be64 bit_nr; - u8 isc; - } __attribute__ ((packed)); -\end{lstlisting} +\begin{tabular}{ |l|l|l|l|l| } +\hline +Offset & Length & Endianness & Name & Description \\ +\hline \hline +0 & 8 & big & summary_indicator & guest address of summary indicator \\ +\hline +8 & 8 & big & indicator & guest address of indicator area \\ +\hline +16 & 8 & big & bit_nr & index of indicator bit for first queue \\ +\hline +24 & 1 & n/a & isc & I/O interruption subclass \\ +\hline +\end{tabular} summary_indicator contains the guest address of the 8 bit summary indicator. @@ -2281,8 +2330,9 @@ used. \subsubsection{Resetting Devices}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Operation / Resetting Devices} In order to reset a device, a driver sends the -CCW_CMD_VDEV_RESET command. +CCW_CMD_VDEV_RESET command. It takes no payload. +If the driver transmits a payload, it MUST be ignored by the device. \chapter{Device Types}\label{sec:Device Types} -- 1.7.9.5
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]