162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci// Copyright 2019 NXP
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/module.h>
562306a36Sopenharmony_ci#include <linux/types.h>
662306a36Sopenharmony_ci#include <linux/io.h>
762306a36Sopenharmony_ci#include <linux/fsl/mc.h>
862306a36Sopenharmony_ci#include "dpdmai.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct dpdmai_rsp_get_attributes {
1162306a36Sopenharmony_ci	__le32 id;
1262306a36Sopenharmony_ci	u8 num_of_priorities;
1362306a36Sopenharmony_ci	u8 pad0[3];
1462306a36Sopenharmony_ci	__le16 major;
1562306a36Sopenharmony_ci	__le16 minor;
1662306a36Sopenharmony_ci};
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct dpdmai_cmd_queue {
1962306a36Sopenharmony_ci	__le32 dest_id;
2062306a36Sopenharmony_ci	u8 priority;
2162306a36Sopenharmony_ci	u8 queue;
2262306a36Sopenharmony_ci	u8 dest_type;
2362306a36Sopenharmony_ci	u8 pad;
2462306a36Sopenharmony_ci	__le64 user_ctx;
2562306a36Sopenharmony_ci	union {
2662306a36Sopenharmony_ci		__le32 options;
2762306a36Sopenharmony_ci		__le32 fqid;
2862306a36Sopenharmony_ci	};
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct dpdmai_rsp_get_tx_queue {
3262306a36Sopenharmony_ci	__le64 pad;
3362306a36Sopenharmony_ci	__le32 fqid;
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define MC_CMD_OP(_cmd, _param, _offset, _width, _type, _arg) \
3762306a36Sopenharmony_ci	((_cmd).params[_param] |= mc_enc((_offset), (_width), _arg))
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* cmd, param, offset, width, type, arg_name */
4062306a36Sopenharmony_ci#define DPDMAI_CMD_CREATE(cmd, cfg) \
4162306a36Sopenharmony_cido { \
4262306a36Sopenharmony_ci	MC_CMD_OP(cmd, 0, 8,  8,  u8,  (cfg)->priorities[0]);\
4362306a36Sopenharmony_ci	MC_CMD_OP(cmd, 0, 16, 8,  u8,  (cfg)->priorities[1]);\
4462306a36Sopenharmony_ci} while (0)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline u64 mc_enc(int lsoffset, int width, u64 val)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	return (val & MAKE_UMASK64(width)) << lsoffset;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/**
5262306a36Sopenharmony_ci * dpdmai_open() - Open a control session for the specified object
5362306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
5462306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
5562306a36Sopenharmony_ci * @dpdmai_id:	DPDMAI unique ID
5662306a36Sopenharmony_ci * @token:	Returned token; use in subsequent API calls
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * This function can be used to open a control session for an
5962306a36Sopenharmony_ci * already created object; an object may have been declared in
6062306a36Sopenharmony_ci * the DPL or by calling the dpdmai_create() function.
6162306a36Sopenharmony_ci * This function returns a unique authentication token,
6262306a36Sopenharmony_ci * associated with the specific object ID and the specific MC
6362306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for
6462306a36Sopenharmony_ci * this specific object.
6562306a36Sopenharmony_ci *
6662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
6762306a36Sopenharmony_ci */
6862306a36Sopenharmony_ciint dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags,
6962306a36Sopenharmony_ci		int dpdmai_id, u16 *token)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
7262306a36Sopenharmony_ci	__le64 *cmd_dpdmai_id;
7362306a36Sopenharmony_ci	int err;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	/* prepare command */
7662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_OPEN,
7762306a36Sopenharmony_ci					  cmd_flags, 0);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	cmd_dpdmai_id = cmd.params;
8062306a36Sopenharmony_ci	*cmd_dpdmai_id = cpu_to_le32(dpdmai_id);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	/* send command to mc*/
8362306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
8462306a36Sopenharmony_ci	if (err)
8562306a36Sopenharmony_ci		return err;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* retrieve response parameters */
8862306a36Sopenharmony_ci	*token = mc_cmd_hdr_read_token(&cmd);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	return 0;
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_open);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/**
9562306a36Sopenharmony_ci * dpdmai_close() - Close the control session of the object
9662306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
9762306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
9862306a36Sopenharmony_ci * @token:	Token of DPDMAI object
9962306a36Sopenharmony_ci *
10062306a36Sopenharmony_ci * After this function is called, no further operations are
10162306a36Sopenharmony_ci * allowed on the object without opening a new control session.
10262306a36Sopenharmony_ci *
10362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
10462306a36Sopenharmony_ci */
10562306a36Sopenharmony_ciint dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	/* prepare command */
11062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CLOSE,
11162306a36Sopenharmony_ci					  cmd_flags, token);
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	/* send command to mc*/
11462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_close);
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/**
11962306a36Sopenharmony_ci * dpdmai_create() - Create the DPDMAI object
12062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
12162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
12262306a36Sopenharmony_ci * @cfg:	Configuration structure
12362306a36Sopenharmony_ci * @token:	Returned token; use in subsequent API calls
12462306a36Sopenharmony_ci *
12562306a36Sopenharmony_ci * Create the DPDMAI object, allocate required resources and
12662306a36Sopenharmony_ci * perform required initialization.
12762306a36Sopenharmony_ci *
12862306a36Sopenharmony_ci * The object can be created either by declaring it in the
12962306a36Sopenharmony_ci * DPL file, or by calling this function.
13062306a36Sopenharmony_ci *
13162306a36Sopenharmony_ci * This function returns a unique authentication token,
13262306a36Sopenharmony_ci * associated with the specific object ID and the specific MC
13362306a36Sopenharmony_ci * portal; this token must be used in all subsequent calls to
13462306a36Sopenharmony_ci * this specific object. For objects that are created using the
13562306a36Sopenharmony_ci * DPL file, call dpdmai_open() function to get an authentication
13662306a36Sopenharmony_ci * token first.
13762306a36Sopenharmony_ci *
13862306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
13962306a36Sopenharmony_ci */
14062306a36Sopenharmony_ciint dpdmai_create(struct fsl_mc_io *mc_io, u32 cmd_flags,
14162306a36Sopenharmony_ci		  const struct dpdmai_cfg *cfg, u16 *token)
14262306a36Sopenharmony_ci{
14362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
14462306a36Sopenharmony_ci	int err;
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	/* prepare command */
14762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CREATE,
14862306a36Sopenharmony_ci					  cmd_flags, 0);
14962306a36Sopenharmony_ci	DPDMAI_CMD_CREATE(cmd, cfg);
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	/* send command to mc*/
15262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
15362306a36Sopenharmony_ci	if (err)
15462306a36Sopenharmony_ci		return err;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	/* retrieve response parameters */
15762306a36Sopenharmony_ci	*token = mc_cmd_hdr_read_token(&cmd);
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	return 0;
16062306a36Sopenharmony_ci}
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci/**
16362306a36Sopenharmony_ci * dpdmai_destroy() - Destroy the DPDMAI object and release all its resources.
16462306a36Sopenharmony_ci * @mc_io:      Pointer to MC portal's I/O object
16562306a36Sopenharmony_ci * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
16662306a36Sopenharmony_ci * @token:      Token of DPDMAI object
16762306a36Sopenharmony_ci *
16862306a36Sopenharmony_ci * Return:      '0' on Success; error code otherwise.
16962306a36Sopenharmony_ci */
17062306a36Sopenharmony_ciint dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	/* prepare command */
17562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DESTROY,
17662306a36Sopenharmony_ci					  cmd_flags, token);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* send command to mc*/
17962306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
18062306a36Sopenharmony_ci}
18162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_destroy);
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci/**
18462306a36Sopenharmony_ci * dpdmai_enable() - Enable the DPDMAI, allow sending and receiving frames.
18562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
18662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
18762306a36Sopenharmony_ci * @token:	Token of DPDMAI object
18862306a36Sopenharmony_ci *
18962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
19062306a36Sopenharmony_ci */
19162306a36Sopenharmony_ciint dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	/* prepare command */
19662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_ENABLE,
19762306a36Sopenharmony_ci					  cmd_flags, token);
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	/* send command to mc*/
20062306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
20162306a36Sopenharmony_ci}
20262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_enable);
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/**
20562306a36Sopenharmony_ci * dpdmai_disable() - Disable the DPDMAI, stop sending and receiving frames.
20662306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
20762306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
20862306a36Sopenharmony_ci * @token:	Token of DPDMAI object
20962306a36Sopenharmony_ci *
21062306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
21162306a36Sopenharmony_ci */
21262306a36Sopenharmony_ciint dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
21362306a36Sopenharmony_ci{
21462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	/* prepare command */
21762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DISABLE,
21862306a36Sopenharmony_ci					  cmd_flags, token);
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	/* send command to mc*/
22162306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
22262306a36Sopenharmony_ci}
22362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_disable);
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci/**
22662306a36Sopenharmony_ci * dpdmai_reset() - Reset the DPDMAI, returns the object to initial state.
22762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
22862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
22962306a36Sopenharmony_ci * @token:	Token of DPDMAI object
23062306a36Sopenharmony_ci *
23162306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
23262306a36Sopenharmony_ci */
23362306a36Sopenharmony_ciint dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
23462306a36Sopenharmony_ci{
23562306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	/* prepare command */
23862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_RESET,
23962306a36Sopenharmony_ci					  cmd_flags, token);
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	/* send command to mc*/
24262306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
24362306a36Sopenharmony_ci}
24462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_reset);
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci/**
24762306a36Sopenharmony_ci * dpdmai_get_attributes() - Retrieve DPDMAI attributes.
24862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
24962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
25062306a36Sopenharmony_ci * @token:	Token of DPDMAI object
25162306a36Sopenharmony_ci * @attr:	Returned object's attributes
25262306a36Sopenharmony_ci *
25362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
25462306a36Sopenharmony_ci */
25562306a36Sopenharmony_ciint dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
25662306a36Sopenharmony_ci			  u16 token, struct dpdmai_attr *attr)
25762306a36Sopenharmony_ci{
25862306a36Sopenharmony_ci	struct dpdmai_rsp_get_attributes *rsp_params;
25962306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
26062306a36Sopenharmony_ci	int err;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	/* prepare command */
26362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_ATTR,
26462306a36Sopenharmony_ci					  cmd_flags, token);
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	/* send command to mc*/
26762306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
26862306a36Sopenharmony_ci	if (err)
26962306a36Sopenharmony_ci		return err;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	/* retrieve response parameters */
27262306a36Sopenharmony_ci	rsp_params = (struct dpdmai_rsp_get_attributes *)cmd.params;
27362306a36Sopenharmony_ci	attr->id = le32_to_cpu(rsp_params->id);
27462306a36Sopenharmony_ci	attr->version.major = le16_to_cpu(rsp_params->major);
27562306a36Sopenharmony_ci	attr->version.minor = le16_to_cpu(rsp_params->minor);
27662306a36Sopenharmony_ci	attr->num_of_priorities = rsp_params->num_of_priorities;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	return 0;
27962306a36Sopenharmony_ci}
28062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_get_attributes);
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci/**
28362306a36Sopenharmony_ci * dpdmai_set_rx_queue() - Set Rx queue configuration
28462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
28562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
28662306a36Sopenharmony_ci * @token:	Token of DPDMAI object
28762306a36Sopenharmony_ci * @priority:	Select the queue relative to number of
28862306a36Sopenharmony_ci *		priorities configured at DPDMAI creation
28962306a36Sopenharmony_ci * @cfg:	Rx queue configuration
29062306a36Sopenharmony_ci *
29162306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
29262306a36Sopenharmony_ci */
29362306a36Sopenharmony_ciint dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
29462306a36Sopenharmony_ci			u8 priority, const struct dpdmai_rx_queue_cfg *cfg)
29562306a36Sopenharmony_ci{
29662306a36Sopenharmony_ci	struct dpdmai_cmd_queue *cmd_params;
29762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	/* prepare command */
30062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_SET_RX_QUEUE,
30162306a36Sopenharmony_ci					  cmd_flags, token);
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
30462306a36Sopenharmony_ci	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
30562306a36Sopenharmony_ci	cmd_params->priority = cfg->dest_cfg.priority;
30662306a36Sopenharmony_ci	cmd_params->queue = priority;
30762306a36Sopenharmony_ci	cmd_params->dest_type = cfg->dest_cfg.dest_type;
30862306a36Sopenharmony_ci	cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
30962306a36Sopenharmony_ci	cmd_params->options = cpu_to_le32(cfg->options);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	/* send command to mc*/
31262306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
31362306a36Sopenharmony_ci}
31462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_set_rx_queue);
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci/**
31762306a36Sopenharmony_ci * dpdmai_get_rx_queue() - Retrieve Rx queue attributes.
31862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
31962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
32062306a36Sopenharmony_ci * @token:	Token of DPDMAI object
32162306a36Sopenharmony_ci * @priority:	Select the queue relative to number of
32262306a36Sopenharmony_ci *				priorities configured at DPDMAI creation
32362306a36Sopenharmony_ci * @attr:	Returned Rx queue attributes
32462306a36Sopenharmony_ci *
32562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
32662306a36Sopenharmony_ci */
32762306a36Sopenharmony_ciint dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
32862306a36Sopenharmony_ci			u8 priority, struct dpdmai_rx_queue_attr *attr)
32962306a36Sopenharmony_ci{
33062306a36Sopenharmony_ci	struct dpdmai_cmd_queue *cmd_params;
33162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
33262306a36Sopenharmony_ci	int err;
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	/* prepare command */
33562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_RX_QUEUE,
33662306a36Sopenharmony_ci					  cmd_flags, token);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
33962306a36Sopenharmony_ci	cmd_params->queue = priority;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	/* send command to mc*/
34262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
34362306a36Sopenharmony_ci	if (err)
34462306a36Sopenharmony_ci		return err;
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci	/* retrieve response parameters */
34762306a36Sopenharmony_ci	attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id);
34862306a36Sopenharmony_ci	attr->dest_cfg.priority = cmd_params->priority;
34962306a36Sopenharmony_ci	attr->dest_cfg.dest_type = cmd_params->dest_type;
35062306a36Sopenharmony_ci	attr->user_ctx = le64_to_cpu(cmd_params->user_ctx);
35162306a36Sopenharmony_ci	attr->fqid = le32_to_cpu(cmd_params->fqid);
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	return 0;
35462306a36Sopenharmony_ci}
35562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_get_rx_queue);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci/**
35862306a36Sopenharmony_ci * dpdmai_get_tx_queue() - Retrieve Tx queue attributes.
35962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
36062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
36162306a36Sopenharmony_ci * @token:	Token of DPDMAI object
36262306a36Sopenharmony_ci * @priority:	Select the queue relative to number of
36362306a36Sopenharmony_ci *			priorities configured at DPDMAI creation
36462306a36Sopenharmony_ci * @fqid:	Returned Tx queue
36562306a36Sopenharmony_ci *
36662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
36762306a36Sopenharmony_ci */
36862306a36Sopenharmony_ciint dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags,
36962306a36Sopenharmony_ci			u16 token, u8 priority, u32 *fqid)
37062306a36Sopenharmony_ci{
37162306a36Sopenharmony_ci	struct dpdmai_rsp_get_tx_queue *rsp_params;
37262306a36Sopenharmony_ci	struct dpdmai_cmd_queue *cmd_params;
37362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
37462306a36Sopenharmony_ci	int err;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	/* prepare command */
37762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_TX_QUEUE,
37862306a36Sopenharmony_ci					  cmd_flags, token);
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
38162306a36Sopenharmony_ci	cmd_params->queue = priority;
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	/* send command to mc*/
38462306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
38562306a36Sopenharmony_ci	if (err)
38662306a36Sopenharmony_ci		return err;
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	/* retrieve response parameters */
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	rsp_params = (struct dpdmai_rsp_get_tx_queue *)cmd.params;
39162306a36Sopenharmony_ci	*fqid = le32_to_cpu(rsp_params->fqid);
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	return 0;
39462306a36Sopenharmony_ci}
39562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_get_tx_queue);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
398