Hi Vkoul, >+int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ const struct dpdmai_rx_queue_cfg *cfg) { >+ struct fsl_mc_command cmd = { 0 }; >+ struct dpdmai_cmd_queue *cmd_params; >+ >+ /* prepare command */ >+ cmd.header = >mc_encode_cmd_header(DPDMAI_CMDID_SET_RX_QUEUE, >+ cmd_flags, >+ token); >+ >+ cmd_params = (struct dpdmai_cmd_queue *)cmd.params; The MC(Management Complex) has may objects like DPDMAI, DPNI, DPIO, DPCON etc. They have the same size command structure defined by struct fsl_mc_command (include/linux/fsl/mc.h): struct fsl_mc_command { __le64 header; __le64 params[7]; }; But different object and different operation(open , close, enable etc ) of object with different command params, when we used DPDMAI, the cmd_params should use cast to fit it. This makes it easy to program. >+ cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); >+ cmd_params->priority = cfg->dest_cfg.priority; >+ cmd_params->queue = priority; >+ cmd_params->dest_type = cfg->dest_cfg.dest_type; >+ cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); >+ cmd_params->options = cpu_to_le32(cfg->options); >+ >+ /* send command to mc*/ >+ return mc_send_command(mc_io, &cmd); >+} Best Regards, Peng >-----Original Message----- >From: Peng Ma <peng.ma@xxxxxxx> >Sent: 2019年6月13日 18:14 >To: vkoul@xxxxxxxxxx; dan.j.williams@xxxxxxxxx; Leo Li <leoyang.li@xxxxxxx> >Cc: linux-kernel@xxxxxxxxxxxxxxx; dmaengine@xxxxxxxxxxxxxxx; Peng Ma ><peng.ma@xxxxxxx> >Subject: [V4 1/2] dmaengine: fsl-dpaa2-qdma: Add the DPDMAI(Data Path >DMA Interface) support > >The MC(Management Complex) exports the DPDMAI(Data Path DMA Interface) >object as an interface to operate the DPAA2(Data Path Acceleration >Architecture 2) qDMA Engine. The DPDMAI enables sending frame-based >requests to qDMA and receiving back confirmation response on transaction >completion, utilizing the DPAA2 QBMan(Queue Manager and Buffer Manager >hardware) infrastructure. DPDMAI object provides up to two priorities for >processing qDMA requests. >The following list summarizes the DPDMAI main features and capabilities: > 1. Supports up to two scheduling priorities for processing > service requests. > - Each DPDMAI transmit queue is mapped to one of two service > priorities, allowing further prioritization in hardware between > requests from different DPDMAI objects. > 2. Supports up to two receive queues for incoming transaction > completion confirmations. > - Each DPDMAI receive queue is mapped to one of two receive > priorities, allowing further prioritization between other > interfaces when associating the DPDMAI receive queues to DPIO > or DPCON(Data Path Concentrator) objects. > 3. Supports different scheduling options for processing received > packets: > - Queues can be configured either in 'parked' mode (default), > oattached to a DPIO object, or attached to DPCON object. > 4. Allows interaction with one or more DPIO objects for > dequeueing/enqueueing frame descriptors(FD) and for > acquiring/releasing buffers. > 5. Supports enable, disable, and reset operations. > >Add dpdmai to support some platforms with dpaa2 qdma engine. > >Signed-off-by: Peng Ma <peng.ma@xxxxxxx> >--- >changed for v4: > - Delete dpdmai_cmd.h. > - Remove some useless functions. > - Clean up the format. > - Update Copyright. > > drivers/dma/fsl-dpaa2-qdma/dpdmai.c | 275 >++++++++++++++++++++++++++++++ >drivers/dma/fsl-dpaa2-qdma/dpdmai.h | 318 >+++++++++++++++++++++++++++++++++++ > 2 files changed, 593 insertions(+), 0 deletions(-) create mode 100644 >drivers/dma/fsl-dpaa2-qdma/dpdmai.c > create mode 100644 drivers/dma/fsl-dpaa2-qdma/dpdmai.h > >diff --git a/drivers/dma/fsl-dpaa2-qdma/dpdmai.c >b/drivers/dma/fsl-dpaa2-qdma/dpdmai.c >new file mode 100644 >index 0000000..4dba154 >--- /dev/null >+++ b/drivers/dma/fsl-dpaa2-qdma/dpdmai.c >@@ -0,0 +1,275 @@ >+// SPDX-License-Identifier: GPL-2.0 >+// Copyright 2019 NXP >+ >+#include <linux/types.h> >+#include <linux/io.h> >+#include <linux/fsl/mc.h> >+#include "dpdmai.h" >+ >+struct dpdmai_cmd_open { >+ __le32 dpdmai_id; >+}; >+ >+struct dpdmai_rsp_get_attributes { >+ __le32 id; >+ u8 num_of_priorities; >+ u8 pad0[3]; >+ __le16 major; >+ __le16 minor; >+}; >+ >+struct dpdmai_cmd_queue { >+ __le32 dest_id; >+ u8 priority; >+ u8 queue; >+ u8 dest_type; >+ u8 pad; >+ __le64 user_ctx; >+ union { >+ __le32 options; >+ __le32 fqid; >+ }; >+}; >+ >+struct dpdmai_rsp_get_tx_queue { >+ __le64 pad; >+ __le32 fqid; >+}; >+ >+#define MC_CMD_OP(_cmd, _param, _offset, _width, _type, _arg) \ >+ ((_cmd).params[_param] |= mc_enc((_offset), (_width), _arg)) >+ >+#define MC_CMD_HDR_READ_TOKEN(_hdr) \ >+ ((u16)mc_dec((_hdr), MC_CMD_HDR_TOKEN_O, >MC_CMD_HDR_TOKEN_S)) >+ >+/* cmd, param, offset, width, type, arg_name */ #define >+DPDMAI_CMD_CREATE(_cmd, _cfg) \ do { \ >+ typeof(_cmd) (cmd) = (_cmd); \ >+ typeof(_cfg) (cfg) = (_cfg); \ >+ MC_CMD_OP(cmd, 0, 8, 8, u8, (cfg)->priorities[0]);\ >+ MC_CMD_OP(cmd, 0, 16, 8, u8, (cfg)->priorities[1]);\ } while (0) >+ >+static inline u64 mc_enc(int lsoffset, int width, u64 val) { >+ return (u64)(((u64)val & MAKE_UMASK64(width)) << lsoffset); } >+ >+static inline u64 mc_dec(u64 val, int lsoffset, int width) { >+ return (u64)((val >> lsoffset) & MAKE_UMASK64(width)); } >+ >+int dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ int dpdmai_id, u16 *token) >+{ >+ struct fsl_mc_command cmd = { 0 }; >+ struct dpdmai_cmd_open *cmd_params; >+ int err; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_OPEN, >+ cmd_flags, 0); >+ >+ cmd_params = (struct dpdmai_cmd_open *)cmd.params; >+ cmd_params->dpdmai_id = cpu_to_le32(dpdmai_id); >+ >+ /* send command to mc*/ >+ err = mc_send_command(mc_io, &cmd); >+ if (err) >+ return err; >+ >+ /* retrieve response parameters */ >+ *token = mc_cmd_hdr_read_token(&cmd); >+ return 0; >+} >+ >+int dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) { >+ struct fsl_mc_command cmd = { 0 }; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CLOSE, >+ cmd_flags, token); >+ >+ /* send command to mc*/ >+ return mc_send_command(mc_io, &cmd); >+} >+ >+int dpdmai_create(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ const struct dpdmai_cfg *cfg, u16 *token) { >+ struct fsl_mc_command cmd = { 0 }; >+ int err; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CREATE, >+ cmd_flags, >+ 0); >+ DPDMAI_CMD_CREATE(cmd, cfg); >+ >+ /* send command to mc*/ >+ err = mc_send_command(mc_io, &cmd); >+ if (err) >+ return err; >+ >+ /* retrieve response parameters */ >+ *token = MC_CMD_HDR_READ_TOKEN(cmd.header); >+ >+ return 0; >+} >+ >+int dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token) >+{ >+ struct fsl_mc_command cmd = { 0 }; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_ENABLE, >+ cmd_flags, >+ token); >+ >+ /* send command to mc*/ >+ return mc_send_command(mc_io, &cmd); >+} >+ >+int dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token) >+{ >+ struct fsl_mc_command cmd = { 0 }; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DISABLE, >+ cmd_flags, >+ token); >+ >+ /* send command to mc*/ >+ return mc_send_command(mc_io, &cmd); >+} >+ >+int dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token) >+{ >+ struct fsl_mc_command cmd = { 0 }; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_RESET, >+ cmd_flags, >+ token); >+ >+ /* send command to mc*/ >+ return mc_send_command(mc_io, &cmd); >+} >+ >+int dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, struct dpdmai_attr *attr) { >+ struct fsl_mc_command cmd = { 0 }; >+ int err; >+ struct dpdmai_rsp_get_attributes *rsp_params; >+ >+ /* prepare command */ >+ cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_ATTR, >+ cmd_flags, >+ token); >+ >+ /* send command to mc*/ >+ err = mc_send_command(mc_io, &cmd); >+ if (err) >+ return err; >+ >+ /* retrieve response parameters */ >+ rsp_params = (struct dpdmai_rsp_get_attributes *)cmd.params; >+ attr->id = le32_to_cpu(rsp_params->id); >+ attr->version.major = le16_to_cpu(rsp_params->major); >+ attr->version.minor = le16_to_cpu(rsp_params->minor); >+ attr->num_of_priorities = rsp_params->num_of_priorities; >+ >+ return 0; >+} >+ >+int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ const struct dpdmai_rx_queue_cfg *cfg) { >+ struct fsl_mc_command cmd = { 0 }; >+ struct dpdmai_cmd_queue *cmd_params; >+ >+ /* prepare command */ >+ cmd.header = >mc_encode_cmd_header(DPDMAI_CMDID_SET_RX_QUEUE, >+ cmd_flags, >+ token); >+ >+ cmd_params = (struct dpdmai_cmd_queue *)cmd.params; >+ cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); >+ cmd_params->priority = cfg->dest_cfg.priority; >+ cmd_params->queue = priority; >+ cmd_params->dest_type = cfg->dest_cfg.dest_type; >+ cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); >+ cmd_params->options = cpu_to_le32(cfg->options); >+ >+ /* send command to mc*/ >+ return mc_send_command(mc_io, &cmd); >+} >+ >+int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ struct dpdmai_rx_queue_attr *attr) >+{ >+ struct fsl_mc_command cmd = { 0 }; >+ struct dpdmai_cmd_queue *cmd_params; >+ int err; >+ >+ /* prepare command */ >+ cmd.header = >mc_encode_cmd_header(DPDMAI_CMDID_GET_RX_QUEUE, >+ cmd_flags, >+ token); >+ >+ cmd_params = (struct dpdmai_cmd_queue *)cmd.params; >+ cmd_params->queue = priority; >+ >+ /* send command to mc*/ >+ err = mc_send_command(mc_io, &cmd); >+ if (err) >+ return err; >+ >+ /* retrieve response parameters */ >+ attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id); >+ attr->dest_cfg.priority = cmd_params->priority; >+ attr->dest_cfg.dest_type = cmd_params->dest_type; >+ attr->user_ctx = le64_to_cpu(cmd_params->user_ctx); >+ attr->fqid = le32_to_cpu(cmd_params->fqid); >+ >+ return 0; >+} >+ >+int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ struct dpdmai_tx_queue_attr *attr) >+{ >+ struct fsl_mc_command cmd = { 0 }; >+ struct dpdmai_cmd_queue *cmd_params; >+ struct dpdmai_rsp_get_tx_queue *rsp_params; >+ int err; >+ >+ /* prepare command */ >+ cmd.header = >mc_encode_cmd_header(DPDMAI_CMDID_GET_TX_QUEUE, >+ cmd_flags, >+ token); >+ >+ cmd_params = (struct dpdmai_cmd_queue *)cmd.params; >+ cmd_params->queue = priority; >+ >+ /* send command to mc*/ >+ err = mc_send_command(mc_io, &cmd); >+ if (err) >+ return err; >+ >+ /* retrieve response parameters */ >+ >+ rsp_params = (struct dpdmai_rsp_get_tx_queue *)cmd.params; >+ attr->fqid = le32_to_cpu(rsp_params->fqid); >+ >+ return 0; >+} >diff --git a/drivers/dma/fsl-dpaa2-qdma/dpdmai.h >b/drivers/dma/fsl-dpaa2-qdma/dpdmai.h >new file mode 100644 >index 0000000..54d26bb >--- /dev/null >+++ b/drivers/dma/fsl-dpaa2-qdma/dpdmai.h >@@ -0,0 +1,318 @@ >+/* SPDX-License-Identifier: GPL-2.0 */ >+/* Copyright 2019 NXP */ >+ >+#ifndef __FSL_DPDMAI_H >+#define __FSL_DPDMAI_H >+ >+/* DPDMAI Version */ >+#define DPDMAI_VER_MAJOR 2 >+#define DPDMAI_VER_MINOR 2 >+ >+#define DPDMAI_CMD_BASE_VERSION 0 >+#define DPDMAI_CMD_ID_OFFSET 4 >+ >+#define DPDMAI_CMDID_FORMAT(x) (((x) << DPDMAI_CMD_ID_OFFSET) >| \ >+ DPDMAI_CMD_BASE_VERSION) >+ >+/* Command IDs */ >+#define DPDMAI_CMDID_CLOSE DPDMAI_CMDID_FORMAT(0x800) >+#define DPDMAI_CMDID_OPEN >DPDMAI_CMDID_FORMAT(0x80E) >+#define DPDMAI_CMDID_CREATE >DPDMAI_CMDID_FORMAT(0x90E) >+ >+#define DPDMAI_CMDID_ENABLE >DPDMAI_CMDID_FORMAT(0x002) >+#define DPDMAI_CMDID_DISABLE >DPDMAI_CMDID_FORMAT(0x003) >+#define DPDMAI_CMDID_GET_ATTR >DPDMAI_CMDID_FORMAT(0x004) >+#define DPDMAI_CMDID_RESET >DPDMAI_CMDID_FORMAT(0x005) >+#define DPDMAI_CMDID_IS_ENABLED >DPDMAI_CMDID_FORMAT(0x006) >+ >+#define DPDMAI_CMDID_SET_IRQ >DPDMAI_CMDID_FORMAT(0x010) >+#define DPDMAI_CMDID_GET_IRQ >DPDMAI_CMDID_FORMAT(0x011) >+#define DPDMAI_CMDID_SET_IRQ_ENABLE >DPDMAI_CMDID_FORMAT(0x012) >+#define DPDMAI_CMDID_GET_IRQ_ENABLE >DPDMAI_CMDID_FORMAT(0x013) >+#define DPDMAI_CMDID_SET_IRQ_MASK >DPDMAI_CMDID_FORMAT(0x014) >+#define DPDMAI_CMDID_GET_IRQ_MASK >DPDMAI_CMDID_FORMAT(0x015) >+#define DPDMAI_CMDID_GET_IRQ_STATUS >DPDMAI_CMDID_FORMAT(0x016) >+#define DPDMAI_CMDID_CLEAR_IRQ_STATUS > DPDMAI_CMDID_FORMAT(0x017) >+ >+#define DPDMAI_CMDID_SET_RX_QUEUE > DPDMAI_CMDID_FORMAT(0x1A0) >+#define DPDMAI_CMDID_GET_RX_QUEUE >DPDMAI_CMDID_FORMAT(0x1A1) >+#define DPDMAI_CMDID_GET_TX_QUEUE >DPDMAI_CMDID_FORMAT(0x1A2) >+ >+#define MC_CMD_HDR_TOKEN_O 32 /* Token field offset */ #define >+MC_CMD_HDR_TOKEN_S 16 /* Token field size */ >+ >+#define MAKE_UMASK64(_width) \ >+ ((u64)((_width) < 64 ? ((u64)1 << (_width)) - 1 : (u64)-1)) >+ >+/* Data Path DMA Interface API >+ * Contains initialization APIs and runtime control APIs for DPDMAI */ >+ >+/** >+ * Maximum number of Tx/Rx priorities per DPDMAI object */ >+#define DPDMAI_PRIO_NUM 2 >+ >+/* DPDMAI queue modification options */ >+ >+/** >+ * Select to modify the user's context associated with the queue */ >+#define DPDMAI_QUEUE_OPT_USER_CTX 0x1 >+ >+/** >+ * Select to modify the queue's destination */ >+#define DPDMAI_QUEUE_OPT_DEST 0x2 >+ >+/** >+ * dpdmai_open() - Open a control session for the specified object >+ * @mc_io: Pointer to MC portal's I/O object >+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' >+ * @dpdmai_id: DPDMAI unique ID >+ * @token: Returned token; use in subsequent API calls >+ * >+ * This function can be used to open a control session for an >+ * already created object; an object may have been declared in >+ * the DPL or by calling the dpdmai_create() function. >+ * This function returns a unique authentication token, >+ * associated with the specific object ID and the specific MC >+ * portal; this token must be used in all subsequent commands for >+ * this specific object. >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ int dpdmai_id, u16 *token); >+ >+/** >+ * dpdmai_close() - Close the control session of the 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 DPDMAI object >+ * >+ * After this function is called, no further operations are >+ * allowed on the object without opening a new control session. >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token); >+ >+/** >+ * struct dpdmai_cfg - Structure representing DPDMAI configuration >+ * @priorities: Priorities for the DMA hardware processing; valid priorities are >+ * configured with values 1-8; the entry following last valid entry >+ * should be configured with 0 >+ */ >+struct dpdmai_cfg { >+ u8 priorities[DPDMAI_PRIO_NUM]; >+}; >+ >+/** >+ * dpdmai_create() - Create the DPDMAI object >+ * @mc_io: Pointer to MC portal's I/O object >+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' >+ * @cfg: Configuration structure >+ * @token: Returned token; use in subsequent API calls >+ * >+ * Create the DPDMAI object, allocate required resources and >+ * perform required initialization. >+ * >+ * The object can be created either by declaring it in the >+ * DPL file, or by calling this function. >+ * >+ * This function returns a unique authentication token, >+ * associated with the specific object ID and the specific MC >+ * portal; this token must be used in all subsequent calls to >+ * this specific object. For objects that are created using the >+ * DPL file, call dpdmai_open() function to get an authentication >+ * token first. >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_create(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ const struct dpdmai_cfg *cfg, u16 *token); >+ >+/** >+ * dpdmai_enable() - Enable the DPDMAI, allow sending and receiving frames. >+ * @mc_io: Pointer to MC portal's I/O object >+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' >+ * @token: Token of DPDMAI object >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token); >+ >+/** >+ * dpdmai_disable() - Disable the DPDMAI, stop sending and receiving frames. >+ * @mc_io: Pointer to MC portal's I/O object >+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' >+ * @token: Token of DPDMAI object >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token); >+ >+/** >+ * dpdmai_reset() - Reset the DPDMAI, returns the object to initial state. >+ * @mc_io: Pointer to MC portal's I/O object >+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' >+ * @token: Token of DPDMAI object >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token); >+ >+/** >+ * struct dpdmai_attr - Structure representing DPDMAI attributes >+ * @id: DPDMAI object ID >+ * @version: DPDMAI version >+ * @num_of_priorities: number of priorities */ struct dpdmai_attr { >+ int id; >+ /** >+ * struct version - DPDMAI version >+ * @major: DPDMAI major version >+ * @minor: DPDMAI minor version >+ */ >+ struct { >+ u16 major; >+ u16 minor; >+ } version; >+ u8 num_of_priorities; >+}; >+ >+/** >+ * dpdmai_get_attributes() - Retrieve DPDMAI 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 DPDMAI object >+ * @attr: Returned object's attributes >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, struct dpdmai_attr *attr); >+ >+/** >+ * enum dpdmai_dest - DPDMAI destination types >+ * @DPDMAI_DEST_NONE: Unassigned destination; The queue is set in >parked mode >+ * and does not generate FQDAN notifications; user is expected to dequeue >+ * from the queue based on polling or other user-defined method >+ * @DPDMAI_DEST_DPIO: The queue is set in schedule mode and generates >FQDAN >+ * notifications to the specified DPIO; user is expected to dequeue >+ * from the queue only after notification is received >+ * @DPDMAI_DEST_DPCON: The queue is set in schedule mode and does not >generate >+ * FQDAN notifications, but is connected to the specified DPCON object; >+ * user is expected to dequeue from the DPCON channel >+ */ >+enum dpdmai_dest { >+ DPDMAI_DEST_NONE = 0, >+ DPDMAI_DEST_DPIO = 1, >+ DPDMAI_DEST_DPCON = 2 >+}; >+ >+/** >+ * struct dpdmai_dest_cfg - Structure representing DPDMAI destination >+parameters >+ * @dest_type: Destination type >+ * @dest_id: Either DPIO ID or DPCON ID, depending on the destination >+type >+ * @priority: Priority selection within the DPIO or DPCON channel; valid >values >+ * are 0-1 or 0-7, depending on the number of priorities in that >+ * channel; not relevant for 'DPDMAI_DEST_NONE' option >+ */ >+struct dpdmai_dest_cfg { >+ enum dpdmai_dest dest_type; >+ int dest_id; >+ u8 priority; >+}; >+ >+/** >+ * struct dpdmai_rx_queue_cfg - DPDMAI RX queue configuration >+ * @options: Flags representing the suggested modifications to the queue; >+ * Use any combination of 'DPDMAI_QUEUE_OPT_<X>' flags >+ * @user_ctx: User context value provided in the frame descriptor of each >+ * dequeued frame; >+ * valid only if 'DPDMAI_QUEUE_OPT_USER_CTX' is contained in 'options' >+ * @dest_cfg: Queue destination parameters; >+ * valid only if 'DPDMAI_QUEUE_OPT_DEST' is contained in 'options' >+ */ >+struct dpdmai_rx_queue_cfg { >+ struct dpdmai_dest_cfg dest_cfg; >+ u32 options; >+ u64 user_ctx; >+ >+}; >+ >+/** >+ * dpdmai_set_rx_queue() - Set Rx queue 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 DPDMAI object >+ * @priority: Select the queue relative to number of >+ * priorities configured at DPDMAI creation >+ * @cfg: Rx queue configuration >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ const struct dpdmai_rx_queue_cfg *cfg); >+ >+/** >+ * struct dpdmai_rx_queue_attr - Structure representing attributes of >+Rx queues >+ * @user_ctx: User context value provided in the frame descriptor of each >+ * dequeued frame >+ * @dest_cfg: Queue destination configuration >+ * @fqid: Virtual FQID value to be used for dequeue operations */ >+struct dpdmai_rx_queue_attr { >+ struct dpdmai_dest_cfg dest_cfg; >+ u64 user_ctx; >+ u32 fqid; >+}; >+ >+/** >+ * dpdmai_get_rx_queue() - Retrieve Rx queue 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 DPDMAI object >+ * @priority: Select the queue relative to number of >+ * priorities configured at DPDMAI creation >+ * @attr: Returned Rx queue attributes >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ struct dpdmai_rx_queue_attr *attr); >+ >+/** >+ * struct dpdmai_tx_queue_attr - Structure representing attributes of >+Tx queues >+ * @fqid: Virtual FQID to be used for sending frames to DMA hardware >+*/ >+ >+struct dpdmai_tx_queue_attr { >+ u32 fqid; >+}; >+ >+/** >+ * dpdmai_get_tx_queue() - Retrieve Tx queue 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 DPDMAI object >+ * @priority: Select the queue relative to number of >+ * priorities configured at DPDMAI creation >+ * @attr: Returned Tx queue attributes >+ * >+ * Return: '0' on Success; Error code otherwise. >+ */ >+int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, >+ u16 token, u8 priority, >+ struct dpdmai_tx_queue_attr *attr); >+ >+#endif /* __FSL_DPDMAI_H */ >-- >1.7.1