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