diff --git a/system/drivers/display/display.zig b/system/drivers/display/display.zig new file mode 100644 index 0000000..5d4dbd3 --- /dev/null +++ b/system/drivers/display/display.zig @@ -0,0 +1,56 @@ +//! /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 runtime = @import("runtime"); +const mmio = @import("mmio"); +const device = runtime.device; +const dma = runtime.dma; +const shared_memory = runtime.shared_memory; +const system = runtime.system; +const ipc = runtime.ipc; +const display_protocol = runtime.display_protocol; +const scanout_protocol = runtime.scanout_protocol; +const device_manager_protocol = runtime.device_manager_protocol; +var device_id: u64 = 0; + + +fn initialise(endpoint: ipc.Handle) bool { + _ = endpoint; + 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: runtime.process.Init) void { + const argument = init.arguments.get(1) orelse { + _ = system.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; + }; + runtime.service.run(256, .{ + .service = .scanout, + .init = initialise, + .on_message = onMessage, + }); +} diff --git a/system/drivers/display/intel-integrated/intel-integrated.zig b/system/drivers/display/intel-integrated/intel-integrated.zig new file mode 100644 index 0000000..33f80e4 --- /dev/null +++ b/system/drivers/display/intel-integrated/intel-integrated.zig @@ -0,0 +1,70 @@ +//! /system/drivers/display/intel-integrated - the intel 985 family display engine driver. +const std = @import("std"); +const runtime = @import("runtime"); +const mmio = @import("mmio"); +const device = runtime.device; +const dma = runtime.dma; +const shared_memory = runtime.shared_memory; +const system = runtime.system; +const ipc = runtime.ipc; +const display_protocol = runtime.display_protocol; +const scanout_protocol = runtime.scanout_protocol; +const device_manager_protocol = runtime.device_manager_protocol; +var device_id: u64 = 0; + + +fn initialise(endpoint: ipc.Handle) bool { + _ = endpoint; + 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; + const request = std.mem.bytesToValue(scanout_protocol.Request, message[0..scanout_protocol.request_size]); + switch (request.operation) { + _ => return 0, + // TODO: + // @intFromEnum(sp.Operation.present) => return scanoutStatus(reply, presentFull()), + // @intFromEnum(sp.Operation.get_modes) => { + // var response = sp.ModesReply{ .status = 0, .count = offered_modes.len, .modes = undefined }; + // for (0..sp.max_modes) |i| { + // response.modes[i] = if (i < offered_modes.len) + // .{ .width = offered_modes[i].width, .height = offered_modes[i].height } + // else + // .{ .width = 0, .height = 0 }; + // } + // @memcpy(reply[0..sp.modes_reply_size], std.mem.asBytes(&response)); + // return sp.modes_reply_size; + // }, + // @intFromEnum(sp.Operation.set_mode) => { + // const w = request.width; + // const h = request.height; + // if (w == 0 or h == 0 or w > max_width or h > max_height) return scanoutStatus(reply, false); + // current_width = w; + // current_height = h; + // return scanoutStatus(reply, setScanoutRect()); + // }, + else => return 0, + } + return 0; +} + +pub fn main(init: runtime.process.Init) void { + const argument = init.arguments.get(1) orelse { + _ = system.write("display/intel-985: 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; + }; + runtime.service.run(256, .{ + .service = .scanout, + .init = initialise, + .on_message = onMessage, + }); +}