1131a75b6SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2e6b82573SHemant Agrawal * 3e6b82573SHemant Agrawal * Copyright 2013-2016 Freescale Semiconductor Inc. 4*591200efSGagandeep Singh * Copyright 2016-2023 NXP 5e6b82573SHemant Agrawal * 6e6b82573SHemant Agrawal */ 7e6b82573SHemant Agrawal #include <fsl_mc_sys.h> 8e6b82573SHemant Agrawal #include <fsl_mc_cmd.h> 9e6b82573SHemant Agrawal #include <fsl_dpni.h> 10e6b82573SHemant Agrawal #include <fsl_dpni_cmd.h> 11e6b82573SHemant Agrawal 1216bbc98aSShreyansh Jain /** 1316bbc98aSShreyansh Jain * dpni_open() - Open a control session for the specified object 1416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 1516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1616bbc98aSShreyansh Jain * @dpni_id: DPNI unique ID 1716bbc98aSShreyansh Jain * @token: Returned token; use in subsequent API calls 1816bbc98aSShreyansh Jain * 1916bbc98aSShreyansh Jain * This function can be used to open a control session for an 2016bbc98aSShreyansh Jain * already created object; an object may have been declared in 2116bbc98aSShreyansh Jain * the DPL or by calling the dpni_create() function. 2216bbc98aSShreyansh Jain * This function returns a unique authentication token, 2316bbc98aSShreyansh Jain * associated with the specific object ID and the specific MC 2416bbc98aSShreyansh Jain * portal; this token must be used in all subsequent commands for 2516bbc98aSShreyansh Jain * this specific object. 2616bbc98aSShreyansh Jain * 2716bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 2816bbc98aSShreyansh Jain */ 29e6b82573SHemant Agrawal int dpni_open(struct fsl_mc_io *mc_io, 30e6b82573SHemant Agrawal uint32_t cmd_flags, 31e6b82573SHemant Agrawal int dpni_id, 32e6b82573SHemant Agrawal uint16_t *token) 33e6b82573SHemant Agrawal { 34e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 3516bbc98aSShreyansh Jain struct dpni_cmd_open *cmd_params; 3616bbc98aSShreyansh Jain 37e6b82573SHemant Agrawal int err; 38e6b82573SHemant Agrawal 39e6b82573SHemant Agrawal /* prepare command */ 40e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN, 41e6b82573SHemant Agrawal cmd_flags, 42e6b82573SHemant Agrawal 0); 4316bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_open *)cmd.params; 4416bbc98aSShreyansh Jain cmd_params->dpni_id = cpu_to_le32(dpni_id); 45e6b82573SHemant Agrawal 46e6b82573SHemant Agrawal /* send command to mc*/ 47e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 48e6b82573SHemant Agrawal if (err) 49e6b82573SHemant Agrawal return err; 50e6b82573SHemant Agrawal 51e6b82573SHemant Agrawal /* retrieve response parameters */ 5216bbc98aSShreyansh Jain *token = mc_cmd_hdr_read_token(&cmd); 53e6b82573SHemant Agrawal 54e6b82573SHemant Agrawal return 0; 55e6b82573SHemant Agrawal } 56e6b82573SHemant Agrawal 5716bbc98aSShreyansh Jain /** 5816bbc98aSShreyansh Jain * dpni_close() - Close the control session of the object 5916bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 6016bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 6116bbc98aSShreyansh Jain * @token: Token of DPNI object 6216bbc98aSShreyansh Jain * 6316bbc98aSShreyansh Jain * After this function is called, no further operations are 6416bbc98aSShreyansh Jain * allowed on the object without opening a new control session. 6516bbc98aSShreyansh Jain * 6616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 6716bbc98aSShreyansh Jain */ 68e6b82573SHemant Agrawal int dpni_close(struct fsl_mc_io *mc_io, 69e6b82573SHemant Agrawal uint32_t cmd_flags, 70e6b82573SHemant Agrawal uint16_t token) 71e6b82573SHemant Agrawal { 72e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 73e6b82573SHemant Agrawal 74e6b82573SHemant Agrawal /* prepare command */ 75e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE, 76e6b82573SHemant Agrawal cmd_flags, 77e6b82573SHemant Agrawal token); 78e6b82573SHemant Agrawal 79e6b82573SHemant Agrawal /* send command to mc*/ 80e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 81e6b82573SHemant Agrawal } 82e6b82573SHemant Agrawal 8316bbc98aSShreyansh Jain /** 8416bbc98aSShreyansh Jain * dpni_create() - Create the DPNI object 8516bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 8616bbc98aSShreyansh Jain * @dprc_token: Parent container token; '0' for default container 8716bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 8816bbc98aSShreyansh Jain * @cfg: Configuration structure 8916bbc98aSShreyansh Jain * @obj_id: Returned object id 9016bbc98aSShreyansh Jain * 9116bbc98aSShreyansh Jain * Create the DPNI object, allocate required resources and 9216bbc98aSShreyansh Jain * perform required initialization. 9316bbc98aSShreyansh Jain * 9416bbc98aSShreyansh Jain * The object can be created either by declaring it in the 9516bbc98aSShreyansh Jain * DPL file, or by calling this function. 9616bbc98aSShreyansh Jain * 9716bbc98aSShreyansh Jain * The function accepts an authentication token of a parent 9816bbc98aSShreyansh Jain * container that this object should be assigned to. The token 9916bbc98aSShreyansh Jain * can be '0' so the object will be assigned to the default container. 10016bbc98aSShreyansh Jain * The newly created object can be opened with the returned 10116bbc98aSShreyansh Jain * object id and using the container's associated tokens and MC portals. 10216bbc98aSShreyansh Jain * 10316bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 10416bbc98aSShreyansh Jain */ 105e6b82573SHemant Agrawal int dpni_create(struct fsl_mc_io *mc_io, 106e6b82573SHemant Agrawal uint16_t dprc_token, 107e6b82573SHemant Agrawal uint32_t cmd_flags, 108e6b82573SHemant Agrawal const struct dpni_cfg *cfg, 109e6b82573SHemant Agrawal uint32_t *obj_id) 110e6b82573SHemant Agrawal { 11116bbc98aSShreyansh Jain struct dpni_cmd_create *cmd_params; 112e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 113e6b82573SHemant Agrawal int err; 114e6b82573SHemant Agrawal 115e6b82573SHemant Agrawal /* prepare command */ 116e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE, 117e6b82573SHemant Agrawal cmd_flags, 118e6b82573SHemant Agrawal dprc_token); 11916bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_create *)cmd.params; 12016bbc98aSShreyansh Jain cmd_params->options = cpu_to_le32(cfg->options); 12116bbc98aSShreyansh Jain cmd_params->num_queues = cfg->num_queues; 12216bbc98aSShreyansh Jain cmd_params->num_tcs = cfg->num_tcs; 12316bbc98aSShreyansh Jain cmd_params->mac_filter_entries = cfg->mac_filter_entries; 12425fea082SHemant Agrawal cmd_params->num_rx_tcs = cfg->num_rx_tcs; 12516bbc98aSShreyansh Jain cmd_params->vlan_filter_entries = cfg->vlan_filter_entries; 12616bbc98aSShreyansh Jain cmd_params->qos_entries = cfg->qos_entries; 12716bbc98aSShreyansh Jain cmd_params->fs_entries = cpu_to_le16(cfg->fs_entries); 12855984a9bSShreyansh Jain cmd_params->num_cgs = cfg->num_cgs; 1292cb2abf3SHemant Agrawal cmd_params->num_opr = cfg->num_opr; 1302cb2abf3SHemant Agrawal cmd_params->dist_key_size = cfg->dist_key_size; 131f48cd6c6SNipun Gupta cmd_params->num_channels = cfg->num_channels; 132e6b82573SHemant Agrawal 133e6b82573SHemant Agrawal /* send command to mc*/ 134e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 135e6b82573SHemant Agrawal if (err) 136e6b82573SHemant Agrawal return err; 137e6b82573SHemant Agrawal 138e6b82573SHemant Agrawal /* retrieve response parameters */ 13916bbc98aSShreyansh Jain *obj_id = mc_cmd_read_object_id(&cmd); 140e6b82573SHemant Agrawal 141e6b82573SHemant Agrawal return 0; 142e6b82573SHemant Agrawal } 143e6b82573SHemant Agrawal 14416bbc98aSShreyansh Jain /** 14516bbc98aSShreyansh Jain * dpni_destroy() - Destroy the DPNI object and release all its resources. 14616bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 14716bbc98aSShreyansh Jain * @dprc_token: Parent container token; '0' for default container 14816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 14916bbc98aSShreyansh Jain * @object_id: The object id; it must be a valid id within the container that 15016bbc98aSShreyansh Jain * created this object; 15116bbc98aSShreyansh Jain * 15216bbc98aSShreyansh Jain * The function accepts the authentication token of the parent container that 15316bbc98aSShreyansh Jain * created the object (not the one that currently owns the object). The object 15416bbc98aSShreyansh Jain * is searched within parent using the provided 'object_id'. 15516bbc98aSShreyansh Jain * All tokens to the object must be closed before calling destroy. 15616bbc98aSShreyansh Jain * 15716bbc98aSShreyansh Jain * Return: '0' on Success; error code otherwise. 15816bbc98aSShreyansh Jain */ 159e6b82573SHemant Agrawal int dpni_destroy(struct fsl_mc_io *mc_io, 160e6b82573SHemant Agrawal uint16_t dprc_token, 161e6b82573SHemant Agrawal uint32_t cmd_flags, 162e6b82573SHemant Agrawal uint32_t object_id) 163e6b82573SHemant Agrawal { 16416bbc98aSShreyansh Jain struct dpni_cmd_destroy *cmd_params; 165e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 166e6b82573SHemant Agrawal 167e6b82573SHemant Agrawal /* prepare command */ 168e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY, 169e6b82573SHemant Agrawal cmd_flags, 170e6b82573SHemant Agrawal dprc_token); 171e6b82573SHemant Agrawal /* set object id to destroy */ 17216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_destroy *)cmd.params; 17316bbc98aSShreyansh Jain cmd_params->dpsw_id = cpu_to_le32(object_id); 17416bbc98aSShreyansh Jain 175e6b82573SHemant Agrawal /* send command to mc*/ 176e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 177e6b82573SHemant Agrawal } 178e6b82573SHemant Agrawal 17916bbc98aSShreyansh Jain /** 18016bbc98aSShreyansh Jain * dpni_set_pools() - Set buffer pools configuration 18116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 18216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 18316bbc98aSShreyansh Jain * @token: Token of DPNI object 18416bbc98aSShreyansh Jain * @cfg: Buffer pools configuration 18516bbc98aSShreyansh Jain * 18616bbc98aSShreyansh Jain * mandatory for DPNI operation 18716bbc98aSShreyansh Jain * warning:Allowed only when DPNI is disabled 18816bbc98aSShreyansh Jain * 18916bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 19016bbc98aSShreyansh Jain */ 191e6b82573SHemant Agrawal int dpni_set_pools(struct fsl_mc_io *mc_io, 192e6b82573SHemant Agrawal uint32_t cmd_flags, 193e6b82573SHemant Agrawal uint16_t token, 194e6b82573SHemant Agrawal const struct dpni_pools_cfg *cfg) 195e6b82573SHemant Agrawal { 196e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 19716bbc98aSShreyansh Jain struct dpni_cmd_set_pools *cmd_params; 19816bbc98aSShreyansh Jain int i; 199e6b82573SHemant Agrawal 200e6b82573SHemant Agrawal /* prepare command */ 201e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS, 202e6b82573SHemant Agrawal cmd_flags, 203e6b82573SHemant Agrawal token); 20416bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_pools *)cmd.params; 20516bbc98aSShreyansh Jain cmd_params->num_dpbp = cfg->num_dpbp; 20696f7bfe8SSachin Saxena cmd_params->pool_options = cfg->pool_options; 207f48cd6c6SNipun Gupta for (i = 0; i < DPNI_MAX_DPBP; i++) { 20816bbc98aSShreyansh Jain cmd_params->pool[i].dpbp_id = 20916bbc98aSShreyansh Jain cpu_to_le16(cfg->pools[i].dpbp_id); 21016bbc98aSShreyansh Jain cmd_params->pool[i].priority_mask = 21116bbc98aSShreyansh Jain cfg->pools[i].priority_mask; 21216bbc98aSShreyansh Jain cmd_params->buffer_size[i] = 21316bbc98aSShreyansh Jain cpu_to_le16(cfg->pools[i].buffer_size); 21416bbc98aSShreyansh Jain cmd_params->backup_pool_mask |= 21516bbc98aSShreyansh Jain DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i); 21616bbc98aSShreyansh Jain } 217e6b82573SHemant Agrawal 218e6b82573SHemant Agrawal /* send command to mc*/ 219e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 220e6b82573SHemant Agrawal } 221e6b82573SHemant Agrawal 22216bbc98aSShreyansh Jain /** 22316bbc98aSShreyansh Jain * dpni_enable() - Enable the DPNI, allow sending and receiving frames. 22416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 22516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 22616bbc98aSShreyansh Jain * @token: Token of DPNI object 22716bbc98aSShreyansh Jain * 22816bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 22916bbc98aSShreyansh Jain */ 230e6b82573SHemant Agrawal int dpni_enable(struct fsl_mc_io *mc_io, 231e6b82573SHemant Agrawal uint32_t cmd_flags, 232e6b82573SHemant Agrawal uint16_t token) 233e6b82573SHemant Agrawal { 234e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 235e6b82573SHemant Agrawal 236e6b82573SHemant Agrawal /* prepare command */ 237e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE, 238e6b82573SHemant Agrawal cmd_flags, 239e6b82573SHemant Agrawal token); 240e6b82573SHemant Agrawal 241e6b82573SHemant Agrawal /* send command to mc*/ 242e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 243e6b82573SHemant Agrawal } 244e6b82573SHemant Agrawal 24516bbc98aSShreyansh Jain /** 24616bbc98aSShreyansh Jain * dpni_disable() - Disable the DPNI, stop sending and receiving frames. 24716bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 24816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 24916bbc98aSShreyansh Jain * @token: Token of DPNI object 25016bbc98aSShreyansh Jain * 25116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 25216bbc98aSShreyansh Jain */ 253e6b82573SHemant Agrawal int dpni_disable(struct fsl_mc_io *mc_io, 254e6b82573SHemant Agrawal uint32_t cmd_flags, 255e6b82573SHemant Agrawal uint16_t token) 256e6b82573SHemant Agrawal { 257e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 258e6b82573SHemant Agrawal 259e6b82573SHemant Agrawal /* prepare command */ 260e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE, 261e6b82573SHemant Agrawal cmd_flags, 262e6b82573SHemant Agrawal token); 263e6b82573SHemant Agrawal 264e6b82573SHemant Agrawal /* send command to mc*/ 265e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 266e6b82573SHemant Agrawal } 267e6b82573SHemant Agrawal 26816bbc98aSShreyansh Jain /** 26916bbc98aSShreyansh Jain * dpni_is_enabled() - Check if the DPNI is enabled. 27016bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 27116bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 27216bbc98aSShreyansh Jain * @token: Token of DPNI object 27316bbc98aSShreyansh Jain * @en: Returns '1' if object is enabled; '0' otherwise 27416bbc98aSShreyansh Jain * 27516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 27616bbc98aSShreyansh Jain */ 277e6b82573SHemant Agrawal int dpni_is_enabled(struct fsl_mc_io *mc_io, 278e6b82573SHemant Agrawal uint32_t cmd_flags, 279e6b82573SHemant Agrawal uint16_t token, 280e6b82573SHemant Agrawal int *en) 281e6b82573SHemant Agrawal { 282e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 28316bbc98aSShreyansh Jain struct dpni_rsp_is_enabled *rsp_params; 284e6b82573SHemant Agrawal int err; 28516bbc98aSShreyansh Jain 286e6b82573SHemant Agrawal /* prepare command */ 28716bbc98aSShreyansh Jain cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED, 28816bbc98aSShreyansh Jain cmd_flags, 289e6b82573SHemant Agrawal token); 290e6b82573SHemant Agrawal 291e6b82573SHemant Agrawal /* send command to mc*/ 292e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 293e6b82573SHemant Agrawal if (err) 294e6b82573SHemant Agrawal return err; 295e6b82573SHemant Agrawal 296e6b82573SHemant Agrawal /* retrieve response parameters */ 29716bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_is_enabled *)cmd.params; 29816bbc98aSShreyansh Jain *en = dpni_get_field(rsp_params->enabled, ENABLE); 299e6b82573SHemant Agrawal 300e6b82573SHemant Agrawal return 0; 301e6b82573SHemant Agrawal } 302e6b82573SHemant Agrawal 30316bbc98aSShreyansh Jain /** 30416bbc98aSShreyansh Jain * dpni_reset() - Reset the DPNI, returns the object to initial state. 30516bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 30616bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 30716bbc98aSShreyansh Jain * @token: Token of DPNI object 30816bbc98aSShreyansh Jain * 30916bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 31016bbc98aSShreyansh Jain */ 311e6b82573SHemant Agrawal int dpni_reset(struct fsl_mc_io *mc_io, 312e6b82573SHemant Agrawal uint32_t cmd_flags, 313e6b82573SHemant Agrawal uint16_t token) 314e6b82573SHemant Agrawal { 315e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 316e6b82573SHemant Agrawal 317e6b82573SHemant Agrawal /* prepare command */ 318e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET, 319e6b82573SHemant Agrawal cmd_flags, 320e6b82573SHemant Agrawal token); 321e6b82573SHemant Agrawal 322e6b82573SHemant Agrawal /* send command to mc*/ 323e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 324e6b82573SHemant Agrawal } 325e6b82573SHemant Agrawal 32616bbc98aSShreyansh Jain /** 327c5acbb5eSHemant Agrawal * dpni_set_irq_enable() - Set overall interrupt state. 328c5acbb5eSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 329c5acbb5eSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 330c5acbb5eSHemant Agrawal * @token: Token of DPNI object 331c5acbb5eSHemant Agrawal * @irq_index: The interrupt index to configure 332c5acbb5eSHemant Agrawal * @en: Interrupt state: - enable = 1, disable = 0 333c5acbb5eSHemant Agrawal * 334c5acbb5eSHemant Agrawal * Allows GPP software to control when interrupts are generated. 335c5acbb5eSHemant Agrawal * Each interrupt can have up to 32 causes. The enable/disable control's the 336c5acbb5eSHemant Agrawal * overall interrupt state. if the interrupt is disabled no causes will cause 337c5acbb5eSHemant Agrawal * an interrupt. 338c5acbb5eSHemant Agrawal * 339c5acbb5eSHemant Agrawal * Return: '0' on Success; Error code otherwise. 340c5acbb5eSHemant Agrawal */ 341c5acbb5eSHemant Agrawal int dpni_set_irq_enable(struct fsl_mc_io *mc_io, 342c5acbb5eSHemant Agrawal uint32_t cmd_flags, 343c5acbb5eSHemant Agrawal uint16_t token, 344c5acbb5eSHemant Agrawal uint8_t irq_index, 345c5acbb5eSHemant Agrawal uint8_t en) 346c5acbb5eSHemant Agrawal { 347c5acbb5eSHemant Agrawal struct mc_command cmd = { 0 }; 348c5acbb5eSHemant Agrawal struct dpni_cmd_set_irq_enable *cmd_params; 349c5acbb5eSHemant Agrawal 350c5acbb5eSHemant Agrawal /* prepare command */ 351c5acbb5eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE, 352c5acbb5eSHemant Agrawal cmd_flags, 353c5acbb5eSHemant Agrawal token); 354c5acbb5eSHemant Agrawal cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params; 355c5acbb5eSHemant Agrawal dpni_set_field(cmd_params->enable, ENABLE, en); 356c5acbb5eSHemant Agrawal cmd_params->irq_index = irq_index; 357c5acbb5eSHemant Agrawal 358c5acbb5eSHemant Agrawal /* send command to mc*/ 359c5acbb5eSHemant Agrawal return mc_send_command(mc_io, &cmd); 360c5acbb5eSHemant Agrawal } 361c5acbb5eSHemant Agrawal 362c5acbb5eSHemant Agrawal /** 363c5acbb5eSHemant Agrawal * dpni_get_irq_enable() - Get overall interrupt state 364c5acbb5eSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 365c5acbb5eSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 366c5acbb5eSHemant Agrawal * @token: Token of DPNI object 367c5acbb5eSHemant Agrawal * @irq_index: The interrupt index to configure 368c5acbb5eSHemant Agrawal * @en: Returned interrupt state - enable = 1, disable = 0 369c5acbb5eSHemant Agrawal * 370c5acbb5eSHemant Agrawal * Return: '0' on Success; Error code otherwise. 371c5acbb5eSHemant Agrawal */ 372c5acbb5eSHemant Agrawal int dpni_get_irq_enable(struct fsl_mc_io *mc_io, 373c5acbb5eSHemant Agrawal uint32_t cmd_flags, 374c5acbb5eSHemant Agrawal uint16_t token, 375c5acbb5eSHemant Agrawal uint8_t irq_index, 376c5acbb5eSHemant Agrawal uint8_t *en) 377c5acbb5eSHemant Agrawal { 378c5acbb5eSHemant Agrawal struct mc_command cmd = { 0 }; 379c5acbb5eSHemant Agrawal struct dpni_cmd_get_irq_enable *cmd_params; 380c5acbb5eSHemant Agrawal struct dpni_rsp_get_irq_enable *rsp_params; 381c5acbb5eSHemant Agrawal 382c5acbb5eSHemant Agrawal int err; 383c5acbb5eSHemant Agrawal 384c5acbb5eSHemant Agrawal /* prepare command */ 385c5acbb5eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE, 386c5acbb5eSHemant Agrawal cmd_flags, 387c5acbb5eSHemant Agrawal token); 388c5acbb5eSHemant Agrawal cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params; 389c5acbb5eSHemant Agrawal cmd_params->irq_index = irq_index; 390c5acbb5eSHemant Agrawal 391c5acbb5eSHemant Agrawal /* send command to mc*/ 392c5acbb5eSHemant Agrawal err = mc_send_command(mc_io, &cmd); 393c5acbb5eSHemant Agrawal if (err) 394c5acbb5eSHemant Agrawal return err; 395c5acbb5eSHemant Agrawal 396c5acbb5eSHemant Agrawal /* retrieve response parameters */ 397c5acbb5eSHemant Agrawal rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params; 398c5acbb5eSHemant Agrawal *en = dpni_get_field(rsp_params->enabled, ENABLE); 399c5acbb5eSHemant Agrawal 400c5acbb5eSHemant Agrawal return 0; 401c5acbb5eSHemant Agrawal } 402c5acbb5eSHemant Agrawal 403c5acbb5eSHemant Agrawal /** 404c5acbb5eSHemant Agrawal * dpni_set_irq_mask() - Set interrupt mask. 405c5acbb5eSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 406c5acbb5eSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 407c5acbb5eSHemant Agrawal * @token: Token of DPNI object 408c5acbb5eSHemant Agrawal * @irq_index: The interrupt index to configure 409c5acbb5eSHemant Agrawal * @mask: Event mask to trigger interrupt; 410c5acbb5eSHemant Agrawal * each bit: 411c5acbb5eSHemant Agrawal * 0 = ignore event 412c5acbb5eSHemant Agrawal * 1 = consider event for asserting IRQ 413c5acbb5eSHemant Agrawal * 414c5acbb5eSHemant Agrawal * Every interrupt can have up to 32 causes and the interrupt model supports 415c5acbb5eSHemant Agrawal * masking/unmasking each cause independently 416c5acbb5eSHemant Agrawal * 417c5acbb5eSHemant Agrawal * Return: '0' on Success; Error code otherwise. 418c5acbb5eSHemant Agrawal */ 419c5acbb5eSHemant Agrawal int dpni_set_irq_mask(struct fsl_mc_io *mc_io, 420c5acbb5eSHemant Agrawal uint32_t cmd_flags, 421c5acbb5eSHemant Agrawal uint16_t token, 422c5acbb5eSHemant Agrawal uint8_t irq_index, 423c5acbb5eSHemant Agrawal uint32_t mask) 424c5acbb5eSHemant Agrawal { 425c5acbb5eSHemant Agrawal struct mc_command cmd = { 0 }; 426c5acbb5eSHemant Agrawal struct dpni_cmd_set_irq_mask *cmd_params; 427c5acbb5eSHemant Agrawal 428c5acbb5eSHemant Agrawal /* prepare command */ 429c5acbb5eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK, 430c5acbb5eSHemant Agrawal cmd_flags, 431c5acbb5eSHemant Agrawal token); 432c5acbb5eSHemant Agrawal cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params; 433c5acbb5eSHemant Agrawal cmd_params->mask = cpu_to_le32(mask); 434c5acbb5eSHemant Agrawal cmd_params->irq_index = irq_index; 435c5acbb5eSHemant Agrawal 436c5acbb5eSHemant Agrawal /* send command to mc*/ 437c5acbb5eSHemant Agrawal return mc_send_command(mc_io, &cmd); 438c5acbb5eSHemant Agrawal } 439c5acbb5eSHemant Agrawal 440c5acbb5eSHemant Agrawal /** 441c5acbb5eSHemant Agrawal * dpni_get_irq_mask() - Get interrupt mask. 442c5acbb5eSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 443c5acbb5eSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 444c5acbb5eSHemant Agrawal * @token: Token of DPNI object 445c5acbb5eSHemant Agrawal * @irq_index: The interrupt index to configure 446c5acbb5eSHemant Agrawal * @mask: Returned event mask to trigger interrupt 447c5acbb5eSHemant Agrawal * 448c5acbb5eSHemant Agrawal * Every interrupt can have up to 32 causes and the interrupt model supports 449c5acbb5eSHemant Agrawal * masking/unmasking each cause independently 450c5acbb5eSHemant Agrawal * 451c5acbb5eSHemant Agrawal * Return: '0' on Success; Error code otherwise. 452c5acbb5eSHemant Agrawal */ 453c5acbb5eSHemant Agrawal int dpni_get_irq_mask(struct fsl_mc_io *mc_io, 454c5acbb5eSHemant Agrawal uint32_t cmd_flags, 455c5acbb5eSHemant Agrawal uint16_t token, 456c5acbb5eSHemant Agrawal uint8_t irq_index, 457c5acbb5eSHemant Agrawal uint32_t *mask) 458c5acbb5eSHemant Agrawal { 459c5acbb5eSHemant Agrawal struct mc_command cmd = { 0 }; 460c5acbb5eSHemant Agrawal struct dpni_cmd_get_irq_mask *cmd_params; 461c5acbb5eSHemant Agrawal struct dpni_rsp_get_irq_mask *rsp_params; 462c5acbb5eSHemant Agrawal int err; 463c5acbb5eSHemant Agrawal 464c5acbb5eSHemant Agrawal /* prepare command */ 465c5acbb5eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK, 466c5acbb5eSHemant Agrawal cmd_flags, 467c5acbb5eSHemant Agrawal token); 468c5acbb5eSHemant Agrawal cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params; 469c5acbb5eSHemant Agrawal cmd_params->irq_index = irq_index; 470c5acbb5eSHemant Agrawal 471c5acbb5eSHemant Agrawal /* send command to mc*/ 472c5acbb5eSHemant Agrawal err = mc_send_command(mc_io, &cmd); 473c5acbb5eSHemant Agrawal if (err) 474c5acbb5eSHemant Agrawal return err; 475c5acbb5eSHemant Agrawal 476c5acbb5eSHemant Agrawal /* retrieve response parameters */ 477c5acbb5eSHemant Agrawal rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params; 478c5acbb5eSHemant Agrawal *mask = le32_to_cpu(rsp_params->mask); 479c5acbb5eSHemant Agrawal 480c5acbb5eSHemant Agrawal return 0; 481c5acbb5eSHemant Agrawal } 482c5acbb5eSHemant Agrawal 483c5acbb5eSHemant Agrawal /** 484c5acbb5eSHemant Agrawal * dpni_get_irq_status() - Get the current status of any pending interrupts. 485c5acbb5eSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 486c5acbb5eSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 487c5acbb5eSHemant Agrawal * @token: Token of DPNI object 488c5acbb5eSHemant Agrawal * @irq_index: The interrupt index to configure 489c5acbb5eSHemant Agrawal * @status: Returned interrupts status - one bit per cause: 490c5acbb5eSHemant Agrawal * 0 = no interrupt pending 491c5acbb5eSHemant Agrawal * 1 = interrupt pending 492c5acbb5eSHemant Agrawal * 493c5acbb5eSHemant Agrawal * Return: '0' on Success; Error code otherwise. 494c5acbb5eSHemant Agrawal */ 495c5acbb5eSHemant Agrawal int dpni_get_irq_status(struct fsl_mc_io *mc_io, 496c5acbb5eSHemant Agrawal uint32_t cmd_flags, 497c5acbb5eSHemant Agrawal uint16_t token, 498c5acbb5eSHemant Agrawal uint8_t irq_index, 499c5acbb5eSHemant Agrawal uint32_t *status) 500c5acbb5eSHemant Agrawal { 501c5acbb5eSHemant Agrawal struct mc_command cmd = { 0 }; 502c5acbb5eSHemant Agrawal struct dpni_cmd_get_irq_status *cmd_params; 503c5acbb5eSHemant Agrawal struct dpni_rsp_get_irq_status *rsp_params; 504c5acbb5eSHemant Agrawal int err; 505c5acbb5eSHemant Agrawal 506c5acbb5eSHemant Agrawal /* prepare command */ 507c5acbb5eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS, 508c5acbb5eSHemant Agrawal cmd_flags, 509c5acbb5eSHemant Agrawal token); 510c5acbb5eSHemant Agrawal cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params; 511c5acbb5eSHemant Agrawal cmd_params->status = cpu_to_le32(*status); 512c5acbb5eSHemant Agrawal cmd_params->irq_index = irq_index; 513c5acbb5eSHemant Agrawal 514c5acbb5eSHemant Agrawal /* send command to mc*/ 515c5acbb5eSHemant Agrawal err = mc_send_command(mc_io, &cmd); 516c5acbb5eSHemant Agrawal if (err) 517c5acbb5eSHemant Agrawal return err; 518c5acbb5eSHemant Agrawal 519c5acbb5eSHemant Agrawal /* retrieve response parameters */ 520c5acbb5eSHemant Agrawal rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params; 521c5acbb5eSHemant Agrawal *status = le32_to_cpu(rsp_params->status); 522c5acbb5eSHemant Agrawal 523c5acbb5eSHemant Agrawal return 0; 524c5acbb5eSHemant Agrawal } 525c5acbb5eSHemant Agrawal 526c5acbb5eSHemant Agrawal /** 527c5acbb5eSHemant Agrawal * dpni_clear_irq_status() - Clear a pending interrupt's status 528c5acbb5eSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 529c5acbb5eSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 530c5acbb5eSHemant Agrawal * @token: Token of DPNI object 531c5acbb5eSHemant Agrawal * @irq_index: The interrupt index to configure 532c5acbb5eSHemant Agrawal * @status: bits to clear (W1C) - one bit per cause: 533c5acbb5eSHemant Agrawal * 0 = don't change 534c5acbb5eSHemant Agrawal * 1 = clear status bit 535c5acbb5eSHemant Agrawal * 536c5acbb5eSHemant Agrawal * Return: '0' on Success; Error code otherwise. 537c5acbb5eSHemant Agrawal */ 538c5acbb5eSHemant Agrawal int dpni_clear_irq_status(struct fsl_mc_io *mc_io, 539c5acbb5eSHemant Agrawal uint32_t cmd_flags, 540c5acbb5eSHemant Agrawal uint16_t token, 541c5acbb5eSHemant Agrawal uint8_t irq_index, 542c5acbb5eSHemant Agrawal uint32_t status) 543c5acbb5eSHemant Agrawal { 544c5acbb5eSHemant Agrawal struct mc_command cmd = { 0 }; 545c5acbb5eSHemant Agrawal struct dpni_cmd_clear_irq_status *cmd_params; 546c5acbb5eSHemant Agrawal 547c5acbb5eSHemant Agrawal /* prepare command */ 548c5acbb5eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS, 549c5acbb5eSHemant Agrawal cmd_flags, 550c5acbb5eSHemant Agrawal token); 551c5acbb5eSHemant Agrawal cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params; 552c5acbb5eSHemant Agrawal cmd_params->irq_index = irq_index; 553c5acbb5eSHemant Agrawal cmd_params->status = cpu_to_le32(status); 554c5acbb5eSHemant Agrawal 555c5acbb5eSHemant Agrawal /* send command to mc*/ 556c5acbb5eSHemant Agrawal return mc_send_command(mc_io, &cmd); 557c5acbb5eSHemant Agrawal } 558c5acbb5eSHemant Agrawal 559c5acbb5eSHemant Agrawal /** 56016bbc98aSShreyansh Jain * dpni_get_attributes() - Retrieve DPNI attributes. 56116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 56216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 56316bbc98aSShreyansh Jain * @token: Token of DPNI object 56416bbc98aSShreyansh Jain * @attr: Object's attributes 56516bbc98aSShreyansh Jain * 56616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 56716bbc98aSShreyansh Jain */ 568e6b82573SHemant Agrawal int dpni_get_attributes(struct fsl_mc_io *mc_io, 569e6b82573SHemant Agrawal uint32_t cmd_flags, 570e6b82573SHemant Agrawal uint16_t token, 571e6b82573SHemant Agrawal struct dpni_attr *attr) 572e6b82573SHemant Agrawal { 573e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 57416bbc98aSShreyansh Jain struct dpni_rsp_get_attr *rsp_params; 57516bbc98aSShreyansh Jain 576e6b82573SHemant Agrawal int err; 577e6b82573SHemant Agrawal 578e6b82573SHemant Agrawal /* prepare command */ 579e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR, 580e6b82573SHemant Agrawal cmd_flags, 581e6b82573SHemant Agrawal token); 582e6b82573SHemant Agrawal 583e6b82573SHemant Agrawal /* send command to mc*/ 584e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 585e6b82573SHemant Agrawal if (err) 586e6b82573SHemant Agrawal return err; 587e6b82573SHemant Agrawal 588e6b82573SHemant Agrawal /* retrieve response parameters */ 58916bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_attr *)cmd.params; 59016bbc98aSShreyansh Jain attr->options = le32_to_cpu(rsp_params->options); 59116bbc98aSShreyansh Jain attr->num_queues = rsp_params->num_queues; 59216bbc98aSShreyansh Jain attr->num_rx_tcs = rsp_params->num_rx_tcs; 59316bbc98aSShreyansh Jain attr->num_tx_tcs = rsp_params->num_tx_tcs; 59416bbc98aSShreyansh Jain attr->mac_filter_entries = rsp_params->mac_filter_entries; 59516bbc98aSShreyansh Jain attr->vlan_filter_entries = rsp_params->vlan_filter_entries; 596f48cd6c6SNipun Gupta attr->num_channels = rsp_params->num_channels; 59716bbc98aSShreyansh Jain attr->qos_entries = rsp_params->qos_entries; 59816bbc98aSShreyansh Jain attr->fs_entries = le16_to_cpu(rsp_params->fs_entries); 59901690f8fSRohit Raj attr->num_opr = le16_to_cpu(rsp_params->num_opr); 60016bbc98aSShreyansh Jain attr->qos_key_size = rsp_params->qos_key_size; 60116bbc98aSShreyansh Jain attr->fs_key_size = rsp_params->fs_key_size; 60216bbc98aSShreyansh Jain attr->wriop_version = le16_to_cpu(rsp_params->wriop_version); 60355984a9bSShreyansh Jain attr->num_cgs = rsp_params->num_cgs; 604e6b82573SHemant Agrawal 605e6b82573SHemant Agrawal return 0; 606e6b82573SHemant Agrawal } 607e6b82573SHemant Agrawal 60816bbc98aSShreyansh Jain /** 60916bbc98aSShreyansh Jain * dpni_set_errors_behavior() - Set errors behavior 61016bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 61116bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 61216bbc98aSShreyansh Jain * @token: Token of DPNI object 61316bbc98aSShreyansh Jain * @cfg: Errors configuration 61416bbc98aSShreyansh Jain * 61516bbc98aSShreyansh Jain * This function may be called numerous times with different 61616bbc98aSShreyansh Jain * error masks 61716bbc98aSShreyansh Jain * 61816bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 61916bbc98aSShreyansh Jain */ 620e6b82573SHemant Agrawal int dpni_set_errors_behavior(struct fsl_mc_io *mc_io, 621e6b82573SHemant Agrawal uint32_t cmd_flags, 622e6b82573SHemant Agrawal uint16_t token, 623e6b82573SHemant Agrawal struct dpni_error_cfg *cfg) 624e6b82573SHemant Agrawal { 625e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 62616bbc98aSShreyansh Jain struct dpni_cmd_set_errors_behavior *cmd_params; 627e6b82573SHemant Agrawal 628e6b82573SHemant Agrawal /* prepare command */ 629e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR, 630e6b82573SHemant Agrawal cmd_flags, 631e6b82573SHemant Agrawal token); 63216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params; 63316bbc98aSShreyansh Jain cmd_params->errors = cpu_to_le32(cfg->errors); 63416bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action); 63516bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation); 636e6b82573SHemant Agrawal 637e6b82573SHemant Agrawal /* send command to mc*/ 638e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 639e6b82573SHemant Agrawal } 640e6b82573SHemant Agrawal 64116bbc98aSShreyansh Jain /** 64216bbc98aSShreyansh Jain * dpni_get_buffer_layout() - Retrieve buffer layout attributes. 64316bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 64416bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 64516bbc98aSShreyansh Jain * @token: Token of DPNI object 64616bbc98aSShreyansh Jain * @qtype: Type of queue to retrieve configuration for 64716bbc98aSShreyansh Jain * @layout: Returns buffer layout attributes 64816bbc98aSShreyansh Jain * 64916bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 65016bbc98aSShreyansh Jain */ 651e6b82573SHemant Agrawal int dpni_get_buffer_layout(struct fsl_mc_io *mc_io, 652e6b82573SHemant Agrawal uint32_t cmd_flags, 653e6b82573SHemant Agrawal uint16_t token, 654e6b82573SHemant Agrawal enum dpni_queue_type qtype, 655e6b82573SHemant Agrawal struct dpni_buffer_layout *layout) 656e6b82573SHemant Agrawal { 657e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 65816bbc98aSShreyansh Jain struct dpni_cmd_get_buffer_layout *cmd_params; 65916bbc98aSShreyansh Jain struct dpni_rsp_get_buffer_layout *rsp_params; 660e6b82573SHemant Agrawal int err; 661e6b82573SHemant Agrawal 662e6b82573SHemant Agrawal /* prepare command */ 663e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT, 664e6b82573SHemant Agrawal cmd_flags, 665e6b82573SHemant Agrawal token); 66616bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params; 66716bbc98aSShreyansh Jain cmd_params->qtype = qtype; 668e6b82573SHemant Agrawal 669e6b82573SHemant Agrawal /* send command to mc*/ 670e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 671e6b82573SHemant Agrawal if (err) 672e6b82573SHemant Agrawal return err; 673e6b82573SHemant Agrawal 674e6b82573SHemant Agrawal /* retrieve response parameters */ 67516bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params; 67625fea082SHemant Agrawal layout->pass_timestamp = 67725fea082SHemant Agrawal (int)dpni_get_field(rsp_params->flags, PASS_TS); 67825fea082SHemant Agrawal layout->pass_parser_result = 67925fea082SHemant Agrawal (int)dpni_get_field(rsp_params->flags, PASS_PR); 68025fea082SHemant Agrawal layout->pass_frame_status = 68125fea082SHemant Agrawal (int)dpni_get_field(rsp_params->flags, PASS_FS); 68225fea082SHemant Agrawal layout->pass_sw_opaque = 68325fea082SHemant Agrawal (int)dpni_get_field(rsp_params->flags, PASS_SWO); 68416bbc98aSShreyansh Jain layout->private_data_size = le16_to_cpu(rsp_params->private_data_size); 68516bbc98aSShreyansh Jain layout->data_align = le16_to_cpu(rsp_params->data_align); 68616bbc98aSShreyansh Jain layout->data_head_room = le16_to_cpu(rsp_params->head_room); 68716bbc98aSShreyansh Jain layout->data_tail_room = le16_to_cpu(rsp_params->tail_room); 688e6b82573SHemant Agrawal 689e6b82573SHemant Agrawal return 0; 690e6b82573SHemant Agrawal } 691e6b82573SHemant Agrawal 69216bbc98aSShreyansh Jain /** 69316bbc98aSShreyansh Jain * dpni_set_buffer_layout() - Set buffer layout configuration. 69416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 69516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 69616bbc98aSShreyansh Jain * @token: Token of DPNI object 69716bbc98aSShreyansh Jain * @qtype: Type of queue this configuration applies to 69816bbc98aSShreyansh Jain * @layout: Buffer layout configuration 69916bbc98aSShreyansh Jain * 70016bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 70116bbc98aSShreyansh Jain * 70216bbc98aSShreyansh Jain * @warning Allowed only when DPNI is disabled 70316bbc98aSShreyansh Jain */ 704e6b82573SHemant Agrawal int dpni_set_buffer_layout(struct fsl_mc_io *mc_io, 705e6b82573SHemant Agrawal uint32_t cmd_flags, 706e6b82573SHemant Agrawal uint16_t token, 707e6b82573SHemant Agrawal enum dpni_queue_type qtype, 708e6b82573SHemant Agrawal const struct dpni_buffer_layout *layout) 709e6b82573SHemant Agrawal { 710e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 71116bbc98aSShreyansh Jain struct dpni_cmd_set_buffer_layout *cmd_params; 712e6b82573SHemant Agrawal 713e6b82573SHemant Agrawal /* prepare command */ 714e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT, 715e6b82573SHemant Agrawal cmd_flags, 716e6b82573SHemant Agrawal token); 71716bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params; 71816bbc98aSShreyansh Jain cmd_params->qtype = qtype; 71925fea082SHemant Agrawal cmd_params->options = cpu_to_le16((uint16_t)layout->options); 72016bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp); 72116bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result); 72216bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status); 72325fea082SHemant Agrawal dpni_set_field(cmd_params->flags, PASS_SWO, layout->pass_sw_opaque); 72416bbc98aSShreyansh Jain cmd_params->private_data_size = cpu_to_le16(layout->private_data_size); 72516bbc98aSShreyansh Jain cmd_params->data_align = cpu_to_le16(layout->data_align); 72616bbc98aSShreyansh Jain cmd_params->head_room = cpu_to_le16(layout->data_head_room); 72716bbc98aSShreyansh Jain cmd_params->tail_room = cpu_to_le16(layout->data_tail_room); 728e6b82573SHemant Agrawal 729e6b82573SHemant Agrawal /* send command to mc*/ 730e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 731e6b82573SHemant Agrawal } 732e6b82573SHemant Agrawal 73316bbc98aSShreyansh Jain /** 73416bbc98aSShreyansh Jain * dpni_set_offload() - Set DPNI offload configuration. 73516bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 73616bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 73716bbc98aSShreyansh Jain * @token: Token of DPNI object 73816bbc98aSShreyansh Jain * @type: Type of DPNI offload 73916bbc98aSShreyansh Jain * @config: Offload configuration. 74016bbc98aSShreyansh Jain * For checksum offloads, non-zero value enables the offload 74116bbc98aSShreyansh Jain * 74216bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 74316bbc98aSShreyansh Jain * 74416bbc98aSShreyansh Jain * @warning Allowed only when DPNI is disabled 74516bbc98aSShreyansh Jain */ 74616bbc98aSShreyansh Jain 747e6b82573SHemant Agrawal int dpni_set_offload(struct fsl_mc_io *mc_io, 748e6b82573SHemant Agrawal uint32_t cmd_flags, 749e6b82573SHemant Agrawal uint16_t token, 750e6b82573SHemant Agrawal enum dpni_offload type, 751e6b82573SHemant Agrawal uint32_t config) 752e6b82573SHemant Agrawal { 753e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 75416bbc98aSShreyansh Jain struct dpni_cmd_set_offload *cmd_params; 755e6b82573SHemant Agrawal 756e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD, 757e6b82573SHemant Agrawal cmd_flags, 758e6b82573SHemant Agrawal token); 75916bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_offload *)cmd.params; 76016bbc98aSShreyansh Jain cmd_params->dpni_offload = type; 76116bbc98aSShreyansh Jain cmd_params->config = cpu_to_le32(config); 762e6b82573SHemant Agrawal 763e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 764e6b82573SHemant Agrawal } 765e6b82573SHemant Agrawal 76616bbc98aSShreyansh Jain /** 76716bbc98aSShreyansh Jain * dpni_get_offload() - Get DPNI offload configuration. 76816bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 76916bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 77016bbc98aSShreyansh Jain * @token: Token of DPNI object 77116bbc98aSShreyansh Jain * @type: Type of DPNI offload 77216bbc98aSShreyansh Jain * @config: Offload configuration. 77316bbc98aSShreyansh Jain * For checksum offloads, a value of 1 indicates that the 77416bbc98aSShreyansh Jain * offload is enabled. 77516bbc98aSShreyansh Jain * 77616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 77716bbc98aSShreyansh Jain * 77816bbc98aSShreyansh Jain * @warning Allowed only when DPNI is disabled 77916bbc98aSShreyansh Jain */ 780e6b82573SHemant Agrawal int dpni_get_offload(struct fsl_mc_io *mc_io, 781e6b82573SHemant Agrawal uint32_t cmd_flags, 782e6b82573SHemant Agrawal uint16_t token, 783e6b82573SHemant Agrawal enum dpni_offload type, 784e6b82573SHemant Agrawal uint32_t *config) 785e6b82573SHemant Agrawal { 786e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 78716bbc98aSShreyansh Jain struct dpni_cmd_get_offload *cmd_params; 78816bbc98aSShreyansh Jain struct dpni_rsp_get_offload *rsp_params; 789e6b82573SHemant Agrawal int err; 790e6b82573SHemant Agrawal 791e6b82573SHemant Agrawal /* prepare command */ 792e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD, 793e6b82573SHemant Agrawal cmd_flags, 794e6b82573SHemant Agrawal token); 79516bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_offload *)cmd.params; 79616bbc98aSShreyansh Jain cmd_params->dpni_offload = type; 797e6b82573SHemant Agrawal 798e6b82573SHemant Agrawal /* send command to mc*/ 799e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 800e6b82573SHemant Agrawal if (err) 801e6b82573SHemant Agrawal return err; 802e6b82573SHemant Agrawal 803e6b82573SHemant Agrawal /* retrieve response parameters */ 80416bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_offload *)cmd.params; 80516bbc98aSShreyansh Jain *config = le32_to_cpu(rsp_params->config); 806e6b82573SHemant Agrawal 807e6b82573SHemant Agrawal return 0; 808e6b82573SHemant Agrawal } 809e6b82573SHemant Agrawal 81016bbc98aSShreyansh Jain /** 81116bbc98aSShreyansh Jain * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used 81216bbc98aSShreyansh Jain * for enqueue operations 81316bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 81416bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 81516bbc98aSShreyansh Jain * @token: Token of DPNI object 81616bbc98aSShreyansh Jain * @qtype: Type of queue to receive QDID for 81716bbc98aSShreyansh Jain * @qdid: Returned virtual QDID value that should be used as an argument 81816bbc98aSShreyansh Jain * in all enqueue operations 81916bbc98aSShreyansh Jain * 82016bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 821f48cd6c6SNipun Gupta * 822f48cd6c6SNipun Gupta * If dpni object is created using multiple Tc channels this function will return 823f48cd6c6SNipun Gupta * qdid value for the first channel 82416bbc98aSShreyansh Jain */ 825e6b82573SHemant Agrawal int dpni_get_qdid(struct fsl_mc_io *mc_io, 826e6b82573SHemant Agrawal uint32_t cmd_flags, 827e6b82573SHemant Agrawal uint16_t token, 828e6b82573SHemant Agrawal enum dpni_queue_type qtype, 829e6b82573SHemant Agrawal uint16_t *qdid) 830e6b82573SHemant Agrawal { 831e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 83216bbc98aSShreyansh Jain struct dpni_cmd_get_qdid *cmd_params; 83316bbc98aSShreyansh Jain struct dpni_rsp_get_qdid *rsp_params; 834e6b82573SHemant Agrawal int err; 835e6b82573SHemant Agrawal 836e6b82573SHemant Agrawal /* prepare command */ 837e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID, 838e6b82573SHemant Agrawal cmd_flags, 839e6b82573SHemant Agrawal token); 84016bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_qdid *)cmd.params; 84116bbc98aSShreyansh Jain cmd_params->qtype = qtype; 842e6b82573SHemant Agrawal 843e6b82573SHemant Agrawal /* send command to mc*/ 844e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 845e6b82573SHemant Agrawal if (err) 846e6b82573SHemant Agrawal return err; 847e6b82573SHemant Agrawal 848e6b82573SHemant Agrawal /* retrieve response parameters */ 84916bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_qdid *)cmd.params; 85016bbc98aSShreyansh Jain *qdid = le16_to_cpu(rsp_params->qdid); 851e6b82573SHemant Agrawal 852e6b82573SHemant Agrawal return 0; 853e6b82573SHemant Agrawal } 854977d0006SHemant Agrawal 85516bbc98aSShreyansh Jain /** 856*591200efSGagandeep Singh * dpni_get_qdid_ex() - Extension for the function to get the Queuing Destination ID (QDID) 857*591200efSGagandeep Singh * that should be used for enqueue operations. 858*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 859*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 860*591200efSGagandeep Singh * @token: Token of DPNI object 861*591200efSGagandeep Singh * @qtype: Type of queue to receive QDID for 862*591200efSGagandeep Singh * @qdid: Array of virtual QDID value that should be used as an argument 863*591200efSGagandeep Singh * in all enqueue operations. 864*591200efSGagandeep Singh * 865*591200efSGagandeep Singh * Return: '0' on Success; Error code otherwise. 866*591200efSGagandeep Singh * 867*591200efSGagandeep Singh * This function must be used when dpni is created using multiple Tx channels to return one 868*591200efSGagandeep Singh * qdid for each channel. 869*591200efSGagandeep Singh */ 870*591200efSGagandeep Singh int dpni_get_qdid_ex(struct fsl_mc_io *mc_io, 871*591200efSGagandeep Singh uint32_t cmd_flags, 872*591200efSGagandeep Singh uint16_t token, 873*591200efSGagandeep Singh enum dpni_queue_type qtype, 874*591200efSGagandeep Singh uint16_t *qdid) 875*591200efSGagandeep Singh { 876*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 877*591200efSGagandeep Singh struct dpni_cmd_get_qdid *cmd_params; 878*591200efSGagandeep Singh struct dpni_rsp_get_qdid_ex *rsp_params; 879*591200efSGagandeep Singh int i; 880*591200efSGagandeep Singh int err; 881*591200efSGagandeep Singh 882*591200efSGagandeep Singh /* prepare command */ 883*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID_EX, 884*591200efSGagandeep Singh cmd_flags, 885*591200efSGagandeep Singh token); 886*591200efSGagandeep Singh cmd_params = (struct dpni_cmd_get_qdid *)cmd.params; 887*591200efSGagandeep Singh cmd_params->qtype = qtype; 888*591200efSGagandeep Singh 889*591200efSGagandeep Singh /* send command to mc*/ 890*591200efSGagandeep Singh err = mc_send_command(mc_io, &cmd); 891*591200efSGagandeep Singh if (err) 892*591200efSGagandeep Singh return err; 893*591200efSGagandeep Singh 894*591200efSGagandeep Singh /* retrieve response parameters */ 895*591200efSGagandeep Singh rsp_params = (struct dpni_rsp_get_qdid_ex *)cmd.params; 896*591200efSGagandeep Singh for (i = 0; i < DPNI_MAX_CHANNELS; i++) 897*591200efSGagandeep Singh qdid[i] = le16_to_cpu(rsp_params->qdid[i]); 898*591200efSGagandeep Singh 899*591200efSGagandeep Singh return 0; 900*591200efSGagandeep Singh } 901*591200efSGagandeep Singh 902*591200efSGagandeep Singh /** 903*591200efSGagandeep Singh * dpni_get_sp_info() - Get the AIOP storage profile IDs associated 904*591200efSGagandeep Singh * with the DPNI 905*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 906*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 907*591200efSGagandeep Singh * @token: Token of DPNI object 908*591200efSGagandeep Singh * @sp_info: Returned AIOP storage-profile information 909*591200efSGagandeep Singh * 910*591200efSGagandeep Singh * Return: '0' on Success; Error code otherwise. 911*591200efSGagandeep Singh * 912*591200efSGagandeep Singh * @warning Only relevant for DPNI that belongs to AIOP container. 913*591200efSGagandeep Singh */ 914*591200efSGagandeep Singh int dpni_get_sp_info(struct fsl_mc_io *mc_io, 915*591200efSGagandeep Singh uint32_t cmd_flags, 916*591200efSGagandeep Singh uint16_t token, 917*591200efSGagandeep Singh struct dpni_sp_info *sp_info) 918*591200efSGagandeep Singh { 919*591200efSGagandeep Singh struct dpni_rsp_get_sp_info *rsp_params; 920*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 921*591200efSGagandeep Singh int err, i; 922*591200efSGagandeep Singh 923*591200efSGagandeep Singh /* prepare command */ 924*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SP_INFO, 925*591200efSGagandeep Singh cmd_flags, 926*591200efSGagandeep Singh token); 927*591200efSGagandeep Singh 928*591200efSGagandeep Singh /* send command to mc*/ 929*591200efSGagandeep Singh err = mc_send_command(mc_io, &cmd); 930*591200efSGagandeep Singh if (err) 931*591200efSGagandeep Singh return err; 932*591200efSGagandeep Singh 933*591200efSGagandeep Singh /* retrieve response parameters */ 934*591200efSGagandeep Singh rsp_params = (struct dpni_rsp_get_sp_info *)cmd.params; 935*591200efSGagandeep Singh for (i = 0; i < DPNI_MAX_SP; i++) 936*591200efSGagandeep Singh sp_info->spids[i] = le16_to_cpu(rsp_params->spids[i]); 937*591200efSGagandeep Singh 938*591200efSGagandeep Singh return 0; 939*591200efSGagandeep Singh } 940*591200efSGagandeep Singh 941*591200efSGagandeep Singh /** 94216bbc98aSShreyansh Jain * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer) 94316bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 94416bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 94516bbc98aSShreyansh Jain * @token: Token of DPNI object 94616bbc98aSShreyansh Jain * @data_offset: Tx data offset (from start of buffer) 94716bbc98aSShreyansh Jain * 94816bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 94916bbc98aSShreyansh Jain */ 95016bbc98aSShreyansh Jain int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io, 95116bbc98aSShreyansh Jain uint32_t cmd_flags, 95216bbc98aSShreyansh Jain uint16_t token, 95316bbc98aSShreyansh Jain uint16_t *data_offset) 95416bbc98aSShreyansh Jain { 95516bbc98aSShreyansh Jain struct mc_command cmd = { 0 }; 95616bbc98aSShreyansh Jain struct dpni_rsp_get_tx_data_offset *rsp_params; 95716bbc98aSShreyansh Jain int err; 95816bbc98aSShreyansh Jain 95916bbc98aSShreyansh Jain /* prepare command */ 96016bbc98aSShreyansh Jain cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET, 96116bbc98aSShreyansh Jain cmd_flags, 96216bbc98aSShreyansh Jain token); 96316bbc98aSShreyansh Jain 96416bbc98aSShreyansh Jain /* send command to mc*/ 96516bbc98aSShreyansh Jain err = mc_send_command(mc_io, &cmd); 96616bbc98aSShreyansh Jain if (err) 96716bbc98aSShreyansh Jain return err; 96816bbc98aSShreyansh Jain 96916bbc98aSShreyansh Jain /* retrieve response parameters */ 97016bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params; 97116bbc98aSShreyansh Jain *data_offset = le16_to_cpu(rsp_params->data_offset); 97216bbc98aSShreyansh Jain 97316bbc98aSShreyansh Jain return 0; 97416bbc98aSShreyansh Jain } 97516bbc98aSShreyansh Jain 97616bbc98aSShreyansh Jain /** 97716bbc98aSShreyansh Jain * dpni_set_link_cfg() - set the link configuration. 97816bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 97916bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 98016bbc98aSShreyansh Jain * @token: Token of DPNI object 98116bbc98aSShreyansh Jain * @cfg: Link configuration 98216bbc98aSShreyansh Jain * 98316bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 98416bbc98aSShreyansh Jain */ 985977d0006SHemant Agrawal int dpni_set_link_cfg(struct fsl_mc_io *mc_io, 986977d0006SHemant Agrawal uint32_t cmd_flags, 987977d0006SHemant Agrawal uint16_t token, 988977d0006SHemant Agrawal const struct dpni_link_cfg *cfg) 989977d0006SHemant Agrawal { 990977d0006SHemant Agrawal struct mc_command cmd = { 0 }; 99116bbc98aSShreyansh Jain struct dpni_cmd_set_link_cfg *cmd_params; 992977d0006SHemant Agrawal 993977d0006SHemant Agrawal /* prepare command */ 994977d0006SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG, 995977d0006SHemant Agrawal cmd_flags, 996977d0006SHemant Agrawal token); 99716bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_link_cfg *)cmd.params; 99816bbc98aSShreyansh Jain cmd_params->rate = cpu_to_le32(cfg->rate); 99916bbc98aSShreyansh Jain cmd_params->options = cpu_to_le64(cfg->options); 100025fea082SHemant Agrawal cmd_params->advertising = cpu_to_le64(cfg->advertising); 1001977d0006SHemant Agrawal 1002977d0006SHemant Agrawal /* send command to mc*/ 1003977d0006SHemant Agrawal return mc_send_command(mc_io, &cmd); 1004977d0006SHemant Agrawal } 1005977d0006SHemant Agrawal 100616bbc98aSShreyansh Jain /** 100772100f0dSGagandeep Singh * dpni_get_link_cfg() - return the link configuration configured by 100872100f0dSGagandeep Singh * dpni_set_link_cfg(). 100972100f0dSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 101072100f0dSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 101172100f0dSGagandeep Singh * @token: Token of DPNI object 101272100f0dSGagandeep Singh * @cfg: Link configuration from dpni object 101372100f0dSGagandeep Singh * 101472100f0dSGagandeep Singh * Return: '0' on Success; Error code otherwise. 101572100f0dSGagandeep Singh */ 101672100f0dSGagandeep Singh int dpni_get_link_cfg(struct fsl_mc_io *mc_io, 101772100f0dSGagandeep Singh uint32_t cmd_flags, 101872100f0dSGagandeep Singh uint16_t token, 101972100f0dSGagandeep Singh struct dpni_link_cfg *cfg) 102072100f0dSGagandeep Singh { 102172100f0dSGagandeep Singh struct mc_command cmd = { 0 }; 102272100f0dSGagandeep Singh struct dpni_cmd_set_link_cfg *rsp_params; 102372100f0dSGagandeep Singh int err; 102472100f0dSGagandeep Singh 102572100f0dSGagandeep Singh /* prepare command */ 102672100f0dSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_CFG, 102772100f0dSGagandeep Singh cmd_flags, 102872100f0dSGagandeep Singh token); 102972100f0dSGagandeep Singh 103072100f0dSGagandeep Singh /* send command to mc*/ 103172100f0dSGagandeep Singh err = mc_send_command(mc_io, &cmd); 103272100f0dSGagandeep Singh if (err) 103372100f0dSGagandeep Singh return err; 103472100f0dSGagandeep Singh 103572100f0dSGagandeep Singh /* retrieve response parameters */ 103672100f0dSGagandeep Singh rsp_params = (struct dpni_cmd_set_link_cfg *)cmd.params; 103772100f0dSGagandeep Singh cfg->advertising = le64_to_cpu(rsp_params->advertising); 103872100f0dSGagandeep Singh cfg->options = le64_to_cpu(rsp_params->options); 103972100f0dSGagandeep Singh cfg->rate = le32_to_cpu(rsp_params->rate); 104072100f0dSGagandeep Singh 104172100f0dSGagandeep Singh return err; 104272100f0dSGagandeep Singh } 104372100f0dSGagandeep Singh 104472100f0dSGagandeep Singh /** 104516bbc98aSShreyansh Jain * dpni_get_link_state() - Return the link state (either up or down) 104616bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 104716bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 104816bbc98aSShreyansh Jain * @token: Token of DPNI object 104916bbc98aSShreyansh Jain * @state: Returned link state; 105016bbc98aSShreyansh Jain * 105116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 105216bbc98aSShreyansh Jain */ 1053e6b82573SHemant Agrawal int dpni_get_link_state(struct fsl_mc_io *mc_io, 1054e6b82573SHemant Agrawal uint32_t cmd_flags, 1055e6b82573SHemant Agrawal uint16_t token, 1056e6b82573SHemant Agrawal struct dpni_link_state *state) 1057e6b82573SHemant Agrawal { 1058e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 105916bbc98aSShreyansh Jain struct dpni_rsp_get_link_state *rsp_params; 1060e6b82573SHemant Agrawal int err; 1061e6b82573SHemant Agrawal 1062e6b82573SHemant Agrawal /* prepare command */ 1063e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE, 1064e6b82573SHemant Agrawal cmd_flags, 1065e6b82573SHemant Agrawal token); 1066e6b82573SHemant Agrawal 1067e6b82573SHemant Agrawal /* send command to mc*/ 1068e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 1069e6b82573SHemant Agrawal if (err) 1070e6b82573SHemant Agrawal return err; 1071e6b82573SHemant Agrawal 1072e6b82573SHemant Agrawal /* retrieve response parameters */ 107316bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_link_state *)cmd.params; 107416bbc98aSShreyansh Jain state->up = dpni_get_field(rsp_params->flags, LINK_STATE); 107525fea082SHemant Agrawal state->state_valid = dpni_get_field(rsp_params->flags, STATE_VALID); 107616bbc98aSShreyansh Jain state->rate = le32_to_cpu(rsp_params->rate); 107716bbc98aSShreyansh Jain state->options = le64_to_cpu(rsp_params->options); 107825fea082SHemant Agrawal state->supported = le64_to_cpu(rsp_params->supported); 107925fea082SHemant Agrawal state->advertising = le64_to_cpu(rsp_params->advertising); 1080e6b82573SHemant Agrawal 1081e6b82573SHemant Agrawal return 0; 1082e6b82573SHemant Agrawal } 1083e6b82573SHemant Agrawal 108416bbc98aSShreyansh Jain /** 1085ac624068SGagandeep Singh * dpni_set_tx_shaping() - Set the transmit shaping 1086ac624068SGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 1087ac624068SGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1088ac624068SGagandeep Singh * @token: Token of DPNI object 1089ac624068SGagandeep Singh * @tx_cr_shaper: TX committed rate shaping configuration 1090ac624068SGagandeep Singh * @tx_er_shaper: TX excess rate shaping configuration 1091f48cd6c6SNipun Gupta * @param: Special parameters 1092f48cd6c6SNipun Gupta * bit0: Committed and excess rates are coupled 1093f48cd6c6SNipun Gupta * bit1: 1 modify LNI shaper, 0 modify channel shaper 1094f48cd6c6SNipun Gupta * bit8-15: Tx channel to be shaped. Used only if bit1 is set to zero 1095f48cd6c6SNipun Gupta * bits16-26: OAL (Overhead accounting length 11bit value). Used only 1096f48cd6c6SNipun Gupta * when bit1 is set. 1097ac624068SGagandeep Singh * 1098ac624068SGagandeep Singh * Return: '0' on Success; Error code otherwise. 1099ac624068SGagandeep Singh */ 1100ac624068SGagandeep Singh int dpni_set_tx_shaping(struct fsl_mc_io *mc_io, 1101ac624068SGagandeep Singh uint32_t cmd_flags, 1102ac624068SGagandeep Singh uint16_t token, 1103ac624068SGagandeep Singh const struct dpni_tx_shaping_cfg *tx_cr_shaper, 1104ac624068SGagandeep Singh const struct dpni_tx_shaping_cfg *tx_er_shaper, 1105f48cd6c6SNipun Gupta uint32_t param) 1106ac624068SGagandeep Singh { 1107ac624068SGagandeep Singh struct dpni_cmd_set_tx_shaping *cmd_params; 1108ac624068SGagandeep Singh struct mc_command cmd = { 0 }; 1109f48cd6c6SNipun Gupta int coupled, lni_shaper; 1110f48cd6c6SNipun Gupta uint8_t channel_id; 1111f48cd6c6SNipun Gupta uint16_t oal; 1112ac624068SGagandeep Singh 1113ac624068SGagandeep Singh /* prepare command */ 1114ac624068SGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_SHAPING, 1115ac624068SGagandeep Singh cmd_flags, 1116ac624068SGagandeep Singh token); 1117ac624068SGagandeep Singh cmd_params = (struct dpni_cmd_set_tx_shaping *)cmd.params; 1118ac624068SGagandeep Singh cmd_params->tx_cr_max_burst_size = 1119ac624068SGagandeep Singh cpu_to_le16(tx_cr_shaper->max_burst_size); 1120ac624068SGagandeep Singh cmd_params->tx_er_max_burst_size = 1121ac624068SGagandeep Singh cpu_to_le16(tx_er_shaper->max_burst_size); 1122ac624068SGagandeep Singh cmd_params->tx_cr_rate_limit = 1123ac624068SGagandeep Singh cpu_to_le32(tx_cr_shaper->rate_limit); 1124ac624068SGagandeep Singh cmd_params->tx_er_rate_limit = 1125ac624068SGagandeep Singh cpu_to_le32(tx_er_shaper->rate_limit); 1126f48cd6c6SNipun Gupta 1127f48cd6c6SNipun Gupta coupled = !!(param & 0x01); 1128f48cd6c6SNipun Gupta dpni_set_field(cmd_params->options, COUPLED, coupled); 1129f48cd6c6SNipun Gupta 1130f48cd6c6SNipun Gupta lni_shaper = !!((param >> 1) & 0x01); 1131f48cd6c6SNipun Gupta dpni_set_field(cmd_params->options, LNI_SHAPER, lni_shaper); 1132f48cd6c6SNipun Gupta 1133f48cd6c6SNipun Gupta channel_id = (param >> 8) & 0xff; 1134f48cd6c6SNipun Gupta cmd_params->channel_id = channel_id; 1135f48cd6c6SNipun Gupta 1136f48cd6c6SNipun Gupta oal = (param >> 16) & 0x7FF; 1137f48cd6c6SNipun Gupta cmd_params->oal = cpu_to_le16(oal); 1138ac624068SGagandeep Singh 1139ac624068SGagandeep Singh /* send command to mc*/ 1140ac624068SGagandeep Singh return mc_send_command(mc_io, &cmd); 1141ac624068SGagandeep Singh } 1142ac624068SGagandeep Singh 1143ac624068SGagandeep Singh /** 114416bbc98aSShreyansh Jain * dpni_set_max_frame_length() - Set the maximum received frame length. 114516bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 114616bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 114716bbc98aSShreyansh Jain * @token: Token of DPNI object 114816bbc98aSShreyansh Jain * @max_frame_length: Maximum received frame length (in bytes); 114916bbc98aSShreyansh Jain * frame is discarded if its length exceeds this value 115016bbc98aSShreyansh Jain * 115116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 115216bbc98aSShreyansh Jain */ 1153e6b82573SHemant Agrawal int dpni_set_max_frame_length(struct fsl_mc_io *mc_io, 1154e6b82573SHemant Agrawal uint32_t cmd_flags, 1155e6b82573SHemant Agrawal uint16_t token, 1156e6b82573SHemant Agrawal uint16_t max_frame_length) 1157e6b82573SHemant Agrawal { 1158e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 115916bbc98aSShreyansh Jain struct dpni_cmd_set_max_frame_length *cmd_params; 1160e6b82573SHemant Agrawal 1161e6b82573SHemant Agrawal /* prepare command */ 1162e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH, 1163e6b82573SHemant Agrawal cmd_flags, 1164e6b82573SHemant Agrawal token); 116516bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params; 116616bbc98aSShreyansh Jain cmd_params->max_frame_length = cpu_to_le16(max_frame_length); 1167e6b82573SHemant Agrawal 1168e6b82573SHemant Agrawal /* send command to mc*/ 1169e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 1170e6b82573SHemant Agrawal } 1171e6b82573SHemant Agrawal 117216bbc98aSShreyansh Jain /** 117316bbc98aSShreyansh Jain * dpni_get_max_frame_length() - Get the maximum received frame length. 117416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 117516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 117616bbc98aSShreyansh Jain * @token: Token of DPNI object 117716bbc98aSShreyansh Jain * @max_frame_length: Maximum received frame length (in bytes); 117816bbc98aSShreyansh Jain * frame is discarded if its length exceeds this value 117916bbc98aSShreyansh Jain * 118016bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 118116bbc98aSShreyansh Jain */ 1182e6b82573SHemant Agrawal int dpni_get_max_frame_length(struct fsl_mc_io *mc_io, 1183e6b82573SHemant Agrawal uint32_t cmd_flags, 1184e6b82573SHemant Agrawal uint16_t token, 1185e6b82573SHemant Agrawal uint16_t *max_frame_length) 1186e6b82573SHemant Agrawal { 1187e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 118816bbc98aSShreyansh Jain struct dpni_rsp_get_max_frame_length *rsp_params; 1189e6b82573SHemant Agrawal int err; 1190e6b82573SHemant Agrawal 1191e6b82573SHemant Agrawal /* prepare command */ 1192e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH, 1193e6b82573SHemant Agrawal cmd_flags, 1194e6b82573SHemant Agrawal token); 1195e6b82573SHemant Agrawal 1196e6b82573SHemant Agrawal /* send command to mc*/ 1197e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 1198e6b82573SHemant Agrawal if (err) 1199e6b82573SHemant Agrawal return err; 1200e6b82573SHemant Agrawal 1201e6b82573SHemant Agrawal /* retrieve response parameters */ 120216bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params; 120316bbc98aSShreyansh Jain *max_frame_length = le16_to_cpu(rsp_params->max_frame_length); 1204e6b82573SHemant Agrawal 1205e6b82573SHemant Agrawal return 0; 1206e6b82573SHemant Agrawal } 1207e6b82573SHemant Agrawal 120816bbc98aSShreyansh Jain /** 120916bbc98aSShreyansh Jain * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode 121016bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 121116bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 121216bbc98aSShreyansh Jain * @token: Token of DPNI object 121316bbc98aSShreyansh Jain * @en: Set to '1' to enable; '0' to disable 121416bbc98aSShreyansh Jain * 121516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 121616bbc98aSShreyansh Jain */ 12175d5aeeedSHemant Agrawal int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io, 12185d5aeeedSHemant Agrawal uint32_t cmd_flags, 12195d5aeeedSHemant Agrawal uint16_t token, 12205d5aeeedSHemant Agrawal int en) 12215d5aeeedSHemant Agrawal { 12225d5aeeedSHemant Agrawal struct mc_command cmd = { 0 }; 122316bbc98aSShreyansh Jain struct dpni_cmd_set_multicast_promisc *cmd_params; 12245d5aeeedSHemant Agrawal 12255d5aeeedSHemant Agrawal /* prepare command */ 12265d5aeeedSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC, 12275d5aeeedSHemant Agrawal cmd_flags, 12285d5aeeedSHemant Agrawal token); 122916bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params; 123016bbc98aSShreyansh Jain dpni_set_field(cmd_params->enable, ENABLE, en); 12315d5aeeedSHemant Agrawal 12325d5aeeedSHemant Agrawal /* send command to mc*/ 12335d5aeeedSHemant Agrawal return mc_send_command(mc_io, &cmd); 12345d5aeeedSHemant Agrawal } 12355d5aeeedSHemant Agrawal 123616bbc98aSShreyansh Jain /** 123716bbc98aSShreyansh Jain * dpni_get_multicast_promisc() - Get multicast promiscuous mode 123816bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 123916bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 124016bbc98aSShreyansh Jain * @token: Token of DPNI object 124116bbc98aSShreyansh Jain * @en: Returns '1' if enabled; '0' otherwise 124216bbc98aSShreyansh Jain * 124316bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 124416bbc98aSShreyansh Jain */ 12455d5aeeedSHemant Agrawal int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io, 12465d5aeeedSHemant Agrawal uint32_t cmd_flags, 12475d5aeeedSHemant Agrawal uint16_t token, 12485d5aeeedSHemant Agrawal int *en) 12495d5aeeedSHemant Agrawal { 12505d5aeeedSHemant Agrawal struct mc_command cmd = { 0 }; 125116bbc98aSShreyansh Jain struct dpni_rsp_get_multicast_promisc *rsp_params; 12525d5aeeedSHemant Agrawal int err; 12535d5aeeedSHemant Agrawal 12545d5aeeedSHemant Agrawal /* prepare command */ 12555d5aeeedSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC, 12565d5aeeedSHemant Agrawal cmd_flags, 12575d5aeeedSHemant Agrawal token); 12585d5aeeedSHemant Agrawal 12595d5aeeedSHemant Agrawal /* send command to mc*/ 12605d5aeeedSHemant Agrawal err = mc_send_command(mc_io, &cmd); 12615d5aeeedSHemant Agrawal if (err) 12625d5aeeedSHemant Agrawal return err; 12635d5aeeedSHemant Agrawal 12645d5aeeedSHemant Agrawal /* retrieve response parameters */ 126516bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params; 126616bbc98aSShreyansh Jain *en = dpni_get_field(rsp_params->enabled, ENABLE); 12675d5aeeedSHemant Agrawal 12685d5aeeedSHemant Agrawal return 0; 12695d5aeeedSHemant Agrawal } 12705d5aeeedSHemant Agrawal 127116bbc98aSShreyansh Jain /** 127216bbc98aSShreyansh Jain * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode 127316bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 127416bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 127516bbc98aSShreyansh Jain * @token: Token of DPNI object 127616bbc98aSShreyansh Jain * @en: Set to '1' to enable; '0' to disable 127716bbc98aSShreyansh Jain * 127816bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 127916bbc98aSShreyansh Jain */ 1280e6b82573SHemant Agrawal int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io, 1281e6b82573SHemant Agrawal uint32_t cmd_flags, 1282e6b82573SHemant Agrawal uint16_t token, 1283e6b82573SHemant Agrawal int en) 1284e6b82573SHemant Agrawal { 1285e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 128616bbc98aSShreyansh Jain struct dpni_cmd_set_unicast_promisc *cmd_params; 1287e6b82573SHemant Agrawal 1288e6b82573SHemant Agrawal /* prepare command */ 1289e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC, 1290e6b82573SHemant Agrawal cmd_flags, 1291e6b82573SHemant Agrawal token); 129216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params; 129316bbc98aSShreyansh Jain dpni_set_field(cmd_params->enable, ENABLE, en); 1294e6b82573SHemant Agrawal 1295e6b82573SHemant Agrawal /* send command to mc*/ 1296e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 1297e6b82573SHemant Agrawal } 1298e6b82573SHemant Agrawal 129916bbc98aSShreyansh Jain /** 130016bbc98aSShreyansh Jain * dpni_get_unicast_promisc() - Get unicast promiscuous mode 130116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 130216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 130316bbc98aSShreyansh Jain * @token: Token of DPNI object 130416bbc98aSShreyansh Jain * @en: Returns '1' if enabled; '0' otherwise 130516bbc98aSShreyansh Jain * 130616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 130716bbc98aSShreyansh Jain */ 1308e6b82573SHemant Agrawal int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io, 1309e6b82573SHemant Agrawal uint32_t cmd_flags, 1310e6b82573SHemant Agrawal uint16_t token, 1311e6b82573SHemant Agrawal int *en) 1312e6b82573SHemant Agrawal { 1313e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 131416bbc98aSShreyansh Jain struct dpni_rsp_get_unicast_promisc *rsp_params; 1315e6b82573SHemant Agrawal int err; 1316e6b82573SHemant Agrawal 1317e6b82573SHemant Agrawal /* prepare command */ 1318e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC, 1319e6b82573SHemant Agrawal cmd_flags, 1320e6b82573SHemant Agrawal token); 1321e6b82573SHemant Agrawal 1322e6b82573SHemant Agrawal /* send command to mc*/ 1323e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 1324e6b82573SHemant Agrawal if (err) 1325e6b82573SHemant Agrawal return err; 1326e6b82573SHemant Agrawal 1327e6b82573SHemant Agrawal /* retrieve response parameters */ 132816bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params; 132916bbc98aSShreyansh Jain *en = dpni_get_field(rsp_params->enabled, ENABLE); 1330e6b82573SHemant Agrawal 1331e6b82573SHemant Agrawal return 0; 1332e6b82573SHemant Agrawal } 1333e6b82573SHemant Agrawal 133416bbc98aSShreyansh Jain /** 133516bbc98aSShreyansh Jain * dpni_set_primary_mac_addr() - Set the primary MAC address 133616bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 133716bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 133816bbc98aSShreyansh Jain * @token: Token of DPNI object 133916bbc98aSShreyansh Jain * @mac_addr: MAC address to set as primary address 134016bbc98aSShreyansh Jain * 134116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 134216bbc98aSShreyansh Jain */ 1343e6b82573SHemant Agrawal int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io, 1344e6b82573SHemant Agrawal uint32_t cmd_flags, 1345e6b82573SHemant Agrawal uint16_t token, 1346e6b82573SHemant Agrawal const uint8_t mac_addr[6]) 1347e6b82573SHemant Agrawal { 1348e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 134916bbc98aSShreyansh Jain struct dpni_cmd_set_primary_mac_addr *cmd_params; 135016bbc98aSShreyansh Jain int i; 1351e6b82573SHemant Agrawal 1352e6b82573SHemant Agrawal /* prepare command */ 1353e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC, 1354e6b82573SHemant Agrawal cmd_flags, 1355e6b82573SHemant Agrawal token); 135616bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params; 135716bbc98aSShreyansh Jain for (i = 0; i < 6; i++) 135816bbc98aSShreyansh Jain cmd_params->mac_addr[i] = mac_addr[5 - i]; 1359e6b82573SHemant Agrawal 1360e6b82573SHemant Agrawal /* send command to mc*/ 1361e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 1362e6b82573SHemant Agrawal } 1363e6b82573SHemant Agrawal 136416bbc98aSShreyansh Jain /** 136516bbc98aSShreyansh Jain * dpni_get_primary_mac_addr() - Get the primary MAC address 136616bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 136716bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 136816bbc98aSShreyansh Jain * @token: Token of DPNI object 136916bbc98aSShreyansh Jain * @mac_addr: Returned MAC address 137016bbc98aSShreyansh Jain * 137116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 137216bbc98aSShreyansh Jain */ 1373e6b82573SHemant Agrawal int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io, 1374e6b82573SHemant Agrawal uint32_t cmd_flags, 1375e6b82573SHemant Agrawal uint16_t token, 1376e6b82573SHemant Agrawal uint8_t mac_addr[6]) 1377e6b82573SHemant Agrawal { 1378e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 137916bbc98aSShreyansh Jain struct dpni_rsp_get_primary_mac_addr *rsp_params; 138016bbc98aSShreyansh Jain int i, err; 1381e6b82573SHemant Agrawal 1382e6b82573SHemant Agrawal /* prepare command */ 1383e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC, 1384e6b82573SHemant Agrawal cmd_flags, 1385e6b82573SHemant Agrawal token); 1386e6b82573SHemant Agrawal 1387e6b82573SHemant Agrawal /* send command to mc*/ 1388e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 1389e6b82573SHemant Agrawal if (err) 1390e6b82573SHemant Agrawal return err; 1391e6b82573SHemant Agrawal 1392e6b82573SHemant Agrawal /* retrieve response parameters */ 139316bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params; 139416bbc98aSShreyansh Jain for (i = 0; i < 6; i++) 139516bbc98aSShreyansh Jain mac_addr[5 - i] = rsp_params->mac_addr[i]; 1396e6b82573SHemant Agrawal 1397e6b82573SHemant Agrawal return 0; 1398e6b82573SHemant Agrawal } 1399e6b82573SHemant Agrawal 140016bbc98aSShreyansh Jain /** 140116bbc98aSShreyansh Jain * dpni_add_mac_addr() - Add MAC address filter 140216bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 140316bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 140416bbc98aSShreyansh Jain * @token: Token of DPNI object 140516bbc98aSShreyansh Jain * @mac_addr: MAC address to add 140696f7bfe8SSachin Saxena * @flags : 0 - tc_id and flow_id will be ignored. 140796f7bfe8SSachin Saxena * Pkt with this mac_id will be passed to the next 140896f7bfe8SSachin Saxena * classification stages 140996f7bfe8SSachin Saxena * DPNI_MAC_SET_QUEUE_ACTION 141096f7bfe8SSachin Saxena * Pkt with this mac will be forward directly to 141196f7bfe8SSachin Saxena * queue defined by the tc_id and flow_id 141296f7bfe8SSachin Saxena * @tc_id : Traffic class selection (0-7) 141396f7bfe8SSachin Saxena * @flow_id : Selects the specific queue out of the set allocated for the 141496f7bfe8SSachin Saxena * same as tc_id. Value must be in range 0 to NUM_QUEUES - 1 141516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 141616bbc98aSShreyansh Jain */ 1417b4d97b7dSHemant Agrawal int dpni_add_mac_addr(struct fsl_mc_io *mc_io, 1418b4d97b7dSHemant Agrawal uint32_t cmd_flags, 1419b4d97b7dSHemant Agrawal uint16_t token, 142096f7bfe8SSachin Saxena const uint8_t mac_addr[6], 142196f7bfe8SSachin Saxena uint8_t flags, 142296f7bfe8SSachin Saxena uint8_t tc_id, 142396f7bfe8SSachin Saxena uint8_t flow_id) 1424b4d97b7dSHemant Agrawal { 1425b4d97b7dSHemant Agrawal struct mc_command cmd = { 0 }; 142616bbc98aSShreyansh Jain struct dpni_cmd_add_mac_addr *cmd_params; 142716bbc98aSShreyansh Jain int i; 1428b4d97b7dSHemant Agrawal 1429b4d97b7dSHemant Agrawal /* prepare command */ 1430b4d97b7dSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR, 1431b4d97b7dSHemant Agrawal cmd_flags, 1432b4d97b7dSHemant Agrawal token); 143316bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params; 143496f7bfe8SSachin Saxena cmd_params->flags = flags; 143596f7bfe8SSachin Saxena cmd_params->tc_id = tc_id; 143696f7bfe8SSachin Saxena cmd_params->fq_id = flow_id; 143796f7bfe8SSachin Saxena 143816bbc98aSShreyansh Jain for (i = 0; i < 6; i++) 143916bbc98aSShreyansh Jain cmd_params->mac_addr[i] = mac_addr[5 - i]; 1440b4d97b7dSHemant Agrawal 1441b4d97b7dSHemant Agrawal /* send command to mc*/ 1442b4d97b7dSHemant Agrawal return mc_send_command(mc_io, &cmd); 1443b4d97b7dSHemant Agrawal } 1444b4d97b7dSHemant Agrawal 144516bbc98aSShreyansh Jain /** 144616bbc98aSShreyansh Jain * dpni_remove_mac_addr() - Remove MAC address filter 144716bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 144816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 144916bbc98aSShreyansh Jain * @token: Token of DPNI object 145016bbc98aSShreyansh Jain * @mac_addr: MAC address to remove 145116bbc98aSShreyansh Jain * 145216bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 145316bbc98aSShreyansh Jain */ 1454b4d97b7dSHemant Agrawal int dpni_remove_mac_addr(struct fsl_mc_io *mc_io, 1455b4d97b7dSHemant Agrawal uint32_t cmd_flags, 1456b4d97b7dSHemant Agrawal uint16_t token, 1457b4d97b7dSHemant Agrawal const uint8_t mac_addr[6]) 1458b4d97b7dSHemant Agrawal { 1459b4d97b7dSHemant Agrawal struct mc_command cmd = { 0 }; 146016bbc98aSShreyansh Jain struct dpni_cmd_remove_mac_addr *cmd_params; 146116bbc98aSShreyansh Jain int i; 1462b4d97b7dSHemant Agrawal 1463b4d97b7dSHemant Agrawal /* prepare command */ 1464b4d97b7dSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR, 1465b4d97b7dSHemant Agrawal cmd_flags, 1466b4d97b7dSHemant Agrawal token); 146716bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params; 146816bbc98aSShreyansh Jain for (i = 0; i < 6; i++) 146916bbc98aSShreyansh Jain cmd_params->mac_addr[i] = mac_addr[5 - i]; 1470b4d97b7dSHemant Agrawal 1471b4d97b7dSHemant Agrawal /* send command to mc*/ 1472b4d97b7dSHemant Agrawal return mc_send_command(mc_io, &cmd); 1473b4d97b7dSHemant Agrawal } 1474b4d97b7dSHemant Agrawal 147516bbc98aSShreyansh Jain /** 147616bbc98aSShreyansh Jain * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters 147716bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 147816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 147916bbc98aSShreyansh Jain * @token: Token of DPNI object 148016bbc98aSShreyansh Jain * @unicast: Set to '1' to clear unicast addresses 148116bbc98aSShreyansh Jain * @multicast: Set to '1' to clear multicast addresses 148216bbc98aSShreyansh Jain * 148316bbc98aSShreyansh Jain * The primary MAC address is not cleared by this operation. 148416bbc98aSShreyansh Jain * 148516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 148616bbc98aSShreyansh Jain */ 1487b4d97b7dSHemant Agrawal int dpni_clear_mac_filters(struct fsl_mc_io *mc_io, 1488b4d97b7dSHemant Agrawal uint32_t cmd_flags, 1489b4d97b7dSHemant Agrawal uint16_t token, 1490b4d97b7dSHemant Agrawal int unicast, 1491b4d97b7dSHemant Agrawal int multicast) 1492b4d97b7dSHemant Agrawal { 1493b4d97b7dSHemant Agrawal struct mc_command cmd = { 0 }; 149416bbc98aSShreyansh Jain struct dpni_cmd_clear_mac_filters *cmd_params; 1495b4d97b7dSHemant Agrawal 1496b4d97b7dSHemant Agrawal /* prepare command */ 1497b4d97b7dSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS, 1498b4d97b7dSHemant Agrawal cmd_flags, 1499b4d97b7dSHemant Agrawal token); 150016bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params; 150116bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast); 150216bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast); 1503b4d97b7dSHemant Agrawal 1504b4d97b7dSHemant Agrawal /* send command to mc*/ 1505b4d97b7dSHemant Agrawal return mc_send_command(mc_io, &cmd); 1506b4d97b7dSHemant Agrawal } 1507b4d97b7dSHemant Agrawal 150816bbc98aSShreyansh Jain /** 150916bbc98aSShreyansh Jain * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical 151016bbc98aSShreyansh Jain * port the DPNI is attached to 151116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 151216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 151316bbc98aSShreyansh Jain * @token: Token of DPNI object 151416bbc98aSShreyansh Jain * @mac_addr: MAC address of the physical port, if any, otherwise 0 151516bbc98aSShreyansh Jain * 151616bbc98aSShreyansh Jain * The primary MAC address is not cleared by this operation. 151716bbc98aSShreyansh Jain * 151816bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 151916bbc98aSShreyansh Jain */ 1520b4d97b7dSHemant Agrawal int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io, 1521b4d97b7dSHemant Agrawal uint32_t cmd_flags, 1522b4d97b7dSHemant Agrawal uint16_t token, 1523b4d97b7dSHemant Agrawal uint8_t mac_addr[6]) 1524b4d97b7dSHemant Agrawal { 1525b4d97b7dSHemant Agrawal struct mc_command cmd = { 0 }; 152616bbc98aSShreyansh Jain struct dpni_rsp_get_port_mac_addr *rsp_params; 152716bbc98aSShreyansh Jain int i, err; 1528b4d97b7dSHemant Agrawal 1529b4d97b7dSHemant Agrawal /* prepare command */ 1530b4d97b7dSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR, 1531b4d97b7dSHemant Agrawal cmd_flags, 1532b4d97b7dSHemant Agrawal token); 1533b4d97b7dSHemant Agrawal 1534b4d97b7dSHemant Agrawal /* send command to mc*/ 1535b4d97b7dSHemant Agrawal err = mc_send_command(mc_io, &cmd); 1536b4d97b7dSHemant Agrawal if (err) 1537b4d97b7dSHemant Agrawal return err; 1538b4d97b7dSHemant Agrawal 1539b4d97b7dSHemant Agrawal /* retrieve response parameters */ 154016bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params; 154116bbc98aSShreyansh Jain for (i = 0; i < 6; i++) 154216bbc98aSShreyansh Jain mac_addr[5 - i] = rsp_params->mac_addr[i]; 1543b4d97b7dSHemant Agrawal 1544b4d97b7dSHemant Agrawal return 0; 1545b4d97b7dSHemant Agrawal } 1546b4d97b7dSHemant Agrawal 154716bbc98aSShreyansh Jain /** 154816bbc98aSShreyansh Jain * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode 154916bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 155016bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 155116bbc98aSShreyansh Jain * @token: Token of DPNI object 155216bbc98aSShreyansh Jain * @en: Set to '1' to enable; '0' to disable 155316bbc98aSShreyansh Jain * 155416bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 155516bbc98aSShreyansh Jain */ 15563ce294f2SHemant Agrawal int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io, 15573ce294f2SHemant Agrawal uint32_t cmd_flags, 15583ce294f2SHemant Agrawal uint16_t token, 15593ce294f2SHemant Agrawal int en) 15603ce294f2SHemant Agrawal { 156116bbc98aSShreyansh Jain struct dpni_cmd_enable_vlan_filter *cmd_params; 15623ce294f2SHemant Agrawal struct mc_command cmd = { 0 }; 15633ce294f2SHemant Agrawal 15643ce294f2SHemant Agrawal /* prepare command */ 15653ce294f2SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER, 15663ce294f2SHemant Agrawal cmd_flags, 15673ce294f2SHemant Agrawal token); 156816bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params; 156916bbc98aSShreyansh Jain dpni_set_field(cmd_params->en, ENABLE, en); 15703ce294f2SHemant Agrawal 15713ce294f2SHemant Agrawal /* send command to mc*/ 15723ce294f2SHemant Agrawal return mc_send_command(mc_io, &cmd); 15733ce294f2SHemant Agrawal } 15743ce294f2SHemant Agrawal 157516bbc98aSShreyansh Jain /** 157616bbc98aSShreyansh Jain * dpni_add_vlan_id() - Add VLAN ID filter 157716bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 157816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 157916bbc98aSShreyansh Jain * @token: Token of DPNI object 158016bbc98aSShreyansh Jain * @vlan_id: VLAN ID to add 158196f7bfe8SSachin Saxena * @flags: 0 - tc_id and flow_id will be ignored. 158296f7bfe8SSachin Saxena * Pkt with this vlan_id will be passed to the next 158396f7bfe8SSachin Saxena * classification stages 158496f7bfe8SSachin Saxena * DPNI_VLAN_SET_QUEUE_ACTION 158596f7bfe8SSachin Saxena * Pkt with this vlan_id will be forward directly to 158696f7bfe8SSachin Saxena * queue defined by the tc_id and flow_id 158796f7bfe8SSachin Saxena * 158896f7bfe8SSachin Saxena * @tc_id: Traffic class selection (0-7) 158996f7bfe8SSachin Saxena * @flow_id: Selects the specific queue out of the set allocated for the 159096f7bfe8SSachin Saxena * same as tc_id. Value must be in range 0 to NUM_QUEUES - 1 159116bbc98aSShreyansh Jain * 159216bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 159316bbc98aSShreyansh Jain */ 15943ce294f2SHemant Agrawal int dpni_add_vlan_id(struct fsl_mc_io *mc_io, 15953ce294f2SHemant Agrawal uint32_t cmd_flags, 15963ce294f2SHemant Agrawal uint16_t token, 159796f7bfe8SSachin Saxena uint16_t vlan_id, 159896f7bfe8SSachin Saxena uint8_t flags, 159996f7bfe8SSachin Saxena uint8_t tc_id, 160096f7bfe8SSachin Saxena uint8_t flow_id) 16013ce294f2SHemant Agrawal { 160216bbc98aSShreyansh Jain struct dpni_cmd_vlan_id *cmd_params; 16033ce294f2SHemant Agrawal struct mc_command cmd = { 0 }; 16043ce294f2SHemant Agrawal 16053ce294f2SHemant Agrawal /* prepare command */ 16063ce294f2SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID, 16073ce294f2SHemant Agrawal cmd_flags, 16083ce294f2SHemant Agrawal token); 160916bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_vlan_id *)cmd.params; 161096f7bfe8SSachin Saxena cmd_params->flags = flags; 161196f7bfe8SSachin Saxena cmd_params->tc_id = tc_id; 161296f7bfe8SSachin Saxena cmd_params->flow_id = flow_id; 161316bbc98aSShreyansh Jain cmd_params->vlan_id = cpu_to_le16(vlan_id); 16143ce294f2SHemant Agrawal 16153ce294f2SHemant Agrawal /* send command to mc*/ 16163ce294f2SHemant Agrawal return mc_send_command(mc_io, &cmd); 16173ce294f2SHemant Agrawal } 16183ce294f2SHemant Agrawal 161916bbc98aSShreyansh Jain /** 162016bbc98aSShreyansh Jain * dpni_remove_vlan_id() - Remove VLAN ID filter 162116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 162216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 162316bbc98aSShreyansh Jain * @token: Token of DPNI object 162416bbc98aSShreyansh Jain * @vlan_id: VLAN ID to remove 162516bbc98aSShreyansh Jain * 162616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 162716bbc98aSShreyansh Jain */ 16283ce294f2SHemant Agrawal int dpni_remove_vlan_id(struct fsl_mc_io *mc_io, 16293ce294f2SHemant Agrawal uint32_t cmd_flags, 16303ce294f2SHemant Agrawal uint16_t token, 16313ce294f2SHemant Agrawal uint16_t vlan_id) 16323ce294f2SHemant Agrawal { 163316bbc98aSShreyansh Jain struct dpni_cmd_vlan_id *cmd_params; 16343ce294f2SHemant Agrawal struct mc_command cmd = { 0 }; 16353ce294f2SHemant Agrawal 16363ce294f2SHemant Agrawal /* prepare command */ 16373ce294f2SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID, 16383ce294f2SHemant Agrawal cmd_flags, 16393ce294f2SHemant Agrawal token); 164016bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_vlan_id *)cmd.params; 164116bbc98aSShreyansh Jain cmd_params->vlan_id = cpu_to_le16(vlan_id); 16423ce294f2SHemant Agrawal 16433ce294f2SHemant Agrawal /* send command to mc*/ 16443ce294f2SHemant Agrawal return mc_send_command(mc_io, &cmd); 16453ce294f2SHemant Agrawal } 16463ce294f2SHemant Agrawal 164716bbc98aSShreyansh Jain /** 164816bbc98aSShreyansh Jain * dpni_clear_vlan_filters() - Clear all VLAN filters 164916bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 165016bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 165116bbc98aSShreyansh Jain * @token: Token of DPNI object 165216bbc98aSShreyansh Jain * 165316bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 165416bbc98aSShreyansh Jain */ 16553ce294f2SHemant Agrawal int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io, 16563ce294f2SHemant Agrawal uint32_t cmd_flags, 16573ce294f2SHemant Agrawal uint16_t token) 16583ce294f2SHemant Agrawal { 16593ce294f2SHemant Agrawal struct mc_command cmd = { 0 }; 16603ce294f2SHemant Agrawal 16613ce294f2SHemant Agrawal /* prepare command */ 16623ce294f2SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_VLAN_FILTERS, 16633ce294f2SHemant Agrawal cmd_flags, 16643ce294f2SHemant Agrawal token); 16653ce294f2SHemant Agrawal 16663ce294f2SHemant Agrawal /* send command to mc*/ 16673ce294f2SHemant Agrawal return mc_send_command(mc_io, &cmd); 16683ce294f2SHemant Agrawal } 16693ce294f2SHemant Agrawal 167016bbc98aSShreyansh Jain /** 1671ac624068SGagandeep Singh * dpni_set_tx_priorities() - Set transmission TC priority configuration 1672ac624068SGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 1673ac624068SGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1674ac624068SGagandeep Singh * @token: Token of DPNI object 1675ac624068SGagandeep Singh * @cfg: Transmission selection configuration 1676ac624068SGagandeep Singh * 1677ac624068SGagandeep Singh * warning: Allowed only when DPNI is disabled 1678ac624068SGagandeep Singh * 1679ac624068SGagandeep Singh * Return: '0' on Success; Error code otherwise. 1680ac624068SGagandeep Singh */ 1681ac624068SGagandeep Singh int dpni_set_tx_priorities(struct fsl_mc_io *mc_io, 1682ac624068SGagandeep Singh uint32_t cmd_flags, 1683ac624068SGagandeep Singh uint16_t token, 1684ac624068SGagandeep Singh const struct dpni_tx_priorities_cfg *cfg) 1685ac624068SGagandeep Singh { 1686ac624068SGagandeep Singh struct dpni_cmd_set_tx_priorities *cmd_params; 1687ac624068SGagandeep Singh struct mc_command cmd = { 0 }; 1688ac624068SGagandeep Singh int i; 1689ac624068SGagandeep Singh 1690ac624068SGagandeep Singh /* prepare command */ 1691ac624068SGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_PRIORITIES, 1692ac624068SGagandeep Singh cmd_flags, 1693ac624068SGagandeep Singh token); 1694ac624068SGagandeep Singh cmd_params = (struct dpni_cmd_set_tx_priorities *)cmd.params; 1695f48cd6c6SNipun Gupta cmd_params->channel_idx = cfg->channel_idx; 1696ac624068SGagandeep Singh dpni_set_field(cmd_params->flags, 1697ac624068SGagandeep Singh SEPARATE_GRP, 1698ac624068SGagandeep Singh cfg->separate_groups); 1699ac624068SGagandeep Singh cmd_params->prio_group_A = cfg->prio_group_A; 1700ac624068SGagandeep Singh cmd_params->prio_group_B = cfg->prio_group_B; 1701ac624068SGagandeep Singh 1702ac624068SGagandeep Singh for (i = 0; i + 1 < DPNI_MAX_TC; i = i + 2) { 1703ac624068SGagandeep Singh dpni_set_field(cmd_params->modes[i / 2], 1704ac624068SGagandeep Singh MODE_1, 1705ac624068SGagandeep Singh cfg->tc_sched[i].mode); 1706ac624068SGagandeep Singh dpni_set_field(cmd_params->modes[i / 2], 1707ac624068SGagandeep Singh MODE_2, 1708ac624068SGagandeep Singh cfg->tc_sched[i + 1].mode); 1709ac624068SGagandeep Singh } 1710ac624068SGagandeep Singh 1711ac624068SGagandeep Singh for (i = 0; i < DPNI_MAX_TC; i++) { 1712ac624068SGagandeep Singh cmd_params->delta_bandwidth[i] = 1713ac624068SGagandeep Singh cpu_to_le16(cfg->tc_sched[i].delta_bandwidth); 1714ac624068SGagandeep Singh } 1715ac624068SGagandeep Singh 1716ac624068SGagandeep Singh /* send command to mc*/ 1717ac624068SGagandeep Singh return mc_send_command(mc_io, &cmd); 1718ac624068SGagandeep Singh } 1719ac624068SGagandeep Singh 1720ac624068SGagandeep Singh /** 172116bbc98aSShreyansh Jain * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration 172216bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 172316bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 172416bbc98aSShreyansh Jain * @token: Token of DPNI object 172516bbc98aSShreyansh Jain * @tc_id: Traffic class selection (0-7) 172616bbc98aSShreyansh Jain * @cfg: Traffic class distribution configuration 172716bbc98aSShreyansh Jain * 172816bbc98aSShreyansh Jain * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpkg_prepare_key_cfg() 172916bbc98aSShreyansh Jain * first to prepare the key_cfg_iova parameter 173016bbc98aSShreyansh Jain * 173116bbc98aSShreyansh Jain * Return: '0' on Success; error code otherwise. 173216bbc98aSShreyansh Jain */ 1733e6b82573SHemant Agrawal int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io, 1734e6b82573SHemant Agrawal uint32_t cmd_flags, 1735e6b82573SHemant Agrawal uint16_t token, 1736e6b82573SHemant Agrawal uint8_t tc_id, 1737e6b82573SHemant Agrawal const struct dpni_rx_tc_dist_cfg *cfg) 1738e6b82573SHemant Agrawal { 1739e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 174016bbc98aSShreyansh Jain struct dpni_cmd_set_rx_tc_dist *cmd_params; 1741e6b82573SHemant Agrawal 1742e6b82573SHemant Agrawal /* prepare command */ 1743e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST, 1744e6b82573SHemant Agrawal cmd_flags, 1745e6b82573SHemant Agrawal token); 174616bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params; 174716bbc98aSShreyansh Jain cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 174816bbc98aSShreyansh Jain cmd_params->tc_id = tc_id; 174916bbc98aSShreyansh Jain cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id); 175016bbc98aSShreyansh Jain cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 175116bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, 175216bbc98aSShreyansh Jain DIST_MODE, 175316bbc98aSShreyansh Jain cfg->dist_mode); 175416bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, 175516bbc98aSShreyansh Jain MISS_ACTION, 175616bbc98aSShreyansh Jain cfg->fs_cfg.miss_action); 175716bbc98aSShreyansh Jain dpni_set_field(cmd_params->keep_hash_key, 175816bbc98aSShreyansh Jain KEEP_HASH_KEY, 175916bbc98aSShreyansh Jain cfg->fs_cfg.keep_hash_key); 176025fea082SHemant Agrawal dpni_set_field(cmd_params->keep_hash_key, 176125fea082SHemant Agrawal KEEP_ENTRIES, 176225fea082SHemant Agrawal cfg->fs_cfg.keep_entries); 1763e6b82573SHemant Agrawal 1764e6b82573SHemant Agrawal /* send command to mc*/ 1765e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 1766e6b82573SHemant Agrawal } 1767e6b82573SHemant Agrawal 176816bbc98aSShreyansh Jain /** 176916bbc98aSShreyansh Jain * dpni_set_tx_confirmation_mode() - Tx confirmation mode 177016bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 177116bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 177216bbc98aSShreyansh Jain * @token: Token of DPNI object 1773*591200efSGagandeep Singh * @ceetm_ch_idx: ceetm channel index 177416bbc98aSShreyansh Jain * @mode: Tx confirmation mode 177516bbc98aSShreyansh Jain * 177616bbc98aSShreyansh Jain * This function is useful only when 'DPNI_OPT_TX_CONF_DISABLED' is not 177716bbc98aSShreyansh Jain * selected at DPNI creation. 177816bbc98aSShreyansh Jain * Calling this function with 'mode' set to DPNI_CONF_DISABLE disables all 177916bbc98aSShreyansh Jain * transmit confirmation (including the private confirmation queues), regardless 178016bbc98aSShreyansh Jain * of previous settings; Note that in this case, Tx error frames are still 178116bbc98aSShreyansh Jain * enqueued to the general transmit errors queue. 178216bbc98aSShreyansh Jain * Calling this function with 'mode' set to DPNI_CONF_SINGLE switches all 178316bbc98aSShreyansh Jain * Tx confirmations to a shared Tx conf queue. 'index' field in dpni_get_queue 178416bbc98aSShreyansh Jain * command will be ignored. 178516bbc98aSShreyansh Jain * 178616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 178716bbc98aSShreyansh Jain */ 1788e6b82573SHemant Agrawal int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io, 1789e6b82573SHemant Agrawal uint32_t cmd_flags, 1790e6b82573SHemant Agrawal uint16_t token, 1791*591200efSGagandeep Singh uint8_t ceetm_ch_idx, 1792e6b82573SHemant Agrawal enum dpni_confirmation_mode mode) 1793e6b82573SHemant Agrawal { 179416bbc98aSShreyansh Jain struct dpni_tx_confirmation_mode *cmd_params; 1795e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 1796e6b82573SHemant Agrawal 1797e6b82573SHemant Agrawal /* prepare command */ 1798e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE, 1799e6b82573SHemant Agrawal cmd_flags, 1800e6b82573SHemant Agrawal token); 180116bbc98aSShreyansh Jain cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params; 1802*591200efSGagandeep Singh cmd_params->ceetm_ch_idx = ceetm_ch_idx; 180316bbc98aSShreyansh Jain cmd_params->confirmation_mode = mode; 1804e6b82573SHemant Agrawal 1805e6b82573SHemant Agrawal /* send command to mc*/ 1806e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 1807e6b82573SHemant Agrawal } 1808e6b82573SHemant Agrawal 180916bbc98aSShreyansh Jain /** 181072100f0dSGagandeep Singh * dpni_get_tx_confirmation_mode() - Get Tx confirmation mode 181172100f0dSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 181272100f0dSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 181372100f0dSGagandeep Singh * @token: Token of DPNI object 1814*591200efSGagandeep Singh * @ceetm_ch_idx: ceetm channel index 181572100f0dSGagandeep Singh * @mode: Tx confirmation mode 181672100f0dSGagandeep Singh * 181772100f0dSGagandeep Singh * Return: '0' on Success; Error code otherwise. 181872100f0dSGagandeep Singh */ 181972100f0dSGagandeep Singh int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io, 182072100f0dSGagandeep Singh uint32_t cmd_flags, 182172100f0dSGagandeep Singh uint16_t token, 1822*591200efSGagandeep Singh uint8_t ceetm_ch_idx, 182372100f0dSGagandeep Singh enum dpni_confirmation_mode *mode) 182472100f0dSGagandeep Singh { 1825*591200efSGagandeep Singh struct dpni_tx_confirmation_mode *cmd_params; 182672100f0dSGagandeep Singh struct dpni_tx_confirmation_mode *rsp_params; 182772100f0dSGagandeep Singh struct mc_command cmd = { 0 }; 182872100f0dSGagandeep Singh int err; 182972100f0dSGagandeep Singh 183072100f0dSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONFIRMATION_MODE, 183172100f0dSGagandeep Singh cmd_flags, 183272100f0dSGagandeep Singh token); 1833*591200efSGagandeep Singh cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params; 1834*591200efSGagandeep Singh cmd_params->ceetm_ch_idx = ceetm_ch_idx; 183572100f0dSGagandeep Singh 183672100f0dSGagandeep Singh err = mc_send_command(mc_io, &cmd); 183772100f0dSGagandeep Singh if (err) 183872100f0dSGagandeep Singh return err; 183972100f0dSGagandeep Singh 184072100f0dSGagandeep Singh rsp_params = (struct dpni_tx_confirmation_mode *)cmd.params; 184172100f0dSGagandeep Singh *mode = rsp_params->confirmation_mode; 184272100f0dSGagandeep Singh 184372100f0dSGagandeep Singh return 0; 184472100f0dSGagandeep Singh } 184572100f0dSGagandeep Singh 184672100f0dSGagandeep Singh /** 1847*591200efSGagandeep Singh * dpni_set_queue_tx_confirmation_mode() - Set Tx confirmation mode 1848*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 1849*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1850*591200efSGagandeep Singh * @token: Token of DPNI object 1851*591200efSGagandeep Singh * @ceetm_ch_idx: ceetm channel index 1852*591200efSGagandeep Singh * @index: queue index 1853*591200efSGagandeep Singh * @mode: Tx confirmation mode 1854*591200efSGagandeep Singh * 1855*591200efSGagandeep Singh * Return: '0' on Success; Error code otherwise. 1856*591200efSGagandeep Singh */ 1857*591200efSGagandeep Singh int dpni_set_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io, 1858*591200efSGagandeep Singh uint32_t cmd_flags, 1859*591200efSGagandeep Singh uint16_t token, 1860*591200efSGagandeep Singh uint8_t ceetm_ch_idx, uint8_t index, 1861*591200efSGagandeep Singh enum dpni_confirmation_mode mode) 1862*591200efSGagandeep Singh { 1863*591200efSGagandeep Singh struct dpni_queue_tx_confirmation_mode *cmd_params; 1864*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 1865*591200efSGagandeep Singh 1866*591200efSGagandeep Singh /* prepare command */ 1867*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE_TX_CONFIRMATION_MODE, 1868*591200efSGagandeep Singh cmd_flags, 1869*591200efSGagandeep Singh token); 1870*591200efSGagandeep Singh cmd_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params; 1871*591200efSGagandeep Singh cmd_params->ceetm_ch_idx = ceetm_ch_idx; 1872*591200efSGagandeep Singh cmd_params->index = index; 1873*591200efSGagandeep Singh cmd_params->confirmation_mode = mode; 1874*591200efSGagandeep Singh 1875*591200efSGagandeep Singh /* send command to mc*/ 1876*591200efSGagandeep Singh return mc_send_command(mc_io, &cmd); 1877*591200efSGagandeep Singh } 1878*591200efSGagandeep Singh 1879*591200efSGagandeep Singh /** 1880*591200efSGagandeep Singh * dpni_get_queue_tx_confirmation_mode() - Get Tx confirmation mode 1881*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 1882*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1883*591200efSGagandeep Singh * @token: Token of DPNI object 1884*591200efSGagandeep Singh * @ceetm_ch_idx: ceetm channel index 1885*591200efSGagandeep Singh * @index: queue index 1886*591200efSGagandeep Singh * @mode: Tx confirmation mode 1887*591200efSGagandeep Singh * 1888*591200efSGagandeep Singh * Return: '0' on Success; Error code otherwise. 1889*591200efSGagandeep Singh */ 1890*591200efSGagandeep Singh int dpni_get_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io, 1891*591200efSGagandeep Singh uint32_t cmd_flags, 1892*591200efSGagandeep Singh uint16_t token, 1893*591200efSGagandeep Singh uint8_t ceetm_ch_idx, uint8_t index, 1894*591200efSGagandeep Singh enum dpni_confirmation_mode *mode) 1895*591200efSGagandeep Singh { 1896*591200efSGagandeep Singh struct dpni_queue_tx_confirmation_mode *cmd_params; 1897*591200efSGagandeep Singh struct dpni_queue_tx_confirmation_mode *rsp_params; 1898*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 1899*591200efSGagandeep Singh int err; 1900*591200efSGagandeep Singh 1901*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE_TX_CONFIRMATION_MODE, 1902*591200efSGagandeep Singh cmd_flags, 1903*591200efSGagandeep Singh token); 1904*591200efSGagandeep Singh cmd_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params; 1905*591200efSGagandeep Singh cmd_params->ceetm_ch_idx = ceetm_ch_idx; 1906*591200efSGagandeep Singh cmd_params->index = index; 1907*591200efSGagandeep Singh 1908*591200efSGagandeep Singh err = mc_send_command(mc_io, &cmd); 1909*591200efSGagandeep Singh if (err) 1910*591200efSGagandeep Singh return err; 1911*591200efSGagandeep Singh 1912*591200efSGagandeep Singh rsp_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params; 1913*591200efSGagandeep Singh *mode = rsp_params->confirmation_mode; 1914*591200efSGagandeep Singh 1915*591200efSGagandeep Singh return 0; 1916*591200efSGagandeep Singh } 1917*591200efSGagandeep Singh 1918*591200efSGagandeep Singh /** 1919fe2b986aSSunil Kumar Kori * dpni_set_qos_table() - Set QoS mapping table 1920fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 1921fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1922fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 1923fe2b986aSSunil Kumar Kori * @cfg: QoS table configuration 1924fe2b986aSSunil Kumar Kori * 1925fe2b986aSSunil Kumar Kori * This function and all QoS-related functions require that 1926fe2b986aSSunil Kumar Kori *'max_tcs > 1' was set at DPNI creation. 1927fe2b986aSSunil Kumar Kori * 1928fe2b986aSSunil Kumar Kori * warning: Before calling this function, call dpkg_prepare_key_cfg() to 1929fe2b986aSSunil Kumar Kori * prepare the key_cfg_iova parameter 1930fe2b986aSSunil Kumar Kori * 1931fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 1932fe2b986aSSunil Kumar Kori */ 1933fe2b986aSSunil Kumar Kori int dpni_set_qos_table(struct fsl_mc_io *mc_io, 1934fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 1935fe2b986aSSunil Kumar Kori uint16_t token, 1936fe2b986aSSunil Kumar Kori const struct dpni_qos_tbl_cfg *cfg) 1937fe2b986aSSunil Kumar Kori { 1938fe2b986aSSunil Kumar Kori struct dpni_cmd_set_qos_table *cmd_params; 1939fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 1940fe2b986aSSunil Kumar Kori 1941fe2b986aSSunil Kumar Kori /* prepare command */ 1942fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL, 1943fe2b986aSSunil Kumar Kori cmd_flags, 1944fe2b986aSSunil Kumar Kori token); 1945fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params; 1946fe2b986aSSunil Kumar Kori cmd_params->default_tc = cfg->default_tc; 1947fe2b986aSSunil Kumar Kori cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 1948fe2b986aSSunil Kumar Kori dpni_set_field(cmd_params->discard_on_miss, 1949fe2b986aSSunil Kumar Kori ENABLE, 1950fe2b986aSSunil Kumar Kori cfg->discard_on_miss); 1951fe2b986aSSunil Kumar Kori dpni_set_field(cmd_params->discard_on_miss, 1952fe2b986aSSunil Kumar Kori KEEP_QOS_ENTRIES, 1953fe2b986aSSunil Kumar Kori cfg->keep_entries); 1954fe2b986aSSunil Kumar Kori 1955fe2b986aSSunil Kumar Kori /* send command to mc*/ 1956fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 1957fe2b986aSSunil Kumar Kori } 1958fe2b986aSSunil Kumar Kori 1959fe2b986aSSunil Kumar Kori /** 1960fe2b986aSSunil Kumar Kori * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class) 1961fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 1962fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1963fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 1964fe2b986aSSunil Kumar Kori * @cfg: QoS rule to add 1965fe2b986aSSunil Kumar Kori * @tc_id: Traffic class selection (0-7) 1966fe2b986aSSunil Kumar Kori * @index: Location in the QoS table where to insert the entry. 1967fe2b986aSSunil Kumar Kori * Only relevant if MASKING is enabled for QoS classification on 1968fe2b986aSSunil Kumar Kori * this DPNI, it is ignored for exact match. 1969fe2b986aSSunil Kumar Kori * 1970fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 1971fe2b986aSSunil Kumar Kori */ 1972fe2b986aSSunil Kumar Kori int dpni_add_qos_entry(struct fsl_mc_io *mc_io, 1973fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 1974fe2b986aSSunil Kumar Kori uint16_t token, 1975fe2b986aSSunil Kumar Kori const struct dpni_rule_cfg *cfg, 1976fe2b986aSSunil Kumar Kori uint8_t tc_id, 197796f7bfe8SSachin Saxena uint16_t index, 197896f7bfe8SSachin Saxena uint8_t flags, 197996f7bfe8SSachin Saxena uint8_t flow_id) 1980fe2b986aSSunil Kumar Kori { 1981fe2b986aSSunil Kumar Kori struct dpni_cmd_add_qos_entry *cmd_params; 1982fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 1983fe2b986aSSunil Kumar Kori 1984fe2b986aSSunil Kumar Kori /* prepare command */ 1985fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT, 1986fe2b986aSSunil Kumar Kori cmd_flags, 1987fe2b986aSSunil Kumar Kori token); 1988fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params; 198996f7bfe8SSachin Saxena cmd_params->flags = flags; 199096f7bfe8SSachin Saxena cmd_params->flow_id = flow_id; 1991fe2b986aSSunil Kumar Kori cmd_params->tc_id = tc_id; 1992fe2b986aSSunil Kumar Kori cmd_params->key_size = cfg->key_size; 1993fe2b986aSSunil Kumar Kori cmd_params->index = cpu_to_le16(index); 1994fe2b986aSSunil Kumar Kori cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 1995fe2b986aSSunil Kumar Kori cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 1996fe2b986aSSunil Kumar Kori 1997fe2b986aSSunil Kumar Kori /* send command to mc*/ 1998fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 1999fe2b986aSSunil Kumar Kori } 2000fe2b986aSSunil Kumar Kori 2001fe2b986aSSunil Kumar Kori /** 2002fe2b986aSSunil Kumar Kori * dpni_remove_qos_entry() - Remove QoS mapping entry 2003fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 2004fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2005fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 2006fe2b986aSSunil Kumar Kori * @cfg: QoS rule to remove 2007fe2b986aSSunil Kumar Kori * 2008fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 2009fe2b986aSSunil Kumar Kori */ 2010fe2b986aSSunil Kumar Kori int dpni_remove_qos_entry(struct fsl_mc_io *mc_io, 2011fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 2012fe2b986aSSunil Kumar Kori uint16_t token, 2013fe2b986aSSunil Kumar Kori const struct dpni_rule_cfg *cfg) 2014fe2b986aSSunil Kumar Kori { 2015fe2b986aSSunil Kumar Kori struct dpni_cmd_remove_qos_entry *cmd_params; 2016fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 2017fe2b986aSSunil Kumar Kori 2018fe2b986aSSunil Kumar Kori /* prepare command */ 2019fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT, 2020fe2b986aSSunil Kumar Kori cmd_flags, 2021fe2b986aSSunil Kumar Kori token); 2022fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params; 2023fe2b986aSSunil Kumar Kori cmd_params->key_size = cfg->key_size; 2024fe2b986aSSunil Kumar Kori cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 2025fe2b986aSSunil Kumar Kori cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 2026fe2b986aSSunil Kumar Kori 2027fe2b986aSSunil Kumar Kori /* send command to mc*/ 2028fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 2029fe2b986aSSunil Kumar Kori } 2030fe2b986aSSunil Kumar Kori 2031fe2b986aSSunil Kumar Kori /** 2032fe2b986aSSunil Kumar Kori * dpni_clear_qos_table() - Clear all QoS mapping entries 2033fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 2034fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2035fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 2036fe2b986aSSunil Kumar Kori * 2037fe2b986aSSunil Kumar Kori * Following this function call, all frames are directed to 2038fe2b986aSSunil Kumar Kori * the default traffic class (0) 2039fe2b986aSSunil Kumar Kori * 2040fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 2041fe2b986aSSunil Kumar Kori */ 2042fe2b986aSSunil Kumar Kori int dpni_clear_qos_table(struct fsl_mc_io *mc_io, 2043fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 2044fe2b986aSSunil Kumar Kori uint16_t token) 2045fe2b986aSSunil Kumar Kori { 2046fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 2047fe2b986aSSunil Kumar Kori 2048fe2b986aSSunil Kumar Kori /* prepare command */ 2049fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL, 2050fe2b986aSSunil Kumar Kori cmd_flags, 2051fe2b986aSSunil Kumar Kori token); 2052fe2b986aSSunil Kumar Kori 2053fe2b986aSSunil Kumar Kori /* send command to mc*/ 2054fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 2055fe2b986aSSunil Kumar Kori } 2056fe2b986aSSunil Kumar Kori 2057fe2b986aSSunil Kumar Kori /** 2058fe2b986aSSunil Kumar Kori * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class 2059fe2b986aSSunil Kumar Kori * (to select a flow ID) 2060fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 2061fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2062fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 2063fe2b986aSSunil Kumar Kori * @tc_id: Traffic class selection (0-7) 2064fe2b986aSSunil Kumar Kori * @index: Location in the QoS table where to insert the entry. 2065fe2b986aSSunil Kumar Kori * Only relevant if MASKING is enabled for QoS classification 2066fe2b986aSSunil Kumar Kori * on this DPNI, it is ignored for exact match. 2067fe2b986aSSunil Kumar Kori * @cfg: Flow steering rule to add 2068fe2b986aSSunil Kumar Kori * @action: Action to be taken as result of a classification hit 2069fe2b986aSSunil Kumar Kori * 2070fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 2071fe2b986aSSunil Kumar Kori */ 2072fe2b986aSSunil Kumar Kori int dpni_add_fs_entry(struct fsl_mc_io *mc_io, 2073fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 2074fe2b986aSSunil Kumar Kori uint16_t token, 2075fe2b986aSSunil Kumar Kori uint8_t tc_id, 2076fe2b986aSSunil Kumar Kori uint16_t index, 2077fe2b986aSSunil Kumar Kori const struct dpni_rule_cfg *cfg, 2078fe2b986aSSunil Kumar Kori const struct dpni_fs_action_cfg *action) 2079fe2b986aSSunil Kumar Kori { 2080fe2b986aSSunil Kumar Kori struct dpni_cmd_add_fs_entry *cmd_params; 2081fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 2082fe2b986aSSunil Kumar Kori 2083fe2b986aSSunil Kumar Kori /* prepare command */ 2084fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT, 2085fe2b986aSSunil Kumar Kori cmd_flags, 2086fe2b986aSSunil Kumar Kori token); 2087fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params; 2088fe2b986aSSunil Kumar Kori cmd_params->tc_id = tc_id; 2089fe2b986aSSunil Kumar Kori cmd_params->key_size = cfg->key_size; 2090fe2b986aSSunil Kumar Kori cmd_params->index = cpu_to_le16(index); 2091fe2b986aSSunil Kumar Kori cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 2092fe2b986aSSunil Kumar Kori cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 2093fe2b986aSSunil Kumar Kori cmd_params->options = cpu_to_le16(action->options); 2094fe2b986aSSunil Kumar Kori cmd_params->flow_id = cpu_to_le16(action->flow_id); 2095fe2b986aSSunil Kumar Kori cmd_params->flc = cpu_to_le64(action->flc); 20962cb2abf3SHemant Agrawal cmd_params->redir_token = cpu_to_le16(action->redirect_obj_token); 2097fe2b986aSSunil Kumar Kori 2098fe2b986aSSunil Kumar Kori /* send command to mc*/ 2099fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 2100fe2b986aSSunil Kumar Kori } 2101fe2b986aSSunil Kumar Kori 2102fe2b986aSSunil Kumar Kori /** 2103fe2b986aSSunil Kumar Kori * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific 2104fe2b986aSSunil Kumar Kori * traffic class 2105fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 2106fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2107fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 2108fe2b986aSSunil Kumar Kori * @tc_id: Traffic class selection (0-7) 2109fe2b986aSSunil Kumar Kori * @cfg: Flow steering rule to remove 2110fe2b986aSSunil Kumar Kori * 2111fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 2112fe2b986aSSunil Kumar Kori */ 2113fe2b986aSSunil Kumar Kori int dpni_remove_fs_entry(struct fsl_mc_io *mc_io, 2114fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 2115fe2b986aSSunil Kumar Kori uint16_t token, 2116fe2b986aSSunil Kumar Kori uint8_t tc_id, 2117fe2b986aSSunil Kumar Kori const struct dpni_rule_cfg *cfg) 2118fe2b986aSSunil Kumar Kori { 2119fe2b986aSSunil Kumar Kori struct dpni_cmd_remove_fs_entry *cmd_params; 2120fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 2121fe2b986aSSunil Kumar Kori 2122fe2b986aSSunil Kumar Kori /* prepare command */ 2123fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT, 2124fe2b986aSSunil Kumar Kori cmd_flags, 2125fe2b986aSSunil Kumar Kori token); 2126fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params; 2127fe2b986aSSunil Kumar Kori cmd_params->tc_id = tc_id; 2128fe2b986aSSunil Kumar Kori cmd_params->key_size = cfg->key_size; 2129fe2b986aSSunil Kumar Kori cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 2130fe2b986aSSunil Kumar Kori cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 2131fe2b986aSSunil Kumar Kori 2132fe2b986aSSunil Kumar Kori /* send command to mc*/ 2133fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 2134fe2b986aSSunil Kumar Kori } 2135fe2b986aSSunil Kumar Kori 2136fe2b986aSSunil Kumar Kori /** 2137fe2b986aSSunil Kumar Kori * dpni_clear_fs_entries() - Clear all Flow Steering entries of a specific 2138fe2b986aSSunil Kumar Kori * traffic class 2139fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 2140fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2141fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 2142fe2b986aSSunil Kumar Kori * @tc_id: Traffic class selection (0-7) 2143fe2b986aSSunil Kumar Kori * 2144fe2b986aSSunil Kumar Kori * Return: '0' on Success; Error code otherwise. 2145fe2b986aSSunil Kumar Kori */ 2146fe2b986aSSunil Kumar Kori int dpni_clear_fs_entries(struct fsl_mc_io *mc_io, 2147fe2b986aSSunil Kumar Kori uint32_t cmd_flags, 2148fe2b986aSSunil Kumar Kori uint16_t token, 2149fe2b986aSSunil Kumar Kori uint8_t tc_id) 2150fe2b986aSSunil Kumar Kori { 2151fe2b986aSSunil Kumar Kori struct dpni_cmd_clear_fs_entries *cmd_params; 2152fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 2153fe2b986aSSunil Kumar Kori 2154fe2b986aSSunil Kumar Kori /* prepare command */ 2155fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_FS_ENT, 2156fe2b986aSSunil Kumar Kori cmd_flags, 2157fe2b986aSSunil Kumar Kori token); 2158fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_clear_fs_entries *)cmd.params; 2159fe2b986aSSunil Kumar Kori cmd_params->tc_id = tc_id; 2160fe2b986aSSunil Kumar Kori 2161fe2b986aSSunil Kumar Kori /* send command to mc*/ 2162fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 2163fe2b986aSSunil Kumar Kori } 2164fe2b986aSSunil Kumar Kori 2165fe2b986aSSunil Kumar Kori /** 2166ac624068SGagandeep Singh * dpni_set_rx_tc_policing() - Set Rx traffic class policing configuration 2167ac624068SGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 2168ac624068SGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2169ac624068SGagandeep Singh * @token: Token of DPNI object 2170ac624068SGagandeep Singh * @tc_id: Traffic class selection (0-7) 2171ac624068SGagandeep Singh * @cfg: Traffic class policing configuration 2172ac624068SGagandeep Singh * 2173ac624068SGagandeep Singh * Return: '0' on Success; error code otherwise. 2174ac624068SGagandeep Singh */ 2175ac624068SGagandeep Singh int dpni_set_rx_tc_policing(struct fsl_mc_io *mc_io, 2176ac624068SGagandeep Singh uint32_t cmd_flags, 2177ac624068SGagandeep Singh uint16_t token, 2178ac624068SGagandeep Singh uint8_t tc_id, 2179ac624068SGagandeep Singh const struct dpni_rx_tc_policing_cfg *cfg) 2180ac624068SGagandeep Singh { 2181ac624068SGagandeep Singh struct dpni_cmd_set_rx_tc_policing *cmd_params; 2182ac624068SGagandeep Singh struct mc_command cmd = { 0 }; 2183ac624068SGagandeep Singh 2184ac624068SGagandeep Singh /* prepare command */ 2185ac624068SGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_POLICING, 2186ac624068SGagandeep Singh cmd_flags, 2187ac624068SGagandeep Singh token); 2188ac624068SGagandeep Singh cmd_params = (struct dpni_cmd_set_rx_tc_policing *)cmd.params; 2189ac624068SGagandeep Singh dpni_set_field(cmd_params->mode_color, COLOR, cfg->default_color); 2190ac624068SGagandeep Singh dpni_set_field(cmd_params->mode_color, MODE, cfg->mode); 2191ac624068SGagandeep Singh dpni_set_field(cmd_params->units, UNITS, cfg->units); 2192ac624068SGagandeep Singh cmd_params->options = cpu_to_le32(cfg->options); 2193ac624068SGagandeep Singh cmd_params->cir = cpu_to_le32(cfg->cir); 2194ac624068SGagandeep Singh cmd_params->cbs = cpu_to_le32(cfg->cbs); 2195ac624068SGagandeep Singh cmd_params->eir = cpu_to_le32(cfg->eir); 2196ac624068SGagandeep Singh cmd_params->ebs = cpu_to_le32(cfg->ebs); 2197ac624068SGagandeep Singh cmd_params->tc_id = tc_id; 2198ac624068SGagandeep Singh 2199ac624068SGagandeep Singh /* send command to mc*/ 2200ac624068SGagandeep Singh return mc_send_command(mc_io, &cmd); 2201ac624068SGagandeep Singh } 2202ac624068SGagandeep Singh 2203ac624068SGagandeep Singh /** 2204ac624068SGagandeep Singh * dpni_get_rx_tc_policing() - Get Rx traffic class policing configuration 2205ac624068SGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 2206ac624068SGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2207ac624068SGagandeep Singh * @token: Token of DPNI object 2208ac624068SGagandeep Singh * @tc_id: Traffic class selection (0-7) 2209ac624068SGagandeep Singh * @cfg: Traffic class policing configuration 2210ac624068SGagandeep Singh * 2211ac624068SGagandeep Singh * Return: '0' on Success; error code otherwise. 2212ac624068SGagandeep Singh */ 2213ac624068SGagandeep Singh int dpni_get_rx_tc_policing(struct fsl_mc_io *mc_io, 2214ac624068SGagandeep Singh uint32_t cmd_flags, 2215ac624068SGagandeep Singh uint16_t token, 2216ac624068SGagandeep Singh uint8_t tc_id, 2217ac624068SGagandeep Singh struct dpni_rx_tc_policing_cfg *cfg) 2218ac624068SGagandeep Singh { 2219ac624068SGagandeep Singh struct dpni_rsp_get_rx_tc_policing *rsp_params; 2220ac624068SGagandeep Singh struct dpni_cmd_get_rx_tc_policing *cmd_params; 2221ac624068SGagandeep Singh struct mc_command cmd = { 0 }; 2222ac624068SGagandeep Singh int err; 2223ac624068SGagandeep Singh 2224ac624068SGagandeep Singh /* prepare command */ 2225ac624068SGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_TC_POLICING, 2226ac624068SGagandeep Singh cmd_flags, 2227ac624068SGagandeep Singh token); 2228ac624068SGagandeep Singh cmd_params = (struct dpni_cmd_get_rx_tc_policing *)cmd.params; 2229ac624068SGagandeep Singh cmd_params->tc_id = tc_id; 2230ac624068SGagandeep Singh 2231ac624068SGagandeep Singh 2232ac624068SGagandeep Singh /* send command to mc*/ 2233ac624068SGagandeep Singh err = mc_send_command(mc_io, &cmd); 2234ac624068SGagandeep Singh if (err) 2235ac624068SGagandeep Singh return err; 2236ac624068SGagandeep Singh 2237ac624068SGagandeep Singh rsp_params = (struct dpni_rsp_get_rx_tc_policing *)cmd.params; 2238ac624068SGagandeep Singh cfg->options = le32_to_cpu(rsp_params->options); 2239ac624068SGagandeep Singh cfg->cir = le32_to_cpu(rsp_params->cir); 2240ac624068SGagandeep Singh cfg->cbs = le32_to_cpu(rsp_params->cbs); 2241ac624068SGagandeep Singh cfg->eir = le32_to_cpu(rsp_params->eir); 2242ac624068SGagandeep Singh cfg->ebs = le32_to_cpu(rsp_params->ebs); 2243ac624068SGagandeep Singh cfg->units = dpni_get_field(rsp_params->units, UNITS); 2244ac624068SGagandeep Singh cfg->mode = dpni_get_field(rsp_params->mode_color, MODE); 2245ac624068SGagandeep Singh cfg->default_color = dpni_get_field(rsp_params->mode_color, COLOR); 2246ac624068SGagandeep Singh 2247ac624068SGagandeep Singh return 0; 2248ac624068SGagandeep Singh } 2249ac624068SGagandeep Singh 2250ac624068SGagandeep Singh /** 2251ac624068SGagandeep Singh * dpni_prepare_early_drop() - prepare an early drop. 2252ac624068SGagandeep Singh * @cfg: Early-drop configuration 2253ac624068SGagandeep Singh * @early_drop_buf: Zeroed 256 bytes of memory before mapping it to DMA 2254ac624068SGagandeep Singh * 2255ac624068SGagandeep Singh * This function has to be called before dpni_set_rx_tc_early_drop or 2256ac624068SGagandeep Singh * dpni_set_tx_tc_early_drop 2257ac624068SGagandeep Singh * 2258ac624068SGagandeep Singh */ 2259ac624068SGagandeep Singh void dpni_prepare_early_drop(const struct dpni_early_drop_cfg *cfg, 2260ac624068SGagandeep Singh uint8_t *early_drop_buf) 2261ac624068SGagandeep Singh { 2262ac624068SGagandeep Singh struct dpni_early_drop *ext_params; 2263ac624068SGagandeep Singh 2264ac624068SGagandeep Singh ext_params = (struct dpni_early_drop *)early_drop_buf; 2265ac624068SGagandeep Singh 2266ac624068SGagandeep Singh dpni_set_field(ext_params->flags, DROP_ENABLE, cfg->enable); 2267ac624068SGagandeep Singh dpni_set_field(ext_params->flags, DROP_UNITS, cfg->units); 2268ac624068SGagandeep Singh ext_params->green_drop_probability = cfg->green.drop_probability; 2269ac624068SGagandeep Singh ext_params->green_max_threshold = cpu_to_le64(cfg->green.max_threshold); 2270ac624068SGagandeep Singh ext_params->green_min_threshold = cpu_to_le64(cfg->green.min_threshold); 2271ac624068SGagandeep Singh ext_params->yellow_drop_probability = cfg->yellow.drop_probability; 2272ac624068SGagandeep Singh ext_params->yellow_max_threshold = 2273ac624068SGagandeep Singh cpu_to_le64(cfg->yellow.max_threshold); 2274ac624068SGagandeep Singh ext_params->yellow_min_threshold = 2275ac624068SGagandeep Singh cpu_to_le64(cfg->yellow.min_threshold); 2276ac624068SGagandeep Singh ext_params->red_drop_probability = cfg->red.drop_probability; 2277ac624068SGagandeep Singh ext_params->red_max_threshold = cpu_to_le64(cfg->red.max_threshold); 2278ac624068SGagandeep Singh ext_params->red_min_threshold = cpu_to_le64(cfg->red.min_threshold); 2279ac624068SGagandeep Singh } 2280ac624068SGagandeep Singh 2281ac624068SGagandeep Singh /** 2282ac624068SGagandeep Singh * dpni_extract_early_drop() - extract the early drop configuration. 2283ac624068SGagandeep Singh * @cfg: Early-drop configuration 2284ac624068SGagandeep Singh * @early_drop_buf: Zeroed 256 bytes of memory before mapping it to DMA 2285ac624068SGagandeep Singh * 2286ac624068SGagandeep Singh * This function has to be called after dpni_get_rx_tc_early_drop or 2287ac624068SGagandeep Singh * dpni_get_tx_tc_early_drop 2288ac624068SGagandeep Singh * 2289ac624068SGagandeep Singh */ 2290ac624068SGagandeep Singh void dpni_extract_early_drop(struct dpni_early_drop_cfg *cfg, 2291ac624068SGagandeep Singh const uint8_t *early_drop_buf) 2292ac624068SGagandeep Singh { 2293ac624068SGagandeep Singh const struct dpni_early_drop *ext_params; 2294ac624068SGagandeep Singh 2295ac624068SGagandeep Singh ext_params = (const struct dpni_early_drop *)early_drop_buf; 2296ac624068SGagandeep Singh 2297ac624068SGagandeep Singh cfg->enable = dpni_get_field(ext_params->flags, DROP_ENABLE); 2298ac624068SGagandeep Singh cfg->units = dpni_get_field(ext_params->flags, DROP_UNITS); 2299ac624068SGagandeep Singh cfg->green.drop_probability = ext_params->green_drop_probability; 2300ac624068SGagandeep Singh cfg->green.max_threshold = le64_to_cpu(ext_params->green_max_threshold); 2301ac624068SGagandeep Singh cfg->green.min_threshold = le64_to_cpu(ext_params->green_min_threshold); 2302ac624068SGagandeep Singh cfg->yellow.drop_probability = ext_params->yellow_drop_probability; 2303ac624068SGagandeep Singh cfg->yellow.max_threshold = 2304ac624068SGagandeep Singh le64_to_cpu(ext_params->yellow_max_threshold); 2305ac624068SGagandeep Singh cfg->yellow.min_threshold = 2306ac624068SGagandeep Singh le64_to_cpu(ext_params->yellow_min_threshold); 2307ac624068SGagandeep Singh cfg->red.drop_probability = ext_params->red_drop_probability; 2308ac624068SGagandeep Singh cfg->red.max_threshold = le64_to_cpu(ext_params->red_max_threshold); 2309ac624068SGagandeep Singh cfg->red.min_threshold = le64_to_cpu(ext_params->red_min_threshold); 2310ac624068SGagandeep Singh } 2311ac624068SGagandeep Singh 2312ac624068SGagandeep Singh /** 2313ac624068SGagandeep Singh * dpni_set_early_drop() - Set traffic class early-drop configuration 2314ac624068SGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 2315ac624068SGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2316ac624068SGagandeep Singh * @token: Token of DPNI object 2317ac624068SGagandeep Singh * @qtype: Type of queue - only Rx and Tx types are supported 2318f48cd6c6SNipun Gupta * @param: Traffic class and channel ID. 2319f48cd6c6SNipun Gupta * MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM, 2320f48cd6c6SNipun Gupta * ignored for the rest 2321f48cd6c6SNipun Gupta * LSB - traffic class 2322f48cd6c6SNipun Gupta * Use macro DPNI_BUILD_PARAM() to build correct value. 2323f48cd6c6SNipun Gupta * If dpni uses a single channel (uses only channel zero) the parameter can receive 2324f48cd6c6SNipun Gupta * traffic class directly. 2325ac624068SGagandeep Singh * @early_drop_iova: I/O virtual address of 256 bytes DMA-able memory filled 2326ac624068SGagandeep Singh * with the early-drop configuration by calling dpni_prepare_early_drop() 2327ac624068SGagandeep Singh * 2328ac624068SGagandeep Singh * warning: Before calling this function, call dpni_prepare_early_drop() to 2329ac624068SGagandeep Singh * prepare the early_drop_iova parameter 2330ac624068SGagandeep Singh * 2331ac624068SGagandeep Singh * Return: '0' on Success; error code otherwise. 2332ac624068SGagandeep Singh */ 2333ac624068SGagandeep Singh int dpni_set_early_drop(struct fsl_mc_io *mc_io, 2334ac624068SGagandeep Singh uint32_t cmd_flags, 2335ac624068SGagandeep Singh uint16_t token, 2336ac624068SGagandeep Singh enum dpni_queue_type qtype, 2337f48cd6c6SNipun Gupta uint16_t param, 2338ac624068SGagandeep Singh uint64_t early_drop_iova) 2339ac624068SGagandeep Singh { 2340ac624068SGagandeep Singh struct dpni_cmd_early_drop *cmd_params; 2341ac624068SGagandeep Singh struct mc_command cmd = { 0 }; 2342ac624068SGagandeep Singh 2343ac624068SGagandeep Singh /* prepare command */ 2344ac624068SGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_EARLY_DROP, 2345ac624068SGagandeep Singh cmd_flags, 2346ac624068SGagandeep Singh token); 2347ac624068SGagandeep Singh cmd_params = (struct dpni_cmd_early_drop *)cmd.params; 2348ac624068SGagandeep Singh cmd_params->qtype = qtype; 2349f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 2350f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 2351ac624068SGagandeep Singh cmd_params->early_drop_iova = cpu_to_le64(early_drop_iova); 2352ac624068SGagandeep Singh 2353ac624068SGagandeep Singh /* send command to mc*/ 2354ac624068SGagandeep Singh return mc_send_command(mc_io, &cmd); 2355ac624068SGagandeep Singh } 2356ac624068SGagandeep Singh 2357ac624068SGagandeep Singh /** 2358ac624068SGagandeep Singh * dpni_get_early_drop() - Get Rx traffic class early-drop configuration 2359ac624068SGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 2360ac624068SGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2361ac624068SGagandeep Singh * @token: Token of DPNI object 2362ac624068SGagandeep Singh * @qtype: Type of queue - only Rx and Tx types are supported 2363f48cd6c6SNipun Gupta * @param: Traffic class and channel ID. 2364f48cd6c6SNipun Gupta * MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM, 2365f48cd6c6SNipun Gupta * ignored for the rest 2366f48cd6c6SNipun Gupta * LSB - traffic class 2367f48cd6c6SNipun Gupta * Use macro DPNI_BUILD_PARAM() to build correct value. 2368f48cd6c6SNipun Gupta * If dpni uses a single channel (uses only channel zero) the parameter can receive 2369f48cd6c6SNipun Gupta * traffic class directly. 2370ac624068SGagandeep Singh * @early_drop_iova: I/O virtual address of 256 bytes DMA-able memory 2371ac624068SGagandeep Singh * 2372ac624068SGagandeep Singh * warning: After calling this function, call dpni_extract_early_drop() to 2373ac624068SGagandeep Singh * get the early drop configuration 2374ac624068SGagandeep Singh * 2375ac624068SGagandeep Singh * Return: '0' on Success; error code otherwise. 2376ac624068SGagandeep Singh */ 2377ac624068SGagandeep Singh int dpni_get_early_drop(struct fsl_mc_io *mc_io, 2378ac624068SGagandeep Singh uint32_t cmd_flags, 2379ac624068SGagandeep Singh uint16_t token, 2380ac624068SGagandeep Singh enum dpni_queue_type qtype, 2381f48cd6c6SNipun Gupta uint16_t param, 2382ac624068SGagandeep Singh uint64_t early_drop_iova) 2383ac624068SGagandeep Singh { 2384ac624068SGagandeep Singh struct dpni_cmd_early_drop *cmd_params; 2385ac624068SGagandeep Singh struct mc_command cmd = { 0 }; 2386ac624068SGagandeep Singh 2387ac624068SGagandeep Singh /* prepare command */ 2388ac624068SGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_EARLY_DROP, 2389ac624068SGagandeep Singh cmd_flags, 2390ac624068SGagandeep Singh token); 2391ac624068SGagandeep Singh cmd_params = (struct dpni_cmd_early_drop *)cmd.params; 2392ac624068SGagandeep Singh cmd_params->qtype = qtype; 2393f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 2394f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 2395ac624068SGagandeep Singh cmd_params->early_drop_iova = cpu_to_le64(early_drop_iova); 2396ac624068SGagandeep Singh 2397ac624068SGagandeep Singh /* send command to mc*/ 2398ac624068SGagandeep Singh return mc_send_command(mc_io, &cmd); 2399ac624068SGagandeep Singh } 2400ac624068SGagandeep Singh 2401ac624068SGagandeep Singh /** 240216bbc98aSShreyansh Jain * dpni_set_congestion_notification() - Set traffic class congestion 240316bbc98aSShreyansh Jain * notification configuration 240416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 240516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 240616bbc98aSShreyansh Jain * @token: Token of DPNI object 240716bbc98aSShreyansh Jain * @qtype: Type of queue - Rx, Tx and Tx confirm types are supported 240801690f8fSRohit Raj * @param: Traffic class and channel. Bits[0-7] contain traaffic class, 240901690f8fSRohit Raj * bite[8-15] contains channel id 241016bbc98aSShreyansh Jain * @cfg: congestion notification configuration 241116bbc98aSShreyansh Jain * 241216bbc98aSShreyansh Jain * Return: '0' on Success; error code otherwise. 241316bbc98aSShreyansh Jain */ 241416bbc98aSShreyansh Jain int dpni_set_congestion_notification(struct fsl_mc_io *mc_io, 24157ae777d0SHemant Agrawal uint32_t cmd_flags, 24167ae777d0SHemant Agrawal uint16_t token, 24177ae777d0SHemant Agrawal enum dpni_queue_type qtype, 2418f48cd6c6SNipun Gupta uint16_t param, 24197ae777d0SHemant Agrawal const struct dpni_congestion_notification_cfg *cfg) 24207ae777d0SHemant Agrawal { 242116bbc98aSShreyansh Jain struct dpni_cmd_set_congestion_notification *cmd_params; 24227ae777d0SHemant Agrawal struct mc_command cmd = { 0 }; 24237ae777d0SHemant Agrawal 24247ae777d0SHemant Agrawal /* prepare command */ 24257ae777d0SHemant Agrawal cmd.header = mc_encode_cmd_header( 24267ae777d0SHemant Agrawal DPNI_CMDID_SET_CONGESTION_NOTIFICATION, 24277ae777d0SHemant Agrawal cmd_flags, 24287ae777d0SHemant Agrawal token); 242916bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params; 243016bbc98aSShreyansh Jain cmd_params->qtype = qtype; 2431f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 2432f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 243355984a9bSShreyansh Jain cmd_params->congestion_point = cfg->cg_point; 243455984a9bSShreyansh Jain cmd_params->cgid = (uint8_t)cfg->cgid; 243516bbc98aSShreyansh Jain cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 243616bbc98aSShreyansh Jain cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode); 243716bbc98aSShreyansh Jain cmd_params->dest_priority = cfg->dest_cfg.priority; 243816bbc98aSShreyansh Jain cmd_params->message_iova = cpu_to_le64(cfg->message_iova); 243916bbc98aSShreyansh Jain cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx); 244016bbc98aSShreyansh Jain cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry); 244116bbc98aSShreyansh Jain cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit); 244216bbc98aSShreyansh Jain dpni_set_field(cmd_params->type_units, 244316bbc98aSShreyansh Jain DEST_TYPE, 244416bbc98aSShreyansh Jain cfg->dest_cfg.dest_type); 244516bbc98aSShreyansh Jain dpni_set_field(cmd_params->type_units, 244616bbc98aSShreyansh Jain CONG_UNITS, 244716bbc98aSShreyansh Jain cfg->units); 24487ae777d0SHemant Agrawal 24497ae777d0SHemant Agrawal /* send command to mc*/ 24507ae777d0SHemant Agrawal return mc_send_command(mc_io, &cmd); 24517ae777d0SHemant Agrawal } 24527ae777d0SHemant Agrawal 245316bbc98aSShreyansh Jain /** 245416bbc98aSShreyansh Jain * dpni_get_congestion_notification() - Get traffic class congestion 245516bbc98aSShreyansh Jain * notification configuration 245616bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 245716bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 245816bbc98aSShreyansh Jain * @token: Token of DPNI object 245916bbc98aSShreyansh Jain * @qtype: Type of queue - Rx, Tx and Tx confirm types are supported 2460*591200efSGagandeep Singh * @tc_id: Traffic class selection (0-7) 246116bbc98aSShreyansh Jain * @cfg: congestion notification configuration 246216bbc98aSShreyansh Jain * 246316bbc98aSShreyansh Jain * Return: '0' on Success; error code otherwise. 246416bbc98aSShreyansh Jain */ 24657ae777d0SHemant Agrawal int dpni_get_congestion_notification(struct fsl_mc_io *mc_io, 24667ae777d0SHemant Agrawal uint32_t cmd_flags, 24677ae777d0SHemant Agrawal uint16_t token, 24687ae777d0SHemant Agrawal enum dpni_queue_type qtype, 2469f48cd6c6SNipun Gupta uint16_t param, 24707ae777d0SHemant Agrawal struct dpni_congestion_notification_cfg *cfg) 24717ae777d0SHemant Agrawal { 247216bbc98aSShreyansh Jain struct dpni_rsp_get_congestion_notification *rsp_params; 247316bbc98aSShreyansh Jain struct dpni_cmd_get_congestion_notification *cmd_params; 24747ae777d0SHemant Agrawal struct mc_command cmd = { 0 }; 24757ae777d0SHemant Agrawal int err; 24767ae777d0SHemant Agrawal 24777ae777d0SHemant Agrawal /* prepare command */ 24787ae777d0SHemant Agrawal cmd.header = mc_encode_cmd_header( 24797ae777d0SHemant Agrawal DPNI_CMDID_GET_CONGESTION_NOTIFICATION, 24807ae777d0SHemant Agrawal cmd_flags, 24817ae777d0SHemant Agrawal token); 248216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params; 248316bbc98aSShreyansh Jain cmd_params->qtype = qtype; 2484f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 2485f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 248655984a9bSShreyansh Jain cmd_params->congestion_point = cfg->cg_point; 248755984a9bSShreyansh Jain cmd_params->cgid = cfg->cgid; 24887ae777d0SHemant Agrawal 24897ae777d0SHemant Agrawal /* send command to mc*/ 24907ae777d0SHemant Agrawal err = mc_send_command(mc_io, &cmd); 24917ae777d0SHemant Agrawal if (err) 24927ae777d0SHemant Agrawal return err; 24937ae777d0SHemant Agrawal 249416bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_congestion_notification *)cmd.params; 249516bbc98aSShreyansh Jain cfg->units = dpni_get_field(rsp_params->type_units, CONG_UNITS); 249616bbc98aSShreyansh Jain cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry); 249716bbc98aSShreyansh Jain cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit); 249816bbc98aSShreyansh Jain cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx); 249916bbc98aSShreyansh Jain cfg->message_iova = le64_to_cpu(rsp_params->message_iova); 250016bbc98aSShreyansh Jain cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode); 250116bbc98aSShreyansh Jain cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id); 250216bbc98aSShreyansh Jain cfg->dest_cfg.priority = rsp_params->dest_priority; 250316bbc98aSShreyansh Jain cfg->dest_cfg.dest_type = dpni_get_field(rsp_params->type_units, 250416bbc98aSShreyansh Jain DEST_TYPE); 25057ae777d0SHemant Agrawal 25067ae777d0SHemant Agrawal return 0; 25077ae777d0SHemant Agrawal } 25087ae777d0SHemant Agrawal 250916bbc98aSShreyansh Jain /** 251016bbc98aSShreyansh Jain * dpni_get_api_version() - Get Data Path Network Interface API version 251116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 251216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 251316bbc98aSShreyansh Jain * @major_ver: Major version of data path network interface API 251416bbc98aSShreyansh Jain * @minor_ver: Minor version of data path network interface API 251516bbc98aSShreyansh Jain * 251616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 251716bbc98aSShreyansh Jain */ 2518e6b82573SHemant Agrawal int dpni_get_api_version(struct fsl_mc_io *mc_io, 2519e6b82573SHemant Agrawal uint32_t cmd_flags, 2520e6b82573SHemant Agrawal uint16_t *major_ver, 2521e6b82573SHemant Agrawal uint16_t *minor_ver) 2522e6b82573SHemant Agrawal { 252316bbc98aSShreyansh Jain struct dpni_rsp_get_api_version *rsp_params; 2524e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 2525e6b82573SHemant Agrawal int err; 2526e6b82573SHemant Agrawal 2527e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION, 2528e6b82573SHemant Agrawal cmd_flags, 2529e6b82573SHemant Agrawal 0); 2530e6b82573SHemant Agrawal 2531e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 2532e6b82573SHemant Agrawal if (err) 2533e6b82573SHemant Agrawal return err; 2534e6b82573SHemant Agrawal 253516bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_api_version *)cmd.params; 253616bbc98aSShreyansh Jain *major_ver = le16_to_cpu(rsp_params->major); 253716bbc98aSShreyansh Jain *minor_ver = le16_to_cpu(rsp_params->minor); 2538e6b82573SHemant Agrawal 2539e6b82573SHemant Agrawal return 0; 2540e6b82573SHemant Agrawal } 2541e6b82573SHemant Agrawal 254216bbc98aSShreyansh Jain /** 254316bbc98aSShreyansh Jain * dpni_set_queue() - Set queue parameters 254416bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 254516bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 254616bbc98aSShreyansh Jain * @token: Token of DPNI object 254716bbc98aSShreyansh Jain * @qtype: Type of queue - all queue types are supported, although 254816bbc98aSShreyansh Jain * the command is ignored for Tx 254916bbc98aSShreyansh Jain * @tc: Traffic class, in range 0 to NUM_TCS - 1 255016bbc98aSShreyansh Jain * @index: Selects the specific queue out of the set allocated for the 255116bbc98aSShreyansh Jain * same TC. Value must be in range 0 to NUM_QUEUES - 1 255216bbc98aSShreyansh Jain * @options: A combination of DPNI_QUEUE_OPT_ values that control what 255316bbc98aSShreyansh Jain * configuration options are set on the queue 255416bbc98aSShreyansh Jain * @queue: Queue structure 255516bbc98aSShreyansh Jain * 255616bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 255716bbc98aSShreyansh Jain */ 2558e6b82573SHemant Agrawal int dpni_set_queue(struct fsl_mc_io *mc_io, 2559e6b82573SHemant Agrawal uint32_t cmd_flags, 2560e6b82573SHemant Agrawal uint16_t token, 2561e6b82573SHemant Agrawal enum dpni_queue_type qtype, 2562f48cd6c6SNipun Gupta uint16_t param, 2563e6b82573SHemant Agrawal uint8_t index, 2564e6b82573SHemant Agrawal uint8_t options, 2565e6b82573SHemant Agrawal const struct dpni_queue *queue) 2566e6b82573SHemant Agrawal { 2567e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 256816bbc98aSShreyansh Jain struct dpni_cmd_set_queue *cmd_params; 2569e6b82573SHemant Agrawal 2570e6b82573SHemant Agrawal /* prepare command */ 2571e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE, 2572e6b82573SHemant Agrawal cmd_flags, 2573e6b82573SHemant Agrawal token); 257416bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_queue *)cmd.params; 257516bbc98aSShreyansh Jain cmd_params->qtype = qtype; 2576f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 2577f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 257816bbc98aSShreyansh Jain cmd_params->index = index; 257916bbc98aSShreyansh Jain cmd_params->options = options; 258016bbc98aSShreyansh Jain cmd_params->dest_id = cpu_to_le32(queue->destination.id); 258116bbc98aSShreyansh Jain cmd_params->dest_prio = queue->destination.priority; 258216bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type); 258316bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control); 258416bbc98aSShreyansh Jain dpni_set_field(cmd_params->flags, HOLD_ACTIVE, 258516bbc98aSShreyansh Jain queue->destination.hold_active); 258616bbc98aSShreyansh Jain cmd_params->flc = cpu_to_le64(queue->flc.value); 258716bbc98aSShreyansh Jain cmd_params->user_context = cpu_to_le64(queue->user_context); 258855984a9bSShreyansh Jain cmd_params->cgid = queue->cgid; 2589e6b82573SHemant Agrawal 2590e6b82573SHemant Agrawal /* send command to mc */ 2591e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 2592e6b82573SHemant Agrawal } 2593e6b82573SHemant Agrawal 259416bbc98aSShreyansh Jain /** 259516bbc98aSShreyansh Jain * dpni_get_queue() - Get queue parameters 259616bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 259716bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 259816bbc98aSShreyansh Jain * @token: Token of DPNI object 259916bbc98aSShreyansh Jain * @qtype: Type of queue - all queue types are supported 2600f48cd6c6SNipun Gupta * @param: Traffic class and channel ID. 2601f48cd6c6SNipun Gupta * MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM, 2602f48cd6c6SNipun Gupta * ignored for the rest 2603f48cd6c6SNipun Gupta * LSB - traffic class 2604f48cd6c6SNipun Gupta * Use macro DPNI_BUILD_PARAM() to build correct value. 2605f48cd6c6SNipun Gupta * If dpni uses a single channel (uses only channel zero) the parameter can receive 2606f48cd6c6SNipun Gupta * traffic class directly. 260716bbc98aSShreyansh Jain * @index: Selects the specific queue out of the set allocated for the 260816bbc98aSShreyansh Jain * same TC. Value must be in range 0 to NUM_QUEUES - 1 260916bbc98aSShreyansh Jain * @queue: Queue configuration structure 261016bbc98aSShreyansh Jain * @qid: Queue identification 261116bbc98aSShreyansh Jain * 261216bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 261316bbc98aSShreyansh Jain */ 2614e6b82573SHemant Agrawal int dpni_get_queue(struct fsl_mc_io *mc_io, 2615e6b82573SHemant Agrawal uint32_t cmd_flags, 2616e6b82573SHemant Agrawal uint16_t token, 2617e6b82573SHemant Agrawal enum dpni_queue_type qtype, 2618f48cd6c6SNipun Gupta uint16_t param, 2619e6b82573SHemant Agrawal uint8_t index, 2620e6b82573SHemant Agrawal struct dpni_queue *queue, 2621e6b82573SHemant Agrawal struct dpni_queue_id *qid) 2622e6b82573SHemant Agrawal { 2623e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 262416bbc98aSShreyansh Jain struct dpni_cmd_get_queue *cmd_params; 262516bbc98aSShreyansh Jain struct dpni_rsp_get_queue *rsp_params; 2626e6b82573SHemant Agrawal int err; 2627e6b82573SHemant Agrawal 2628e6b82573SHemant Agrawal /* prepare command */ 2629e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE, 2630e6b82573SHemant Agrawal cmd_flags, 2631e6b82573SHemant Agrawal token); 263216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_queue *)cmd.params; 263316bbc98aSShreyansh Jain cmd_params->qtype = qtype; 2634f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 263516bbc98aSShreyansh Jain cmd_params->index = index; 2636f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 2637e6b82573SHemant Agrawal 2638e6b82573SHemant Agrawal /* send command to mc */ 2639e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 2640e6b82573SHemant Agrawal if (err) 2641e6b82573SHemant Agrawal return err; 2642e6b82573SHemant Agrawal 2643e6b82573SHemant Agrawal /* retrieve response parameters */ 264416bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_queue *)cmd.params; 264516bbc98aSShreyansh Jain queue->destination.id = le32_to_cpu(rsp_params->dest_id); 264616bbc98aSShreyansh Jain queue->destination.priority = rsp_params->dest_prio; 264716bbc98aSShreyansh Jain queue->destination.type = dpni_get_field(rsp_params->flags, 264816bbc98aSShreyansh Jain DEST_TYPE); 264916bbc98aSShreyansh Jain queue->flc.stash_control = dpni_get_field(rsp_params->flags, 265016bbc98aSShreyansh Jain STASH_CTRL); 265116bbc98aSShreyansh Jain queue->destination.hold_active = dpni_get_field(rsp_params->flags, 265216bbc98aSShreyansh Jain HOLD_ACTIVE); 265316bbc98aSShreyansh Jain queue->flc.value = le64_to_cpu(rsp_params->flc); 265416bbc98aSShreyansh Jain queue->user_context = le64_to_cpu(rsp_params->user_context); 265516bbc98aSShreyansh Jain qid->fqid = le32_to_cpu(rsp_params->fqid); 265616bbc98aSShreyansh Jain qid->qdbin = le16_to_cpu(rsp_params->qdbin); 265755984a9bSShreyansh Jain if (dpni_get_field(rsp_params->flags, CGID_VALID)) 265855984a9bSShreyansh Jain queue->cgid = rsp_params->cgid; 265955984a9bSShreyansh Jain else 266055984a9bSShreyansh Jain queue->cgid = -1; 2661e6b82573SHemant Agrawal 2662e6b82573SHemant Agrawal return 0; 2663e6b82573SHemant Agrawal } 2664e6b82573SHemant Agrawal 266516bbc98aSShreyansh Jain /** 266616bbc98aSShreyansh Jain * dpni_get_statistics() - Get DPNI statistics 266716bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 266816bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 266916bbc98aSShreyansh Jain * @token: Token of DPNI object 267016bbc98aSShreyansh Jain * @page: Selects the statistics page to retrieve, see 267196f7bfe8SSachin Saxena * DPNI_GET_STATISTICS output. Pages are numbered 0 to 6. 267216bbc98aSShreyansh Jain * @param: Custom parameter for some pages used to select 267316bbc98aSShreyansh Jain * a certain statistic source, for example the TC. 2674f48cd6c6SNipun Gupta * - page_0: not used 2675f48cd6c6SNipun Gupta * - page_1: not used 2676f48cd6c6SNipun Gupta * - page_2: not used 2677f48cd6c6SNipun Gupta * - page_3: high_byte - channel_id, low_byte - traffic class 2678f48cd6c6SNipun Gupta * - page_4: high_byte - queue_index have meaning only if dpni is 2679f48cd6c6SNipun Gupta * created using option DPNI_OPT_CUSTOM_CG, low_byte - traffic class 2680f48cd6c6SNipun Gupta * - page_5: not used 2681f48cd6c6SNipun Gupta * - page_6: not used 268216bbc98aSShreyansh Jain * @stat: Structure containing the statistics 268316bbc98aSShreyansh Jain * 268416bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 268516bbc98aSShreyansh Jain */ 2686e6b82573SHemant Agrawal int dpni_get_statistics(struct fsl_mc_io *mc_io, 2687e6b82573SHemant Agrawal uint32_t cmd_flags, 2688e6b82573SHemant Agrawal uint16_t token, 2689e6b82573SHemant Agrawal uint8_t page, 269055984a9bSShreyansh Jain uint16_t param, 2691e6b82573SHemant Agrawal union dpni_statistics *stat) 2692e6b82573SHemant Agrawal { 2693e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 269416bbc98aSShreyansh Jain struct dpni_cmd_get_statistics *cmd_params; 269516bbc98aSShreyansh Jain struct dpni_rsp_get_statistics *rsp_params; 269616bbc98aSShreyansh Jain int i, err; 2697e6b82573SHemant Agrawal 2698e6b82573SHemant Agrawal /* prepare command */ 2699e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS, 2700e6b82573SHemant Agrawal cmd_flags, 2701e6b82573SHemant Agrawal token); 270216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_statistics *)cmd.params; 270316bbc98aSShreyansh Jain cmd_params->page_number = page; 270416bbc98aSShreyansh Jain cmd_params->param = param; 2705e6b82573SHemant Agrawal 2706e6b82573SHemant Agrawal /* send command to mc */ 2707e6b82573SHemant Agrawal err = mc_send_command(mc_io, &cmd); 2708e6b82573SHemant Agrawal if (err) 2709e6b82573SHemant Agrawal return err; 2710e6b82573SHemant Agrawal 2711e6b82573SHemant Agrawal /* retrieve response parameters */ 271216bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_statistics *)cmd.params; 271316bbc98aSShreyansh Jain for (i = 0; i < DPNI_STATISTICS_CNT; i++) 271416bbc98aSShreyansh Jain stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]); 2715e6b82573SHemant Agrawal 2716e6b82573SHemant Agrawal return 0; 2717e6b82573SHemant Agrawal } 2718e6b82573SHemant Agrawal 271916bbc98aSShreyansh Jain /** 272016bbc98aSShreyansh Jain * dpni_reset_statistics() - Clears DPNI statistics 272116bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 272216bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 272316bbc98aSShreyansh Jain * @token: Token of DPNI object 272416bbc98aSShreyansh Jain * 272516bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 272616bbc98aSShreyansh Jain */ 2727e6b82573SHemant Agrawal int dpni_reset_statistics(struct fsl_mc_io *mc_io, 2728e6b82573SHemant Agrawal uint32_t cmd_flags, 2729e6b82573SHemant Agrawal uint16_t token) 2730e6b82573SHemant Agrawal { 2731e6b82573SHemant Agrawal struct mc_command cmd = { 0 }; 2732e6b82573SHemant Agrawal 2733e6b82573SHemant Agrawal /* prepare command */ 2734e6b82573SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS, 2735e6b82573SHemant Agrawal cmd_flags, 2736e6b82573SHemant Agrawal token); 2737e6b82573SHemant Agrawal 2738e6b82573SHemant Agrawal /* send command to mc*/ 2739e6b82573SHemant Agrawal return mc_send_command(mc_io, &cmd); 2740e6b82573SHemant Agrawal } 274123d6a87eSHemant Agrawal 274216bbc98aSShreyansh Jain /** 27432cb2abf3SHemant Agrawal * dpni_set_taildrop() - Set taildrop per congestion group 274416bbc98aSShreyansh Jain * 274516bbc98aSShreyansh Jain * Setting a per-TC taildrop (cg_point = DPNI_CP_GROUP) will reset any current 274616bbc98aSShreyansh Jain * congestion notification or early drop (WRED) configuration previously applied 274716bbc98aSShreyansh Jain * to the same TC. 274816bbc98aSShreyansh Jain * 274916bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 275016bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 275116bbc98aSShreyansh Jain * @token: Token of DPNI object 27522cb2abf3SHemant Agrawal * @cg_point: Congestion group identifier DPNI_CP_QUEUE is only supported in 275316bbc98aSShreyansh Jain * combination with DPNI_QUEUE_RX. 275416bbc98aSShreyansh Jain * @q_type: Queue type, can be DPNI_QUEUE_RX or DPNI_QUEUE_TX. 275516bbc98aSShreyansh Jain * @tc: Traffic class to apply this taildrop to 27562cb2abf3SHemant Agrawal * @index/cgid: Index of the queue if the DPNI supports multiple queues for 275716bbc98aSShreyansh Jain * traffic distribution. 27582cb2abf3SHemant Agrawal * If CONGESTION_POINT is DPNI_CP_CONGESTION_GROUP then it 27592cb2abf3SHemant Agrawal * represent the cgid of the congestion point 276016bbc98aSShreyansh Jain * @taildrop: Taildrop structure 276116bbc98aSShreyansh Jain * 276216bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 276316bbc98aSShreyansh Jain */ 276423d6a87eSHemant Agrawal int dpni_set_taildrop(struct fsl_mc_io *mc_io, 276523d6a87eSHemant Agrawal uint32_t cmd_flags, 276623d6a87eSHemant Agrawal uint16_t token, 276723d6a87eSHemant Agrawal enum dpni_congestion_point cg_point, 276816bbc98aSShreyansh Jain enum dpni_queue_type qtype, 2769f48cd6c6SNipun Gupta uint16_t param, 277016bbc98aSShreyansh Jain uint8_t index, 277123d6a87eSHemant Agrawal struct dpni_taildrop *taildrop) 277223d6a87eSHemant Agrawal { 277323d6a87eSHemant Agrawal struct mc_command cmd = { 0 }; 277416bbc98aSShreyansh Jain struct dpni_cmd_set_taildrop *cmd_params; 277523d6a87eSHemant Agrawal 277623d6a87eSHemant Agrawal /* prepare command */ 277723d6a87eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP, 277823d6a87eSHemant Agrawal cmd_flags, 277923d6a87eSHemant Agrawal token); 278016bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params; 278116bbc98aSShreyansh Jain cmd_params->congestion_point = cg_point; 278216bbc98aSShreyansh Jain cmd_params->qtype = qtype; 2783f48cd6c6SNipun Gupta cmd_params->tc = (uint8_t)(param & 0xff); 2784f48cd6c6SNipun Gupta cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff); 278516bbc98aSShreyansh Jain cmd_params->index = index; 278616bbc98aSShreyansh Jain cmd_params->units = taildrop->units; 278716bbc98aSShreyansh Jain cmd_params->threshold = cpu_to_le32(taildrop->threshold); 278816bbc98aSShreyansh Jain dpni_set_field(cmd_params->enable_oal_lo, ENABLE, taildrop->enable); 278916bbc98aSShreyansh Jain dpni_set_field(cmd_params->enable_oal_lo, OAL_LO, taildrop->oal); 279016bbc98aSShreyansh Jain dpni_set_field(cmd_params->oal_hi, 279116bbc98aSShreyansh Jain OAL_HI, 279216bbc98aSShreyansh Jain taildrop->oal >> DPNI_OAL_LO_SIZE); 279323d6a87eSHemant Agrawal 279423d6a87eSHemant Agrawal /* send command to mc */ 279523d6a87eSHemant Agrawal return mc_send_command(mc_io, &cmd); 279623d6a87eSHemant Agrawal } 279723d6a87eSHemant Agrawal 279816bbc98aSShreyansh Jain /** 279916bbc98aSShreyansh Jain * dpni_get_taildrop() - Get taildrop information 280016bbc98aSShreyansh Jain * @mc_io: Pointer to MC portal's I/O object 280116bbc98aSShreyansh Jain * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 280216bbc98aSShreyansh Jain * @token: Token of DPNI object 280316bbc98aSShreyansh Jain * @cg_point: Congestion point 280416bbc98aSShreyansh Jain * @q_type: Queue type on which the taildrop is configured. 280516bbc98aSShreyansh Jain * Only Rx queues are supported for now 280616bbc98aSShreyansh Jain * @tc: Traffic class to apply this taildrop to 280716bbc98aSShreyansh Jain * @q_index: Index of the queue if the DPNI supports multiple queues for 280816bbc98aSShreyansh Jain * traffic distribution. Ignored if CONGESTION_POINT is not 0. 280916bbc98aSShreyansh Jain * @taildrop: Taildrop structure 281016bbc98aSShreyansh Jain * 281116bbc98aSShreyansh Jain * Return: '0' on Success; Error code otherwise. 281216bbc98aSShreyansh Jain */ 281323d6a87eSHemant Agrawal int dpni_get_taildrop(struct fsl_mc_io *mc_io, 281423d6a87eSHemant Agrawal uint32_t cmd_flags, 281523d6a87eSHemant Agrawal uint16_t token, 281623d6a87eSHemant Agrawal enum dpni_congestion_point cg_point, 281716bbc98aSShreyansh Jain enum dpni_queue_type qtype, 281823d6a87eSHemant Agrawal uint8_t tc, 281916bbc98aSShreyansh Jain uint8_t index, 282023d6a87eSHemant Agrawal struct dpni_taildrop *taildrop) 282123d6a87eSHemant Agrawal { 282223d6a87eSHemant Agrawal struct mc_command cmd = { 0 }; 282316bbc98aSShreyansh Jain struct dpni_cmd_get_taildrop *cmd_params; 282416bbc98aSShreyansh Jain struct dpni_rsp_get_taildrop *rsp_params; 282516bbc98aSShreyansh Jain uint8_t oal_lo, oal_hi; 282623d6a87eSHemant Agrawal int err; 282723d6a87eSHemant Agrawal 282823d6a87eSHemant Agrawal /* prepare command */ 282923d6a87eSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP, 283023d6a87eSHemant Agrawal cmd_flags, 283123d6a87eSHemant Agrawal token); 283216bbc98aSShreyansh Jain cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params; 283316bbc98aSShreyansh Jain cmd_params->congestion_point = cg_point; 283416bbc98aSShreyansh Jain cmd_params->qtype = qtype; 283516bbc98aSShreyansh Jain cmd_params->tc = tc; 283616bbc98aSShreyansh Jain cmd_params->index = index; 283723d6a87eSHemant Agrawal 283823d6a87eSHemant Agrawal /* send command to mc */ 283923d6a87eSHemant Agrawal err = mc_send_command(mc_io, &cmd); 284023d6a87eSHemant Agrawal if (err) 284123d6a87eSHemant Agrawal return err; 284223d6a87eSHemant Agrawal 284323d6a87eSHemant Agrawal /* retrieve response parameters */ 284416bbc98aSShreyansh Jain rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params; 284516bbc98aSShreyansh Jain taildrop->enable = dpni_get_field(rsp_params->enable_oal_lo, ENABLE); 284616bbc98aSShreyansh Jain taildrop->units = rsp_params->units; 284716bbc98aSShreyansh Jain taildrop->threshold = le32_to_cpu(rsp_params->threshold); 284816bbc98aSShreyansh Jain oal_lo = dpni_get_field(rsp_params->enable_oal_lo, OAL_LO); 284916bbc98aSShreyansh Jain oal_hi = dpni_get_field(rsp_params->oal_hi, OAL_HI); 285016bbc98aSShreyansh Jain taildrop->oal = oal_hi << DPNI_OAL_LO_SIZE | oal_lo; 285116bbc98aSShreyansh Jain 285216bbc98aSShreyansh Jain /* Fill the first 4 bits, 'oal' is a 2's complement value of 12 bits */ 285316bbc98aSShreyansh Jain if (taildrop->oal >= 0x0800) 285416bbc98aSShreyansh Jain taildrop->oal |= 0xF000; 285523d6a87eSHemant Agrawal 285623d6a87eSHemant Agrawal return 0; 285723d6a87eSHemant Agrawal } 285825fea082SHemant Agrawal 285925fea082SHemant Agrawal /** 286025fea082SHemant Agrawal * dpni_set_opr() - Set Order Restoration configuration. 286125fea082SHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 286225fea082SHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 286325fea082SHemant Agrawal * @token: Token of DPNI object 286425fea082SHemant Agrawal * @tc: Traffic class, in range 0 to NUM_TCS - 1 286525fea082SHemant Agrawal * @index: Selects the specific queue out of the set allocated 286625fea082SHemant Agrawal * for the same TC. Value must be in range 0 to 286725fea082SHemant Agrawal * NUM_QUEUES - 1 286825fea082SHemant Agrawal * @options: Configuration mode options 286925fea082SHemant Agrawal * can be OPR_OPT_CREATE or OPR_OPT_RETIRE 287025fea082SHemant Agrawal * @cfg: Configuration options for the OPR 287125fea082SHemant Agrawal * 287225fea082SHemant Agrawal * Return: '0' on Success; Error code otherwise. 287325fea082SHemant Agrawal */ 287425fea082SHemant Agrawal int dpni_set_opr(struct fsl_mc_io *mc_io, 287525fea082SHemant Agrawal uint32_t cmd_flags, 287625fea082SHemant Agrawal uint16_t token, 287725fea082SHemant Agrawal uint8_t tc, 287825fea082SHemant Agrawal uint8_t index, 287925fea082SHemant Agrawal uint8_t options, 28802cb2abf3SHemant Agrawal struct opr_cfg *cfg, 28812cb2abf3SHemant Agrawal uint8_t opr_id) 288225fea082SHemant Agrawal { 288325fea082SHemant Agrawal struct dpni_cmd_set_opr *cmd_params; 288425fea082SHemant Agrawal struct mc_command cmd = { 0 }; 288525fea082SHemant Agrawal 288625fea082SHemant Agrawal /* prepare command */ 288725fea082SHemant Agrawal cmd.header = mc_encode_cmd_header( 288825fea082SHemant Agrawal DPNI_CMDID_SET_OPR, 288925fea082SHemant Agrawal cmd_flags, 289025fea082SHemant Agrawal token); 289125fea082SHemant Agrawal cmd_params = (struct dpni_cmd_set_opr *)cmd.params; 289225fea082SHemant Agrawal cmd_params->tc_id = tc; 289325fea082SHemant Agrawal cmd_params->index = index; 289425fea082SHemant Agrawal cmd_params->options = options; 28952cb2abf3SHemant Agrawal cmd_params->opr_id = opr_id; 289625fea082SHemant Agrawal cmd_params->oloe = cfg->oloe; 289725fea082SHemant Agrawal cmd_params->oeane = cfg->oeane; 289825fea082SHemant Agrawal cmd_params->olws = cfg->olws; 289925fea082SHemant Agrawal cmd_params->oa = cfg->oa; 290025fea082SHemant Agrawal cmd_params->oprrws = cfg->oprrws; 290125fea082SHemant Agrawal 290225fea082SHemant Agrawal /* send command to mc*/ 290325fea082SHemant Agrawal return mc_send_command(mc_io, &cmd); 290425fea082SHemant Agrawal } 290525fea082SHemant Agrawal 290625fea082SHemant Agrawal /** 290725fea082SHemant Agrawal * dpni_get_opr() - Retrieve Order Restoration config and query. 290825fea082SHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 290925fea082SHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 291025fea082SHemant Agrawal * @token: Token of DPNI object 291125fea082SHemant Agrawal * @tc: Traffic class, in range 0 to NUM_TCS - 1 291225fea082SHemant Agrawal * @index: Selects the specific queue out of the set allocated 291325fea082SHemant Agrawal * for the same TC. Value must be in range 0 to 291425fea082SHemant Agrawal * NUM_QUEUES - 1 291525fea082SHemant Agrawal * @cfg: Returned OPR configuration 291625fea082SHemant Agrawal * @qry: Returned OPR query 291725fea082SHemant Agrawal * 291825fea082SHemant Agrawal * Return: '0' on Success; Error code otherwise. 291925fea082SHemant Agrawal */ 292025fea082SHemant Agrawal int dpni_get_opr(struct fsl_mc_io *mc_io, 292125fea082SHemant Agrawal uint32_t cmd_flags, 292225fea082SHemant Agrawal uint16_t token, 292325fea082SHemant Agrawal uint8_t tc, 292425fea082SHemant Agrawal uint8_t index, 292525fea082SHemant Agrawal struct opr_cfg *cfg, 29262cb2abf3SHemant Agrawal struct opr_qry *qry, 29272cb2abf3SHemant Agrawal uint8_t flags, 29282cb2abf3SHemant Agrawal uint8_t opr_id) 292925fea082SHemant Agrawal { 293025fea082SHemant Agrawal struct dpni_rsp_get_opr *rsp_params; 293125fea082SHemant Agrawal struct dpni_cmd_get_opr *cmd_params; 293225fea082SHemant Agrawal struct mc_command cmd = { 0 }; 293325fea082SHemant Agrawal int err; 293425fea082SHemant Agrawal 293525fea082SHemant Agrawal /* prepare command */ 293625fea082SHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OPR, 293725fea082SHemant Agrawal cmd_flags, 293825fea082SHemant Agrawal token); 293925fea082SHemant Agrawal cmd_params = (struct dpni_cmd_get_opr *)cmd.params; 294025fea082SHemant Agrawal cmd_params->index = index; 294125fea082SHemant Agrawal cmd_params->tc_id = tc; 29422cb2abf3SHemant Agrawal cmd_params->flags = flags; 29432cb2abf3SHemant Agrawal cmd_params->opr_id = opr_id; 294425fea082SHemant Agrawal 294525fea082SHemant Agrawal /* send command to mc*/ 294625fea082SHemant Agrawal err = mc_send_command(mc_io, &cmd); 294725fea082SHemant Agrawal if (err) 294825fea082SHemant Agrawal return err; 294925fea082SHemant Agrawal 295025fea082SHemant Agrawal /* retrieve response parameters */ 295125fea082SHemant Agrawal rsp_params = (struct dpni_rsp_get_opr *)cmd.params; 295225fea082SHemant Agrawal cfg->oloe = rsp_params->oloe; 295325fea082SHemant Agrawal cfg->oeane = rsp_params->oeane; 295425fea082SHemant Agrawal cfg->olws = rsp_params->olws; 295525fea082SHemant Agrawal cfg->oa = rsp_params->oa; 295625fea082SHemant Agrawal cfg->oprrws = rsp_params->oprrws; 295725fea082SHemant Agrawal qry->rip = dpni_get_field(rsp_params->flags, RIP); 295825fea082SHemant Agrawal qry->enable = dpni_get_field(rsp_params->flags, OPR_ENABLE); 295925fea082SHemant Agrawal qry->nesn = le16_to_cpu(rsp_params->nesn); 296025fea082SHemant Agrawal qry->ndsn = le16_to_cpu(rsp_params->ndsn); 296125fea082SHemant Agrawal qry->ea_tseq = le16_to_cpu(rsp_params->ea_tseq); 296225fea082SHemant Agrawal qry->tseq_nlis = dpni_get_field(rsp_params->tseq_nlis, TSEQ_NLIS); 296325fea082SHemant Agrawal qry->ea_hseq = le16_to_cpu(rsp_params->ea_hseq); 296425fea082SHemant Agrawal qry->hseq_nlis = dpni_get_field(rsp_params->hseq_nlis, HSEQ_NLIS); 296525fea082SHemant Agrawal qry->ea_hptr = le16_to_cpu(rsp_params->ea_hptr); 296625fea082SHemant Agrawal qry->ea_tptr = le16_to_cpu(rsp_params->ea_tptr); 296725fea082SHemant Agrawal qry->opr_vid = le16_to_cpu(rsp_params->opr_vid); 296825fea082SHemant Agrawal qry->opr_id = le16_to_cpu(rsp_params->opr_id); 296925fea082SHemant Agrawal 297025fea082SHemant Agrawal return 0; 297125fea082SHemant Agrawal } 2972e59b75ffSHemant Agrawal 297372100f0dSGagandeep Singh int dpni_load_sw_sequence(struct fsl_mc_io *mc_io, 297472100f0dSGagandeep Singh uint32_t cmd_flags, 297572100f0dSGagandeep Singh uint16_t token, 297672100f0dSGagandeep Singh struct dpni_load_ss_cfg *cfg) 297772100f0dSGagandeep Singh { 297872100f0dSGagandeep Singh struct dpni_load_sw_sequence *cmd_params; 297972100f0dSGagandeep Singh struct mc_command cmd = { 0 }; 298072100f0dSGagandeep Singh 298172100f0dSGagandeep Singh /* prepare command */ 298272100f0dSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_LOAD_SW_SEQUENCE, 298372100f0dSGagandeep Singh cmd_flags, 298472100f0dSGagandeep Singh token); 298572100f0dSGagandeep Singh cmd_params = (struct dpni_load_sw_sequence *)cmd.params; 298672100f0dSGagandeep Singh cmd_params->dest = cfg->dest; 298772100f0dSGagandeep Singh cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset); 298872100f0dSGagandeep Singh cmd_params->ss_size = cpu_to_le16(cfg->ss_size); 298972100f0dSGagandeep Singh cmd_params->ss_iova = cpu_to_le64(cfg->ss_iova); 299072100f0dSGagandeep Singh 299172100f0dSGagandeep Singh /* send command to mc*/ 299272100f0dSGagandeep Singh return mc_send_command(mc_io, &cmd); 299372100f0dSGagandeep Singh } 299472100f0dSGagandeep Singh 299572100f0dSGagandeep Singh int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io, 299672100f0dSGagandeep Singh uint32_t cmd_flags, 299772100f0dSGagandeep Singh uint16_t token, 299872100f0dSGagandeep Singh struct dpni_enable_ss_cfg *cfg) 299972100f0dSGagandeep Singh { 300072100f0dSGagandeep Singh struct dpni_enable_sw_sequence *cmd_params; 300172100f0dSGagandeep Singh struct mc_command cmd = { 0 }; 300272100f0dSGagandeep Singh 300372100f0dSGagandeep Singh /* prepare command */ 300472100f0dSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_SW_SEQUENCE, 300572100f0dSGagandeep Singh cmd_flags, 300672100f0dSGagandeep Singh token); 300772100f0dSGagandeep Singh cmd_params = (struct dpni_enable_sw_sequence *)cmd.params; 300872100f0dSGagandeep Singh cmd_params->dest = cfg->dest; 300972100f0dSGagandeep Singh cmd_params->set_start = cfg->set_start; 301072100f0dSGagandeep Singh cmd_params->hxs = cpu_to_le16(cfg->hxs); 301172100f0dSGagandeep Singh cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset); 301272100f0dSGagandeep Singh cmd_params->param_offset = cfg->param_offset; 301372100f0dSGagandeep Singh cmd_params->param_size = cfg->param_size; 301472100f0dSGagandeep Singh cmd_params->param_iova = cpu_to_le64(cfg->param_iova); 301572100f0dSGagandeep Singh 301672100f0dSGagandeep Singh /* send command to mc*/ 301772100f0dSGagandeep Singh return mc_send_command(mc_io, &cmd); 301872100f0dSGagandeep Singh } 301972100f0dSGagandeep Singh 302072100f0dSGagandeep Singh /** 302172100f0dSGagandeep Singh * dpni_get_sw_sequence_layout() - Get the soft sequence layout 302272100f0dSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 302372100f0dSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 302472100f0dSGagandeep Singh * @token: Token of DPNI object 302572100f0dSGagandeep Singh * @src: Source of the layout (WRIOP Rx or Tx) 302672100f0dSGagandeep Singh * @ss_layout_iova: I/O virtual address of 264 bytes DMA-able memory 302772100f0dSGagandeep Singh * 302872100f0dSGagandeep Singh * warning: After calling this function, call dpni_extract_sw_sequence_layout() 302972100f0dSGagandeep Singh * to get the layout. 303072100f0dSGagandeep Singh * 303172100f0dSGagandeep Singh * Return: '0' on Success; error code otherwise. 303272100f0dSGagandeep Singh */ 303372100f0dSGagandeep Singh int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io, 303472100f0dSGagandeep Singh uint32_t cmd_flags, 303572100f0dSGagandeep Singh uint16_t token, 303672100f0dSGagandeep Singh enum dpni_soft_sequence_dest src, 303772100f0dSGagandeep Singh uint64_t ss_layout_iova) 303872100f0dSGagandeep Singh { 303972100f0dSGagandeep Singh struct dpni_get_sw_sequence_layout *cmd_params; 304072100f0dSGagandeep Singh struct mc_command cmd = { 0 }; 304172100f0dSGagandeep Singh 304272100f0dSGagandeep Singh /* prepare command */ 304372100f0dSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT, 304472100f0dSGagandeep Singh cmd_flags, 304572100f0dSGagandeep Singh token); 304672100f0dSGagandeep Singh 304772100f0dSGagandeep Singh cmd_params = (struct dpni_get_sw_sequence_layout *)cmd.params; 304872100f0dSGagandeep Singh cmd_params->src = src; 304972100f0dSGagandeep Singh cmd_params->layout_iova = cpu_to_le64(ss_layout_iova); 305072100f0dSGagandeep Singh 305172100f0dSGagandeep Singh /* send command to mc*/ 305272100f0dSGagandeep Singh return mc_send_command(mc_io, &cmd); 305372100f0dSGagandeep Singh } 305472100f0dSGagandeep Singh 305572100f0dSGagandeep Singh /** 305672100f0dSGagandeep Singh * dpni_extract_sw_sequence_layout() - extract the software sequence layout 305772100f0dSGagandeep Singh * @layout: software sequence layout 305872100f0dSGagandeep Singh * @sw_sequence_layout_buf: Zeroed 264 bytes of memory before mapping it 305972100f0dSGagandeep Singh * to DMA 306072100f0dSGagandeep Singh * 306172100f0dSGagandeep Singh * This function has to be called after dpni_get_sw_sequence_layout 306272100f0dSGagandeep Singh * 306372100f0dSGagandeep Singh */ 306472100f0dSGagandeep Singh void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout, 306572100f0dSGagandeep Singh const uint8_t *sw_sequence_layout_buf) 306672100f0dSGagandeep Singh { 306772100f0dSGagandeep Singh const struct dpni_sw_sequence_layout_entry *ext_params; 306872100f0dSGagandeep Singh int i; 306972100f0dSGagandeep Singh uint16_t ss_size, ss_offset; 307072100f0dSGagandeep Singh 307172100f0dSGagandeep Singh ext_params = (const struct dpni_sw_sequence_layout_entry *) 307272100f0dSGagandeep Singh sw_sequence_layout_buf; 307372100f0dSGagandeep Singh 307472100f0dSGagandeep Singh for (i = 0; i < DPNI_SW_SEQUENCE_LAYOUT_SIZE; i++) { 307572100f0dSGagandeep Singh ss_offset = le16_to_cpu(ext_params[i].ss_offset); 307672100f0dSGagandeep Singh ss_size = le16_to_cpu(ext_params[i].ss_size); 307772100f0dSGagandeep Singh 307872100f0dSGagandeep Singh if (ss_offset == 0 && ss_size == 0) { 307972100f0dSGagandeep Singh layout->num_ss = i; 308072100f0dSGagandeep Singh return; 308172100f0dSGagandeep Singh } 308272100f0dSGagandeep Singh 308372100f0dSGagandeep Singh layout->ss[i].ss_offset = ss_offset; 308472100f0dSGagandeep Singh layout->ss[i].ss_size = ss_size; 308572100f0dSGagandeep Singh layout->ss[i].param_offset = ext_params[i].param_offset; 308672100f0dSGagandeep Singh layout->ss[i].param_size = ext_params[i].param_size; 308772100f0dSGagandeep Singh } 308872100f0dSGagandeep Singh } 3089e59b75ffSHemant Agrawal /** 3090fe2b986aSSunil Kumar Kori * dpni_set_rx_fs_dist() - Set Rx traffic class FS distribution 3091fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 3092fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3093fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 3094fe2b986aSSunil Kumar Kori * @cfg: Distribution configuration 3095fe2b986aSSunil Kumar Kori * If the FS is already enabled with a previous call the classification 3096fe2b986aSSunil Kumar Kori * key will be changed but all the table rules are kept. If the 3097fe2b986aSSunil Kumar Kori * existing rules do not match the key the results will not be 30982cb2abf3SHemant Agrawal * predictable. It is the user responsibility to keep keyintegrity. 3099fe2b986aSSunil Kumar Kori * If cfg.enable is set to 1 the command will create a flow steering table 3100fe2b986aSSunil Kumar Kori * and will classify packets according to this table. The packets 3101fe2b986aSSunil Kumar Kori * that miss all the table rules will be classified according to 3102fe2b986aSSunil Kumar Kori * settings made in dpni_set_rx_hash_dist() 3103fe2b986aSSunil Kumar Kori * If cfg.enable is set to 0 the command will clear flow steering table. The 3104fe2b986aSSunil Kumar Kori * packets will be classified according to settings made in 3105fe2b986aSSunil Kumar Kori * dpni_set_rx_hash_dist() 3106fe2b986aSSunil Kumar Kori */ 3107fe2b986aSSunil Kumar Kori int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags, 3108fe2b986aSSunil Kumar Kori uint16_t token, const struct dpni_rx_dist_cfg *cfg) 3109fe2b986aSSunil Kumar Kori { 3110fe2b986aSSunil Kumar Kori struct dpni_cmd_set_rx_fs_dist *cmd_params; 3111fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 3112fe2b986aSSunil Kumar Kori 3113fe2b986aSSunil Kumar Kori /* prepare command */ 3114fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST, 3115fe2b986aSSunil Kumar Kori cmd_flags, 3116fe2b986aSSunil Kumar Kori token); 3117fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params; 3118fe2b986aSSunil Kumar Kori cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 3119fe2b986aSSunil Kumar Kori dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable); 3120fe2b986aSSunil Kumar Kori cmd_params->tc = cfg->tc; 3121fe2b986aSSunil Kumar Kori cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id); 3122fe2b986aSSunil Kumar Kori cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 3123fe2b986aSSunil Kumar Kori 3124fe2b986aSSunil Kumar Kori /* send command to mc*/ 3125fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 3126fe2b986aSSunil Kumar Kori } 3127fe2b986aSSunil Kumar Kori 3128fe2b986aSSunil Kumar Kori /** 3129fe2b986aSSunil Kumar Kori * dpni_set_rx_hash_dist() - Set Rx traffic class HASH distribution 3130fe2b986aSSunil Kumar Kori * @mc_io: Pointer to MC portal's I/O object 3131fe2b986aSSunil Kumar Kori * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3132fe2b986aSSunil Kumar Kori * @token: Token of DPNI object 3133fe2b986aSSunil Kumar Kori * @cfg: Distribution configuration 3134fe2b986aSSunil Kumar Kori * If cfg.enable is set to 1 the packets will be classified using a hash 31352cb2abf3SHemant Agrawal * function based on the key received in cfg.key_cfg_iova parameter. 3136fe2b986aSSunil Kumar Kori * If cfg.enable is set to 0 the packets will be sent to the queue configured in 3137fe2b986aSSunil Kumar Kori * dpni_set_rx_dist_default_queue() call 3138fe2b986aSSunil Kumar Kori */ 3139fe2b986aSSunil Kumar Kori int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags, 3140fe2b986aSSunil Kumar Kori uint16_t token, const struct dpni_rx_dist_cfg *cfg) 3141fe2b986aSSunil Kumar Kori { 3142fe2b986aSSunil Kumar Kori struct dpni_cmd_set_rx_hash_dist *cmd_params; 3143fe2b986aSSunil Kumar Kori struct mc_command cmd = { 0 }; 3144fe2b986aSSunil Kumar Kori 3145fe2b986aSSunil Kumar Kori /* prepare command */ 3146fe2b986aSSunil Kumar Kori cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST, 3147fe2b986aSSunil Kumar Kori cmd_flags, 3148fe2b986aSSunil Kumar Kori token); 3149fe2b986aSSunil Kumar Kori cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params; 3150fe2b986aSSunil Kumar Kori cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 3151fe2b986aSSunil Kumar Kori dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable); 3152fe2b986aSSunil Kumar Kori cmd_params->tc_id = cfg->tc; 3153fe2b986aSSunil Kumar Kori cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 3154fe2b986aSSunil Kumar Kori 3155fe2b986aSSunil Kumar Kori /* send command to mc*/ 3156fe2b986aSSunil Kumar Kori return mc_send_command(mc_io, &cmd); 3157fe2b986aSSunil Kumar Kori } 3158fe2b986aSSunil Kumar Kori 3159fe2b986aSSunil Kumar Kori /** 31602cb2abf3SHemant Agrawal * dpni_add_custom_tpid() - Configures a distinct Ethertype value (or TPID 31612cb2abf3SHemant Agrawal * value) to indicate VLAN tag in adition to the common TPID values 31622cb2abf3SHemant Agrawal * 0x81000 and 0x88A8 3163e59b75ffSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 3164e59b75ffSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3165e59b75ffSHemant Agrawal * @token: Token of DPNI object 3166e59b75ffSHemant Agrawal * @tpid: New value for TPID 3167e59b75ffSHemant Agrawal * 3168e59b75ffSHemant Agrawal * Only two custom values are accepted. If the function is called for the third 3169e59b75ffSHemant Agrawal * time it will return error. 31702cb2abf3SHemant Agrawal * To replace an existing value use dpni_remove_custom_tpid() to remove a 31712cb2abf3SHemant Agrawal * previous TPID and after that use again the function. 3172e59b75ffSHemant Agrawal * 3173e59b75ffSHemant Agrawal * Return: '0' on Success; Error code otherwise. 3174e59b75ffSHemant Agrawal */ 3175e59b75ffSHemant Agrawal int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags, 3176e59b75ffSHemant Agrawal uint16_t token, uint16_t tpid) 3177e59b75ffSHemant Agrawal { 3178e59b75ffSHemant Agrawal struct dpni_cmd_add_custom_tpid *cmd_params; 3179e59b75ffSHemant Agrawal struct mc_command cmd = { 0 }; 3180e59b75ffSHemant Agrawal 3181e59b75ffSHemant Agrawal /* prepare command */ 3182e59b75ffSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_CUSTOM_TPID, 3183e59b75ffSHemant Agrawal cmd_flags, 3184e59b75ffSHemant Agrawal token); 3185e59b75ffSHemant Agrawal cmd_params = (struct dpni_cmd_add_custom_tpid *)cmd.params; 3186e59b75ffSHemant Agrawal cmd_params->tpid = cpu_to_le16(tpid); 3187e59b75ffSHemant Agrawal 3188e59b75ffSHemant Agrawal /* send command to mc*/ 3189e59b75ffSHemant Agrawal return mc_send_command(mc_io, &cmd); 3190e59b75ffSHemant Agrawal } 3191e59b75ffSHemant Agrawal 3192e59b75ffSHemant Agrawal /** 3193e59b75ffSHemant Agrawal * dpni_remove_custom_tpid() - Removes a distinct Ethertype value added 3194e59b75ffSHemant Agrawal * previously with dpni_add_custom_tpid() 3195e59b75ffSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 3196e59b75ffSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3197e59b75ffSHemant Agrawal * @token: Token of DPNI object 3198e59b75ffSHemant Agrawal * @tpid: New value for TPID 3199e59b75ffSHemant Agrawal * 3200e59b75ffSHemant Agrawal * Use this function when a TPID value added with dpni_add_custom_tpid() needs 3201e59b75ffSHemant Agrawal * to be replaced. 3202e59b75ffSHemant Agrawal * 3203e59b75ffSHemant Agrawal * Return: '0' on Success; Error code otherwise. 3204e59b75ffSHemant Agrawal */ 3205e59b75ffSHemant Agrawal int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags, 3206e59b75ffSHemant Agrawal uint16_t token, uint16_t tpid) 3207e59b75ffSHemant Agrawal { 3208e59b75ffSHemant Agrawal struct dpni_cmd_remove_custom_tpid *cmd_params; 3209e59b75ffSHemant Agrawal struct mc_command cmd = { 0 }; 3210e59b75ffSHemant Agrawal 3211e59b75ffSHemant Agrawal /* prepare command */ 3212e59b75ffSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_CUSTOM_TPID, 3213e59b75ffSHemant Agrawal cmd_flags, 3214e59b75ffSHemant Agrawal token); 3215e59b75ffSHemant Agrawal cmd_params = (struct dpni_cmd_remove_custom_tpid *)cmd.params; 3216e59b75ffSHemant Agrawal cmd_params->tpid = cpu_to_le16(tpid); 3217e59b75ffSHemant Agrawal 3218e59b75ffSHemant Agrawal /* send command to mc*/ 3219e59b75ffSHemant Agrawal return mc_send_command(mc_io, &cmd); 3220e59b75ffSHemant Agrawal } 3221e59b75ffSHemant Agrawal 3222e59b75ffSHemant Agrawal /** 32232cb2abf3SHemant Agrawal * dpni_get_custom_tpid() - Returns custom TPID (vlan tags) values configured to 32242cb2abf3SHemant Agrawal * detect 802.1q frames 3225e59b75ffSHemant Agrawal * @mc_io: Pointer to MC portal's I/O object 3226e59b75ffSHemant Agrawal * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3227e59b75ffSHemant Agrawal * @token: Token of DPNI object 3228e59b75ffSHemant Agrawal * @tpid: TPID values. Only nonzero members of the structure are valid. 3229e59b75ffSHemant Agrawal * 3230e59b75ffSHemant Agrawal * Return: '0' on Success; Error code otherwise. 3231e59b75ffSHemant Agrawal */ 3232e59b75ffSHemant Agrawal int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags, 3233e59b75ffSHemant Agrawal uint16_t token, struct dpni_custom_tpid_cfg *tpid) 3234e59b75ffSHemant Agrawal { 3235e59b75ffSHemant Agrawal struct dpni_rsp_get_custom_tpid *rsp_params; 3236e59b75ffSHemant Agrawal struct mc_command cmd = { 0 }; 3237e59b75ffSHemant Agrawal int err; 3238e59b75ffSHemant Agrawal 3239e59b75ffSHemant Agrawal /* prepare command */ 3240e59b75ffSHemant Agrawal cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_CUSTOM_TPID, 3241e59b75ffSHemant Agrawal cmd_flags, 3242e59b75ffSHemant Agrawal token); 3243e59b75ffSHemant Agrawal 3244e59b75ffSHemant Agrawal /* send command to mc*/ 3245e59b75ffSHemant Agrawal err = mc_send_command(mc_io, &cmd); 3246e59b75ffSHemant Agrawal if (err) 3247e59b75ffSHemant Agrawal return err; 3248e59b75ffSHemant Agrawal 3249e59b75ffSHemant Agrawal /* read command response */ 3250e59b75ffSHemant Agrawal rsp_params = (struct dpni_rsp_get_custom_tpid *)cmd.params; 3251e59b75ffSHemant Agrawal tpid->tpid1 = le16_to_cpu(rsp_params->tpid1); 3252e59b75ffSHemant Agrawal tpid->tpid2 = le16_to_cpu(rsp_params->tpid2); 3253e59b75ffSHemant Agrawal 3254e59b75ffSHemant Agrawal return err; 3255e59b75ffSHemant Agrawal } 3256a712067dSSunil Kumar Kori 3257f023d059SJun Yang /** 3258f023d059SJun Yang * dpni_set_port_cfg() - performs configurations at physical port connected on 3259f023d059SJun Yang * this dpni. The command have effect only if dpni is connected to 3260f023d059SJun Yang * another dpni object 3261f023d059SJun Yang * @mc_io: Pointer to MC portal's I/O object 3262f023d059SJun Yang * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3263f023d059SJun Yang * @token: Token of DPNI object 3264f023d059SJun Yang * @flags: Valid fields from port_cfg structure 3265f023d059SJun Yang * @port_cfg: Configuration data; one or more of DPNI_PORT_CFG_ 3266f023d059SJun Yang * The command can be called only when dpni is connected to a dpmac object. If 3267f023d059SJun Yang * the dpni is unconnected or the endpoint is not a dpni it will return error. 3268f023d059SJun Yang * If dpmac endpoint is disconnected the settings will be lost 3269f023d059SJun Yang */ 3270f023d059SJun Yang int dpni_set_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, 3271f023d059SJun Yang uint16_t token, uint32_t flags, struct dpni_port_cfg *port_cfg) 3272f023d059SJun Yang { 3273f023d059SJun Yang struct dpni_cmd_set_port_cfg *cmd_params; 3274f023d059SJun Yang struct mc_command cmd = { 0 }; 3275f023d059SJun Yang 3276f023d059SJun Yang /* prepare command */ 3277f023d059SJun Yang cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PORT_CFG, 3278f023d059SJun Yang cmd_flags, token); 3279f023d059SJun Yang 3280f023d059SJun Yang cmd_params = (struct dpni_cmd_set_port_cfg *)cmd.params; 3281f023d059SJun Yang cmd_params->flags = cpu_to_le32(flags); 3282*591200efSGagandeep Singh dpni_set_field(cmd_params->bit_params, PORT_LOOPBACK_EN, !!port_cfg->loopback_en); 3283*591200efSGagandeep Singh 3284*591200efSGagandeep Singh /* send command to MC */ 3285*591200efSGagandeep Singh return mc_send_command(mc_io, &cmd); 3286*591200efSGagandeep Singh } 3287*591200efSGagandeep Singh 3288*591200efSGagandeep Singh /** 3289*591200efSGagandeep Singh * dpni_get_single_step_cfg() - return current configuration for single step PTP 3290*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 3291*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3292*591200efSGagandeep Singh * @token: Token of DPNI object 3293*591200efSGagandeep Singh * @ptp_cfg: ptp single step configuration 3294*591200efSGagandeep Singh * 3295*591200efSGagandeep Singh * Return: '0' on Success; Error code otherwise. 3296*591200efSGagandeep Singh * 3297*591200efSGagandeep Singh */ 3298*591200efSGagandeep Singh int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, 3299*591200efSGagandeep Singh struct dpni_single_step_cfg *ptp_cfg) 3300*591200efSGagandeep Singh { 3301*591200efSGagandeep Singh struct dpni_rsp_single_step_cfg *rsp_params; 3302*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 3303*591200efSGagandeep Singh int err; 3304*591200efSGagandeep Singh 3305*591200efSGagandeep Singh /* prepare command */ 3306*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG, 3307*591200efSGagandeep Singh cmd_flags, 3308*591200efSGagandeep Singh token); 3309*591200efSGagandeep Singh /* send command to mc*/ 3310*591200efSGagandeep Singh err = mc_send_command(mc_io, &cmd); 3311*591200efSGagandeep Singh if (err) 3312*591200efSGagandeep Singh return err; 3313*591200efSGagandeep Singh 3314*591200efSGagandeep Singh /* read command response */ 3315*591200efSGagandeep Singh rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params; 3316*591200efSGagandeep Singh ptp_cfg->offset = le16_to_cpu(rsp_params->offset); 3317*591200efSGagandeep Singh ptp_cfg->en = dpni_get_field(rsp_params->flags, PTP_ENABLE); 3318*591200efSGagandeep Singh ptp_cfg->ch_update = dpni_get_field(rsp_params->flags, PTP_CH_UPDATE); 3319*591200efSGagandeep Singh ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay); 3320*591200efSGagandeep Singh ptp_cfg->ptp_onestep_reg_base = 3321*591200efSGagandeep Singh le32_to_cpu(rsp_params->ptp_onestep_reg_base); 3322*591200efSGagandeep Singh 3323*591200efSGagandeep Singh return err; 3324*591200efSGagandeep Singh } 3325*591200efSGagandeep Singh 3326*591200efSGagandeep Singh /** 3327*591200efSGagandeep Singh * dpni_get_port_cfg() - return configuration from physical port. The command has effect only if 3328*591200efSGagandeep Singh * dpni is connected to a mac object 3329*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 3330*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3331*591200efSGagandeep Singh * @token: Token of DPNI object 3332*591200efSGagandeep Singh * @port_cfg: Configuration data 3333*591200efSGagandeep Singh * The command can be called only when dpni is connected to a dpmac object. 3334*591200efSGagandeep Singh * If the dpni is unconnected or the endpoint is not a dpni it will return error; 3335*591200efSGagandeep Singh */ 3336*591200efSGagandeep Singh int dpni_get_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, 3337*591200efSGagandeep Singh struct dpni_port_cfg *port_cfg) 3338*591200efSGagandeep Singh { 3339*591200efSGagandeep Singh struct dpni_rsp_get_port_cfg *rsp_params; 3340*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 3341*591200efSGagandeep Singh int err; 3342*591200efSGagandeep Singh 3343*591200efSGagandeep Singh /* prepare command */ 3344*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_CFG, 3345*591200efSGagandeep Singh cmd_flags, token); 3346*591200efSGagandeep Singh 3347*591200efSGagandeep Singh /* send command to MC */ 3348*591200efSGagandeep Singh err = mc_send_command(mc_io, &cmd); 3349*591200efSGagandeep Singh if (err) 3350*591200efSGagandeep Singh return err; 3351*591200efSGagandeep Singh 3352*591200efSGagandeep Singh /* read command response */ 3353*591200efSGagandeep Singh rsp_params = (struct dpni_rsp_get_port_cfg *)cmd.params; 3354*591200efSGagandeep Singh port_cfg->loopback_en = dpni_get_field(rsp_params->bit_params, PORT_LOOPBACK_EN); 3355*591200efSGagandeep Singh 3356*591200efSGagandeep Singh return 0; 3357*591200efSGagandeep Singh } 3358*591200efSGagandeep Singh 3359*591200efSGagandeep Singh /** 3360*591200efSGagandeep Singh * dpni_set_single_step_cfg() - enable/disable and configure single step PTP 3361*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 3362*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3363*591200efSGagandeep Singh * @token: Token of DPNI object 3364*591200efSGagandeep Singh * @ptp_cfg: ptp single step configuration 3365*591200efSGagandeep Singh * 3366*591200efSGagandeep Singh * Return: '0' on Success; Error code otherwise. 3367*591200efSGagandeep Singh * 3368*591200efSGagandeep Singh * The function has effect only when dpni object is connected to a dpmac object. If the 3369*591200efSGagandeep Singh * dpni is not connected to a dpmac the configuration will be stored inside and applied 3370*591200efSGagandeep Singh * when connection is made. 3371*591200efSGagandeep Singh */ 3372*591200efSGagandeep Singh int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, 3373*591200efSGagandeep Singh struct dpni_single_step_cfg *ptp_cfg) 3374*591200efSGagandeep Singh { 3375*591200efSGagandeep Singh struct dpni_cmd_single_step_cfg *cmd_params; 3376*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 3377*591200efSGagandeep Singh 3378*591200efSGagandeep Singh /* prepare command */ 3379*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG, 3380*591200efSGagandeep Singh cmd_flags, 3381*591200efSGagandeep Singh token); 3382*591200efSGagandeep Singh cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params; 3383*591200efSGagandeep Singh cmd_params->offset = cpu_to_le16(ptp_cfg->offset); 3384*591200efSGagandeep Singh cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay); 3385*591200efSGagandeep Singh dpni_set_field(cmd_params->flags, PTP_ENABLE, !!ptp_cfg->en); 3386*591200efSGagandeep Singh dpni_set_field(cmd_params->flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update); 3387*591200efSGagandeep Singh 3388*591200efSGagandeep Singh /* send command to mc*/ 3389*591200efSGagandeep Singh return mc_send_command(mc_io, &cmd); 3390*591200efSGagandeep Singh } 3391*591200efSGagandeep Singh 3392*591200efSGagandeep Singh /** 3393*591200efSGagandeep Singh * dpni_dump_table() - Dump the content of table_type table into memory. 3394*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 3395*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3396*591200efSGagandeep Singh * @token: Token of DPSW object 3397*591200efSGagandeep Singh * @table_type: The type of the table to dump 3398*591200efSGagandeep Singh * @table_index: The index of the table to dump in case of more than one table 3399*591200efSGagandeep Singh * @iova_addr: The snapshot will be stored in this variable as an header of struct dump_table_header 3400*591200efSGagandeep Singh * followed by an array of struct dump_table_entry 3401*591200efSGagandeep Singh * @iova_size: Memory size allocated for iova_addr 3402*591200efSGagandeep Singh * @num_entries: Number of entries written in iova_addr 3403*591200efSGagandeep Singh * 3404*591200efSGagandeep Singh * Return: Completion status. '0' on Success; Error code otherwise. 3405*591200efSGagandeep Singh * 3406*591200efSGagandeep Singh * The memory allocated at iova_addr must be zeroed before command execution. 3407*591200efSGagandeep Singh * If the table content exceeds the memory size provided the dump will be truncated. 3408*591200efSGagandeep Singh */ 3409*591200efSGagandeep Singh int dpni_dump_table(struct fsl_mc_io *mc_io, 3410*591200efSGagandeep Singh uint32_t cmd_flags, 3411*591200efSGagandeep Singh uint16_t token, 3412*591200efSGagandeep Singh uint16_t table_type, 3413*591200efSGagandeep Singh uint16_t table_index, 3414*591200efSGagandeep Singh uint64_t iova_addr, 3415*591200efSGagandeep Singh uint32_t iova_size, 3416*591200efSGagandeep Singh uint16_t *num_entries) 3417*591200efSGagandeep Singh { 3418*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 3419*591200efSGagandeep Singh int err; 3420*591200efSGagandeep Singh struct dpni_cmd_dump_table *cmd_params; 3421*591200efSGagandeep Singh struct dpni_rsp_dump_table *rsp_params; 3422*591200efSGagandeep Singh 3423*591200efSGagandeep Singh /* prepare command */ 3424*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_DUMP_TABLE, cmd_flags, token); 3425*591200efSGagandeep Singh cmd_params = (struct dpni_cmd_dump_table *)cmd.params; 3426*591200efSGagandeep Singh cmd_params->table_type = cpu_to_le16(table_type); 3427*591200efSGagandeep Singh cmd_params->table_index = cpu_to_le16(table_index); 3428*591200efSGagandeep Singh cmd_params->iova_addr = cpu_to_le64(iova_addr); 3429*591200efSGagandeep Singh cmd_params->iova_size = cpu_to_le32(iova_size); 3430*591200efSGagandeep Singh 3431*591200efSGagandeep Singh /* send command to mc*/ 3432*591200efSGagandeep Singh err = mc_send_command(mc_io, &cmd); 3433*591200efSGagandeep Singh if (err) 3434*591200efSGagandeep Singh return err; 3435*591200efSGagandeep Singh 3436*591200efSGagandeep Singh rsp_params = (struct dpni_rsp_dump_table *)cmd.params; 3437*591200efSGagandeep Singh *num_entries = le16_to_cpu(rsp_params->num_entries); 3438*591200efSGagandeep Singh 3439*591200efSGagandeep Singh return 0; 3440*591200efSGagandeep Singh } 3441*591200efSGagandeep Singh 3442*591200efSGagandeep Singh /* Sets up a Soft Parser Profile on this DPNI 3443*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 3444*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3445*591200efSGagandeep Singh * @token: Token of DPNI object 3446*591200efSGagandeep Singh * @sp_profile: Soft Parser Profile name (must a valid name for a defined profile) 3447*591200efSGagandeep Singh * Maximum allowed length for this string is 8 characters long 3448*591200efSGagandeep Singh * If this parameter is empty string (all zeros) 3449*591200efSGagandeep Singh * then the Default SP Profile is set on this dpni 3450*591200efSGagandeep Singh * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR) 3451*591200efSGagandeep Singh */ 3452*591200efSGagandeep Singh int dpni_set_sp_profile(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, 3453*591200efSGagandeep Singh uint8_t sp_profile[], uint8_t type) 3454*591200efSGagandeep Singh { 3455*591200efSGagandeep Singh struct dpni_cmd_set_sp_profile *cmd_params; 3456*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 3457*591200efSGagandeep Singh int i; 3458*591200efSGagandeep Singh 3459*591200efSGagandeep Singh /* prepare command */ 3460*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SP_PROFILE, 3461*591200efSGagandeep Singh cmd_flags, token); 3462*591200efSGagandeep Singh 3463*591200efSGagandeep Singh cmd_params = (struct dpni_cmd_set_sp_profile *)cmd.params; 3464*591200efSGagandeep Singh for (i = 0; i < MAX_SP_PROFILE_ID_SIZE && sp_profile[i]; i++) 3465*591200efSGagandeep Singh cmd_params->sp_profile[i] = sp_profile[i]; 3466*591200efSGagandeep Singh cmd_params->type = type; 3467*591200efSGagandeep Singh 3468*591200efSGagandeep Singh /* send command to MC */ 3469*591200efSGagandeep Singh return mc_send_command(mc_io, &cmd); 3470*591200efSGagandeep Singh } 3471*591200efSGagandeep Singh 3472*591200efSGagandeep Singh /* Enable/Disable Soft Parser on this DPNI 3473*591200efSGagandeep Singh * @mc_io: Pointer to MC portal's I/O object 3474*591200efSGagandeep Singh * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3475*591200efSGagandeep Singh * @token: Token of DPNI object 3476*591200efSGagandeep Singh * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR) 3477*591200efSGagandeep Singh * @en: 1 to enable or 0 to disable 3478*591200efSGagandeep Singh */ 3479*591200efSGagandeep Singh int dpni_sp_enable(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, 3480*591200efSGagandeep Singh uint8_t type, uint8_t en) 3481*591200efSGagandeep Singh { 3482*591200efSGagandeep Singh struct dpni_cmd_sp_enable *cmd_params; 3483*591200efSGagandeep Singh struct mc_command cmd = { 0 }; 3484*591200efSGagandeep Singh 3485*591200efSGagandeep Singh /* prepare command */ 3486*591200efSGagandeep Singh cmd.header = mc_encode_cmd_header(DPNI_CMDID_SP_ENABLE, 3487*591200efSGagandeep Singh cmd_flags, token); 3488*591200efSGagandeep Singh 3489*591200efSGagandeep Singh cmd_params = (struct dpni_cmd_sp_enable *)cmd.params; 3490*591200efSGagandeep Singh cmd_params->type = type; 3491*591200efSGagandeep Singh cmd_params->en = en; 3492f023d059SJun Yang 3493f023d059SJun Yang /* send command to MC */ 3494f023d059SJun Yang return mc_send_command(mc_io, &cmd); 3495f023d059SJun Yang } 3496