summaryrefslogtreecommitdiff
path: root/drivers/net/fsl-mc/dpsparser.c
blob: cfd1ba66a0585e1367d7366ff9a7a94dba5a06be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// SPDX-License-Identifier: GPL-2.0+
/*
 * Data Path Soft Parser
 *
 * Copyright 2018 NXP
 */
#include <fsl-mc/fsl_mc_sys.h>
#include <fsl-mc/fsl_mc_cmd.h>
#include <fsl-mc/fsl_dpsparser.h>

int dpsparser_open(struct fsl_mc_io *mc_io,
		   u32 cmd_flags,
		   u16 *token)
{
	struct mc_command cmd = { 0 };
	int err;

	/* prepare command */
	cmd.header = mc_encode_cmd_header(DPSPARSER_CMDID_OPEN,
					  cmd_flags,
					  0);

	/* send command to mc*/
	err = mc_send_command(mc_io, &cmd);
	if (err)
		return err;

	/* retrieve response parameters */
	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);

	return err;
}

int dpsparser_close(struct fsl_mc_io *mc_io,
		    u32 cmd_flags,
		    u16 token)
{
	struct mc_command cmd = { 0 };

	/* prepare command */
	cmd.header = mc_encode_cmd_header(DPSPARSER_CMDID_CLOSE, cmd_flags,
					  token);

	/* send command to mc*/
	return mc_send_command(mc_io, &cmd);
}

int dpsparser_create(struct fsl_mc_io *mc_io,
		     u16 token,
		     u32 cmd_flags,
		     u32 *obj_id)
{
	struct mc_command cmd = { 0 };
	int err;

	/* prepare command */
	cmd.header = mc_encode_cmd_header(DPSPARSER_CMDID_CREATE,
					  cmd_flags,
					  token);

	/* send command to mc*/
	err = mc_send_command(mc_io, &cmd);
	if (err)
		return err;

	/* retrieve response parameters */
	MC_CMD_READ_OBJ_ID(cmd, *obj_id);

	return 0;
}

int dpsparser_destroy(struct fsl_mc_io *mc_io,
		      u16 token,
		      u32 cmd_flags,
		      u32 obj_id)
{
	struct mc_command cmd = { 0 };

	/* prepare command */
	cmd.header = mc_encode_cmd_header(DPSPARSER_CMDID_DESTROY,
					  cmd_flags,
					  token);

	/* set object id to destroy */
	CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);

	/* send command to mc*/
	return mc_send_command(mc_io, &cmd);
}

int dpsparser_apply_spb(struct fsl_mc_io *mc_io,
			u32 cmd_flags,
			u16 token,
			u64 blob_addr,
			u16 *error)
{
	struct mc_command cmd = { 0 };
	int err;

	/* prepare command */
	cmd.header = mc_encode_cmd_header(DPSPARSER_CMDID_APPLY_SPB,
					  cmd_flags,
					  token);
	DPSPARSER_CMD_BLOB_SET_ADDR(cmd, blob_addr);

	/* send command to mc*/
	err = mc_send_command(mc_io, &cmd);
	if (err)
		return err;

	/* retrieve response parameters: MC error code */
	DPSPARSER_CMD_BLOB_REPORT_ERROR(cmd, *error);

	return 0;
}

int dpsparser_get_api_version(struct fsl_mc_io *mc_io,
			      u32 cmd_flags,
			      u16 *major_ver,
			      u16 *minor_ver)
{
	struct mc_command cmd = { 0 };
	int err;

	/* prepare command */
	cmd.header = mc_encode_cmd_header(DPSPARSER_CMDID_GET_API_VERSION,
					  cmd_flags, 0);

	/* send command to mc */
	err = mc_send_command(mc_io, &cmd);
	if (err)
		return err;

	/* retrieve response parameters */
	mc_cmd_read_api_version(&cmd, major_ver, minor_ver);

	return 0;
}