1*34ff6846SIoana Radulescu /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 2*34ff6846SIoana Radulescu /* Copyright 2013-2016 Freescale Semiconductor Inc. 3*34ff6846SIoana Radulescu * Copyright 2016 NXP 4*34ff6846SIoana Radulescu */ 5*34ff6846SIoana Radulescu #ifndef __FSL_DPNI_H 6*34ff6846SIoana Radulescu #define __FSL_DPNI_H 7*34ff6846SIoana Radulescu 8*34ff6846SIoana Radulescu #include "dpkg.h" 9*34ff6846SIoana Radulescu 10*34ff6846SIoana Radulescu struct fsl_mc_io; 11*34ff6846SIoana Radulescu 12*34ff6846SIoana Radulescu /** 13*34ff6846SIoana Radulescu * Data Path Network Interface API 14*34ff6846SIoana Radulescu * Contains initialization APIs and runtime control APIs for DPNI 15*34ff6846SIoana Radulescu */ 16*34ff6846SIoana Radulescu 17*34ff6846SIoana Radulescu /** General DPNI macros */ 18*34ff6846SIoana Radulescu 19*34ff6846SIoana Radulescu /** 20*34ff6846SIoana Radulescu * Maximum number of traffic classes 21*34ff6846SIoana Radulescu */ 22*34ff6846SIoana Radulescu #define DPNI_MAX_TC 8 23*34ff6846SIoana Radulescu /** 24*34ff6846SIoana Radulescu * Maximum number of buffer pools per DPNI 25*34ff6846SIoana Radulescu */ 26*34ff6846SIoana Radulescu #define DPNI_MAX_DPBP 8 27*34ff6846SIoana Radulescu 28*34ff6846SIoana Radulescu /** 29*34ff6846SIoana Radulescu * All traffic classes considered; see dpni_set_queue() 30*34ff6846SIoana Radulescu */ 31*34ff6846SIoana Radulescu #define DPNI_ALL_TCS (u8)(-1) 32*34ff6846SIoana Radulescu /** 33*34ff6846SIoana Radulescu * All flows within traffic class considered; see dpni_set_queue() 34*34ff6846SIoana Radulescu */ 35*34ff6846SIoana Radulescu #define DPNI_ALL_TC_FLOWS (u16)(-1) 36*34ff6846SIoana Radulescu /** 37*34ff6846SIoana Radulescu * Generate new flow ID; see dpni_set_queue() 38*34ff6846SIoana Radulescu */ 39*34ff6846SIoana Radulescu #define DPNI_NEW_FLOW_ID (u16)(-1) 40*34ff6846SIoana Radulescu 41*34ff6846SIoana Radulescu /** 42*34ff6846SIoana Radulescu * Tx traffic is always released to a buffer pool on transmit, there are no 43*34ff6846SIoana Radulescu * resources allocated to have the frames confirmed back to the source after 44*34ff6846SIoana Radulescu * transmission. 45*34ff6846SIoana Radulescu */ 46*34ff6846SIoana Radulescu #define DPNI_OPT_TX_FRM_RELEASE 0x000001 47*34ff6846SIoana Radulescu /** 48*34ff6846SIoana Radulescu * Disables support for MAC address filtering for addresses other than primary 49*34ff6846SIoana Radulescu * MAC address. This affects both unicast and multicast. Promiscuous mode can 50*34ff6846SIoana Radulescu * still be enabled/disabled for both unicast and multicast. If promiscuous mode 51*34ff6846SIoana Radulescu * is disabled, only traffic matching the primary MAC address will be accepted. 52*34ff6846SIoana Radulescu */ 53*34ff6846SIoana Radulescu #define DPNI_OPT_NO_MAC_FILTER 0x000002 54*34ff6846SIoana Radulescu /** 55*34ff6846SIoana Radulescu * Allocate policers for this DPNI. They can be used to rate-limit traffic per 56*34ff6846SIoana Radulescu * traffic class (TC) basis. 57*34ff6846SIoana Radulescu */ 58*34ff6846SIoana Radulescu #define DPNI_OPT_HAS_POLICING 0x000004 59*34ff6846SIoana Radulescu /** 60*34ff6846SIoana Radulescu * Congestion can be managed in several ways, allowing the buffer pool to 61*34ff6846SIoana Radulescu * deplete on ingress, taildrop on each queue or use congestion groups for sets 62*34ff6846SIoana Radulescu * of queues. If set, it configures a single congestion groups across all TCs. 63*34ff6846SIoana Radulescu * If reset, a congestion group is allocated for each TC. Only relevant if the 64*34ff6846SIoana Radulescu * DPNI has multiple traffic classes. 65*34ff6846SIoana Radulescu */ 66*34ff6846SIoana Radulescu #define DPNI_OPT_SHARED_CONGESTION 0x000008 67*34ff6846SIoana Radulescu /** 68*34ff6846SIoana Radulescu * Enables TCAM for Flow Steering and QoS look-ups. If not specified, all 69*34ff6846SIoana Radulescu * look-ups are exact match. Note that TCAM is not available on LS1088 and its 70*34ff6846SIoana Radulescu * variants. Setting this bit on these SoCs will trigger an error. 71*34ff6846SIoana Radulescu */ 72*34ff6846SIoana Radulescu #define DPNI_OPT_HAS_KEY_MASKING 0x000010 73*34ff6846SIoana Radulescu /** 74*34ff6846SIoana Radulescu * Disables the flow steering table. 75*34ff6846SIoana Radulescu */ 76*34ff6846SIoana Radulescu #define DPNI_OPT_NO_FS 0x000020 77*34ff6846SIoana Radulescu 78*34ff6846SIoana Radulescu int dpni_open(struct fsl_mc_io *mc_io, 79*34ff6846SIoana Radulescu u32 cmd_flags, 80*34ff6846SIoana Radulescu int dpni_id, 81*34ff6846SIoana Radulescu u16 *token); 82*34ff6846SIoana Radulescu 83*34ff6846SIoana Radulescu int dpni_close(struct fsl_mc_io *mc_io, 84*34ff6846SIoana Radulescu u32 cmd_flags, 85*34ff6846SIoana Radulescu u16 token); 86*34ff6846SIoana Radulescu 87*34ff6846SIoana Radulescu /** 88*34ff6846SIoana Radulescu * struct dpni_pools_cfg - Structure representing buffer pools configuration 89*34ff6846SIoana Radulescu * @num_dpbp: Number of DPBPs 90*34ff6846SIoana Radulescu * @pools: Array of buffer pools parameters; The number of valid entries 91*34ff6846SIoana Radulescu * must match 'num_dpbp' value 92*34ff6846SIoana Radulescu * @pools.dpbp_id: DPBP object ID 93*34ff6846SIoana Radulescu * @pools.buffer_size: Buffer size 94*34ff6846SIoana Radulescu * @pools.backup_pool: Backup pool 95*34ff6846SIoana Radulescu */ 96*34ff6846SIoana Radulescu struct dpni_pools_cfg { 97*34ff6846SIoana Radulescu u8 num_dpbp; 98*34ff6846SIoana Radulescu struct { 99*34ff6846SIoana Radulescu int dpbp_id; 100*34ff6846SIoana Radulescu u16 buffer_size; 101*34ff6846SIoana Radulescu int backup_pool; 102*34ff6846SIoana Radulescu } pools[DPNI_MAX_DPBP]; 103*34ff6846SIoana Radulescu }; 104*34ff6846SIoana Radulescu 105*34ff6846SIoana Radulescu int dpni_set_pools(struct fsl_mc_io *mc_io, 106*34ff6846SIoana Radulescu u32 cmd_flags, 107*34ff6846SIoana Radulescu u16 token, 108*34ff6846SIoana Radulescu const struct dpni_pools_cfg *cfg); 109*34ff6846SIoana Radulescu 110*34ff6846SIoana Radulescu int dpni_enable(struct fsl_mc_io *mc_io, 111*34ff6846SIoana Radulescu u32 cmd_flags, 112*34ff6846SIoana Radulescu u16 token); 113*34ff6846SIoana Radulescu 114*34ff6846SIoana Radulescu int dpni_disable(struct fsl_mc_io *mc_io, 115*34ff6846SIoana Radulescu u32 cmd_flags, 116*34ff6846SIoana Radulescu u16 token); 117*34ff6846SIoana Radulescu 118*34ff6846SIoana Radulescu int dpni_is_enabled(struct fsl_mc_io *mc_io, 119*34ff6846SIoana Radulescu u32 cmd_flags, 120*34ff6846SIoana Radulescu u16 token, 121*34ff6846SIoana Radulescu int *en); 122*34ff6846SIoana Radulescu 123*34ff6846SIoana Radulescu int dpni_reset(struct fsl_mc_io *mc_io, 124*34ff6846SIoana Radulescu u32 cmd_flags, 125*34ff6846SIoana Radulescu u16 token); 126*34ff6846SIoana Radulescu 127*34ff6846SIoana Radulescu /** 128*34ff6846SIoana Radulescu * DPNI IRQ Index and Events 129*34ff6846SIoana Radulescu */ 130*34ff6846SIoana Radulescu 131*34ff6846SIoana Radulescu /** 132*34ff6846SIoana Radulescu * IRQ index 133*34ff6846SIoana Radulescu */ 134*34ff6846SIoana Radulescu #define DPNI_IRQ_INDEX 0 135*34ff6846SIoana Radulescu /** 136*34ff6846SIoana Radulescu * IRQ event - indicates a change in link state 137*34ff6846SIoana Radulescu */ 138*34ff6846SIoana Radulescu #define DPNI_IRQ_EVENT_LINK_CHANGED 0x00000001 139*34ff6846SIoana Radulescu 140*34ff6846SIoana Radulescu int dpni_set_irq_enable(struct fsl_mc_io *mc_io, 141*34ff6846SIoana Radulescu u32 cmd_flags, 142*34ff6846SIoana Radulescu u16 token, 143*34ff6846SIoana Radulescu u8 irq_index, 144*34ff6846SIoana Radulescu u8 en); 145*34ff6846SIoana Radulescu 146*34ff6846SIoana Radulescu int dpni_get_irq_enable(struct fsl_mc_io *mc_io, 147*34ff6846SIoana Radulescu u32 cmd_flags, 148*34ff6846SIoana Radulescu u16 token, 149*34ff6846SIoana Radulescu u8 irq_index, 150*34ff6846SIoana Radulescu u8 *en); 151*34ff6846SIoana Radulescu 152*34ff6846SIoana Radulescu int dpni_set_irq_mask(struct fsl_mc_io *mc_io, 153*34ff6846SIoana Radulescu u32 cmd_flags, 154*34ff6846SIoana Radulescu u16 token, 155*34ff6846SIoana Radulescu u8 irq_index, 156*34ff6846SIoana Radulescu u32 mask); 157*34ff6846SIoana Radulescu 158*34ff6846SIoana Radulescu int dpni_get_irq_mask(struct fsl_mc_io *mc_io, 159*34ff6846SIoana Radulescu u32 cmd_flags, 160*34ff6846SIoana Radulescu u16 token, 161*34ff6846SIoana Radulescu u8 irq_index, 162*34ff6846SIoana Radulescu u32 *mask); 163*34ff6846SIoana Radulescu 164*34ff6846SIoana Radulescu int dpni_get_irq_status(struct fsl_mc_io *mc_io, 165*34ff6846SIoana Radulescu u32 cmd_flags, 166*34ff6846SIoana Radulescu u16 token, 167*34ff6846SIoana Radulescu u8 irq_index, 168*34ff6846SIoana Radulescu u32 *status); 169*34ff6846SIoana Radulescu 170*34ff6846SIoana Radulescu int dpni_clear_irq_status(struct fsl_mc_io *mc_io, 171*34ff6846SIoana Radulescu u32 cmd_flags, 172*34ff6846SIoana Radulescu u16 token, 173*34ff6846SIoana Radulescu u8 irq_index, 174*34ff6846SIoana Radulescu u32 status); 175*34ff6846SIoana Radulescu 176*34ff6846SIoana Radulescu /** 177*34ff6846SIoana Radulescu * struct dpni_attr - Structure representing DPNI attributes 178*34ff6846SIoana Radulescu * @options: Any combination of the following options: 179*34ff6846SIoana Radulescu * DPNI_OPT_TX_FRM_RELEASE 180*34ff6846SIoana Radulescu * DPNI_OPT_NO_MAC_FILTER 181*34ff6846SIoana Radulescu * DPNI_OPT_HAS_POLICING 182*34ff6846SIoana Radulescu * DPNI_OPT_SHARED_CONGESTION 183*34ff6846SIoana Radulescu * DPNI_OPT_HAS_KEY_MASKING 184*34ff6846SIoana Radulescu * DPNI_OPT_NO_FS 185*34ff6846SIoana Radulescu * @num_queues: Number of Tx and Rx queues used for traffic distribution. 186*34ff6846SIoana Radulescu * @num_tcs: Number of traffic classes (TCs), reserved for the DPNI. 187*34ff6846SIoana Radulescu * @mac_filter_entries: Number of entries in the MAC address filtering table. 188*34ff6846SIoana Radulescu * @vlan_filter_entries: Number of entries in the VLAN address filtering table. 189*34ff6846SIoana Radulescu * @qos_entries: Number of entries in the QoS classification table. 190*34ff6846SIoana Radulescu * @fs_entries: Number of entries in the flow steering table. 191*34ff6846SIoana Radulescu * @qos_key_size: Size, in bytes, of the QoS look-up key. Defining a key larger 192*34ff6846SIoana Radulescu * than this when adding QoS entries will result in an error. 193*34ff6846SIoana Radulescu * @fs_key_size: Size, in bytes, of the flow steering look-up key. Defining a 194*34ff6846SIoana Radulescu * key larger than this when composing the hash + FS key will 195*34ff6846SIoana Radulescu * result in an error. 196*34ff6846SIoana Radulescu * @wriop_version: Version of WRIOP HW block. The 3 version values are stored 197*34ff6846SIoana Radulescu * on 6, 5, 5 bits respectively. 198*34ff6846SIoana Radulescu */ 199*34ff6846SIoana Radulescu struct dpni_attr { 200*34ff6846SIoana Radulescu u32 options; 201*34ff6846SIoana Radulescu u8 num_queues; 202*34ff6846SIoana Radulescu u8 num_tcs; 203*34ff6846SIoana Radulescu u8 mac_filter_entries; 204*34ff6846SIoana Radulescu u8 vlan_filter_entries; 205*34ff6846SIoana Radulescu u8 qos_entries; 206*34ff6846SIoana Radulescu u16 fs_entries; 207*34ff6846SIoana Radulescu u8 qos_key_size; 208*34ff6846SIoana Radulescu u8 fs_key_size; 209*34ff6846SIoana Radulescu u16 wriop_version; 210*34ff6846SIoana Radulescu }; 211*34ff6846SIoana Radulescu 212*34ff6846SIoana Radulescu int dpni_get_attributes(struct fsl_mc_io *mc_io, 213*34ff6846SIoana Radulescu u32 cmd_flags, 214*34ff6846SIoana Radulescu u16 token, 215*34ff6846SIoana Radulescu struct dpni_attr *attr); 216*34ff6846SIoana Radulescu 217*34ff6846SIoana Radulescu /** 218*34ff6846SIoana Radulescu * DPNI errors 219*34ff6846SIoana Radulescu */ 220*34ff6846SIoana Radulescu 221*34ff6846SIoana Radulescu /** 222*34ff6846SIoana Radulescu * Extract out of frame header error 223*34ff6846SIoana Radulescu */ 224*34ff6846SIoana Radulescu #define DPNI_ERROR_EOFHE 0x00020000 225*34ff6846SIoana Radulescu /** 226*34ff6846SIoana Radulescu * Frame length error 227*34ff6846SIoana Radulescu */ 228*34ff6846SIoana Radulescu #define DPNI_ERROR_FLE 0x00002000 229*34ff6846SIoana Radulescu /** 230*34ff6846SIoana Radulescu * Frame physical error 231*34ff6846SIoana Radulescu */ 232*34ff6846SIoana Radulescu #define DPNI_ERROR_FPE 0x00001000 233*34ff6846SIoana Radulescu /** 234*34ff6846SIoana Radulescu * Parsing header error 235*34ff6846SIoana Radulescu */ 236*34ff6846SIoana Radulescu #define DPNI_ERROR_PHE 0x00000020 237*34ff6846SIoana Radulescu /** 238*34ff6846SIoana Radulescu * Parser L3 checksum error 239*34ff6846SIoana Radulescu */ 240*34ff6846SIoana Radulescu #define DPNI_ERROR_L3CE 0x00000004 241*34ff6846SIoana Radulescu /** 242*34ff6846SIoana Radulescu * Parser L3 checksum error 243*34ff6846SIoana Radulescu */ 244*34ff6846SIoana Radulescu #define DPNI_ERROR_L4CE 0x00000001 245*34ff6846SIoana Radulescu 246*34ff6846SIoana Radulescu /** 247*34ff6846SIoana Radulescu * enum dpni_error_action - Defines DPNI behavior for errors 248*34ff6846SIoana Radulescu * @DPNI_ERROR_ACTION_DISCARD: Discard the frame 249*34ff6846SIoana Radulescu * @DPNI_ERROR_ACTION_CONTINUE: Continue with the normal flow 250*34ff6846SIoana Radulescu * @DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE: Send the frame to the error queue 251*34ff6846SIoana Radulescu */ 252*34ff6846SIoana Radulescu enum dpni_error_action { 253*34ff6846SIoana Radulescu DPNI_ERROR_ACTION_DISCARD = 0, 254*34ff6846SIoana Radulescu DPNI_ERROR_ACTION_CONTINUE = 1, 255*34ff6846SIoana Radulescu DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE = 2 256*34ff6846SIoana Radulescu }; 257*34ff6846SIoana Radulescu 258*34ff6846SIoana Radulescu /** 259*34ff6846SIoana Radulescu * struct dpni_error_cfg - Structure representing DPNI errors treatment 260*34ff6846SIoana Radulescu * @errors: Errors mask; use 'DPNI_ERROR__<X> 261*34ff6846SIoana Radulescu * @error_action: The desired action for the errors mask 262*34ff6846SIoana Radulescu * @set_frame_annotation: Set to '1' to mark the errors in frame annotation 263*34ff6846SIoana Radulescu * status (FAS); relevant only for the non-discard action 264*34ff6846SIoana Radulescu */ 265*34ff6846SIoana Radulescu struct dpni_error_cfg { 266*34ff6846SIoana Radulescu u32 errors; 267*34ff6846SIoana Radulescu enum dpni_error_action error_action; 268*34ff6846SIoana Radulescu int set_frame_annotation; 269*34ff6846SIoana Radulescu }; 270*34ff6846SIoana Radulescu 271*34ff6846SIoana Radulescu int dpni_set_errors_behavior(struct fsl_mc_io *mc_io, 272*34ff6846SIoana Radulescu u32 cmd_flags, 273*34ff6846SIoana Radulescu u16 token, 274*34ff6846SIoana Radulescu struct dpni_error_cfg *cfg); 275*34ff6846SIoana Radulescu 276*34ff6846SIoana Radulescu /** 277*34ff6846SIoana Radulescu * DPNI buffer layout modification options 278*34ff6846SIoana Radulescu */ 279*34ff6846SIoana Radulescu 280*34ff6846SIoana Radulescu /** 281*34ff6846SIoana Radulescu * Select to modify the time-stamp setting 282*34ff6846SIoana Radulescu */ 283*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_TIMESTAMP 0x00000001 284*34ff6846SIoana Radulescu /** 285*34ff6846SIoana Radulescu * Select to modify the parser-result setting; not applicable for Tx 286*34ff6846SIoana Radulescu */ 287*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_PARSER_RESULT 0x00000002 288*34ff6846SIoana Radulescu /** 289*34ff6846SIoana Radulescu * Select to modify the frame-status setting 290*34ff6846SIoana Radulescu */ 291*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_FRAME_STATUS 0x00000004 292*34ff6846SIoana Radulescu /** 293*34ff6846SIoana Radulescu * Select to modify the private-data-size setting 294*34ff6846SIoana Radulescu */ 295*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE 0x00000008 296*34ff6846SIoana Radulescu /** 297*34ff6846SIoana Radulescu * Select to modify the data-alignment setting 298*34ff6846SIoana Radulescu */ 299*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_DATA_ALIGN 0x00000010 300*34ff6846SIoana Radulescu /** 301*34ff6846SIoana Radulescu * Select to modify the data-head-room setting 302*34ff6846SIoana Radulescu */ 303*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM 0x00000020 304*34ff6846SIoana Radulescu /** 305*34ff6846SIoana Radulescu * Select to modify the data-tail-room setting 306*34ff6846SIoana Radulescu */ 307*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_DATA_TAIL_ROOM 0x00000040 308*34ff6846SIoana Radulescu 309*34ff6846SIoana Radulescu /** 310*34ff6846SIoana Radulescu * struct dpni_buffer_layout - Structure representing DPNI buffer layout 311*34ff6846SIoana Radulescu * @options: Flags representing the suggested modifications to the buffer 312*34ff6846SIoana Radulescu * layout; Use any combination of 'DPNI_BUF_LAYOUT_OPT_<X>' flags 313*34ff6846SIoana Radulescu * @pass_timestamp: Pass timestamp value 314*34ff6846SIoana Radulescu * @pass_parser_result: Pass parser results 315*34ff6846SIoana Radulescu * @pass_frame_status: Pass frame status 316*34ff6846SIoana Radulescu * @private_data_size: Size kept for private data (in bytes) 317*34ff6846SIoana Radulescu * @data_align: Data alignment 318*34ff6846SIoana Radulescu * @data_head_room: Data head room 319*34ff6846SIoana Radulescu * @data_tail_room: Data tail room 320*34ff6846SIoana Radulescu */ 321*34ff6846SIoana Radulescu struct dpni_buffer_layout { 322*34ff6846SIoana Radulescu u32 options; 323*34ff6846SIoana Radulescu int pass_timestamp; 324*34ff6846SIoana Radulescu int pass_parser_result; 325*34ff6846SIoana Radulescu int pass_frame_status; 326*34ff6846SIoana Radulescu u16 private_data_size; 327*34ff6846SIoana Radulescu u16 data_align; 328*34ff6846SIoana Radulescu u16 data_head_room; 329*34ff6846SIoana Radulescu u16 data_tail_room; 330*34ff6846SIoana Radulescu }; 331*34ff6846SIoana Radulescu 332*34ff6846SIoana Radulescu /** 333*34ff6846SIoana Radulescu * enum dpni_queue_type - Identifies a type of queue targeted by the command 334*34ff6846SIoana Radulescu * @DPNI_QUEUE_RX: Rx queue 335*34ff6846SIoana Radulescu * @DPNI_QUEUE_TX: Tx queue 336*34ff6846SIoana Radulescu * @DPNI_QUEUE_TX_CONFIRM: Tx confirmation queue 337*34ff6846SIoana Radulescu * @DPNI_QUEUE_RX_ERR: Rx error queue 338*34ff6846SIoana Radulescu */enum dpni_queue_type { 339*34ff6846SIoana Radulescu DPNI_QUEUE_RX, 340*34ff6846SIoana Radulescu DPNI_QUEUE_TX, 341*34ff6846SIoana Radulescu DPNI_QUEUE_TX_CONFIRM, 342*34ff6846SIoana Radulescu DPNI_QUEUE_RX_ERR, 343*34ff6846SIoana Radulescu }; 344*34ff6846SIoana Radulescu 345*34ff6846SIoana Radulescu int dpni_get_buffer_layout(struct fsl_mc_io *mc_io, 346*34ff6846SIoana Radulescu u32 cmd_flags, 347*34ff6846SIoana Radulescu u16 token, 348*34ff6846SIoana Radulescu enum dpni_queue_type qtype, 349*34ff6846SIoana Radulescu struct dpni_buffer_layout *layout); 350*34ff6846SIoana Radulescu 351*34ff6846SIoana Radulescu int dpni_set_buffer_layout(struct fsl_mc_io *mc_io, 352*34ff6846SIoana Radulescu u32 cmd_flags, 353*34ff6846SIoana Radulescu u16 token, 354*34ff6846SIoana Radulescu enum dpni_queue_type qtype, 355*34ff6846SIoana Radulescu const struct dpni_buffer_layout *layout); 356*34ff6846SIoana Radulescu 357*34ff6846SIoana Radulescu /** 358*34ff6846SIoana Radulescu * enum dpni_offload - Identifies a type of offload targeted by the command 359*34ff6846SIoana Radulescu * @DPNI_OFF_RX_L3_CSUM: Rx L3 checksum validation 360*34ff6846SIoana Radulescu * @DPNI_OFF_RX_L4_CSUM: Rx L4 checksum validation 361*34ff6846SIoana Radulescu * @DPNI_OFF_TX_L3_CSUM: Tx L3 checksum generation 362*34ff6846SIoana Radulescu * @DPNI_OFF_TX_L4_CSUM: Tx L4 checksum generation 363*34ff6846SIoana Radulescu */ 364*34ff6846SIoana Radulescu enum dpni_offload { 365*34ff6846SIoana Radulescu DPNI_OFF_RX_L3_CSUM, 366*34ff6846SIoana Radulescu DPNI_OFF_RX_L4_CSUM, 367*34ff6846SIoana Radulescu DPNI_OFF_TX_L3_CSUM, 368*34ff6846SIoana Radulescu DPNI_OFF_TX_L4_CSUM, 369*34ff6846SIoana Radulescu }; 370*34ff6846SIoana Radulescu 371*34ff6846SIoana Radulescu int dpni_set_offload(struct fsl_mc_io *mc_io, 372*34ff6846SIoana Radulescu u32 cmd_flags, 373*34ff6846SIoana Radulescu u16 token, 374*34ff6846SIoana Radulescu enum dpni_offload type, 375*34ff6846SIoana Radulescu u32 config); 376*34ff6846SIoana Radulescu 377*34ff6846SIoana Radulescu int dpni_get_offload(struct fsl_mc_io *mc_io, 378*34ff6846SIoana Radulescu u32 cmd_flags, 379*34ff6846SIoana Radulescu u16 token, 380*34ff6846SIoana Radulescu enum dpni_offload type, 381*34ff6846SIoana Radulescu u32 *config); 382*34ff6846SIoana Radulescu 383*34ff6846SIoana Radulescu int dpni_get_qdid(struct fsl_mc_io *mc_io, 384*34ff6846SIoana Radulescu u32 cmd_flags, 385*34ff6846SIoana Radulescu u16 token, 386*34ff6846SIoana Radulescu enum dpni_queue_type qtype, 387*34ff6846SIoana Radulescu u16 *qdid); 388*34ff6846SIoana Radulescu 389*34ff6846SIoana Radulescu int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io, 390*34ff6846SIoana Radulescu u32 cmd_flags, 391*34ff6846SIoana Radulescu u16 token, 392*34ff6846SIoana Radulescu u16 *data_offset); 393*34ff6846SIoana Radulescu 394*34ff6846SIoana Radulescu #define DPNI_STATISTICS_CNT 7 395*34ff6846SIoana Radulescu 396*34ff6846SIoana Radulescu /** 397*34ff6846SIoana Radulescu * union dpni_statistics - Union describing the DPNI statistics 398*34ff6846SIoana Radulescu * @page_0: Page_0 statistics structure 399*34ff6846SIoana Radulescu * @page_0.ingress_all_frames: Ingress frame count 400*34ff6846SIoana Radulescu * @page_0.ingress_all_bytes: Ingress byte count 401*34ff6846SIoana Radulescu * @page_0.ingress_multicast_frames: Ingress multicast frame count 402*34ff6846SIoana Radulescu * @page_0.ingress_multicast_bytes: Ingress multicast byte count 403*34ff6846SIoana Radulescu * @page_0.ingress_broadcast_frames: Ingress broadcast frame count 404*34ff6846SIoana Radulescu * @page_0.ingress_broadcast_bytes: Ingress broadcast byte count 405*34ff6846SIoana Radulescu * @page_1: Page_1 statistics structure 406*34ff6846SIoana Radulescu * @page_1.egress_all_frames: Egress frame count 407*34ff6846SIoana Radulescu * @page_1.egress_all_bytes: Egress byte count 408*34ff6846SIoana Radulescu * @page_1.egress_multicast_frames: Egress multicast frame count 409*34ff6846SIoana Radulescu * @page_1.egress_multicast_bytes: Egress multicast byte count 410*34ff6846SIoana Radulescu * @page_1.egress_broadcast_frames: Egress broadcast frame count 411*34ff6846SIoana Radulescu * @page_1.egress_broadcast_bytes: Egress broadcast byte count 412*34ff6846SIoana Radulescu * @page_2: Page_2 statistics structure 413*34ff6846SIoana Radulescu * @page_2.ingress_filtered_frames: Ingress filtered frame count 414*34ff6846SIoana Radulescu * @page_2.ingress_discarded_frames: Ingress discarded frame count 415*34ff6846SIoana Radulescu * @page_2.ingress_nobuffer_discards: Ingress discarded frame count due to 416*34ff6846SIoana Radulescu * lack of buffers 417*34ff6846SIoana Radulescu * @page_2.egress_discarded_frames: Egress discarded frame count 418*34ff6846SIoana Radulescu * @page_2.egress_confirmed_frames: Egress confirmed frame count 419*34ff6846SIoana Radulescu * @raw: raw statistics structure, used to index counters 420*34ff6846SIoana Radulescu */ 421*34ff6846SIoana Radulescu union dpni_statistics { 422*34ff6846SIoana Radulescu struct { 423*34ff6846SIoana Radulescu u64 ingress_all_frames; 424*34ff6846SIoana Radulescu u64 ingress_all_bytes; 425*34ff6846SIoana Radulescu u64 ingress_multicast_frames; 426*34ff6846SIoana Radulescu u64 ingress_multicast_bytes; 427*34ff6846SIoana Radulescu u64 ingress_broadcast_frames; 428*34ff6846SIoana Radulescu u64 ingress_broadcast_bytes; 429*34ff6846SIoana Radulescu } page_0; 430*34ff6846SIoana Radulescu struct { 431*34ff6846SIoana Radulescu u64 egress_all_frames; 432*34ff6846SIoana Radulescu u64 egress_all_bytes; 433*34ff6846SIoana Radulescu u64 egress_multicast_frames; 434*34ff6846SIoana Radulescu u64 egress_multicast_bytes; 435*34ff6846SIoana Radulescu u64 egress_broadcast_frames; 436*34ff6846SIoana Radulescu u64 egress_broadcast_bytes; 437*34ff6846SIoana Radulescu } page_1; 438*34ff6846SIoana Radulescu struct { 439*34ff6846SIoana Radulescu u64 ingress_filtered_frames; 440*34ff6846SIoana Radulescu u64 ingress_discarded_frames; 441*34ff6846SIoana Radulescu u64 ingress_nobuffer_discards; 442*34ff6846SIoana Radulescu u64 egress_discarded_frames; 443*34ff6846SIoana Radulescu u64 egress_confirmed_frames; 444*34ff6846SIoana Radulescu } page_2; 445*34ff6846SIoana Radulescu struct { 446*34ff6846SIoana Radulescu u64 counter[DPNI_STATISTICS_CNT]; 447*34ff6846SIoana Radulescu } raw; 448*34ff6846SIoana Radulescu }; 449*34ff6846SIoana Radulescu 450*34ff6846SIoana Radulescu int dpni_get_statistics(struct fsl_mc_io *mc_io, 451*34ff6846SIoana Radulescu u32 cmd_flags, 452*34ff6846SIoana Radulescu u16 token, 453*34ff6846SIoana Radulescu u8 page, 454*34ff6846SIoana Radulescu union dpni_statistics *stat); 455*34ff6846SIoana Radulescu 456*34ff6846SIoana Radulescu /** 457*34ff6846SIoana Radulescu * Enable auto-negotiation 458*34ff6846SIoana Radulescu */ 459*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_AUTONEG 0x0000000000000001ULL 460*34ff6846SIoana Radulescu /** 461*34ff6846SIoana Radulescu * Enable half-duplex mode 462*34ff6846SIoana Radulescu */ 463*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_HALF_DUPLEX 0x0000000000000002ULL 464*34ff6846SIoana Radulescu /** 465*34ff6846SIoana Radulescu * Enable pause frames 466*34ff6846SIoana Radulescu */ 467*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_PAUSE 0x0000000000000004ULL 468*34ff6846SIoana Radulescu /** 469*34ff6846SIoana Radulescu * Enable a-symmetric pause frames 470*34ff6846SIoana Radulescu */ 471*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL 472*34ff6846SIoana Radulescu 473*34ff6846SIoana Radulescu /** 474*34ff6846SIoana Radulescu * struct - Structure representing DPNI link configuration 475*34ff6846SIoana Radulescu * @rate: Rate 476*34ff6846SIoana Radulescu * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values 477*34ff6846SIoana Radulescu */ 478*34ff6846SIoana Radulescu struct dpni_link_cfg { 479*34ff6846SIoana Radulescu u32 rate; 480*34ff6846SIoana Radulescu u64 options; 481*34ff6846SIoana Radulescu }; 482*34ff6846SIoana Radulescu 483*34ff6846SIoana Radulescu int dpni_set_link_cfg(struct fsl_mc_io *mc_io, 484*34ff6846SIoana Radulescu u32 cmd_flags, 485*34ff6846SIoana Radulescu u16 token, 486*34ff6846SIoana Radulescu const struct dpni_link_cfg *cfg); 487*34ff6846SIoana Radulescu 488*34ff6846SIoana Radulescu /** 489*34ff6846SIoana Radulescu * struct dpni_link_state - Structure representing DPNI link state 490*34ff6846SIoana Radulescu * @rate: Rate 491*34ff6846SIoana Radulescu * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values 492*34ff6846SIoana Radulescu * @up: Link state; '0' for down, '1' for up 493*34ff6846SIoana Radulescu */ 494*34ff6846SIoana Radulescu struct dpni_link_state { 495*34ff6846SIoana Radulescu u32 rate; 496*34ff6846SIoana Radulescu u64 options; 497*34ff6846SIoana Radulescu int up; 498*34ff6846SIoana Radulescu }; 499*34ff6846SIoana Radulescu 500*34ff6846SIoana Radulescu int dpni_get_link_state(struct fsl_mc_io *mc_io, 501*34ff6846SIoana Radulescu u32 cmd_flags, 502*34ff6846SIoana Radulescu u16 token, 503*34ff6846SIoana Radulescu struct dpni_link_state *state); 504*34ff6846SIoana Radulescu 505*34ff6846SIoana Radulescu int dpni_set_max_frame_length(struct fsl_mc_io *mc_io, 506*34ff6846SIoana Radulescu u32 cmd_flags, 507*34ff6846SIoana Radulescu u16 token, 508*34ff6846SIoana Radulescu u16 max_frame_length); 509*34ff6846SIoana Radulescu 510*34ff6846SIoana Radulescu int dpni_get_max_frame_length(struct fsl_mc_io *mc_io, 511*34ff6846SIoana Radulescu u32 cmd_flags, 512*34ff6846SIoana Radulescu u16 token, 513*34ff6846SIoana Radulescu u16 *max_frame_length); 514*34ff6846SIoana Radulescu 515*34ff6846SIoana Radulescu int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io, 516*34ff6846SIoana Radulescu u32 cmd_flags, 517*34ff6846SIoana Radulescu u16 token, 518*34ff6846SIoana Radulescu int en); 519*34ff6846SIoana Radulescu 520*34ff6846SIoana Radulescu int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io, 521*34ff6846SIoana Radulescu u32 cmd_flags, 522*34ff6846SIoana Radulescu u16 token, 523*34ff6846SIoana Radulescu int *en); 524*34ff6846SIoana Radulescu 525*34ff6846SIoana Radulescu int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io, 526*34ff6846SIoana Radulescu u32 cmd_flags, 527*34ff6846SIoana Radulescu u16 token, 528*34ff6846SIoana Radulescu int en); 529*34ff6846SIoana Radulescu 530*34ff6846SIoana Radulescu int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io, 531*34ff6846SIoana Radulescu u32 cmd_flags, 532*34ff6846SIoana Radulescu u16 token, 533*34ff6846SIoana Radulescu int *en); 534*34ff6846SIoana Radulescu 535*34ff6846SIoana Radulescu int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io, 536*34ff6846SIoana Radulescu u32 cmd_flags, 537*34ff6846SIoana Radulescu u16 token, 538*34ff6846SIoana Radulescu const u8 mac_addr[6]); 539*34ff6846SIoana Radulescu 540*34ff6846SIoana Radulescu int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io, 541*34ff6846SIoana Radulescu u32 cmd_flags, 542*34ff6846SIoana Radulescu u16 token, 543*34ff6846SIoana Radulescu u8 mac_addr[6]); 544*34ff6846SIoana Radulescu 545*34ff6846SIoana Radulescu int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io, 546*34ff6846SIoana Radulescu u32 cm_flags, 547*34ff6846SIoana Radulescu u16 token, 548*34ff6846SIoana Radulescu u8 mac_addr[6]); 549*34ff6846SIoana Radulescu 550*34ff6846SIoana Radulescu int dpni_add_mac_addr(struct fsl_mc_io *mc_io, 551*34ff6846SIoana Radulescu u32 cmd_flags, 552*34ff6846SIoana Radulescu u16 token, 553*34ff6846SIoana Radulescu const u8 mac_addr[6]); 554*34ff6846SIoana Radulescu 555*34ff6846SIoana Radulescu int dpni_remove_mac_addr(struct fsl_mc_io *mc_io, 556*34ff6846SIoana Radulescu u32 cmd_flags, 557*34ff6846SIoana Radulescu u16 token, 558*34ff6846SIoana Radulescu const u8 mac_addr[6]); 559*34ff6846SIoana Radulescu 560*34ff6846SIoana Radulescu int dpni_clear_mac_filters(struct fsl_mc_io *mc_io, 561*34ff6846SIoana Radulescu u32 cmd_flags, 562*34ff6846SIoana Radulescu u16 token, 563*34ff6846SIoana Radulescu int unicast, 564*34ff6846SIoana Radulescu int multicast); 565*34ff6846SIoana Radulescu 566*34ff6846SIoana Radulescu /** 567*34ff6846SIoana Radulescu * enum dpni_dist_mode - DPNI distribution mode 568*34ff6846SIoana Radulescu * @DPNI_DIST_MODE_NONE: No distribution 569*34ff6846SIoana Radulescu * @DPNI_DIST_MODE_HASH: Use hash distribution; only relevant if 570*34ff6846SIoana Radulescu * the 'DPNI_OPT_DIST_HASH' option was set at DPNI creation 571*34ff6846SIoana Radulescu * @DPNI_DIST_MODE_FS: Use explicit flow steering; only relevant if 572*34ff6846SIoana Radulescu * the 'DPNI_OPT_DIST_FS' option was set at DPNI creation 573*34ff6846SIoana Radulescu */ 574*34ff6846SIoana Radulescu enum dpni_dist_mode { 575*34ff6846SIoana Radulescu DPNI_DIST_MODE_NONE = 0, 576*34ff6846SIoana Radulescu DPNI_DIST_MODE_HASH = 1, 577*34ff6846SIoana Radulescu DPNI_DIST_MODE_FS = 2 578*34ff6846SIoana Radulescu }; 579*34ff6846SIoana Radulescu 580*34ff6846SIoana Radulescu /** 581*34ff6846SIoana Radulescu * enum dpni_fs_miss_action - DPNI Flow Steering miss action 582*34ff6846SIoana Radulescu * @DPNI_FS_MISS_DROP: In case of no-match, drop the frame 583*34ff6846SIoana Radulescu * @DPNI_FS_MISS_EXPLICIT_FLOWID: In case of no-match, use explicit flow-id 584*34ff6846SIoana Radulescu * @DPNI_FS_MISS_HASH: In case of no-match, distribute using hash 585*34ff6846SIoana Radulescu */ 586*34ff6846SIoana Radulescu enum dpni_fs_miss_action { 587*34ff6846SIoana Radulescu DPNI_FS_MISS_DROP = 0, 588*34ff6846SIoana Radulescu DPNI_FS_MISS_EXPLICIT_FLOWID = 1, 589*34ff6846SIoana Radulescu DPNI_FS_MISS_HASH = 2 590*34ff6846SIoana Radulescu }; 591*34ff6846SIoana Radulescu 592*34ff6846SIoana Radulescu /** 593*34ff6846SIoana Radulescu * struct dpni_fs_tbl_cfg - Flow Steering table configuration 594*34ff6846SIoana Radulescu * @miss_action: Miss action selection 595*34ff6846SIoana Radulescu * @default_flow_id: Used when 'miss_action = DPNI_FS_MISS_EXPLICIT_FLOWID' 596*34ff6846SIoana Radulescu */ 597*34ff6846SIoana Radulescu struct dpni_fs_tbl_cfg { 598*34ff6846SIoana Radulescu enum dpni_fs_miss_action miss_action; 599*34ff6846SIoana Radulescu u16 default_flow_id; 600*34ff6846SIoana Radulescu }; 601*34ff6846SIoana Radulescu 602*34ff6846SIoana Radulescu int dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, 603*34ff6846SIoana Radulescu u8 *key_cfg_buf); 604*34ff6846SIoana Radulescu 605*34ff6846SIoana Radulescu /** 606*34ff6846SIoana Radulescu * struct dpni_rx_tc_dist_cfg - Rx traffic class distribution configuration 607*34ff6846SIoana Radulescu * @dist_size: Set the distribution size; 608*34ff6846SIoana Radulescu * supported values: 1,2,3,4,6,7,8,12,14,16,24,28,32,48,56,64,96, 609*34ff6846SIoana Radulescu * 112,128,192,224,256,384,448,512,768,896,1024 610*34ff6846SIoana Radulescu * @dist_mode: Distribution mode 611*34ff6846SIoana Radulescu * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with 612*34ff6846SIoana Radulescu * the extractions to be used for the distribution key by calling 613*34ff6846SIoana Radulescu * dpni_prepare_key_cfg() relevant only when 614*34ff6846SIoana Radulescu * 'dist_mode != DPNI_DIST_MODE_NONE', otherwise it can be '0' 615*34ff6846SIoana Radulescu * @fs_cfg: Flow Steering table configuration; only relevant if 616*34ff6846SIoana Radulescu * 'dist_mode = DPNI_DIST_MODE_FS' 617*34ff6846SIoana Radulescu */ 618*34ff6846SIoana Radulescu struct dpni_rx_tc_dist_cfg { 619*34ff6846SIoana Radulescu u16 dist_size; 620*34ff6846SIoana Radulescu enum dpni_dist_mode dist_mode; 621*34ff6846SIoana Radulescu u64 key_cfg_iova; 622*34ff6846SIoana Radulescu struct dpni_fs_tbl_cfg fs_cfg; 623*34ff6846SIoana Radulescu }; 624*34ff6846SIoana Radulescu 625*34ff6846SIoana Radulescu int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io, 626*34ff6846SIoana Radulescu u32 cmd_flags, 627*34ff6846SIoana Radulescu u16 token, 628*34ff6846SIoana Radulescu u8 tc_id, 629*34ff6846SIoana Radulescu const struct dpni_rx_tc_dist_cfg *cfg); 630*34ff6846SIoana Radulescu 631*34ff6846SIoana Radulescu /** 632*34ff6846SIoana Radulescu * enum dpni_dest - DPNI destination types 633*34ff6846SIoana Radulescu * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and 634*34ff6846SIoana Radulescu * does not generate FQDAN notifications; user is expected to 635*34ff6846SIoana Radulescu * dequeue from the queue based on polling or other user-defined 636*34ff6846SIoana Radulescu * method 637*34ff6846SIoana Radulescu * @DPNI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN 638*34ff6846SIoana Radulescu * notifications to the specified DPIO; user is expected to dequeue 639*34ff6846SIoana Radulescu * from the queue only after notification is received 640*34ff6846SIoana Radulescu * @DPNI_DEST_DPCON: The queue is set in schedule mode and does not generate 641*34ff6846SIoana Radulescu * FQDAN notifications, but is connected to the specified DPCON 642*34ff6846SIoana Radulescu * object; user is expected to dequeue from the DPCON channel 643*34ff6846SIoana Radulescu */ 644*34ff6846SIoana Radulescu enum dpni_dest { 645*34ff6846SIoana Radulescu DPNI_DEST_NONE = 0, 646*34ff6846SIoana Radulescu DPNI_DEST_DPIO = 1, 647*34ff6846SIoana Radulescu DPNI_DEST_DPCON = 2 648*34ff6846SIoana Radulescu }; 649*34ff6846SIoana Radulescu 650*34ff6846SIoana Radulescu /** 651*34ff6846SIoana Radulescu * struct dpni_queue - Queue structure 652*34ff6846SIoana Radulescu * @destination - Destination structure 653*34ff6846SIoana Radulescu * @destination.id: ID of the destination, only relevant if DEST_TYPE is > 0. 654*34ff6846SIoana Radulescu * Identifies either a DPIO or a DPCON object. 655*34ff6846SIoana Radulescu * Not relevant for Tx queues. 656*34ff6846SIoana Radulescu * @destination.type: May be one of the following: 657*34ff6846SIoana Radulescu * 0 - No destination, queue can be manually 658*34ff6846SIoana Radulescu * queried, but will not push traffic or 659*34ff6846SIoana Radulescu * notifications to a DPIO; 660*34ff6846SIoana Radulescu * 1 - The destination is a DPIO. When traffic 661*34ff6846SIoana Radulescu * becomes available in the queue a FQDAN 662*34ff6846SIoana Radulescu * (FQ data available notification) will be 663*34ff6846SIoana Radulescu * generated to selected DPIO; 664*34ff6846SIoana Radulescu * 2 - The destination is a DPCON. The queue is 665*34ff6846SIoana Radulescu * associated with a DPCON object for the 666*34ff6846SIoana Radulescu * purpose of scheduling between multiple 667*34ff6846SIoana Radulescu * queues. The DPCON may be independently 668*34ff6846SIoana Radulescu * configured to generate notifications. 669*34ff6846SIoana Radulescu * Not relevant for Tx queues. 670*34ff6846SIoana Radulescu * @destination.hold_active: Hold active, maintains a queue scheduled for longer 671*34ff6846SIoana Radulescu * in a DPIO during dequeue to reduce spread of traffic. 672*34ff6846SIoana Radulescu * Only relevant if queues are 673*34ff6846SIoana Radulescu * not affined to a single DPIO. 674*34ff6846SIoana Radulescu * @user_context: User data, presented to the user along with any frames 675*34ff6846SIoana Radulescu * from this queue. Not relevant for Tx queues. 676*34ff6846SIoana Radulescu * @flc: FD FLow Context structure 677*34ff6846SIoana Radulescu * @flc.value: Default FLC value for traffic dequeued from 678*34ff6846SIoana Radulescu * this queue. Please check description of FD 679*34ff6846SIoana Radulescu * structure for more information. 680*34ff6846SIoana Radulescu * Note that FLC values set using dpni_add_fs_entry, 681*34ff6846SIoana Radulescu * if any, take precedence over values per queue. 682*34ff6846SIoana Radulescu * @flc.stash_control: Boolean, indicates whether the 6 lowest 683*34ff6846SIoana Radulescu * - significant bits are used for stash control. 684*34ff6846SIoana Radulescu * significant bits are used for stash control. If set, the 6 685*34ff6846SIoana Radulescu * least significant bits in value are interpreted as follows: 686*34ff6846SIoana Radulescu * - bits 0-1: indicates the number of 64 byte units of context 687*34ff6846SIoana Radulescu * that are stashed. FLC value is interpreted as a memory address 688*34ff6846SIoana Radulescu * in this case, excluding the 6 LS bits. 689*34ff6846SIoana Radulescu * - bits 2-3: indicates the number of 64 byte units of frame 690*34ff6846SIoana Radulescu * annotation to be stashed. Annotation is placed at FD[ADDR]. 691*34ff6846SIoana Radulescu * - bits 4-5: indicates the number of 64 byte units of frame 692*34ff6846SIoana Radulescu * data to be stashed. Frame data is placed at FD[ADDR] + 693*34ff6846SIoana Radulescu * FD[OFFSET]. 694*34ff6846SIoana Radulescu * For more details check the Frame Descriptor section in the 695*34ff6846SIoana Radulescu * hardware documentation. 696*34ff6846SIoana Radulescu */ 697*34ff6846SIoana Radulescu struct dpni_queue { 698*34ff6846SIoana Radulescu struct { 699*34ff6846SIoana Radulescu u16 id; 700*34ff6846SIoana Radulescu enum dpni_dest type; 701*34ff6846SIoana Radulescu char hold_active; 702*34ff6846SIoana Radulescu u8 priority; 703*34ff6846SIoana Radulescu } destination; 704*34ff6846SIoana Radulescu u64 user_context; 705*34ff6846SIoana Radulescu struct { 706*34ff6846SIoana Radulescu u64 value; 707*34ff6846SIoana Radulescu char stash_control; 708*34ff6846SIoana Radulescu } flc; 709*34ff6846SIoana Radulescu }; 710*34ff6846SIoana Radulescu 711*34ff6846SIoana Radulescu /** 712*34ff6846SIoana Radulescu * struct dpni_queue_id - Queue identification, used for enqueue commands 713*34ff6846SIoana Radulescu * or queue control 714*34ff6846SIoana Radulescu * @fqid: FQID used for enqueueing to and/or configuration of this specific FQ 715*34ff6846SIoana Radulescu * @qdbin: Queueing bin, used to enqueue using QDID, DQBIN, QPRI. Only relevant 716*34ff6846SIoana Radulescu * for Tx queues. 717*34ff6846SIoana Radulescu */ 718*34ff6846SIoana Radulescu struct dpni_queue_id { 719*34ff6846SIoana Radulescu u32 fqid; 720*34ff6846SIoana Radulescu u16 qdbin; 721*34ff6846SIoana Radulescu }; 722*34ff6846SIoana Radulescu 723*34ff6846SIoana Radulescu /** 724*34ff6846SIoana Radulescu * Set User Context 725*34ff6846SIoana Radulescu */ 726*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_USER_CTX 0x00000001 727*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_DEST 0x00000002 728*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_FLC 0x00000004 729*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_HOLD_ACTIVE 0x00000008 730*34ff6846SIoana Radulescu 731*34ff6846SIoana Radulescu int dpni_set_queue(struct fsl_mc_io *mc_io, 732*34ff6846SIoana Radulescu u32 cmd_flags, 733*34ff6846SIoana Radulescu u16 token, 734*34ff6846SIoana Radulescu enum dpni_queue_type qtype, 735*34ff6846SIoana Radulescu u8 tc, 736*34ff6846SIoana Radulescu u8 index, 737*34ff6846SIoana Radulescu u8 options, 738*34ff6846SIoana Radulescu const struct dpni_queue *queue); 739*34ff6846SIoana Radulescu 740*34ff6846SIoana Radulescu int dpni_get_queue(struct fsl_mc_io *mc_io, 741*34ff6846SIoana Radulescu u32 cmd_flags, 742*34ff6846SIoana Radulescu u16 token, 743*34ff6846SIoana Radulescu enum dpni_queue_type qtype, 744*34ff6846SIoana Radulescu u8 tc, 745*34ff6846SIoana Radulescu u8 index, 746*34ff6846SIoana Radulescu struct dpni_queue *queue, 747*34ff6846SIoana Radulescu struct dpni_queue_id *qid); 748*34ff6846SIoana Radulescu 749*34ff6846SIoana Radulescu /** 750*34ff6846SIoana Radulescu * enum dpni_congestion_unit - DPNI congestion units 751*34ff6846SIoana Radulescu * @DPNI_CONGESTION_UNIT_BYTES: bytes units 752*34ff6846SIoana Radulescu * @DPNI_CONGESTION_UNIT_FRAMES: frames units 753*34ff6846SIoana Radulescu */ 754*34ff6846SIoana Radulescu enum dpni_congestion_unit { 755*34ff6846SIoana Radulescu DPNI_CONGESTION_UNIT_BYTES = 0, 756*34ff6846SIoana Radulescu DPNI_CONGESTION_UNIT_FRAMES 757*34ff6846SIoana Radulescu }; 758*34ff6846SIoana Radulescu 759*34ff6846SIoana Radulescu /** 760*34ff6846SIoana Radulescu * enum dpni_congestion_point - Structure representing congestion point 761*34ff6846SIoana Radulescu * @DPNI_CP_QUEUE: Set taildrop per queue, identified by QUEUE_TYPE, TC and 762*34ff6846SIoana Radulescu * QUEUE_INDEX 763*34ff6846SIoana Radulescu * @DPNI_CP_GROUP: Set taildrop per queue group. Depending on options used to 764*34ff6846SIoana Radulescu * define the DPNI this can be either per TC (default) or per 765*34ff6846SIoana Radulescu * interface (DPNI_OPT_SHARED_CONGESTION set at DPNI create). 766*34ff6846SIoana Radulescu * QUEUE_INDEX is ignored if this type is used. 767*34ff6846SIoana Radulescu */ 768*34ff6846SIoana Radulescu enum dpni_congestion_point { 769*34ff6846SIoana Radulescu DPNI_CP_QUEUE, 770*34ff6846SIoana Radulescu DPNI_CP_GROUP, 771*34ff6846SIoana Radulescu }; 772*34ff6846SIoana Radulescu 773*34ff6846SIoana Radulescu /** 774*34ff6846SIoana Radulescu * struct dpni_taildrop - Structure representing the taildrop 775*34ff6846SIoana Radulescu * @enable: Indicates whether the taildrop is active or not. 776*34ff6846SIoana Radulescu * @units: Indicates the unit of THRESHOLD. Queue taildrop only supports 777*34ff6846SIoana Radulescu * byte units, this field is ignored and assumed = 0 if 778*34ff6846SIoana Radulescu * CONGESTION_POINT is 0. 779*34ff6846SIoana Radulescu * @threshold: Threshold value, in units identified by UNITS field. Value 0 780*34ff6846SIoana Radulescu * cannot be used as a valid taildrop threshold, THRESHOLD must 781*34ff6846SIoana Radulescu * be > 0 if the taildrop is enabled. 782*34ff6846SIoana Radulescu */ 783*34ff6846SIoana Radulescu struct dpni_taildrop { 784*34ff6846SIoana Radulescu char enable; 785*34ff6846SIoana Radulescu enum dpni_congestion_unit units; 786*34ff6846SIoana Radulescu u32 threshold; 787*34ff6846SIoana Radulescu }; 788*34ff6846SIoana Radulescu 789*34ff6846SIoana Radulescu int dpni_set_taildrop(struct fsl_mc_io *mc_io, 790*34ff6846SIoana Radulescu u32 cmd_flags, 791*34ff6846SIoana Radulescu u16 token, 792*34ff6846SIoana Radulescu enum dpni_congestion_point cg_point, 793*34ff6846SIoana Radulescu enum dpni_queue_type q_type, 794*34ff6846SIoana Radulescu u8 tc, 795*34ff6846SIoana Radulescu u8 q_index, 796*34ff6846SIoana Radulescu struct dpni_taildrop *taildrop); 797*34ff6846SIoana Radulescu 798*34ff6846SIoana Radulescu int dpni_get_taildrop(struct fsl_mc_io *mc_io, 799*34ff6846SIoana Radulescu u32 cmd_flags, 800*34ff6846SIoana Radulescu u16 token, 801*34ff6846SIoana Radulescu enum dpni_congestion_point cg_point, 802*34ff6846SIoana Radulescu enum dpni_queue_type q_type, 803*34ff6846SIoana Radulescu u8 tc, 804*34ff6846SIoana Radulescu u8 q_index, 805*34ff6846SIoana Radulescu struct dpni_taildrop *taildrop); 806*34ff6846SIoana Radulescu 807*34ff6846SIoana Radulescu /** 808*34ff6846SIoana Radulescu * struct dpni_rule_cfg - Rule configuration for table lookup 809*34ff6846SIoana Radulescu * @key_iova: I/O virtual address of the key (must be in DMA-able memory) 810*34ff6846SIoana Radulescu * @mask_iova: I/O virtual address of the mask (must be in DMA-able memory) 811*34ff6846SIoana Radulescu * @key_size: key and mask size (in bytes) 812*34ff6846SIoana Radulescu */ 813*34ff6846SIoana Radulescu struct dpni_rule_cfg { 814*34ff6846SIoana Radulescu u64 key_iova; 815*34ff6846SIoana Radulescu u64 mask_iova; 816*34ff6846SIoana Radulescu u8 key_size; 817*34ff6846SIoana Radulescu }; 818*34ff6846SIoana Radulescu 819*34ff6846SIoana Radulescu int dpni_get_api_version(struct fsl_mc_io *mc_io, 820*34ff6846SIoana Radulescu u32 cmd_flags, 821*34ff6846SIoana Radulescu u16 *major_ver, 822*34ff6846SIoana Radulescu u16 *minor_ver); 823*34ff6846SIoana Radulescu 824*34ff6846SIoana Radulescu #endif /* __FSL_DPNI_H */ 825