@@ -59,33 +59,34 @@
*/
static int igd_gen(VFIOPCIDevice *vdev)
{
- if ((vdev->device_id & 0xfff) == 0xa84) {
- return 8; /* Broxton */
+ /*
+ * Device IDs for Broxton/Apollo Lake are 0x0a84, 0x1a84, 0x1a85, 0x5a84
+ * and 0x5a85, match bit 11:1 here
+ * Prefix 0x0a is taken by Haswell, this rule should be matched first.
+ */
+ if ((vdev->device_id & 0xffe) == 0xa84) {
+ return 9;
}
switch (vdev->device_id & 0xff00) {
- /* SandyBridge, IvyBridge, ValleyView, Haswell */
- case 0x0100:
- case 0x0400:
- case 0x0a00:
- case 0x0c00:
- case 0x0d00:
- case 0x0f00:
+ case 0x0100: /* SandyBridge, IvyBridge */
return 6;
- /* BroadWell, CherryView, SkyLake, KabyLake */
- case 0x1600:
- case 0x1900:
- case 0x2200:
- case 0x5900:
+ case 0x0400: /* Haswell */
+ case 0x0a00: /* Haswell */
+ case 0x0c00: /* Haswell */
+ case 0x0d00: /* Haswell */
+ case 0x0f00: /* Valleyview/Bay Trail */
+ return 7;
+ case 0x1600: /* Broadwell */
+ case 0x2200: /* Cherryview */
return 8;
- /* CoffeeLake */
- case 0x3e00:
+ case 0x1900: /* Skylake */
+ case 0x5900: /* Kaby Lake */
+ case 0x3e00: /* Coffee Lake */
return 9;
- /* ElkhartLake */
- case 0x4500:
+ case 0x4500: /* Elkhart Lake */
return 11;
- /* TigerLake */
- case 0x9A00:
+ case 0x9A00: /* Tiger Lake */
return 12;
}
@@ -258,7 +259,7 @@ static int vfio_igd_gtt_max(VFIOPCIDevice *vdev)
gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, sizeof(gmch));
ggms = (gmch >> (gen < 8 ? 8 : 6)) & 0x3;
- if (gen > 6 && ggms != 0) {
+ if (gen >= 8 && ggms != 0) {
ggms = 1 << ggms;
}
@@ -668,7 +669,7 @@ void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
/* Determine the size of stolen memory needed for GTT */
ggms_mb = (gmch >> (gen < 8 ? 8 : 6)) & 0x3;
- if (gen > 6 && ggms_mb != 0) {
+ if (gen >= 8 && ggms_mb != 0) {
ggms_mb = 1 << ggms_mb;
}