feat(fws_windows): add intel vmd device detection and support

Add support for detecting Intel VMD (Volume Management Device) controllers and enable/disable the VMD checkbox based on detection.

Changes:
- Add _intel_vmd_present() function to detect VMD controllers via lspci
- Initialize _vmd attribute based on controller detection
- Add VMD checkbox widget binding and state management
- Update checkbox sensitivity when enabling/disabling dual-boot
- Persist VMD state in configuration file
- Load VMD state from saved configuration
This commit is contained in:
2026-07-09 15:57:33 +02:00
parent 64763c3707
commit d050af8279
@@ -109,6 +109,13 @@ def _hib_reserve_gib():
return swap + 6 # + ESP (1 GiO) + MSR + marge
def _intel_vmd_present():
"""True si un contrôleur Intel VMD (Volume Management Device) est présent →
le Windows déployé aura besoin du pilote iaStorVD pour voir/booter les NVMe.
Sur AMD ou machine sans VMD : False (case décochée, no-op)."""
return "volume management device" in _capture("lspci", ["-nn"]).lower()
class FWSWindowsSpoke(NormalSpoke):
"""Dual-boot Windows gaming : écrit /tmp/fws-windows (enabled/disk/size/iso)."""
@@ -134,6 +141,8 @@ class FWSWindowsSpoke(NormalSpoke):
self._disks = []
# Réserve de queue alignée sur le swap d'hibernation du déployeur [M7].
self._reserve = _hib_reserve_gib()
# Support Intel VMD/RST : auto-coché si un contrôleur VMD est détecté.
self._vmd = _intel_vmd_present()
# ------------------------------------------------------------------ cycle
def initialize(self):
@@ -147,6 +156,7 @@ class FWSWindowsSpoke(NormalSpoke):
self._btn = self.builder.get_object("btn_iso")
self._warn = self.builder.get_object("iso_warn")
self._note = self.builder.get_object("note_platform")
self._vmd_chk = self.builder.get_object("chk_vmd")
# Peuple le combo des disques (une fois).
self._disks = _list_disks()
@@ -181,6 +191,8 @@ class FWSWindowsSpoke(NormalSpoke):
self._spin.set_value(self._size)
self._entry.set_text(self._iso)
self._box.set_sensitive(self._enabled and self._uefi)
self._vmd_chk.set_active(self._vmd)
self._vmd_chk.set_sensitive(self._enabled and self._uefi)
self._validate()
def apply(self):
@@ -189,11 +201,14 @@ class FWSWindowsSpoke(NormalSpoke):
self._disk = self._combo.get_active_id() or ""
self._size = int(self._spin.get_value())
self._iso = self._entry.get_text().strip()
self._vmd = self._vmd_chk.get_active()
self._save_state()
# --------------------------------------------------------------- handlers
def _on_toggle(self, _btn):
self._box.set_sensitive(self._chk.get_active())
active = self._chk.get_active()
self._box.set_sensitive(active)
self._vmd_chk.set_sensitive(active)
self._validate()
def _on_disk_changed(self, _combo):
@@ -280,6 +295,8 @@ class FWSWindowsSpoke(NormalSpoke):
self._size = int(val)
elif key == "iso":
self._iso = val
elif key == "intel_vmd":
self._vmd = val == "1"
def _save_state(self):
lines = [
@@ -288,6 +305,7 @@ class FWSWindowsSpoke(NormalSpoke):
"disk=%s" % self._disk,
"size_gib=%d" % self._size,
"iso=%s" % self._iso,
"intel_vmd=%d" % (1 if self._vmd else 0),
]
try:
with open(_STATE_FILE, "w") as fh: