121 lines
4.5 KiB
TeX
121 lines
4.5 KiB
TeX
The \ac{ahci} is a standard by Intel that defines a common API for \ac{sata}
|
|
and SAS host bus adapters. In order to provide backwards-compatibility,
|
|
\ac{ahci} specifies modes for both legacy IDE emulation and a standardized
|
|
\ac{ahci} interface.
|
|
|
|
\ac{ahci} only implements the transport aspect of the communication with
|
|
devices. Commands are still transferred as specified in the \ac{ata}/\ac{atapi}
|
|
standards.
|
|
|
|
\section{ATA/ATAPI/SATA}
|
|
|
|
The \ac{ata} standard specifies an interface for connecting several types of
|
|
storage devices, including devices with removable media. \ac{atapi} provides an
|
|
extension to allow \ac{ata} to transmit \acs{scsi} commands.
|
|
|
|
Commands that can be sent to \ac{ata} devices are specified in the \ac{acs}
|
|
specifications. Commands in particular interest for this lab project are the
|
|
\texttt{IDENTIFY}, \texttt{READ DMA}, \texttt{WRITE DMA} and \texttt{FLUSH
|
|
CACHE} commands.
|
|
|
|
The way these commands are sent to the device is specified in the respective
|
|
specification, for example the \ac{sata} or \ac{pata} specifications.
|
|
|
|
\subsection{SATA}
|
|
|
|
The \ac{sata} standard specifies the layout of the command \acp{fis} that
|
|
encapsulate traditional ATA commands as well as all the lower layers of the
|
|
interface to the disk, such as the physical layer.
|
|
|
|
Figure \ref{fig:h2d_fis} shows the structure of an example \ac{fis}. A Host to
|
|
Device Register \ac{fis} can be used to send commands to the disk. The command
|
|
value is specified by \ac{ata}. The \ac{fis} contains additional values such as
|
|
\ac{lba} and sector count.
|
|
|
|
\begin{figure}[ht]
|
|
\centering
|
|
\includegraphics[width=.7\textwidth]{h2d_fis.pdf}
|
|
\caption{Host to Device Register FIS \cite[p.~336]{sata_2.6}}
|
|
\label{fig:h2d_fis}
|
|
\end{figure}
|
|
|
|
\section{AHCI}
|
|
|
|
\subsection{Memory Registers}
|
|
|
|
While the \acs{pci} base address register 0-4 may contain pointers to address
|
|
spaces for legacy IDE emulation, \ac{bar} 5 contains the address of the
|
|
\ac{hba}'s memory mapped registers. As shown in figure \ref{fig:hba_mem}, this
|
|
address space is divided into two areas: global registers for control of the
|
|
\ac{hba} and registers for up to 32 ports. A port can be attached to either a
|
|
device or a port multiplier. In this lab project, we focus on device handling
|
|
and ignore port multipliers.
|
|
|
|
\begin{figure}[ht]
|
|
\centering
|
|
\includegraphics[width=.7\textwidth]{hba_mem.png}
|
|
\caption{HBA Memory Space Usage \cite[p.~33]{ahci_1.3}}
|
|
\label{fig:hba_mem}
|
|
\end{figure}
|
|
|
|
Every port area (\autoref{fig:port_mem}) contains further control registers and
|
|
pointers to the memory regions for the command list and receive \ac{fis} area.
|
|
Each of these pointers is a 64-bit value (32-bit for \acp{hba} that don't
|
|
support 64-bit addressing) stored in two port registers.
|
|
|
|
\begin{figure}[ht]
|
|
\centering
|
|
\includegraphics[width=.9\textwidth]{pmem_overview.pdf}
|
|
\caption{Port System Memory Structure adapted from \cite[p.~34]{ahci_1.3}}
|
|
\label{fig:port_mem}
|
|
\end{figure}
|
|
|
|
\subsection{Received FIS Area}
|
|
|
|
The received \ac{fis} area serves as an area where copies of the \acp{fis}
|
|
received from the device are stored. The \ac{hba} will copy all incoming
|
|
\acp{fis} to the appropriate region of the \ac{rfis} area. If the \ac{hba}
|
|
receives an unkown \ac{fis} it is copied to the Unknown \ac{fis} region if it
|
|
is at most 64 bytes long. If the \ac{hba} receives an unknown \ac{fis} that is
|
|
longer than 64 bytes, it will be considered illegal.
|
|
|
|
\begin{figure}[ht]
|
|
\centering
|
|
\includegraphics[width=.8\textwidth]{rfis_area.pdf}
|
|
\caption{Received FIS Organization, adapted from \cite[p.~35]{ahci_1.3}}
|
|
\label{fig:rfis_mem}
|
|
\end{figure}
|
|
|
|
|
|
\subsection{Commands}
|
|
|
|
A command list (\autoref{fig:command_list}) contains 32 command headers, which
|
|
each contain the metadata for a single command.
|
|
|
|
Commands can be issued to the device by constructing a command header
|
|
containing a reference to a command table and further metadata for the command
|
|
to be issued.
|
|
|
|
\begin{figure}[ht]
|
|
\centering
|
|
\includegraphics[width=.8\textwidth]{command_list_structure.png}
|
|
\caption{Command List Structure \cite[p.~36]{ahci_1.3}}
|
|
\label{fig:command_list}
|
|
\end{figure}
|
|
|
|
The command table (\autoref{fig:command_table}) contains the command \ac{fis}
|
|
itself and an optional number of physical region descriptors specifying chunks
|
|
of main memory in form of a scatter-gather list.
|
|
|
|
\begin{figure}[ht]
|
|
\centering
|
|
\includegraphics[width=.8\textwidth]{command_table.png}
|
|
\caption{Command Table \cite[p.~39]{ahci_1.3}}
|
|
\label{fig:command_table}
|
|
\end{figure}
|
|
|
|
Commands are issued by setting the corresponding bit in the command issue
|
|
register. Upon command completion, the bit is cleared and if enabled, an
|
|
interrupt is triggered.
|
|
|