xref: /kernel/linux/linux-6.6/drivers/soc/fsl/dpio/dpio.c (revision 62306a36)
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