Skip to contentSkip to conversation

drop low power policy board type

PATCH Superseded Niklas Cassel 4 participants 14 messages Feb 1, 2024 – Feb 2, 2024 libata

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Niklas Cassel

author maintainer
#0 lore raw

cover drop low power policy board type

The series is based on top of:
https://git.kernel.org/pub/scm/linux/kernel/git/libata/linux.git/log/?h=for-next

Hello all,

This revives a patch sent out almost two years ago from Mario Limonciello:
https://lore.kernel.org/linux-ide/[email protected]/T/#u

The reason why we did not merge it back then, is because LPM and hotplug events are mutually exclusive.

The difference with this series compared to what was sent out back then:
I've added a patch that checks if the port is external, i.e. either hotplug capable or eSATA. For external ports, we never enable LPM, as that will break hotplug.

For ports that do not advertise themselves as external (typically laptops), we set the LPM policy as requested.

This matches how Microsoft Windows does things.
Thanks to Werner Fischer for suggesting something like this at last year's ALPSS conference.

There might of course be some platform firmware that e.g. incorrectly marks its port as internal, even though it is external, but if we find any such platforms we will need to deal with them using quirks.

Also note that we even if the user requested a certain policy, there is no guarantee that he will get all the features for that policy, see:
https://github.com/torvalds/linux/blob/master/drivers/ata/libata-sata.c#L403-L414

However, I'd rather we not try to map all the combinations of partial/slumber/devsleep in to a single policy represented by a single integer, thus I do not try to "change" the requested policy. The user will get all the features that are included in the requested policy AND supported by the HBA.

Another difference (compared to an earlier version of Mario's series) is that we do not try to change the default CONFIG_SATA_MOBILE_LPM_POLICY value from 0 to 3, it will continue to be 0.
If you really don't want LPM even if your HBA supports it, and your port is internal, one option is to leave the Kconfig set to the default value.

Note: in current mainline, there is an issue related to Intel VMD which causes the link to not come up when VMD is enabled. (The link does comes up when VMD is disabled in BIOS.)
In order to not get a bunch of bug reports related to LPM, we probably want to wait with this series until we have fixed the VMD bug.

Kind regards,
Niklas

Mario Limonciello (1):
ata: ahci: Drop low power policy board type

Niklas Cassel (4):
ata: ahci: move marking of external port earlier
ata: ahci: a hotplug capable port is an external port
ata: ahci: drop hpriv param from ahci_update_initial_lpm_policy()
ata: ahci: do not enable LPM on external ports

 drivers/ata/Kconfig   |   5 +-
 drivers/ata/ahci.c    | 134 +++++++++++++++++++++++-------------------
 drivers/ata/ahci.h    |   9 +--
 drivers/ata/libahci.c |   7 ---
 4 files changed, 77 insertions(+), 78 deletions(-)
Signature · 1 line
2.43.0
author maintainer
#1 lore raw

PATCH 1/5 ata: ahci: move marking of external port earlier

Move the marking of an external port earlier in the call chain. This is needed for further cleanups.
No functional change intended.

---
 drivers/ata/ahci.c    | 14 ++++++++++++++
 drivers/ata/libahci.c |  7 -------
 2 files changed, 14 insertions(+), 7 deletions(-)
drivers/ata/ahci.c +14 -0
index da2e74fce2d9..157ab88bdf75 100644
@@ -1642,6 +1642,17 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
 	return pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX);
 }
 
