display-protocol -> library/protocol/display/, scanout-protocol -> library/protocol/scanout/. Consumers import both directly, killing the cryptic dp/sp aliases in virtio-gpu (now display_protocol / scanout_protocol) and the runtime.display_protocol / runtime.scanout_protocol re-exports. runtime.display (the client) still imports display-protocol by name; scanout has no runtime client, so its runtime module import is dropped too. zig build + test green; display-service, virtio-gpu, display-native, display-reattach pass.
71 lines
2.6 KiB
Zig
71 lines
2.6 KiB
Zig
//! /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 = @import("display-protocol");
|
|
const scanout_protocol = @import("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,
|
|
});
|
|
}
|