18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci// Copyright 2019 NXP
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include <linux/module.h>
58c2ecf20Sopenharmony_ci#include <linux/types.h>
68c2ecf20Sopenharmony_ci#include <linux/io.h>
78c2ecf20Sopenharmony_ci#include <linux/fsl/mc.h>
88c2ecf20Sopenharmony_ci#include "dpdmai.h"
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cistruct dpdmai_rsp_get_attributes {
118c2ecf20Sopenharmony_ci	__le32 id;
128c2ecf20Sopenharmony_ci	u8 num_of_priorities;
138c2ecf20Sopenharmony_ci	u8 pad0[3];
148c2ecf20Sopenharmony_ci	__le16 major;
158c2ecf20Sopenharmony_ci	__le16 minor;
168c2ecf20Sopenharmony_ci};
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistruct dpdmai_cmd_queue {
198c2ecf20Sopenharmony_ci	__le32 dest_id;
208c2ecf20Sopenharmony_ci	u8 priority;
218c2ecf20Sopenharmony_ci	u8 queue;
228c2ecf20Sopenharmony_ci	u8 dest_type;
238c2ecf20Sopenharmony_ci	u8 pad;
248c2ecf20Sopenharmony_ci	__le64 user_ctx;
258c2ecf20Sopenharmony_ci	union {
268c2ecf20Sopenharmony_ci		__le32 options;
278c2ecf20Sopenharmony_ci		__le32 fqid;
288c2ecf20Sopenharmony_ci	};
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct dpdmai_rsp_get_tx_queue {
328c2ecf20Sopenharmony_ci	__le64 pad;
338c2ecf20Sopenharmony_ci	__le32 fqid;
348c2ecf20Sopenharmony_ci};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define MC_CMD_OP(_cmd, _param, _offset, _width, _type, _arg) \
378c2ecf20Sopenharmony_ci	((_cmd).params[_param] |= mc_enc((_offset), (_width), _arg))
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci/* cmd, param, offset, width, type, arg_name */
408c2ecf20Sopenharmony_ci#define DPDMAI_CMD_CREATE(cmd, cfg) \
418c2ecf20Sopenharmony_cido { \
428c2ecf20Sopenharmony_ci	MC_CMD_OP(cmd, 0, 8,  8,  u8,  (cfg)->priorities[0]);\
438c2ecf20Sopenharmony_ci	MC_CMD_OP(cmd, 0, 16, 8,  u8,  (cfg)->priorities[1]);\
448c2ecf20Sopenharmony_ci} while (0)
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic inline u64 mc_enc(int lsoffset, int width, u64 val)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	return (val & MAKE_UMASK64(width)) << lsoffset;
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci/**
528c2ecf20Sopenharmony_ci * dpdmai_open() - Open a control session for the specified object
538c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
548c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
558c2ecf20Sopenharmony_ci * @dpdmai_id:	DPDMAI unique ID
568c2ecf20Sopenharmony_ci * @token:	Returned token; use in subsequent API calls
578c2ecf20Sopenharmony_ci *
588c2ecf20Sopenharmony_ci * This function can be used to open a control session for an
598c2ecf20Sopenharmony_ci * already created object; an object may have been declared in
608c2ecf20Sopenharmony_ci * the DPL or by calling the dpdmai_create() function.
618c2ecf20Sopenharmony_ci * This function returns a unique authentication token,
628c2ecf20Sopenharmony_ci * associated with the specific object ID and the specific MC
638c2ecf20Sopenharmony_ci * portal; this token must be used in all subsequent commands for
648c2ecf20Sopenharmony_ci * this specific object.
658c2ecf20Sopenharmony_ci *
668c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
678c2ecf20Sopenharmony_ci */
688c2ecf20Sopenharmony_ciint dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags,
698c2ecf20Sopenharmony_ci		int dpdmai_id, u16 *token)
708c2ecf20Sopenharmony_ci{
718c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
728c2ecf20Sopenharmony_ci	__le64 *cmd_dpdmai_id;
738c2ecf20Sopenharmony_ci	int err;
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	/* prepare command */
768c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_OPEN,
778c2ecf20Sopenharmony_ci					  cmd_flags, 0);
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	cmd_dpdmai_id = cmd.params;
808c2ecf20Sopenharmony_ci	*cmd_dpdmai_id = cpu_to_le32(dpdmai_id);
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	/* send command to mc*/
838c2ecf20Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
848c2ecf20Sopenharmony_ci	if (err)
858c2ecf20Sopenharmony_ci		return err;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	/* retrieve response parameters */
888c2ecf20Sopenharmony_ci	*token = mc_cmd_hdr_read_token(&cmd);
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	return 0;
918c2ecf20Sopenharmony_ci}
928c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_open);
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci/**
958c2ecf20Sopenharmony_ci * dpdmai_close() - Close the control session of the object
968c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
978c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
988c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
998c2ecf20Sopenharmony_ci *
1008c2ecf20Sopenharmony_ci * After this function is called, no further operations are
1018c2ecf20Sopenharmony_ci * allowed on the object without opening a new control session.
1028c2ecf20Sopenharmony_ci *
1038c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
1048c2ecf20Sopenharmony_ci */
1058c2ecf20Sopenharmony_ciint dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
1068c2ecf20Sopenharmony_ci{
1078c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	/* prepare command */
1108c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CLOSE,
1118c2ecf20Sopenharmony_ci					  cmd_flags, token);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	/* send command to mc*/
1148c2ecf20Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
1158c2ecf20Sopenharmony_ci}
1168c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_close);
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci/**
1198c2ecf20Sopenharmony_ci * dpdmai_create() - Create the DPDMAI object
1208c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
1218c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1228c2ecf20Sopenharmony_ci * @cfg:	Configuration structure
1238c2ecf20Sopenharmony_ci * @token:	Returned token; use in subsequent API calls
1248c2ecf20Sopenharmony_ci *
1258c2ecf20Sopenharmony_ci * Create the DPDMAI object, allocate required resources and
1268c2ecf20Sopenharmony_ci * perform required initialization.
1278c2ecf20Sopenharmony_ci *
1288c2ecf20Sopenharmony_ci * The object can be created either by declaring it in the
1298c2ecf20Sopenharmony_ci * DPL file, or by calling this function.
1308c2ecf20Sopenharmony_ci *
1318c2ecf20Sopenharmony_ci * This function returns a unique authentication token,
1328c2ecf20Sopenharmony_ci * associated with the specific object ID and the specific MC
1338c2ecf20Sopenharmony_ci * portal; this token must be used in all subsequent calls to
1348c2ecf20Sopenharmony_ci * this specific object. For objects that are created using the
1358c2ecf20Sopenharmony_ci * DPL file, call dpdmai_open() function to get an authentication
1368c2ecf20Sopenharmony_ci * token first.
1378c2ecf20Sopenharmony_ci *
1388c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
1398c2ecf20Sopenharmony_ci */
1408c2ecf20Sopenharmony_ciint dpdmai_create(struct fsl_mc_io *mc_io, u32 cmd_flags,
1418c2ecf20Sopenharmony_ci		  const struct dpdmai_cfg *cfg, u16 *token)
1428c2ecf20Sopenharmony_ci{
1438c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
1448c2ecf20Sopenharmony_ci	int err;
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	/* prepare command */
1478c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_CREATE,
1488c2ecf20Sopenharmony_ci					  cmd_flags, 0);
1498c2ecf20Sopenharmony_ci	DPDMAI_CMD_CREATE(cmd, cfg);
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci	/* send command to mc*/
1528c2ecf20Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
1538c2ecf20Sopenharmony_ci	if (err)
1548c2ecf20Sopenharmony_ci		return err;
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	/* retrieve response parameters */
1578c2ecf20Sopenharmony_ci	*token = mc_cmd_hdr_read_token(&cmd);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	return 0;
1608c2ecf20Sopenharmony_ci}
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci/**
1638c2ecf20Sopenharmony_ci * dpdmai_destroy() - Destroy the DPDMAI object and release all its resources.
1648c2ecf20Sopenharmony_ci * @mc_io:      Pointer to MC portal's I/O object
1658c2ecf20Sopenharmony_ci * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
1668c2ecf20Sopenharmony_ci * @token:      Token of DPDMAI object
1678c2ecf20Sopenharmony_ci *
1688c2ecf20Sopenharmony_ci * Return:      '0' on Success; error code otherwise.
1698c2ecf20Sopenharmony_ci */
1708c2ecf20Sopenharmony_ciint dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	/* prepare command */
1758c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DESTROY,
1768c2ecf20Sopenharmony_ci					  cmd_flags, token);
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	/* send command to mc*/
1798c2ecf20Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
1808c2ecf20Sopenharmony_ci}
1818c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_destroy);
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci/**
1848c2ecf20Sopenharmony_ci * dpdmai_enable() - Enable the DPDMAI, allow sending and receiving frames.
1858c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
1868c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1878c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
1888c2ecf20Sopenharmony_ci *
1898c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
1908c2ecf20Sopenharmony_ci */
1918c2ecf20Sopenharmony_ciint dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
1928c2ecf20Sopenharmony_ci{
1938c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci	/* prepare command */
1968c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_ENABLE,
1978c2ecf20Sopenharmony_ci					  cmd_flags, token);
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci	/* send command to mc*/
2008c2ecf20Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
2018c2ecf20Sopenharmony_ci}
2028c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_enable);
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci/**
2058c2ecf20Sopenharmony_ci * dpdmai_disable() - Disable the DPDMAI, stop sending and receiving frames.
2068c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
2078c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2088c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
2098c2ecf20Sopenharmony_ci *
2108c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
2118c2ecf20Sopenharmony_ci */
2128c2ecf20Sopenharmony_ciint dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
2138c2ecf20Sopenharmony_ci{
2148c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci	/* prepare command */
2178c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DISABLE,
2188c2ecf20Sopenharmony_ci					  cmd_flags, token);
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	/* send command to mc*/
2218c2ecf20Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
2228c2ecf20Sopenharmony_ci}
2238c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_disable);
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci/**
2268c2ecf20Sopenharmony_ci * dpdmai_reset() - Reset the DPDMAI, returns the object to initial state.
2278c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
2288c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2298c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
2308c2ecf20Sopenharmony_ci *
2318c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
2328c2ecf20Sopenharmony_ci */
2338c2ecf20Sopenharmony_ciint dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
2348c2ecf20Sopenharmony_ci{
2358c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	/* prepare command */
2388c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_RESET,
2398c2ecf20Sopenharmony_ci					  cmd_flags, token);
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	/* send command to mc*/
2428c2ecf20Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
2438c2ecf20Sopenharmony_ci}
2448c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_reset);
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci/**
2478c2ecf20Sopenharmony_ci * dpdmai_get_attributes() - Retrieve DPDMAI attributes.
2488c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
2498c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2508c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
2518c2ecf20Sopenharmony_ci * @attr:	Returned object's attributes
2528c2ecf20Sopenharmony_ci *
2538c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
2548c2ecf20Sopenharmony_ci */
2558c2ecf20Sopenharmony_ciint dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
2568c2ecf20Sopenharmony_ci			  u16 token, struct dpdmai_attr *attr)
2578c2ecf20Sopenharmony_ci{
2588c2ecf20Sopenharmony_ci	struct dpdmai_rsp_get_attributes *rsp_params;
2598c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
2608c2ecf20Sopenharmony_ci	int err;
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	/* prepare command */
2638c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_ATTR,
2648c2ecf20Sopenharmony_ci					  cmd_flags, token);
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci	/* send command to mc*/
2678c2ecf20Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
2688c2ecf20Sopenharmony_ci	if (err)
2698c2ecf20Sopenharmony_ci		return err;
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci	/* retrieve response parameters */
2728c2ecf20Sopenharmony_ci	rsp_params = (struct dpdmai_rsp_get_attributes *)cmd.params;
2738c2ecf20Sopenharmony_ci	attr->id = le32_to_cpu(rsp_params->id);
2748c2ecf20Sopenharmony_ci	attr->version.major = le16_to_cpu(rsp_params->major);
2758c2ecf20Sopenharmony_ci	attr->version.minor = le16_to_cpu(rsp_params->minor);
2768c2ecf20Sopenharmony_ci	attr->num_of_priorities = rsp_params->num_of_priorities;
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci	return 0;
2798c2ecf20Sopenharmony_ci}
2808c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_get_attributes);
2818c2ecf20Sopenharmony_ci
2828c2ecf20Sopenharmony_ci/**
2838c2ecf20Sopenharmony_ci * dpdmai_set_rx_queue() - Set Rx queue configuration
2848c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
2858c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2868c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
2878c2ecf20Sopenharmony_ci * @priority:	Select the queue relative to number of
2888c2ecf20Sopenharmony_ci *		priorities configured at DPDMAI creation
2898c2ecf20Sopenharmony_ci * @cfg:	Rx queue configuration
2908c2ecf20Sopenharmony_ci *
2918c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
2928c2ecf20Sopenharmony_ci */
2938c2ecf20Sopenharmony_ciint dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
2948c2ecf20Sopenharmony_ci			u8 priority, const struct dpdmai_rx_queue_cfg *cfg)
2958c2ecf20Sopenharmony_ci{
2968c2ecf20Sopenharmony_ci	struct dpdmai_cmd_queue *cmd_params;
2978c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci	/* prepare command */
3008c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_SET_RX_QUEUE,
3018c2ecf20Sopenharmony_ci					  cmd_flags, token);
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_ci	cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
3048c2ecf20Sopenharmony_ci	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
3058c2ecf20Sopenharmony_ci	cmd_params->priority = cfg->dest_cfg.priority;
3068c2ecf20Sopenharmony_ci	cmd_params->queue = priority;
3078c2ecf20Sopenharmony_ci	cmd_params->dest_type = cfg->dest_cfg.dest_type;
3088c2ecf20Sopenharmony_ci	cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
3098c2ecf20Sopenharmony_ci	cmd_params->options = cpu_to_le32(cfg->options);
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci	/* send command to mc*/
3128c2ecf20Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
3138c2ecf20Sopenharmony_ci}
3148c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_set_rx_queue);
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci/**
3178c2ecf20Sopenharmony_ci * dpdmai_get_rx_queue() - Retrieve Rx queue attributes.
3188c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
3198c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3208c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
3218c2ecf20Sopenharmony_ci * @priority:	Select the queue relative to number of
3228c2ecf20Sopenharmony_ci *				priorities configured at DPDMAI creation
3238c2ecf20Sopenharmony_ci * @attr:	Returned Rx queue attributes
3248c2ecf20Sopenharmony_ci *
3258c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
3268c2ecf20Sopenharmony_ci */
3278c2ecf20Sopenharmony_ciint dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
3288c2ecf20Sopenharmony_ci			u8 priority, struct dpdmai_rx_queue_attr *attr)
3298c2ecf20Sopenharmony_ci{
3308c2ecf20Sopenharmony_ci	struct dpdmai_cmd_queue *cmd_params;
3318c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
3328c2ecf20Sopenharmony_ci	int err;
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	/* prepare command */
3358c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_RX_QUEUE,
3368c2ecf20Sopenharmony_ci					  cmd_flags, token);
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci	cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
3398c2ecf20Sopenharmony_ci	cmd_params->queue = priority;
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ci	/* send command to mc*/
3428c2ecf20Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
3438c2ecf20Sopenharmony_ci	if (err)
3448c2ecf20Sopenharmony_ci		return err;
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_ci	/* retrieve response parameters */
3478c2ecf20Sopenharmony_ci	attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id);
3488c2ecf20Sopenharmony_ci	attr->dest_cfg.priority = cmd_params->priority;
3498c2ecf20Sopenharmony_ci	attr->dest_cfg.dest_type = cmd_params->dest_type;
3508c2ecf20Sopenharmony_ci	attr->user_ctx = le64_to_cpu(cmd_params->user_ctx);
3518c2ecf20Sopenharmony_ci	attr->fqid = le32_to_cpu(cmd_params->fqid);
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci	return 0;
3548c2ecf20Sopenharmony_ci}
3558c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_get_rx_queue);
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ci/**
3588c2ecf20Sopenharmony_ci * dpdmai_get_tx_queue() - Retrieve Tx queue attributes.
3598c2ecf20Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
3608c2ecf20Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3618c2ecf20Sopenharmony_ci * @token:	Token of DPDMAI object
3628c2ecf20Sopenharmony_ci * @priority:	Select the queue relative to number of
3638c2ecf20Sopenharmony_ci *			priorities configured at DPDMAI creation
3648c2ecf20Sopenharmony_ci * @fqid:	Returned Tx queue
3658c2ecf20Sopenharmony_ci *
3668c2ecf20Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
3678c2ecf20Sopenharmony_ci */
3688c2ecf20Sopenharmony_ciint dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags,
3698c2ecf20Sopenharmony_ci			u16 token, u8 priority, u32 *fqid)
3708c2ecf20Sopenharmony_ci{
3718c2ecf20Sopenharmony_ci	struct dpdmai_rsp_get_tx_queue *rsp_params;
3728c2ecf20Sopenharmony_ci	struct dpdmai_cmd_queue *cmd_params;
3738c2ecf20Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
3748c2ecf20Sopenharmony_ci	int err;
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	/* prepare command */
3778c2ecf20Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_GET_TX_QUEUE,
3788c2ecf20Sopenharmony_ci					  cmd_flags, token);
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
3818c2ecf20Sopenharmony_ci	cmd_params->queue = priority;
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	/* send command to mc*/
3848c2ecf20Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
3858c2ecf20Sopenharmony_ci	if (err)
3868c2ecf20Sopenharmony_ci		return err;
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci	/* retrieve response parameters */
3898c2ecf20Sopenharmony_ci
3908c2ecf20Sopenharmony_ci	rsp_params = (struct dpdmai_rsp_get_tx_queue *)cmd.params;
3918c2ecf20Sopenharmony_ci	*fqid = le32_to_cpu(rsp_params->fqid);
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_ci	return 0;
3948c2ecf20Sopenharmony_ci}
3958c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpdmai_get_tx_queue);
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
398