| From abf386621b1fcad020842eb9391bb9fcb0135d9f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 7 Sep 2018 08:32:17 -0600 |
| Subject: ata: Disable AHCI ALPM feature for Ampere Computing eMAG SATA |
| |
| From: Suman Tripathi <stripathi@amperecomputing.com> |
| |
| [ Upstream commit 20bdc376b427cb420836f39ee8f281ea85dbaeef ] |
| |
| Due to hardware errata, Ampere Computing eMAG SATA can't support |
| AHCI ALPM feature. This patch disables the AHCI ALPM feature for |
| eMAG SATA. |
| |
| Signed-off-by: Suman Trpathi <stripathi@amperecomputing.com> |
| Signed-off-by: Rameshwar Prasad Sahu <rameshwar.sahu@amperecomputing.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/ata/ahci_platform.c | 15 ++++++++++++++- |
| 1 file changed, 14 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c |
| index 46f0bd75eff79..cf1e0e18a7a98 100644 |
| --- a/drivers/ata/ahci_platform.c |
| +++ b/drivers/ata/ahci_platform.c |
| @@ -33,6 +33,13 @@ static const struct ata_port_info ahci_port_info = { |
| .port_ops = &ahci_platform_ops, |
| }; |
| |
| +static const struct ata_port_info ahci_port_info_nolpm = { |
| + .flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_LPM, |
| + .pio_mask = ATA_PIO4, |
| + .udma_mask = ATA_UDMA6, |
| + .port_ops = &ahci_platform_ops, |
| +}; |
| + |
| static struct scsi_host_template ahci_platform_sht = { |
| AHCI_SHT(DRV_NAME), |
| }; |
| @@ -41,6 +48,7 @@ static int ahci_probe(struct platform_device *pdev) |
| { |
| struct device *dev = &pdev->dev; |
| struct ahci_host_priv *hpriv; |
| + const struct ata_port_info *port; |
| int rc; |
| |
| hpriv = ahci_platform_get_resources(pdev, |
| @@ -58,7 +66,11 @@ static int ahci_probe(struct platform_device *pdev) |
| if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci")) |
| hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ; |
| |
| - rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info, |
| + port = acpi_device_get_match_data(dev); |
| + if (!port) |
| + port = &ahci_port_info; |
| + |
| + rc = ahci_platform_init_host(pdev, hpriv, port, |
| &ahci_platform_sht); |
| if (rc) |
| goto disable_resources; |
| @@ -85,6 +97,7 @@ static const struct of_device_id ahci_of_match[] = { |
| MODULE_DEVICE_TABLE(of, ahci_of_match); |
| |
| static const struct acpi_device_id ahci_acpi_match[] = { |
| + { "APMC0D33", (unsigned long)&ahci_port_info_nolpm }, |
| { ACPI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff) }, |
| {}, |
| }; |
| -- |
| 2.20.1 |
| |