|
@@ -2937,20 +2937,41 @@ static unsigned int sis_codec_bits[3] = {
|
|
ICH_PCR, ICH_SCR, ICH_SIS_TCR
|
|
ICH_PCR, ICH_SCR, ICH_SIS_TCR
|
|
};
|
|
};
|
|
|
|
|
|
-static int __devinit snd_intel8x0_inside_vm(void)
|
|
|
|
|
|
+static int __devinit snd_intel8x0_inside_vm(struct pci_dev *pci)
|
|
{
|
|
{
|
|
- int result = inside_vm;
|
|
|
|
|
|
+ int result = inside_vm;
|
|
|
|
+ char *msg = NULL;
|
|
|
|
|
|
- if (result < 0) {
|
|
|
|
- /* detect KVM and Parallels virtual environments */
|
|
|
|
- result = kvm_para_available();
|
|
|
|
-#if defined(__i386__) || defined(__x86_64__)
|
|
|
|
- result = result || boot_cpu_has(X86_FEATURE_HYPERVISOR);
|
|
|
|
|
|
+ /* check module parameter first (override detection) */
|
|
|
|
+ if (result >= 0) {
|
|
|
|
+ msg = result ? "enable (forced) VM" : "disable (forced) VM";
|
|
|
|
+ goto fini;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* detect KVM and Parallels virtual environments */
|
|
|
|
+ result = kvm_para_available();
|
|
|
|
+#ifdef X86_FEATURE_HYPERVISOR
|
|
|
|
+ result = result || boot_cpu_has(X86_FEATURE_HYPERVISOR);
|
|
#endif
|
|
#endif
|
|
|
|
+ if (!result)
|
|
|
|
+ goto fini;
|
|
|
|
+
|
|
|
|
+ /* check for known (emulated) devices */
|
|
|
|
+ if (pci->subsystem_vendor == 0x1af4 &&
|
|
|
|
+ pci->subsystem_device == 0x1100) {
|
|
|
|
+ /* KVM emulated sound, PCI SSID: 1af4:1100 */
|
|
|
|
+ msg = "enable KVM";
|
|
|
|
+ } else if (pci->subsystem_vendor == 0x1ab8) {
|
|
|
|
+ /* Parallels VM emulated sound, PCI SSID: 1ab8:xxxx */
|
|
|
|
+ msg = "enable Parallels VM";
|
|
|
|
+ } else {
|
|
|
|
+ msg = "disable (unknown or VT-d) VM";
|
|
|
|
+ result = 0;
|
|
}
|
|
}
|
|
|
|
|
|
- if (result)
|
|
|
|
- printk(KERN_INFO "intel8x0: enable KVM optimization\n");
|
|
|
|
|
|
+fini:
|
|
|
|
+ if (msg != NULL)
|
|
|
|
+ printk(KERN_INFO "intel8x0: %s optimization\n", msg);
|
|
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
@@ -3022,7 +3043,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,
|
|
if (xbox)
|
|
if (xbox)
|
|
chip->xbox = 1;
|
|
chip->xbox = 1;
|
|
|
|
|
|
- chip->inside_vm = snd_intel8x0_inside_vm();
|
|
|
|
|
|
+ chip->inside_vm = snd_intel8x0_inside_vm(pci);
|
|
|
|
|
|
if (pci->vendor == PCI_VENDOR_ID_INTEL &&
|
|
if (pci->vendor == PCI_VENDOR_ID_INTEL &&
|
|
pci->device == PCI_DEVICE_ID_INTEL_440MX)
|
|
pci->device == PCI_DEVICE_ID_INTEL_440MX)
|