162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * Copyright 2017-2018 NXP 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/fsl/mc.h> 862306a36Sopenharmony_ci#include "dpseci.h" 962306a36Sopenharmony_ci#include "dpseci_cmd.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/** 1262306a36Sopenharmony_ci * dpseci_open() - Open a control session for the specified object 1362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1562306a36Sopenharmony_ci * @dpseci_id: DPSECI unique ID 1662306a36Sopenharmony_ci * @token: Returned token; use in subsequent API calls 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * This function can be used to open a control session for an already created 1962306a36Sopenharmony_ci * object; an object may have been declared statically in the DPL 2062306a36Sopenharmony_ci * or created dynamically. 2162306a36Sopenharmony_ci * This function returns a unique authentication token, associated with the 2262306a36Sopenharmony_ci * specific object ID and the specific MC portal; this token must be used in all 2362306a36Sopenharmony_ci * subsequent commands for this specific object. 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ciint dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id, 2862306a36Sopenharmony_ci u16 *token) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3162306a36Sopenharmony_ci struct dpseci_cmd_open *cmd_params; 3262306a36Sopenharmony_ci int err; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_OPEN, 3562306a36Sopenharmony_ci cmd_flags, 3662306a36Sopenharmony_ci 0); 3762306a36Sopenharmony_ci cmd_params = (struct dpseci_cmd_open *)cmd.params; 3862306a36Sopenharmony_ci cmd_params->dpseci_id = cpu_to_le32(dpseci_id); 3962306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 4062306a36Sopenharmony_ci if (err) 4162306a36Sopenharmony_ci return err; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci return 0; 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/** 4962306a36Sopenharmony_ci * dpseci_close() - Close the control session of the object 5062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 5162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 5262306a36Sopenharmony_ci * @token: Token of DPSECI object 5362306a36Sopenharmony_ci * 5462306a36Sopenharmony_ci * After this function is called, no further operations are allowed on the 5562306a36Sopenharmony_ci * object without opening a new control session. 5662306a36Sopenharmony_ci * 5762306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_ciint dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_CLOSE, 6462306a36Sopenharmony_ci cmd_flags, 6562306a36Sopenharmony_ci token); 6662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/** 7062306a36Sopenharmony_ci * dpseci_enable() - Enable the DPSECI, allow sending and receiving frames 7162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 7262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 7362306a36Sopenharmony_ci * @token: Token of DPSECI object 7462306a36Sopenharmony_ci * 7562306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ciint dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 7862306a36Sopenharmony_ci{ 7962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_ENABLE, 8262306a36Sopenharmony_ci cmd_flags, 8362306a36Sopenharmony_ci token); 8462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/** 8862306a36Sopenharmony_ci * dpseci_disable() - Disable the DPSECI, stop sending and receiving frames 8962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 9062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 9162306a36Sopenharmony_ci * @token: Token of DPSECI object 9262306a36Sopenharmony_ci * 9362306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 9462306a36Sopenharmony_ci */ 9562306a36Sopenharmony_ciint dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_DISABLE, 10062306a36Sopenharmony_ci cmd_flags, 10162306a36Sopenharmony_ci token); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/** 10762306a36Sopenharmony_ci * dpseci_reset() - Reset the DPSECI, returns the object to initial state 10862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 10962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 11062306a36Sopenharmony_ci * @token: Token of DPSECI object 11162306a36Sopenharmony_ci * 11262306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_ciint dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET, 11962306a36Sopenharmony_ci cmd_flags, 12062306a36Sopenharmony_ci token); 12162306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/** 12562306a36Sopenharmony_ci * dpseci_is_enabled() - Check if the DPSECI is enabled. 12662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 12762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 12862306a36Sopenharmony_ci * @token: Token of DPSECI object 12962306a36Sopenharmony_ci * @en: Returns '1' if object is enabled; '0' otherwise 13062306a36Sopenharmony_ci * 13162306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_ciint dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 13462306a36Sopenharmony_ci int *en) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 13762306a36Sopenharmony_ci struct dpseci_rsp_is_enabled *rsp_params; 13862306a36Sopenharmony_ci int err; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_IS_ENABLED, 14162306a36Sopenharmony_ci cmd_flags, 14262306a36Sopenharmony_ci token); 14362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 14462306a36Sopenharmony_ci if (err) 14562306a36Sopenharmony_ci return err; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci rsp_params = (struct dpseci_rsp_is_enabled *)cmd.params; 14862306a36Sopenharmony_ci *en = dpseci_get_field(rsp_params->is_enabled, ENABLE); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci return 0; 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/** 15462306a36Sopenharmony_ci * dpseci_get_attributes() - Retrieve DPSECI attributes 15562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 15662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15762306a36Sopenharmony_ci * @token: Token of DPSECI object 15862306a36Sopenharmony_ci * @attr: Returned object's attributes 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 16162306a36Sopenharmony_ci */ 16262306a36Sopenharmony_ciint dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 16362306a36Sopenharmony_ci struct dpseci_attr *attr) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 16662306a36Sopenharmony_ci struct dpseci_rsp_get_attributes *rsp_params; 16762306a36Sopenharmony_ci int err; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_ATTR, 17062306a36Sopenharmony_ci cmd_flags, 17162306a36Sopenharmony_ci token); 17262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 17362306a36Sopenharmony_ci if (err) 17462306a36Sopenharmony_ci return err; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_attributes *)cmd.params; 17762306a36Sopenharmony_ci attr->id = le32_to_cpu(rsp_params->id); 17862306a36Sopenharmony_ci attr->num_tx_queues = rsp_params->num_tx_queues; 17962306a36Sopenharmony_ci attr->num_rx_queues = rsp_params->num_rx_queues; 18062306a36Sopenharmony_ci attr->options = le32_to_cpu(rsp_params->options); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci return 0; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci/** 18662306a36Sopenharmony_ci * dpseci_set_rx_queue() - Set Rx queue configuration 18762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 18862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 18962306a36Sopenharmony_ci * @token: Token of DPSECI object 19062306a36Sopenharmony_ci * @queue: Select the queue relative to number of priorities configured at 19162306a36Sopenharmony_ci * DPSECI creation; use DPSECI_ALL_QUEUES to configure all 19262306a36Sopenharmony_ci * Rx queues identically. 19362306a36Sopenharmony_ci * @cfg: Rx queue configuration 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 19662306a36Sopenharmony_ci */ 19762306a36Sopenharmony_ciint dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 19862306a36Sopenharmony_ci u8 queue, const struct dpseci_rx_queue_cfg *cfg) 19962306a36Sopenharmony_ci{ 20062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 20162306a36Sopenharmony_ci struct dpseci_cmd_queue *cmd_params; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_SET_RX_QUEUE, 20462306a36Sopenharmony_ci cmd_flags, 20562306a36Sopenharmony_ci token); 20662306a36Sopenharmony_ci cmd_params = (struct dpseci_cmd_queue *)cmd.params; 20762306a36Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 20862306a36Sopenharmony_ci cmd_params->priority = cfg->dest_cfg.priority; 20962306a36Sopenharmony_ci cmd_params->queue = queue; 21062306a36Sopenharmony_ci dpseci_set_field(cmd_params->dest_type, DEST_TYPE, 21162306a36Sopenharmony_ci cfg->dest_cfg.dest_type); 21262306a36Sopenharmony_ci cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); 21362306a36Sopenharmony_ci cmd_params->options = cpu_to_le32(cfg->options); 21462306a36Sopenharmony_ci dpseci_set_field(cmd_params->order_preservation_en, ORDER_PRESERVATION, 21562306a36Sopenharmony_ci cfg->order_preservation_en); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci/** 22162306a36Sopenharmony_ci * dpseci_get_rx_queue() - Retrieve Rx queue attributes 22262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 22362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 22462306a36Sopenharmony_ci * @token: Token of DPSECI object 22562306a36Sopenharmony_ci * @queue: Select the queue relative to number of priorities configured at 22662306a36Sopenharmony_ci * DPSECI creation 22762306a36Sopenharmony_ci * @attr: Returned Rx queue attributes 22862306a36Sopenharmony_ci * 22962306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 23062306a36Sopenharmony_ci */ 23162306a36Sopenharmony_ciint dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 23262306a36Sopenharmony_ci u8 queue, struct dpseci_rx_queue_attr *attr) 23362306a36Sopenharmony_ci{ 23462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 23562306a36Sopenharmony_ci struct dpseci_cmd_queue *cmd_params; 23662306a36Sopenharmony_ci int err; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE, 23962306a36Sopenharmony_ci cmd_flags, 24062306a36Sopenharmony_ci token); 24162306a36Sopenharmony_ci cmd_params = (struct dpseci_cmd_queue *)cmd.params; 24262306a36Sopenharmony_ci cmd_params->queue = queue; 24362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 24462306a36Sopenharmony_ci if (err) 24562306a36Sopenharmony_ci return err; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id); 24862306a36Sopenharmony_ci attr->dest_cfg.priority = cmd_params->priority; 24962306a36Sopenharmony_ci attr->dest_cfg.dest_type = dpseci_get_field(cmd_params->dest_type, 25062306a36Sopenharmony_ci DEST_TYPE); 25162306a36Sopenharmony_ci attr->user_ctx = le64_to_cpu(cmd_params->user_ctx); 25262306a36Sopenharmony_ci attr->fqid = le32_to_cpu(cmd_params->fqid); 25362306a36Sopenharmony_ci attr->order_preservation_en = 25462306a36Sopenharmony_ci dpseci_get_field(cmd_params->order_preservation_en, 25562306a36Sopenharmony_ci ORDER_PRESERVATION); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci return 0; 25862306a36Sopenharmony_ci} 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci/** 26162306a36Sopenharmony_ci * dpseci_get_tx_queue() - Retrieve Tx queue attributes 26262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 26362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 26462306a36Sopenharmony_ci * @token: Token of DPSECI object 26562306a36Sopenharmony_ci * @queue: Select the queue relative to number of priorities configured at 26662306a36Sopenharmony_ci * DPSECI creation 26762306a36Sopenharmony_ci * @attr: Returned Tx queue attributes 26862306a36Sopenharmony_ci * 26962306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 27062306a36Sopenharmony_ci */ 27162306a36Sopenharmony_ciint dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 27262306a36Sopenharmony_ci u8 queue, struct dpseci_tx_queue_attr *attr) 27362306a36Sopenharmony_ci{ 27462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 27562306a36Sopenharmony_ci struct dpseci_cmd_queue *cmd_params; 27662306a36Sopenharmony_ci struct dpseci_rsp_get_tx_queue *rsp_params; 27762306a36Sopenharmony_ci int err; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE, 28062306a36Sopenharmony_ci cmd_flags, 28162306a36Sopenharmony_ci token); 28262306a36Sopenharmony_ci cmd_params = (struct dpseci_cmd_queue *)cmd.params; 28362306a36Sopenharmony_ci cmd_params->queue = queue; 28462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 28562306a36Sopenharmony_ci if (err) 28662306a36Sopenharmony_ci return err; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_tx_queue *)cmd.params; 28962306a36Sopenharmony_ci attr->fqid = le32_to_cpu(rsp_params->fqid); 29062306a36Sopenharmony_ci attr->priority = rsp_params->priority; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci return 0; 29362306a36Sopenharmony_ci} 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci/** 29662306a36Sopenharmony_ci * dpseci_get_sec_attr() - Retrieve SEC accelerator attributes 29762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 29862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 29962306a36Sopenharmony_ci * @token: Token of DPSECI object 30062306a36Sopenharmony_ci * @attr: Returned SEC attributes 30162306a36Sopenharmony_ci * 30262306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 30362306a36Sopenharmony_ci */ 30462306a36Sopenharmony_ciint dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 30562306a36Sopenharmony_ci struct dpseci_sec_attr *attr) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 30862306a36Sopenharmony_ci struct dpseci_rsp_get_sec_attr *rsp_params; 30962306a36Sopenharmony_ci int err; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_SEC_ATTR, 31262306a36Sopenharmony_ci cmd_flags, 31362306a36Sopenharmony_ci token); 31462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 31562306a36Sopenharmony_ci if (err) 31662306a36Sopenharmony_ci return err; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_sec_attr *)cmd.params; 31962306a36Sopenharmony_ci attr->ip_id = le16_to_cpu(rsp_params->ip_id); 32062306a36Sopenharmony_ci attr->major_rev = rsp_params->major_rev; 32162306a36Sopenharmony_ci attr->minor_rev = rsp_params->minor_rev; 32262306a36Sopenharmony_ci attr->era = rsp_params->era; 32362306a36Sopenharmony_ci attr->deco_num = rsp_params->deco_num; 32462306a36Sopenharmony_ci attr->zuc_auth_acc_num = rsp_params->zuc_auth_acc_num; 32562306a36Sopenharmony_ci attr->zuc_enc_acc_num = rsp_params->zuc_enc_acc_num; 32662306a36Sopenharmony_ci attr->snow_f8_acc_num = rsp_params->snow_f8_acc_num; 32762306a36Sopenharmony_ci attr->snow_f9_acc_num = rsp_params->snow_f9_acc_num; 32862306a36Sopenharmony_ci attr->crc_acc_num = rsp_params->crc_acc_num; 32962306a36Sopenharmony_ci attr->pk_acc_num = rsp_params->pk_acc_num; 33062306a36Sopenharmony_ci attr->kasumi_acc_num = rsp_params->kasumi_acc_num; 33162306a36Sopenharmony_ci attr->rng_acc_num = rsp_params->rng_acc_num; 33262306a36Sopenharmony_ci attr->md_acc_num = rsp_params->md_acc_num; 33362306a36Sopenharmony_ci attr->arc4_acc_num = rsp_params->arc4_acc_num; 33462306a36Sopenharmony_ci attr->des_acc_num = rsp_params->des_acc_num; 33562306a36Sopenharmony_ci attr->aes_acc_num = rsp_params->aes_acc_num; 33662306a36Sopenharmony_ci attr->ccha_acc_num = rsp_params->ccha_acc_num; 33762306a36Sopenharmony_ci attr->ptha_acc_num = rsp_params->ptha_acc_num; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci return 0; 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci/** 34362306a36Sopenharmony_ci * dpseci_get_api_version() - Get Data Path SEC Interface API version 34462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 34562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 34662306a36Sopenharmony_ci * @major_ver: Major version of data path sec API 34762306a36Sopenharmony_ci * @minor_ver: Minor version of data path sec API 34862306a36Sopenharmony_ci * 34962306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 35062306a36Sopenharmony_ci */ 35162306a36Sopenharmony_ciint dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, 35262306a36Sopenharmony_ci u16 *major_ver, u16 *minor_ver) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 35562306a36Sopenharmony_ci struct dpseci_rsp_get_api_version *rsp_params; 35662306a36Sopenharmony_ci int err; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_API_VERSION, 35962306a36Sopenharmony_ci cmd_flags, 0); 36062306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 36162306a36Sopenharmony_ci if (err) 36262306a36Sopenharmony_ci return err; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_api_version *)cmd.params; 36562306a36Sopenharmony_ci *major_ver = le16_to_cpu(rsp_params->major); 36662306a36Sopenharmony_ci *minor_ver = le16_to_cpu(rsp_params->minor); 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci return 0; 36962306a36Sopenharmony_ci} 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci/** 37262306a36Sopenharmony_ci * dpseci_set_congestion_notification() - Set congestion group 37362306a36Sopenharmony_ci * notification configuration 37462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 37562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 37662306a36Sopenharmony_ci * @token: Token of DPSECI object 37762306a36Sopenharmony_ci * @cfg: congestion notification configuration 37862306a36Sopenharmony_ci * 37962306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 38062306a36Sopenharmony_ci */ 38162306a36Sopenharmony_ciint dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, 38262306a36Sopenharmony_ci u16 token, const struct dpseci_congestion_notification_cfg *cfg) 38362306a36Sopenharmony_ci{ 38462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 38562306a36Sopenharmony_ci struct dpseci_cmd_congestion_notification *cmd_params; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header( 38862306a36Sopenharmony_ci DPSECI_CMDID_SET_CONGESTION_NOTIFICATION, 38962306a36Sopenharmony_ci cmd_flags, 39062306a36Sopenharmony_ci token); 39162306a36Sopenharmony_ci cmd_params = (struct dpseci_cmd_congestion_notification *)cmd.params; 39262306a36Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 39362306a36Sopenharmony_ci cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode); 39462306a36Sopenharmony_ci cmd_params->priority = cfg->dest_cfg.priority; 39562306a36Sopenharmony_ci dpseci_set_field(cmd_params->options, CGN_DEST_TYPE, 39662306a36Sopenharmony_ci cfg->dest_cfg.dest_type); 39762306a36Sopenharmony_ci dpseci_set_field(cmd_params->options, CGN_UNITS, cfg->units); 39862306a36Sopenharmony_ci cmd_params->message_iova = cpu_to_le64(cfg->message_iova); 39962306a36Sopenharmony_ci cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx); 40062306a36Sopenharmony_ci cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry); 40162306a36Sopenharmony_ci cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit); 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 40462306a36Sopenharmony_ci} 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci/** 40762306a36Sopenharmony_ci * dpseci_get_congestion_notification() - Get congestion group notification 40862306a36Sopenharmony_ci * configuration 40962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 41062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 41162306a36Sopenharmony_ci * @token: Token of DPSECI object 41262306a36Sopenharmony_ci * @cfg: congestion notification configuration 41362306a36Sopenharmony_ci * 41462306a36Sopenharmony_ci * Return: '0' on success, error code otherwise 41562306a36Sopenharmony_ci */ 41662306a36Sopenharmony_ciint dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, 41762306a36Sopenharmony_ci u16 token, struct dpseci_congestion_notification_cfg *cfg) 41862306a36Sopenharmony_ci{ 41962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 42062306a36Sopenharmony_ci struct dpseci_cmd_congestion_notification *rsp_params; 42162306a36Sopenharmony_ci int err; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header( 42462306a36Sopenharmony_ci DPSECI_CMDID_GET_CONGESTION_NOTIFICATION, 42562306a36Sopenharmony_ci cmd_flags, 42662306a36Sopenharmony_ci token); 42762306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 42862306a36Sopenharmony_ci if (err) 42962306a36Sopenharmony_ci return err; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci rsp_params = (struct dpseci_cmd_congestion_notification *)cmd.params; 43262306a36Sopenharmony_ci cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id); 43362306a36Sopenharmony_ci cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode); 43462306a36Sopenharmony_ci cfg->dest_cfg.priority = rsp_params->priority; 43562306a36Sopenharmony_ci cfg->dest_cfg.dest_type = dpseci_get_field(rsp_params->options, 43662306a36Sopenharmony_ci CGN_DEST_TYPE); 43762306a36Sopenharmony_ci cfg->units = dpseci_get_field(rsp_params->options, CGN_UNITS); 43862306a36Sopenharmony_ci cfg->message_iova = le64_to_cpu(rsp_params->message_iova); 43962306a36Sopenharmony_ci cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx); 44062306a36Sopenharmony_ci cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry); 44162306a36Sopenharmony_ci cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci return 0; 44462306a36Sopenharmony_ci} 445