linux/drivers/net/dsa/sja1105/sja1105_static_config.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause */
   2/* Copyright (c) 2016-2018, NXP Semiconductors
   3 * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
   4 */
   5#ifndef _SJA1105_STATIC_CONFIG_H
   6#define _SJA1105_STATIC_CONFIG_H
   7
   8#include <linux/packing.h>
   9#include <linux/types.h>
  10#include <asm/types.h>
  11
  12#define SJA1105_SIZE_DEVICE_ID                          4
  13#define SJA1105_SIZE_TABLE_HEADER                       12
  14#define SJA1105_SIZE_SCHEDULE_ENTRY                     8
  15#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY        4
  16#define SJA1105_SIZE_VL_LOOKUP_ENTRY                    12
  17#define SJA1105_SIZE_VL_POLICING_ENTRY                  8
  18#define SJA1105_SIZE_VL_FORWARDING_ENTRY                4
  19#define SJA1105_SIZE_L2_POLICING_ENTRY                  8
  20#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY                  8
  21#define SJA1105_SIZE_L2_FORWARDING_ENTRY                8
  22#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY         12
  23#define SJA1105_SIZE_RETAGGING_ENTRY                    8
  24#define SJA1105_SIZE_XMII_PARAMS_ENTRY                  4
  25#define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY              12
  26#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY 4
  27#define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY         12
  28#define SJA1105ET_SIZE_L2_LOOKUP_ENTRY                  12
  29#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY                 28
  30#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY           4
  31#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY             40
  32#define SJA1105ET_SIZE_AVB_PARAMS_ENTRY                 12
  33#define SJA1105ET_SIZE_CBS_ENTRY                        16
  34#define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY                20
  35#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY               32
  36#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY         16
  37#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY           44
  38#define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY               16
  39#define SJA1105PQRS_SIZE_CBS_ENTRY                      20
  40
  41/* UM10944.pdf Page 11, Table 2. Configuration Blocks */
  42enum {
  43        BLKID_SCHEDULE                                  = 0x00,
  44        BLKID_SCHEDULE_ENTRY_POINTS                     = 0x01,
  45        BLKID_VL_LOOKUP                                 = 0x02,
  46        BLKID_VL_POLICING                               = 0x03,
  47        BLKID_VL_FORWARDING                             = 0x04,
  48        BLKID_L2_LOOKUP                                 = 0x05,
  49        BLKID_L2_POLICING                               = 0x06,
  50        BLKID_VLAN_LOOKUP                               = 0x07,
  51        BLKID_L2_FORWARDING                             = 0x08,
  52        BLKID_MAC_CONFIG                                = 0x09,
  53        BLKID_SCHEDULE_PARAMS                           = 0x0A,
  54        BLKID_SCHEDULE_ENTRY_POINTS_PARAMS              = 0x0B,
  55        BLKID_VL_FORWARDING_PARAMS                      = 0x0C,
  56        BLKID_L2_LOOKUP_PARAMS                          = 0x0D,
  57        BLKID_L2_FORWARDING_PARAMS                      = 0x0E,
  58        BLKID_AVB_PARAMS                                = 0x10,
  59        BLKID_GENERAL_PARAMS                            = 0x11,
  60        BLKID_RETAGGING                                 = 0x12,
  61        BLKID_CBS                                       = 0x13,
  62        BLKID_XMII_PARAMS                               = 0x4E,
  63};
  64
  65enum sja1105_blk_idx {
  66        BLK_IDX_SCHEDULE = 0,
  67        BLK_IDX_SCHEDULE_ENTRY_POINTS,
  68        BLK_IDX_VL_LOOKUP,
  69        BLK_IDX_VL_POLICING,
  70        BLK_IDX_VL_FORWARDING,
  71        BLK_IDX_L2_LOOKUP,
  72        BLK_IDX_L2_POLICING,
  73        BLK_IDX_VLAN_LOOKUP,
  74        BLK_IDX_L2_FORWARDING,
  75        BLK_IDX_MAC_CONFIG,
  76        BLK_IDX_SCHEDULE_PARAMS,
  77        BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
  78        BLK_IDX_VL_FORWARDING_PARAMS,
  79        BLK_IDX_L2_LOOKUP_PARAMS,
  80        BLK_IDX_L2_FORWARDING_PARAMS,
  81        BLK_IDX_AVB_PARAMS,
  82        BLK_IDX_GENERAL_PARAMS,
  83        BLK_IDX_RETAGGING,
  84        BLK_IDX_CBS,
  85        BLK_IDX_XMII_PARAMS,
  86        BLK_IDX_MAX,
  87        /* Fake block indices that are only valid for dynamic access */
  88        BLK_IDX_MGMT_ROUTE,
  89        BLK_IDX_MAX_DYN,
  90        BLK_IDX_INVAL = -1,
  91};
  92
  93#define SJA1105_MAX_SCHEDULE_COUNT                      1024
  94#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT         2048
  95#define SJA1105_MAX_VL_LOOKUP_COUNT                     1024
  96#define SJA1105_MAX_VL_POLICING_COUNT                   1024
  97#define SJA1105_MAX_VL_FORWARDING_COUNT                 1024
  98#define SJA1105_MAX_L2_LOOKUP_COUNT                     1024
  99#define SJA1105_MAX_L2_POLICING_COUNT                   45
 100#define SJA1105_MAX_VLAN_LOOKUP_COUNT                   4096
 101#define SJA1105_MAX_L2_FORWARDING_COUNT                 13
 102#define SJA1105_MAX_MAC_CONFIG_COUNT                    5
 103#define SJA1105_MAX_SCHEDULE_PARAMS_COUNT               1
 104#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT  1
 105#define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT          1
 106#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT              1
 107#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT          1
 108#define SJA1105_MAX_GENERAL_PARAMS_COUNT                1
 109#define SJA1105_MAX_RETAGGING_COUNT                     32
 110#define SJA1105_MAX_XMII_PARAMS_COUNT                   1
 111#define SJA1105_MAX_AVB_PARAMS_COUNT                    1
 112#define SJA1105ET_MAX_CBS_COUNT                         10
 113#define SJA1105PQRS_MAX_CBS_COUNT                       16
 114
 115#define SJA1105_MAX_FRAME_MEMORY                        929
 116#define SJA1105_MAX_FRAME_MEMORY_RETAGGING              910
 117#define SJA1105_VL_FRAME_MEMORY                         100
 118
 119#define SJA1105E_DEVICE_ID                              0x9C00000Cull
 120#define SJA1105T_DEVICE_ID                              0x9E00030Eull
 121#define SJA1105PR_DEVICE_ID                             0xAF00030Eull
 122#define SJA1105QS_DEVICE_ID                             0xAE00030Eull
 123
 124#define SJA1105ET_PART_NO                               0x9A83
 125#define SJA1105P_PART_NO                                0x9A84
 126#define SJA1105Q_PART_NO                                0x9A85
 127#define SJA1105R_PART_NO                                0x9A86
 128#define SJA1105S_PART_NO                                0x9A87
 129
 130struct sja1105_schedule_entry {
 131        u64 winstindex;
 132        u64 winend;
 133        u64 winst;
 134        u64 destports;
 135        u64 setvalid;
 136        u64 txen;
 137        u64 resmedia_en;
 138        u64 resmedia;
 139        u64 vlindex;
 140        u64 delta;
 141};
 142
 143struct sja1105_schedule_params_entry {
 144        u64 subscheind[8];
 145};
 146
 147struct sja1105_general_params_entry {
 148        u64 vllupformat;
 149        u64 mirr_ptacu;
 150        u64 switchid;
 151        u64 hostprio;
 152        u64 mac_fltres1;
 153        u64 mac_fltres0;
 154        u64 mac_flt1;
 155        u64 mac_flt0;
 156        u64 incl_srcpt1;
 157        u64 incl_srcpt0;
 158        u64 send_meta1;
 159        u64 send_meta0;
 160        u64 casc_port;
 161        u64 host_port;
 162        u64 mirr_port;
 163        u64 vlmarker;
 164        u64 vlmask;
 165        u64 tpid;
 166        u64 ignore2stf;
 167        u64 tpid2;
 168        /* P/Q/R/S only */
 169        u64 queue_ts;
 170        u64 egrmirrvid;
 171        u64 egrmirrpcp;
 172        u64 egrmirrdei;
 173        u64 replay_port;
 174};
 175
 176struct sja1105_schedule_entry_points_entry {
 177        u64 subschindx;
 178        u64 delta;
 179        u64 address;
 180};
 181
 182struct sja1105_schedule_entry_points_params_entry {
 183        u64 clksrc;
 184        u64 actsubsch;
 185};
 186
 187struct sja1105_vlan_lookup_entry {
 188        u64 ving_mirr;
 189        u64 vegr_mirr;
 190        u64 vmemb_port;
 191        u64 vlan_bc;
 192        u64 tag_port;
 193        u64 vlanid;
 194};
 195
 196struct sja1105_l2_lookup_entry {
 197        u64 vlanid;
 198        u64 macaddr;
 199        u64 destports;
 200        u64 enfport;
 201        u64 index;
 202        /* P/Q/R/S only */
 203        u64 mask_iotag;
 204        u64 mask_vlanid;
 205        u64 mask_macaddr;
 206        u64 iotag;
 207        u64 lockeds;
 208        union {
 209                /* LOCKEDS=1: Static FDB entries */
 210                struct {
 211                        u64 tsreg;
 212                        u64 mirrvlan;
 213                        u64 takets;
 214                        u64 mirr;
 215                        u64 retag;
 216                };
 217                /* LOCKEDS=0: Dynamically learned FDB entries */
 218                struct {
 219                        u64 touched;
 220                        u64 age;
 221                };
 222        };
 223};
 224
 225struct sja1105_l2_lookup_params_entry {
 226        u64 maxaddrp[5];     /* P/Q/R/S only */
 227        u64 start_dynspc;    /* P/Q/R/S only */
 228        u64 drpnolearn;      /* P/Q/R/S only */
 229        u64 use_static;      /* P/Q/R/S only */
 230        u64 owr_dyn;         /* P/Q/R/S only */
 231        u64 learn_once;      /* P/Q/R/S only */
 232        u64 maxage;          /* Shared */
 233        u64 dyn_tbsz;        /* E/T only */
 234        u64 poly;            /* E/T only */
 235        u64 shared_learn;    /* Shared */
 236        u64 no_enf_hostprt;  /* Shared */
 237        u64 no_mgmt_learn;   /* Shared */
 238};
 239
 240struct sja1105_l2_forwarding_entry {
 241        u64 bc_domain;
 242        u64 reach_port;
 243        u64 fl_domain;
 244        u64 vlan_pmap[8];
 245};
 246
 247struct sja1105_l2_forwarding_params_entry {
 248        u64 max_dynp;
 249        u64 part_spc[8];
 250};
 251
 252struct sja1105_l2_policing_entry {
 253        u64 sharindx;
 254        u64 smax;
 255        u64 rate;
 256        u64 maxlen;
 257        u64 partition;
 258};
 259
 260struct sja1105_avb_params_entry {
 261        u64 cas_master;
 262        u64 destmeta;
 263        u64 srcmeta;
 264};
 265
 266struct sja1105_mac_config_entry {
 267        u64 top[8];
 268        u64 base[8];
 269        u64 enabled[8];
 270        u64 ifg;
 271        u64 speed;
 272        u64 tp_delin;
 273        u64 tp_delout;
 274        u64 maxage;
 275        u64 vlanprio;
 276        u64 vlanid;
 277        u64 ing_mirr;
 278        u64 egr_mirr;
 279        u64 drpnona664;
 280        u64 drpdtag;
 281        u64 drpuntag;
 282        u64 retag;
 283        u64 dyn_learn;
 284        u64 egress;
 285        u64 ingress;
 286};
 287
 288struct sja1105_retagging_entry {
 289        u64 egr_port;
 290        u64 ing_port;
 291        u64 vlan_ing;
 292        u64 vlan_egr;
 293        u64 do_not_learn;
 294        u64 use_dest_ports;
 295        u64 destports;
 296};
 297
 298struct sja1105_cbs_entry {
 299        u64 port;
 300        u64 prio;
 301        u64 credit_hi;
 302        u64 credit_lo;
 303        u64 send_slope;
 304        u64 idle_slope;
 305};
 306
 307struct sja1105_xmii_params_entry {
 308        u64 phy_mac[5];
 309        u64 xmii_mode[5];
 310};
 311
 312enum {
 313        SJA1105_VL_FORMAT_PSFP          = 0,
 314        SJA1105_VL_FORMAT_ARINC664      = 1,
 315};
 316
 317struct sja1105_vl_lookup_entry {
 318        u64 format;
 319        u64 port;
 320        union {
 321                /* SJA1105_VL_FORMAT_PSFP */
 322                struct {
 323                        u64 destports;
 324                        u64 iscritical;
 325                        u64 macaddr;
 326                        u64 vlanid;
 327                        u64 vlanprior;
 328                };
 329                /* SJA1105_VL_FORMAT_ARINC664 */
 330                struct {
 331                        u64 egrmirr;
 332                        u64 ingrmirr;
 333                        u64 vlid;
 334                };
 335        };
 336        /* Not part of hardware structure */
 337        unsigned long flow_cookie;
 338};
 339
 340struct sja1105_vl_policing_entry {
 341        u64 type;
 342        u64 maxlen;
 343        u64 sharindx;
 344        u64 bag;
 345        u64 jitter;
 346};
 347
 348struct sja1105_vl_forwarding_entry {
 349        u64 type;
 350        u64 priority;
 351        u64 partition;
 352        u64 destports;
 353};
 354
 355struct sja1105_vl_forwarding_params_entry {
 356        u64 partspc[8];
 357        u64 debugen;
 358};
 359
 360struct sja1105_table_header {
 361        u64 block_id;
 362        u64 len;
 363        u64 crc;
 364};
 365
 366struct sja1105_table_ops {
 367        size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
 368        size_t unpacked_entry_size;
 369        size_t packed_entry_size;
 370        size_t max_entry_count;
 371};
 372
 373struct sja1105_table {
 374        const struct sja1105_table_ops *ops;
 375        size_t entry_count;
 376        void *entries;
 377};
 378
 379struct sja1105_static_config {
 380        u64 device_id;
 381        struct sja1105_table tables[BLK_IDX_MAX];
 382};
 383
 384extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
 385extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
 386extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
 387extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
 388extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
 389extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
 390
 391size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
 392void
 393sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
 394size_t
 395sja1105_static_config_get_length(const struct sja1105_static_config *config);
 396
 397typedef enum {
 398        SJA1105_CONFIG_OK = 0,
 399        SJA1105_TTETHERNET_NOT_SUPPORTED,
 400        SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
 401        SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,
 402        SJA1105_MISSING_L2_POLICING_TABLE,
 403        SJA1105_MISSING_L2_FORWARDING_TABLE,
 404        SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
 405        SJA1105_MISSING_GENERAL_PARAMS_TABLE,
 406        SJA1105_MISSING_VLAN_TABLE,
 407        SJA1105_MISSING_XMII_TABLE,
 408        SJA1105_MISSING_MAC_TABLE,
 409        SJA1105_OVERCOMMITTED_FRAME_MEMORY,
 410} sja1105_config_valid_t;
 411
 412extern const char *sja1105_static_config_error_msg[];
 413
 414sja1105_config_valid_t
 415sja1105_static_config_check_valid(const struct sja1105_static_config *config);
 416void
 417sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
 418int sja1105_static_config_init(struct sja1105_static_config *config,
 419                               const struct sja1105_table_ops *static_ops,
 420                               u64 device_id);
 421void sja1105_static_config_free(struct sja1105_static_config *config);
 422
 423int sja1105_table_delete_entry(struct sja1105_table *table, int i);
 424int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
 425
 426u32 sja1105_crc32(const void *buf, size_t len);
 427
 428void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
 429void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
 430void sja1105_packing(void *buf, u64 *val, int start, int end,
 431                     size_t len, enum packing_op op);
 432
 433/* Common implementations for the static and dynamic configs */
 434size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
 435                                                enum packing_op op);
 436size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
 437                                                  enum packing_op op);
 438size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
 439                                           enum packing_op op);
 440size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
 441                                           enum packing_op op);
 442size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
 443                                         enum packing_op op);
 444size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
 445                                         enum packing_op op);
 446size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
 447                                       enum packing_op op);
 448size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
 449                                            enum packing_op op);
 450size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
 451                                            enum packing_op op);
 452size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
 453                                       enum packing_op op);
 454
 455#endif
 456