mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 19:14:58 -06:00
Revert "vfio/pci-quirks.c: Disable stolen memory for igd VFIO"
This reverts commit c2b2e158cc
.
The original patch intend to prevent linux i915 driver from using
stolen meory. But this patch breaks windows IGD driver loading on
Gen9+, as IGD HW will use stolen memory on Gen9+, once windows IGD
driver see zero size stolen memory, it will unload.
Meanwhile stolen memory will be disabled in 915 when i915 run as
a guest.
Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.com>
[aw: Gen9+ is SkyLake and newer]
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
37c4a85cd2
commit
93587e3af3
1 changed files with 28 additions and 39 deletions
|
@ -1367,45 +1367,14 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||||
uint16_t cmd_orig, cmd;
|
uint16_t cmd_orig, cmd;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
/* This must be an Intel VGA device. */
|
/*
|
||||||
|
* This must be an Intel VGA device at address 00:02.0 for us to even
|
||||||
|
* consider enabling legacy mode. The vBIOS has dependencies on the
|
||||||
|
* PCI bus address.
|
||||||
|
*/
|
||||||
if (!vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, PCI_ANY_ID) ||
|
if (!vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, PCI_ANY_ID) ||
|
||||||
!vfio_is_vga(vdev) || nr != 4) {
|
!vfio_is_vga(vdev) || nr != 4 ||
|
||||||
return;
|
&vdev->pdev != pci_find_device(pci_device_root_bus(&vdev->pdev),
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IGD is not a standard, they like to change their specs often. We
|
|
||||||
* only attempt to support back to SandBridge and we hope that newer
|
|
||||||
* devices maintain compatibility with generation 8.
|
|
||||||
*/
|
|
||||||
gen = igd_gen(vdev);
|
|
||||||
if (gen != 6 && gen != 8) {
|
|
||||||
error_report("IGD device %s is unsupported by IGD quirks, "
|
|
||||||
"try SandyBridge or newer", vdev->vbasedev.name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Regardless of running in UPT or legacy mode, the guest graphics
|
|
||||||
* driver may attempt to use stolen memory, however only legacy mode
|
|
||||||
* has BIOS support for reserving stolen memory in the guest VM.
|
|
||||||
* Emulate the GMCH register in all cases and zero out the stolen
|
|
||||||
* memory size here. Legacy mode may request allocation and re-write
|
|
||||||
* this below.
|
|
||||||
*/
|
|
||||||
gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, 4);
|
|
||||||
gmch &= ~((gen < 8 ? 0x1f : 0xff) << (gen < 8 ? 3 : 8));
|
|
||||||
|
|
||||||
/* GMCH is read-only, emulated */
|
|
||||||
pci_set_long(vdev->pdev.config + IGD_GMCH, gmch);
|
|
||||||
pci_set_long(vdev->pdev.wmask + IGD_GMCH, 0);
|
|
||||||
pci_set_long(vdev->emulated_config_bits + IGD_GMCH, ~0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This must be at address 00:02.0 for us to even onsider enabling
|
|
||||||
* legacy mode. The vBIOS has dependencies on the PCI bus address.
|
|
||||||
*/
|
|
||||||
if (&vdev->pdev != pci_find_device(pci_device_root_bus(&vdev->pdev),
|
|
||||||
0, PCI_DEVFN(0x2, 0))) {
|
0, PCI_DEVFN(0x2, 0))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1424,6 +1393,18 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IGD is not a standard, they like to change their specs often. We
|
||||||
|
* only attempt to support back to SandBridge and we hope that newer
|
||||||
|
* devices maintain compatibility with generation 8.
|
||||||
|
*/
|
||||||
|
gen = igd_gen(vdev);
|
||||||
|
if (gen != 6 && gen != 8) {
|
||||||
|
error_report("IGD device %s is unsupported in legacy mode, "
|
||||||
|
"try SandyBridge or newer", vdev->vbasedev.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Most of what we're doing here is to enable the ROM to run, so if
|
* Most of what we're doing here is to enable the ROM to run, so if
|
||||||
* there's no ROM, there's no point in setting up this quirk.
|
* there's no ROM, there's no point in setting up this quirk.
|
||||||
|
@ -1479,6 +1460,8 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, 4);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If IGD VGA Disable is clear (expected) and VGA is not already enabled,
|
* If IGD VGA Disable is clear (expected) and VGA is not already enabled,
|
||||||
* try to enable it. Probably shouldn't be using legacy mode without VGA,
|
* try to enable it. Probably shouldn't be using legacy mode without VGA,
|
||||||
|
@ -1549,11 +1532,12 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||||
* when IVD (IGD VGA Disable) is clear, but the claim is that it's unused,
|
* when IVD (IGD VGA Disable) is clear, but the claim is that it's unused,
|
||||||
* so let's not waste VM memory for it.
|
* so let's not waste VM memory for it.
|
||||||
*/
|
*/
|
||||||
|
gmch &= ~((gen < 8 ? 0x1f : 0xff) << (gen < 8 ? 3 : 8));
|
||||||
|
|
||||||
if (vdev->igd_gms) {
|
if (vdev->igd_gms) {
|
||||||
if (vdev->igd_gms <= 0x10) {
|
if (vdev->igd_gms <= 0x10) {
|
||||||
gms_mb = vdev->igd_gms * 32;
|
gms_mb = vdev->igd_gms * 32;
|
||||||
gmch |= vdev->igd_gms << (gen < 8 ? 3 : 8);
|
gmch |= vdev->igd_gms << (gen < 8 ? 3 : 8);
|
||||||
pci_set_long(vdev->pdev.config + IGD_GMCH, gmch);
|
|
||||||
} else {
|
} else {
|
||||||
error_report("Unsupported IGD GMS value 0x%x", vdev->igd_gms);
|
error_report("Unsupported IGD GMS value 0x%x", vdev->igd_gms);
|
||||||
vdev->igd_gms = 0;
|
vdev->igd_gms = 0;
|
||||||
|
@ -1573,6 +1557,11 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
|
||||||
fw_cfg_add_file(fw_cfg_find(), "etc/igd-bdsm-size",
|
fw_cfg_add_file(fw_cfg_find(), "etc/igd-bdsm-size",
|
||||||
bdsm_size, sizeof(*bdsm_size));
|
bdsm_size, sizeof(*bdsm_size));
|
||||||
|
|
||||||
|
/* GMCH is read-only, emulated */
|
||||||
|
pci_set_long(vdev->pdev.config + IGD_GMCH, gmch);
|
||||||
|
pci_set_long(vdev->pdev.wmask + IGD_GMCH, 0);
|
||||||
|
pci_set_long(vdev->emulated_config_bits + IGD_GMCH, ~0);
|
||||||
|
|
||||||
/* BDSM is read-write, emulated. The BIOS needs to be able to write it */
|
/* BDSM is read-write, emulated. The BIOS needs to be able to write it */
|
||||||
pci_set_long(vdev->pdev.config + IGD_BDSM, 0);
|
pci_set_long(vdev->pdev.config + IGD_BDSM, 0);
|
||||||
pci_set_long(vdev->pdev.wmask + IGD_BDSM, ~0);
|
pci_set_long(vdev->pdev.wmask + IGD_BDSM, ~0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue