//! /system/drivers/display - the generic display engine driver. //! This driver is a non official driver for GPU vendors like Intel, NVIDIA, AMD. It provides basic //! display engine features to the display engine protocol used by the display server, compositor //! and graphical user interface libraries like Zooeee. //! //! This driver is acts like BUS driver, in that it detects the GPU, its capabilities and loads //! sub-drivers for each device detected. Similar The device manager //! finds display adaptor e.g. over the PCI/ACPI, and passes the buck on to this driver to handle. //! //! The display driver provides the low level part of identifying the device and launching the //! generic device driver for a GPU vendor. //! //! It takes over the framebuffer feature that was setup during system boot. const std = @import("std"); const device = @import("driver"); const ipc = @import("ipc"); const process = @import("process"); const service = @import("service"); const device_manager = @import("driver"); const logging = @import("logging"); const mmio = @import("mmio"); const display_protocol = @import("display-protocol"); const scanout_protocol = @import("scanout-protocol"); var device_id: u64 = 0; fn initialise(endpoint: ipc.Handle) bool { _ = endpoint; // Hello the device manager (role: device — we claim one GPU's PCI function // and serve its display engine; we report no children). Best-effort: without a // manager the driver still runs standalone; when present, the manager marks us // up before the hello deadline and restarts us if we die. _ = device_manager.hello(.device, device_id); return true; } fn onMessage(message: []const u8, reply: []u8, sender: u32, capability: ?ipc.Handle) usize { _ = sender; _ = capability; _ = reply; if (message.len < scanout_protocol.request_size) return 0; return 0; } pub fn main(init: process.Init) void { const argument = init.arguments.get(1) orelse { _ = logging.write("display: missing device id (argv[1])\n"); return; }; device_id = std.fmt.parseInt(u64, argument, 10) catch { std.log.info("malformed device id '{s}'", .{argument}); return; }; service.run(256, .{ .service = .scanout, .init = initialise, .on_message = onMessage, }); }