//! /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 = @import("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, }); }