Skip to content

Commit 7f1e4ba

Browse files
vladimirolteandavem330
authored andcommitted
net: dsa: sja1105: Add static config tables for scheduling
In order to support tc-taprio offload, the TTEthernet egress scheduling core registers must be made visible through the static interface. Signed-off-by: Vladimir Oltean <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 47d23af commit 7f1e4ba

File tree

3 files changed

+222
-1
lines changed

3 files changed

+222
-1
lines changed

drivers/net/dsa/sja1105/sja1105_dynamic_config.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,8 @@ sja1105et_general_params_entry_packing(void *buf, void *entry_ptr,
488488

489489
/* SJA1105E/T: First generation */
490490
struct sja1105_dynamic_table_ops sja1105et_dyn_ops[BLK_IDX_MAX_DYN] = {
491+
[BLK_IDX_SCHEDULE] = {0},
492+
[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {0},
491493
[BLK_IDX_L2_LOOKUP] = {
492494
.entry_packing = sja1105et_dyn_l2_lookup_entry_packing,
493495
.cmd_packing = sja1105et_l2_lookup_cmd_packing,
@@ -529,6 +531,8 @@ struct sja1105_dynamic_table_ops sja1105et_dyn_ops[BLK_IDX_MAX_DYN] = {
529531
.packed_size = SJA1105ET_SIZE_MAC_CONFIG_DYN_CMD,
530532
.addr = 0x36,
531533
},
534+
[BLK_IDX_SCHEDULE_PARAMS] = {0},
535+
[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {0},
532536
[BLK_IDX_L2_LOOKUP_PARAMS] = {
533537
.entry_packing = sja1105et_l2_lookup_params_entry_packing,
534538
.cmd_packing = sja1105et_l2_lookup_params_cmd_packing,
@@ -552,6 +556,8 @@ struct sja1105_dynamic_table_ops sja1105et_dyn_ops[BLK_IDX_MAX_DYN] = {
552556

553557
/* SJA1105P/Q/R/S: Second generation */
554558
struct sja1105_dynamic_table_ops sja1105pqrs_dyn_ops[BLK_IDX_MAX_DYN] = {
559+
[BLK_IDX_SCHEDULE] = {0},
560+
[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {0},
555561
[BLK_IDX_L2_LOOKUP] = {
556562
.entry_packing = sja1105pqrs_dyn_l2_lookup_entry_packing,
557563
.cmd_packing = sja1105pqrs_l2_lookup_cmd_packing,
@@ -593,6 +599,8 @@ struct sja1105_dynamic_table_ops sja1105pqrs_dyn_ops[BLK_IDX_MAX_DYN] = {
593599
.packed_size = SJA1105PQRS_SIZE_MAC_CONFIG_DYN_CMD,
594600
.addr = 0x4B,
595601
},
602+
[BLK_IDX_SCHEDULE_PARAMS] = {0},
603+
[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {0},
596604
[BLK_IDX_L2_LOOKUP_PARAMS] = {
597605
.entry_packing = sja1105et_l2_lookup_params_entry_packing,
598606
.cmd_packing = sja1105et_l2_lookup_params_cmd_packing,

drivers/net/dsa/sja1105/sja1105_static_config.c

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,63 @@ size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
371371
return size;
372372
}
373373

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+
374431
size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
375432
enum packing_op op)
376433
{
@@ -447,11 +504,15 @@ static void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr)
447504
* before blindly indexing kernel memory with the blk_idx.
448505
*/
449506
static u64 blk_id_map[BLK_IDX_MAX] = {
507+
[BLK_IDX_SCHEDULE] = BLKID_SCHEDULE,
508+
[BLK_IDX_SCHEDULE_ENTRY_POINTS] = BLKID_SCHEDULE_ENTRY_POINTS,
450509
[BLK_IDX_L2_LOOKUP] = BLKID_L2_LOOKUP,
451510
[BLK_IDX_L2_POLICING] = BLKID_L2_POLICING,
452511
[BLK_IDX_VLAN_LOOKUP] = BLKID_VLAN_LOOKUP,
453512
[BLK_IDX_L2_FORWARDING] = BLKID_L2_FORWARDING,
454513
[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,
455516
[BLK_IDX_L2_LOOKUP_PARAMS] = BLKID_L2_LOOKUP_PARAMS,
456517
[BLK_IDX_L2_FORWARDING_PARAMS] = BLKID_L2_FORWARDING_PARAMS,
457518
[BLK_IDX_AVB_PARAMS] = BLKID_AVB_PARAMS,
@@ -461,6 +522,13 @@ static u64 blk_id_map[BLK_IDX_MAX] = {
461522

462523
const char *sja1105_static_config_error_msg[] = {
463524
[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",
464532
[SJA1105_MISSING_L2_POLICING_TABLE] =
465533
"l2-policing-table needs to have at least one entry",
466534
[SJA1105_MISSING_L2_FORWARDING_TABLE] =
@@ -508,6 +576,21 @@ sja1105_static_config_check_valid(const struct sja1105_static_config *config)
508576
#define IS_FULL(blk_idx) \
509577
(tables[blk_idx].entry_count == tables[blk_idx].ops->max_entry_count)
510578

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+
511594
if (tables[BLK_IDX_L2_POLICING].entry_count == 0)
512595
return SJA1105_MISSING_L2_POLICING_TABLE;
513596

@@ -614,6 +697,8 @@ sja1105_static_config_get_length(const struct sja1105_static_config *config)
614697

615698
/* SJA1105E: First generation, no TTEthernet */
616699
struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
700+
[BLK_IDX_SCHEDULE] = {0},
701+
[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {0},
617702
[BLK_IDX_L2_LOOKUP] = {
618703
.packing = sja1105et_l2_lookup_entry_packing,
619704
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
@@ -644,6 +729,8 @@ struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
644729
.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
645730
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
646731
},
732+
[BLK_IDX_SCHEDULE_PARAMS] = {0},
733+
[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {0},
647734
[BLK_IDX_L2_LOOKUP_PARAMS] = {
648735
.packing = sja1105et_l2_lookup_params_entry_packing,
649736
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
@@ -678,6 +765,18 @@ struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
678765

679766
/* SJA1105T: First generation, TTEthernet */
680767
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+
},
681780
[BLK_IDX_L2_LOOKUP] = {
682781
.packing = sja1105et_l2_lookup_entry_packing,
683782
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
@@ -708,6 +807,18 @@ struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = {
708807
.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
709808
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
710809
},
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+
},
711822
[BLK_IDX_L2_LOOKUP_PARAMS] = {
712823
.packing = sja1105et_l2_lookup_params_entry_packing,
713824
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
@@ -742,6 +853,8 @@ struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = {
742853

743854
/* SJA1105P: Second generation, no TTEthernet, no SGMII */
744855
struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
856+
[BLK_IDX_SCHEDULE] = {0},
857+
[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {0},
745858
[BLK_IDX_L2_LOOKUP] = {
746859
.packing = sja1105pqrs_l2_lookup_entry_packing,
747860
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
@@ -772,6 +885,8 @@ struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
772885
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
773886
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
774887
},
888+
[BLK_IDX_SCHEDULE_PARAMS] = {0},
889+
[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {0},
775890
[BLK_IDX_L2_LOOKUP_PARAMS] = {
776891
.packing = sja1105pqrs_l2_lookup_params_entry_packing,
777892
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
@@ -806,6 +921,18 @@ struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
806921

807922
/* SJA1105Q: Second generation, TTEthernet, no SGMII */
808923
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+
},
809936
[BLK_IDX_L2_LOOKUP] = {
810937
.packing = sja1105pqrs_l2_lookup_entry_packing,
811938
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
@@ -836,6 +963,18 @@ struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = {
836963
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
837964
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
838965
},
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+
},
839978
[BLK_IDX_L2_LOOKUP_PARAMS] = {
840979
.packing = sja1105pqrs_l2_lookup_params_entry_packing,
841980
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
@@ -870,6 +1009,8 @@ struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = {
8701009

8711010
/* SJA1105R: Second generation, no TTEthernet, SGMII */
8721011
struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
1012+
[BLK_IDX_SCHEDULE] = {0},
1013+
[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {0},
8731014
[BLK_IDX_L2_LOOKUP] = {
8741015
.packing = sja1105pqrs_l2_lookup_entry_packing,
8751016
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
@@ -900,6 +1041,8 @@ struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
9001041
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
9011042
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
9021043
},
1044+
[BLK_IDX_SCHEDULE_PARAMS] = {0},
1045+
[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {0},
9031046
[BLK_IDX_L2_LOOKUP_PARAMS] = {
9041047
.packing = sja1105pqrs_l2_lookup_params_entry_packing,
9051048
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
@@ -934,6 +1077,18 @@ struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
9341077

9351078
/* SJA1105S: Second generation, TTEthernet, SGMII */
9361079
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+
},
9371092
[BLK_IDX_L2_LOOKUP] = {
9381093
.packing = sja1105pqrs_l2_lookup_entry_packing,
9391094
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
@@ -964,6 +1119,18 @@ struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX] = {
9641119
.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
9651120
.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
9661121
},
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+
},
9671134
[BLK_IDX_L2_LOOKUP_PARAMS] = {
9681135
.packing = sja1105pqrs_l2_lookup_params_entry_packing,
9691136
.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),

0 commit comments

Comments
 (0)