Lines Matching +full:generic +full:- +full:ahci
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ahci.c - AHCI SATA support
6 * Please ALWAYS copy linux-ide@vger.kernel.org
9 * Copyright 2004-2005 Red Hat, Inc.
12 * as Documentation/driver-api/libata.rst
14 * AHCI hardware documentation:
25 #include <linux/dma-mapping.h>
32 #include <linux/ahci-remap.h>
33 #include <linux/io-64-nonatomic-lo-hi.h>
34 #include "ahci.h"
36 #define DRV_NAME "ahci"
106 AHCI_SHT("ahci"),
265 { PCI_VDEVICE(INTEL, 0x06d6), board_ahci }, /* Comet Lake PCH-H RAID */
275 { PCI_VDEVICE(INTEL, 0x27c6), board_ahci }, /* ICH7-M DH */
298 { PCI_VDEVICE(INTEL, 0x3b22), board_ahci }, /* PCH AHCI */
299 { PCI_VDEVICE(INTEL, 0x3b23), board_ahci }, /* PCH AHCI */
302 { PCI_VDEVICE(INTEL, 0x3b29), board_ahci_low_power }, /* PCH M AHCI */
305 { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */
306 { PCI_VDEVICE(INTEL, 0x19b0), board_ahci_pcs7 }, /* DNV AHCI */
307 { PCI_VDEVICE(INTEL, 0x19b1), board_ahci_pcs7 }, /* DNV AHCI */
308 { PCI_VDEVICE(INTEL, 0x19b2), board_ahci_pcs7 }, /* DNV AHCI */
309 { PCI_VDEVICE(INTEL, 0x19b3), board_ahci_pcs7 }, /* DNV AHCI */
310 { PCI_VDEVICE(INTEL, 0x19b4), board_ahci_pcs7 }, /* DNV AHCI */
311 { PCI_VDEVICE(INTEL, 0x19b5), board_ahci_pcs7 }, /* DNV AHCI */
312 { PCI_VDEVICE(INTEL, 0x19b6), board_ahci_pcs7 }, /* DNV AHCI */
313 { PCI_VDEVICE(INTEL, 0x19b7), board_ahci_pcs7 }, /* DNV AHCI */
314 { PCI_VDEVICE(INTEL, 0x19bE), board_ahci_pcs7 }, /* DNV AHCI */
315 { PCI_VDEVICE(INTEL, 0x19bF), board_ahci_pcs7 }, /* DNV AHCI */
316 { PCI_VDEVICE(INTEL, 0x19c0), board_ahci_pcs7 }, /* DNV AHCI */
317 { PCI_VDEVICE(INTEL, 0x19c1), board_ahci_pcs7 }, /* DNV AHCI */
318 { PCI_VDEVICE(INTEL, 0x19c2), board_ahci_pcs7 }, /* DNV AHCI */
319 { PCI_VDEVICE(INTEL, 0x19c3), board_ahci_pcs7 }, /* DNV AHCI */
320 { PCI_VDEVICE(INTEL, 0x19c4), board_ahci_pcs7 }, /* DNV AHCI */
321 { PCI_VDEVICE(INTEL, 0x19c5), board_ahci_pcs7 }, /* DNV AHCI */
322 { PCI_VDEVICE(INTEL, 0x19c6), board_ahci_pcs7 }, /* DNV AHCI */
323 { PCI_VDEVICE(INTEL, 0x19c7), board_ahci_pcs7 }, /* DNV AHCI */
324 { PCI_VDEVICE(INTEL, 0x19cE), board_ahci_pcs7 }, /* DNV AHCI */
325 { PCI_VDEVICE(INTEL, 0x19cF), board_ahci_pcs7 }, /* DNV AHCI */
326 { PCI_VDEVICE(INTEL, 0x1c02), board_ahci }, /* CPT AHCI */
327 { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_low_power }, /* CPT M AHCI */
332 { PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */
335 { PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI */
336 { PCI_VDEVICE(INTEL, 0x1e02), board_ahci }, /* Panther Point AHCI */
337 { PCI_VDEVICE(INTEL, 0x1e03), board_ahci_low_power }, /* Panther M AHCI */
343 { PCI_VDEVICE(INTEL, 0x8c02), board_ahci }, /* Lynx Point AHCI */
344 { PCI_VDEVICE(INTEL, 0x8c03), board_ahci_low_power }, /* Lynx M AHCI */
351 { PCI_VDEVICE(INTEL, 0x9c02), board_ahci_low_power }, /* Lynx LP AHCI */
352 { PCI_VDEVICE(INTEL, 0x9c03), board_ahci_low_power }, /* Lynx LP AHCI */
359 { PCI_VDEVICE(INTEL, 0x9dd3), board_ahci_low_power }, /* Cannon Lake PCH-LP AHCI */
360 { PCI_VDEVICE(INTEL, 0x1f22), board_ahci }, /* Avoton AHCI */
361 { PCI_VDEVICE(INTEL, 0x1f23), board_ahci }, /* Avoton AHCI */
368 { PCI_VDEVICE(INTEL, 0x1f32), board_ahci_avn }, /* Avoton AHCI */
369 { PCI_VDEVICE(INTEL, 0x1f33), board_ahci_avn }, /* Avoton AHCI */
376 { PCI_VDEVICE(INTEL, 0x2823), board_ahci }, /* Wellsburg/Lewisburg AHCI*/
380 { PCI_VDEVICE(INTEL, 0x43d4), board_ahci }, /* Rocket Lake PCH-H RAID */
381 { PCI_VDEVICE(INTEL, 0x43d5), board_ahci }, /* Rocket Lake PCH-H RAID */
382 { PCI_VDEVICE(INTEL, 0x43d6), board_ahci }, /* Rocket Lake PCH-H RAID */
383 { PCI_VDEVICE(INTEL, 0x43d7), board_ahci }, /* Rocket Lake PCH-H RAID */
384 { PCI_VDEVICE(INTEL, 0x8d02), board_ahci }, /* Wellsburg AHCI */
388 { PCI_VDEVICE(INTEL, 0x8d62), board_ahci }, /* Wellsburg AHCI */
392 { PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */
393 { PCI_VDEVICE(INTEL, 0x9c83), board_ahci_low_power }, /* Wildcat LP AHCI */
397 { PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */
398 { PCI_VDEVICE(INTEL, 0x8c83), board_ahci_low_power }, /* 9 Series M AHCI */
405 { PCI_VDEVICE(INTEL, 0x9d03), board_ahci_low_power }, /* Sunrise LP AHCI */
408 { PCI_VDEVICE(INTEL, 0xa102), board_ahci }, /* Sunrise Point-H AHCI */
409 { PCI_VDEVICE(INTEL, 0xa103), board_ahci_low_power }, /* Sunrise M AHCI */
410 { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
411 { PCI_VDEVICE(INTEL, 0xa106), board_ahci }, /* Sunrise Point-H RAID */
413 { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */
414 { PCI_VDEVICE(INTEL, 0xa182), board_ahci }, /* Lewisburg AHCI*/
418 { PCI_VDEVICE(INTEL, 0xa202), board_ahci }, /* Lewisburg AHCI*/
422 { PCI_VDEVICE(INTEL, 0xa356), board_ahci }, /* Cannon Lake PCH-H RAID */
423 { PCI_VDEVICE(INTEL, 0x06d7), board_ahci }, /* Comet Lake-H RAID */
424 { PCI_VDEVICE(INTEL, 0xa386), board_ahci }, /* Comet Lake PCH-V RAID */
425 { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_low_power }, /* Bay Trail AHCI */
426 { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_low_power }, /* Bay Trail AHCI */
427 { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_low_power }, /* Cherry Tr. AHCI */
428 { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_low_power }, /* ApolloLake AHCI */
429 { PCI_VDEVICE(INTEL, 0x34d3), board_ahci_low_power }, /* Ice Lake LP AHCI */
430 { PCI_VDEVICE(INTEL, 0x02d3), board_ahci_low_power }, /* Comet Lake PCH-U AHCI */
432 /* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
433 { PCI_VDEVICE(INTEL, 0x4b63), board_ahci_low_power }, /* Elkhart Lake AHCI */
438 /* JMicron 362B and 362C have an AHCI function with IDE class code */
458 { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */
459 { PCI_VDEVICE(AMD, 0x7801), board_ahci_no_debounce_delay }, /* AMD Hudson-2 (AHCI mode) */
462 /* AMD is using RAID class only for ahci controllers */
605 { PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */
634 /* Generic, PCI class code for AHCI */
664 MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
666 static int mobile_lpm_policy = -1;
673 if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && pdev->device == 0x1166) { in ahci_pci_save_initial_config()
674 dev_info(&pdev->dev, "ASM1166 has only six ports\n"); in ahci_pci_save_initial_config()
675 hpriv->saved_port_map = 0x3f; in ahci_pci_save_initial_config()
678 if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) { in ahci_pci_save_initial_config()
679 dev_info(&pdev->dev, "JMB361 has only one port\n"); in ahci_pci_save_initial_config()
680 hpriv->saved_port_map = 1; in ahci_pci_save_initial_config()
685 * is asserted through the standard AHCI port in ahci_pci_save_initial_config()
688 if (hpriv->flags & AHCI_HFLAG_MV_PATA) { in ahci_pci_save_initial_config()
689 if (pdev->device == 0x6121) in ahci_pci_save_initial_config()
690 hpriv->mask_port_map = 0x3; in ahci_pci_save_initial_config()
692 hpriv->mask_port_map = 0xf; in ahci_pci_save_initial_config()
693 dev_info(&pdev->dev, in ahci_pci_save_initial_config()
694 "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n"); in ahci_pci_save_initial_config()
697 ahci_save_initial_config(&pdev->dev, hpriv); in ahci_pci_save_initial_config()
702 struct pci_dev *pdev = to_pci_dev(host->dev); in ahci_pci_reset_controller()
703 struct ahci_host_priv *hpriv = host->private_data; in ahci_pci_reset_controller()
721 struct ahci_host_priv *hpriv = host->private_data; in ahci_pci_init_controller()
722 struct pci_dev *pdev = to_pci_dev(host->dev); in ahci_pci_init_controller()
727 if (hpriv->flags & AHCI_HFLAG_MV_PATA) { in ahci_pci_init_controller()
728 if (pdev->device == 0x6121) in ahci_pci_init_controller()
738 dev_dbg(&pdev->dev, "PORT_IRQ_STAT 0x%x\n", tmp); in ahci_pci_init_controller()
749 struct ata_port *ap = link->ap; in ahci_vt8251_hardreset()
750 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_vt8251_hardreset()
754 hpriv->stop_engine(ap); in ahci_vt8251_hardreset()
756 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), in ahci_vt8251_hardreset()
759 hpriv->start_engine(ap); in ahci_vt8251_hardreset()
762 * request follow-up softreset. in ahci_vt8251_hardreset()
764 return online ? -EAGAIN : rc; in ahci_vt8251_hardreset()
770 struct ata_port *ap = link->ap; in ahci_p5wdh_hardreset()
771 struct ahci_port_priv *pp = ap->private_data; in ahci_p5wdh_hardreset()
772 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_p5wdh_hardreset()
773 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; in ahci_p5wdh_hardreset()
778 hpriv->stop_engine(ap); in ahci_p5wdh_hardreset()
781 ata_tf_init(link->device, &tf); in ahci_p5wdh_hardreset()
785 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), in ahci_p5wdh_hardreset()
788 hpriv->start_engine(ap); in ahci_p5wdh_hardreset()
791 * ASUS P5W-DH Deluxe doesn't send signature FIS after in ahci_p5wdh_hardreset()
813 * ahci_avn_hardreset - attempt more aggressive recovery of Avoton ports.
817 * be recovered by a SATA-hard-reset alone. The failing signature is
823 * reset by bouncing "port enable" in the AHCI PCS configuration
830 const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context); in ahci_avn_hardreset()
831 struct ata_port *ap = link->ap; in ahci_avn_hardreset()
832 struct ahci_port_priv *pp = ap->private_data; in ahci_avn_hardreset()
833 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_avn_hardreset()
834 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; in ahci_avn_hardreset()
835 unsigned long tmo = deadline - jiffies; in ahci_avn_hardreset()
840 hpriv->stop_engine(ap); in ahci_avn_hardreset()
845 int port = ap->port_no; in ahci_avn_hardreset()
846 struct ata_host *host = ap->host; in ahci_avn_hardreset()
847 struct pci_dev *pdev = to_pci_dev(host->dev); in ahci_avn_hardreset()
850 ata_tf_init(link->device, &tf); in ahci_avn_hardreset()
872 hpriv->start_engine(ap); in ahci_avn_hardreset()
884 struct ahci_host_priv *hpriv = host->private_data; in ahci_pci_disable_interrupts()
885 void __iomem *mmio = hpriv->mmio; in ahci_pci_disable_interrupts()
888 /* AHCI spec rev1.1 section 8.3.3: in ahci_pci_disable_interrupts()
925 struct ahci_host_priv *hpriv = host->private_data; in ahci_pci_device_suspend()
927 if (hpriv->flags & AHCI_HFLAG_NO_SUSPEND) { in ahci_pci_device_suspend()
928 dev_err(&pdev->dev, in ahci_pci_device_suspend()
930 return -EIO; in ahci_pci_device_suspend()
948 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) { in ahci_pci_device_resume()
970 if (hpriv->cap & HOST_CAP_64) { in ahci_configure_dma_masks()
972 if (hpriv->flags & AHCI_HFLAG_43BIT_ONLY) in ahci_configure_dma_masks()
979 * If the device fixup already set the dma_mask to some non-standard in ahci_configure_dma_masks()
983 * bogus, platform code should use dev->bus_dma_limit instead.. in ahci_configure_dma_masks()
985 if (pdev->dma_mask && pdev->dma_mask < DMA_BIT_MASK(32)) in ahci_configure_dma_masks()
988 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(dma_bits)); in ahci_configure_dma_masks()
990 dev_err(&pdev->dev, "DMA enable failed\n"); in ahci_configure_dma_masks()
996 struct pci_dev *pdev = to_pci_dev(host->dev); in ahci_pci_print_info()
1014 * hardwired to on-board SIMG 4726. The chipset is ICH8 and doesn't
1029 * assumed without follow-up softreset.
1044 struct pci_dev *pdev = to_pci_dev(host->dev); in ahci_p5wdh_workaround()
1046 if (pdev->bus->number == 0 && pdev->devfn == PCI_DEVFN(0x1f, 2) && in ahci_p5wdh_workaround()
1048 struct ata_port *ap = host->ports[1]; in ahci_p5wdh_workaround()
1050 dev_info(&pdev->dev, in ahci_p5wdh_workaround()
1051 "enabling ASUS P5W DH Deluxe on-board SIMG4726 workaround\n"); in ahci_p5wdh_workaround()
1053 ap->ops = &ahci_p5wdh_ops; in ahci_p5wdh_workaround()
1054 ap->link.flags |= ATA_LFLAG_NO_SRST | ATA_LFLAG_ASSUME_ATA; in ahci_p5wdh_workaround()
1059 * Macbook7,1 firmware forcibly disables MCP89 AHCI and changes PCI ID when
1066 printk(KERN_INFO "ahci: enabling MCP89 AHCI mode\n"); in ahci_mcp89_apple_enable()
1094 return pdev->vendor == PCI_VENDOR_ID_NVIDIA && in is_mcp89_apple()
1095 pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA && in is_mcp89_apple()
1096 pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE && in is_mcp89_apple()
1097 pdev->subsystem_device == 0xcb89; in is_mcp89_apple()
1100 /* only some SB600 ahci controllers can do 64bit DMA */
1106 * working is 1501 which was released on 2007-10-26. in ahci_sb600_enable_64bit()
1112 .ident = "ASUS M2A-VM", in ahci_sb600_enable_64bit()
1116 DMI_MATCH(DMI_BOARD_NAME, "M2A-VM"), in ahci_sb600_enable_64bit()
1121 * All BIOS versions for the MSI K9A2 Platinum (MS-7376) in ahci_sb600_enable_64bit()
1125 * fields as "MICRO-STAR INTERANTIONAL CO.,LTD". in ahci_sb600_enable_64bit()
1128 * "MICRO-STAR INTERNATIONAL CO.,LTD". in ahci_sb600_enable_64bit()
1129 * So try to match on DMI_BOARD_VENDOR of "MICRO-STAR INTER". in ahci_sb600_enable_64bit()
1132 * DMI field of "MS-7376". This was changed to be in ahci_sb600_enable_64bit()
1133 * "K9A2 Platinum (MS-7376)" in version 1.9, but we can still in ahci_sb600_enable_64bit()
1134 * match on DMI_BOARD_NAME of "MS-7376". in ahci_sb600_enable_64bit()
1140 "MICRO-STAR INTER"), in ahci_sb600_enable_64bit()
1141 DMI_MATCH(DMI_BOARD_NAME, "MS-7376"), in ahci_sb600_enable_64bit()
1145 * All BIOS versions for the MSI K9AGM2 (MS-7327) support in ahci_sb600_enable_64bit()
1150 * match on DMI_BOARD_VENDOR of "MICRO-STAR INTER" again. in ahci_sb600_enable_64bit()
1156 "MICRO-STAR INTER"), in ahci_sb600_enable_64bit()
1157 DMI_MATCH(DMI_BOARD_NAME, "MS-7327"), in ahci_sb600_enable_64bit()
1179 if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) || in ahci_sb600_enable_64bit()
1183 if (!match->driver_data) in ahci_sb600_enable_64bit()
1189 if (strcmp(buf, match->driver_data) >= 0) in ahci_sb600_enable_64bit()
1192 dev_warn(&pdev->dev, in ahci_sb600_enable_64bit()
1194 match->ident); in ahci_sb600_enable_64bit()
1199 dev_warn(&pdev->dev, "%s: enabling 64bit DMA\n", match->ident); in ahci_sb600_enable_64bit()
1209 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), in ahci_broken_system_poweroff()
1218 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), in ahci_broken_system_poweroff()
1230 unsigned long slot = (unsigned long)dmi->driver_data; in ahci_broken_system_poweroff()
1231 /* apply the quirk only to on-board controllers */ in ahci_broken_system_poweroff()
1232 return slot == PCI_SLOT(pdev->devfn); in ahci_broken_system_poweroff()
1242 * On HP dv[4-6] and HDX18 with earlier BIOSen, link in ahci_broken_suspend()
1257 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), in ahci_broken_suspend()
1266 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), in ahci_broken_suspend()
1275 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), in ahci_broken_suspend()
1284 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), in ahci_broken_suspend()
1313 if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) in ahci_broken_suspend()
1319 return strcmp(buf, dmi->driver_data) < 0; in ahci_broken_suspend()
1372 return strcmp(buf, dmi->driver_data) < 0; in ahci_broken_lpm()
1394 .ident = "EP45-DQ6", in ahci_broken_online()
1398 DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"), in ahci_broken_online()
1403 .ident = "EP45-DS5", in ahci_broken_online()
1407 DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"), in ahci_broken_online()
1420 val = (unsigned long)dmi->driver_data; in ahci_broken_online()
1422 return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff); in ahci_broken_online()
1444 * is FPDMA non-zero offset enable which when enabled in ahci_gtf_filter_workaround()
1465 filter = (unsigned long)dmi->driver_data; in ahci_gtf_filter_workaround()
1466 dev_info(host->dev, "applying extra ACPI _GTF filter 0x%x for %s\n", in ahci_gtf_filter_workaround()
1467 filter, dmi->ident); in ahci_gtf_filter_workaround()
1469 for (i = 0; i < host->n_ports; i++) { in ahci_gtf_filter_workaround()
1470 struct ata_port *ap = host->ports[i]; in ahci_gtf_filter_workaround()
1476 dev->gtf_filter |= filter; in ahci_gtf_filter_workaround()
1503 DMI_MATCH(DMI_PRODUCT_NAME, "Switch SA5-271") in acer_sa5_271_workaround()
1510 dev_info(&pdev->dev, "enabling Acer Switch Alpha 12 workaround\n"); in acer_sa5_271_workaround()
1511 if ((hpriv->saved_cap & 0xC734FF00) == 0xC734FF00) { in acer_sa5_271_workaround()
1512 hpriv->port_map = 0x7; in acer_sa5_271_workaround()
1513 hpriv->cap = 0xC734FF02; in acer_sa5_271_workaround()
1533 hpriv = host->private_data; in ahci_thunderx_irq_handler()
1534 mmio = hpriv->mmio; in ahci_thunderx_irq_handler()
1540 irq_masked = irq_stat & hpriv->port_map; in ahci_thunderx_irq_handler()
1541 spin_lock(&host->lock); in ahci_thunderx_irq_handler()
1547 spin_unlock(&host->lock); in ahci_thunderx_irq_handler()
1563 if (pdev->vendor != PCI_VENDOR_ID_INTEL || in ahci_remap_check()
1566 !(readl(hpriv->mmio + AHCI_VSCAP) & 1)) in ahci_remap_check()
1569 cap = readq(hpriv->mmio + AHCI_REMAP_CAP); in ahci_remap_check()
1573 if (readl(hpriv->mmio + ahci_remap_dcc(i)) in ahci_remap_check()
1578 hpriv->remapped_nvme++; in ahci_remap_check()
1581 if (!hpriv->remapped_nvme) in ahci_remap_check()
1584 dev_warn(&pdev->dev, "Found %u remapped NVMe devices.\n", in ahci_remap_check()
1585 hpriv->remapped_nvme); in ahci_remap_check()
1586 dev_warn(&pdev->dev, in ahci_remap_check()
1587 "Switch your BIOS from RAID to AHCI mode to use them.\n"); in ahci_remap_check()
1590 * Don't rely on the msi-x capability in the remap case, in ahci_remap_check()
1591 * share the legacy interrupt across ahci and remapped devices. in ahci_remap_check()
1593 hpriv->flags |= AHCI_HFLAG_NO_MSI; in ahci_remap_check()
1598 return pci_irq_vector(to_pci_dev(host->dev), port); in ahci_get_irq_vector()
1606 if (hpriv->flags & AHCI_HFLAG_NO_MSI) in ahci_init_msi()
1607 return -ENODEV; in ahci_init_msi()
1618 if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) { in ahci_init_msi()
1619 hpriv->get_irq_vector = ahci_get_irq_vector; in ahci_init_msi()
1620 hpriv->flags |= AHCI_HFLAG_MULTI_MSI; in ahci_init_msi()
1629 "ahci: MRSM is on, fallback to single MSI\n"); in ahci_init_msi()
1635 * If the host is not capable of supporting per-port vectors, fall in ahci_init_msi()
1636 * back to single MSI before finally attempting single MSI-X. in ahci_init_msi()
1651 if (!(hpriv->flags & AHCI_HFLAG_USE_LPM_POLICY)) in ahci_update_initial_lpm_policy()
1655 if (mobile_lpm_policy != -1) { in ahci_update_initial_lpm_policy()
1661 if (hpriv->cap & HOST_CAP_PART) in ahci_update_initial_lpm_policy()
1663 else if (hpriv->cap & HOST_CAP_SSC) in ahci_update_initial_lpm_policy()
1669 ap->target_lpm_policy = policy; in ahci_update_initial_lpm_policy()
1678 * Only apply the 6-port PCS quirk for known legacy platforms. in ahci_intel_pcs_quirk()
1680 if (!id || id->vendor != PCI_VENDOR_ID_INTEL) in ahci_intel_pcs_quirk()
1684 if (((enum board_ids) id->driver_data) >= board_ahci_pcs7) in ahci_intel_pcs_quirk()
1689 * implemented as write or write-once register. If the register in ahci_intel_pcs_quirk()
1690 * isn't programmed, ahci automatically generates it from number in ahci_intel_pcs_quirk()
1696 if ((tmp16 & hpriv->port_map) != hpriv->port_map) { in ahci_intel_pcs_quirk()
1697 tmp16 |= hpriv->port_map; in ahci_intel_pcs_quirk()
1707 struct ahci_host_priv *hpriv = host->private_data; in remapped_nvme_show()
1709 return sysfs_emit(buf, "%u\n", hpriv->remapped_nvme); in remapped_nvme_show()
1716 unsigned int board_id = ent->driver_data; in ahci_init_one()
1719 struct device *dev = &pdev->dev; in ahci_init_one()
1727 ata_print_version_once(&pdev->dev, DRV_VERSION); in ahci_init_one()
1729 /* The AHCI driver can only drive the SATA ports, the PATA driver in ahci_init_one()
1731 AHCI stays out of the way */ in ahci_init_one()
1732 if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable) in ahci_init_one()
1733 return -ENODEV; in ahci_init_one()
1735 /* Apple BIOS on MCP89 prevents us using AHCI */ in ahci_init_one()
1739 /* Promise's PDC42819 is a SAS/SATA controller that has an AHCI mode. in ahci_init_one()
1740 * At the moment, we can only use the AHCI mode. Let the users know in ahci_init_one()
1743 if (pdev->vendor == PCI_VENDOR_ID_PROMISE) in ahci_init_one()
1744 dev_info(&pdev->dev, in ahci_init_one()
1747 /* Some devices use non-standard BARs */ in ahci_init_one()
1748 if (pdev->vendor == PCI_VENDOR_ID_STMICRO && pdev->device == 0xCC06) in ahci_init_one()
1750 else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000) in ahci_init_one()
1752 else if (pdev->vendor == PCI_VENDOR_ID_CAVIUM) { in ahci_init_one()
1753 if (pdev->device == 0xa01c) in ahci_init_one()
1755 if (pdev->device == 0xa084) in ahci_init_one()
1757 } else if (pdev->vendor == PCI_VENDOR_ID_LOONGSON) { in ahci_init_one()
1758 if (pdev->device == 0x7a08) in ahci_init_one()
1767 if (pdev->vendor == PCI_VENDOR_ID_INTEL && in ahci_init_one()
1768 (pdev->device == 0x2652 || pdev->device == 0x2653)) { in ahci_init_one()
1771 /* ICH6s share the same PCI ID for both piix and ahci in ahci_init_one()
1772 * modes. Enabling ahci mode while MAP indicates in ahci_init_one()
1777 dev_info(&pdev->dev, in ahci_init_one()
1778 "controller is in combined mode, can't enable AHCI mode\n"); in ahci_init_one()
1779 return -ENODEV; in ahci_init_one()
1783 /* AHCI controllers often implement SFF compatible interface. in ahci_init_one()
1787 if (rc == -EBUSY) in ahci_init_one()
1794 return -ENOMEM; in ahci_init_one()
1795 hpriv->flags |= (unsigned long)pi.private_data; in ahci_init_one()
1799 (pdev->revision == 0xa1 || pdev->revision == 0xa2)) in ahci_init_one()
1800 hpriv->flags |= AHCI_HFLAG_NO_MSI; in ahci_init_one()
1803 if (board_id == board_ahci_sb700 && pdev->revision >= 0x40) in ahci_init_one()
1804 hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL; in ahci_init_one()
1808 hpriv->flags &= ~AHCI_HFLAG_32BIT_ONLY; in ahci_init_one()
1810 hpriv->mmio = pcim_iomap_table(pdev)[ahci_pci_bar]; in ahci_init_one()
1815 sysfs_add_file_to_group(&pdev->dev.kobj, in ahci_init_one()
1821 hpriv->flags |= AHCI_HFLAG_NO_DEVSLP; in ahci_init_one()
1824 if (pdev->vendor == PCI_VENDOR_ID_HUAWEI && in ahci_init_one()
1825 pdev->device == 0xa235 && in ahci_init_one()
1826 pdev->revision < 0x30) in ahci_init_one()
1827 hpriv->flags |= AHCI_HFLAG_NO_SXS; in ahci_init_one()
1829 if (pdev->vendor == 0x177d && pdev->device == 0xa01c) in ahci_init_one()
1830 hpriv->irq_handler = ahci_thunderx_irq_handler; in ahci_init_one()
1837 if (hpriv->cap & HOST_CAP_NCQ) { in ahci_init_one()
1840 * Auto-activate optimization is supposed to be in ahci_init_one()
1841 * supported on all AHCI controllers indicating NCQ in ahci_init_one()
1845 if (!(hpriv->flags & AHCI_HFLAG_NO_FPDMA_AA)) in ahci_init_one()
1849 * All AHCI controllers should be forward-compatible in ahci_init_one()
1851 * conditionalized if any buggy AHCI controllers are in ahci_init_one()
1857 if (hpriv->cap & HOST_CAP_PMP) in ahci_init_one()
1864 dev_info(&pdev->dev, in ahci_init_one()
1870 dev_warn(&pdev->dev, in ahci_init_one()
1875 hpriv->flags |= AHCI_HFLAG_NO_SUSPEND; in ahci_init_one()
1876 dev_warn(&pdev->dev, in ahci_init_one()
1881 hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE; in ahci_init_one()
1882 dev_info(&pdev->dev, in ahci_init_one()
1887 /* Acer SA5-271 workaround modifies private_data */ in ahci_init_one()
1895 n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map)); in ahci_init_one()
1897 host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); in ahci_init_one()
1899 return -ENOMEM; in ahci_init_one()
1900 host->private_data = hpriv; in ahci_init_one()
1906 hpriv->irq = pci_irq_vector(pdev, 0); in ahci_init_one()
1908 if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss) in ahci_init_one()
1909 host->flags |= ATA_HOST_PARALLEL_SCAN; in ahci_init_one()
1911 dev_info(&pdev->dev, "SSS flag set, parallel bus scan disabled\n"); in ahci_init_one()
1913 if (!(hpriv->cap & HOST_CAP_PART)) in ahci_init_one()
1914 host->flags |= ATA_HOST_NO_PART; in ahci_init_one()
1916 if (!(hpriv->cap & HOST_CAP_SSC)) in ahci_init_one()
1917 host->flags |= ATA_HOST_NO_SSC; in ahci_init_one()
1919 if (!(hpriv->cap2 & HOST_CAP2_SDS)) in ahci_init_one()
1920 host->flags |= ATA_HOST_NO_DEVSLP; in ahci_init_one()
1925 for (i = 0; i < host->n_ports; i++) { in ahci_init_one()
1926 struct ata_port *ap = host->ports[i]; in ahci_init_one()
1928 ata_port_pbar_desc(ap, ahci_pci_bar, -1, "abar"); in ahci_init_one()
1930 0x100 + ap->port_no * 0x80, "port"); in ahci_init_one()
1933 if (ap->flags & ATA_FLAG_EM) in ahci_init_one()
1934 ap->em_message_type = hpriv->em_msg_type; in ahci_init_one()
1938 /* disabled/not-implemented port */ in ahci_init_one()
1939 if (!(hpriv->port_map & (1 << i))) in ahci_init_one()
1940 ap->ops = &ata_dummy_port_ops; in ahci_init_one()
1967 pm_runtime_put_noidle(&pdev->dev); in ahci_init_one()
1978 sysfs_remove_file_from_group(&pdev->dev.kobj, in ahci_remove_one()
1981 pm_runtime_get_noresume(&pdev->dev); in ahci_remove_one()
1988 MODULE_DESCRIPTION("AHCI SATA low-level driver");