+static void ahci_mark_external_port(struct ata_port *ap)
+{
+	struct ahci_host_priv *hpriv = ap->host->private_data;
+	void __iomem *port_mmio = ahci_port_base(ap);
+	u32 tmp;
+
+	tmp = readl(port_mmio + PORT_CMD);
+	if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))
+		ap->pflags |= ATA_PFLAG_EXTERNAL;
+}
+
 static void ahci_update_initial_lpm_policy(struct ata_port *ap,
 					   struct ahci_host_priv *hpriv)
 {
@@ -1934,6 +1945,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 		if (ap->flags & ATA_FLAG_EM)
 			ap->em_message_type = hpriv->em_msg_type;
 
+		/* mark esata ports */
+		ahci_mark_external_port(ap);
+
 		ahci_update_initial_lpm_policy(ap, hpriv);
 
 		/* disabled/not-implemented port */
drivers/ata/libahci.c +0 -7
index 1a63200ea437..fca376f03c9e 100644
@@ -1280,10 +1280,8 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
 			   int port_no, void __iomem *mmio,
 			   void __iomem *port_mmio)
 {
-	struct ahci_host_priv *hpriv = ap->host->private_data;
 	const char *emsg = NULL;
 	int rc;
-	u32 tmp;
 
 	/* make sure port is not active */
 	rc = ahci_deinit_port(ap, &emsg);
@@ -1291,11 +1289,6 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
 		dev_warn(dev, "%s (%d)\n", emsg, rc);
 
 	ahci_port_clear_pending_irq(ap);
-
-	/* mark esata ports */
-	tmp = readl(port_mmio + PORT_CMD);
-	if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))
-		ap->pflags |= ATA_PFLAG_EXTERNAL;
 }
 
 void ahci_init_controller(struct ata_host *host)
Signature · 1 line
2.43.0
maintainer Reviewed-by on v1 1/5
#2 lore raw

Re: [PATCH 1/5] ata: ahci: move marking of external port earlier

Quoted 33 lines · Niklas Cassel

Move the marking of an external port earlier in the call chain. This is needed for further cleanups.
No functional change intended.

---
 drivers/ata/ahci.c    | 14 ++++++++++++++
 drivers/ata/libahci.c |  7 -------
 2 files changed, 14 insertions(+), 7 deletions(-)
drivers/ata/ahci.c +11 -0
index da2e74fce2d9..157ab88bdf75 100644
@@ -1642,6 +1642,17 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
 	return pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX);
 }
 
+static void ahci_mark_external_port(struct ata_port *ap)
+{
+	struct ahci_host_priv *hpriv = ap->host->private_data;
+	void __iomem *port_mmio = ahci_port_base(ap);
+	u32 tmp;
+
+	tmp = readl(port_mmio + PORT_CMD);
+	if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))
+		ap->pflags |= ATA_PFLAG_EXTERNAL;
+}
+
 static void ahci_update_initial_lpm_policy(struct ata_port *ap,
 					   struct ahci_host_priv *hpriv)
 {

drivers/ata/ahci.c static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) · line 1949

Quoted 5 lines
drivers/ata/ahci.c +2 -0
@@ -1934,6 +1945,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 		if (ap->flags & ATA_FLAG_EM)
 			ap->em_message_type = hpriv->em_msg_type;
 
+		/* mark esata ports */
+		ahci_mark_external_port(ap);

Nit: the comment is rather useless as the function name is clear. It is also rather incorrect since this is for both esata as well as hot-plug capable ports (later in the series). So maybe drop it ?

Otherwise, looks OK to me.

Quoted 31 lines
drivers/ata/ahci.c +1 -0
+
 		ahci_update_initial_lpm_policy(ap, hpriv);
 
 		/* disabled/not-implemented port */
drivers/ata/libahci.c +0 -7
index 1a63200ea437..fca376f03c9e 100644
@@ -1280,10 +1280,8 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
 			   int port_no, void __iomem *mmio,
 			   void __iomem *port_mmio)
 {
-	struct ahci_host_priv *hpriv = ap->host->private_data;
 	const char *emsg = NULL;
 	int rc;
-	u32 tmp;
 
 	/* make sure port is not active */
 	rc = ahci_deinit_port(ap, &emsg);
@@ -1291,11 +1289,6 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
 		dev_warn(dev, "%s (%d)\n", emsg, rc);
 
 	ahci_port_clear_pending_irq(ap);
-
-	/* mark esata ports */
-	tmp = readl(port_mmio + PORT_CMD);
-	if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))
-		ap->pflags |= ATA_PFLAG_EXTERNAL;
 }
 
 void ahci_init_controller(struct ata_host *host)
