ARMADA espressobin SATA drive detection failure
Pali Rohár
pali at kernel.org
Fri Aug 12 06:55:05 PDT 2022
On Friday 12 August 2022 14:44:07 Pali Rohár wrote:
> On Friday 12 August 2022 12:00:28 Shinichiro Kawasaki wrote:
> > On Aug 12, 2022 / 10:20, Pali Rohár wrote:
> > > On Friday 12 August 2022 04:56:50 Shinichiro Kawasaki wrote:
> >
> > [...]
> >
> > > > I noticed one difference between your system and mine: U-Boot version.
> > > > On my system, it has rather old version now:
> > > >
> > > > Marvell>> version
> > > > U-Boot 2017.03-armada-17.10.2-g14aeedc (Jun 01 2018 - 15:39:10 +0800)
> > > > aarch64-linux-gnu-gcc (Linaro GCC 5.2-2015.11-2) 5.2.1 20151005
> > > > GNU ld (GNU Binutils) 2.25.0 Linaro 2015_10
> > > >
> > > > Do you think it's worth trying the latest U-boot?
> > > >
> > > > --
> > > > Shin'ichiro Kawasaki
> > >
> > > Yes, please update firmwares to the latests versions. Or at least try to
> > > boot new U-Boot via UART (without replacing existing version) and check
> > > for differences.
> > >
> > > Building documentations:
> > > https://trustedfirmware-a.readthedocs.io/en/latest/plat/marvell/armada/build.html
> > > https://source.denx.de/u-boot/u-boot/-/blob/v2022.07/doc/README.marvell
> > >
> > > UART booting documentation is currently waiting for review:
> > > https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/16198
> >
> > Thanks for the good references. I've managed to build U-Boot for UART booting (I
> > use fedora, then needed to identify Fedora packages corresponding to guided apt
> > packages. I also needed to fix a build failure in A3700-utils-marvell.)
> >
> > I modified board jumper pins to UART mode and downloaded the built U-Boot using
> > mox-imager. The downloaded U-Boot showed the new version and detected my SSD:
> >
> > => version
> > U-Boot 2022.10-rc2-00049-g157861e6af (Aug 12 2022 - 18:10:21 +0900)
> >
> > aarch64-linux-gnu-gcc (GCC) 12.1.1 20220507 (Red Hat Cross 12.1.1-1)
> > GNU ld version 2.37-7.fc36
> > => scsi scan
> > scanning bus for devices...
> > Device 0: (0:0) Vendor: ATA Prod.: SanDisk SDSSDA24 Rev: U210
> > Type: Hard Disk
> > Capacity: 228936.5 MB = 223.5 GB (468862128 x 512)
> >
> > However, after booting Linux kernel v5.18.16 from the U-Boot, still the error
> > message "ata1: SATA link down (SStatus 0 SControl 300)" is printed.
> > This may indicate that the error is not related U-Boot.
> >
> > Now I'm not sure what's the key difference between your system and mine. If
> > there is anything I can do next, please let me know.
> >
> > --
> > Shin'ichiro Kawasaki
>
> Probably this is SSD disk specific. I will try to prepare some kernel
> changes to test if it changes something.
Could you please try following change and provide full dmesg log?
First I need to know if issue is in SATA power on code or somewhere else.
diff --git a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
index a4d7d9bd100d..845df563a399 100644
--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
@@ -528,12 +528,49 @@ mvebu_a3700_comphy_set_phy_selector(struct mvebu_a3700_comphy_lane *lane)
return -EINVAL;
}
+#include <linux/arm-smccc.h>
+
+#define COMPHY_SIP_POWER_ON 0x82000001
+#define COMPHY_FW_MODE_SATA 0x1
+#define COMPHY_FW_MODE(mode) ((mode) << 12)
+
+static int mvebu_a3700_comphy_smc(unsigned long function, unsigned long lane,
+ unsigned long mode)
+{
+ struct arm_smccc_res res;
+ s32 ret;
+
+ arm_smccc_smc(function, lane, mode, 0, 0, 0, 0, 0, &res);
+ ret = res.a0;
+
+ switch (ret) {
+ case SMCCC_RET_SUCCESS:
+ return 0;
+ case SMCCC_RET_NOT_SUPPORTED:
+ return -EOPNOTSUPP;
+ default:
+ return -EINVAL;
+ }
+}
+
static int
mvebu_a3700_comphy_sata_power_on(struct mvebu_a3700_comphy_lane *lane)
{
u32 mask, data, ref_clk;
int ret;
+ u32 fw_param = COMPHY_FW_MODE(COMPHY_FW_MODE_SATA);
+
+ ret = mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_ON, lane->id, fw_param);
+ if (ret == -EOPNOTSUPP)
+ dev_err(lane->dev,
+ "unsupported SMC call, try updating your firmware\n");
+ else if (ret)
+ dev_err(lane->dev, "FAILED mvebu_a3700_comphy_sata_power_on() call\n");
+ else
+ dev_err(lane->dev, "OK mvebu_a3700_comphy_sata_power_on() call\n");
+ return ret;
+
/* Configure phy selector for SATA */
ret = mvebu_a3700_comphy_set_phy_selector(lane);
if (ret)
@@ -1069,6 +1106,9 @@ mvebu_a3700_comphy_pcie_power_on(struct mvebu_a3700_comphy_lane *lane)
static void
mvebu_a3700_comphy_sata_power_off(struct mvebu_a3700_comphy_lane *lane)
{
+ dev_err(lane->dev, "IGNORING mvebu_a3700_comphy_sata_power_off() call\n");
+ return;
+
/* Set phy isolation mode */
comphy_lane_reg_set(lane, COMPHY_ISOLATION_CTRL,
PHY_ISOLATE_MODE, PHY_ISOLATE_MODE);
More information about the linux-phy
mailing list