@@ -105,8 +105,8 @@ separately:
Currently supported by DPDK:
-- NXP SDK **LSDK 19.09++**.
-- MC Firmware version **10.18.0** and higher.
+- NXP SDK **LSDK 21.08++**.
+- MC Firmware version **10.37.0** and higher.
- Supported architectures: **arm64 LE**.
- Follow the DPDK :ref:`Getting Started Guide for Linux <linux_gsg>`
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2017 NXP
+ * Copyright 2016-2023 NXP
*
*/
#include <fsl_mc_sys.h>
@@ -376,6 +376,98 @@ int dpio_get_stashing_destination(struct fsl_mc_io *mc_io,
return 0;
}
+/**
+ * dpio_set_stashing_destination_by_core_id() - Set the stashing destination source
+ * using the core id.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPIO object
+ * @core_id: Core id stashing destination
+ *
+ * Return: '0' on Success; Error code otherwise.
+ */
+int dpio_set_stashing_destination_by_core_id(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t core_id)
+{
+ struct dpio_stashing_dest_by_core_id *cmd_params;
+ struct mc_command cmd = { 0 };
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST_BY_CORE_ID,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpio_stashing_dest_by_core_id *)cmd.params;
+ cmd_params->core_id = core_id;
+
+ /* send command to mc*/
+ return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpio_set_stashing_destination_source() - Set the stashing destination source.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPIO object
+ * @ss: Stashing destination source (0 manual/1 automatic)
+ *
+ * Return: '0' on Success; Error code otherwise.
+ */
+int dpio_set_stashing_destination_source(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t ss)
+{
+ struct dpio_stashing_dest_source *cmd_params;
+ struct mc_command cmd = { 0 };
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST_SOURCE,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpio_stashing_dest_source *)cmd.params;
+ cmd_params->ss = ss;
+
+ /* send command to mc*/
+ return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpio_get_stashing_destination_source() - Get the stashing destination source.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPIO object
+ * @ss: Returns the stashing destination source (0 manual/1 automatic)
+ *
+ * Return: '0' on Success; Error code otherwise.
+ */
+int dpio_get_stashing_destination_source(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t *ss)
+{
+ struct dpio_stashing_dest_source *rsp_params;
+ struct mc_command cmd = { 0 };
+ int err;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_STASHING_DEST_SOURCE,
+ cmd_flags,
+ token);
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* retrieve response parameters */
+ rsp_params = (struct dpio_stashing_dest_source *)cmd.params;
+ *ss = rsp_params->ss;
+
+ return 0;
+}
+
/**
* dpio_add_static_dequeue_channel() - Add a static dequeue channel.
* @mc_io: Pointer to MC portal's I/O object
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2017-2021 NXP
+ * Copyright 2017-2021, 2024 NXP
*
*/
#ifndef __FSL_DPCON_H
@@ -52,10 +52,12 @@ int dpcon_destroy(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint32_t obj_id);
+__rte_internal
int dpcon_enable(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token);
+__rte_internal
int dpcon_disable(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token);
@@ -65,6 +67,7 @@ int dpcon_is_enabled(struct fsl_mc_io *mc_io,
uint16_t token,
int *en);
+__rte_internal
int dpcon_reset(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token);
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2017 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef __FSL_DPIO_H
@@ -87,11 +87,30 @@ int dpio_set_stashing_destination(struct fsl_mc_io *mc_io,
uint16_t token,
uint8_t sdest);
+__rte_internal
int dpio_get_stashing_destination(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
uint8_t *sdest);
+__rte_internal
+int dpio_set_stashing_destination_by_core_id(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t core_id);
+
+__rte_internal
+int dpio_set_stashing_destination_source(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t ss);
+
+__rte_internal
+int dpio_get_stashing_destination_source(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t *ss);
+
__rte_internal
int dpio_add_static_dequeue_channel(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2019 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef _FSL_DPIO_CMD_H
@@ -40,6 +40,9 @@
#define DPIO_CMDID_GET_STASHING_DEST DPIO_CMD(0x121)
#define DPIO_CMDID_ADD_STATIC_DEQUEUE_CHANNEL DPIO_CMD(0x122)
#define DPIO_CMDID_REMOVE_STATIC_DEQUEUE_CHANNEL DPIO_CMD(0x123)
+#define DPIO_CMDID_SET_STASHING_DEST_SOURCE DPIO_CMD(0x124)
+#define DPIO_CMDID_GET_STASHING_DEST_SOURCE DPIO_CMD(0x125)
+#define DPIO_CMDID_SET_STASHING_DEST_BY_CORE_ID DPIO_CMD(0x126)
/* Macros for accessing command fields smaller than 1byte */
#define DPIO_MASK(field) \
@@ -98,6 +101,14 @@ struct dpio_stashing_dest {
uint8_t sdest;
};
+struct dpio_stashing_dest_source {
+ uint8_t ss;
+};
+
+struct dpio_stashing_dest_by_core_id {
+ uint8_t core_id;
+};
+
struct dpio_cmd_static_dequeue_channel {
uint32_t dpcon_id;
};
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2015 Freescale Semiconductor Inc.
- * Copyright 2017-2022 NXP
+ * Copyright 2017-2023 NXP
*
*/
#ifndef __FSL_DPMNG_H
@@ -20,7 +20,7 @@ struct fsl_mc_io;
* Management Complex firmware version information
*/
#define MC_VER_MAJOR 10
-#define MC_VER_MINOR 32
+#define MC_VER_MINOR 37
/**
* struct mc_version
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2021 NXP
+ * Copyright 2016-2023 NXP
*
*/
@@ -10,13 +10,17 @@
/* Minimal supported DPRC Version */
#define DPRC_VER_MAJOR 6
-#define DPRC_VER_MINOR 6
+#define DPRC_VER_MINOR 7
/* Command versioning */
#define DPRC_CMD_BASE_VERSION 1
+#define DPRC_CMD_VERSION_2 2
+#define DPRC_CMD_VERSION_3 3
#define DPRC_CMD_ID_OFFSET 4
#define DPRC_CMD(id) ((id << DPRC_CMD_ID_OFFSET) | DPRC_CMD_BASE_VERSION)
+#define DPRC_CMD_V2(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_VERSION_2)
+#define DPRC_CMD_V3(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_VERSION_3)
/* Command IDs */
#define DPRC_CMDID_CLOSE DPRC_CMD(0x800)
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C) 2015 Freescale Semiconductor, Inc.
- * Copyright 2018-2020 NXP
+ * Copyright 2018-2023 NXP
*/
#ifndef _FSL_QBMAN_DEBUG_H
#define _FSL_QBMAN_DEBUG_H
@@ -105,16 +105,6 @@ uint32_t qbman_fq_attr_get_vfqid(struct qbman_fq_query_rslt *r);
uint32_t qbman_fq_attr_get_erfqid(struct qbman_fq_query_rslt *r);
uint16_t qbman_fq_attr_get_opridsz(struct qbman_fq_query_rslt *r);
-/* FQ query command for non-programmable fields*/
-enum qbman_fq_schedstate_e {
- qbman_fq_schedstate_oos = 0,
- qbman_fq_schedstate_retired,
- qbman_fq_schedstate_tentatively_scheduled,
- qbman_fq_schedstate_truly_scheduled,
- qbman_fq_schedstate_parked,
- qbman_fq_schedstate_held_active,
-};
-
struct qbman_fq_query_np_rslt {
uint8_t verb;
uint8_t rslt;
@@ -37,6 +37,9 @@ INTERNAL {
dpcon_get_attributes;
dpcon_open;
dpcon_close;
+ dpcon_reset;
+ dpcon_enable;
+ dpcon_disable;
dpdmai_close;
dpdmai_disable;
dpdmai_enable;
@@ -53,7 +56,11 @@ INTERNAL {
dpio_open;
dpio_remove_static_dequeue_channel;
dpio_reset;
+ dpio_get_stashing_destination;
+ dpio_get_stashing_destination_source;
dpio_set_stashing_destination;
+ dpio_set_stashing_destination_by_core_id;
+ dpio_set_stashing_destination_source;
mc_get_soc_version;
mc_get_version;
mc_send_command;
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016 NXP
+ * Copyright 2016-2023 NXP
*
*/
#include <fsl_mc_sys.h>
@@ -763,3 +763,92 @@ int dpseci_get_congestion_notification(
return 0;
}
+
+
+/**
+ * dpseci_get_rx_queue_status() - Get queue status attributes
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPSECI object
+ * @queue_index: Select the queue_index
+ * @attr: Returned queue status attributes
+ *
+ * Return: '0' on success, error code otherwise
+ */
+int dpseci_get_rx_queue_status(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint32_t queue_index,
+ struct dpseci_queue_status *attr)
+{
+ struct dpseci_rsp_get_queue_status *rsp_params;
+ struct dpseci_cmd_get_queue_status *cmd_params;
+ struct mc_command cmd = { 0 };
+ int err;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE_STATUS,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpseci_cmd_get_queue_status *)cmd.params;
+ cmd_params->queue_index = cpu_to_le32(queue_index);
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* retrieve response parameters */
+ rsp_params = (struct dpseci_rsp_get_queue_status *)cmd.params;
+ attr->fqid = le32_to_cpu(rsp_params->fqid);
+ attr->schedstate = (enum qbman_fq_schedstate_e)(le16_to_cpu(rsp_params->schedstate));
+ attr->state_flags = le16_to_cpu(rsp_params->state_flags);
+ attr->frame_count = le32_to_cpu(rsp_params->frame_count);
+ attr->byte_count = le32_to_cpu(rsp_params->byte_count);
+
+ return 0;
+}
+
+/**
+ * dpseci_get_tx_queue_status() - Get queue status attributes
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPSECI object
+ * @queue_index: Select the queue_index
+ * @attr: Returned queue status attributes
+ *
+ * Return: '0' on success, error code otherwise
+ */
+int dpseci_get_tx_queue_status(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint32_t queue_index,
+ struct dpseci_queue_status *attr)
+{
+ struct dpseci_rsp_get_queue_status *rsp_params;
+ struct dpseci_cmd_get_queue_status *cmd_params;
+ struct mc_command cmd = { 0 };
+ int err;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE_STATUS,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpseci_cmd_get_queue_status *)cmd.params;
+ cmd_params->queue_index = cpu_to_le32(queue_index);
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* retrieve response parameters */
+ rsp_params = (struct dpseci_rsp_get_queue_status *)cmd.params;
+ attr->fqid = le32_to_cpu(rsp_params->fqid);
+ attr->schedstate = (enum qbman_fq_schedstate_e)(le16_to_cpu(rsp_params->schedstate));
+ attr->state_flags = le16_to_cpu(rsp_params->state_flags);
+ attr->frame_count = le32_to_cpu(rsp_params->frame_count);
+ attr->byte_count = le32_to_cpu(rsp_params->byte_count);
+
+ return 0;
+}
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2020 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef __FSL_DPSECI_H
@@ -429,4 +429,49 @@ int dpseci_get_congestion_notification(
uint16_t token,
struct dpseci_congestion_notification_cfg *cfg);
+/* Available FQ's scheduling states */
+enum qbman_fq_schedstate_e {
+ qbman_fq_schedstate_oos = 0,
+ qbman_fq_schedstate_retired,
+ qbman_fq_schedstate_tentatively_scheduled,
+ qbman_fq_schedstate_truly_scheduled,
+ qbman_fq_schedstate_parked,
+ qbman_fq_schedstate_held_active,
+};
+
+/* FQ's force eligible pending bit */
+#define DPSECI_FQ_STATE_FORCE_ELIGIBLE 0x00000001
+/* FQ's XON/XOFF state, 0: XON, 1: XOFF */
+#define DPSECI_FQ_STATE_XOFF 0x00000002
+/* FQ's retirement pending bit */
+#define DPSECI_FQ_STATE_RETIREMENT_PENDING 0x00000004
+/* FQ's overflow error bit */
+#define DPSECI_FQ_STATE_OVERFLOW_ERROR 0x00000008
+
+struct dpseci_queue_status {
+ uint32_t fqid;
+ /* FQ's scheduling states
+ * (available scheduling states are defined in qbman_fq_schedstate_e)
+ */
+ enum qbman_fq_schedstate_e schedstate;
+ /* FQ's state flags (available flags are defined above) */
+ uint16_t state_flags;
+ /* FQ's frame count */
+ uint32_t frame_count;
+ /* FQ's byte count */
+ uint32_t byte_count;
+};
+
+int dpseci_get_rx_queue_status(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint32_t queue_index,
+ struct dpseci_queue_status *attr);
+
+int dpseci_get_tx_queue_status(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint32_t queue_index,
+ struct dpseci_queue_status *attr);
+
#endif /* __FSL_DPSECI_H */
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2017 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef _FSL_DPSECI_CMD_H
@@ -9,7 +9,7 @@
/* DPSECI Version */
#define DPSECI_VER_MAJOR 5
-#define DPSECI_VER_MINOR 3
+#define DPSECI_VER_MINOR 4
/* Command versioning */
#define DPSECI_CMD_BASE_VERSION 1
@@ -46,6 +46,9 @@
#define DPSECI_CMDID_GET_OPR DPSECI_CMD_V1(0x19B)
#define DPSECI_CMDID_SET_CONGESTION_NOTIFICATION DPSECI_CMD_V1(0x170)
#define DPSECI_CMDID_GET_CONGESTION_NOTIFICATION DPSECI_CMD_V1(0x171)
+#define DPSECI_CMDID_GET_RX_QUEUE_STATUS DPSECI_CMD_V1(0x172)
+#define DPSECI_CMDID_GET_TX_QUEUE_STATUS DPSECI_CMD_V1(0x173)
+
/* Macros for accessing command fields smaller than 1byte */
#define DPSECI_MASK(field) \
@@ -251,5 +254,17 @@ struct dpseci_cmd_set_congestion_notification {
uint32_t threshold_exit;
};
+struct dpseci_cmd_get_queue_status {
+ uint32_t queue_index;
+};
+
+struct dpseci_rsp_get_queue_status {
+ uint32_t fqid;
+ uint16_t schedstate;
+ uint16_t state_flags;
+ uint32_t frame_count;
+ uint32_t byte_count;
+};
+
#pragma pack(pop)
#endif /* _FSL_DPSECI_CMD_H */
@@ -896,6 +896,7 @@ dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
struct dpni_queue tx_conf_cfg;
struct dpni_queue tx_flow_cfg;
uint8_t options = 0, flow_id;
+ uint8_t ceetm_ch_idx;
uint16_t channel_id;
struct dpni_queue_id qid;
uint32_t tc_id;
@@ -922,20 +923,27 @@ dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue));
memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue));
- if (tx_queue_id == 0) {
- /*Set tx-conf and error configuration*/
- if (priv->flags & DPAA2_TX_CONF_ENABLE)
- ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW,
- priv->token,
- DPNI_CONF_AFFINE);
- else
- ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW,
- priv->token,
- DPNI_CONF_DISABLE);
- if (ret) {
- DPAA2_PMD_ERR("Error in set tx conf mode settings: "
- "err=%d", ret);
- return -1;
+ if (!tx_queue_id) {
+ for (ceetm_ch_idx = 0;
+ ceetm_ch_idx <= (priv->num_channels - 1);
+ ceetm_ch_idx++) {
+ /*Set tx-conf and error configuration*/
+ if (priv->flags & DPAA2_TX_CONF_ENABLE) {
+ ret = dpni_set_tx_confirmation_mode(dpni,
+ CMD_PRI_LOW, priv->token,
+ ceetm_ch_idx,
+ DPNI_CONF_AFFINE);
+ } else {
+ ret = dpni_set_tx_confirmation_mode(dpni,
+ CMD_PRI_LOW, priv->token,
+ ceetm_ch_idx,
+ DPNI_CONF_DISABLE);
+ }
+ if (ret) {
+ DPAA2_PMD_ERR("Error(%d) in tx conf setting",
+ ret);
+ return ret;
+ }
}
}
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2018-2021 NXP
+ * Copyright 2018-2023 NXP
*
*/
#include <fsl_mc_sys.h>
@@ -287,15 +287,19 @@ int dpdmux_reset(struct fsl_mc_io *mc_io,
* @token: Token of DPDMUX object
* @skip_reset_flags: By default all are 0.
* By setting 1 will deactivate the reset.
- * The flags are:
- * DPDMUX_SKIP_DEFAULT_INTERFACE 0x01
- * DPDMUX_SKIP_UNICAST_RULES 0x02
- * DPDMUX_SKIP_MULTICAST_RULES 0x04
+ * The flags are:
+ * DPDMUX_SKIP_MODIFY_DEFAULT_INTERFACE 0x01
+ * DPDMUX_SKIP_UNICAST_RULES 0x02
+ * DPDMUX_SKIP_MULTICAST_RULES 0x04
+ * DPDMUX_SKIP_RESET_DEFAULT_INTERFACE 0x08
*
* For example, by default, through DPDMUX_RESET the default
* interface will be restored with the one from create.
- * By setting DPDMUX_SKIP_DEFAULT_INTERFACE flag,
- * through DPDMUX_RESET the default interface will not be modified.
+ * By setting DPDMUX_SKIP_MODIFY_DEFAULT_INTERFACE flag,
+ * through DPDMUX_RESET the default interface will not be modified after reset.
+ * By setting DPDMUX_SKIP_RESET_DEFAULT_INTERFACE flag,
+ * through DPDMUX_RESET the default interface will not be reset
+ * and will continue to be functional during reset procedure.
*
* Return: '0' on Success; Error code otherwise.
*/
@@ -327,10 +331,11 @@ int dpdmux_set_resetable(struct fsl_mc_io *mc_io,
* @token: Token of DPDMUX object
* @skip_reset_flags: Get the reset flags.
*
- * The flags are:
- * DPDMUX_SKIP_DEFAULT_INTERFACE 0x01
- * DPDMUX_SKIP_UNICAST_RULES 0x02
- * DPDMUX_SKIP_MULTICAST_RULES 0x04
+ * The flags are:
+ * DPDMUX_SKIP_MODIFY_DEFAULT_INTERFACE 0x01
+ * DPDMUX_SKIP_UNICAST_RULES 0x02
+ * DPDMUX_SKIP_MULTICAST_RULES 0x04
+ * DPDMUX_SKIP_RESET_DEFAULT_INTERFACE 0x08
*
* Return: '0' on Success; Error code otherwise.
*/
@@ -1064,6 +1069,127 @@ int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
return 0;
}
+/**
+ * dpdmux_if_set_taildrop() - enable taildrop for egress interface queues.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPDMUX object
+ * @if_id: Interface Identifier
+ * @cfg: Taildrop configuration
+ */
+int dpdmux_if_set_taildrop(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t if_id, struct dpdmux_taildrop_cfg *cfg)
+{
+ struct mc_command cmd = { 0 };
+ struct dpdmux_cmd_set_taildrop *cmd_params;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_SET_TAILDROP,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpdmux_cmd_set_taildrop *)cmd.params;
+ cmd_params->if_id = cpu_to_le16(if_id);
+ cmd_params->units = cfg->units;
+ cmd_params->threshold = cpu_to_le32(cfg->threshold);
+ dpdmux_set_field(cmd_params->oal_en, ENABLE, (!!cfg->enable));
+
+ return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpdmux_if_get_taildrop() - get current taildrop configuration.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPDMUX object
+ * @if_id: Interface Identifier
+ * @cfg: Taildrop configuration
+ */
+int dpdmux_if_get_taildrop(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t if_id, struct dpdmux_taildrop_cfg *cfg)
+{
+ struct mc_command cmd = {0};
+ struct dpdmux_cmd_get_taildrop *cmd_params;
+ struct dpdmux_rsp_get_taildrop *rsp_params;
+ int err = 0;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_GET_TAILDROP,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpdmux_cmd_get_taildrop *)cmd.params;
+ cmd_params->if_id = cpu_to_le16(if_id);
+
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* retrieve response parameters */
+ rsp_params = (struct dpdmux_rsp_get_taildrop *)cmd.params;
+ cfg->threshold = le32_to_cpu(rsp_params->threshold);
+ cfg->units = rsp_params->units;
+ cfg->enable = dpdmux_get_field(rsp_params->oal_en, ENABLE);
+
+ return err;
+}
+
+/**
+ * dpdmux_dump_table() - Dump the content of table_type table into memory.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPSW object
+ * @table_type: The type of the table to dump
+ * - DPDMUX_DMAT_TABLE
+ * - DPDMUX_MISS_TABLE
+ * - DPDMUX_PRUNE_TABLE
+ * @table_index: The index of the table to dump in case of more than one table
+ * if table_type == DPDMUX_DMAT_TABLE
+ * - DPDMUX_HMAP_UNICAST
+ * - DPDMUX_HMAP_MULTICAST
+ * else 0
+ * @iova_addr: The snapshot will be stored in this variable as an header of struct dump_table_header
+ * followed by an array of struct dump_table_entry
+ * @iova_size: Memory size allocated for iova_addr
+ * @num_entries: Number of entries written in iova_addr
+ *
+ * Return: Completion status. '0' on Success; Error code otherwise.
+ *
+ * The memory allocated at iova_addr must be zeroed before command execution.
+ * If the table content exceeds the memory size provided the dump will be truncated.
+ */
+int dpdmux_dump_table(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint16_t table_type,
+ uint16_t table_index,
+ uint64_t iova_addr,
+ uint32_t iova_size,
+ uint16_t *num_entries)
+{
+ struct mc_command cmd = { 0 };
+ int err;
+ struct dpdmux_cmd_dump_table *cmd_params;
+ struct dpdmux_rsp_dump_table *rsp_params;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_DUMP_TABLE, cmd_flags, token);
+ cmd_params = (struct dpdmux_cmd_dump_table *)cmd.params;
+ cmd_params->table_type = cpu_to_le16(table_type);
+ cmd_params->table_index = cpu_to_le16(table_index);
+ cmd_params->iova_addr = cpu_to_le64(iova_addr);
+ cmd_params->iova_size = cpu_to_le32(iova_size);
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ rsp_params = (struct dpdmux_rsp_dump_table *)cmd.params;
+ *num_entries = le16_to_cpu(rsp_params->num_entries);
+
+ return 0;
+}
+
+
/**
* dpdmux_if_set_errors_behavior() - Set errors behavior
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
@@ -1100,3 +1226,60 @@ int dpdmux_if_set_errors_behavior(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
/* send command to mc*/
return mc_send_command(mc_io, &cmd);
}
+
+/* Sets up a Soft Parser Profile on this DPDMUX
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPDMUX object
+ * @sp_profile: Soft Parser Profile name (must a valid name for a defined profile)
+ * Maximum allowed length for this string is 8 characters long
+ * If this parameter is empty string (all zeros)
+ * then the Default SP Profile is set on this dpdmux
+ * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR)
+ */
+int dpdmux_set_sp_profile(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint8_t sp_profile[], uint8_t type)
+{
+ struct dpdmux_cmd_set_sp_profile *cmd_params;
+ struct mc_command cmd = { 0 };
+ int i;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SET_SP_PROFILE,
+ cmd_flags, token);
+
+ cmd_params = (struct dpdmux_cmd_set_sp_profile *)cmd.params;
+ for (i = 0; i < MAX_SP_PROFILE_ID_SIZE && sp_profile[i]; i++)
+ cmd_params->sp_profile[i] = sp_profile[i];
+ cmd_params->type = type;
+
+ /* send command to MC */
+ return mc_send_command(mc_io, &cmd);
+}
+
+/* Enable/Disable Soft Parser on this DPDMUX interface
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPDMUX object
+ * @if_id: interface id
+ * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR)
+ * @en: 1 to enable or 0 to disable
+ */
+int dpdmux_sp_enable(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t if_id, uint8_t type, uint8_t en)
+{
+ struct dpdmux_cmd_sp_enable *cmd_params;
+ struct mc_command cmd = { 0 };
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SP_ENABLE,
+ cmd_flags, token);
+
+ cmd_params = (struct dpdmux_cmd_sp_enable *)cmd.params;
+ cmd_params->if_id = if_id;
+ cmd_params->type = type;
+ cmd_params->en = en;
+
+ /* send command to MC */
+ return mc_send_command(mc_io, &cmd);
+}
@@ -1,16 +1,18 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
- * Copyright 2017-2021 NXP
+ * Copyright 2017-2021, 2023 NXP
*
*/
#include <fsl_mc_sys.h>
#include <fsl_mc_cmd.h>
#include <fsl_dpkg.h>
+#include <string.h>
/**
* dpkg_prepare_key_cfg() - function prepare extract parameters
* @cfg: defining a full Key Generation profile (rule)
- * @key_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA
+ * @key_cfg_buf: Zeroed memory whose size is sizeo of
+ * "struct dpni_ext_set_rx_tc_dist" before mapping it to DMA
*
* This function has to be called before the following functions:
* - dpni_set_rx_tc_dist()
@@ -18,7 +20,8 @@
* - dpkg_prepare_key_cfg()
*/
int
-dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, uint8_t *key_cfg_buf)
+dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
+ void *key_cfg_buf)
{
int i, j;
struct dpni_ext_set_rx_tc_dist *dpni_ext;
@@ -27,11 +30,12 @@ dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, uint8_t *key_cfg_buf)
if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS)
return -EINVAL;
- dpni_ext = (struct dpni_ext_set_rx_tc_dist *)key_cfg_buf;
+ dpni_ext = key_cfg_buf;
dpni_ext->num_extracts = cfg->num_extracts;
for (i = 0; i < cfg->num_extracts; i++) {
extr = &dpni_ext->extracts[i];
+ memset(extr, 0, sizeof(struct dpni_dist_extract));
switch (cfg->extracts[i].type) {
case DPKG_EXTRACT_FROM_HDR:
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2022 NXP
+ * Copyright 2016-2023 NXP
*
*/
#include <fsl_mc_sys.h>
@@ -852,6 +852,92 @@ int dpni_get_qdid(struct fsl_mc_io *mc_io,
return 0;
}
+/**
+ * dpni_get_qdid_ex() - Extension for the function to get the Queuing Destination ID (QDID)
+ * that should be used for enqueue operations.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @qtype: Type of queue to receive QDID for
+ * @qdid: Array of virtual QDID value that should be used as an argument
+ * in all enqueue operations.
+ *
+ * Return: '0' on Success; Error code otherwise.
+ *
+ * This function must be used when dpni is created using multiple Tx channels to return one
+ * qdid for each channel.
+ */
+int dpni_get_qdid_ex(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ enum dpni_queue_type qtype,
+ uint16_t *qdid)
+{
+ struct mc_command cmd = { 0 };
+ struct dpni_cmd_get_qdid *cmd_params;
+ struct dpni_rsp_get_qdid_ex *rsp_params;
+ int i;
+ int err;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID_EX,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
+ cmd_params->qtype = qtype;
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* retrieve response parameters */
+ rsp_params = (struct dpni_rsp_get_qdid_ex *)cmd.params;
+ for (i = 0; i < DPNI_MAX_CHANNELS; i++)
+ qdid[i] = le16_to_cpu(rsp_params->qdid[i]);
+
+ return 0;
+}
+
+/**
+ * dpni_get_sp_info() - Get the AIOP storage profile IDs associated
+ * with the DPNI
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @sp_info: Returned AIOP storage-profile information
+ *
+ * Return: '0' on Success; Error code otherwise.
+ *
+ * @warning Only relevant for DPNI that belongs to AIOP container.
+ */
+int dpni_get_sp_info(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ struct dpni_sp_info *sp_info)
+{
+ struct dpni_rsp_get_sp_info *rsp_params;
+ struct mc_command cmd = { 0 };
+ int err, i;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SP_INFO,
+ cmd_flags,
+ token);
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* retrieve response parameters */
+ rsp_params = (struct dpni_rsp_get_sp_info *)cmd.params;
+ for (i = 0; i < DPNI_MAX_SP; i++)
+ sp_info->spids[i] = le16_to_cpu(rsp_params->spids[i]);
+
+ return 0;
+}
+
/**
* dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
* @mc_io: Pointer to MC portal's I/O object
@@ -1684,6 +1770,7 @@ int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
+ * @ceetm_ch_idx: ceetm channel index
* @mode: Tx confirmation mode
*
* This function is useful only when 'DPNI_OPT_TX_CONF_DISABLED' is not
@@ -1701,6 +1788,7 @@ int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
+ uint8_t ceetm_ch_idx,
enum dpni_confirmation_mode mode)
{
struct dpni_tx_confirmation_mode *cmd_params;
@@ -1711,6 +1799,7 @@ int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
cmd_flags,
token);
cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
+ cmd_params->ceetm_ch_idx = ceetm_ch_idx;
cmd_params->confirmation_mode = mode;
/* send command to mc*/
@@ -1722,6 +1811,7 @@ int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
+ * @ceetm_ch_idx: ceetm channel index
* @mode: Tx confirmation mode
*
* Return: '0' on Success; Error code otherwise.
@@ -1729,8 +1819,10 @@ int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
+ uint8_t ceetm_ch_idx,
enum dpni_confirmation_mode *mode)
{
+ struct dpni_tx_confirmation_mode *cmd_params;
struct dpni_tx_confirmation_mode *rsp_params;
struct mc_command cmd = { 0 };
int err;
@@ -1738,6 +1830,8 @@ int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONFIRMATION_MODE,
cmd_flags,
token);
+ cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
+ cmd_params->ceetm_ch_idx = ceetm_ch_idx;
err = mc_send_command(mc_io, &cmd);
if (err)
@@ -1749,6 +1843,78 @@ int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
return 0;
}
+/**
+ * dpni_set_queue_tx_confirmation_mode() - Set Tx confirmation mode
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @ceetm_ch_idx: ceetm channel index
+ * @index: queue index
+ * @mode: Tx confirmation mode
+ *
+ * Return: '0' on Success; Error code otherwise.
+ */
+int dpni_set_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t ceetm_ch_idx, uint8_t index,
+ enum dpni_confirmation_mode mode)
+{
+ struct dpni_queue_tx_confirmation_mode *cmd_params;
+ struct mc_command cmd = { 0 };
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE_TX_CONFIRMATION_MODE,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params;
+ cmd_params->ceetm_ch_idx = ceetm_ch_idx;
+ cmd_params->index = index;
+ cmd_params->confirmation_mode = mode;
+
+ /* send command to mc*/
+ return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_queue_tx_confirmation_mode() - Get Tx confirmation mode
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @ceetm_ch_idx: ceetm channel index
+ * @index: queue index
+ * @mode: Tx confirmation mode
+ *
+ * Return: '0' on Success; Error code otherwise.
+ */
+int dpni_get_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t ceetm_ch_idx, uint8_t index,
+ enum dpni_confirmation_mode *mode)
+{
+ struct dpni_queue_tx_confirmation_mode *cmd_params;
+ struct dpni_queue_tx_confirmation_mode *rsp_params;
+ struct mc_command cmd = { 0 };
+ int err;
+
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE_TX_CONFIRMATION_MODE,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params;
+ cmd_params->ceetm_ch_idx = ceetm_ch_idx;
+ cmd_params->index = index;
+
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ rsp_params = (struct dpni_queue_tx_confirmation_mode *)cmd.params;
+ *mode = rsp_params->confirmation_mode;
+
+ return 0;
+}
+
/**
* dpni_set_qos_table() - Set QoS mapping table
* @mc_io: Pointer to MC portal's I/O object
@@ -2291,8 +2457,7 @@ int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @qtype: Type of queue - Rx, Tx and Tx confirm types are supported
- * @param: Traffic class and channel. Bits[0-7] contain traaffic class,
- * byte[8-15] contains channel id
+ * @tc_id: Traffic class selection (0-7)
* @cfg: congestion notification configuration
*
* Return: '0' on Success; error code otherwise.
@@ -3114,8 +3279,216 @@ int dpni_set_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
cmd_params = (struct dpni_cmd_set_port_cfg *)cmd.params;
cmd_params->flags = cpu_to_le32(flags);
- dpni_set_field(cmd_params->bit_params, PORT_LOOPBACK_EN,
- !!port_cfg->loopback_en);
+ dpni_set_field(cmd_params->bit_params, PORT_LOOPBACK_EN, !!port_cfg->loopback_en);
+
+ /* send command to MC */
+ return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_single_step_cfg() - return current configuration for single step PTP
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @ptp_cfg: ptp single step configuration
+ *
+ * Return: '0' on Success; Error code otherwise.
+ *
+ */
+int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ struct dpni_single_step_cfg *ptp_cfg)
+{
+ struct dpni_rsp_single_step_cfg *rsp_params;
+ struct mc_command cmd = { 0 };
+ int err;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG,
+ cmd_flags,
+ token);
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* read command response */
+ rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params;
+ ptp_cfg->offset = le16_to_cpu(rsp_params->offset);
+ ptp_cfg->en = dpni_get_field(rsp_params->flags, PTP_ENABLE);
+ ptp_cfg->ch_update = dpni_get_field(rsp_params->flags, PTP_CH_UPDATE);
+ ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay);
+ ptp_cfg->ptp_onestep_reg_base =
+ le32_to_cpu(rsp_params->ptp_onestep_reg_base);
+
+ return err;
+}
+
+/**
+ * dpni_get_port_cfg() - return configuration from physical port. The command has effect only if
+ * dpni is connected to a mac object
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @port_cfg: Configuration data
+ * The command can be called only when dpni is connected to a dpmac object.
+ * If the dpni is unconnected or the endpoint is not a dpni it will return error;
+ */
+int dpni_get_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ struct dpni_port_cfg *port_cfg)
+{
+ struct dpni_rsp_get_port_cfg *rsp_params;
+ struct mc_command cmd = { 0 };
+ int err;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_CFG,
+ cmd_flags, token);
+
+ /* send command to MC */
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ /* read command response */
+ rsp_params = (struct dpni_rsp_get_port_cfg *)cmd.params;
+ port_cfg->loopback_en = dpni_get_field(rsp_params->bit_params, PORT_LOOPBACK_EN);
+
+ return 0;
+}
+
+/**
+ * dpni_set_single_step_cfg() - enable/disable and configure single step PTP
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @ptp_cfg: ptp single step configuration
+ *
+ * Return: '0' on Success; Error code otherwise.
+ *
+ * The function has effect only when dpni object is connected to a dpmac object. If the
+ * dpni is not connected to a dpmac the configuration will be stored inside and applied
+ * when connection is made.
+ */
+int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ struct dpni_single_step_cfg *ptp_cfg)
+{
+ struct dpni_cmd_single_step_cfg *cmd_params;
+ struct mc_command cmd = { 0 };
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG,
+ cmd_flags,
+ token);
+ cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params;
+ cmd_params->offset = cpu_to_le16(ptp_cfg->offset);
+ cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay);
+ dpni_set_field(cmd_params->flags, PTP_ENABLE, !!ptp_cfg->en);
+ dpni_set_field(cmd_params->flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update);
+
+ /* send command to mc*/
+ return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_dump_table() - Dump the content of table_type table into memory.
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPSW object
+ * @table_type: The type of the table to dump
+ * @table_index: The index of the table to dump in case of more than one table
+ * @iova_addr: The snapshot will be stored in this variable as an header of struct dump_table_header
+ * followed by an array of struct dump_table_entry
+ * @iova_size: Memory size allocated for iova_addr
+ * @num_entries: Number of entries written in iova_addr
+ *
+ * Return: Completion status. '0' on Success; Error code otherwise.
+ *
+ * The memory allocated at iova_addr must be zeroed before command execution.
+ * If the table content exceeds the memory size provided the dump will be truncated.
+ */
+int dpni_dump_table(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint16_t table_type,
+ uint16_t table_index,
+ uint64_t iova_addr,
+ uint32_t iova_size,
+ uint16_t *num_entries)
+{
+ struct mc_command cmd = { 0 };
+ int err;
+ struct dpni_cmd_dump_table *cmd_params;
+ struct dpni_rsp_dump_table *rsp_params;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_DUMP_TABLE, cmd_flags, token);
+ cmd_params = (struct dpni_cmd_dump_table *)cmd.params;
+ cmd_params->table_type = cpu_to_le16(table_type);
+ cmd_params->table_index = cpu_to_le16(table_index);
+ cmd_params->iova_addr = cpu_to_le64(iova_addr);
+ cmd_params->iova_size = cpu_to_le32(iova_size);
+
+ /* send command to mc*/
+ err = mc_send_command(mc_io, &cmd);
+ if (err)
+ return err;
+
+ rsp_params = (struct dpni_rsp_dump_table *)cmd.params;
+ *num_entries = le16_to_cpu(rsp_params->num_entries);
+
+ return 0;
+}
+
+/* Sets up a Soft Parser Profile on this DPNI
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @sp_profile: Soft Parser Profile name (must a valid name for a defined profile)
+ * Maximum allowed length for this string is 8 characters long
+ * If this parameter is empty string (all zeros)
+ * then the Default SP Profile is set on this dpni
+ * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR)
+ */
+int dpni_set_sp_profile(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint8_t sp_profile[], uint8_t type)
+{
+ struct dpni_cmd_set_sp_profile *cmd_params;
+ struct mc_command cmd = { 0 };
+ int i;
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SP_PROFILE,
+ cmd_flags, token);
+
+ cmd_params = (struct dpni_cmd_set_sp_profile *)cmd.params;
+ for (i = 0; i < MAX_SP_PROFILE_ID_SIZE && sp_profile[i]; i++)
+ cmd_params->sp_profile[i] = sp_profile[i];
+ cmd_params->type = type;
+
+ /* send command to MC */
+ return mc_send_command(mc_io, &cmd);
+}
+
+/* Enable/Disable Soft Parser on this DPNI
+ * @mc_io: Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token: Token of DPNI object
+ * @type: one of the SP Profile types defined above: Ingress or Egress (or both using bitwise OR)
+ * @en: 1 to enable or 0 to disable
+ */
+int dpni_sp_enable(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint8_t type, uint8_t en)
+{
+ struct dpni_cmd_sp_enable *cmd_params;
+ struct mc_command cmd = { 0 };
+
+ /* prepare command */
+ cmd.header = mc_encode_cmd_header(DPNI_CMDID_SP_ENABLE,
+ cmd_flags, token);
+
+ cmd_params = (struct dpni_cmd_sp_enable *)cmd.params;
+ cmd_params->type = type;
+ cmd_params->en = en;
/* send command to MC */
return mc_send_command(mc_io, &cmd);
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2018-2022 NXP
+ * Copyright 2018-2023 NXP
*
*/
#ifndef __FSL_DPDMUX_H
@@ -154,6 +154,10 @@ int dpdmux_reset(struct fsl_mc_io *mc_io,
*Setting 1 DPDMUX_RESET will not reset multicast rules
*/
#define DPDMUX_SKIP_MULTICAST_RULES 0x04
+/**
+ *Setting 4 DPDMUX_RESET will not reset default interface
+ */
+#define DPDMUX_SKIP_RESET_DEFAULT_INTERFACE 0x08
int dpdmux_set_resetable(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
@@ -464,10 +468,50 @@ int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
uint16_t *major_ver,
uint16_t *minor_ver);
+enum dpdmux_congestion_unit {
+ DPDMUX_TAIDLROP_DROP_UNIT_BYTE = 0,
+ DPDMUX_TAILDROP_DROP_UNIT_FRAMES,
+ DPDMUX_TAILDROP_DROP_UNIT_BUFFERS
+};
+
/**
- * Discard bit. This bit must be used together with other bits in
- * DPDMUX_ERROR_ACTION_CONTINUE to disable discarding of frames containing
- * errors
+ * struct dpdmux_taildrop_cfg - interface taildrop configuration
+ * @enable - enable (1 ) or disable (0) taildrop
+ * @units - taildrop units
+ * @threshold - taildtop threshold
+ */
+struct dpdmux_taildrop_cfg {
+ char enable;
+ enum dpdmux_congestion_unit units;
+ uint32_t threshold;
+};
+
+int dpdmux_if_set_taildrop(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t if_id, struct dpdmux_taildrop_cfg *cfg);
+
+int dpdmux_if_get_taildrop(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t if_id, struct dpdmux_taildrop_cfg *cfg);
+
+#define DPDMUX_MAX_KEY_SIZE 56
+
+enum dpdmux_table_type {
+ DPDMUX_DMAT_TABLE = 1,
+ DPDMUX_MISS_TABLE = 2,
+ DPDMUX_PRUNE_TABLE = 3,
+};
+
+int dpdmux_dump_table(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint16_t table_type,
+ uint16_t table_index,
+ uint64_t iova_addr,
+ uint32_t iova_size,
+ uint16_t *num_entries);
+
+/**
+ * Discard bit. This bit must be used together with other bits in DPDMUX_ERROR_ACTION_CONTINUE
+ * to disable discarding of frames containing errors
*/
#define DPDMUX_ERROR_DISC 0x80000000
/**
@@ -583,4 +627,19 @@ struct dpdmux_error_cfg {
int dpdmux_if_set_errors_behavior(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
uint16_t token, uint16_t if_id, struct dpdmux_error_cfg *cfg);
+/**
+ * SP Profile on Ingress DPDMUX
+ */
+#define DPDMUX_SP_PROFILE_INGRESS 0x1
+/**
+ * SP Profile on Egress DPDMUX
+ */
+#define DPDMUX_SP_PROFILE_EGRESS 0x2
+
+int dpdmux_set_sp_profile(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint8_t sp_profile[], uint8_t type);
+
+int dpdmux_sp_enable(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t if_id, uint8_t type, uint8_t en);
+
#endif /* __FSL_DPDMUX_H */
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2018-2021 NXP
+ * Copyright 2018-2023 NXP
*
*/
#ifndef _FSL_DPDMUX_CMD_H
@@ -9,7 +9,7 @@
/* DPDMUX Version */
#define DPDMUX_VER_MAJOR 6
-#define DPDMUX_VER_MINOR 9
+#define DPDMUX_VER_MINOR 10
#define DPDMUX_CMD_BASE_VERSION 1
#define DPDMUX_CMD_VERSION_2 2
@@ -63,8 +63,17 @@
#define DPDMUX_CMDID_SET_RESETABLE DPDMUX_CMD(0x0ba)
#define DPDMUX_CMDID_GET_RESETABLE DPDMUX_CMD(0x0bb)
+
+#define DPDMUX_CMDID_IF_SET_TAILDROP DPDMUX_CMD(0x0bc)
+#define DPDMUX_CMDID_IF_GET_TAILDROP DPDMUX_CMD(0x0bd)
+
+#define DPDMUX_CMDID_DUMP_TABLE DPDMUX_CMD(0x0be)
+
#define DPDMUX_CMDID_SET_ERRORS_BEHAVIOR DPDMUX_CMD(0x0bf)
+#define DPDMUX_CMDID_SET_SP_PROFILE DPDMUX_CMD(0x0c0)
+#define DPDMUX_CMDID_SP_ENABLE DPDMUX_CMD(0x0c1)
+
#define DPDMUX_MASK(field) \
GENMASK(DPDMUX_##field##_SHIFT + DPDMUX_##field##_SIZE - 1, \
DPDMUX_##field##_SHIFT)
@@ -241,7 +250,7 @@ struct dpdmux_cmd_remove_custom_cls_entry {
};
#define DPDMUX_SKIP_RESET_FLAGS_SHIFT 0
-#define DPDMUX_SKIP_RESET_FLAGS_SIZE 3
+#define DPDMUX_SKIP_RESET_FLAGS_SIZE 4
struct dpdmux_cmd_set_skip_reset_flags {
uint8_t skip_reset_flags;
@@ -251,6 +260,61 @@ struct dpdmux_rsp_get_skip_reset_flags {
uint8_t skip_reset_flags;
};
+struct dpdmux_cmd_set_taildrop {
+ uint32_t pad1;
+ uint16_t if_id;
+ uint16_t pad2;
+ uint16_t oal_en;
+ uint8_t units;
+ uint8_t pad3;
+ uint32_t threshold;
+};
+
+struct dpdmux_cmd_get_taildrop {
+ uint32_t pad1;
+ uint16_t if_id;
+};
+
+struct dpdmux_rsp_get_taildrop {
+ uint16_t pad1;
+ uint16_t pad2;
+ uint16_t if_id;
+ uint16_t pad3;
+ uint16_t oal_en;
+ uint8_t units;
+ uint8_t pad4;
+ uint32_t threshold;
+};
+
+struct dpdmux_cmd_dump_table {
+ uint16_t table_type;
+ uint16_t table_index;
+ uint32_t pad0;
+ uint64_t iova_addr;
+ uint32_t iova_size;
+};
+
+struct dpdmux_rsp_dump_table {
+ uint16_t num_entries;
+};
+
+struct dpdmux_dump_table_header {
+ uint16_t table_type;
+ uint16_t table_num_entries;
+ uint16_t table_max_entries;
+ uint8_t default_action;
+ uint8_t match_type;
+ uint8_t reserved[24];
+};
+
+struct dpdmux_dump_table_entry {
+ uint8_t key[DPDMUX_MAX_KEY_SIZE];
+ uint8_t mask[DPDMUX_MAX_KEY_SIZE];
+ uint8_t key_action;
+ uint16_t result[3];
+ uint8_t reserved[21];
+};
+
#define DPDMUX_ERROR_ACTION_SHIFT 0
#define DPDMUX_ERROR_ACTION_SIZE 4
@@ -260,5 +324,18 @@ struct dpdmux_cmd_set_errors_behavior {
uint16_t if_id;
};
+#define MAX_SP_PROFILE_ID_SIZE 8
+
+struct dpdmux_cmd_set_sp_profile {
+ uint8_t sp_profile[MAX_SP_PROFILE_ID_SIZE];
+ uint8_t type;
+};
+
+struct dpdmux_cmd_sp_enable {
+ uint16_t if_id;
+ uint8_t type;
+ uint8_t en;
+};
+
#pragma pack(pop)
#endif /* _FSL_DPDMUX_CMD_H */
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
* Copyright 2013-2015 Freescale Semiconductor Inc.
- * Copyright 2016-2021 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef __FSL_DPKG_H_
@@ -180,7 +180,8 @@ struct dpni_ext_set_rx_tc_dist {
struct dpni_dist_extract extracts[DPKG_MAX_NUM_OF_EXTRACTS];
};
-int dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
- uint8_t *key_cfg_buf);
+int
+dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
+ void *key_cfg_buf);
#endif /* __FSL_DPKG_H_ */
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2021 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef __FSL_DPNI_H
@@ -116,6 +116,11 @@ struct fsl_mc_io;
* Flow steering table is shared between all traffic classes
*/
#define DPNI_OPT_SHARED_FS 0x001000
+/*
+ * Fq frame data, context and annotations stashing disable.
+ * The stashing is enabled by default.
+ */
+#define DPNI_OPT_STASHING_DIS 0x002000
/**
* Software sequence maximum layout size
*/
@@ -147,6 +152,7 @@ int dpni_close(struct fsl_mc_io *mc_io,
* DPNI_OPT_HAS_KEY_MASKING
* DPNI_OPT_NO_FS
* DPNI_OPT_SINGLE_SENDER
+ * DPNI_OPT_STASHING_DIS
* @fs_entries: Number of entries in the flow steering table.
* This table is used to select the ingress queue for
* ingress traffic, targeting a GPP core or another.
@@ -335,6 +341,7 @@ int dpni_clear_irq_status(struct fsl_mc_io *mc_io,
* DPNI_OPT_SHARED_CONGESTION
* DPNI_OPT_HAS_KEY_MASKING
* DPNI_OPT_NO_FS
+ * DPNI_OPT_STASHING_DIS
* @num_queues: Number of Tx and Rx queues used for traffic distribution.
* @num_rx_tcs: Number of RX traffic classes (TCs), reserved for the DPNI.
* @num_tx_tcs: Number of TX traffic classes (TCs), reserved for the DPNI.
@@ -394,7 +401,7 @@ int dpni_get_attributes(struct fsl_mc_io *mc_io,
* error queue. To be used in dpni_set_errors_behavior() only if error_action
* parameter is set to DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE.
*/
-#define DPNI_ERROR_DISC 0x80000000
+#define DPNI_ERROR_DISC 0x80000000
/**
* Extract out of frame header error
@@ -576,6 +583,8 @@ enum dpni_offload {
DPNI_OFF_TX_L3_CSUM,
DPNI_OFF_TX_L4_CSUM,
DPNI_FLCTYPE_HASH,
+ DPNI_HEADER_STASHING,
+ DPNI_PAYLOAD_STASHING,
};
int dpni_set_offload(struct fsl_mc_io *mc_io,
@@ -596,6 +605,26 @@ int dpni_get_qdid(struct fsl_mc_io *mc_io,
enum dpni_queue_type qtype,
uint16_t *qdid);
+int dpni_get_qdid_ex(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ enum dpni_queue_type qtype,
+ uint16_t *qdid);
+
+/**
+ * struct dpni_sp_info - Structure representing DPNI storage-profile information
+ * (relevant only for DPNI owned by AIOP)
+ * @spids: array of storage-profiles
+ */
+struct dpni_sp_info {
+ uint16_t spids[DPNI_MAX_SP];
+};
+
+int dpni_get_sp_info(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ struct dpni_sp_info *sp_info);
+
int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
@@ -1443,11 +1472,25 @@ enum dpni_confirmation_mode {
int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
+ uint8_t ceetm_ch_idx,
enum dpni_confirmation_mode mode);
int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
+ uint8_t ceetm_ch_idx,
+ enum dpni_confirmation_mode *mode);
+
+int dpni_set_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t ceetm_ch_idx, uint8_t index,
+ enum dpni_confirmation_mode mode);
+
+int dpni_get_queue_tx_confirmation_mode(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t ceetm_ch_idx, uint8_t index,
enum dpni_confirmation_mode *mode);
/**
@@ -1841,6 +1884,60 @@ void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
const uint8_t *sw_sequence_layout_buf);
/**
+ * When used for queue_idx in function dpni_set_rx_dist_default_queue will signal to dpni
+ * to drop all unclassified frames
+ */
+#define DPNI_FS_MISS_DROP ((uint16_t)-1)
+
+/**
+ * struct dpni_rx_dist_cfg - distribution configuration
+ * @dist_size: distribution size; supported values: 1,2,3,4,6,7,8,
+ * 12,14,16,24,28,32,48,56,64,96,112,128,192,224,256,384,448,
+ * 512,768,896,1024
+ * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
+ * the extractions to be used for the distribution key by calling
+ * dpkg_prepare_key_cfg() relevant only when enable!=0 otherwise it can be '0'
+ * @enable: enable/disable the distribution.
+ * @tc: TC id for which distribution is set
+ * @fs_miss_flow_id: when packet misses all rules from flow steering table and hash is
+ * disabled it will be put into this queue id; use DPNI_FS_MISS_DROP to drop
+ * frames. The value of this field is used only when flow steering distribution
+ * is enabled and hash distribution is disabled
+ */
+struct dpni_rx_dist_cfg {
+ uint16_t dist_size;
+ uint64_t key_cfg_iova;
+ uint8_t enable;
+ uint8_t tc;
+ uint16_t fs_miss_flow_id;
+};
+
+int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ const struct dpni_rx_dist_cfg *cfg);
+
+int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ const struct dpni_rx_dist_cfg *cfg);
+
+int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t tpid);
+
+int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint16_t tpid);
+
+/**
+ * struct dpni_custom_tpid_cfg - custom TPID configuration. Contains custom TPID values
+ * used in current dpni object to detect 802.1q frames.
+ * @tpid1: first tag. Not used if zero.
+ * @tpid2: second tag. Not used if zero.
+ */
+struct dpni_custom_tpid_cfg {
+ uint16_t tpid1;
+ uint16_t tpid2;
+};
+
+int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ struct dpni_custom_tpid_cfg *tpid);
+/*
* struct dpni_ptp_cfg - configure single step PTP (IEEE 1588)
* @en: enable single step PTP. When enabled the PTPv1 functionality will
* not work. If the field is zero, offset and ch_update parameters
@@ -1858,6 +1955,7 @@ struct dpni_single_step_cfg {
uint8_t ch_update;
uint16_t offset;
uint32_t peer_delay;
+ uint32_t ptp_onestep_reg_base;
};
int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
@@ -1885,61 +1983,35 @@ int dpni_set_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
int dpni_get_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
uint16_t token, struct dpni_port_cfg *port_cfg);
-/**
- * When used for queue_idx in function dpni_set_rx_dist_default_queue will
- * signal to dpni to drop all unclassified frames
- */
-#define DPNI_FS_MISS_DROP ((uint16_t)-1)
-
-/**
- * struct dpni_rx_dist_cfg - distribution configuration
- * @dist_size: distribution size; supported values: 1,2,3,4,6,7,8,
- * 12,14,16,24,28,32,48,56,64,96,112,128,192,224,256,384,448,
- * 512,768,896,1024
- * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
- * the extractions to be used for the distribution key by calling
- * dpkg_prepare_key_cfg() relevant only when enable!=0 otherwise
- * it can be '0'
- * @enable: enable/disable the distribution.
- * @tc: TC id for which distribution is set
- * @fs_miss_flow_id: when packet misses all rules from flow steering table and
- * hash is disabled it will be put into this queue id; use
- * DPNI_FS_MISS_DROP to drop frames. The value of this field is
- * used only when flow steering distribution is enabled and hash
- * distribution is disabled
- */
-struct dpni_rx_dist_cfg {
- uint16_t dist_size;
- uint64_t key_cfg_iova;
- uint8_t enable;
- uint8_t tc;
- uint16_t fs_miss_flow_id;
+enum dpni_table_type {
+ DPNI_FS_TABLE = 1,
+ DPNI_MAC_TABLE = 2,
+ DPNI_QOS_TABLE = 3,
+ DPNI_VLAN_TABLE = 4,
};
-int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
- uint16_t token, const struct dpni_rx_dist_cfg *cfg);
-
-int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
- uint16_t token, const struct dpni_rx_dist_cfg *cfg);
-
-int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
- uint16_t token, uint16_t tpid);
-
-int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
- uint16_t token, uint16_t tpid);
+int dpni_dump_table(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint16_t table_type,
+ uint16_t table_index,
+ uint64_t iova_addr,
+ uint32_t iova_size,
+ uint16_t *num_entries);
/**
- * struct dpni_custom_tpid_cfg - custom TPID configuration. Contains custom TPID
- * values used in current dpni object to detect 802.1q frames.
- * @tpid1: first tag. Not used if zero.
- * @tpid2: second tag. Not used if zero.
+ * SP Profile on Ingress DPNI
*/
-struct dpni_custom_tpid_cfg {
- uint16_t tpid1;
- uint16_t tpid2;
-};
+#define DPNI_SP_PROFILE_INGRESS 0x1
+/**
+ * SP Profile on Egress DPNI
+ */
+#define DPNI_SP_PROFILE_EGRESS 0x2
+
+int dpni_set_sp_profile(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint8_t sp_profile[], uint8_t type);
-int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
- uint16_t token, struct dpni_custom_tpid_cfg *tpid);
+int dpni_sp_enable(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token,
+ uint8_t type, uint8_t en);
#endif /* __FSL_DPNI_H */
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2022 NXP
+ * Copyright 2016-2023 NXP
*
*/
#ifndef _FSL_DPNI_CMD_H
@@ -9,7 +9,7 @@
/* DPNI Version */
#define DPNI_VER_MAJOR 8
-#define DPNI_VER_MINOR 2
+#define DPNI_VER_MINOR 4
#define DPNI_CMD_BASE_VERSION 1
#define DPNI_CMD_VERSION_2 2
@@ -108,8 +108,8 @@
#define DPNI_CMDID_GET_EARLY_DROP DPNI_CMD_V3(0x26A)
#define DPNI_CMDID_GET_OFFLOAD DPNI_CMD_V2(0x26B)
#define DPNI_CMDID_SET_OFFLOAD DPNI_CMD_V2(0x26C)
-#define DPNI_CMDID_SET_TX_CONFIRMATION_MODE DPNI_CMD(0x266)
-#define DPNI_CMDID_GET_TX_CONFIRMATION_MODE DPNI_CMD(0x26D)
+#define DPNI_CMDID_SET_TX_CONFIRMATION_MODE DPNI_CMD_V2(0x266)
+#define DPNI_CMDID_GET_TX_CONFIRMATION_MODE DPNI_CMD_V2(0x26D)
#define DPNI_CMDID_SET_OPR DPNI_CMD_V2(0x26e)
#define DPNI_CMDID_GET_OPR DPNI_CMD_V2(0x26f)
#define DPNI_CMDID_LOAD_SW_SEQUENCE DPNI_CMD(0x270)
@@ -121,7 +121,16 @@
#define DPNI_CMDID_REMOVE_CUSTOM_TPID DPNI_CMD(0x276)
#define DPNI_CMDID_GET_CUSTOM_TPID DPNI_CMD(0x277)
#define DPNI_CMDID_GET_LINK_CFG DPNI_CMD(0x278)
+#define DPNI_CMDID_SET_SINGLE_STEP_CFG DPNI_CMD(0x279)
+#define DPNI_CMDID_GET_SINGLE_STEP_CFG DPNI_CMD_V2(0x27a)
#define DPNI_CMDID_SET_PORT_CFG DPNI_CMD(0x27B)
+#define DPNI_CMDID_GET_PORT_CFG DPNI_CMD(0x27C)
+#define DPNI_CMDID_DUMP_TABLE DPNI_CMD(0x27D)
+#define DPNI_CMDID_SET_SP_PROFILE DPNI_CMD(0x27E)
+#define DPNI_CMDID_GET_QDID_EX DPNI_CMD(0x27F)
+#define DPNI_CMDID_SP_ENABLE DPNI_CMD(0x280)
+#define DPNI_CMDID_SET_QUEUE_TX_CONFIRMATION_MODE DPNI_CMD(0x281)
+#define DPNI_CMDID_GET_QUEUE_TX_CONFIRMATION_MODE DPNI_CMD(0x282)
/* Macros for accessing command fields smaller than 1byte */
#define DPNI_MASK(field) \
@@ -329,6 +338,10 @@ struct dpni_rsp_get_qdid {
uint16_t qdid;
};
+struct dpni_rsp_get_qdid_ex {
+ uint16_t qdid[16];
+};
+
struct dpni_rsp_get_sp_info {
uint16_t spids[2];
};
@@ -748,7 +761,16 @@ struct dpni_cmd_set_taildrop {
};
struct dpni_tx_confirmation_mode {
- uint32_t pad;
+ uint8_t ceetm_ch_idx;
+ uint8_t pad1;
+ uint16_t pad2;
+ uint8_t confirmation_mode;
+};
+
+struct dpni_queue_tx_confirmation_mode {
+ uint8_t ceetm_ch_idx;
+ uint8_t index;
+ uint16_t pad;
uint8_t confirmation_mode;
};
@@ -894,6 +916,42 @@ struct dpni_sw_sequence_layout_entry {
uint16_t pad;
};
+#define DPNI_RX_FS_DIST_ENABLE_SHIFT 0
+#define DPNI_RX_FS_DIST_ENABLE_SIZE 1
+struct dpni_cmd_set_rx_fs_dist {
+ uint16_t dist_size;
+ uint8_t enable;
+ uint8_t tc;
+ uint16_t miss_flow_id;
+ uint16_t pad1;
+ uint64_t key_cfg_iova;
+};
+
+#define DPNI_RX_HASH_DIST_ENABLE_SHIFT 0
+#define DPNI_RX_HASH_DIST_ENABLE_SIZE 1
+struct dpni_cmd_set_rx_hash_dist {
+ uint16_t dist_size;
+ uint8_t enable;
+ uint8_t tc_id;
+ uint32_t pad;
+ uint64_t key_cfg_iova;
+};
+
+struct dpni_cmd_add_custom_tpid {
+ uint16_t pad;
+ uint16_t tpid;
+};
+
+struct dpni_cmd_remove_custom_tpid {
+ uint16_t pad;
+ uint16_t tpid;
+};
+
+struct dpni_rsp_get_custom_tpid {
+ uint16_t tpid1;
+ uint16_t tpid2;
+};
+
#define DPNI_PTP_ENABLE_SHIFT 0
#define DPNI_PTP_ENABLE_SIZE 1
#define DPNI_PTP_CH_UPDATE_SHIFT 1
@@ -925,40 +983,45 @@ struct dpni_rsp_get_port_cfg {
uint32_t bit_params;
};
-#define DPNI_RX_FS_DIST_ENABLE_SHIFT 0
-#define DPNI_RX_FS_DIST_ENABLE_SIZE 1
-struct dpni_cmd_set_rx_fs_dist {
- uint16_t dist_size;
- uint8_t enable;
- uint8_t tc;
- uint16_t miss_flow_id;
- uint16_t pad1;
- uint64_t key_cfg_iova;
+struct dpni_cmd_dump_table {
+ uint16_t table_type;
+ uint16_t table_index;
+ uint32_t pad0;
+ uint64_t iova_addr;
+ uint32_t iova_size;
};
-#define DPNI_RX_HASH_DIST_ENABLE_SHIFT 0
-#define DPNI_RX_HASH_DIST_ENABLE_SIZE 1
-struct dpni_cmd_set_rx_hash_dist {
- uint16_t dist_size;
- uint8_t enable;
- uint8_t tc_id;
- uint32_t pad;
- uint64_t key_cfg_iova;
+struct dpni_rsp_dump_table {
+ uint16_t num_entries;
};
-struct dpni_cmd_add_custom_tpid {
- uint16_t pad;
- uint16_t tpid;
+struct dump_table_header {
+ uint16_t table_type;
+ uint16_t table_num_entries;
+ uint16_t table_max_entries;
+ uint8_t default_action;
+ uint8_t match_type;
+ uint8_t reserved[24];
};
-struct dpni_cmd_remove_custom_tpid {
- uint16_t pad;
- uint16_t tpid;
+struct dump_table_entry {
+ uint8_t key[DPNI_MAX_KEY_SIZE];
+ uint8_t mask[DPNI_MAX_KEY_SIZE];
+ uint8_t key_action;
+ uint16_t result[3];
+ uint8_t reserved[21];
};
-struct dpni_rsp_get_custom_tpid {
- uint16_t tpid1;
- uint16_t tpid2;
+#define MAX_SP_PROFILE_ID_SIZE 8
+
+struct dpni_cmd_set_sp_profile {
+ uint8_t sp_profile[MAX_SP_PROFILE_ID_SIZE];
+ uint8_t type;
+};
+
+struct dpni_cmd_sp_enable {
+ uint8_t type;
+ uint8_t en;
};
#pragma pack(pop)