Signature · 2 lines
Damien Le Moal
Western Digital Research
author maintainer
#3 lore raw

PATCH 2/5 ata: ahci: a hotplug capable port is an external port

In reply to Niklas Cassel

A hotplug capable port is an external port, so mark it as such.

We even say this ourselves in libata-scsi.c:
/* set scsi removable (RMB) bit per ata bit, or if the
* AHCI port says it's external (Hotplug-capable, eSATA). */

This also matches the terminology used in AHCI 1.3.1 (the keyword to search for is "externally accessible").

---
 drivers/ata/ahci.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/ata/ahci.c +3 -2
index 157ab88bdf75..8c8403bae36f 100644
@@ -1649,7 +1649,8 @@ static void ahci_mark_external_port(struct ata_port *ap)
 	u32 tmp;
 
 	tmp = readl(port_mmio + PORT_CMD);
-	if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))
+	if (((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS)) ||
+	    (tmp & PORT_CMD_HPCP))
 		ap->pflags |= ATA_PFLAG_EXTERNAL;
 }
 
@@ -1945,7 +1946,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 		if (ap->flags & ATA_FLAG_EM)
 			ap->em_message_type = hpriv->em_msg_type;
 
-		/* mark esata ports */
+		/* mark external ports (hotplug-capable, eSATA) */
 		ahci_mark_external_port(ap);
 
 		ahci_update_initial_lpm_policy(ap, hpriv);
Signature · 1 line
2.43.0
maintainer Reviewed-by on v1 2/5
#4 lore raw

Re: [PATCH 2/5] ata: ahci: a hotplug capable port is an external port

Quoted 30 lines · Niklas Cassel

A hotplug capable port is an external port, so mark it as such.

We even say this ourselves in libata-scsi.c:
/* set scsi removable (RMB) bit per ata bit, or if the
* AHCI port says it's external (Hotplug-capable, eSATA). */

This also matches the terminology used in AHCI 1.3.1 (the keyword to search for is "externally accessible").

---
 drivers/ata/ahci.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/ata/ahci.c +2 -1
index 157ab88bdf75..8c8403bae36f 100644
@@ -1649,7 +1649,8 @@ static void ahci_mark_external_port(struct ata_port *ap)
 	u32 tmp;
 
 	tmp = readl(port_mmio + PORT_CMD);
-	if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS))
+	if (((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS)) ||
+	    (tmp & PORT_CMD_HPCP))
 		ap->pflags |= ATA_PFLAG_EXTERNAL;
 }
 

drivers/ata/ahci.c static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) · line 1949

Quoted 5 lines
drivers/ata/ahci.c +1 -1
@@ -1945,7 +1946,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 		if (ap->flags & ATA_FLAG_EM)
 			ap->em_message_type = hpriv->em_msg_type;
 
-		/* mark esata ports */
+		/* mark external ports (hotplug-capable, eSATA) */

OK. So you fix the comment here... Maybe move that comment inside ahci_mark_external_port() to make it clear which port are considered "external" and remove the comment here ?

Otherwise, looks OK.

Quoted 3 lines
drivers/ata/ahci.c +0 -0
 		ahci_mark_external_port(ap);
 
 		ahci_update_initial_lpm_policy(ap, hpriv);
Signature · 2 lines
Damien Le Moal
Western Digital Research
author maintainer
#5 lore raw

PATCH 3/5 ata: ahci: drop hpriv param from ahci_update_initial_lpm_policy()

In reply to Niklas Cassel

There is no need for ahci_update_initial_lpm_policy() to take hpriv as a parameter, it can easily be derived from the ata_port.

---
 drivers/ata/ahci.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/ata/ahci.c +3 -3
index 8c8403bae36f..19b605c98d42 100644
@@ -1654,9 +1654,9 @@ static void ahci_mark_external_port(struct ata_port *ap)
 		ap->pflags |= ATA_PFLAG_EXTERNAL;
 }
 
