watchthelight labs

Intel panel: Apple's IONDRVFramebuffer on the iGPU gives no desktop in Hybrid mode #14

closedarea:displaykind:bug
watchthelight 2026-10-21

With the panel on the iGPU and no NVIDIA driver, IONDRVFramebuffer publishes on IGPU@2 but WindowServer only builds a virtual framebuffer (CGXConstructVirtualFramebuffer, 'Setting offline display 0x00000000'). Under investigation: what IONDRV on Tahoe needs that it lacks here, and whether injected properties (AAPL,ig-platform-id ffffffff, hda-gfx onboard-1) or another component block it. Parent: #12

watchthelight 2026-10-21

Root cause found (source-level). WindowServer did find the IONDRVFramebuffer on the iGPU: the N-192 log shows Creating FB 1 of 1, then CGXMappedDisplayStart: IOServiceOpen failed(0xe00002c7) (kIOReturnUnsupported), 0 of 1 framebuffers were successfully opened, and WindowServer respawning every ~10 s on a virtual framebuffer.

Why: Apple's IOBootNDRV::fromRegistryEntry (IONDRVSupport, IONDRVFramebuffer.cpp) builds its VRAM descriptor only if the boot console's physical address lies inside one of the device's memory ranges (its PCI BARs). On this Arrow Lake the GOP framebuffer is 0x70800000 = DSM base (stolen memory), outside BAR0 (0x6202000000) and BAR2 (0x6210000000), so no descriptor, no usable framebuffer. On NVIDIA the console sits inside BAR1, which is why dGPU mode works.

Fix being tested: kexts/IGPUConsoleRange (4e5bedb). It probes the iGPU first in the IOFramebuffer category, checks that the console really is this GPU's stolen memory (DSMBASE MMIO 0x1080C0, BAR0 mapped only for that read), appends the console range to the device memory and declines, so Apple's IONDRV probes next and accepts it. Injected through OpenCore so it runs before IONDRV (the auxiliary collection loads at ~60 s, too late). Next boot: Hybrid, NVIDIA off, no NMIntelFB.

watchthelight 2026-10-21

Staged as N-201: IGPUConsoleRange 0.1 injected by OpenCore, NVIDIA driver off, NMIntelFB removed, BIOS Hybrid. Success looks like: kernel log IGPUConsoleRange: console 0x70800000 ... added as device memory, then WindowServer opening the framebuffer and a desktop on the panel. Waiting for the boot.

watchthelight 2026-10-21

Fixed on N-201 (2026-10-20 20:52). With IGPUConsoleRange injected by OpenCore and gfxrst=4, Apple's IONDRVFramebuffer accepts the stolen-memory console and drives the panel: the framebuffer is .Display_boot (IOBootNDRV renames it on success), the iGPU's IODeviceMemory lists the added range (0x70800000, 16,384,000 bytes) after BAR0/BAR2, system_profiler shows Intel 7D67 2560x1600 as the main display, and WindowServer logs Creating FB 1 of 1 and Software compositor activated. First desktop on the Intel iGPU on Tahoe. Unaccelerated; acceleration continues in #16.

Reply on GitHub