]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/ata/ata_piix.c
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
[karo-tx-linux.git] / drivers / ata / ata_piix.c
index 7857e8fd0a3e56e007004492482b3e306d8ba089..3c809bfbccf58a2af573be99719a4fda77bd3815 100644 (file)
@@ -1554,6 +1554,39 @@ static bool piix_broken_system_poweroff(struct pci_dev *pdev)
        return false;
 }
 
+static int prefer_ms_hyperv = 1;
+module_param(prefer_ms_hyperv, int, 0);
+
+static void piix_ignore_devices_quirk(struct ata_host *host)
+{
+#if IS_ENABLED(CONFIG_HYPERV_STORAGE)
+       static const struct dmi_system_id ignore_hyperv[] = {
+               {
+                       /* On Hyper-V hypervisors the disks are exposed on
+                        * both the emulated SATA controller and on the
+                        * paravirtualised drivers.  The CD/DVD devices
+                        * are only exposed on the emulated controller.
+                        * Request we ignore ATA devices on this host.
+                        */
+                       .ident = "Hyper-V Virtual Machine",
+                       .matches = {
+                               DMI_MATCH(DMI_SYS_VENDOR,
+                                               "Microsoft Corporation"),
+                               DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
+                       },
+               },
+               { }     /* terminate list */
+       };
+       const struct dmi_system_id *dmi = dmi_first_match(ignore_hyperv);
+
+       if (dmi && prefer_ms_hyperv) {
+               host->flags |= ATA_HOST_IGNORE_ATA;
+               dev_info(host->dev, "%s detected, ATA device ignore set\n",
+                       dmi->ident);
+       }
+#endif
+}
+
 /**
  *     piix_init_one - Register PIIX ATA PCI device with kernel services
  *     @pdev: PCI device to register
@@ -1669,6 +1702,9 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
        }
        host->flags |= ATA_HOST_PARALLEL_SCAN;
 
+       /* Allow hosts to specify device types to ignore when scanning. */
+       piix_ignore_devices_quirk(host);
+
        pci_set_master(pdev);
        return ata_pci_sff_activate_host(host, ata_bmdma_interrupt, sht);
 }