Skip to content

Commit b41e13c

Browse files
committed
New I2C protocol
Signed-off-by: Lesley Rossouw <[email protected]>
1 parent 37a3be8 commit b41e13c

File tree

3 files changed

+46
-24
lines changed

3 files changed

+46
-24
lines changed

src/data.zig

Lines changed: 9 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,
@@ -213,6 +218,8 @@ pub const Resources = struct {
213218
pub const Client = extern struct {
214219
magic: [5]u8 = MAGIC,
215220
virt: Connection,
221+
data: Region,
222+
meta: Region,
216223
};
217224
};
218225

src/sddf.zig

Lines changed: 34 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,8 +507,6 @@ 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,
@@ -515,8 +515,6 @@ pub const I2c = struct {
515515
};
516516

517517
system.virt_config.driver = .{
518-
// Will be set in connectClient
519-
.data = undefined,
520518
.req_queue = .createFromMap(virt_map_req),
521519
.resp_queue = .createFromMap(virt_map_resp),
522520
.num_buffers = system.num_buffers,
@@ -535,14 +533,20 @@ pub const I2c = struct {
535533
const mr_req = Mr.create(allocator, fmt(allocator, "i2c_client_request_{s}", .{client.name}), system.region_req_size, .{});
536534
const mr_resp = Mr.create(allocator, fmt(allocator, "i2c_client_response_{s}", .{client.name}), system.region_resp_size, .{});
537535
const mr_data = Mr.create(allocator, fmt(allocator, "i2c_client_data_{s}", .{client.name}), system.region_data_size, .{});
536+
const mr_meta = Mr.create(allocator, fmt(allocator, "i2c_client_meta_{s}", .{client.name}), system.region_meta_size, .{});
538537

539538
sdf.addMemoryRegion(mr_req);
540539
sdf.addMemoryRegion(mr_resp);
541540
sdf.addMemoryRegion(mr_data);
541+
sdf.addMemoryRegion(mr_meta);
542542

543543
const driver_map_data = Map.create(mr_data, system.driver.getMapVaddr(&mr_data), .rw, .{});
544544
driver.addMap(driver_map_data);
545545

546+
// The meta region backs buffers in the data region. Accessed only by driver and client.
547+
const driver_map_meta = Map.create(mr_meta, system.driver.getMapVaddr(&mr_meta), .rw, .{ .cached = false });
548+
driver.addMap(driver_map_meta);
549+
546550
const virt_map_req = Map.create(mr_req, system.virt.getMapVaddr(&mr_req), .rw, .{});
547551
virt.addMap(virt_map_req);
548552
const virt_map_resp = Map.create(mr_resp, system.virt.getMapVaddr(&mr_resp), .rw, .{});
@@ -552,38 +556,46 @@ pub const I2c = struct {
552556
client.addMap(client_map_req);
553557
const client_map_resp = Map.create(mr_resp, client.getMapVaddr(&mr_resp), .rw, .{});
554558
client.addMap(client_map_resp);
559+
555560
const client_map_data = Map.create(mr_data, client.getMapVaddr(&mr_data), .rw, .{});
556561
client.addMap(client_map_data);
562+
const client_map_meta = Map.create(mr_meta, client.getMapVaddr(&mr_meta), .rw, .{ .cached = false });
563+
client.addMap(client_map_meta);
557564

558565
// Create a channel between the virtualiser and client
559566
const ch = Channel.create(virt, client, .{ .pp = .b }) catch unreachable;
560567
sdf.addChannel(ch);
561568

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

580-
system.client_configs.items[i] = .{ .virt = .{
589+
system.client_configs.items[i] = .{
590+
.virt = .{
591+
.req_queue = .createFromMap(client_map_req),
592+
.resp_queue = .createFromMap(client_map_resp),
593+
.num_buffers = system.num_buffers,
594+
.id = ch.pd_b_id,
595+
},
581596
.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-
} };
597+
.meta = .createFromMap(client_map_meta),
598+
};
587599
}
588600

589601
pub fn connect(system: *I2c) !void {
@@ -596,7 +608,7 @@ pub const I2c = struct {
596608
// 2. Connect the driver to the virtualiser
597609
system.connectDriver();
598610

599-
// 3. Connect each client to the virtualiser
611+
// 3. Connect each client to the virtualiser (and connect the meta region to the driver)
600612
for (system.clients.items, 0..) |client, i| {
601613
system.connectClient(client, i);
602614
}

tests/c_example.system

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
<memory_region name="i2c_client_request_i2c_reactor_client" size="0x1000" />
66
<memory_region name="i2c_client_response_i2c_reactor_client" size="0x1000" />
77
<memory_region name="i2c_client_data_i2c_reactor_client" size="0x1000" />
8+
<memory_region name="i2c_client_meta_i2c_reactor_client" size="0x10000" />
89
<protection_domain name="i2c_reactor_client" priority="198">
910
<program_image path="reactor_client.elf" />
1011
<map mr="i2c_client_request_i2c_reactor_client" vaddr="0x20000000" perms="rw" />
1112
<map mr="i2c_client_response_i2c_reactor_client" vaddr="0x20001000" perms="rw" />
1213
<map mr="i2c_client_data_i2c_reactor_client" vaddr="0x20002000" perms="rw" />
14+
<map mr="i2c_client_meta_i2c_reactor_client" vaddr="0x20003000" perms="rw" cached="false" />
1315
</protection_domain>
1416
<protection_domain name="i2c_virt" priority="199" passive="true">
1517
<program_image path="i2c_virt.elf" />
@@ -23,6 +25,7 @@
2325
<map mr="i2c_driver_request" vaddr="0x20000000" perms="rw" />
2426
<map mr="i2c_driver_response" vaddr="0x20001000" perms="rw" />
2527
<map mr="i2c_client_data_i2c_reactor_client" vaddr="0x20002000" perms="rw" />
28+
<map mr="i2c_client_meta_i2c_reactor_client" vaddr="0x20003000" perms="rw" cached="false" />
2629
</protection_domain>
2730
<channel>
2831
<end pd="i2c_reactor_driver" id="0" />

0 commit comments

Comments
 (0)