SATA Lockup after SATA DPLL Unlock/Relock
DESCRIPTION
Consider the following scenario:
- Initialize SATA.
- Enable TX/RX PHYs, start controller DMA engine, spin up the device (SATA_PxCMD[1] SUD = 0x1).
- Enable aggressive transitions to partial or slumber: SATA_PxCMD[26] ALPE = 0x1 and SATA_PxCMD[27] = 0x0/0x1
- Perform DMA/PIO transfers.
- Wait until all commands are finished. Interface (only physical lines) should go to low power mode.
- Check that transition to partial is complete.
- Stop all DMA machines, set SATA_PxCMD[1] SUD bit to 0, power down the PHYs.
- Unlock SATA DPLL (DPLLCTRL_SATA.PLL_GO[0] PLL_GO = 0x0)
- Relock SATA DPLL (DPLLCTRL_SATA.PLL_GO[0] PLL_GO = 0x1), go out to low power mode.
- Go to Step 2.
After the first loop, when re-executing Step 2 and spinning up the device, communication is blocked between the host and the device, and the SATA is locked up.
A simpler scenario can be used to reproduce the issue. In this case, no SATA commands are issued by the host.
- Initialize the SATA.
- Enable PHYs, start RX DMA engine, initiate staggered spin-up, and start TX DMA engine.
- Read SATA status register SATA_PxTFD.
- Stop all DMA engine, set SATA_PxCMD[1] SUD bit to 0, power down the PHYs.
- Unlock and relock SATA DPLL (DPLLCTRL_SATA.PLL_GO[0] PLL_GO = 0x0 then DPLLCTRL_SATA.PLL_GO[0] PLL_GO = 0x1).
- Go to Step 2.
These issues are usually encountered immediately after the first loop, although this is not always the case.
WORKAROUND
To prevent the SATA Lockup the SATA DPLL Unlock sequence must be performed as follows:
- Unlock SATA DPLL (DPLLCTRL_SATA.PLL_GO[0] PLL_GO = 0x0)
- Toggle SATA_PLL_SOFT_RESET bit of CTRL_CORE_SMA_SW_0 register from 0->1
- Toggle SATA_PLL_SOFT_RESET bit of CTRL_CORE_SMA_SW_0 register from 1->0
REVISIONS IMPACTED
SR 2.0, 1.1
TDA2x: 2.0, 1.1, 1.0
DRA75x, DRA74x: 2.0, 1.1, 1.0
AM572x: 2.0, 1.1