SPRUI30H November 2015 – May 2024 DRA745 , DRA746 , DRA750 , DRA756
Each command list entry has an associated command header (CH) that takes 32 bytes in host system memory, from which only the first 4 Dwords (16 bytes) are used. The CH contains different fields that detail the direction of transfer (H2D or D2H), type of command (ATA/ATAPI), reset behavior, PM ID, byte count and byte length of the PRD table, etc.
A command list slot CH specifies the base address of the underlying command table and information about the associated command FIS length. The command table in system memory has three main areas:
An entry of a PRD table (that is, a scatter/gather list item) specifies descriptor parameters of a data block transfer handled by the HBA port DMA.
Figure 24-158 shows the interrelations between the FIS-related structures that user software must allocate and build into the host system memory.
For details on command and data structures in host system memory, see the AHCI and SATA standard specifications.
After allocating the necessary portions for the CL, command slots underlying data descriptors, and received FISs into host system memory, the base addresses of these memory locations must be provided by user software to the HBA through the hardware init domain registers: SATA_PxCLB (command list base address - lower bits), SATA_PxCLBU (command list base address-upper bits), SATA_PxFB (received FISs system memory area base address-lower bits) and SATA_PxFBU (received FISs system memory area base address-upper bits) . Thus, the command and data DMA engines can access the transfer context programming structures.
SATA_PxCLBU / SATA_PxFBU registers store the upper half of the native 64-bit AHCI addresses. Because only 36-lower bits of the AHCI 64-bit address bus are integrated in the device, actually only the 4-lower bits within SATA_PxCLBU / SATA_PxFBU are meaningful. The remaining 28-bits must be always written to '0'-s in the descriptors ( SATA_PxCLBU[31:4]=0x0 / SATA_PxFBU[31:4]=0x0) .
Default value for the SATA_PxCLBU / SATA_PxFBU registers is 0x0, so that a 32-bit SW driver which never accesses them works seamlessly, by accessing only the 32-bit (lower half) addresses which reside in the SATA_PxCLB / SATA_PxFB registers.