[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 10/10] vfio/igd: add x-igd-gms option back to set DSM region s
From: |
Tomita Moeko |
Subject: |
[PATCH v3 10/10] vfio/igd: add x-igd-gms option back to set DSM region size for guest |
Date: |
Thu, 5 Dec 2024 18:55:35 +0800 |
DSM region is likely to store framebuffer in Windows, a small DSM
region may cause display issues (e.g. half of the screen is black).
Since 971ca22f041b ("vfio/igd: don't set stolen memory size to zero"),
the x-igd-gms option was functionally removed, QEMU uses host's
original value, which is determined by DVMT Pre-Allocated option in
Intel FSP of host bios.
However, some vendors do not expose this config item to users. In
such cases, x-igd-gms option can be used to manually set the data
stolen memory size for guest. So this commit brings this option back,
keeping its old behavior. When it is not specified, QEMU uses host's
value.
When DVMT Pre-Allocated option is available in host BIOS, user should
set DSM region size there instead of using x-igd-gms option.
Signed-off-by: Tomita Moeko <tomitamoeko@gmail.com>
---
hw/vfio/igd.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
index 73c06bbf64..b0fef90240 100644
--- a/hw/vfio/igd.c
+++ b/hw/vfio/igd.c
@@ -14,6 +14,7 @@
#include "qemu/units.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qapi/qmp/qerror.h"
#include "hw/hw.h"
#include "hw/nvram/fw_cfg.h"
#include "pci.h"
@@ -722,6 +723,31 @@ void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
+ /*
+ * Allow user to override dsm size using x-igd-gms option, in multiples of
+ * 32MiB. This option should only be used when the desired size cannot be
+ * set from DVMT Pre-Allocated option in host BIOS.
+ */
+ if (vdev->igd_gms) {
+ if (gen < 8) {
+ if (vdev->igd_gms <= 0x10) {
+ gmch &= ~(IGD_GMCH_GEN6_GMS_MASK << IGD_GMCH_GEN6_GMS_SHIFT);
+ gmch |= vdev->igd_gms << IGD_GMCH_GEN6_GMS_SHIFT;
+ } else {
+ error_report(QERR_INVALID_PARAMETER_VALUE,
+ "x-igd-gms", "0~0x10");
+ }
+ } else {
+ if (vdev->igd_gms <= 0x40) {
+ gmch &= ~(IGD_GMCH_GEN8_GMS_MASK << IGD_GMCH_GEN8_GMS_SHIFT);
+ gmch |= vdev->igd_gms << IGD_GMCH_GEN8_GMS_SHIFT;
+ } else {
+ error_report(QERR_INVALID_PARAMETER_VALUE,
+ "x-igd-gms", "0~0x40");
+ }
+ }
+ }
+
ggms_size = igd_gtt_memory_size(gen, gmch);
gms_size = igd_stolen_memory_size(gen, gmch);
--
2.45.2
- [PATCH v3 01/10] vfio/igd: remove unsupported device ids, (continued)
- [PATCH v3 01/10] vfio/igd: remove unsupported device ids, Tomita Moeko, 2024/12/05
- [PATCH v3 02/10] vfio/igd: align generation with i915 kernel driver, Tomita Moeko, 2024/12/05
- [PATCH v3 03/10] vfio/igd: fix GTT stolen memory size calculation for gen 8+, Tomita Moeko, 2024/12/05
- [PATCH v3 04/10] vfio/igd: canonicalize memory size calculations, Tomita Moeko, 2024/12/05
- [PATCH v3 05/10] vfio/igd: add Gemini Lake and Comet Lake device ids, Tomita Moeko, 2024/12/05
- [PATCH v3 06/10] vfio/igd: add Alder/Raptor/Rocket/Ice/Jasper Lake device ids, Tomita Moeko, 2024/12/05
- [PATCH v3 07/10] vfio/igd: add macro for declaring mirrored registers, Tomita Moeko, 2024/12/05
- [PATCH v3 08/10] vfio/igd: emulate GGC register in mmio bar0, Tomita Moeko, 2024/12/05
- [PATCH v3 09/10] vfio/igd: emulate BDSM in mmio bar0 for gen 6-10 devices, Tomita Moeko, 2024/12/05
- [PATCH v3 10/10] vfio/igd: add x-igd-gms option back to set DSM region size for guest,
Tomita Moeko <=