0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include <linux/kernel.h>
0020 #include <linux/module.h>
0021 #include <linux/pci.h>
0022 #include <linux/blkdev.h>
0023 #include <linux/delay.h>
0024 #include <linux/interrupt.h>
0025 #include <linux/dma-mapping.h>
0026 #include <linux/device.h>
0027 #include <linux/dmi.h>
0028 #include <linux/gfp.h>
0029 #include <linux/msi.h>
0030 #include <scsi/scsi_host.h>
0031 #include <scsi/scsi_cmnd.h>
0032 #include <linux/libata.h>
0033 #include <linux/ahci-remap.h>
0034 #include <linux/io-64-nonatomic-lo-hi.h>
0035 #include "ahci.h"
0036
0037 #define DRV_NAME "ahci"
0038 #define DRV_VERSION "3.0"
0039
0040 enum {
0041 AHCI_PCI_BAR_STA2X11 = 0,
0042 AHCI_PCI_BAR_CAVIUM = 0,
0043 AHCI_PCI_BAR_LOONGSON = 0,
0044 AHCI_PCI_BAR_ENMOTUS = 2,
0045 AHCI_PCI_BAR_CAVIUM_GEN5 = 4,
0046 AHCI_PCI_BAR_STANDARD = 5,
0047 };
0048
0049 enum board_ids {
0050
0051 board_ahci,
0052 board_ahci_ign_iferr,
0053 board_ahci_low_power,
0054 board_ahci_no_debounce_delay,
0055 board_ahci_nomsi,
0056 board_ahci_noncq,
0057 board_ahci_nosntf,
0058 board_ahci_yes_fbs,
0059
0060
0061 board_ahci_al,
0062 board_ahci_avn,
0063 board_ahci_mcp65,
0064 board_ahci_mcp77,
0065 board_ahci_mcp89,
0066 board_ahci_mv,
0067 board_ahci_sb600,
0068 board_ahci_sb700,
0069 board_ahci_vt8251,
0070
0071
0072
0073
0074
0075 board_ahci_pcs7,
0076
0077
0078 board_ahci_mcp_linux = board_ahci_mcp65,
0079 board_ahci_mcp67 = board_ahci_mcp65,
0080 board_ahci_mcp73 = board_ahci_mcp65,
0081 board_ahci_mcp79 = board_ahci_mcp77,
0082 };
0083
0084 static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
0085 static void ahci_remove_one(struct pci_dev *dev);
0086 static void ahci_shutdown_one(struct pci_dev *dev);
0087 static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
0088 unsigned long deadline);
0089 static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
0090 unsigned long deadline);
0091 static void ahci_mcp89_apple_enable(struct pci_dev *pdev);
0092 static bool is_mcp89_apple(struct pci_dev *pdev);
0093 static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
0094 unsigned long deadline);
0095 #ifdef CONFIG_PM
0096 static int ahci_pci_device_runtime_suspend(struct device *dev);
0097 static int ahci_pci_device_runtime_resume(struct device *dev);
0098 #ifdef CONFIG_PM_SLEEP
0099 static int ahci_pci_device_suspend(struct device *dev);
0100 static int ahci_pci_device_resume(struct device *dev);
0101 #endif
0102 #endif
0103
0104 static struct scsi_host_template ahci_sht = {
0105 AHCI_SHT("ahci"),
0106 };
0107
0108 static struct ata_port_operations ahci_vt8251_ops = {
0109 .inherits = &ahci_ops,
0110 .hardreset = ahci_vt8251_hardreset,
0111 };
0112
0113 static struct ata_port_operations ahci_p5wdh_ops = {
0114 .inherits = &ahci_ops,
0115 .hardreset = ahci_p5wdh_hardreset,
0116 };
0117
0118 static struct ata_port_operations ahci_avn_ops = {
0119 .inherits = &ahci_ops,
0120 .hardreset = ahci_avn_hardreset,
0121 };
0122
0123 static const struct ata_port_info ahci_port_info[] = {
0124
0125 [board_ahci] = {
0126 .flags = AHCI_FLAG_COMMON,
0127 .pio_mask = ATA_PIO4,
0128 .udma_mask = ATA_UDMA6,
0129 .port_ops = &ahci_ops,
0130 },
0131 [board_ahci_ign_iferr] = {
0132 AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
0133 .flags = AHCI_FLAG_COMMON,
0134 .pio_mask = ATA_PIO4,
0135 .udma_mask = ATA_UDMA6,
0136 .port_ops = &ahci_ops,
0137 },
0138 [board_ahci_low_power] = {
0139 AHCI_HFLAGS (AHCI_HFLAG_USE_LPM_POLICY),
0140 .flags = AHCI_FLAG_COMMON,
0141 .pio_mask = ATA_PIO4,
0142 .udma_mask = ATA_UDMA6,
0143 .port_ops = &ahci_ops,
0144 },
0145 [board_ahci_no_debounce_delay] = {
0146 .flags = AHCI_FLAG_COMMON,
0147 .link_flags = ATA_LFLAG_NO_DEBOUNCE_DELAY,
0148 .pio_mask = ATA_PIO4,
0149 .udma_mask = ATA_UDMA6,
0150 .port_ops = &ahci_ops,
0151 },
0152 [board_ahci_nomsi] = {
0153 AHCI_HFLAGS (AHCI_HFLAG_NO_MSI),
0154 .flags = AHCI_FLAG_COMMON,
0155 .pio_mask = ATA_PIO4,
0156 .udma_mask = ATA_UDMA6,
0157 .port_ops = &ahci_ops,
0158 },
0159 [board_ahci_noncq] = {
0160 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ),
0161 .flags = AHCI_FLAG_COMMON,
0162 .pio_mask = ATA_PIO4,
0163 .udma_mask = ATA_UDMA6,
0164 .port_ops = &ahci_ops,
0165 },
0166 [board_ahci_nosntf] = {
0167 AHCI_HFLAGS (AHCI_HFLAG_NO_SNTF),
0168 .flags = AHCI_FLAG_COMMON,
0169 .pio_mask = ATA_PIO4,
0170 .udma_mask = ATA_UDMA6,
0171 .port_ops = &ahci_ops,
0172 },
0173 [board_ahci_yes_fbs] = {
0174 AHCI_HFLAGS (AHCI_HFLAG_YES_FBS),
0175 .flags = AHCI_FLAG_COMMON,
0176 .pio_mask = ATA_PIO4,
0177 .udma_mask = ATA_UDMA6,
0178 .port_ops = &ahci_ops,
0179 },
0180
0181 [board_ahci_al] = {
0182 AHCI_HFLAGS (AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_MSI),
0183 .flags = AHCI_FLAG_COMMON,
0184 .pio_mask = ATA_PIO4,
0185 .udma_mask = ATA_UDMA6,
0186 .port_ops = &ahci_ops,
0187 },
0188 [board_ahci_avn] = {
0189 .flags = AHCI_FLAG_COMMON,
0190 .pio_mask = ATA_PIO4,
0191 .udma_mask = ATA_UDMA6,
0192 .port_ops = &ahci_avn_ops,
0193 },
0194 [board_ahci_mcp65] = {
0195 AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP |
0196 AHCI_HFLAG_YES_NCQ),
0197 .flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
0198 .pio_mask = ATA_PIO4,
0199 .udma_mask = ATA_UDMA6,
0200 .port_ops = &ahci_ops,
0201 },
0202 [board_ahci_mcp77] = {
0203 AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP),
0204 .flags = AHCI_FLAG_COMMON,
0205 .pio_mask = ATA_PIO4,
0206 .udma_mask = ATA_UDMA6,
0207 .port_ops = &ahci_ops,
0208 },
0209 [board_ahci_mcp89] = {
0210 AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA),
0211 .flags = AHCI_FLAG_COMMON,
0212 .pio_mask = ATA_PIO4,
0213 .udma_mask = ATA_UDMA6,
0214 .port_ops = &ahci_ops,
0215 },
0216 [board_ahci_mv] = {
0217 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
0218 AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP),
0219 .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA,
0220 .pio_mask = ATA_PIO4,
0221 .udma_mask = ATA_UDMA6,
0222 .port_ops = &ahci_ops,
0223 },
0224 [board_ahci_sb600] = {
0225 AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
0226 AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255 |
0227 AHCI_HFLAG_32BIT_ONLY),
0228 .flags = AHCI_FLAG_COMMON,
0229 .pio_mask = ATA_PIO4,
0230 .udma_mask = ATA_UDMA6,
0231 .port_ops = &ahci_pmp_retry_srst_ops,
0232 },
0233 [board_ahci_sb700] = {
0234 AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL),
0235 .flags = AHCI_FLAG_COMMON,
0236 .pio_mask = ATA_PIO4,
0237 .udma_mask = ATA_UDMA6,
0238 .port_ops = &ahci_pmp_retry_srst_ops,
0239 },
0240 [board_ahci_vt8251] = {
0241 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP),
0242 .flags = AHCI_FLAG_COMMON,
0243 .pio_mask = ATA_PIO4,
0244 .udma_mask = ATA_UDMA6,
0245 .port_ops = &ahci_vt8251_ops,
0246 },
0247 [board_ahci_pcs7] = {
0248 .flags = AHCI_FLAG_COMMON,
0249 .pio_mask = ATA_PIO4,
0250 .udma_mask = ATA_UDMA6,
0251 .port_ops = &ahci_ops,
0252 },
0253 };
0254
0255 static const struct pci_device_id ahci_pci_tbl[] = {
0256
0257 { PCI_VDEVICE(INTEL, 0x06d6), board_ahci },
0258 { PCI_VDEVICE(INTEL, 0x2652), board_ahci },
0259 { PCI_VDEVICE(INTEL, 0x2653), board_ahci },
0260 { PCI_VDEVICE(INTEL, 0x27c1), board_ahci },
0261 { PCI_VDEVICE(INTEL, 0x27c5), board_ahci },
0262 { PCI_VDEVICE(INTEL, 0x27c3), board_ahci },
0263 { PCI_VDEVICE(AL, 0x5288), board_ahci_ign_iferr },
0264 { PCI_VDEVICE(INTEL, 0x2681), board_ahci },
0265 { PCI_VDEVICE(INTEL, 0x2682), board_ahci },
0266 { PCI_VDEVICE(INTEL, 0x2683), board_ahci },
0267 { PCI_VDEVICE(INTEL, 0x27c6), board_ahci },
0268 { PCI_VDEVICE(INTEL, 0x2821), board_ahci },
0269 { PCI_VDEVICE(INTEL, 0x2822), board_ahci_nosntf },
0270 { PCI_VDEVICE(INTEL, 0x2824), board_ahci },
0271 { PCI_VDEVICE(INTEL, 0x2829), board_ahci },
0272 { PCI_VDEVICE(INTEL, 0x282a), board_ahci },
0273 { PCI_VDEVICE(INTEL, 0x2922), board_ahci },
0274 { PCI_VDEVICE(INTEL, 0x2923), board_ahci },
0275 { PCI_VDEVICE(INTEL, 0x2924), board_ahci },
0276 { PCI_VDEVICE(INTEL, 0x2925), board_ahci },
0277 { PCI_VDEVICE(INTEL, 0x2927), board_ahci },
0278 { PCI_VDEVICE(INTEL, 0x2929), board_ahci_low_power },
0279 { PCI_VDEVICE(INTEL, 0x292a), board_ahci_low_power },
0280 { PCI_VDEVICE(INTEL, 0x292b), board_ahci_low_power },
0281 { PCI_VDEVICE(INTEL, 0x292c), board_ahci_low_power },
0282 { PCI_VDEVICE(INTEL, 0x292f), board_ahci_low_power },
0283 { PCI_VDEVICE(INTEL, 0x294d), board_ahci },
0284 { PCI_VDEVICE(INTEL, 0x294e), board_ahci_low_power },
0285 { PCI_VDEVICE(INTEL, 0x502a), board_ahci },
0286 { PCI_VDEVICE(INTEL, 0x502b), board_ahci },
0287 { PCI_VDEVICE(INTEL, 0x3a05), board_ahci },
0288 { PCI_VDEVICE(INTEL, 0x3a22), board_ahci },
0289 { PCI_VDEVICE(INTEL, 0x3a25), board_ahci },
0290 { PCI_VDEVICE(INTEL, 0x3b22), board_ahci },
0291 { PCI_VDEVICE(INTEL, 0x3b23), board_ahci },
0292 { PCI_VDEVICE(INTEL, 0x3b24), board_ahci },
0293 { PCI_VDEVICE(INTEL, 0x3b25), board_ahci },
0294 { PCI_VDEVICE(INTEL, 0x3b29), board_ahci_low_power },
0295 { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci },
0296 { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_low_power },
0297 { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci },
0298 { PCI_VDEVICE(INTEL, 0x19b0), board_ahci_pcs7 },
0299 { PCI_VDEVICE(INTEL, 0x19b1), board_ahci_pcs7 },
0300 { PCI_VDEVICE(INTEL, 0x19b2), board_ahci_pcs7 },
0301 { PCI_VDEVICE(INTEL, 0x19b3), board_ahci_pcs7 },
0302 { PCI_VDEVICE(INTEL, 0x19b4), board_ahci_pcs7 },
0303 { PCI_VDEVICE(INTEL, 0x19b5), board_ahci_pcs7 },
0304 { PCI_VDEVICE(INTEL, 0x19b6), board_ahci_pcs7 },
0305 { PCI_VDEVICE(INTEL, 0x19b7), board_ahci_pcs7 },
0306 { PCI_VDEVICE(INTEL, 0x19bE), board_ahci_pcs7 },
0307 { PCI_VDEVICE(INTEL, 0x19bF), board_ahci_pcs7 },
0308 { PCI_VDEVICE(INTEL, 0x19c0), board_ahci_pcs7 },
0309 { PCI_VDEVICE(INTEL, 0x19c1), board_ahci_pcs7 },
0310 { PCI_VDEVICE(INTEL, 0x19c2), board_ahci_pcs7 },
0311 { PCI_VDEVICE(INTEL, 0x19c3), board_ahci_pcs7 },
0312 { PCI_VDEVICE(INTEL, 0x19c4), board_ahci_pcs7 },
0313 { PCI_VDEVICE(INTEL, 0x19c5), board_ahci_pcs7 },
0314 { PCI_VDEVICE(INTEL, 0x19c6), board_ahci_pcs7 },
0315 { PCI_VDEVICE(INTEL, 0x19c7), board_ahci_pcs7 },
0316 { PCI_VDEVICE(INTEL, 0x19cE), board_ahci_pcs7 },
0317 { PCI_VDEVICE(INTEL, 0x19cF), board_ahci_pcs7 },
0318 { PCI_VDEVICE(INTEL, 0x1c02), board_ahci },
0319 { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_low_power },
0320 { PCI_VDEVICE(INTEL, 0x1c04), board_ahci },
0321 { PCI_VDEVICE(INTEL, 0x1c05), board_ahci_low_power },
0322 { PCI_VDEVICE(INTEL, 0x1c06), board_ahci },
0323 { PCI_VDEVICE(INTEL, 0x1c07), board_ahci },
0324 { PCI_VDEVICE(INTEL, 0x1d02), board_ahci },
0325 { PCI_VDEVICE(INTEL, 0x1d04), board_ahci },
0326 { PCI_VDEVICE(INTEL, 0x1d06), board_ahci },
0327 { PCI_VDEVICE(INTEL, 0x2323), board_ahci },
0328 { PCI_VDEVICE(INTEL, 0x1e02), board_ahci },
0329 { PCI_VDEVICE(INTEL, 0x1e03), board_ahci_low_power },
0330 { PCI_VDEVICE(INTEL, 0x1e04), board_ahci },
0331 { PCI_VDEVICE(INTEL, 0x1e05), board_ahci },
0332 { PCI_VDEVICE(INTEL, 0x1e06), board_ahci },
0333 { PCI_VDEVICE(INTEL, 0x1e07), board_ahci_low_power },
0334 { PCI_VDEVICE(INTEL, 0x1e0e), board_ahci },
0335 { PCI_VDEVICE(INTEL, 0x8c02), board_ahci },
0336 { PCI_VDEVICE(INTEL, 0x8c03), board_ahci_low_power },
0337 { PCI_VDEVICE(INTEL, 0x8c04), board_ahci },
0338 { PCI_VDEVICE(INTEL, 0x8c05), board_ahci_low_power },
0339 { PCI_VDEVICE(INTEL, 0x8c06), board_ahci },
0340 { PCI_VDEVICE(INTEL, 0x8c07), board_ahci_low_power },
0341 { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci },
0342 { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci_low_power },
0343 { PCI_VDEVICE(INTEL, 0x9c02), board_ahci_low_power },
0344 { PCI_VDEVICE(INTEL, 0x9c03), board_ahci_low_power },
0345 { PCI_VDEVICE(INTEL, 0x9c04), board_ahci_low_power },
0346 { PCI_VDEVICE(INTEL, 0x9c05), board_ahci_low_power },
0347 { PCI_VDEVICE(INTEL, 0x9c06), board_ahci_low_power },
0348 { PCI_VDEVICE(INTEL, 0x9c07), board_ahci_low_power },
0349 { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci_low_power },
0350 { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci_low_power },
0351 { PCI_VDEVICE(INTEL, 0x9dd3), board_ahci_low_power },
0352 { PCI_VDEVICE(INTEL, 0x1f22), board_ahci },
0353 { PCI_VDEVICE(INTEL, 0x1f23), board_ahci },
0354 { PCI_VDEVICE(INTEL, 0x1f24), board_ahci },
0355 { PCI_VDEVICE(INTEL, 0x1f25), board_ahci },
0356 { PCI_VDEVICE(INTEL, 0x1f26), board_ahci },
0357 { PCI_VDEVICE(INTEL, 0x1f27), board_ahci },
0358 { PCI_VDEVICE(INTEL, 0x1f2e), board_ahci },
0359 { PCI_VDEVICE(INTEL, 0x1f2f), board_ahci },
0360 { PCI_VDEVICE(INTEL, 0x1f32), board_ahci_avn },
0361 { PCI_VDEVICE(INTEL, 0x1f33), board_ahci_avn },
0362 { PCI_VDEVICE(INTEL, 0x1f34), board_ahci_avn },
0363 { PCI_VDEVICE(INTEL, 0x1f35), board_ahci_avn },
0364 { PCI_VDEVICE(INTEL, 0x1f36), board_ahci_avn },
0365 { PCI_VDEVICE(INTEL, 0x1f37), board_ahci_avn },
0366 { PCI_VDEVICE(INTEL, 0x1f3e), board_ahci_avn },
0367 { PCI_VDEVICE(INTEL, 0x1f3f), board_ahci_avn },
0368 { PCI_VDEVICE(INTEL, 0x2823), board_ahci },
0369 { PCI_VDEVICE(INTEL, 0x2826), board_ahci },
0370 { PCI_VDEVICE(INTEL, 0x2827), board_ahci },
0371 { PCI_VDEVICE(INTEL, 0x282f), board_ahci },
0372 { PCI_VDEVICE(INTEL, 0x43d4), board_ahci },
0373 { PCI_VDEVICE(INTEL, 0x43d5), board_ahci },
0374 { PCI_VDEVICE(INTEL, 0x43d6), board_ahci },
0375 { PCI_VDEVICE(INTEL, 0x43d7), board_ahci },
0376 { PCI_VDEVICE(INTEL, 0x8d02), board_ahci },
0377 { PCI_VDEVICE(INTEL, 0x8d04), board_ahci },
0378 { PCI_VDEVICE(INTEL, 0x8d06), board_ahci },
0379 { PCI_VDEVICE(INTEL, 0x8d0e), board_ahci },
0380 { PCI_VDEVICE(INTEL, 0x8d62), board_ahci },
0381 { PCI_VDEVICE(INTEL, 0x8d64), board_ahci },
0382 { PCI_VDEVICE(INTEL, 0x8d66), board_ahci },
0383 { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci },
0384 { PCI_VDEVICE(INTEL, 0x23a3), board_ahci },
0385 { PCI_VDEVICE(INTEL, 0x9c83), board_ahci_low_power },
0386 { PCI_VDEVICE(INTEL, 0x9c85), board_ahci_low_power },
0387 { PCI_VDEVICE(INTEL, 0x9c87), board_ahci_low_power },
0388 { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci_low_power },
0389 { PCI_VDEVICE(INTEL, 0x8c82), board_ahci },
0390 { PCI_VDEVICE(INTEL, 0x8c83), board_ahci_low_power },
0391 { PCI_VDEVICE(INTEL, 0x8c84), board_ahci },
0392 { PCI_VDEVICE(INTEL, 0x8c85), board_ahci_low_power },
0393 { PCI_VDEVICE(INTEL, 0x8c86), board_ahci },
0394 { PCI_VDEVICE(INTEL, 0x8c87), board_ahci_low_power },
0395 { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci },
0396 { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci_low_power },
0397 { PCI_VDEVICE(INTEL, 0x9d03), board_ahci_low_power },
0398 { PCI_VDEVICE(INTEL, 0x9d05), board_ahci_low_power },
0399 { PCI_VDEVICE(INTEL, 0x9d07), board_ahci_low_power },
0400 { PCI_VDEVICE(INTEL, 0xa102), board_ahci },
0401 { PCI_VDEVICE(INTEL, 0xa103), board_ahci_low_power },
0402 { PCI_VDEVICE(INTEL, 0xa105), board_ahci },
0403 { PCI_VDEVICE(INTEL, 0xa106), board_ahci },
0404 { PCI_VDEVICE(INTEL, 0xa107), board_ahci_low_power },
0405 { PCI_VDEVICE(INTEL, 0xa10f), board_ahci },
0406 { PCI_VDEVICE(INTEL, 0xa182), board_ahci },
0407 { PCI_VDEVICE(INTEL, 0xa186), board_ahci },
0408 { PCI_VDEVICE(INTEL, 0xa1d2), board_ahci },
0409 { PCI_VDEVICE(INTEL, 0xa1d6), board_ahci },
0410 { PCI_VDEVICE(INTEL, 0xa202), board_ahci },
0411 { PCI_VDEVICE(INTEL, 0xa206), board_ahci },
0412 { PCI_VDEVICE(INTEL, 0xa252), board_ahci },
0413 { PCI_VDEVICE(INTEL, 0xa256), board_ahci },
0414 { PCI_VDEVICE(INTEL, 0xa356), board_ahci },
0415 { PCI_VDEVICE(INTEL, 0x06d7), board_ahci },
0416 { PCI_VDEVICE(INTEL, 0xa386), board_ahci },
0417 { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_low_power },
0418 { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_low_power },
0419 { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_low_power },
0420 { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_low_power },
0421 { PCI_VDEVICE(INTEL, 0x34d3), board_ahci_low_power },
0422 { PCI_VDEVICE(INTEL, 0x02d3), board_ahci_low_power },
0423 { PCI_VDEVICE(INTEL, 0x02d7), board_ahci_low_power },
0424
0425
0426 { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
0427 PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
0428
0429 { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr },
0430 { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr },
0431
0432
0433
0434 { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 },
0435 { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb700 },
0436 { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb700 },
0437 { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb700 },
0438 { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb700 },
0439 { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 },
0440 { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 },
0441
0442
0443 { PCI_DEVICE(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031),
0444 .class = PCI_CLASS_STORAGE_SATA_AHCI,
0445 .class_mask = 0xffffff,
0446 board_ahci_al },
0447
0448 { PCI_VDEVICE(AMD, 0x7800), board_ahci },
0449 { PCI_VDEVICE(AMD, 0x7801), board_ahci_no_debounce_delay },
0450 { PCI_VDEVICE(AMD, 0x7900), board_ahci },
0451 { PCI_VDEVICE(AMD, 0x7901), board_ahci_low_power },
0452
0453 { PCI_VENDOR_ID_AMD, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
0454 PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci },
0455
0456
0457 { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_SUBVENDOR_ID_DELL, PCI_ANY_ID,
0458 PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci },
0459
0460
0461 { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 },
0462 { PCI_VDEVICE(VIA, 0x6287), board_ahci_vt8251 },
0463
0464
0465 { PCI_VDEVICE(NVIDIA, 0x044c), board_ahci_mcp65 },
0466 { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci_mcp65 },
0467 { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci_mcp65 },
0468 { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci_mcp65 },
0469 { PCI_VDEVICE(NVIDIA, 0x045c), board_ahci_mcp65 },
0470 { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci_mcp65 },
0471 { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci_mcp65 },
0472 { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci_mcp65 },
0473 { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci_mcp67 },
0474 { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci_mcp67 },
0475 { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci_mcp67 },
0476 { PCI_VDEVICE(NVIDIA, 0x0553), board_ahci_mcp67 },
0477 { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci_mcp67 },
0478 { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci_mcp67 },
0479 { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci_mcp67 },
0480 { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci_mcp67 },
0481 { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci_mcp67 },
0482 { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_mcp67 },
0483 { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_mcp67 },
0484 { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_mcp67 },
0485 { PCI_VDEVICE(NVIDIA, 0x0580), board_ahci_mcp_linux },
0486 { PCI_VDEVICE(NVIDIA, 0x0581), board_ahci_mcp_linux },
0487 { PCI_VDEVICE(NVIDIA, 0x0582), board_ahci_mcp_linux },
0488 { PCI_VDEVICE(NVIDIA, 0x0583), board_ahci_mcp_linux },
0489 { PCI_VDEVICE(NVIDIA, 0x0584), board_ahci_mcp_linux },
0490 { PCI_VDEVICE(NVIDIA, 0x0585), board_ahci_mcp_linux },
0491 { PCI_VDEVICE(NVIDIA, 0x0586), board_ahci_mcp_linux },
0492 { PCI_VDEVICE(NVIDIA, 0x0587), board_ahci_mcp_linux },
0493 { PCI_VDEVICE(NVIDIA, 0x0588), board_ahci_mcp_linux },
0494 { PCI_VDEVICE(NVIDIA, 0x0589), board_ahci_mcp_linux },
0495 { PCI_VDEVICE(NVIDIA, 0x058a), board_ahci_mcp_linux },
0496 { PCI_VDEVICE(NVIDIA, 0x058b), board_ahci_mcp_linux },
0497 { PCI_VDEVICE(NVIDIA, 0x058c), board_ahci_mcp_linux },
0498 { PCI_VDEVICE(NVIDIA, 0x058d), board_ahci_mcp_linux },
0499 { PCI_VDEVICE(NVIDIA, 0x058e), board_ahci_mcp_linux },
0500 { PCI_VDEVICE(NVIDIA, 0x058f), board_ahci_mcp_linux },
0501 { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_mcp73 },
0502 { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_mcp73 },
0503 { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_mcp73 },
0504 { PCI_VDEVICE(NVIDIA, 0x07f3), board_ahci_mcp73 },
0505 { PCI_VDEVICE(NVIDIA, 0x07f4), board_ahci_mcp73 },
0506 { PCI_VDEVICE(NVIDIA, 0x07f5), board_ahci_mcp73 },
0507 { PCI_VDEVICE(NVIDIA, 0x07f6), board_ahci_mcp73 },
0508 { PCI_VDEVICE(NVIDIA, 0x07f7), board_ahci_mcp73 },
0509 { PCI_VDEVICE(NVIDIA, 0x07f8), board_ahci_mcp73 },
0510 { PCI_VDEVICE(NVIDIA, 0x07f9), board_ahci_mcp73 },
0511 { PCI_VDEVICE(NVIDIA, 0x07fa), board_ahci_mcp73 },
0512 { PCI_VDEVICE(NVIDIA, 0x07fb), board_ahci_mcp73 },
0513 { PCI_VDEVICE(NVIDIA, 0x0ad0), board_ahci_mcp77 },
0514 { PCI_VDEVICE(NVIDIA, 0x0ad1), board_ahci_mcp77 },
0515 { PCI_VDEVICE(NVIDIA, 0x0ad2), board_ahci_mcp77 },
0516 { PCI_VDEVICE(NVIDIA, 0x0ad3), board_ahci_mcp77 },
0517 { PCI_VDEVICE(NVIDIA, 0x0ad4), board_ahci_mcp77 },
0518 { PCI_VDEVICE(NVIDIA, 0x0ad5), board_ahci_mcp77 },
0519 { PCI_VDEVICE(NVIDIA, 0x0ad6), board_ahci_mcp77 },
0520 { PCI_VDEVICE(NVIDIA, 0x0ad7), board_ahci_mcp77 },
0521 { PCI_VDEVICE(NVIDIA, 0x0ad8), board_ahci_mcp77 },
0522 { PCI_VDEVICE(NVIDIA, 0x0ad9), board_ahci_mcp77 },
0523 { PCI_VDEVICE(NVIDIA, 0x0ada), board_ahci_mcp77 },
0524 { PCI_VDEVICE(NVIDIA, 0x0adb), board_ahci_mcp77 },
0525 { PCI_VDEVICE(NVIDIA, 0x0ab4), board_ahci_mcp79 },
0526 { PCI_VDEVICE(NVIDIA, 0x0ab5), board_ahci_mcp79 },
0527 { PCI_VDEVICE(NVIDIA, 0x0ab6), board_ahci_mcp79 },
0528 { PCI_VDEVICE(NVIDIA, 0x0ab7), board_ahci_mcp79 },
0529 { PCI_VDEVICE(NVIDIA, 0x0ab8), board_ahci_mcp79 },
0530 { PCI_VDEVICE(NVIDIA, 0x0ab9), board_ahci_mcp79 },
0531 { PCI_VDEVICE(NVIDIA, 0x0aba), board_ahci_mcp79 },
0532 { PCI_VDEVICE(NVIDIA, 0x0abb), board_ahci_mcp79 },
0533 { PCI_VDEVICE(NVIDIA, 0x0abc), board_ahci_mcp79 },
0534 { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci_mcp79 },
0535 { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci_mcp79 },
0536 { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci_mcp79 },
0537 { PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci_mcp89 },
0538 { PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci_mcp89 },
0539 { PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci_mcp89 },
0540 { PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci_mcp89 },
0541 { PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci_mcp89 },
0542 { PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci_mcp89 },
0543 { PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci_mcp89 },
0544 { PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci_mcp89 },
0545 { PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci_mcp89 },
0546 { PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci_mcp89 },
0547 { PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci_mcp89 },
0548 { PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci_mcp89 },
0549
0550
0551 { PCI_VDEVICE(SI, 0x1184), board_ahci },
0552 { PCI_VDEVICE(SI, 0x1185), board_ahci },
0553 { PCI_VDEVICE(SI, 0x0186), board_ahci },
0554
0555
0556 { PCI_VDEVICE(STMICRO, 0xCC06), board_ahci },
0557
0558
0559 { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv },
0560 { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv },
0561 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9123),
0562 .class = PCI_CLASS_STORAGE_SATA_AHCI,
0563 .class_mask = 0xffffff,
0564 .driver_data = board_ahci_yes_fbs },
0565 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125),
0566 .driver_data = board_ahci_yes_fbs },
0567 { PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178,
0568 PCI_VENDOR_ID_MARVELL_EXT, 0x9170),
0569 .driver_data = board_ahci_yes_fbs },
0570 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
0571 .driver_data = board_ahci_yes_fbs },
0572 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
0573 .driver_data = board_ahci_yes_fbs },
0574 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182),
0575 .driver_data = board_ahci_yes_fbs },
0576 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
0577 .driver_data = board_ahci_yes_fbs },
0578 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0),
0579 .driver_data = board_ahci_yes_fbs },
0580 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a2),
0581 .driver_data = board_ahci_yes_fbs },
0582 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
0583 .driver_data = board_ahci_yes_fbs },
0584 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
0585 .driver_data = board_ahci_yes_fbs },
0586 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9235),
0587 .driver_data = board_ahci_no_debounce_delay },
0588 { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642),
0589 .driver_data = board_ahci_yes_fbs },
0590 { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0645),
0591 .driver_data = board_ahci_yes_fbs },
0592
0593
0594 { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci },
0595 { PCI_VDEVICE(PROMISE, 0x3781), board_ahci },
0596
0597
0598 { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci },
0599 { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci },
0600 { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci },
0601 { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci },
0602 { PCI_VDEVICE(ASMEDIA, 0x0621), board_ahci },
0603 { PCI_VDEVICE(ASMEDIA, 0x0622), board_ahci },
0604 { PCI_VDEVICE(ASMEDIA, 0x0624), board_ahci },
0605
0606
0607
0608
0609
0610 { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
0611 { PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi },
0612
0613
0614 { PCI_DEVICE(0x1c44, 0x8000), board_ahci },
0615
0616
0617 { PCI_VDEVICE(LOONGSON, 0x7a08), board_ahci },
0618
0619
0620 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
0621 PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
0622
0623 { }
0624 };
0625
0626 static const struct dev_pm_ops ahci_pci_pm_ops = {
0627 SET_SYSTEM_SLEEP_PM_OPS(ahci_pci_device_suspend, ahci_pci_device_resume)
0628 SET_RUNTIME_PM_OPS(ahci_pci_device_runtime_suspend,
0629 ahci_pci_device_runtime_resume, NULL)
0630 };
0631
0632 static struct pci_driver ahci_pci_driver = {
0633 .name = DRV_NAME,
0634 .id_table = ahci_pci_tbl,
0635 .probe = ahci_init_one,
0636 .remove = ahci_remove_one,
0637 .shutdown = ahci_shutdown_one,
0638 .driver = {
0639 .pm = &ahci_pci_pm_ops,
0640 },
0641 };
0642
0643 #if IS_ENABLED(CONFIG_PATA_MARVELL)
0644 static int marvell_enable;
0645 #else
0646 static int marvell_enable = 1;
0647 #endif
0648 module_param(marvell_enable, int, 0644);
0649 MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
0650
0651 static int mobile_lpm_policy = -1;
0652 module_param(mobile_lpm_policy, int, 0644);
0653 MODULE_PARM_DESC(mobile_lpm_policy, "Default LPM policy for mobile chipsets");
0654
0655 static void ahci_pci_save_initial_config(struct pci_dev *pdev,
0656 struct ahci_host_priv *hpriv)
0657 {
0658 if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) {
0659 dev_info(&pdev->dev, "JMB361 has only one port\n");
0660 hpriv->force_port_map = 1;
0661 }
0662
0663
0664
0665
0666
0667
0668 if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
0669 if (pdev->device == 0x6121)
0670 hpriv->mask_port_map = 0x3;
0671 else
0672 hpriv->mask_port_map = 0xf;
0673 dev_info(&pdev->dev,
0674 "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
0675 }
0676
0677 ahci_save_initial_config(&pdev->dev, hpriv);
0678 }
0679
0680 static void ahci_pci_init_controller(struct ata_host *host)
0681 {
0682 struct ahci_host_priv *hpriv = host->private_data;
0683 struct pci_dev *pdev = to_pci_dev(host->dev);
0684 void __iomem *port_mmio;
0685 u32 tmp;
0686 int mv;
0687
0688 if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
0689 if (pdev->device == 0x6121)
0690 mv = 2;
0691 else
0692 mv = 4;
0693 port_mmio = __ahci_port_base(host, mv);
0694
0695 writel(0, port_mmio + PORT_IRQ_MASK);
0696
0697
0698 tmp = readl(port_mmio + PORT_IRQ_STAT);
0699 dev_dbg(&pdev->dev, "PORT_IRQ_STAT 0x%x\n", tmp);
0700 if (tmp)
0701 writel(tmp, port_mmio + PORT_IRQ_STAT);
0702 }
0703
0704 ahci_init_controller(host);
0705 }
0706
0707 static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
0708 unsigned long deadline)
0709 {
0710 struct ata_port *ap = link->ap;
0711 struct ahci_host_priv *hpriv = ap->host->private_data;
0712 bool online;
0713 int rc;
0714
0715 hpriv->stop_engine(ap);
0716
0717 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
0718 deadline, &online, NULL);
0719
0720 hpriv->start_engine(ap);
0721
0722
0723
0724
0725 return online ? -EAGAIN : rc;
0726 }
0727
0728 static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
0729 unsigned long deadline)
0730 {
0731 struct ata_port *ap = link->ap;
0732 struct ahci_port_priv *pp = ap->private_data;
0733 struct ahci_host_priv *hpriv = ap->host->private_data;
0734 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
0735 struct ata_taskfile tf;
0736 bool online;
0737 int rc;
0738
0739 hpriv->stop_engine(ap);
0740
0741
0742 ata_tf_init(link->device, &tf);
0743 tf.status = ATA_BUSY;
0744 ata_tf_to_fis(&tf, 0, 0, d2h_fis);
0745
0746 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
0747 deadline, &online, NULL);
0748
0749 hpriv->start_engine(ap);
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764 if (online) {
0765 rc = ata_wait_after_reset(link, jiffies + 2 * HZ,
0766 ahci_check_ready);
0767 if (rc)
0768 ahci_kick_engine(ap);
0769 }
0770 return rc;
0771 }
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788 static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
0789 unsigned long deadline)
0790 {
0791 const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
0792 struct ata_port *ap = link->ap;
0793 struct ahci_port_priv *pp = ap->private_data;
0794 struct ahci_host_priv *hpriv = ap->host->private_data;
0795 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
0796 unsigned long tmo = deadline - jiffies;
0797 struct ata_taskfile tf;
0798 bool online;
0799 int rc, i;
0800
0801 hpriv->stop_engine(ap);
0802
0803 for (i = 0; i < 2; i++) {
0804 u16 val;
0805 u32 sstatus;
0806 int port = ap->port_no;
0807 struct ata_host *host = ap->host;
0808 struct pci_dev *pdev = to_pci_dev(host->dev);
0809
0810
0811 ata_tf_init(link->device, &tf);
0812 tf.status = ATA_BUSY;
0813 ata_tf_to_fis(&tf, 0, 0, d2h_fis);
0814
0815 rc = sata_link_hardreset(link, timing, deadline, &online,
0816 ahci_check_ready);
0817
0818 if (sata_scr_read(link, SCR_STATUS, &sstatus) != 0 ||
0819 (sstatus & 0xf) != 1)
0820 break;
0821
0822 ata_link_info(link, "avn bounce port%d\n", port);
0823
0824 pci_read_config_word(pdev, 0x92, &val);
0825 val &= ~(1 << port);
0826 pci_write_config_word(pdev, 0x92, val);
0827 ata_msleep(ap, 1000);
0828 val |= 1 << port;
0829 pci_write_config_word(pdev, 0x92, val);
0830 deadline += tmo;
0831 }
0832
0833 hpriv->start_engine(ap);
0834
0835 if (online)
0836 *class = ahci_dev_classify(ap);
0837
0838 return rc;
0839 }
0840
0841
0842 #ifdef CONFIG_PM
0843 static void ahci_pci_disable_interrupts(struct ata_host *host)
0844 {
0845 struct ahci_host_priv *hpriv = host->private_data;
0846 void __iomem *mmio = hpriv->mmio;
0847 u32 ctl;
0848
0849
0850
0851
0852
0853 ctl = readl(mmio + HOST_CTL);
0854 ctl &= ~HOST_IRQ_EN;
0855 writel(ctl, mmio + HOST_CTL);
0856 readl(mmio + HOST_CTL);
0857 }
0858
0859 static int ahci_pci_device_runtime_suspend(struct device *dev)
0860 {
0861 struct pci_dev *pdev = to_pci_dev(dev);
0862 struct ata_host *host = pci_get_drvdata(pdev);
0863
0864 ahci_pci_disable_interrupts(host);
0865 return 0;
0866 }
0867
0868 static int ahci_pci_device_runtime_resume(struct device *dev)
0869 {
0870 struct pci_dev *pdev = to_pci_dev(dev);
0871 struct ata_host *host = pci_get_drvdata(pdev);
0872 int rc;
0873
0874 rc = ahci_reset_controller(host);
0875 if (rc)
0876 return rc;
0877 ahci_pci_init_controller(host);
0878 return 0;
0879 }
0880
0881 #ifdef CONFIG_PM_SLEEP
0882 static int ahci_pci_device_suspend(struct device *dev)
0883 {
0884 struct pci_dev *pdev = to_pci_dev(dev);
0885 struct ata_host *host = pci_get_drvdata(pdev);
0886 struct ahci_host_priv *hpriv = host->private_data;
0887
0888 if (hpriv->flags & AHCI_HFLAG_NO_SUSPEND) {
0889 dev_err(&pdev->dev,
0890 "BIOS update required for suspend/resume\n");
0891 return -EIO;
0892 }
0893
0894 ahci_pci_disable_interrupts(host);
0895 ata_host_suspend(host, PMSG_SUSPEND);
0896 return 0;
0897 }
0898
0899 static int ahci_pci_device_resume(struct device *dev)
0900 {
0901 struct pci_dev *pdev = to_pci_dev(dev);
0902 struct ata_host *host = pci_get_drvdata(pdev);
0903 int rc;
0904
0905
0906 if (is_mcp89_apple(pdev))
0907 ahci_mcp89_apple_enable(pdev);
0908
0909 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
0910 rc = ahci_reset_controller(host);
0911 if (rc)
0912 return rc;
0913
0914 ahci_pci_init_controller(host);
0915 }
0916
0917 ata_host_resume(host);
0918
0919 return 0;
0920 }
0921 #endif
0922
0923 #endif
0924
0925 static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
0926 {
0927 const int dma_bits = using_dac ? 64 : 32;
0928 int rc;
0929
0930
0931
0932
0933
0934
0935
0936
0937 if (pdev->dma_mask && pdev->dma_mask < DMA_BIT_MASK(32))
0938 return 0;
0939
0940 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(dma_bits));
0941 if (rc)
0942 dev_err(&pdev->dev, "DMA enable failed\n");
0943 return rc;
0944 }
0945
0946 static void ahci_pci_print_info(struct ata_host *host)
0947 {
0948 struct pci_dev *pdev = to_pci_dev(host->dev);
0949 u16 cc;
0950 const char *scc_s;
0951
0952 pci_read_config_word(pdev, 0x0a, &cc);
0953 if (cc == PCI_CLASS_STORAGE_IDE)
0954 scc_s = "IDE";
0955 else if (cc == PCI_CLASS_STORAGE_SATA)
0956 scc_s = "SATA";
0957 else if (cc == PCI_CLASS_STORAGE_RAID)
0958 scc_s = "RAID";
0959 else
0960 scc_s = "unknown";
0961
0962 ahci_print_info(host, scc_s);
0963 }
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983 static void ahci_p5wdh_workaround(struct ata_host *host)
0984 {
0985 static const struct dmi_system_id sysids[] = {
0986 {
0987 .ident = "P5W DH Deluxe",
0988 .matches = {
0989 DMI_MATCH(DMI_SYS_VENDOR,
0990 "ASUSTEK COMPUTER INC"),
0991 DMI_MATCH(DMI_PRODUCT_NAME, "P5W DH Deluxe"),
0992 },
0993 },
0994 { }
0995 };
0996 struct pci_dev *pdev = to_pci_dev(host->dev);
0997
0998 if (pdev->bus->number == 0 && pdev->devfn == PCI_DEVFN(0x1f, 2) &&
0999 dmi_check_system(sysids)) {
1000 struct ata_port *ap = host->ports[1];
1001
1002 dev_info(&pdev->dev,
1003 "enabling ASUS P5W DH Deluxe on-board SIMG4726 workaround\n");
1004
1005 ap->ops = &ahci_p5wdh_ops;
1006 ap->link.flags |= ATA_LFLAG_NO_SRST | ATA_LFLAG_ASSUME_ATA;
1007 }
1008 }
1009
1010
1011
1012
1013
1014 static void ahci_mcp89_apple_enable(struct pci_dev *pdev)
1015 {
1016 u32 val;
1017
1018 printk(KERN_INFO "ahci: enabling MCP89 AHCI mode\n");
1019
1020 pci_read_config_dword(pdev, 0xf8, &val);
1021 val |= 1 << 0x1b;
1022
1023
1024 pci_write_config_dword(pdev, 0xf8, val);
1025
1026 pci_read_config_dword(pdev, 0x54c, &val);
1027 val |= 1 << 0xc;
1028 pci_write_config_dword(pdev, 0x54c, val);
1029
1030 pci_read_config_dword(pdev, 0x4a4, &val);
1031 val &= 0xff;
1032 val |= 0x01060100;
1033 pci_write_config_dword(pdev, 0x4a4, val);
1034
1035 pci_read_config_dword(pdev, 0x54c, &val);
1036 val &= ~(1 << 0xc);
1037 pci_write_config_dword(pdev, 0x54c, val);
1038
1039 pci_read_config_dword(pdev, 0xf8, &val);
1040 val &= ~(1 << 0x1b);
1041 pci_write_config_dword(pdev, 0xf8, val);
1042 }
1043
1044 static bool is_mcp89_apple(struct pci_dev *pdev)
1045 {
1046 return pdev->vendor == PCI_VENDOR_ID_NVIDIA &&
1047 pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA &&
1048 pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
1049 pdev->subsystem_device == 0xcb89;
1050 }
1051
1052
1053 static bool ahci_sb600_enable_64bit(struct pci_dev *pdev)
1054 {
1055 static const struct dmi_system_id sysids[] = {
1056
1057
1058
1059
1060
1061
1062
1063 {
1064 .ident = "ASUS M2A-VM",
1065 .matches = {
1066 DMI_MATCH(DMI_BOARD_VENDOR,
1067 "ASUSTeK Computer INC."),
1068 DMI_MATCH(DMI_BOARD_NAME, "M2A-VM"),
1069 },
1070 .driver_data = "20071026",
1071 },
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088 {
1089 .ident = "MSI K9A2 Platinum",
1090 .matches = {
1091 DMI_MATCH(DMI_BOARD_VENDOR,
1092 "MICRO-STAR INTER"),
1093 DMI_MATCH(DMI_BOARD_NAME, "MS-7376"),
1094 },
1095 },
1096
1097
1098
1099
1100
1101
1102
1103
1104 {
1105 .ident = "MSI K9AGM2",
1106 .matches = {
1107 DMI_MATCH(DMI_BOARD_VENDOR,
1108 "MICRO-STAR INTER"),
1109 DMI_MATCH(DMI_BOARD_NAME, "MS-7327"),
1110 },
1111 },
1112
1113
1114
1115
1116 {
1117 .ident = "ASUS M3A",
1118 .matches = {
1119 DMI_MATCH(DMI_BOARD_VENDOR,
1120 "ASUSTeK Computer INC."),
1121 DMI_MATCH(DMI_BOARD_NAME, "M3A"),
1122 },
1123 },
1124 { }
1125 };
1126 const struct dmi_system_id *match;
1127 int year, month, date;
1128 char buf[9];
1129
1130 match = dmi_first_match(sysids);
1131 if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) ||
1132 !match)
1133 return false;
1134
1135 if (!match->driver_data)
1136 goto enable_64bit;
1137
1138 dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
1139 snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
1140
1141 if (strcmp(buf, match->driver_data) >= 0)
1142 goto enable_64bit;
1143 else {
1144 dev_warn(&pdev->dev,
1145 "%s: BIOS too old, forcing 32bit DMA, update BIOS\n",
1146 match->ident);
1147 return false;
1148 }
1149
1150 enable_64bit:
1151 dev_warn(&pdev->dev, "%s: enabling 64bit DMA\n", match->ident);
1152 return true;
1153 }
1154
1155 static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
1156 {
1157 static const struct dmi_system_id broken_systems[] = {
1158 {
1159 .ident = "HP Compaq nx6310",
1160 .matches = {
1161 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1162 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6310"),
1163 },
1164
1165 .driver_data = (void *)0x1FUL,
1166 },
1167 {
1168 .ident = "HP Compaq 6720s",
1169 .matches = {
1170 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1171 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6720s"),
1172 },
1173
1174 .driver_data = (void *)0x1FUL,
1175 },
1176
1177 { }
1178 };
1179 const struct dmi_system_id *dmi = dmi_first_match(broken_systems);
1180
1181 if (dmi) {
1182 unsigned long slot = (unsigned long)dmi->driver_data;
1183
1184 return slot == PCI_SLOT(pdev->devfn);
1185 }
1186
1187 return false;
1188 }
1189
1190 static bool ahci_broken_suspend(struct pci_dev *pdev)
1191 {
1192 static const struct dmi_system_id sysids[] = {
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206 {
1207 .ident = "dv4",
1208 .matches = {
1209 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1210 DMI_MATCH(DMI_PRODUCT_NAME,
1211 "HP Pavilion dv4 Notebook PC"),
1212 },
1213 .driver_data = "20090105",
1214 },
1215 {
1216 .ident = "dv5",
1217 .matches = {
1218 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1219 DMI_MATCH(DMI_PRODUCT_NAME,
1220 "HP Pavilion dv5 Notebook PC"),
1221 },
1222 .driver_data = "20090506",
1223 },
1224 {
1225 .ident = "dv6",
1226 .matches = {
1227 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1228 DMI_MATCH(DMI_PRODUCT_NAME,
1229 "HP Pavilion dv6 Notebook PC"),
1230 },
1231 .driver_data = "20090423",
1232 },
1233 {
1234 .ident = "HDX18",
1235 .matches = {
1236 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1237 DMI_MATCH(DMI_PRODUCT_NAME,
1238 "HP HDX18 Notebook PC"),
1239 },
1240 .driver_data = "20090430",
1241 },
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251 {
1252 .ident = "G725",
1253 .matches = {
1254 DMI_MATCH(DMI_SYS_VENDOR, "eMachines"),
1255 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"),
1256 },
1257 .driver_data = "20091216",
1258 },
1259 { }
1260 };
1261 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1262 int year, month, date;
1263 char buf[9];
1264
1265 if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2))
1266 return false;
1267
1268 dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
1269 snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
1270
1271 return strcmp(buf, dmi->driver_data) < 0;
1272 }
1273
1274 static bool ahci_broken_lpm(struct pci_dev *pdev)
1275 {
1276 static const struct dmi_system_id sysids[] = {
1277
1278 {
1279 .matches = {
1280 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1281 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X250"),
1282 },
1283 .driver_data = "20180406",
1284 },
1285 {
1286 .matches = {
1287 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1288 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L450"),
1289 },
1290 .driver_data = "20180420",
1291 },
1292 {
1293 .matches = {
1294 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1295 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T450s"),
1296 },
1297 .driver_data = "20180315",
1298 },
1299 {
1300 .matches = {
1301 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1302 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W541"),
1303 },
1304
1305
1306
1307
1308
1309
1310 .driver_data = "20180310",
1311 },
1312 { }
1313 };
1314 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1315 int year, month, date;
1316 char buf[9];
1317
1318 if (!dmi)
1319 return false;
1320
1321 dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
1322 snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
1323
1324 return strcmp(buf, dmi->driver_data) < 0;
1325 }
1326
1327 static bool ahci_broken_online(struct pci_dev *pdev)
1328 {
1329 #define ENCODE_BUSDEVFN(bus, slot, func) \
1330 (void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func)))
1331 static const struct dmi_system_id sysids[] = {
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345 {
1346 .ident = "EP45-DQ6",
1347 .matches = {
1348 DMI_MATCH(DMI_BOARD_VENDOR,
1349 "Gigabyte Technology Co., Ltd."),
1350 DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"),
1351 },
1352 .driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0),
1353 },
1354 {
1355 .ident = "EP45-DS5",
1356 .matches = {
1357 DMI_MATCH(DMI_BOARD_VENDOR,
1358 "Gigabyte Technology Co., Ltd."),
1359 DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"),
1360 },
1361 .driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0),
1362 },
1363 { }
1364 };
1365 #undef ENCODE_BUSDEVFN
1366 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1367 unsigned int val;
1368
1369 if (!dmi)
1370 return false;
1371
1372 val = (unsigned long)dmi->driver_data;
1373
1374 return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff);
1375 }
1376
1377 static bool ahci_broken_devslp(struct pci_dev *pdev)
1378 {
1379
1380 static const struct pci_device_id ids[] = {
1381 { PCI_VDEVICE(INTEL, 0x0f23)},
1382 {}
1383 };
1384
1385 return pci_match_id(ids, pdev);
1386 }
1387
1388 #ifdef CONFIG_ATA_ACPI
1389 static void ahci_gtf_filter_workaround(struct ata_host *host)
1390 {
1391 static const struct dmi_system_id sysids[] = {
1392
1393
1394
1395
1396
1397
1398
1399
1400 {
1401 .ident = "Aspire 3810T",
1402 .matches = {
1403 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1404 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3810T"),
1405 },
1406 .driver_data = (void *)ATA_ACPI_FILTER_FPDMA_OFFSET,
1407 },
1408 { }
1409 };
1410 const struct dmi_system_id *dmi = dmi_first_match(sysids);
1411 unsigned int filter;
1412 int i;
1413
1414 if (!dmi)
1415 return;
1416
1417 filter = (unsigned long)dmi->driver_data;
1418 dev_info(host->dev, "applying extra ACPI _GTF filter 0x%x for %s\n",
1419 filter, dmi->ident);
1420
1421 for (i = 0; i < host->n_ports; i++) {
1422 struct ata_port *ap = host->ports[i];
1423 struct ata_link *link;
1424 struct ata_device *dev;
1425
1426 ata_for_each_link(link, ap, EDGE)
1427 ata_for_each_dev(dev, link, ALL)
1428 dev->gtf_filter |= filter;
1429 }
1430 }
1431 #else
1432 static inline void ahci_gtf_filter_workaround(struct ata_host *host)
1433 {}
1434 #endif
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447 static void acer_sa5_271_workaround(struct ahci_host_priv *hpriv,
1448 struct pci_dev *pdev)
1449 {
1450 static const struct dmi_system_id sysids[] = {
1451 {
1452 .ident = "Acer Switch Alpha 12",
1453 .matches = {
1454 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1455 DMI_MATCH(DMI_PRODUCT_NAME, "Switch SA5-271")
1456 },
1457 },
1458 { }
1459 };
1460
1461 if (dmi_check_system(sysids)) {
1462 dev_info(&pdev->dev, "enabling Acer Switch Alpha 12 workaround\n");
1463 if ((hpriv->saved_cap & 0xC734FF00) == 0xC734FF00) {
1464 hpriv->port_map = 0x7;
1465 hpriv->cap = 0xC734FF02;
1466 }
1467 }
1468 }
1469
1470 #ifdef CONFIG_ARM64
1471
1472
1473
1474
1475
1476 static irqreturn_t ahci_thunderx_irq_handler(int irq, void *dev_instance)
1477 {
1478 struct ata_host *host = dev_instance;
1479 struct ahci_host_priv *hpriv;
1480 unsigned int rc = 0;
1481 void __iomem *mmio;
1482 u32 irq_stat, irq_masked;
1483 unsigned int handled = 1;
1484
1485 hpriv = host->private_data;
1486 mmio = hpriv->mmio;
1487 irq_stat = readl(mmio + HOST_IRQ_STAT);
1488 if (!irq_stat)
1489 return IRQ_NONE;
1490
1491 do {
1492 irq_masked = irq_stat & hpriv->port_map;
1493 spin_lock(&host->lock);
1494 rc = ahci_handle_port_intr(host, irq_masked);
1495 if (!rc)
1496 handled = 0;
1497 writel(irq_stat, mmio + HOST_IRQ_STAT);
1498 irq_stat = readl(mmio + HOST_IRQ_STAT);
1499 spin_unlock(&host->lock);
1500 } while (irq_stat);
1501
1502 return IRQ_RETVAL(handled);
1503 }
1504 #endif
1505
1506 static void ahci_remap_check(struct pci_dev *pdev, int bar,
1507 struct ahci_host_priv *hpriv)
1508 {
1509 int i;
1510 u32 cap;
1511
1512
1513
1514
1515 if (pdev->vendor != PCI_VENDOR_ID_INTEL ||
1516 pci_resource_len(pdev, bar) < SZ_512K ||
1517 bar != AHCI_PCI_BAR_STANDARD ||
1518 !(readl(hpriv->mmio + AHCI_VSCAP) & 1))
1519 return;
1520
1521 cap = readq(hpriv->mmio + AHCI_REMAP_CAP);
1522 for (i = 0; i < AHCI_MAX_REMAP; i++) {
1523 if ((cap & (1 << i)) == 0)
1524 continue;
1525 if (readl(hpriv->mmio + ahci_remap_dcc(i))
1526 != PCI_CLASS_STORAGE_EXPRESS)
1527 continue;
1528
1529
1530 hpriv->remapped_nvme++;
1531 }
1532
1533 if (!hpriv->remapped_nvme)
1534 return;
1535
1536 dev_warn(&pdev->dev, "Found %u remapped NVMe devices.\n",
1537 hpriv->remapped_nvme);
1538 dev_warn(&pdev->dev,
1539 "Switch your BIOS from RAID to AHCI mode to use them.\n");
1540
1541
1542
1543
1544
1545 hpriv->flags |= AHCI_HFLAG_NO_MSI;
1546 }
1547
1548 static int ahci_get_irq_vector(struct ata_host *host, int port)
1549 {
1550 return pci_irq_vector(to_pci_dev(host->dev), port);
1551 }
1552
1553 static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
1554 struct ahci_host_priv *hpriv)
1555 {
1556 int nvec;
1557
1558 if (hpriv->flags & AHCI_HFLAG_NO_MSI)
1559 return -ENODEV;
1560
1561
1562
1563
1564
1565
1566 if (n_ports > 1) {
1567 nvec = pci_alloc_irq_vectors(pdev, n_ports, INT_MAX,
1568 PCI_IRQ_MSIX | PCI_IRQ_MSI);
1569 if (nvec > 0) {
1570 if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) {
1571 hpriv->get_irq_vector = ahci_get_irq_vector;
1572 hpriv->flags |= AHCI_HFLAG_MULTI_MSI;
1573 return nvec;
1574 }
1575
1576
1577
1578
1579
1580 printk(KERN_INFO
1581 "ahci: MRSM is on, fallback to single MSI\n");
1582 pci_free_irq_vectors(pdev);
1583 }
1584 }
1585
1586
1587
1588
1589
1590 nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
1591 if (nvec == 1)
1592 return nvec;
1593 return pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX);
1594 }
1595
1596 static void ahci_update_initial_lpm_policy(struct ata_port *ap,
1597 struct ahci_host_priv *hpriv)
1598 {
1599 int policy = CONFIG_SATA_MOBILE_LPM_POLICY;
1600
1601
1602
1603 if (!(hpriv->flags & AHCI_HFLAG_USE_LPM_POLICY))
1604 return;
1605
1606
1607 if (mobile_lpm_policy != -1) {
1608 policy = mobile_lpm_policy;
1609 goto update_policy;
1610 }
1611
1612 #ifdef CONFIG_ACPI
1613 if (policy > ATA_LPM_MED_POWER &&
1614 (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)) {
1615 if (hpriv->cap & HOST_CAP_PART)
1616 policy = ATA_LPM_MIN_POWER_WITH_PARTIAL;
1617 else if (hpriv->cap & HOST_CAP_SSC)
1618 policy = ATA_LPM_MIN_POWER;
1619 }
1620 #endif
1621
1622 update_policy:
1623 if (policy >= ATA_LPM_UNKNOWN && policy <= ATA_LPM_MIN_POWER)
1624 ap->target_lpm_policy = policy;
1625 }
1626
1627 static void ahci_intel_pcs_quirk(struct pci_dev *pdev, struct ahci_host_priv *hpriv)
1628 {
1629 const struct pci_device_id *id = pci_match_id(ahci_pci_tbl, pdev);
1630 u16 tmp16;
1631
1632
1633
1634
1635 if (!id || id->vendor != PCI_VENDOR_ID_INTEL)
1636 return;
1637
1638
1639 if (((enum board_ids) id->driver_data) >= board_ahci_pcs7)
1640 return;
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650 pci_read_config_word(pdev, PCS_6, &tmp16);
1651 if ((tmp16 & hpriv->port_map) != hpriv->port_map) {
1652 tmp16 |= hpriv->port_map;
1653 pci_write_config_word(pdev, PCS_6, tmp16);
1654 }
1655 }
1656
1657 static ssize_t remapped_nvme_show(struct device *dev,
1658 struct device_attribute *attr,
1659 char *buf)
1660 {
1661 struct ata_host *host = dev_get_drvdata(dev);
1662 struct ahci_host_priv *hpriv = host->private_data;
1663
1664 return sysfs_emit(buf, "%u\n", hpriv->remapped_nvme);
1665 }
1666
1667 static DEVICE_ATTR_RO(remapped_nvme);
1668
1669 static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1670 {
1671 unsigned int board_id = ent->driver_data;
1672 struct ata_port_info pi = ahci_port_info[board_id];
1673 const struct ata_port_info *ppi[] = { &pi, NULL };
1674 struct device *dev = &pdev->dev;
1675 struct ahci_host_priv *hpriv;
1676 struct ata_host *host;
1677 int n_ports, i, rc;
1678 int ahci_pci_bar = AHCI_PCI_BAR_STANDARD;
1679
1680 WARN_ON((int)ATA_MAX_QUEUE > AHCI_MAX_CMDS);
1681
1682 ata_print_version_once(&pdev->dev, DRV_VERSION);
1683
1684
1685
1686
1687 if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable)
1688 return -ENODEV;
1689
1690
1691 if (is_mcp89_apple(pdev))
1692 ahci_mcp89_apple_enable(pdev);
1693
1694
1695
1696
1697
1698 if (pdev->vendor == PCI_VENDOR_ID_PROMISE)
1699 dev_info(&pdev->dev,
1700 "PDC42819 can only drive SATA devices with this driver\n");
1701
1702
1703 if (pdev->vendor == PCI_VENDOR_ID_STMICRO && pdev->device == 0xCC06)
1704 ahci_pci_bar = AHCI_PCI_BAR_STA2X11;
1705 else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000)
1706 ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS;
1707 else if (pdev->vendor == PCI_VENDOR_ID_CAVIUM) {
1708 if (pdev->device == 0xa01c)
1709 ahci_pci_bar = AHCI_PCI_BAR_CAVIUM;
1710 if (pdev->device == 0xa084)
1711 ahci_pci_bar = AHCI_PCI_BAR_CAVIUM_GEN5;
1712 } else if (pdev->vendor == PCI_VENDOR_ID_LOONGSON) {
1713 if (pdev->device == 0x7a08)
1714 ahci_pci_bar = AHCI_PCI_BAR_LOONGSON;
1715 }
1716
1717
1718 rc = pcim_enable_device(pdev);
1719 if (rc)
1720 return rc;
1721
1722 if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
1723 (pdev->device == 0x2652 || pdev->device == 0x2653)) {
1724 u8 map;
1725
1726
1727
1728
1729
1730 pci_read_config_byte(pdev, ICH_MAP, &map);
1731 if (map & 0x3) {
1732 dev_info(&pdev->dev,
1733 "controller is in combined mode, can't enable AHCI mode\n");
1734 return -ENODEV;
1735 }
1736 }
1737
1738
1739
1740
1741 rc = pcim_iomap_regions_request_all(pdev, 1 << ahci_pci_bar, DRV_NAME);
1742 if (rc == -EBUSY)
1743 pcim_pin_device(pdev);
1744 if (rc)
1745 return rc;
1746
1747 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
1748 if (!hpriv)
1749 return -ENOMEM;
1750 hpriv->flags |= (unsigned long)pi.private_data;
1751
1752
1753 if (board_id == board_ahci_mcp65 &&
1754 (pdev->revision == 0xa1 || pdev->revision == 0xa2))
1755 hpriv->flags |= AHCI_HFLAG_NO_MSI;
1756
1757
1758 if (board_id == board_ahci_sb700 && pdev->revision >= 0x40)
1759 hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL;
1760
1761
1762 if (ahci_sb600_enable_64bit(pdev))
1763 hpriv->flags &= ~AHCI_HFLAG_32BIT_ONLY;
1764
1765 hpriv->mmio = pcim_iomap_table(pdev)[ahci_pci_bar];
1766
1767
1768 ahci_remap_check(pdev, ahci_pci_bar, hpriv);
1769
1770 sysfs_add_file_to_group(&pdev->dev.kobj,
1771 &dev_attr_remapped_nvme.attr,
1772 NULL);
1773
1774
1775 if (ahci_broken_devslp(pdev))
1776 hpriv->flags |= AHCI_HFLAG_NO_DEVSLP;
1777
1778 #ifdef CONFIG_ARM64
1779 if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
1780 pdev->device == 0xa235 &&
1781 pdev->revision < 0x30)
1782 hpriv->flags |= AHCI_HFLAG_NO_SXS;
1783
1784 if (pdev->vendor == 0x177d && pdev->device == 0xa01c)
1785 hpriv->irq_handler = ahci_thunderx_irq_handler;
1786 #endif
1787
1788
1789 ahci_pci_save_initial_config(pdev, hpriv);
1790
1791
1792
1793
1794
1795 ahci_intel_pcs_quirk(pdev, hpriv);
1796
1797
1798 if (hpriv->cap & HOST_CAP_NCQ) {
1799 pi.flags |= ATA_FLAG_NCQ;
1800
1801
1802
1803
1804
1805
1806 if (!(hpriv->flags & AHCI_HFLAG_NO_FPDMA_AA))
1807 pi.flags |= ATA_FLAG_FPDMA_AA;
1808
1809
1810
1811
1812
1813
1814
1815 pi.flags |= ATA_FLAG_FPDMA_AUX;
1816 }
1817
1818 if (hpriv->cap & HOST_CAP_PMP)
1819 pi.flags |= ATA_FLAG_PMP;
1820
1821 ahci_set_em_messages(hpriv, &pi);
1822
1823 if (ahci_broken_system_poweroff(pdev)) {
1824 pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN;
1825 dev_info(&pdev->dev,
1826 "quirky BIOS, skipping spindown on poweroff\n");
1827 }
1828
1829 if (ahci_broken_lpm(pdev)) {
1830 pi.flags |= ATA_FLAG_NO_LPM;
1831 dev_warn(&pdev->dev,
1832 "BIOS update required for Link Power Management support\n");
1833 }
1834
1835 if (ahci_broken_suspend(pdev)) {
1836 hpriv->flags |= AHCI_HFLAG_NO_SUSPEND;
1837 dev_warn(&pdev->dev,
1838 "BIOS update required for suspend/resume\n");
1839 }
1840
1841 if (ahci_broken_online(pdev)) {
1842 hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE;
1843 dev_info(&pdev->dev,
1844 "online status unreliable, applying workaround\n");
1845 }
1846
1847
1848
1849 acer_sa5_271_workaround(hpriv, pdev);
1850
1851
1852
1853
1854
1855
1856 n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
1857
1858 host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
1859 if (!host)
1860 return -ENOMEM;
1861 host->private_data = hpriv;
1862
1863 if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
1864
1865 pci_intx(pdev, 1);
1866 }
1867 hpriv->irq = pci_irq_vector(pdev, 0);
1868
1869 if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)
1870 host->flags |= ATA_HOST_PARALLEL_SCAN;
1871 else
1872 dev_info(&pdev->dev, "SSS flag set, parallel bus scan disabled\n");
1873
1874 if (pi.flags & ATA_FLAG_EM)
1875 ahci_reset_em(host);
1876
1877 for (i = 0; i < host->n_ports; i++) {
1878 struct ata_port *ap = host->ports[i];
1879
1880 ata_port_pbar_desc(ap, ahci_pci_bar, -1, "abar");
1881 ata_port_pbar_desc(ap, ahci_pci_bar,
1882 0x100 + ap->port_no * 0x80, "port");
1883
1884
1885 if (ap->flags & ATA_FLAG_EM)
1886 ap->em_message_type = hpriv->em_msg_type;
1887
1888 ahci_update_initial_lpm_policy(ap, hpriv);
1889
1890
1891 if (!(hpriv->port_map & (1 << i)))
1892 ap->ops = &ata_dummy_port_ops;
1893 }
1894
1895
1896 ahci_p5wdh_workaround(host);
1897
1898
1899 ahci_gtf_filter_workaround(host);
1900
1901
1902 rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
1903 if (rc)
1904 return rc;
1905
1906 rc = ahci_reset_controller(host);
1907 if (rc)
1908 return rc;
1909
1910 ahci_pci_init_controller(host);
1911 ahci_pci_print_info(host);
1912
1913 pci_set_master(pdev);
1914
1915 rc = ahci_host_activate(host, &ahci_sht);
1916 if (rc)
1917 return rc;
1918
1919 pm_runtime_put_noidle(&pdev->dev);
1920 return 0;
1921 }
1922
1923 static void ahci_shutdown_one(struct pci_dev *pdev)
1924 {
1925 ata_pci_shutdown_one(pdev);
1926 }
1927
1928 static void ahci_remove_one(struct pci_dev *pdev)
1929 {
1930 sysfs_remove_file_from_group(&pdev->dev.kobj,
1931 &dev_attr_remapped_nvme.attr,
1932 NULL);
1933 pm_runtime_get_noresume(&pdev->dev);
1934 ata_pci_remove_one(pdev);
1935 }
1936
1937 module_pci_driver(ahci_pci_driver);
1938
1939 MODULE_AUTHOR("Jeff Garzik");
1940 MODULE_DESCRIPTION("AHCI SATA low-level driver");
1941 MODULE_LICENSE("GPL");
1942 MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
1943 MODULE_VERSION(DRV_VERSION);