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