-static void ahci_update_initial_lpm_policy(struct ata_port *ap,
-					   struct ahci_host_priv *hpriv)
+static void ahci_update_initial_lpm_policy(struct ata_port *ap)
 {
+	struct ahci_host_priv *hpriv = ap->host->private_data;
 	int policy = CONFIG_SATA_MOBILE_LPM_POLICY;
 
 
@@ -1949,7 +1949,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 		/* mark external ports (hotplug-capable, eSATA) */
 		ahci_mark_external_port(ap);
 
-		ahci_update_initial_lpm_policy(ap, hpriv);
+		ahci_update_initial_lpm_policy(ap);
 
 		/* disabled/not-implemented port */
 		if (!(hpriv->port_map & (1 << i)))
Signature · 1 line
2.43.0
maintainer Reviewed-by on v1 3/5
#6 lore raw

Re: [PATCH 3/5] ata: ahci: drop hpriv param from ahci_update_initial_lpm_policy()

Quoted 4 lines · Niklas Cassel

There is no need for ahci_update_initial_lpm_policy() to take hpriv as a parameter, it can easily be derived from the ata_port.

Looks good.

Signature · 2 lines
Damien Le Moal
Western Digital Research
author maintainer
#7 lore raw

PATCH 4/5 ata: ahci: do not enable LPM on external ports

In reply to Niklas Cassel

The SATA specification contains a known incompatibility between LPM and hot-plug events, thus do not enable LPM if the port advertises itself as being an external SATA port (i.e. either hot-plug capable or eSATA).

This matches the power policy used in Microsoft Windows, which disables LPM for external SATA ports, such that hot-plug events can be received.

---
 drivers/ata/ahci.c | 8 ++++++++
 1 file changed, 8 insertions(+)
drivers/ata/ahci.c +8 -0
index 19b605c98d42..d50d1ae44e7f 100644
@@ -1664,6 +1664,14 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap)
 	if (!(hpriv->flags & AHCI_HFLAG_USE_LPM_POLICY))
 		return;
 
+	/*
+	 * The SATA specification contains a known incompatibility between LPM
+	 * and hot-plug events, thus do not enable LPM if the port advertises
+	 * itself as an external port (i.e. either hot-plug capable or eSATA).
+	 */
+	if (ap->pflags & ATA_PFLAG_EXTERNAL)
+		return;
+
 	/* user modified policy via module param */
 	if (mobile_lpm_policy != -1) {
 		policy = mobile_lpm_policy;
Signature · 1 line
2.43.0
maintainer
#8 lore raw

Re: [PATCH 4/5] ata: ahci: do not enable LPM on external ports

Quoted 17 lines · Niklas Cassel

The SATA specification contains a known incompatibility between LPM and hot-plug events, thus do not enable LPM if the port advertises itself as being an external SATA port (i.e. either hot-plug capable or eSATA).

This matches the power policy used in Microsoft Windows, which disables LPM for external SATA ports, such that hot-plug events can be received.

---
 drivers/ata/ahci.c | 8 ++++++++
 1 file changed, 8 insertions(+)
drivers/ata/ahci.c +0 -0
index 19b605c98d42..d50d1ae44e7f 100644

drivers/ata/ahci.c static void ahci_update_initial_lpm_policy(struct ata_port *ap) · line 1671

Quoted 8 lines
drivers/ata/ahci.c +5 -0
@@ -1664,6 +1664,14 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap)
 	if (!(hpriv->flags & AHCI_HFLAG_USE_LPM_POLICY))
 		return;
 
+	/*
+	 * The SATA specification contains a known incompatibility between LPM
+	 * and hot-plug events, thus do not enable LPM if the port advertises
+	 * itself as an external port (i.e. either hot-plug capable or eSATA).
+	 */

s/SATA/Serial ATA Revision 3.5a ?
s/contains/warns about ?

I see section 5.3.10 "Potential external SATA incompatibility issues" but it does not mention LPM. Where is this stated in SATA-IO ?

