18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include <linux/kernel.h> 78c2ecf20Sopenharmony_ci#include <linux/fsl/mc.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include "fsl-mc-private.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci/** 128c2ecf20Sopenharmony_ci * dpcon_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 * @dpcon_id: DPCON 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 198c2ecf20Sopenharmony_ci * already created object; an object may have been declared in 208c2ecf20Sopenharmony_ci * the DPL or by calling the dpcon_create() function. 218c2ecf20Sopenharmony_ci * This function returns a unique authentication token, 228c2ecf20Sopenharmony_ci * associated with the specific object ID and the specific MC 238c2ecf20Sopenharmony_ci * portal; this token must be used in all subsequent commands for 248c2ecf20Sopenharmony_ci * this specific object. 258c2ecf20Sopenharmony_ci * 268c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ciint dpcon_open(struct fsl_mc_io *mc_io, 298c2ecf20Sopenharmony_ci u32 cmd_flags, 308c2ecf20Sopenharmony_ci int dpcon_id, 318c2ecf20Sopenharmony_ci u16 *token) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 348c2ecf20Sopenharmony_ci struct dpcon_cmd_open *dpcon_cmd; 358c2ecf20Sopenharmony_ci int err; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci /* prepare command */ 388c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_OPEN, 398c2ecf20Sopenharmony_ci cmd_flags, 408c2ecf20Sopenharmony_ci 0); 418c2ecf20Sopenharmony_ci dpcon_cmd = (struct dpcon_cmd_open *)cmd.params; 428c2ecf20Sopenharmony_ci dpcon_cmd->dpcon_id = cpu_to_le32(dpcon_id); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci /* send command to mc*/ 458c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 468c2ecf20Sopenharmony_ci if (err) 478c2ecf20Sopenharmony_ci return err; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci /* retrieve response parameters */ 508c2ecf20Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci return 0; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_open); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci/** 578c2ecf20Sopenharmony_ci * dpcon_close() - Close the control session of the object 588c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 598c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 608c2ecf20Sopenharmony_ci * @token: Token of DPCON object 618c2ecf20Sopenharmony_ci * 628c2ecf20Sopenharmony_ci * After this function is called, no further operations are 638c2ecf20Sopenharmony_ci * allowed on the object without opening a new control session. 648c2ecf20Sopenharmony_ci * 658c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 668c2ecf20Sopenharmony_ci */ 678c2ecf20Sopenharmony_ciint dpcon_close(struct fsl_mc_io *mc_io, 688c2ecf20Sopenharmony_ci u32 cmd_flags, 698c2ecf20Sopenharmony_ci u16 token) 708c2ecf20Sopenharmony_ci{ 718c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci /* prepare command */ 748c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLOSE, 758c2ecf20Sopenharmony_ci cmd_flags, 768c2ecf20Sopenharmony_ci token); 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci /* send command to mc*/ 798c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 808c2ecf20Sopenharmony_ci} 818c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_close); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci/** 848c2ecf20Sopenharmony_ci * dpcon_enable() - Enable the DPCON 858c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 868c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 878c2ecf20Sopenharmony_ci * @token: Token of DPCON object 888c2ecf20Sopenharmony_ci * 898c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise 908c2ecf20Sopenharmony_ci */ 918c2ecf20Sopenharmony_ciint dpcon_enable(struct fsl_mc_io *mc_io, 928c2ecf20Sopenharmony_ci u32 cmd_flags, 938c2ecf20Sopenharmony_ci u16 token) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci /* prepare command */ 988c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_ENABLE, 998c2ecf20Sopenharmony_ci cmd_flags, 1008c2ecf20Sopenharmony_ci token); 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci /* send command to mc*/ 1038c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 1048c2ecf20Sopenharmony_ci} 1058c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_enable); 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/** 1088c2ecf20Sopenharmony_ci * dpcon_disable() - Disable the DPCON 1098c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1108c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1118c2ecf20Sopenharmony_ci * @token: Token of DPCON object 1128c2ecf20Sopenharmony_ci * 1138c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise 1148c2ecf20Sopenharmony_ci */ 1158c2ecf20Sopenharmony_ciint dpcon_disable(struct fsl_mc_io *mc_io, 1168c2ecf20Sopenharmony_ci u32 cmd_flags, 1178c2ecf20Sopenharmony_ci u16 token) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci /* prepare command */ 1228c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_DISABLE, 1238c2ecf20Sopenharmony_ci cmd_flags, 1248c2ecf20Sopenharmony_ci token); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci /* send command to mc*/ 1278c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 1288c2ecf20Sopenharmony_ci} 1298c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_disable); 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci/** 1328c2ecf20Sopenharmony_ci * dpcon_reset() - Reset the DPCON, returns the object to initial state. 1338c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1348c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1358c2ecf20Sopenharmony_ci * @token: Token of DPCON object 1368c2ecf20Sopenharmony_ci * 1378c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 1388c2ecf20Sopenharmony_ci */ 1398c2ecf20Sopenharmony_ciint dpcon_reset(struct fsl_mc_io *mc_io, 1408c2ecf20Sopenharmony_ci u32 cmd_flags, 1418c2ecf20Sopenharmony_ci u16 token) 1428c2ecf20Sopenharmony_ci{ 1438c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci /* prepare command */ 1468c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_RESET, 1478c2ecf20Sopenharmony_ci cmd_flags, token); 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci /* send command to mc*/ 1508c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 1518c2ecf20Sopenharmony_ci} 1528c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_reset); 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci/** 1558c2ecf20Sopenharmony_ci * dpcon_get_attributes() - Retrieve DPCON attributes. 1568c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1578c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1588c2ecf20Sopenharmony_ci * @token: Token of DPCON object 1598c2ecf20Sopenharmony_ci * @attr: Object's attributes 1608c2ecf20Sopenharmony_ci * 1618c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 1628c2ecf20Sopenharmony_ci */ 1638c2ecf20Sopenharmony_ciint dpcon_get_attributes(struct fsl_mc_io *mc_io, 1648c2ecf20Sopenharmony_ci u32 cmd_flags, 1658c2ecf20Sopenharmony_ci u16 token, 1668c2ecf20Sopenharmony_ci struct dpcon_attr *attr) 1678c2ecf20Sopenharmony_ci{ 1688c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 1698c2ecf20Sopenharmony_ci struct dpcon_rsp_get_attr *dpcon_rsp; 1708c2ecf20Sopenharmony_ci int err; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci /* prepare command */ 1738c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_ATTR, 1748c2ecf20Sopenharmony_ci cmd_flags, 1758c2ecf20Sopenharmony_ci token); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci /* send command to mc*/ 1788c2ecf20Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 1798c2ecf20Sopenharmony_ci if (err) 1808c2ecf20Sopenharmony_ci return err; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci /* retrieve response parameters */ 1838c2ecf20Sopenharmony_ci dpcon_rsp = (struct dpcon_rsp_get_attr *)cmd.params; 1848c2ecf20Sopenharmony_ci attr->id = le32_to_cpu(dpcon_rsp->id); 1858c2ecf20Sopenharmony_ci attr->qbman_ch_id = le16_to_cpu(dpcon_rsp->qbman_ch_id); 1868c2ecf20Sopenharmony_ci attr->num_priorities = dpcon_rsp->num_priorities; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci return 0; 1898c2ecf20Sopenharmony_ci} 1908c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_get_attributes); 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/** 1938c2ecf20Sopenharmony_ci * dpcon_set_notification() - Set DPCON notification destination 1948c2ecf20Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1958c2ecf20Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1968c2ecf20Sopenharmony_ci * @token: Token of DPCON object 1978c2ecf20Sopenharmony_ci * @cfg: Notification parameters 1988c2ecf20Sopenharmony_ci * 1998c2ecf20Sopenharmony_ci * Return: '0' on Success; Error code otherwise 2008c2ecf20Sopenharmony_ci */ 2018c2ecf20Sopenharmony_ciint dpcon_set_notification(struct fsl_mc_io *mc_io, 2028c2ecf20Sopenharmony_ci u32 cmd_flags, 2038c2ecf20Sopenharmony_ci u16 token, 2048c2ecf20Sopenharmony_ci struct dpcon_notification_cfg *cfg) 2058c2ecf20Sopenharmony_ci{ 2068c2ecf20Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 2078c2ecf20Sopenharmony_ci struct dpcon_cmd_set_notification *dpcon_cmd; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci /* prepare command */ 2108c2ecf20Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_NOTIFICATION, 2118c2ecf20Sopenharmony_ci cmd_flags, 2128c2ecf20Sopenharmony_ci token); 2138c2ecf20Sopenharmony_ci dpcon_cmd = (struct dpcon_cmd_set_notification *)cmd.params; 2148c2ecf20Sopenharmony_ci dpcon_cmd->dpio_id = cpu_to_le32(cfg->dpio_id); 2158c2ecf20Sopenharmony_ci dpcon_cmd->priority = cfg->priority; 2168c2ecf20Sopenharmony_ci dpcon_cmd->user_ctx = cpu_to_le64(cfg->user_ctx); 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci /* send command to mc*/ 2198c2ecf20Sopenharmony_ci return mc_send_command(mc_io, &cmd); 2208c2ecf20Sopenharmony_ci} 2218c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_set_notification); 222