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 * dpbp_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 * @dpbp_id: DPBP 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 dpbp_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 dpbp_open(struct fsl_mc_io *mc_io, 2962306a36Sopenharmony_ci u32 cmd_flags, 3062306a36Sopenharmony_ci int dpbp_id, 3162306a36Sopenharmony_ci u16 *token) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3462306a36Sopenharmony_ci struct dpbp_cmd_open *cmd_params; 3562306a36Sopenharmony_ci int err; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci /* prepare command */ 3862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN, 3962306a36Sopenharmony_ci cmd_flags, 0); 4062306a36Sopenharmony_ci cmd_params = (struct dpbp_cmd_open *)cmd.params; 4162306a36Sopenharmony_ci cmd_params->dpbp_id = cpu_to_le32(dpbp_id); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci /* send command to mc*/ 4462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 4562306a36Sopenharmony_ci if (err) 4662306a36Sopenharmony_ci return err; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci /* retrieve response parameters */ 4962306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return err; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpbp_open); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/** 5662306a36Sopenharmony_ci * dpbp_close() - Close the control session of the object 5762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 5862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 5962306a36Sopenharmony_ci * @token: Token of DPBP object 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * After this function is called, no further operations are 6262306a36Sopenharmony_ci * allowed on the object without opening a new control session. 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_ciint dpbp_close(struct fsl_mc_io *mc_io, 6762306a36Sopenharmony_ci u32 cmd_flags, 6862306a36Sopenharmony_ci u16 token) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci /* prepare command */ 7362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPBP_CMDID_CLOSE, cmd_flags, 7462306a36Sopenharmony_ci token); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci /* send command to mc*/ 7762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpbp_close); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/** 8262306a36Sopenharmony_ci * dpbp_enable() - Enable the DPBP. 8362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 8462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 8562306a36Sopenharmony_ci * @token: Token of DPBP object 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 8862306a36Sopenharmony_ci */ 8962306a36Sopenharmony_ciint dpbp_enable(struct fsl_mc_io *mc_io, 9062306a36Sopenharmony_ci u32 cmd_flags, 9162306a36Sopenharmony_ci u16 token) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci /* prepare command */ 9662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPBP_CMDID_ENABLE, cmd_flags, 9762306a36Sopenharmony_ci token); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* send command to mc*/ 10062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpbp_enable); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci/** 10562306a36Sopenharmony_ci * dpbp_disable() - Disable the DPBP. 10662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 10762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 10862306a36Sopenharmony_ci * @token: Token of DPBP object 10962306a36Sopenharmony_ci * 11062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_ciint dpbp_disable(struct fsl_mc_io *mc_io, 11362306a36Sopenharmony_ci u32 cmd_flags, 11462306a36Sopenharmony_ci u16 token) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* prepare command */ 11962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPBP_CMDID_DISABLE, 12062306a36Sopenharmony_ci cmd_flags, token); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* send command to mc*/ 12362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpbp_disable); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/** 12862306a36Sopenharmony_ci * dpbp_reset() - Reset the DPBP, returns the object to initial state. 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 DPBP object 13262306a36Sopenharmony_ci * 13362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 13462306a36Sopenharmony_ci */ 13562306a36Sopenharmony_ciint dpbp_reset(struct fsl_mc_io *mc_io, 13662306a36Sopenharmony_ci u32 cmd_flags, 13762306a36Sopenharmony_ci u16 token) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* prepare command */ 14262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPBP_CMDID_RESET, 14362306a36Sopenharmony_ci cmd_flags, token); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* send command to mc*/ 14662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpbp_reset); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci/** 15162306a36Sopenharmony_ci * dpbp_get_attributes - Retrieve DPBP attributes. 15262306a36Sopenharmony_ci * 15362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 15462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15562306a36Sopenharmony_ci * @token: Token of DPBP object 15662306a36Sopenharmony_ci * @attr: Returned object's attributes 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 15962306a36Sopenharmony_ci */ 16062306a36Sopenharmony_ciint dpbp_get_attributes(struct fsl_mc_io *mc_io, 16162306a36Sopenharmony_ci u32 cmd_flags, 16262306a36Sopenharmony_ci u16 token, 16362306a36Sopenharmony_ci struct dpbp_attr *attr) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 16662306a36Sopenharmony_ci struct dpbp_rsp_get_attributes *rsp_params; 16762306a36Sopenharmony_ci int err; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci /* prepare command */ 17062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_ATTR, 17162306a36Sopenharmony_ci cmd_flags, token); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci /* send command to mc*/ 17462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 17562306a36Sopenharmony_ci if (err) 17662306a36Sopenharmony_ci return err; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci /* retrieve response parameters */ 17962306a36Sopenharmony_ci rsp_params = (struct dpbp_rsp_get_attributes *)cmd.params; 18062306a36Sopenharmony_ci attr->bpid = le16_to_cpu(rsp_params->bpid); 18162306a36Sopenharmony_ci attr->id = le32_to_cpu(rsp_params->id); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci return 0; 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dpbp_get_attributes); 186