diff --git a/drivers/graphics/ihdgd/src/device/pipe.rs b/drivers/graphics/ihdgd/src/device/pipe.rs index f69e87080e..c378ff076c 100644 --- a/drivers/graphics/ihdgd/src/device/pipe.rs +++ b/drivers/graphics/ihdgd/src/device/pipe.rs @@ -144,8 +144,18 @@ impl Plane { })?; self.buf_cfg.write(buffer.start | (buffer.end << 16)); - //TODO: correct watermark calculation - self.wm[0].write(PLANE_WM_ENABLE | (2 << PLANE_WM_LINES_SHIFT) | buffer.len() as u32); + // Watermark: display FIFO prefetch depth in scanlines. + // Intel PRM: minimum 8 lines for display-only planes at 1080p. + // Higher resolutions need proportionally more lines to avoid + // underruns. Formula: max(8, vdisplay / 16) capped at 128. + let size = self.size.read(); + let vdisplay = ((size >> 16) & 0xFFFF) + 1; + let wm_lines = (vdisplay / 16).clamp(8, 128); + self.wm[0].write( + PLANE_WM_ENABLE + | ((wm_lines & 0x1F) << PLANE_WM_LINES_SHIFT) + | (buffer.len() as u32 & 0x1FF), + ); for i in 1..self.wm.len() { self.wm[i].writef(PLANE_WM_ENABLE, false); }