Quoted 6 lines
drivers/ata/ahci.c +3 -0
+	if (ap->pflags & ATA_PFLAG_EXTERNAL)
+		return;
+
 	/* user modified policy via module param */
 	if (mobile_lpm_policy != -1) {
 		policy = mobile_lpm_policy;
Signature · 2 lines
Damien Le Moal
Western Digital Research
author maintainer
#9 lore raw

PATCH 5/5 ata: ahci: Drop low power policy board type

In reply to Niklas Cassel

From: Mario Limonciello <[email protected]>

The low power policy board type was introduced to allow systems to get into deep states reliably. Before it was introduced min_power was causing problems for a number of drives. New power policies min_power_with_partial and med_power_with_dipm have been introduced which provide a more stable baseline for systems.

---
 drivers/ata/Kconfig |   5 +-
 drivers/ata/ahci.c  | 109 +++++++++++++++++++-------------------------
 drivers/ata/ahci.h  |   9 ++--
 3 files changed, 53 insertions(+), 70 deletions(-)
drivers/ata/Kconfig +2 -3
index 42b51c9812a0..928ec93c6b45 100644
@@ -116,15 +116,14 @@ config SATA_AHCI
 	  If unsure, say N.
 
 config SATA_MOBILE_LPM_POLICY
-	int "Default SATA Link Power Management policy for low power chipsets"
+	int "Default SATA Link Power Management policy"
 	range 0 4
 	default 0
 	depends on SATA_AHCI
 	help
 	  Select the Default SATA Link Power Management (LPM) policy to use
 	  for chipsets / "South Bridges" supporting low-power modes. Such
-	  chipsets are typically found on most laptops but desktops and
-	  servers now also widely use chipsets supporting low power modes.
+	  chipsets are ubiquitous across laptops, desktops and servers.
 
 	  The value set has the following meanings:
 		0 => Keep firmware settings
drivers/ata/ahci.c +48 -61

188 lines not on this page · raw message

drivers/ata/ahci.h +3 -6
index df8f8a1a3a34..4a0a602c6b16 100644
@@ -241,13 +241,10 @@ enum {
 	AHCI_HFLAG_YES_ALPM		= BIT(23), /* force ALPM cap on */
 	AHCI_HFLAG_NO_WRITE_TO_RO	= BIT(24), /* don't write to read
 						      only registers */
-	AHCI_HFLAG_USE_LPM_POLICY	= BIT(25), /* chipset that should use
-						      SATA_MOBILE_LPM_POLICY
-						      as default lpm_policy */
-	AHCI_HFLAG_SUSPEND_PHYS		= BIT(26), /* handle PHYs during
+	AHCI_HFLAG_SUSPEND_PHYS		= BIT(25), /* handle PHYs during
 						      suspend/resume */
-	AHCI_HFLAG_NO_SXS		= BIT(28), /* SXS not supported */
-	AHCI_HFLAG_43BIT_ONLY		= BIT(29), /* 43bit DMA addr limit */
+	AHCI_HFLAG_NO_SXS		= BIT(26), /* SXS not supported */
+	AHCI_HFLAG_43BIT_ONLY		= BIT(27), /* 43bit DMA addr limit */
 
 	/* ap->flags bits */
 
Signature · 1 line
2.43.0
maintainer Reviewed-by on v1 5/5
#10 lore raw

Re: [PATCH 5/5] ata: ahci: Drop low power policy board type

Quoted 8 lines · Niklas Cassel

From: Mario Limonciello <[email protected]>

The low power policy board type was introduced to allow systems to get into deep states reliably. Before it was introduced min_power was causing problems for a number of drives. New power policies min_power_with_partial and med_power_with_dipm have been introduced which provide a more stable baseline for systems.

Quoted 5 lines

Looks good.

Let's get this in linux-next ASAP so that it gets plenty of testing.

Signature · 2 lines
Damien Le Moal
Western Digital Research
#12 lore raw
In reply to Niklas Cassel

(adding Mario Limonciello in CC)

Quoted 11 lines · Niklas Cassel

This revives a patch sent out almost two years ago from Mario Limonciello:
https://lore.kernel.org/linux-ide/[email protected]/T/#u

The reason why we did not merge it back then, is because LPM and hotplug events are mutually exclusive.

I've added a patch that checks if the port is external, i.e. either hotplug capable or eSATA. For external ports, we never enable LPM, as that will break hotplug.

Quoted 6 lines

For ports that do not advertise themselves as external (typically laptops), we set the LPM policy as requested.

This matches how Microsoft Windows does things.
Thanks to Werner Fischer for suggesting something like this at last year's ALPSS conference.

Thank you for the discussions last year at the ALPSS and thanks a lot for implementing this now.

Quoted 3 lines

There might of course be some platform firmware that e.g. incorrectly marks its port as internal, even though it is external, but if we find any such platforms we will need to deal with them using quirks.

I plan some testing within the upcoming two weeks.
I'll do testing with the Elkhart-Lake based system (0x4b63 SATA controller) to verify whether LPM is activated.
And I'll reach out to colleagues to test with hot-pluggable servers. Especially I'll try for them to get a system with an AMD 0x7901 SATA controller like Supermicro H12SSL-NT, as the default "board_ahci_mobile" for this SATA controller - see commit 1527f69204fe ("ata: ahci: Add Green Sardine vendor ID as board_ahci_mobile") - lead to Hot-Plug not working with default Ubuntu or Proxmox Kernels [1].

As especially for AMD systems identical SATA controllers (like 0x7901 in this case) can be used in both mobile systems and servers, Niklas' new patch series could could bring lasting improvement here.

[1] https://www.thomas-krenn.com/en/wiki/AMD_EPYC_Server_with_Ubuntu_-_Enable_SATA_Hot-Swap

--
Best regards,
Werner Fischer

Reviewed-by
#13 lore raw
Quoted 41 lines · Werner Fischer

(adding Mario Limonciello in CC)

Quoted 11 lines · Niklas Cassel

This revives a patch sent out almost two years ago from Mario Limonciello:
https://lore.kernel.org/linux-ide/[email protected]/T/#u

The reason why we did not merge it back then, is because LPM and hotplug events are mutually exclusive.

I've added a patch that checks if the port is external, i.e. either hotplug capable or eSATA. For external ports, we never enable LPM, as that will break hotplug.

Quoted 6 lines

For ports that do not advertise themselves as external (typically laptops), we set the LPM policy as requested.

This matches how Microsoft Windows does things.
Thanks to Werner Fischer for suggesting something like this at last year's ALPSS conference.

Thank you for the discussions last year at the ALPSS and thanks a lot for implementing this now.

Quoted 3 lines

There might of course be some platform firmware that e.g. incorrectly marks its port as internal, even though it is external, but if we find any such platforms we will need to deal with them using quirks.

I plan some testing within the upcoming two weeks.
I'll do testing with the Elkhart-Lake based system (0x4b63 SATA controller) to verify whether LPM is activated.
And I'll reach out to colleagues to test with hot-pluggable servers. Especially I'll try for them to get a system with an AMD 0x7901 SATA controller like Supermicro H12SSL-NT, as the default "board_ahci_mobile" for this SATA controller - see commit 1527f69204fe ("ata: ahci: Add Green Sardine vendor ID as board_ahci_mobile") - lead to Hot-Plug not working with default Ubuntu or Proxmox Kernels [1].

As especially for AMD systems identical SATA controllers (like 0x7901 in this case) can be used in both mobile systems and servers, Niklas' new patch series could could bring lasting improvement here.

Quoted 5 lines

[1] https://www.thomas-krenn.com/en/wiki/AMD_EPYC_Server_with_Ubuntu_-_Enable_SATA_Hot-Swap

--
Best regards,
Werner Fischer

Thanks for looping me in and also reviving the patch. The series looks good to me. I do think that after this baked a bit and everyone is happy we should also revisit changing the upstream default to match the distros again too.