@@ -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 }
0 commit comments