@@ -371,6 +371,63 @@ size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
371
371
return size ;
372
372
}
373
373
374
+ static size_t
375
+ sja1105_schedule_entry_points_params_entry_packing (void * buf , void * entry_ptr ,
376
+ enum packing_op op )
377
+ {
378
+ struct sja1105_schedule_entry_points_params_entry * entry = entry_ptr ;
379
+ const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY ;
380
+
381
+ sja1105_packing (buf , & entry -> clksrc , 31 , 30 , size , op );
382
+ sja1105_packing (buf , & entry -> actsubsch , 29 , 27 , size , op );
383
+ return size ;
384
+ }
385
+
386
+ static size_t
387
+ sja1105_schedule_entry_points_entry_packing (void * buf , void * entry_ptr ,
388
+ enum packing_op op )
389
+ {
390
+ struct sja1105_schedule_entry_points_entry * entry = entry_ptr ;
391
+ const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY ;
392
+
393
+ sja1105_packing (buf , & entry -> subschindx , 31 , 29 , size , op );
394
+ sja1105_packing (buf , & entry -> delta , 28 , 11 , size , op );
395
+ sja1105_packing (buf , & entry -> address , 10 , 1 , size , op );
396
+ return size ;
397
+ }
398
+
399
+ static size_t sja1105_schedule_params_entry_packing (void * buf , void * entry_ptr ,
400
+ enum packing_op op )
401
+ {
402
+ const size_t size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY ;
403
+ struct sja1105_schedule_params_entry * entry = entry_ptr ;
404
+ int offset , i ;
405
+
406
+ for (i = 0 , offset = 16 ; i < 8 ; i ++ , offset += 10 )
407
+ sja1105_packing (buf , & entry -> subscheind [i ],
408
+ offset + 9 , offset + 0 , size , op );
409
+ return size ;
410
+ }
411
+
412
+ static size_t sja1105_schedule_entry_packing (void * buf , void * entry_ptr ,
413
+ enum packing_op op )
414
+ {
415
+ const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY ;
416
+ struct sja1105_schedule_entry * entry = entry_ptr ;
417
+
418
+ sja1105_packing (buf , & entry -> winstindex , 63 , 54 , size , op );
419
+ sja1105_packing (buf , & entry -> winend , 53 , 53 , size , op );
420
+ sja1105_packing (buf , & entry -> winst , 52 , 52 , size , op );
421
+ sja1105_packing (buf , & entry -> destports , 51 , 47 , size , op );
422
+ sja1105_packing (buf , & entry -> setvalid , 46 , 46 , size , op );
423
+ sja1105_packing (buf , & entry -> txen , 45 , 45 , size , op );
424
+ sja1105_packing (buf , & entry -> resmedia_en , 44 , 44 , size , op );
425
+ sja1105_packing (buf , & entry -> resmedia , 43 , 36 , size , op );
426
+ sja1105_packing (buf , & entry -> vlindex , 35 , 26 , size , op );
427
+ sja1105_packing (buf , & entry -> delta , 25 , 8 , size , op );
428
+ return size ;
429
+ }
430
+
374
431
size_t sja1105_vlan_lookup_entry_packing (void * buf , void * entry_ptr ,
375
432
enum packing_op op )
376
433
{
@@ -447,11 +504,15 @@ static void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr)
447
504
* before blindly indexing kernel memory with the blk_idx.
448
505
*/
449
506
static u64 blk_id_map [BLK_IDX_MAX ] = {
507
+ [BLK_IDX_SCHEDULE ] = BLKID_SCHEDULE ,
508
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = BLKID_SCHEDULE_ENTRY_POINTS ,
450
509
[BLK_IDX_L2_LOOKUP ] = BLKID_L2_LOOKUP ,
451
510
[BLK_IDX_L2_POLICING ] = BLKID_L2_POLICING ,
452
511
[BLK_IDX_VLAN_LOOKUP ] = BLKID_VLAN_LOOKUP ,
453
512
[BLK_IDX_L2_FORWARDING ] = BLKID_L2_FORWARDING ,
454
513
[BLK_IDX_MAC_CONFIG ] = BLKID_MAC_CONFIG ,
514
+ [BLK_IDX_SCHEDULE_PARAMS ] = BLKID_SCHEDULE_PARAMS ,
515
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = BLKID_SCHEDULE_ENTRY_POINTS_PARAMS ,
455
516
[BLK_IDX_L2_LOOKUP_PARAMS ] = BLKID_L2_LOOKUP_PARAMS ,
456
517
[BLK_IDX_L2_FORWARDING_PARAMS ] = BLKID_L2_FORWARDING_PARAMS ,
457
518
[BLK_IDX_AVB_PARAMS ] = BLKID_AVB_PARAMS ,
@@ -461,6 +522,13 @@ static u64 blk_id_map[BLK_IDX_MAX] = {
461
522
462
523
const char * sja1105_static_config_error_msg [] = {
463
524
[SJA1105_CONFIG_OK ] = "" ,
525
+ [SJA1105_TTETHERNET_NOT_SUPPORTED ] =
526
+ "schedule-table present, but TTEthernet is "
527
+ "only supported on T and Q/S" ,
528
+ [SJA1105_INCORRECT_TTETHERNET_CONFIGURATION ] =
529
+ "schedule-table present, but one of "
530
+ "schedule-entry-points-table, schedule-parameters-table or "
531
+ "schedule-entry-points-parameters table is empty" ,
464
532
[SJA1105_MISSING_L2_POLICING_TABLE ] =
465
533
"l2-policing-table needs to have at least one entry" ,
466
534
[SJA1105_MISSING_L2_FORWARDING_TABLE ] =
@@ -508,6 +576,21 @@ sja1105_static_config_check_valid(const struct sja1105_static_config *config)
508
576
#define IS_FULL (blk_idx ) \
509
577
(tables[blk_idx].entry_count == tables[blk_idx].ops->max_entry_count)
510
578
579
+ if (tables [BLK_IDX_SCHEDULE ].entry_count ) {
580
+ if (config -> device_id != SJA1105T_DEVICE_ID &&
581
+ config -> device_id != SJA1105QS_DEVICE_ID )
582
+ return SJA1105_TTETHERNET_NOT_SUPPORTED ;
583
+
584
+ if (tables [BLK_IDX_SCHEDULE_ENTRY_POINTS ].entry_count == 0 )
585
+ return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION ;
586
+
587
+ if (!IS_FULL (BLK_IDX_SCHEDULE_PARAMS ))
588
+ return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION ;
589
+
590
+ if (!IS_FULL (BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ))
591
+ return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION ;
592
+ }
593
+
511
594
if (tables [BLK_IDX_L2_POLICING ].entry_count == 0 )
512
595
return SJA1105_MISSING_L2_POLICING_TABLE ;
513
596
@@ -614,6 +697,8 @@ sja1105_static_config_get_length(const struct sja1105_static_config *config)
614
697
615
698
/* SJA1105E: First generation, no TTEthernet */
616
699
struct sja1105_table_ops sja1105e_table_ops [BLK_IDX_MAX ] = {
700
+ [BLK_IDX_SCHEDULE ] = {0 },
701
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = {0 },
617
702
[BLK_IDX_L2_LOOKUP ] = {
618
703
.packing = sja1105et_l2_lookup_entry_packing ,
619
704
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_entry ),
@@ -644,6 +729,8 @@ struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
644
729
.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY ,
645
730
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT ,
646
731
},
732
+ [BLK_IDX_SCHEDULE_PARAMS ] = {0 },
733
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = {0 },
647
734
[BLK_IDX_L2_LOOKUP_PARAMS ] = {
648
735
.packing = sja1105et_l2_lookup_params_entry_packing ,
649
736
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_params_entry ),
@@ -678,6 +765,18 @@ struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
678
765
679
766
/* SJA1105T: First generation, TTEthernet */
680
767
struct sja1105_table_ops sja1105t_table_ops [BLK_IDX_MAX ] = {
768
+ [BLK_IDX_SCHEDULE ] = {
769
+ .packing = sja1105_schedule_entry_packing ,
770
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry ),
771
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY ,
772
+ .max_entry_count = SJA1105_MAX_SCHEDULE_COUNT ,
773
+ },
774
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = {
775
+ .packing = sja1105_schedule_entry_points_entry_packing ,
776
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry_points_entry ),
777
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY ,
778
+ .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT ,
779
+ },
681
780
[BLK_IDX_L2_LOOKUP ] = {
682
781
.packing = sja1105et_l2_lookup_entry_packing ,
683
782
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_entry ),
@@ -708,6 +807,18 @@ struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = {
708
807
.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY ,
709
808
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT ,
710
809
},
810
+ [BLK_IDX_SCHEDULE_PARAMS ] = {
811
+ .packing = sja1105_schedule_params_entry_packing ,
812
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_params_entry ),
813
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY ,
814
+ .max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT ,
815
+ },
816
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = {
817
+ .packing = sja1105_schedule_entry_points_params_entry_packing ,
818
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry_points_params_entry ),
819
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY ,
820
+ .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT ,
821
+ },
711
822
[BLK_IDX_L2_LOOKUP_PARAMS ] = {
712
823
.packing = sja1105et_l2_lookup_params_entry_packing ,
713
824
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_params_entry ),
@@ -742,6 +853,8 @@ struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = {
742
853
743
854
/* SJA1105P: Second generation, no TTEthernet, no SGMII */
744
855
struct sja1105_table_ops sja1105p_table_ops [BLK_IDX_MAX ] = {
856
+ [BLK_IDX_SCHEDULE ] = {0 },
857
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = {0 },
745
858
[BLK_IDX_L2_LOOKUP ] = {
746
859
.packing = sja1105pqrs_l2_lookup_entry_packing ,
747
860
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_entry ),
@@ -772,6 +885,8 @@ struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
772
885
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY ,
773
886
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT ,
774
887
},
888
+ [BLK_IDX_SCHEDULE_PARAMS ] = {0 },
889
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = {0 },
775
890
[BLK_IDX_L2_LOOKUP_PARAMS ] = {
776
891
.packing = sja1105pqrs_l2_lookup_params_entry_packing ,
777
892
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_params_entry ),
@@ -806,6 +921,18 @@ struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
806
921
807
922
/* SJA1105Q: Second generation, TTEthernet, no SGMII */
808
923
struct sja1105_table_ops sja1105q_table_ops [BLK_IDX_MAX ] = {
924
+ [BLK_IDX_SCHEDULE ] = {
925
+ .packing = sja1105_schedule_entry_packing ,
926
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry ),
927
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY ,
928
+ .max_entry_count = SJA1105_MAX_SCHEDULE_COUNT ,
929
+ },
930
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = {
931
+ .packing = sja1105_schedule_entry_points_entry_packing ,
932
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry_points_entry ),
933
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY ,
934
+ .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT ,
935
+ },
809
936
[BLK_IDX_L2_LOOKUP ] = {
810
937
.packing = sja1105pqrs_l2_lookup_entry_packing ,
811
938
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_entry ),
@@ -836,6 +963,18 @@ struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = {
836
963
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY ,
837
964
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT ,
838
965
},
966
+ [BLK_IDX_SCHEDULE_PARAMS ] = {
967
+ .packing = sja1105_schedule_params_entry_packing ,
968
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_params_entry ),
969
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY ,
970
+ .max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT ,
971
+ },
972
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = {
973
+ .packing = sja1105_schedule_entry_points_params_entry_packing ,
974
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry_points_params_entry ),
975
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY ,
976
+ .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT ,
977
+ },
839
978
[BLK_IDX_L2_LOOKUP_PARAMS ] = {
840
979
.packing = sja1105pqrs_l2_lookup_params_entry_packing ,
841
980
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_params_entry ),
@@ -870,6 +1009,8 @@ struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = {
870
1009
871
1010
/* SJA1105R: Second generation, no TTEthernet, SGMII */
872
1011
struct sja1105_table_ops sja1105r_table_ops [BLK_IDX_MAX ] = {
1012
+ [BLK_IDX_SCHEDULE ] = {0 },
1013
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = {0 },
873
1014
[BLK_IDX_L2_LOOKUP ] = {
874
1015
.packing = sja1105pqrs_l2_lookup_entry_packing ,
875
1016
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_entry ),
@@ -900,6 +1041,8 @@ struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
900
1041
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY ,
901
1042
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT ,
902
1043
},
1044
+ [BLK_IDX_SCHEDULE_PARAMS ] = {0 },
1045
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = {0 },
903
1046
[BLK_IDX_L2_LOOKUP_PARAMS ] = {
904
1047
.packing = sja1105pqrs_l2_lookup_params_entry_packing ,
905
1048
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_params_entry ),
@@ -934,6 +1077,18 @@ struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
934
1077
935
1078
/* SJA1105S: Second generation, TTEthernet, SGMII */
936
1079
struct sja1105_table_ops sja1105s_table_ops [BLK_IDX_MAX ] = {
1080
+ [BLK_IDX_SCHEDULE ] = {
1081
+ .packing = sja1105_schedule_entry_packing ,
1082
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry ),
1083
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY ,
1084
+ .max_entry_count = SJA1105_MAX_SCHEDULE_COUNT ,
1085
+ },
1086
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS ] = {
1087
+ .packing = sja1105_schedule_entry_points_entry_packing ,
1088
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry_points_entry ),
1089
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY ,
1090
+ .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT ,
1091
+ },
937
1092
[BLK_IDX_L2_LOOKUP ] = {
938
1093
.packing = sja1105pqrs_l2_lookup_entry_packing ,
939
1094
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_entry ),
@@ -964,6 +1119,18 @@ struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX] = {
964
1119
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY ,
965
1120
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT ,
966
1121
},
1122
+ [BLK_IDX_SCHEDULE_PARAMS ] = {
1123
+ .packing = sja1105_schedule_params_entry_packing ,
1124
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_params_entry ),
1125
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY ,
1126
+ .max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT ,
1127
+ },
1128
+ [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS ] = {
1129
+ .packing = sja1105_schedule_entry_points_params_entry_packing ,
1130
+ .unpacked_entry_size = sizeof (struct sja1105_schedule_entry_points_params_entry ),
1131
+ .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY ,
1132
+ .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT ,
1133
+ },
967
1134
[BLK_IDX_L2_LOOKUP_PARAMS ] = {
968
1135
.packing = sja1105pqrs_l2_lookup_params_entry_packing ,
969
1136
.unpacked_entry_size = sizeof (struct sja1105_l2_lookup_params_entry ),
0 commit comments