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