Skip to content

Commit 43bbdc2

Browse files
committed
New I2C protocol
Signed-off-by: Lesley Rossouw <[email protected]>
1 parent bda448f commit 43bbdc2

File tree

2 files changed

+46
-24
lines changed

2 files changed

+46
-24
lines changed

src/data.zig

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ pub const Resources = struct {
185185
pub const I2c = struct {
186186
const MAGIC: [5]u8 = MAGIC_START ++ .{0x4};
187187

188+
// SDDF Queue connection between PDs
188189
pub const Connection = extern struct {
189-
data: Region,
190190
req_queue: Region,
191191
resp_queue: Region,
192192
num_buffers: u16,
@@ -196,7 +196,12 @@ pub const Resources = struct {
196196
pub const Virt = extern struct {
197197
pub const Client = extern struct {
198198
conn: Connection,
199-
driver_data_offset: u64,
199+
data_size: usize,
200+
meta_size: usize,
201+
driver_data_vaddr: u64,
202+
driver_meta_vaddr: u64, // vaddr as mapped into driver
203+
client_data_vaddr: u64,
204+
client_meta_vaddr: u64,
200205
};
201206

202207
magic: [5]u8 = MAGIC,
@@ -208,11 +213,15 @@ pub const Resources = struct {
208213
pub const Driver = extern struct {
209214
magic: [5]u8 = MAGIC,
210215
virt: Connection,
216+
meta_size: usize, // Virt can't bounds check addresses in meta, assume all are equal
217+
// to prevent overrun.
211218
};
212219

213220
pub const Client = extern struct {
214221
magic: [5]u8 = MAGIC,
215222
virt: Connection,
223+
data: Region,
224+
meta: Region,
216225
};
217226
};
218227

src/sddf.zig

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ pub const I2c = struct {
418418
region_req_size: usize,
419419
region_resp_size: usize,
420420
region_data_size: usize,
421+
region_meta_size: usize,
421422
driver_config: ConfigResources.I2c.Driver,
422423
virt_config: ConfigResources.I2c.Virt,
423424
client_configs: std.ArrayList(ConfigResources.I2c.Client),
@@ -431,6 +432,7 @@ pub const I2c = struct {
431432
region_req_size: usize = 0x1000,
432433
region_resp_size: usize = 0x1000,
433434
region_data_size: usize = 0x1000,
435+
region_meta_size: usize = 0x10000,
434436
};
435437

436438
pub fn init(allocator: Allocator, sdf: *SystemDescription, device: ?*dtb.Node, driver: *Pd, virt: *Pd, options: Options) I2c {
@@ -445,11 +447,11 @@ pub const I2c = struct {
445447
.region_req_size = options.region_req_size,
446448
.region_resp_size = options.region_resp_size,
447449
.region_data_size = options.region_data_size,
450+
.region_meta_size = options.region_meta_size,
448451
.driver_config = std.mem.zeroInit(ConfigResources.I2c.Driver, .{}),
449452
.virt_config = std.mem.zeroInit(ConfigResources.I2c.Virt, .{}),
450453
.client_configs = std.ArrayList(ConfigResources.I2c.Client).init(allocator),
451-
// TODO: handle properly
452-
.num_buffers = 128,
454+
.num_buffers = 64,
453455
};
454456
}
455457

@@ -505,18 +507,15 @@ pub const I2c = struct {
505507

506508
system.driver_config = .{
507509
.virt = .{
508-
// Will be set in connectClient
509-
.data = undefined,
510510
.req_queue = .createFromMap(driver_map_req),
511511
.resp_queue = .createFromMap(driver_map_resp),
512512
.num_buffers = system.num_buffers,
513513
.id = ch.pd_a_id,
514514
},
515+
.meta_size = system.region_meta_size,
515516
};
516517

517518
system.virt_config.driver = .{
518-
// Will be set in connectClient
519-
.data = undefined,
520519
.req_queue = .createFromMap(virt_map_req),
521520
.resp_queue = .createFromMap(virt_map_resp),
522521
.num_buffers = system.num_buffers,
@@ -535,14 +534,20 @@ pub const I2c = struct {
535534
const mr_req = Mr.create(allocator, fmt(allocator, "i2c_client_request_{s}", .{client.name}), system.region_req_size, .{});
536535
const mr_resp = Mr.create(allocator, fmt(allocator, "i2c_client_response_{s}", .{client.name}), system.region_resp_size, .{});
537536
const mr_data = Mr.create(allocator, fmt(allocator, "i2c_client_data_{s}", .{client.name}), system.region_data_size, .{});
537+
const mr_meta = Mr.create(allocator, fmt(allocator, "i2c_client_meta_{s}", .{client.name}), system.region_meta_size, .{});
538538

539539
sdf.addMemoryRegion(mr_req);
540540
sdf.addMemoryRegion(mr_resp);
541541
sdf.addMemoryRegion(mr_data);
542+
sdf.addMemoryRegion(mr_meta);
542543

543544
const driver_map_data = Map.create(mr_data, system.driver.getMapVaddr(&mr_data), .rw, .{});
544545
driver.addMap(driver_map_data);
545546

547+
// The meta region backs buffers in the data region. Accessed only by driver and client.
548+
const driver_map_meta = Map.create(mr_meta, system.driver.getMapVaddr(&mr_meta), .rw, .{ .cached = false });
549+
driver.addMap(driver_map_meta);
550+
546551
const virt_map_req = Map.create(mr_req, system.virt.getMapVaddr(&mr_req), .rw, .{});
547552
virt.addMap(virt_map_req);
548553
const virt_map_resp = Map.create(mr_resp, system.virt.getMapVaddr(&mr_resp), .rw, .{});
@@ -552,38 +557,46 @@ pub const I2c = struct {
552557
client.addMap(client_map_req);
553558
const client_map_resp = Map.create(mr_resp, client.getMapVaddr(&mr_resp), .rw, .{});
554559
client.addMap(client_map_resp);
560+
555561
const client_map_data = Map.create(mr_data, client.getMapVaddr(&mr_data), .rw, .{});
556562
client.addMap(client_map_data);
563+
const client_map_meta = Map.create(mr_meta, client.getMapVaddr(&mr_meta), .rw, .{ .cached = false });
564+
client.addMap(client_map_meta);
557565

558566
// Create a channel between the virtualiser and client
559567
const ch = Channel.create(virt, client, .{ .pp = .b }) catch unreachable;
560568
sdf.addChannel(ch);
561569

570+
// The below section originally passed the virt a region structure with no vaddr for the
571+
// data region. Instead of doing this, just pass the size of the region.
562572
system.virt_config.clients[i] = .{
563573
.conn = .{
564-
.data = .{
565-
// TODO: absolute hack
566-
.vaddr = 0,
567-
.size = system.region_data_size,
568-
},
569574
.req_queue = .createFromMap(virt_map_req),
570575
.resp_queue = .createFromMap(virt_map_resp),
571576
.num_buffers = system.num_buffers,
572577
.id = ch.pd_a_id,
573578
},
574-
.driver_data_offset = i * system.region_data_size,
579+
.data_size = system.region_data_size,
580+
.meta_size = system.region_meta_size,
581+
// vaddrs used to convert offsets in cmd / meta buffers to a pointer used by the driver
582+
// .driver_data_vaddr = i * driver_map_data.vaddr,
583+
// .driver_meta_vaddr = i * driver_map_meta.vaddr,
584+
.driver_data_vaddr = driver_map_data.vaddr,
585+
.driver_meta_vaddr = driver_map_meta.vaddr,
586+
.client_data_vaddr = client_map_data.vaddr,
587+
.client_meta_vaddr = client_map_meta.vaddr,
575588
};
576-
if (i == 0) {
577-
system.driver_config.virt.data = .createFromMap(driver_map_data);
578-
}
579589

580-
system.client_configs.items[i] = .{ .virt = .{
590+
system.client_configs.items[i] = .{
591+
.virt = .{
592+
.req_queue = .createFromMap(client_map_req),
593+
.resp_queue = .createFromMap(client_map_resp),
594+
.num_buffers = system.num_buffers,
595+
.id = ch.pd_b_id,
596+
},
581597
.data = .createFromMap(client_map_data),
582-
.req_queue = .createFromMap(client_map_req),
583-
.resp_queue = .createFromMap(client_map_resp),
584-
.num_buffers = system.num_buffers,
585-
.id = ch.pd_b_id,
586-
} };
598+
.meta = .createFromMap(client_map_meta),
599+
};
587600
}
588601

589602
pub fn connect(system: *I2c) !void {
@@ -596,7 +609,7 @@ pub const I2c = struct {
596609
// 2. Connect the driver to the virtualiser
597610
system.connectDriver();
598611

599-
// 3. Connect each client to the virtualiser
612+
// 3. Connect each client to the virtualiser (and connect the meta region to the driver)
600613
for (system.clients.items, 0..) |client, i| {
601614
system.connectClient(client, i);
602615
}

0 commit comments

Comments
 (0)