On 2021/11/13 5:15, Mario Limonciello wrote: > The StorageD3Enable _DSD is used for the vendor to indicate that the disk > should be opted into or out of a different behavior based upon the platform > design. > > For AMD's Renoir and Green Sardine platforms it's important that any > attached SATA storage has transitioned into DevSlp when s2idle is used. > > If the disk is left in active/partial/slumber, then the system is not able > to resume properly. > > When the StorageD3Enable _DSD is detected, check the system is using s2idle > and DevSlp is enabled and if so explicitly wait long enough for the disk to > enter DevSlp. > > Cc: Nehal-bakulchandra Shah <Nehal-bakulchandra.Shah@xxxxxxx> > BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=214091 > Link: https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-intro > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> > --- > drivers/ata/libahci.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c > index 28430c093a7f..15c293da30ca 100644 > --- a/drivers/ata/libahci.c > +++ b/drivers/ata/libahci.c > @@ -2322,6 +2322,18 @@ int ahci_port_resume(struct ata_port *ap) > } > EXPORT_SYMBOL_GPL(ahci_port_resume); > > +static void ahci_handle_s2idle(struct ata_port *ap) > +{ > + void __iomem *port_mmio = ahci_port_base(ap); > + u32 devslp; > + > + if (pm_suspend_via_firmware()) > + return; > + devslp = readl(port_mmio + PORT_DEVSLP); > + if ((devslp & PORT_DEVSLP_ADSE)) > + ata_msleep(ap, devslp_idle_timeout); > +} This generates a warning at compilation if CONFIG_PM is not enabled. This function must be under the #ifdef CONFIG_PM below. I can fix this up, or you can resend a v2 if you prefer. > + > #ifdef CONFIG_PM > static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) > { > @@ -2336,6 +2348,9 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) > ata_port_freeze(ap); > } > > + if (acpi_storage_d3(ap->host->dev)) > + ahci_handle_s2idle(ap); > + > ahci_rpm_put_port(ap); > return rc; > } > -- Damien Le Moal Western Digital Research