linux/drivers/net/ethernet/freescale/dpaa2/dpni.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
   2/* Copyright 2013-2016 Freescale Semiconductor Inc.
   3 * Copyright 2016 NXP
   4 * Copyright 2020 NXP
   5 */
   6#ifndef __FSL_DPNI_H
   7#define __FSL_DPNI_H
   8
   9#include "dpkg.h"
  10
  11struct fsl_mc_io;
  12
  13/**
  14 * Data Path Network Interface API
  15 * Contains initialization APIs and runtime control APIs for DPNI
  16 */
  17
  18/** General DPNI macros */
  19
  20/**
  21 * Maximum number of traffic classes
  22 */
  23#define DPNI_MAX_TC                             8
  24/**
  25 * Maximum number of buffer pools per DPNI
  26 */
  27#define DPNI_MAX_DPBP                           8
  28
  29/**
  30 * All traffic classes considered; see dpni_set_queue()
  31 */
  32#define DPNI_ALL_TCS                            (u8)(-1)
  33/**
  34 * All flows within traffic class considered; see dpni_set_queue()
  35 */
  36#define DPNI_ALL_TC_FLOWS                       (u16)(-1)
  37/**
  38 * Generate new flow ID; see dpni_set_queue()
  39 */
  40#define DPNI_NEW_FLOW_ID                        (u16)(-1)
  41
  42/**
  43 * Tx traffic is always released to a buffer pool on transmit, there are no
  44 * resources allocated to have the frames confirmed back to the source after
  45 * transmission.
  46 */
  47#define DPNI_OPT_TX_FRM_RELEASE                 0x000001
  48/**
  49 * Disables support for MAC address filtering for addresses other than primary
  50 * MAC address. This affects both unicast and multicast. Promiscuous mode can
  51 * still be enabled/disabled for both unicast and multicast. If promiscuous mode
  52 * is disabled, only traffic matching the primary MAC address will be accepted.
  53 */
  54#define DPNI_OPT_NO_MAC_FILTER                  0x000002
  55/**
  56 * Allocate policers for this DPNI. They can be used to rate-limit traffic per
  57 * traffic class (TC) basis.
  58 */
  59#define DPNI_OPT_HAS_POLICING                   0x000004
  60/**
  61 * Congestion can be managed in several ways, allowing the buffer pool to
  62 * deplete on ingress, taildrop on each queue or use congestion groups for sets
  63 * of queues. If set, it configures a single congestion groups across all TCs.
  64 * If reset, a congestion group is allocated for each TC. Only relevant if the
  65 * DPNI has multiple traffic classes.
  66 */
  67#define DPNI_OPT_SHARED_CONGESTION              0x000008
  68/**
  69 * Enables TCAM for Flow Steering and QoS look-ups. If not specified, all
  70 * look-ups are exact match. Note that TCAM is not available on LS1088 and its
  71 * variants. Setting this bit on these SoCs will trigger an error.
  72 */
  73#define DPNI_OPT_HAS_KEY_MASKING                0x000010
  74/**
  75 * Disables the flow steering table.
  76 */
  77#define DPNI_OPT_NO_FS                          0x000020
  78/**
  79 * Flow steering table is shared between all traffic classes
  80 */
  81#define DPNI_OPT_SHARED_FS                      0x001000
  82
  83int dpni_open(struct fsl_mc_io  *mc_io,
  84              u32               cmd_flags,
  85              int               dpni_id,
  86              u16               *token);
  87
  88int dpni_close(struct fsl_mc_io *mc_io,
  89               u32              cmd_flags,
  90               u16              token);
  91
  92/**
  93 * struct dpni_pools_cfg - Structure representing buffer pools configuration
  94 * @num_dpbp: Number of DPBPs
  95 * @pools: Array of buffer pools parameters; The number of valid entries
  96 *      must match 'num_dpbp' value
  97 * @pools.dpbp_id: DPBP object ID
  98 * @pools.buffer_size: Buffer size
  99 * @pools.backup_pool: Backup pool
 100 */
 101struct dpni_pools_cfg {
 102        u8              num_dpbp;
 103        struct {
 104                int     dpbp_id;
 105                u16     buffer_size;
 106                int     backup_pool;
 107        } pools[DPNI_MAX_DPBP];
 108};
 109
 110int dpni_set_pools(struct fsl_mc_io             *mc_io,
 111                   u32                          cmd_flags,
 112                   u16                          token,
 113                   const struct dpni_pools_cfg  *cfg);
 114
 115int dpni_enable(struct fsl_mc_io        *mc_io,
 116                u32                     cmd_flags,
 117                u16                     token);
 118
 119int dpni_disable(struct fsl_mc_io       *mc_io,
 120                 u32                    cmd_flags,
 121                 u16                    token);
 122
 123int dpni_is_enabled(struct fsl_mc_io    *mc_io,
 124                    u32                 cmd_flags,
 125                    u16                 token,
 126                    int                 *en);
 127
 128int dpni_reset(struct fsl_mc_io *mc_io,
 129               u32              cmd_flags,
 130               u16              token);
 131
 132/**
 133 * DPNI IRQ Index and Events
 134 */
 135
 136/**
 137 * IRQ index
 138 */
 139#define DPNI_IRQ_INDEX                          0
 140/**
 141 * IRQ events:
 142 *       indicates a change in link state
 143 *       indicates a change in endpoint
 144 */
 145#define DPNI_IRQ_EVENT_LINK_CHANGED             0x00000001
 146#define DPNI_IRQ_EVENT_ENDPOINT_CHANGED         0x00000002
 147
 148int dpni_set_irq_enable(struct fsl_mc_io        *mc_io,
 149                        u32                     cmd_flags,
 150                        u16                     token,
 151                        u8                      irq_index,
 152                        u8                      en);
 153
 154int dpni_get_irq_enable(struct fsl_mc_io        *mc_io,
 155                        u32                     cmd_flags,
 156                        u16                     token,
 157                        u8                      irq_index,
 158                        u8                      *en);
 159
 160int dpni_set_irq_mask(struct fsl_mc_io  *mc_io,
 161                      u32               cmd_flags,
 162                      u16               token,
 163                      u8                irq_index,
 164                      u32               mask);
 165
 166int dpni_get_irq_mask(struct fsl_mc_io  *mc_io,
 167                      u32               cmd_flags,
 168                      u16               token,
 169                      u8                irq_index,
 170                      u32               *mask);
 171
 172int dpni_get_irq_status(struct fsl_mc_io        *mc_io,
 173                        u32                     cmd_flags,
 174                        u16                     token,
 175                        u8                      irq_index,
 176                        u32                     *status);
 177
 178int dpni_clear_irq_status(struct fsl_mc_io      *mc_io,
 179                          u32                   cmd_flags,
 180                          u16                   token,
 181                          u8                    irq_index,
 182                          u32                   status);
 183
 184/**
 185 * struct dpni_attr - Structure representing DPNI attributes
 186 * @options: Any combination of the following options:
 187 *              DPNI_OPT_TX_FRM_RELEASE
 188 *              DPNI_OPT_NO_MAC_FILTER
 189 *              DPNI_OPT_HAS_POLICING
 190 *              DPNI_OPT_SHARED_CONGESTION
 191 *              DPNI_OPT_HAS_KEY_MASKING
 192 *              DPNI_OPT_NO_FS
 193 * @num_queues: Number of Tx and Rx queues used for traffic distribution.
 194 * @num_tcs: Number of traffic classes (TCs), reserved for the DPNI.
 195 * @mac_filter_entries: Number of entries in the MAC address filtering table.
 196 * @vlan_filter_entries: Number of entries in the VLAN address filtering table.
 197 * @qos_entries: Number of entries in the QoS classification table.
 198 * @fs_entries: Number of entries in the flow steering table.
 199 * @qos_key_size: Size, in bytes, of the QoS look-up key. Defining a key larger
 200 *              than this when adding QoS entries will result in an error.
 201 * @fs_key_size: Size, in bytes, of the flow steering look-up key. Defining a
 202 *              key larger than this when composing the hash + FS key will
 203 *              result in an error.
 204 * @wriop_version: Version of WRIOP HW block. The 3 version values are stored
 205 *              on 6, 5, 5 bits respectively.
 206 */
 207struct dpni_attr {
 208        u32 options;
 209        u8 num_queues;
 210        u8 num_tcs;
 211        u8 mac_filter_entries;
 212        u8 vlan_filter_entries;
 213        u8 qos_entries;
 214        u16 fs_entries;
 215        u8 qos_key_size;
 216        u8 fs_key_size;
 217        u16 wriop_version;
 218};
 219
 220int dpni_get_attributes(struct fsl_mc_io        *mc_io,
 221                        u32                     cmd_flags,
 222                        u16                     token,
 223                        struct dpni_attr        *attr);
 224
 225/**
 226 * DPNI errors
 227 */
 228
 229/**
 230 * Extract out of frame header error
 231 */
 232#define DPNI_ERROR_EOFHE        0x00020000
 233/**
 234 * Frame length error
 235 */
 236#define DPNI_ERROR_FLE          0x00002000
 237/**
 238 * Frame physical error
 239 */
 240#define DPNI_ERROR_FPE          0x00001000
 241/**
 242 * Parsing header error
 243 */
 244#define DPNI_ERROR_PHE          0x00000020
 245/**
 246 * Parser L3 checksum error
 247 */
 248#define DPNI_ERROR_L3CE         0x00000004
 249/**
 250 * Parser L3 checksum error
 251 */
 252#define DPNI_ERROR_L4CE         0x00000001
 253
 254/**
 255 * enum dpni_error_action - Defines DPNI behavior for errors
 256 * @DPNI_ERROR_ACTION_DISCARD: Discard the frame
 257 * @DPNI_ERROR_ACTION_CONTINUE: Continue with the normal flow
 258 * @DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE: Send the frame to the error queue
 259 */
 260enum dpni_error_action {
 261        DPNI_ERROR_ACTION_DISCARD = 0,
 262        DPNI_ERROR_ACTION_CONTINUE = 1,
 263        DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE = 2
 264};
 265
 266/**
 267 * struct dpni_error_cfg - Structure representing DPNI errors treatment
 268 * @errors: Errors mask; use 'DPNI_ERROR__<X>
 269 * @error_action: The desired action for the errors mask
 270 * @set_frame_annotation: Set to '1' to mark the errors in frame annotation
 271 *              status (FAS); relevant only for the non-discard action
 272 */
 273struct dpni_error_cfg {
 274        u32                     errors;
 275        enum dpni_error_action  error_action;
 276        int                     set_frame_annotation;
 277};
 278
 279int dpni_set_errors_behavior(struct fsl_mc_io           *mc_io,
 280                             u32                        cmd_flags,
 281                             u16                        token,
 282                             struct dpni_error_cfg      *cfg);
 283
 284/**
 285 * DPNI buffer layout modification options
 286 */
 287
 288/**
 289 * Select to modify the time-stamp setting
 290 */
 291#define DPNI_BUF_LAYOUT_OPT_TIMESTAMP           0x00000001
 292/**
 293 * Select to modify the parser-result setting; not applicable for Tx
 294 */
 295#define DPNI_BUF_LAYOUT_OPT_PARSER_RESULT       0x00000002
 296/**
 297 * Select to modify the frame-status setting
 298 */
 299#define DPNI_BUF_LAYOUT_OPT_FRAME_STATUS        0x00000004
 300/**
 301 * Select to modify the private-data-size setting
 302 */
 303#define DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE   0x00000008
 304/**
 305 * Select to modify the data-alignment setting
 306 */
 307#define DPNI_BUF_LAYOUT_OPT_DATA_ALIGN          0x00000010
 308/**
 309 * Select to modify the data-head-room setting
 310 */
 311#define DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM      0x00000020
 312/**
 313 * Select to modify the data-tail-room setting
 314 */
 315#define DPNI_BUF_LAYOUT_OPT_DATA_TAIL_ROOM      0x00000040
 316
 317/**
 318 * struct dpni_buffer_layout - Structure representing DPNI buffer layout
 319 * @options: Flags representing the suggested modifications to the buffer
 320 *              layout; Use any combination of 'DPNI_BUF_LAYOUT_OPT_<X>' flags
 321 * @pass_timestamp: Pass timestamp value
 322 * @pass_parser_result: Pass parser results
 323 * @pass_frame_status: Pass frame status
 324 * @private_data_size: Size kept for private data (in bytes)
 325 * @data_align: Data alignment
 326 * @data_head_room: Data head room
 327 * @data_tail_room: Data tail room
 328 */
 329struct dpni_buffer_layout {
 330        u32     options;
 331        int     pass_timestamp;
 332        int     pass_parser_result;
 333        int     pass_frame_status;
 334        u16     private_data_size;
 335        u16     data_align;
 336        u16     data_head_room;
 337        u16     data_tail_room;
 338};
 339
 340/**
 341 * enum dpni_queue_type - Identifies a type of queue targeted by the command
 342 * @DPNI_QUEUE_RX: Rx queue
 343 * @DPNI_QUEUE_TX: Tx queue
 344 * @DPNI_QUEUE_TX_CONFIRM: Tx confirmation queue
 345 * @DPNI_QUEUE_RX_ERR: Rx error queue
 346 */enum dpni_queue_type {
 347        DPNI_QUEUE_RX,
 348        DPNI_QUEUE_TX,
 349        DPNI_QUEUE_TX_CONFIRM,
 350        DPNI_QUEUE_RX_ERR,
 351};
 352
 353int dpni_get_buffer_layout(struct fsl_mc_io             *mc_io,
 354                           u32                          cmd_flags,
 355                           u16                          token,
 356                           enum dpni_queue_type         qtype,
 357                           struct dpni_buffer_layout    *layout);
 358
 359int dpni_set_buffer_layout(struct fsl_mc_io                *mc_io,
 360                           u32                             cmd_flags,
 361                           u16                             token,
 362                           enum dpni_queue_type            qtype,
 363                           const struct dpni_buffer_layout *layout);
 364
 365/**
 366 * enum dpni_offload - Identifies a type of offload targeted by the command
 367 * @DPNI_OFF_RX_L3_CSUM: Rx L3 checksum validation
 368 * @DPNI_OFF_RX_L4_CSUM: Rx L4 checksum validation
 369 * @DPNI_OFF_TX_L3_CSUM: Tx L3 checksum generation
 370 * @DPNI_OFF_TX_L4_CSUM: Tx L4 checksum generation
 371 */
 372enum dpni_offload {
 373        DPNI_OFF_RX_L3_CSUM,
 374        DPNI_OFF_RX_L4_CSUM,
 375        DPNI_OFF_TX_L3_CSUM,
 376        DPNI_OFF_TX_L4_CSUM,
 377};
 378
 379int dpni_set_offload(struct fsl_mc_io   *mc_io,
 380                     u32                cmd_flags,
 381                     u16                token,
 382                     enum dpni_offload  type,
 383                     u32                config);
 384
 385int dpni_get_offload(struct fsl_mc_io   *mc_io,
 386                     u32                cmd_flags,
 387                     u16                token,
 388                     enum dpni_offload  type,
 389                     u32                *config);
 390
 391int dpni_get_qdid(struct fsl_mc_io      *mc_io,
 392                  u32                   cmd_flags,
 393                  u16                   token,
 394                  enum dpni_queue_type  qtype,
 395                  u16                   *qdid);
 396
 397int dpni_get_tx_data_offset(struct fsl_mc_io    *mc_io,
 398                            u32                 cmd_flags,
 399                            u16                 token,
 400                            u16                 *data_offset);
 401
 402#define DPNI_STATISTICS_CNT             7
 403
 404/**
 405 * union dpni_statistics - Union describing the DPNI statistics
 406 * @page_0: Page_0 statistics structure
 407 * @page_0.ingress_all_frames: Ingress frame count
 408 * @page_0.ingress_all_bytes: Ingress byte count
 409 * @page_0.ingress_multicast_frames: Ingress multicast frame count
 410 * @page_0.ingress_multicast_bytes: Ingress multicast byte count
 411 * @page_0.ingress_broadcast_frames: Ingress broadcast frame count
 412 * @page_0.ingress_broadcast_bytes: Ingress broadcast byte count
 413 * @page_1: Page_1 statistics structure
 414 * @page_1.egress_all_frames: Egress frame count
 415 * @page_1.egress_all_bytes: Egress byte count
 416 * @page_1.egress_multicast_frames: Egress multicast frame count
 417 * @page_1.egress_multicast_bytes: Egress multicast byte count
 418 * @page_1.egress_broadcast_frames: Egress broadcast frame count
 419 * @page_1.egress_broadcast_bytes: Egress broadcast byte count
 420 * @page_2: Page_2 statistics structure
 421 * @page_2.ingress_filtered_frames: Ingress filtered frame count
 422 * @page_2.ingress_discarded_frames: Ingress discarded frame count
 423 * @page_2.ingress_nobuffer_discards: Ingress discarded frame count due to
 424 *      lack of buffers
 425 * @page_2.egress_discarded_frames: Egress discarded frame count
 426 * @page_2.egress_confirmed_frames: Egress confirmed frame count
 427 * @page3: Page_3 statistics structure
 428 * @page_3.egress_dequeue_bytes: Cumulative count of the number of bytes
 429 *      dequeued from egress FQs
 430 * @page_3.egress_dequeue_frames: Cumulative count of the number of frames
 431 *      dequeued from egress FQs
 432 * @page_3.egress_reject_bytes: Cumulative count of the number of bytes in
 433 *      egress frames whose enqueue was rejected
 434 * @page_3.egress_reject_frames: Cumulative count of the number of egress
 435 *      frames whose enqueue was rejected
 436 * @page_4: Page_4 statistics structure: congestion points
 437 * @page_4.cgr_reject_frames: number of rejected frames due to congestion point
 438 * @page_4.cgr_reject_bytes: number of rejected bytes due to congestion point
 439 * @page_5: Page_5 statistics structure: policer
 440 * @page_5.policer_cnt_red: NUmber of red colored frames
 441 * @page_5.policer_cnt_yellow: number of yellow colored frames
 442 * @page_5.policer_cnt_green: number of green colored frames
 443 * @page_5.policer_cnt_re_red: number of recolored red frames
 444 * @page_5.policer_cnt_re_yellow: number of recolored yellow frames
 445 * @page_6: Page_6 statistics structure
 446 * @page_6.tx_pending_frames: total number of frames pending in egress FQs
 447 * @raw: raw statistics structure, used to index counters
 448 */
 449union dpni_statistics {
 450        struct {
 451                u64 ingress_all_frames;
 452                u64 ingress_all_bytes;
 453                u64 ingress_multicast_frames;
 454                u64 ingress_multicast_bytes;
 455                u64 ingress_broadcast_frames;
 456                u64 ingress_broadcast_bytes;
 457        } page_0;
 458        struct {
 459                u64 egress_all_frames;
 460                u64 egress_all_bytes;
 461                u64 egress_multicast_frames;
 462                u64 egress_multicast_bytes;
 463                u64 egress_broadcast_frames;
 464                u64 egress_broadcast_bytes;
 465        } page_1;
 466        struct {
 467                u64 ingress_filtered_frames;
 468                u64 ingress_discarded_frames;
 469                u64 ingress_nobuffer_discards;
 470                u64 egress_discarded_frames;
 471                u64 egress_confirmed_frames;
 472        } page_2;
 473        struct {
 474                u64 egress_dequeue_bytes;
 475                u64 egress_dequeue_frames;
 476                u64 egress_reject_bytes;
 477                u64 egress_reject_frames;
 478        } page_3;
 479        struct {
 480                u64 cgr_reject_frames;
 481                u64 cgr_reject_bytes;
 482        } page_4;
 483        struct {
 484                u64 policer_cnt_red;
 485                u64 policer_cnt_yellow;
 486                u64 policer_cnt_green;
 487                u64 policer_cnt_re_red;
 488                u64 policer_cnt_re_yellow;
 489        } page_5;
 490        struct {
 491                u64 tx_pending_frames;
 492        } page_6;
 493        struct {
 494                u64 counter[DPNI_STATISTICS_CNT];
 495        } raw;
 496};
 497
 498int dpni_get_statistics(struct fsl_mc_io        *mc_io,
 499                        u32                     cmd_flags,
 500                        u16                     token,
 501                        u8                      page,
 502                        union dpni_statistics   *stat);
 503
 504/**
 505 * Enable auto-negotiation
 506 */
 507#define DPNI_LINK_OPT_AUTONEG           0x0000000000000001ULL
 508/**
 509 * Enable half-duplex mode
 510 */
 511#define DPNI_LINK_OPT_HALF_DUPLEX       0x0000000000000002ULL
 512/**
 513 * Enable pause frames
 514 */
 515#define DPNI_LINK_OPT_PAUSE             0x0000000000000004ULL
 516/**
 517 * Enable a-symmetric pause frames
 518 */
 519#define DPNI_LINK_OPT_ASYM_PAUSE        0x0000000000000008ULL
 520
 521/**
 522 * Enable priority flow control pause frames
 523 */
 524#define DPNI_LINK_OPT_PFC_PAUSE         0x0000000000000010ULL
 525
 526/**
 527 * struct - Structure representing DPNI link configuration
 528 * @rate: Rate
 529 * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
 530 */
 531struct dpni_link_cfg {
 532        u32 rate;
 533        u64 options;
 534};
 535
 536int dpni_set_link_cfg(struct fsl_mc_io                  *mc_io,
 537                      u32                               cmd_flags,
 538                      u16                               token,
 539                      const struct dpni_link_cfg        *cfg);
 540
 541int dpni_get_link_cfg(struct fsl_mc_io                  *mc_io,
 542                      u32                               cmd_flags,
 543                      u16                               token,
 544                      struct dpni_link_cfg              *cfg);
 545
 546/**
 547 * struct dpni_link_state - Structure representing DPNI link state
 548 * @rate: Rate
 549 * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
 550 * @up: Link state; '0' for down, '1' for up
 551 */
 552struct dpni_link_state {
 553        u32     rate;
 554        u64     options;
 555        int     up;
 556};
 557
 558int dpni_get_link_state(struct fsl_mc_io        *mc_io,
 559                        u32                     cmd_flags,
 560                        u16                     token,
 561                        struct dpni_link_state  *state);
 562
 563int dpni_set_max_frame_length(struct fsl_mc_io  *mc_io,
 564                              u32               cmd_flags,
 565                              u16               token,
 566                              u16               max_frame_length);
 567
 568int dpni_get_max_frame_length(struct fsl_mc_io  *mc_io,
 569                              u32               cmd_flags,
 570                              u16               token,
 571                              u16               *max_frame_length);
 572
 573int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
 574                               u32              cmd_flags,
 575                               u16              token,
 576                               int              en);
 577
 578int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
 579                               u32              cmd_flags,
 580                               u16              token,
 581                               int              *en);
 582
 583int dpni_set_unicast_promisc(struct fsl_mc_io   *mc_io,
 584                             u32                cmd_flags,
 585                             u16                token,
 586                             int                en);
 587
 588int dpni_get_unicast_promisc(struct fsl_mc_io   *mc_io,
 589                             u32                cmd_flags,
 590                             u16                token,
 591                             int                *en);
 592
 593int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
 594                              u32               cmd_flags,
 595                              u16               token,
 596                              const u8          mac_addr[6]);
 597
 598int dpni_get_primary_mac_addr(struct fsl_mc_io  *mc_io,
 599                              u32               cmd_flags,
 600                              u16               token,
 601                              u8                mac_addr[6]);
 602
 603int dpni_get_port_mac_addr(struct fsl_mc_io     *mc_io,
 604                           u32                  cm_flags,
 605                           u16                  token,
 606                           u8                   mac_addr[6]);
 607
 608int dpni_add_mac_addr(struct fsl_mc_io  *mc_io,
 609                      u32               cmd_flags,
 610                      u16               token,
 611                      const u8          mac_addr[6]);
 612
 613int dpni_remove_mac_addr(struct fsl_mc_io       *mc_io,
 614                         u32                    cmd_flags,
 615                         u16                    token,
 616                         const u8               mac_addr[6]);
 617
 618int dpni_clear_mac_filters(struct fsl_mc_io     *mc_io,
 619                           u32                  cmd_flags,
 620                           u16                  token,
 621                           int                  unicast,
 622                           int                  multicast);
 623
 624/**
 625 * enum dpni_dist_mode - DPNI distribution mode
 626 * @DPNI_DIST_MODE_NONE: No distribution
 627 * @DPNI_DIST_MODE_HASH: Use hash distribution; only relevant if
 628 *              the 'DPNI_OPT_DIST_HASH' option was set at DPNI creation
 629 * @DPNI_DIST_MODE_FS:  Use explicit flow steering; only relevant if
 630 *       the 'DPNI_OPT_DIST_FS' option was set at DPNI creation
 631 */
 632enum dpni_dist_mode {
 633        DPNI_DIST_MODE_NONE = 0,
 634        DPNI_DIST_MODE_HASH = 1,
 635        DPNI_DIST_MODE_FS = 2
 636};
 637
 638/**
 639 * enum dpni_fs_miss_action -   DPNI Flow Steering miss action
 640 * @DPNI_FS_MISS_DROP: In case of no-match, drop the frame
 641 * @DPNI_FS_MISS_EXPLICIT_FLOWID: In case of no-match, use explicit flow-id
 642 * @DPNI_FS_MISS_HASH: In case of no-match, distribute using hash
 643 */
 644enum dpni_fs_miss_action {
 645        DPNI_FS_MISS_DROP = 0,
 646        DPNI_FS_MISS_EXPLICIT_FLOWID = 1,
 647        DPNI_FS_MISS_HASH = 2
 648};
 649
 650/**
 651 * struct dpni_fs_tbl_cfg - Flow Steering table configuration
 652 * @miss_action: Miss action selection
 653 * @default_flow_id: Used when 'miss_action = DPNI_FS_MISS_EXPLICIT_FLOWID'
 654 */
 655struct dpni_fs_tbl_cfg {
 656        enum dpni_fs_miss_action        miss_action;
 657        u16                             default_flow_id;
 658};
 659
 660int dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
 661                         u8 *key_cfg_buf);
 662
 663/**
 664 * struct dpni_rx_tc_dist_cfg - Rx traffic class distribution configuration
 665 * @dist_size: Set the distribution size;
 666 *      supported values: 1,2,3,4,6,7,8,12,14,16,24,28,32,48,56,64,96,
 667 *      112,128,192,224,256,384,448,512,768,896,1024
 668 * @dist_mode: Distribution mode
 669 * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
 670 *              the extractions to be used for the distribution key by calling
 671 *              dpni_prepare_key_cfg() relevant only when
 672 *              'dist_mode != DPNI_DIST_MODE_NONE', otherwise it can be '0'
 673 * @fs_cfg: Flow Steering table configuration; only relevant if
 674 *              'dist_mode = DPNI_DIST_MODE_FS'
 675 */
 676struct dpni_rx_tc_dist_cfg {
 677        u16                     dist_size;
 678        enum dpni_dist_mode     dist_mode;
 679        u64                     key_cfg_iova;
 680        struct dpni_fs_tbl_cfg  fs_cfg;
 681};
 682
 683int dpni_set_rx_tc_dist(struct fsl_mc_io                        *mc_io,
 684                        u32                                     cmd_flags,
 685                        u16                                     token,
 686                        u8                                      tc_id,
 687                        const struct dpni_rx_tc_dist_cfg        *cfg);
 688
 689/**
 690 * When used for fs_miss_flow_id in function dpni_set_rx_dist,
 691 * will signal to dpni to drop all unclassified frames
 692 */
 693#define DPNI_FS_MISS_DROP               ((uint16_t)-1)
 694
 695/**
 696 * struct dpni_rx_dist_cfg - Rx distribution configuration
 697 * @dist_size:  distribution size
 698 * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
 699 *              the extractions to be used for the distribution key by calling
 700 *              dpni_prepare_key_cfg(); relevant only when enable!=0 otherwise
 701 *              it can be '0'
 702 * @enable: enable/disable the distribution.
 703 * @tc: TC id for which distribution is set
 704 * @fs_miss_flow_id: when packet misses all rules from flow steering table and
 705 *              hash is disabled it will be put into this queue id; use
 706 *              DPNI_FS_MISS_DROP to drop frames. The value of this field is
 707 *              used only when flow steering distribution is enabled and hash
 708 *              distribution is disabled
 709 */
 710struct dpni_rx_dist_cfg {
 711        u16 dist_size;
 712        u64 key_cfg_iova;
 713        u8 enable;
 714        u8 tc;
 715        u16 fs_miss_flow_id;
 716};
 717
 718int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io,
 719                        u32 cmd_flags,
 720                        u16 token,
 721                        const struct dpni_rx_dist_cfg *cfg);
 722
 723int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io,
 724                          u32 cmd_flags,
 725                          u16 token,
 726                          const struct dpni_rx_dist_cfg *cfg);
 727
 728/**
 729 * struct dpni_qos_tbl_cfg - Structure representing QOS table configuration
 730 * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
 731 *              key extractions to be used as the QoS criteria by calling
 732 *              dpkg_prepare_key_cfg()
 733 * @discard_on_miss: Set to '1' to discard frames in case of no match (miss);
 734 *              '0' to use the 'default_tc' in such cases
 735 * @default_tc: Used in case of no-match and 'discard_on_miss'= 0
 736 */
 737struct dpni_qos_tbl_cfg {
 738        u64 key_cfg_iova;
 739        int discard_on_miss;
 740        u8 default_tc;
 741};
 742
 743int dpni_set_qos_table(struct fsl_mc_io *mc_io,
 744                       u32 cmd_flags,
 745                       u16 token,
 746                       const struct dpni_qos_tbl_cfg *cfg);
 747
 748/**
 749 * enum dpni_dest - DPNI destination types
 750 * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
 751 *              does not generate FQDAN notifications; user is expected to
 752 *              dequeue from the queue based on polling or other user-defined
 753 *              method
 754 * @DPNI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
 755 *              notifications to the specified DPIO; user is expected to dequeue
 756 *              from the queue only after notification is received
 757 * @DPNI_DEST_DPCON: The queue is set in schedule mode and does not generate
 758 *              FQDAN notifications, but is connected to the specified DPCON
 759 *              object; user is expected to dequeue from the DPCON channel
 760 */
 761enum dpni_dest {
 762        DPNI_DEST_NONE = 0,
 763        DPNI_DEST_DPIO = 1,
 764        DPNI_DEST_DPCON = 2
 765};
 766
 767/**
 768 * struct dpni_queue - Queue structure
 769 * @destination - Destination structure
 770 * @destination.id: ID of the destination, only relevant if DEST_TYPE is > 0.
 771 *      Identifies either a DPIO or a DPCON object.
 772 *      Not relevant for Tx queues.
 773 * @destination.type:   May be one of the following:
 774 *      0 - No destination, queue can be manually
 775 *              queried, but will not push traffic or
 776 *              notifications to a DPIO;
 777 *      1 - The destination is a DPIO. When traffic
 778 *              becomes available in the queue a FQDAN
 779 *              (FQ data available notification) will be
 780 *              generated to selected DPIO;
 781 *      2 - The destination is a DPCON. The queue is
 782 *              associated with a DPCON object for the
 783 *              purpose of scheduling between multiple
 784 *              queues. The DPCON may be independently
 785 *              configured to generate notifications.
 786 *              Not relevant for Tx queues.
 787 * @destination.hold_active: Hold active, maintains a queue scheduled for longer
 788 *      in a DPIO during dequeue to reduce spread of traffic.
 789 *      Only relevant if queues are
 790 *      not affined to a single DPIO.
 791 * @user_context: User data, presented to the user along with any frames
 792 *      from this queue. Not relevant for Tx queues.
 793 * @flc: FD FLow Context structure
 794 * @flc.value: Default FLC value for traffic dequeued from
 795 *      this queue.  Please check description of FD
 796 *      structure for more information.
 797 *      Note that FLC values set using dpni_add_fs_entry,
 798 *      if any, take precedence over values per queue.
 799 * @flc.stash_control: Boolean, indicates whether the 6 lowest
 800 *      - significant bits are used for stash control.
 801 *      significant bits are used for stash control.  If set, the 6
 802 *      least significant bits in value are interpreted as follows:
 803 *      - bits 0-1: indicates the number of 64 byte units of context
 804 *      that are stashed.  FLC value is interpreted as a memory address
 805 *      in this case, excluding the 6 LS bits.
 806 *      - bits 2-3: indicates the number of 64 byte units of frame
 807 *      annotation to be stashed.  Annotation is placed at FD[ADDR].
 808 *      - bits 4-5: indicates the number of 64 byte units of frame
 809 *      data to be stashed.  Frame data is placed at FD[ADDR] +
 810 *      FD[OFFSET].
 811 *      For more details check the Frame Descriptor section in the
 812 *      hardware documentation.
 813 */
 814struct dpni_queue {
 815        struct {
 816                u16 id;
 817                enum dpni_dest type;
 818                char hold_active;
 819                u8 priority;
 820        } destination;
 821        u64 user_context;
 822        struct {
 823                u64 value;
 824                char stash_control;
 825        } flc;
 826};
 827
 828/**
 829 * struct dpni_queue_id - Queue identification, used for enqueue commands
 830 *                      or queue control
 831 * @fqid: FQID used for enqueueing to and/or configuration of this specific FQ
 832 * @qdbin: Queueing bin, used to enqueue using QDID, DQBIN, QPRI. Only relevant
 833 *              for Tx queues.
 834 */
 835struct dpni_queue_id {
 836        u32 fqid;
 837        u16 qdbin;
 838};
 839
 840/**
 841 * Set User Context
 842 */
 843#define DPNI_QUEUE_OPT_USER_CTX         0x00000001
 844#define DPNI_QUEUE_OPT_DEST             0x00000002
 845#define DPNI_QUEUE_OPT_FLC              0x00000004
 846#define DPNI_QUEUE_OPT_HOLD_ACTIVE      0x00000008
 847
 848int dpni_set_queue(struct fsl_mc_io     *mc_io,
 849                   u32                  cmd_flags,
 850                   u16                  token,
 851                   enum dpni_queue_type qtype,
 852                   u8                   tc,
 853                   u8                   index,
 854                   u8                   options,
 855                   const struct dpni_queue *queue);
 856
 857int dpni_get_queue(struct fsl_mc_io     *mc_io,
 858                   u32                  cmd_flags,
 859                   u16                  token,
 860                   enum dpni_queue_type qtype,
 861                   u8                   tc,
 862                   u8                   index,
 863                   struct dpni_queue    *queue,
 864                   struct dpni_queue_id *qid);
 865
 866/**
 867 * enum dpni_congestion_unit - DPNI congestion units
 868 * @DPNI_CONGESTION_UNIT_BYTES: bytes units
 869 * @DPNI_CONGESTION_UNIT_FRAMES: frames units
 870 */
 871enum dpni_congestion_unit {
 872        DPNI_CONGESTION_UNIT_BYTES = 0,
 873        DPNI_CONGESTION_UNIT_FRAMES
 874};
 875
 876/**
 877 * enum dpni_congestion_point - Structure representing congestion point
 878 * @DPNI_CP_QUEUE: Set taildrop per queue, identified by QUEUE_TYPE, TC and
 879 *              QUEUE_INDEX
 880 * @DPNI_CP_GROUP: Set taildrop per queue group. Depending on options used to
 881 *              define the DPNI this can be either per TC (default) or per
 882 *              interface (DPNI_OPT_SHARED_CONGESTION set at DPNI create).
 883 *              QUEUE_INDEX is ignored if this type is used.
 884 */
 885enum dpni_congestion_point {
 886        DPNI_CP_QUEUE,
 887        DPNI_CP_GROUP,
 888};
 889
 890/**
 891 * struct dpni_dest_cfg - Structure representing DPNI destination parameters
 892 * @dest_type:  Destination type
 893 * @dest_id:    Either DPIO ID or DPCON ID, depending on the destination type
 894 * @priority:   Priority selection within the DPIO or DPCON channel; valid
 895 *              values are 0-1 or 0-7, depending on the number of priorities
 896 *              in that channel; not relevant for 'DPNI_DEST_NONE' option
 897 */
 898struct dpni_dest_cfg {
 899        enum dpni_dest dest_type;
 900        int dest_id;
 901        u8 priority;
 902};
 903
 904/* DPNI congestion options */
 905
 906/**
 907 * This congestion will trigger flow control or priority flow control.
 908 * This will have effect only if flow control is enabled with
 909 * dpni_set_link_cfg().
 910 */
 911#define DPNI_CONG_OPT_FLOW_CONTROL              0x00000040
 912
 913/**
 914 * struct dpni_congestion_notification_cfg - congestion notification
 915 *                                      configuration
 916 * @units: Units type
 917 * @threshold_entry: Above this threshold we enter a congestion state.
 918 *              set it to '0' to disable it
 919 * @threshold_exit: Below this threshold we exit the congestion state.
 920 * @message_ctx: The context that will be part of the CSCN message
 921 * @message_iova: I/O virtual address (must be in DMA-able memory),
 922 *              must be 16B aligned; valid only if 'DPNI_CONG_OPT_WRITE_MEM_<X>'
 923 *              is contained in 'options'
 924 * @dest_cfg: CSCN can be send to either DPIO or DPCON WQ channel
 925 * @notification_mode: Mask of available options; use 'DPNI_CONG_OPT_<X>' values
 926 */
 927
 928struct dpni_congestion_notification_cfg {
 929        enum dpni_congestion_unit units;
 930        u32 threshold_entry;
 931        u32 threshold_exit;
 932        u64 message_ctx;
 933        u64 message_iova;
 934        struct dpni_dest_cfg dest_cfg;
 935        u16 notification_mode;
 936};
 937
 938int dpni_set_congestion_notification(
 939                        struct fsl_mc_io *mc_io,
 940                        u32 cmd_flags,
 941                        u16 token,
 942                        enum dpni_queue_type qtype,
 943                        u8 tc_id,
 944                        const struct dpni_congestion_notification_cfg *cfg);
 945
 946/**
 947 * struct dpni_taildrop - Structure representing the taildrop
 948 * @enable:     Indicates whether the taildrop is active or not.
 949 * @units:      Indicates the unit of THRESHOLD. Queue taildrop only supports
 950 *              byte units, this field is ignored and assumed = 0 if
 951 *              CONGESTION_POINT is 0.
 952 * @threshold:  Threshold value, in units identified by UNITS field. Value 0
 953 *              cannot be used as a valid taildrop threshold, THRESHOLD must
 954 *              be > 0 if the taildrop is enabled.
 955 */
 956struct dpni_taildrop {
 957        char enable;
 958        enum dpni_congestion_unit units;
 959        u32 threshold;
 960};
 961
 962int dpni_set_taildrop(struct fsl_mc_io *mc_io,
 963                      u32 cmd_flags,
 964                      u16 token,
 965                      enum dpni_congestion_point cg_point,
 966                      enum dpni_queue_type q_type,
 967                      u8 tc,
 968                      u8 q_index,
 969                      struct dpni_taildrop *taildrop);
 970
 971int dpni_get_taildrop(struct fsl_mc_io *mc_io,
 972                      u32 cmd_flags,
 973                      u16 token,
 974                      enum dpni_congestion_point cg_point,
 975                      enum dpni_queue_type q_type,
 976                      u8 tc,
 977                      u8 q_index,
 978                      struct dpni_taildrop *taildrop);
 979
 980/**
 981 * struct dpni_rule_cfg - Rule configuration for table lookup
 982 * @key_iova: I/O virtual address of the key (must be in DMA-able memory)
 983 * @mask_iova: I/O virtual address of the mask (must be in DMA-able memory)
 984 * @key_size: key and mask size (in bytes)
 985 */
 986struct dpni_rule_cfg {
 987        u64     key_iova;
 988        u64     mask_iova;
 989        u8      key_size;
 990};
 991
 992/**
 993 * Discard matching traffic. If set, this takes precedence over any other
 994 * configuration and matching traffic is always discarded.
 995 */
 996 #define DPNI_FS_OPT_DISCARD            0x1
 997
 998/**
 999 * Set FLC value. If set, flc member of struct dpni_fs_action_cfg is used to
1000 * override the FLC value set per queue.
1001 * For more details check the Frame Descriptor section in the hardware
1002 * documentation.
1003 */
1004#define DPNI_FS_OPT_SET_FLC            0x2
1005
1006/**
1007 * Indicates whether the 6 lowest significant bits of FLC are used for stash
1008 * control. If set, the 6 least significant bits in value are interpreted as
1009 * follows:
1010 *     - bits 0-1: indicates the number of 64 byte units of context that are
1011 *     stashed. FLC value is interpreted as a memory address in this case,
1012 *     excluding the 6 LS bits.
1013 *     - bits 2-3: indicates the number of 64 byte units of frame annotation
1014 *     to be stashed. Annotation is placed at FD[ADDR].
1015 *     - bits 4-5: indicates the number of 64 byte units of frame data to be
1016 *     stashed. Frame data is placed at FD[ADDR] + FD[OFFSET].
1017 * This flag is ignored if DPNI_FS_OPT_SET_FLC is not specified.
1018 */
1019#define DPNI_FS_OPT_SET_STASH_CONTROL  0x4
1020
1021/**
1022 * struct dpni_fs_action_cfg - Action configuration for table look-up
1023 * @flc:        FLC value for traffic matching this rule. Please check the
1024 *              Frame Descriptor section in the hardware documentation for
1025 *              more information.
1026 * @flow_id:    Identifies the Rx queue used for matching traffic. Supported
1027 *              values are in range 0 to num_queue-1.
1028 * @options:    Any combination of DPNI_FS_OPT_ values.
1029 */
1030struct dpni_fs_action_cfg {
1031        u64 flc;
1032        u16 flow_id;
1033        u16 options;
1034};
1035
1036int dpni_add_fs_entry(struct fsl_mc_io *mc_io,
1037                      u32 cmd_flags,
1038                      u16 token,
1039                      u8 tc_id,
1040                      u16 index,
1041                      const struct dpni_rule_cfg *cfg,
1042                      const struct dpni_fs_action_cfg *action);
1043
1044int dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
1045                         u32 cmd_flags,
1046                         u16 token,
1047                         u8 tc_id,
1048                         const struct dpni_rule_cfg *cfg);
1049
1050int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
1051                       u32 cmd_flags,
1052                       u16 token,
1053                       const struct dpni_rule_cfg *cfg,
1054                       u8 tc_id,
1055                       u16 index);
1056
1057int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
1058                          u32 cmd_flags,
1059                          u16 token,
1060                          const struct dpni_rule_cfg *cfg);
1061
1062int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
1063                         u32 cmd_flags,
1064                         u16 token);
1065
1066int dpni_get_api_version(struct fsl_mc_io *mc_io,
1067                         u32 cmd_flags,
1068                         u16 *major_ver,
1069                         u16 *minor_ver);
1070/**
1071 * struct dpni_tx_shaping - Structure representing DPNI tx shaping configuration
1072 * @rate_limit:         Rate in Mbps
1073 * @max_burst_size:     Burst size in bytes (up to 64KB)
1074 */
1075struct dpni_tx_shaping_cfg {
1076        u32 rate_limit;
1077        u16 max_burst_size;
1078};
1079
1080int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
1081                        u32 cmd_flags,
1082                        u16 token,
1083                        const struct dpni_tx_shaping_cfg *tx_cr_shaper,
1084                        const struct dpni_tx_shaping_cfg *tx_er_shaper,
1085                        int coupled);
1086
1087/**
1088 * struct dpni_single_step_cfg - configure single step PTP (IEEE 1588)
1089 * @en:         enable single step PTP. When enabled the PTPv1 functionality
1090 *              will not work. If the field is zero, offset and ch_update
1091 *              parameters will be ignored
1092 * @offset:     start offset from the beginning of the frame where
1093 *              timestamp field is found. The offset must respect all MAC
1094 *              headers, VLAN tags and other protocol headers
1095 * @ch_update:  when set UDP checksum will be updated inside packet
1096 * @peer_delay: For peer-to-peer transparent clocks add this value to the
1097 *              correction field in addition to the transient time update.
1098 *              The value expresses nanoseconds.
1099 */
1100struct dpni_single_step_cfg {
1101        u8      en;
1102        u8      ch_update;
1103        u16     offset;
1104        u32     peer_delay;
1105};
1106
1107int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io,
1108                             u32 cmd_flags,
1109                             u16 token,
1110                             struct dpni_single_step_cfg *ptp_cfg);
1111
1112int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io,
1113                             u32 cmd_flags,
1114                             u16 token,
1115                             struct dpni_single_step_cfg *ptp_cfg);
1116
1117#endif /* __FSL_DPNI_H */
1118