@@ -626,23 +626,28 @@ pub const I2c = struct {
626
626
}
627
627
};
628
628
629
+ // TODO: probably make all queue_capacity/num_buffers u32
629
630
pub const Blk = struct {
630
631
allocator : Allocator ,
631
632
sdf : * SystemDescription ,
632
633
driver : * Pd ,
633
634
device : * dtb.Node ,
634
635
device_res : ConfigResources.Device ,
635
636
virt : * Pd ,
636
- clients : std .ArrayList (* Pd ),
637
- client_partitions : std .ArrayList (u32 ),
637
+ clients : std .ArrayList (Client ),
638
638
connected : bool = false ,
639
639
serialised : bool = false ,
640
- // TODO: make this configurable per component
641
- queue_mr_size : usize = 2 * 1024 * 1024 ,
642
- // TODO: make configurable
643
- queue_capacity : u16 = 128 ,
640
+ // Only needed for initialisation to read partition table
641
+ driver_data_size : u32 = 4096 ,
644
642
config : Blk.Config ,
645
643
644
+ const Client = struct {
645
+ pd : * Pd ,
646
+ partition : u32 ,
647
+ queue_capacity : u16 ,
648
+ data_size : u32 ,
649
+ };
650
+
646
651
const Config = struct {
647
652
driver : ConfigResources.Blk.Driver = undefined ,
648
653
virt_driver : ConfigResources.Blk.Virt.Driver = undefined ,
@@ -666,8 +671,7 @@ pub const Blk = struct {
666
671
return .{
667
672
.allocator = allocator ,
668
673
.sdf = sdf ,
669
- .clients = std .ArrayList (* Pd ).init (allocator ),
670
- .client_partitions = std .ArrayList (u32 ).init (allocator ),
674
+ .clients = std .ArrayList (Client ).init (allocator ),
671
675
.driver = driver ,
672
676
.device = device ,
673
677
.device_res = std .mem .zeroInit (ConfigResources .Device , .{}),
@@ -681,19 +685,24 @@ pub const Blk = struct {
681
685
682
686
pub fn deinit (system : * Blk ) void {
683
687
system .clients .deinit ();
684
- system .client_partitions .deinit ();
685
688
system .config .virt_clients .deinit ();
686
689
system .config .clients .deinit ();
687
690
}
688
691
692
+ // TODO: need to do more error checking on data size and queue capacity.
689
693
pub const ClientOptions = struct {
694
+ // Zero-index of device partition to use.
690
695
partition : u32 ,
696
+ // Maximum possible entries in a single queue.
697
+ queue_capacity : u16 = 128 ,
698
+ // Default to 2MB.
699
+ data_size : u32 = 2 * 1024 * 1024 ,
691
700
};
692
701
693
702
pub fn addClient (system : * Blk , client : * Pd , options : ClientOptions ) Error ! void {
694
703
// Check that the client does not already exist
695
704
for (system .clients .items ) | existing_client | {
696
- if (std .mem .eql (u8 , existing_client .name , client .name )) {
705
+ if (std .mem .eql (u8 , existing_client .pd . name , client .name )) {
697
706
return Error .DuplicateClient ;
698
707
}
699
708
}
@@ -705,15 +714,36 @@ pub const Blk = struct {
705
714
log .err ("invalid blk client, same name as virt '{s}" , .{client .name });
706
715
return Error .InvalidClient ;
707
716
}
708
- system .clients .append (client ) catch @panic ("Could not add client to Blk" );
709
- system .client_partitions .append (options .partition ) catch @panic ("Could not add client to Blk" );
717
+ system .clients .append (.{
718
+ .pd = client ,
719
+ .partition = options .partition ,
720
+ .queue_capacity = options .queue_capacity ,
721
+ .data_size = options .data_size ,
722
+ }) catch @panic ("Could not add client to Blk" );
723
+ }
724
+
725
+ fn driverQueueCapacity (system : * Blk ) u16 {
726
+ var total_capacity : u16 = 0 ;
727
+ for (system .clients .items ) | client | {
728
+ total_capacity += client .queue_capacity ;
729
+ }
730
+
731
+ return total_capacity ;
732
+ }
733
+
734
+ fn driverQueueMrSize (system : * Blk ) u32 {
735
+ // TODO: 128 bytes is enough for each queue entry, but need to be
736
+ // better about how this is determined.
737
+ return @as (u32 , driverQueueCapacity (system )) * @as (u32 , 128 );
710
738
}
711
739
712
740
pub fn connectDriver (system : * Blk ) void {
713
741
const sdf = system .sdf ;
714
742
const allocator = system .allocator ;
715
743
const driver = system .driver ;
716
744
const virt = system .virt ;
745
+ const queue_mr_size = driverQueueMrSize (system );
746
+ const queue_capacity = driverQueueCapacity (system );
717
747
718
748
const mr_storage_info = Mr .create (allocator , "blk_driver_storage_info" , STORAGE_INFO_REGION_SIZE , .{});
719
749
const map_storage_info_driver = Map .create (mr_storage_info , system .driver .getMapVaddr (& mr_storage_info ), .rw , .{});
@@ -723,23 +753,23 @@ pub const Blk = struct {
723
753
driver .addMap (map_storage_info_driver );
724
754
virt .addMap (map_storage_info_virt );
725
755
726
- const mr_req = Mr .create (allocator , "blk_driver_request" , system . queue_mr_size , .{});
756
+ const mr_req = Mr .create (allocator , "blk_driver_request" , queue_mr_size , .{});
727
757
const map_req_driver = Map .create (mr_req , driver .getMapVaddr (& mr_req ), .rw , .{});
728
758
const map_req_virt = Map .create (mr_req , virt .getMapVaddr (& mr_req ), .rw , .{});
729
759
730
760
sdf .addMemoryRegion (mr_req );
731
761
driver .addMap (map_req_driver );
732
762
virt .addMap (map_req_virt );
733
763
734
- const mr_resp = Mr .create (allocator , "blk_driver_response" , system . queue_mr_size , .{});
764
+ const mr_resp = Mr .create (allocator , "blk_driver_response" , queue_mr_size , .{});
735
765
const map_resp_driver = Map .create (mr_resp , driver .getMapVaddr (& mr_resp ), .rw , .{});
736
766
const map_resp_virt = Map .create (mr_resp , virt .getMapVaddr (& mr_resp ), .rw , .{});
737
767
738
768
sdf .addMemoryRegion (mr_resp );
739
769
driver .addMap (map_resp_driver );
740
770
virt .addMap (map_resp_virt );
741
771
742
- const mr_data = Mr .physical (allocator , sdf , "blk_driver_data" , system .queue_mr_size , .{});
772
+ const mr_data = Mr .physical (allocator , sdf , "blk_driver_data" , system .driver_data_size , .{});
743
773
const map_data_virt = Map .create (mr_data , virt .getMapVaddr (& mr_data ), .rw , .{});
744
774
745
775
sdf .addMemoryRegion (mr_data );
@@ -753,7 +783,7 @@ pub const Blk = struct {
753
783
.storage_info = .createFromMap (map_storage_info_driver ),
754
784
.req_queue = .createFromMap (map_req_driver ),
755
785
.resp_queue = .createFromMap (map_resp_driver ),
756
- .num_buffers = system . queue_capacity ,
786
+ .num_buffers = queue_capacity ,
757
787
.id = ch .pd_b_id ,
758
788
},
759
789
};
@@ -763,70 +793,72 @@ pub const Blk = struct {
763
793
.storage_info = .createFromMap (map_storage_info_virt ),
764
794
.req_queue = .createFromMap (map_req_virt ),
765
795
.resp_queue = .createFromMap (map_resp_virt ),
766
- .num_buffers = system . queue_capacity ,
796
+ .num_buffers = queue_capacity ,
767
797
.id = ch .pd_a_id ,
768
798
},
769
799
.data = .createFromMap (map_data_virt ),
770
800
};
771
801
}
772
802
773
- pub fn connectClient (system : * Blk , client : * Pd , i : usize ) void {
803
+ pub fn connectClient (system : * Blk , client : * Client , i : usize ) void {
774
804
const sdf = system .sdf ;
775
805
const allocator = system .allocator ;
776
- const queue_mr_size = system .queue_mr_size ;
806
+ const queue_mr_size : u32 = @as (u32 , client .queue_capacity ) * @as (u32 , 128 );
807
+ const data_mr_size = client .data_size ;
808
+ const client_pd = client .pd ;
777
809
778
- const mr_storage_info = Mr .create (allocator , fmt (allocator , "blk_client_{s}_storage_info" , .{client .name }), STORAGE_INFO_REGION_SIZE , .{});
810
+ const mr_storage_info = Mr .create (allocator , fmt (allocator , "blk_client_{s}_storage_info" , .{client_pd .name }), STORAGE_INFO_REGION_SIZE , .{});
779
811
const map_storage_info_virt = Map .create (mr_storage_info , system .virt .getMapVaddr (& mr_storage_info ), .rw , .{});
780
- const map_storage_info_client = Map .create (mr_storage_info , client .getMapVaddr (& mr_storage_info ), .r , .{});
812
+ const map_storage_info_client = Map .create (mr_storage_info , client_pd .getMapVaddr (& mr_storage_info ), .r , .{});
781
813
782
814
system .sdf .addMemoryRegion (mr_storage_info );
783
815
system .virt .addMap (map_storage_info_virt );
784
- client .addMap (map_storage_info_client );
816
+ client_pd .addMap (map_storage_info_client );
785
817
786
- const mr_req = Mr .create (allocator , fmt (allocator , "blk_client_{s}_request" , .{client .name }), queue_mr_size , .{});
818
+ const mr_req = Mr .create (allocator , fmt (allocator , "blk_client_{s}_request" , .{client_pd .name }), queue_mr_size , .{});
787
819
const map_req_virt = Map .create (mr_req , system .virt .getMapVaddr (& mr_req ), .rw , .{});
788
- const map_req_client = Map .create (mr_req , client .getMapVaddr (& mr_req ), .rw , .{});
820
+ const map_req_client = Map .create (mr_req , client_pd .getMapVaddr (& mr_req ), .rw , .{});
789
821
790
822
system .sdf .addMemoryRegion (mr_req );
791
823
system .virt .addMap (map_req_virt );
792
- client .addMap (map_req_client );
824
+ client_pd .addMap (map_req_client );
793
825
794
- const mr_resp = Mr .create (allocator , fmt (allocator , "blk_client_{s}_response" , .{client .name }), queue_mr_size , .{});
826
+ const mr_resp = Mr .create (allocator , fmt (allocator , "blk_client_{s}_response" , .{client_pd .name }), queue_mr_size , .{});
795
827
const map_resp_virt = Map .create (mr_resp , system .virt .getMapVaddr (& mr_resp ), .rw , .{});
796
- const map_resp_client = Map .create (mr_resp , client .getMapVaddr (& mr_resp ), .rw , .{});
828
+ const map_resp_client = Map .create (mr_resp , client_pd .getMapVaddr (& mr_resp ), .rw , .{});
797
829
798
830
system .sdf .addMemoryRegion (mr_resp );
799
831
system .virt .addMap (map_resp_virt );
800
- client .addMap (map_resp_client );
832
+ client_pd .addMap (map_resp_client );
801
833
802
- const mr_data = Mr .physical (allocator , sdf , fmt (allocator , "blk_client_{s}_data" , .{client .name }), queue_mr_size , .{});
834
+ const mr_data = Mr .physical (allocator , sdf , fmt (allocator , "blk_client_{s}_data" , .{client_pd .name }), data_mr_size , .{});
803
835
const map_data_virt = Map .create (mr_data , system .virt .getMapVaddr (& mr_data ), .rw , .{});
804
- const map_data_client = Map .create (mr_data , client .getMapVaddr (& mr_data ), .rw , .{});
836
+ const map_data_client = Map .create (mr_data , client_pd .getMapVaddr (& mr_data ), .rw , .{});
805
837
806
838
system .sdf .addMemoryRegion (mr_data );
807
839
system .virt .addMap (map_data_virt );
808
- client .addMap (map_data_client );
840
+ client_pd .addMap (map_data_client );
809
841
810
- const ch = Channel .create (system .virt , client , .{}) catch unreachable ;
842
+ const ch = Channel .create (system .virt , client_pd , .{}) catch unreachable ;
811
843
system .sdf .addChannel (ch );
812
844
813
845
system .config .virt_clients .append (.{
814
846
.conn = .{
815
847
.storage_info = .createFromMap (map_storage_info_virt ),
816
848
.req_queue = .createFromMap (map_req_virt ),
817
849
.resp_queue = .createFromMap (map_resp_virt ),
818
- .num_buffers = system .queue_capacity ,
850
+ .num_buffers = client .queue_capacity ,
819
851
.id = ch .pd_a_id ,
820
852
},
821
853
.data = .createFromMap (map_data_virt ),
822
- .partition = system .client_partitions .items [i ],
854
+ .partition = system .clients .items [i ]. partition ,
823
855
}) catch @panic ("could not add virt client config" );
824
856
825
857
system .config .clients .append (.{ .virt = .{
826
858
.storage_info = .createFromMap (map_storage_info_client ),
827
859
.req_queue = .createFromMap (map_req_client ),
828
860
.resp_queue = .createFromMap (map_resp_client ),
829
- .num_buffers = system .queue_capacity ,
861
+ .num_buffers = client .queue_capacity ,
830
862
.id = ch .pd_b_id ,
831
863
}, .data = .createFromMap (map_data_client ) }) catch @panic ("could not add client config" );
832
864
}
@@ -839,7 +871,7 @@ pub const Blk = struct {
839
871
// 2. Connect the driver to the virtualiser
840
872
system .connectDriver ();
841
873
// 3. Connect each client to the virtualiser
842
- for (system .clients .items , 0.. ) | client , i | {
874
+ for (system .clients .items , 0.. ) | * client , i | {
843
875
system .connectClient (client , i );
844
876
}
845
877
@@ -858,7 +890,7 @@ pub const Blk = struct {
858
890
try data .serialize (allocator , virt_config , prefix , "blk_virt" );
859
891
860
892
for (system .config .clients .items , 0.. ) | config , i | {
861
- const client_config = fmt (allocator , "blk_client_{s}" , .{system .clients .items [i ].name });
893
+ const client_config = fmt (allocator , "blk_client_{s}" , .{system .clients .items [i ].pd . name });
862
894
try data .serialize (allocator , config , prefix , client_config );
863
895
}
864
896
0 commit comments