18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc. 48c2ecf20Sopenharmony_ci * Copyright 2017-2018 NXP 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/fsl/mc.h> 88c2ecf20Sopenharmony_ci#include "dpseci.h" 98c2ecf20Sopenharmony_ci#include "dpseci_cmd.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci/** 128c2ecf20Sopenharmony_ci * dpseci_open() - Open a control session for the specified object 138c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 148c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 158c2ecf20Sopenharmony_ci * @dpseci_id: DPSECI unique ID 168c2ecf20Sopenharmony_ci * @token: Returned token; use in subsequent API calls 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * This function can be used to open a control session for an already created 198c2ecf20Sopenharmony_ci * object; an object may have been declared statically in the DPL 208c2ecf20Sopenharmony_ci * or created dynamically. 218c2ecf20Sopenharmony_ci * This function returns a unique authentication token, associated with the 228c2ecf20Sopenharmony_ci * specific object ID and the specific MC portal; this token must be used in all 238c2ecf20Sopenharmony_ci * subsequent commands for this specific object. 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 268c2ecf20Sopenharmony_ci */ 278c2ecf20Sopenharmony_ciint dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id, 288c2ecf20Sopenharmony_ci u16 *token) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 318c2ecf20Sopenharmony_ci struct dpseci_cmd_open *cmd_params; 328c2ecf20Sopenharmony_ci int err; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_OPEN, 358c2ecf20Sopenharmony_ci cmd_flags, 368c2ecf20Sopenharmony_ci 0); 378c2ecf20Sopenharmony_ci cmd_params = (struct dpseci_cmd_open *)cmd.params; 388c2ecf20Sopenharmony_ci cmd_params->dpseci_id = cpu_to_le32(dpseci_id); 398c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 408c2ecf20Sopenharmony_ci if (err) 418c2ecf20Sopenharmony_ci return err; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci return 0; 468c2ecf20Sopenharmony_ci} 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci/** 498c2ecf20Sopenharmony_ci * dpseci_close() - Close the control session of the object 508c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 518c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 528c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 538c2ecf20Sopenharmony_ci * 548c2ecf20Sopenharmony_ci * After this function is called, no further operations are allowed on the 558c2ecf20Sopenharmony_ci * object without opening a new control session. 568c2ecf20Sopenharmony_ci * 578c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 588c2ecf20Sopenharmony_ci */ 598c2ecf20Sopenharmony_ciint dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 608c2ecf20Sopenharmony_ci{ 618c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_CLOSE, 648c2ecf20Sopenharmony_ci cmd_flags, 658c2ecf20Sopenharmony_ci token); 668c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 678c2ecf20Sopenharmony_ci} 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci/** 708c2ecf20Sopenharmony_ci * dpseci_enable() - Enable the DPSECI, allow sending and receiving frames 718c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 728c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 738c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 748c2ecf20Sopenharmony_ci * 758c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 768c2ecf20Sopenharmony_ci */ 778c2ecf20Sopenharmony_ciint dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 788c2ecf20Sopenharmony_ci{ 798c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_ENABLE, 828c2ecf20Sopenharmony_ci cmd_flags, 838c2ecf20Sopenharmony_ci token); 848c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 858c2ecf20Sopenharmony_ci} 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci/** 888c2ecf20Sopenharmony_ci * dpseci_disable() - Disable the DPSECI, stop sending and receiving frames 898c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 908c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 918c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 928c2ecf20Sopenharmony_ci * 938c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 948c2ecf20Sopenharmony_ci */ 958c2ecf20Sopenharmony_ciint dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 968c2ecf20Sopenharmony_ci{ 978c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_DISABLE, 1008c2ecf20Sopenharmony_ci cmd_flags, 1018c2ecf20Sopenharmony_ci token); 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 1048c2ecf20Sopenharmony_ci} 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci/** 1078c2ecf20Sopenharmony_ci * dpseci_reset() - Reset the DPSECI, returns the object to initial state 1088c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1098c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1108c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 1118c2ecf20Sopenharmony_ci * 1128c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 1138c2ecf20Sopenharmony_ci */ 1148c2ecf20Sopenharmony_ciint dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 1158c2ecf20Sopenharmony_ci{ 1168c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET, 1198c2ecf20Sopenharmony_ci cmd_flags, 1208c2ecf20Sopenharmony_ci token); 1218c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 1228c2ecf20Sopenharmony_ci} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci/** 1258c2ecf20Sopenharmony_ci * dpseci_is_enabled() - Check if the DPSECI is enabled. 1268c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1278c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1288c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 1298c2ecf20Sopenharmony_ci * @en: Returns '1' if object is enabled; '0' otherwise 1308c2ecf20Sopenharmony_ci * 1318c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 1328c2ecf20Sopenharmony_ci */ 1338c2ecf20Sopenharmony_ciint dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 1348c2ecf20Sopenharmony_ci int *en) 1358c2ecf20Sopenharmony_ci{ 1368c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 1378c2ecf20Sopenharmony_ci struct dpseci_rsp_is_enabled *rsp_params; 1388c2ecf20Sopenharmony_ci int err; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_IS_ENABLED, 1418c2ecf20Sopenharmony_ci cmd_flags, 1428c2ecf20Sopenharmony_ci token); 1438c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 1448c2ecf20Sopenharmony_ci if (err) 1458c2ecf20Sopenharmony_ci return err; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci rsp_params = (struct dpseci_rsp_is_enabled *)cmd.params; 1488c2ecf20Sopenharmony_ci *en = dpseci_get_field(rsp_params->is_enabled, ENABLE); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci return 0; 1518c2ecf20Sopenharmony_ci} 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci/** 1548c2ecf20Sopenharmony_ci * dpseci_get_attributes() - Retrieve DPSECI attributes 1558c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1568c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1578c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 1588c2ecf20Sopenharmony_ci * @attr: Returned object's attributes 1598c2ecf20Sopenharmony_ci * 1608c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 1618c2ecf20Sopenharmony_ci */ 1628c2ecf20Sopenharmony_ciint dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 1638c2ecf20Sopenharmony_ci struct dpseci_attr *attr) 1648c2ecf20Sopenharmony_ci{ 1658c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 1668c2ecf20Sopenharmony_ci struct dpseci_rsp_get_attributes *rsp_params; 1678c2ecf20Sopenharmony_ci int err; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_ATTR, 1708c2ecf20Sopenharmony_ci cmd_flags, 1718c2ecf20Sopenharmony_ci token); 1728c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 1738c2ecf20Sopenharmony_ci if (err) 1748c2ecf20Sopenharmony_ci return err; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_attributes *)cmd.params; 1778c2ecf20Sopenharmony_ci attr->id = le32_to_cpu(rsp_params->id); 1788c2ecf20Sopenharmony_ci attr->num_tx_queues = rsp_params->num_tx_queues; 1798c2ecf20Sopenharmony_ci attr->num_rx_queues = rsp_params->num_rx_queues; 1808c2ecf20Sopenharmony_ci attr->options = le32_to_cpu(rsp_params->options); 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci return 0; 1838c2ecf20Sopenharmony_ci} 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci/** 1868c2ecf20Sopenharmony_ci * dpseci_set_rx_queue() - Set Rx queue configuration 1878c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1888c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1898c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 1908c2ecf20Sopenharmony_ci * @queue: Select the queue relative to number of priorities configured at 1918c2ecf20Sopenharmony_ci * DPSECI creation; use DPSECI_ALL_QUEUES to configure all 1928c2ecf20Sopenharmony_ci * Rx queues identically. 1938c2ecf20Sopenharmony_ci * @cfg: Rx queue configuration 1948c2ecf20Sopenharmony_ci * 1958c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 1968c2ecf20Sopenharmony_ci */ 1978c2ecf20Sopenharmony_ciint dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 1988c2ecf20Sopenharmony_ci u8 queue, const struct dpseci_rx_queue_cfg *cfg) 1998c2ecf20Sopenharmony_ci{ 2008c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 2018c2ecf20Sopenharmony_ci struct dpseci_cmd_queue *cmd_params; 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_SET_RX_QUEUE, 2048c2ecf20Sopenharmony_ci cmd_flags, 2058c2ecf20Sopenharmony_ci token); 2068c2ecf20Sopenharmony_ci cmd_params = (struct dpseci_cmd_queue *)cmd.params; 2078c2ecf20Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 2088c2ecf20Sopenharmony_ci cmd_params->priority = cfg->dest_cfg.priority; 2098c2ecf20Sopenharmony_ci cmd_params->queue = queue; 2108c2ecf20Sopenharmony_ci dpseci_set_field(cmd_params->dest_type, DEST_TYPE, 2118c2ecf20Sopenharmony_ci cfg->dest_cfg.dest_type); 2128c2ecf20Sopenharmony_ci cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); 2138c2ecf20Sopenharmony_ci cmd_params->options = cpu_to_le32(cfg->options); 2148c2ecf20Sopenharmony_ci dpseci_set_field(cmd_params->order_preservation_en, ORDER_PRESERVATION, 2158c2ecf20Sopenharmony_ci cfg->order_preservation_en); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 2188c2ecf20Sopenharmony_ci} 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci/** 2218c2ecf20Sopenharmony_ci * dpseci_get_rx_queue() - Retrieve Rx queue attributes 2228c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 2238c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2248c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 2258c2ecf20Sopenharmony_ci * @queue: Select the queue relative to number of priorities configured at 2268c2ecf20Sopenharmony_ci * DPSECI creation 2278c2ecf20Sopenharmony_ci * @attr: Returned Rx queue attributes 2288c2ecf20Sopenharmony_ci * 2298c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 2308c2ecf20Sopenharmony_ci */ 2318c2ecf20Sopenharmony_ciint dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 2328c2ecf20Sopenharmony_ci u8 queue, struct dpseci_rx_queue_attr *attr) 2338c2ecf20Sopenharmony_ci{ 2348c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 2358c2ecf20Sopenharmony_ci struct dpseci_cmd_queue *cmd_params; 2368c2ecf20Sopenharmony_ci int err; 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE, 2398c2ecf20Sopenharmony_ci cmd_flags, 2408c2ecf20Sopenharmony_ci token); 2418c2ecf20Sopenharmony_ci cmd_params = (struct dpseci_cmd_queue *)cmd.params; 2428c2ecf20Sopenharmony_ci cmd_params->queue = queue; 2438c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 2448c2ecf20Sopenharmony_ci if (err) 2458c2ecf20Sopenharmony_ci return err; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id); 2488c2ecf20Sopenharmony_ci attr->dest_cfg.priority = cmd_params->priority; 2498c2ecf20Sopenharmony_ci attr->dest_cfg.dest_type = dpseci_get_field(cmd_params->dest_type, 2508c2ecf20Sopenharmony_ci DEST_TYPE); 2518c2ecf20Sopenharmony_ci attr->user_ctx = le64_to_cpu(cmd_params->user_ctx); 2528c2ecf20Sopenharmony_ci attr->fqid = le32_to_cpu(cmd_params->fqid); 2538c2ecf20Sopenharmony_ci attr->order_preservation_en = 2548c2ecf20Sopenharmony_ci dpseci_get_field(cmd_params->order_preservation_en, 2558c2ecf20Sopenharmony_ci ORDER_PRESERVATION); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci return 0; 2588c2ecf20Sopenharmony_ci} 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci/** 2618c2ecf20Sopenharmony_ci * dpseci_get_tx_queue() - Retrieve Tx queue attributes 2628c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 2638c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2648c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 2658c2ecf20Sopenharmony_ci * @queue: Select the queue relative to number of priorities configured at 2668c2ecf20Sopenharmony_ci * DPSECI creation 2678c2ecf20Sopenharmony_ci * @attr: Returned Tx queue attributes 2688c2ecf20Sopenharmony_ci * 2698c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 2708c2ecf20Sopenharmony_ci */ 2718c2ecf20Sopenharmony_ciint dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 2728c2ecf20Sopenharmony_ci u8 queue, struct dpseci_tx_queue_attr *attr) 2738c2ecf20Sopenharmony_ci{ 2748c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 2758c2ecf20Sopenharmony_ci struct dpseci_cmd_queue *cmd_params; 2768c2ecf20Sopenharmony_ci struct dpseci_rsp_get_tx_queue *rsp_params; 2778c2ecf20Sopenharmony_ci int err; 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE, 2808c2ecf20Sopenharmony_ci cmd_flags, 2818c2ecf20Sopenharmony_ci token); 2828c2ecf20Sopenharmony_ci cmd_params = (struct dpseci_cmd_queue *)cmd.params; 2838c2ecf20Sopenharmony_ci cmd_params->queue = queue; 2848c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 2858c2ecf20Sopenharmony_ci if (err) 2868c2ecf20Sopenharmony_ci return err; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_tx_queue *)cmd.params; 2898c2ecf20Sopenharmony_ci attr->fqid = le32_to_cpu(rsp_params->fqid); 2908c2ecf20Sopenharmony_ci attr->priority = rsp_params->priority; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci return 0; 2938c2ecf20Sopenharmony_ci} 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci/** 2968c2ecf20Sopenharmony_ci * dpseci_get_sec_attr() - Retrieve SEC accelerator attributes 2978c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 2988c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2998c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 3008c2ecf20Sopenharmony_ci * @attr: Returned SEC attributes 3018c2ecf20Sopenharmony_ci * 3028c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 3038c2ecf20Sopenharmony_ci */ 3048c2ecf20Sopenharmony_ciint dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 3058c2ecf20Sopenharmony_ci struct dpseci_sec_attr *attr) 3068c2ecf20Sopenharmony_ci{ 3078c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3088c2ecf20Sopenharmony_ci struct dpseci_rsp_get_sec_attr *rsp_params; 3098c2ecf20Sopenharmony_ci int err; 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_SEC_ATTR, 3128c2ecf20Sopenharmony_ci cmd_flags, 3138c2ecf20Sopenharmony_ci token); 3148c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 3158c2ecf20Sopenharmony_ci if (err) 3168c2ecf20Sopenharmony_ci return err; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_sec_attr *)cmd.params; 3198c2ecf20Sopenharmony_ci attr->ip_id = le16_to_cpu(rsp_params->ip_id); 3208c2ecf20Sopenharmony_ci attr->major_rev = rsp_params->major_rev; 3218c2ecf20Sopenharmony_ci attr->minor_rev = rsp_params->minor_rev; 3228c2ecf20Sopenharmony_ci attr->era = rsp_params->era; 3238c2ecf20Sopenharmony_ci attr->deco_num = rsp_params->deco_num; 3248c2ecf20Sopenharmony_ci attr->zuc_auth_acc_num = rsp_params->zuc_auth_acc_num; 3258c2ecf20Sopenharmony_ci attr->zuc_enc_acc_num = rsp_params->zuc_enc_acc_num; 3268c2ecf20Sopenharmony_ci attr->snow_f8_acc_num = rsp_params->snow_f8_acc_num; 3278c2ecf20Sopenharmony_ci attr->snow_f9_acc_num = rsp_params->snow_f9_acc_num; 3288c2ecf20Sopenharmony_ci attr->crc_acc_num = rsp_params->crc_acc_num; 3298c2ecf20Sopenharmony_ci attr->pk_acc_num = rsp_params->pk_acc_num; 3308c2ecf20Sopenharmony_ci attr->kasumi_acc_num = rsp_params->kasumi_acc_num; 3318c2ecf20Sopenharmony_ci attr->rng_acc_num = rsp_params->rng_acc_num; 3328c2ecf20Sopenharmony_ci attr->md_acc_num = rsp_params->md_acc_num; 3338c2ecf20Sopenharmony_ci attr->arc4_acc_num = rsp_params->arc4_acc_num; 3348c2ecf20Sopenharmony_ci attr->des_acc_num = rsp_params->des_acc_num; 3358c2ecf20Sopenharmony_ci attr->aes_acc_num = rsp_params->aes_acc_num; 3368c2ecf20Sopenharmony_ci attr->ccha_acc_num = rsp_params->ccha_acc_num; 3378c2ecf20Sopenharmony_ci attr->ptha_acc_num = rsp_params->ptha_acc_num; 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci return 0; 3408c2ecf20Sopenharmony_ci} 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci/** 3438c2ecf20Sopenharmony_ci * dpseci_get_api_version() - Get Data Path SEC Interface API version 3448c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 3458c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3468c2ecf20Sopenharmony_ci * @major_ver: Major version of data path sec API 3478c2ecf20Sopenharmony_ci * @minor_ver: Minor version of data path sec API 3488c2ecf20Sopenharmony_ci * 3498c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 3508c2ecf20Sopenharmony_ci */ 3518c2ecf20Sopenharmony_ciint dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, 3528c2ecf20Sopenharmony_ci u16 *major_ver, u16 *minor_ver) 3538c2ecf20Sopenharmony_ci{ 3548c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3558c2ecf20Sopenharmony_ci struct dpseci_rsp_get_api_version *rsp_params; 3568c2ecf20Sopenharmony_ci int err; 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_API_VERSION, 3598c2ecf20Sopenharmony_ci cmd_flags, 0); 3608c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 3618c2ecf20Sopenharmony_ci if (err) 3628c2ecf20Sopenharmony_ci return err; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci rsp_params = (struct dpseci_rsp_get_api_version *)cmd.params; 3658c2ecf20Sopenharmony_ci *major_ver = le16_to_cpu(rsp_params->major); 3668c2ecf20Sopenharmony_ci *minor_ver = le16_to_cpu(rsp_params->minor); 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci return 0; 3698c2ecf20Sopenharmony_ci} 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci/** 3728c2ecf20Sopenharmony_ci * dpseci_set_congestion_notification() - Set congestion group 3738c2ecf20Sopenharmony_ci * notification configuration 3748c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 3758c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 3768c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 3778c2ecf20Sopenharmony_ci * @cfg: congestion notification configuration 3788c2ecf20Sopenharmony_ci * 3798c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 3808c2ecf20Sopenharmony_ci */ 3818c2ecf20Sopenharmony_ciint dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, 3828c2ecf20Sopenharmony_ci u16 token, const struct dpseci_congestion_notification_cfg *cfg) 3838c2ecf20Sopenharmony_ci{ 3848c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3858c2ecf20Sopenharmony_ci struct dpseci_cmd_congestion_notification *cmd_params; 3868c2ecf20Sopenharmony_ci 3878c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header( 3888c2ecf20Sopenharmony_ci DPSECI_CMDID_SET_CONGESTION_NOTIFICATION, 3898c2ecf20Sopenharmony_ci cmd_flags, 3908c2ecf20Sopenharmony_ci token); 3918c2ecf20Sopenharmony_ci cmd_params = (struct dpseci_cmd_congestion_notification *)cmd.params; 3928c2ecf20Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 3938c2ecf20Sopenharmony_ci cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode); 3948c2ecf20Sopenharmony_ci cmd_params->priority = cfg->dest_cfg.priority; 3958c2ecf20Sopenharmony_ci dpseci_set_field(cmd_params->options, CGN_DEST_TYPE, 3968c2ecf20Sopenharmony_ci cfg->dest_cfg.dest_type); 3978c2ecf20Sopenharmony_ci dpseci_set_field(cmd_params->options, CGN_UNITS, cfg->units); 3988c2ecf20Sopenharmony_ci cmd_params->message_iova = cpu_to_le64(cfg->message_iova); 3998c2ecf20Sopenharmony_ci cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx); 4008c2ecf20Sopenharmony_ci cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry); 4018c2ecf20Sopenharmony_ci cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit); 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 4048c2ecf20Sopenharmony_ci} 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci/** 4078c2ecf20Sopenharmony_ci * dpseci_get_congestion_notification() - Get congestion group notification 4088c2ecf20Sopenharmony_ci * configuration 4098c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 4108c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 4118c2ecf20Sopenharmony_ci * @token: Token of DPSECI object 4128c2ecf20Sopenharmony_ci * @cfg: congestion notification configuration 4138c2ecf20Sopenharmony_ci * 4148c2ecf20Sopenharmony_ci * Return: '0' on success, error code otherwise 4158c2ecf20Sopenharmony_ci */ 4168c2ecf20Sopenharmony_ciint dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, 4178c2ecf20Sopenharmony_ci u16 token, struct dpseci_congestion_notification_cfg *cfg) 4188c2ecf20Sopenharmony_ci{ 4198c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 4208c2ecf20Sopenharmony_ci struct dpseci_cmd_congestion_notification *rsp_params; 4218c2ecf20Sopenharmony_ci int err; 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header( 4248c2ecf20Sopenharmony_ci DPSECI_CMDID_GET_CONGESTION_NOTIFICATION, 4258c2ecf20Sopenharmony_ci cmd_flags, 4268c2ecf20Sopenharmony_ci token); 4278c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 4288c2ecf20Sopenharmony_ci if (err) 4298c2ecf20Sopenharmony_ci return err; 4308c2ecf20Sopenharmony_ci 4318c2ecf20Sopenharmony_ci rsp_params = (struct dpseci_cmd_congestion_notification *)cmd.params; 4328c2ecf20Sopenharmony_ci cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id); 4338c2ecf20Sopenharmony_ci cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode); 4348c2ecf20Sopenharmony_ci cfg->dest_cfg.priority = rsp_params->priority; 4358c2ecf20Sopenharmony_ci cfg->dest_cfg.dest_type = dpseci_get_field(rsp_params->options, 4368c2ecf20Sopenharmony_ci CGN_DEST_TYPE); 4378c2ecf20Sopenharmony_ci cfg->units = dpseci_get_field(rsp_params->options, CGN_UNITS); 4388c2ecf20Sopenharmony_ci cfg->message_iova = le64_to_cpu(rsp_params->message_iova); 4398c2ecf20Sopenharmony_ci cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx); 4408c2ecf20Sopenharmony_ci cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry); 4418c2ecf20Sopenharmony_ci cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit); 4428c2ecf20Sopenharmony_ci 4438c2ecf20Sopenharmony_ci return 0; 4448c2ecf20Sopenharmony_ci} 445