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 2016 NXP 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/kernel.h> 862306a36Sopenharmony_ci#include <linux/fsl/mc.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "dpio.h" 1162306a36Sopenharmony_ci#include "dpio-cmd.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 1462306a36Sopenharmony_ci * Data Path I/O Portal API 1562306a36Sopenharmony_ci * Contains initialization APIs and runtime control APIs for DPIO 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/** 1962306a36Sopenharmony_ci * dpio_open() - Open a control session for the specified object 2062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 2162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2262306a36Sopenharmony_ci * @dpio_id: DPIO unique ID 2362306a36Sopenharmony_ci * @token: Returned token; use in subsequent API calls 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * This function can be used to open a control session for an 2662306a36Sopenharmony_ci * already created object; an object may have been declared in 2762306a36Sopenharmony_ci * the DPL or by calling the dpio_create() function. 2862306a36Sopenharmony_ci * This function returns a unique authentication token, 2962306a36Sopenharmony_ci * associated with the specific object ID and the specific MC 3062306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for 3162306a36Sopenharmony_ci * this specific object. 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ciint dpio_open(struct fsl_mc_io *mc_io, 3662306a36Sopenharmony_ci u32 cmd_flags, 3762306a36Sopenharmony_ci int dpio_id, 3862306a36Sopenharmony_ci u16 *token) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 4162306a36Sopenharmony_ci struct dpio_cmd_open *dpio_cmd; 4262306a36Sopenharmony_ci int err; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci /* prepare command */ 4562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_OPEN, 4662306a36Sopenharmony_ci cmd_flags, 4762306a36Sopenharmony_ci 0); 4862306a36Sopenharmony_ci dpio_cmd = (struct dpio_cmd_open *)cmd.params; 4962306a36Sopenharmony_ci dpio_cmd->dpio_id = cpu_to_le32(dpio_id); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 5262306a36Sopenharmony_ci if (err) 5362306a36Sopenharmony_ci return err; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* retrieve response parameters */ 5662306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci return 0; 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/** 6262306a36Sopenharmony_ci * dpio_close() - Close the control session of the object 6362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 6462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 6562306a36Sopenharmony_ci * @token: Token of DPIO object 6662306a36Sopenharmony_ci * 6762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ciint dpio_close(struct fsl_mc_io *mc_io, 7062306a36Sopenharmony_ci u32 cmd_flags, 7162306a36Sopenharmony_ci u16 token) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* prepare command */ 7662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_CLOSE, 7762306a36Sopenharmony_ci cmd_flags, 7862306a36Sopenharmony_ci token); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/** 8462306a36Sopenharmony_ci * dpio_enable() - Enable the DPIO, allow I/O portal operations. 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 DPIO object 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_ciint dpio_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(DPIO_CMDID_ENABLE, 9962306a36Sopenharmony_ci cmd_flags, 10062306a36Sopenharmony_ci token); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/** 10662306a36Sopenharmony_ci * dpio_disable() - Disable the DPIO, stop any I/O portal operation. 10762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 10862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 10962306a36Sopenharmony_ci * @token: Token of DPIO object 11062306a36Sopenharmony_ci * 11162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 11262306a36Sopenharmony_ci */ 11362306a36Sopenharmony_ciint dpio_disable(struct fsl_mc_io *mc_io, 11462306a36Sopenharmony_ci u32 cmd_flags, 11562306a36Sopenharmony_ci u16 token) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci /* prepare command */ 12062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_DISABLE, 12162306a36Sopenharmony_ci cmd_flags, 12262306a36Sopenharmony_ci token); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 12562306a36Sopenharmony_ci} 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/** 12862306a36Sopenharmony_ci * dpio_get_attributes() - Retrieve DPIO attributes 12962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 13062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 13162306a36Sopenharmony_ci * @token: Token of DPIO object 13262306a36Sopenharmony_ci * @attr: Returned object's attributes 13362306a36Sopenharmony_ci * 13462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_ciint dpio_get_attributes(struct fsl_mc_io *mc_io, 13762306a36Sopenharmony_ci u32 cmd_flags, 13862306a36Sopenharmony_ci u16 token, 13962306a36Sopenharmony_ci struct dpio_attr *attr) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 14262306a36Sopenharmony_ci struct dpio_rsp_get_attr *dpio_rsp; 14362306a36Sopenharmony_ci int err; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* prepare command */ 14662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_ATTR, 14762306a36Sopenharmony_ci cmd_flags, 14862306a36Sopenharmony_ci token); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 15162306a36Sopenharmony_ci if (err) 15262306a36Sopenharmony_ci return err; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci /* retrieve response parameters */ 15562306a36Sopenharmony_ci dpio_rsp = (struct dpio_rsp_get_attr *)cmd.params; 15662306a36Sopenharmony_ci attr->id = le32_to_cpu(dpio_rsp->id); 15762306a36Sopenharmony_ci attr->qbman_portal_id = le16_to_cpu(dpio_rsp->qbman_portal_id); 15862306a36Sopenharmony_ci attr->num_priorities = dpio_rsp->num_priorities; 15962306a36Sopenharmony_ci attr->channel_mode = dpio_rsp->channel_mode & DPIO_CHANNEL_MODE_MASK; 16062306a36Sopenharmony_ci attr->qbman_portal_ce_offset = 16162306a36Sopenharmony_ci le64_to_cpu(dpio_rsp->qbman_portal_ce_addr); 16262306a36Sopenharmony_ci attr->qbman_portal_ci_offset = 16362306a36Sopenharmony_ci le64_to_cpu(dpio_rsp->qbman_portal_ci_addr); 16462306a36Sopenharmony_ci attr->qbman_version = le32_to_cpu(dpio_rsp->qbman_version); 16562306a36Sopenharmony_ci attr->clk = le32_to_cpu(dpio_rsp->clk); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci return 0; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ciint dpio_set_stashing_destination(struct fsl_mc_io *mc_io, 17162306a36Sopenharmony_ci u32 cmd_flags, 17262306a36Sopenharmony_ci u16 token, 17362306a36Sopenharmony_ci u8 sdest) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 17662306a36Sopenharmony_ci struct dpio_stashing_dest *dpio_cmd; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST, 17962306a36Sopenharmony_ci cmd_flags, token); 18062306a36Sopenharmony_ci dpio_cmd = (struct dpio_stashing_dest *)cmd.params; 18162306a36Sopenharmony_ci dpio_cmd->sdest = sdest; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/** 18762306a36Sopenharmony_ci * dpio_get_api_version - Get Data Path I/O API version 18862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's DPIO object 18962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 19062306a36Sopenharmony_ci * @major_ver: Major version of DPIO API 19162306a36Sopenharmony_ci * @minor_ver: Minor version of DPIO API 19262306a36Sopenharmony_ci * 19362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_ciint dpio_get_api_version(struct fsl_mc_io *mc_io, 19662306a36Sopenharmony_ci u32 cmd_flags, 19762306a36Sopenharmony_ci u16 *major_ver, 19862306a36Sopenharmony_ci u16 *minor_ver) 19962306a36Sopenharmony_ci{ 20062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 20162306a36Sopenharmony_ci int err; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci /* prepare command */ 20462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_API_VERSION, 20562306a36Sopenharmony_ci cmd_flags, 0); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 20862306a36Sopenharmony_ci if (err) 20962306a36Sopenharmony_ci return err; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci /* retrieve response parameters */ 21262306a36Sopenharmony_ci mc_cmd_read_api_version(&cmd, major_ver, minor_ver); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci return 0; 21562306a36Sopenharmony_ci} 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/** 21862306a36Sopenharmony_ci * dpio_reset() - Reset the DPIO, returns the object to initial state. 21962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 22062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 22162306a36Sopenharmony_ci * @token: Token of DPIO object 22262306a36Sopenharmony_ci * 22362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 22462306a36Sopenharmony_ci */ 22562306a36Sopenharmony_ciint dpio_reset(struct fsl_mc_io *mc_io, 22662306a36Sopenharmony_ci u32 cmd_flags, 22762306a36Sopenharmony_ci u16 token) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci /* prepare command */ 23262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPIO_CMDID_RESET, 23362306a36Sopenharmony_ci cmd_flags, 23462306a36Sopenharmony_ci token); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* send command to mc*/ 23762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 23862306a36Sopenharmony_ci} 239