162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#include <linux/kernel.h> 762306a36Sopenharmony_ci#include <linux/fsl/mc.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "fsl-mc-private.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/** 1262306a36Sopenharmony_ci * dpcon_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 * @dpcon_id: DPCON 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 1962306a36Sopenharmony_ci * already created object; an object may have been declared in 2062306a36Sopenharmony_ci * the DPL or by calling the dpcon_create() function. 2162306a36Sopenharmony_ci * This function returns a unique authentication token, 2262306a36Sopenharmony_ci * associated with the specific object ID and the specific MC 2362306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for 2462306a36Sopenharmony_ci * this specific object. 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ciint dpcon_open(struct fsl_mc_io *mc_io, 2962306a36Sopenharmony_ci u32 cmd_flags, 3062306a36Sopenharmony_ci int dpcon_id, 3162306a36Sopenharmony_ci u16 *token) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3462306a36Sopenharmony_ci struct dpcon_cmd_open *dpcon_cmd; 3562306a36Sopenharmony_ci int err; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci /* prepare command */ 3862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_OPEN, 3962306a36Sopenharmony_ci cmd_flags, 4062306a36Sopenharmony_ci 0); 4162306a36Sopenharmony_ci dpcon_cmd = (struct dpcon_cmd_open *)cmd.params; 4262306a36Sopenharmony_ci dpcon_cmd->dpcon_id = cpu_to_le32(dpcon_id); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci /* send command to mc*/ 4562306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 4662306a36Sopenharmony_ci if (err) 4762306a36Sopenharmony_ci return err; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci /* retrieve response parameters */ 5062306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_open); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/** 5762306a36Sopenharmony_ci * dpcon_close() - Close the control session of the object 5862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 5962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 6062306a36Sopenharmony_ci * @token: Token of DPCON object 6162306a36Sopenharmony_ci * 6262306a36Sopenharmony_ci * After this function is called, no further operations are 6362306a36Sopenharmony_ci * allowed on the object without opening a new control session. 6462306a36Sopenharmony_ci * 6562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_ciint dpcon_close(struct fsl_mc_io *mc_io, 6862306a36Sopenharmony_ci u32 cmd_flags, 6962306a36Sopenharmony_ci u16 token) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci /* prepare command */ 7462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLOSE, 7562306a36Sopenharmony_ci cmd_flags, 7662306a36Sopenharmony_ci token); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci /* send command to mc*/ 7962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_close); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/** 8462306a36Sopenharmony_ci * dpcon_enable() - Enable the DPCON 8562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 8662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 8762306a36Sopenharmony_ci * @token: Token of DPCON object 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_ciint dpcon_enable(struct fsl_mc_io *mc_io, 9262306a36Sopenharmony_ci u32 cmd_flags, 9362306a36Sopenharmony_ci u16 token) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci /* prepare command */ 9862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_ENABLE, 9962306a36Sopenharmony_ci cmd_flags, 10062306a36Sopenharmony_ci token); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* send command to mc*/ 10362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_enable); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/** 10862306a36Sopenharmony_ci * dpcon_disable() - Disable the DPCON 10962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 11062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 11162306a36Sopenharmony_ci * @token: Token of DPCON object 11262306a36Sopenharmony_ci * 11362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_ciint dpcon_disable(struct fsl_mc_io *mc_io, 11662306a36Sopenharmony_ci u32 cmd_flags, 11762306a36Sopenharmony_ci u16 token) 11862306a36Sopenharmony_ci{ 11962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci /* prepare command */ 12262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_DISABLE, 12362306a36Sopenharmony_ci cmd_flags, 12462306a36Sopenharmony_ci token); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci /* send command to mc*/ 12762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 12862306a36Sopenharmony_ci} 12962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_disable); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/** 13262306a36Sopenharmony_ci * dpcon_reset() - Reset the DPCON, returns the object to initial state. 13362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 13462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 13562306a36Sopenharmony_ci * @token: Token of DPCON object 13662306a36Sopenharmony_ci * 13762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 13862306a36Sopenharmony_ci */ 13962306a36Sopenharmony_ciint dpcon_reset(struct fsl_mc_io *mc_io, 14062306a36Sopenharmony_ci u32 cmd_flags, 14162306a36Sopenharmony_ci u16 token) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* prepare command */ 14662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_RESET, 14762306a36Sopenharmony_ci cmd_flags, token); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* send command to mc*/ 15062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_reset); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/** 15562306a36Sopenharmony_ci * dpcon_get_attributes() - Retrieve DPCON attributes. 15662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 15762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15862306a36Sopenharmony_ci * @token: Token of DPCON object 15962306a36Sopenharmony_ci * @attr: Object's attributes 16062306a36Sopenharmony_ci * 16162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 16262306a36Sopenharmony_ci */ 16362306a36Sopenharmony_ciint dpcon_get_attributes(struct fsl_mc_io *mc_io, 16462306a36Sopenharmony_ci u32 cmd_flags, 16562306a36Sopenharmony_ci u16 token, 16662306a36Sopenharmony_ci struct dpcon_attr *attr) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 16962306a36Sopenharmony_ci struct dpcon_rsp_get_attr *dpcon_rsp; 17062306a36Sopenharmony_ci int err; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* prepare command */ 17362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_ATTR, 17462306a36Sopenharmony_ci cmd_flags, 17562306a36Sopenharmony_ci token); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* send command to mc*/ 17862306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 17962306a36Sopenharmony_ci if (err) 18062306a36Sopenharmony_ci return err; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci /* retrieve response parameters */ 18362306a36Sopenharmony_ci dpcon_rsp = (struct dpcon_rsp_get_attr *)cmd.params; 18462306a36Sopenharmony_ci attr->id = le32_to_cpu(dpcon_rsp->id); 18562306a36Sopenharmony_ci attr->qbman_ch_id = le16_to_cpu(dpcon_rsp->qbman_ch_id); 18662306a36Sopenharmony_ci attr->num_priorities = dpcon_rsp->num_priorities; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci return 0; 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_get_attributes); 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/** 19362306a36Sopenharmony_ci * dpcon_set_notification() - Set DPCON notification destination 19462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 19562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 19662306a36Sopenharmony_ci * @token: Token of DPCON object 19762306a36Sopenharmony_ci * @cfg: Notification parameters 19862306a36Sopenharmony_ci * 19962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 20062306a36Sopenharmony_ci */ 20162306a36Sopenharmony_ciint dpcon_set_notification(struct fsl_mc_io *mc_io, 20262306a36Sopenharmony_ci u32 cmd_flags, 20362306a36Sopenharmony_ci u16 token, 20462306a36Sopenharmony_ci struct dpcon_notification_cfg *cfg) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 20762306a36Sopenharmony_ci struct dpcon_cmd_set_notification *dpcon_cmd; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* prepare command */ 21062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_NOTIFICATION, 21162306a36Sopenharmony_ci cmd_flags, 21262306a36Sopenharmony_ci token); 21362306a36Sopenharmony_ci dpcon_cmd = (struct dpcon_cmd_set_notification *)cmd.params; 21462306a36Sopenharmony_ci dpcon_cmd->dpio_id = cpu_to_le32(cfg->dpio_id); 21562306a36Sopenharmony_ci dpcon_cmd->priority = cfg->priority; 21662306a36Sopenharmony_ci dpcon_cmd->user_ctx = cpu_to_le64(cfg->user_ctx); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* send command to mc*/ 21962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 22062306a36Sopenharmony_ci} 22162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpcon_set_notification); 222