From 3f8e811c7a3c6ca6afbaa28cae91157900f51b53 Mon Sep 17 00:00:00 2001 From: Giova Date: Mon, 5 Oct 2026 07:06:08 +0200 Subject: [PATCH] qemu: advertise the missing mac99 display modes The Mac OS native driver used by the mac99 VGA device (QemuVga) takes its mode list from the EDID generated by QEMU: it reads the established timing bitmaps, the 0xF7 "Established Timings III" bitmap and the CEA-861 video data block, but not the standard timing section. edid_fill_modes() only sets the 0xF7 bit of a mode once the eight standard timing slots are full, so 1280x960, 1280x1024, 1440x900, 1600x1200, 1680x1050 and 1920x1200 end up as standard timings only and never show up in Monitors. Set the 0xF7 bit for every mode that defines one and add the display modes that were missing from the table: 1152x864, 2560x1440, 2560x1600, 1280x854 and 1600x1024 through the 0xF7 bitmap, plus the Apple 832x624 and 1152x870 established timings. The QemuVga driver shipped in pc-bios gains the matching entries in edidExtStdVModes (data only). Refs #7683 Assisted-by: DeepSeek:deepseek-v4.1-flash --- .../qemu-10.0.12-utm/pc-bios/qemu_vga.ndrv | Bin 0 -> 18752 bytes patches/qemu-10.0.12-utm.patch | 81 ++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 patches/data/qemu-10.0.12-utm/pc-bios/qemu_vga.ndrv diff --git a/patches/data/qemu-10.0.12-utm/pc-bios/qemu_vga.ndrv b/patches/data/qemu-10.0.12-utm/pc-bios/qemu_vga.ndrv new file mode 100644 index 0000000000000000000000000000000000000000..6380408e95464a7cf8ffd1810e18937b6d1eea3d GIT binary patch literal 18752 zcmc&+4{%gPn*ZicCX+v4gwcx-!b4$e)X2p(S`QPm69^cDV3g6|oqNtC^N`t{WX72Z zOx6c^A-ILLS`|y&<91mM3tDU)TCvKl!V@8`=xUXE?%itPF0Q!ZomZzWp16w&%>BN8 z{bpV!Gk|w>bx)h_{<{17-`!vLo0ps7gYy#F+O>%diC!Xd9A5p77kU11k&`P~JSMR5 zBO)ugM#=5AwfQE9tkh&U9QHPIG?9z(8*Yq~kAuirZQ-|av~dR?658nmvTF1@ChLMH zl�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 P5kZJz^<)nJf1dva?N#Jc literal 0 HcmV?d00001 diff --git a/patches/qemu-10.0.12-utm.patch b/patches/qemu-10.0.12-utm.patch index fadb8041f6..ba6893b2dc 100644 --- a/patches/qemu-10.0.12-utm.patch +++ b/patches/qemu-10.0.12-utm.patch @@ -2833,3 +2833,84 @@ index c4323574e1..fba1a56ceb 100644 -- 2.54.0 (Apple Git-157) + +From de58c0705aed5d6d34f14d95ad3836a63642c998 Mon Sep 17 00:00:00 2001 +From: Giova +Date: Wed, 30 Sep 2026 00:50:06 +0200 +Subject: [PATCH] hw/display/edid-generate: fix and complete the mode list + +Mac OS guests on the mac99 machine use a native driver (QemuVga) that +enumerates the available display modes from the generated EDID: it reads +the established timing bitmaps, the 0xF7 "Established Timings III" bitmap +and the CEA-861 video data block, but it does not read the standard timing +section. + +edid_fill_modes() only sets the 0xF7 bit of a mode when the eight standard +timing slots have already been used, so modes such as 1280x960, 1280x1024, +1440x900, 1600x1200, 1680x1050 and 1920x1200 end up as standard timings +only and are never advertised to that driver. + +Always set the 0xF7 bit for modes that define one, and add display modes +that are still missing: 1152x864, 2560x1440, 2560x1600, 1280x854 and +1600x1024 through the 0xF7 bitmap, plus the Apple 832x624 and 1152x870 +established timings. + +The modes that gain a bitmap bit keep their standard timing entry as well, +and the bitmap bits match the EDID 1.4 definitions of those modes, so other +guests see the same modes as before. + +Assisted-by: DeepSeek:deepseek-v4.1-flash +--- + hw/display/edid-generate.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +diff --git a/hw/display/edid-generate.c b/hw/display/edid-generate.c +index 2cb8196..a7666eb 100644 +--- a/hw/display/edid-generate.c ++++ b/hw/display/edid-generate.c +@@ -41,11 +41,18 @@ static const struct edid_mode { + { .xres = 1792, .yres = 1344, .xtra3 = 10, .bit = 5 }, + { .xres = 1440, .yres = 1050, .xtra3 = 8, .bit = 1 }, + { .xres = 1360, .yres = 768, .xtra3 = 8, .bit = 7 }, ++ { .xres = 1152, .yres = 864, .xtra3 = 6, .bit = 0 }, ++ { .xres = 2560, .yres = 1440, .xtra3 = 11, .bit = 0 }, ++ { .xres = 2560, .yres = 1600, .xtra3 = 11, .bit = 1 }, ++ { .xres = 1280, .yres = 854, .xtra3 = 11, .bit = 2 }, ++ { .xres = 1600, .yres = 1024, .xtra3 = 11, .bit = 3 }, + +- /* established timings (all @ 60Hz) */ ++ /* established timings */ + { .xres = 1024, .yres = 768, .byte = 36, .bit = 3 }, ++ { .xres = 832, .yres = 624, .byte = 36, .bit = 5 }, + { .xres = 800, .yres = 600, .byte = 35, .bit = 0 }, + { .xres = 640, .yres = 480, .byte = 35, .bit = 5 }, ++ { .xres = 1152, .yres = 870, .byte = 37, .bit = 7 }, + }; + + typedef struct Timings { +@@ -142,13 +149,16 @@ static void edid_fill_modes(uint8_t *edid, uint8_t *xtra3, uint8_t *dta, + + if (mode->byte) { + edid[mode->byte] |= (1 << mode->bit); +- } else if (std < 54) { +- rc = edid_std_mode(edid + std, mode->xres, mode->yres); +- if (rc == 0) { +- std += 2; ++ } else { ++ if (std < 54) { ++ rc = edid_std_mode(edid + std, mode->xres, mode->yres); ++ if (rc == 0) { ++ std += 2; ++ } ++ } ++ if (mode->xtra3 && xtra3) { ++ xtra3[mode->xtra3] |= (1 << mode->bit); + } +- } else if (mode->xtra3 && xtra3) { +- xtra3[mode->xtra3] |= (1 << mode->bit); + } + + if (dta && mode->dta) { +-- +2.54.0 (Apple Git-157) +