1*fec2432cSDiana Craciun // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2*fec2432cSDiana Craciun /*
3*fec2432cSDiana Craciun * Copyright 2021 NXP
4*fec2432cSDiana Craciun *
5*fec2432cSDiana Craciun */
6*fec2432cSDiana Craciun #include <linux/kernel.h>
7*fec2432cSDiana Craciun #include <linux/fsl/mc.h>
8*fec2432cSDiana Craciun
9*fec2432cSDiana Craciun #include "fsl-mc-private.h"
10*fec2432cSDiana Craciun
fsl_mc_get_open_cmd_id(const char * type)11*fec2432cSDiana Craciun static int fsl_mc_get_open_cmd_id(const char *type)
12*fec2432cSDiana Craciun {
13*fec2432cSDiana Craciun static const struct {
14*fec2432cSDiana Craciun int cmd_id;
15*fec2432cSDiana Craciun const char *type;
16*fec2432cSDiana Craciun } dev_ids[] = {
17*fec2432cSDiana Craciun { DPRTC_CMDID_OPEN, "dprtc" },
18*fec2432cSDiana Craciun { DPRC_CMDID_OPEN, "dprc" },
19*fec2432cSDiana Craciun { DPNI_CMDID_OPEN, "dpni" },
20*fec2432cSDiana Craciun { DPIO_CMDID_OPEN, "dpio" },
21*fec2432cSDiana Craciun { DPSW_CMDID_OPEN, "dpsw" },
22*fec2432cSDiana Craciun { DPBP_CMDID_OPEN, "dpbp" },
23*fec2432cSDiana Craciun { DPCON_CMDID_OPEN, "dpcon" },
24*fec2432cSDiana Craciun { DPMCP_CMDID_OPEN, "dpmcp" },
25*fec2432cSDiana Craciun { DPMAC_CMDID_OPEN, "dpmac" },
26*fec2432cSDiana Craciun { DPSECI_CMDID_OPEN, "dpseci" },
27*fec2432cSDiana Craciun { DPDMUX_CMDID_OPEN, "dpdmux" },
28*fec2432cSDiana Craciun { DPDCEI_CMDID_OPEN, "dpdcei" },
29*fec2432cSDiana Craciun { DPAIOP_CMDID_OPEN, "dpaiop" },
30*fec2432cSDiana Craciun { DPCI_CMDID_OPEN, "dpci" },
31*fec2432cSDiana Craciun { DPDMAI_CMDID_OPEN, "dpdmai" },
32*fec2432cSDiana Craciun { DPDBG_CMDID_OPEN, "dpdbg" },
33*fec2432cSDiana Craciun { 0, NULL }
34*fec2432cSDiana Craciun };
35*fec2432cSDiana Craciun int i;
36*fec2432cSDiana Craciun
37*fec2432cSDiana Craciun for (i = 0; dev_ids[i].type; i++)
38*fec2432cSDiana Craciun if (!strcmp(dev_ids[i].type, type))
39*fec2432cSDiana Craciun return dev_ids[i].cmd_id;
40*fec2432cSDiana Craciun
41*fec2432cSDiana Craciun return -1;
42*fec2432cSDiana Craciun }
43*fec2432cSDiana Craciun
fsl_mc_obj_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int obj_id,char * obj_type,u16 * token)44*fec2432cSDiana Craciun int fsl_mc_obj_open(struct fsl_mc_io *mc_io,
45*fec2432cSDiana Craciun u32 cmd_flags,
46*fec2432cSDiana Craciun int obj_id,
47*fec2432cSDiana Craciun char *obj_type,
48*fec2432cSDiana Craciun u16 *token)
49*fec2432cSDiana Craciun {
50*fec2432cSDiana Craciun struct fsl_mc_command cmd = { 0 };
51*fec2432cSDiana Craciun struct fsl_mc_obj_cmd_open *cmd_params;
52*fec2432cSDiana Craciun int err = 0;
53*fec2432cSDiana Craciun int cmd_id = fsl_mc_get_open_cmd_id(obj_type);
54*fec2432cSDiana Craciun
55*fec2432cSDiana Craciun if (cmd_id == -1)
56*fec2432cSDiana Craciun return -ENODEV;
57*fec2432cSDiana Craciun
58*fec2432cSDiana Craciun /* prepare command */
59*fec2432cSDiana Craciun cmd.header = mc_encode_cmd_header(cmd_id, cmd_flags, 0);
60*fec2432cSDiana Craciun cmd_params = (struct fsl_mc_obj_cmd_open *)cmd.params;
61*fec2432cSDiana Craciun cmd_params->obj_id = cpu_to_le32(obj_id);
62*fec2432cSDiana Craciun
63*fec2432cSDiana Craciun /* send command to mc*/
64*fec2432cSDiana Craciun err = mc_send_command(mc_io, &cmd);
65*fec2432cSDiana Craciun if (err)
66*fec2432cSDiana Craciun return err;
67*fec2432cSDiana Craciun
68*fec2432cSDiana Craciun /* retrieve response parameters */
69*fec2432cSDiana Craciun *token = mc_cmd_hdr_read_token(&cmd);
70*fec2432cSDiana Craciun
71*fec2432cSDiana Craciun return err;
72*fec2432cSDiana Craciun }
73*fec2432cSDiana Craciun EXPORT_SYMBOL_GPL(fsl_mc_obj_open);
74*fec2432cSDiana Craciun
fsl_mc_obj_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)75*fec2432cSDiana Craciun int fsl_mc_obj_close(struct fsl_mc_io *mc_io,
76*fec2432cSDiana Craciun u32 cmd_flags,
77*fec2432cSDiana Craciun u16 token)
78*fec2432cSDiana Craciun {
79*fec2432cSDiana Craciun struct fsl_mc_command cmd = { 0 };
80*fec2432cSDiana Craciun
81*fec2432cSDiana Craciun /* prepare command */
82*fec2432cSDiana Craciun cmd.header = mc_encode_cmd_header(OBJ_CMDID_CLOSE, cmd_flags,
83*fec2432cSDiana Craciun token);
84*fec2432cSDiana Craciun
85*fec2432cSDiana Craciun /* send command to mc*/
86*fec2432cSDiana Craciun return mc_send_command(mc_io, &cmd);
87*fec2432cSDiana Craciun }
88*fec2432cSDiana Craciun EXPORT_SYMBOL_GPL(fsl_mc_obj_close);
89*fec2432cSDiana Craciun
fsl_mc_obj_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)90*fec2432cSDiana Craciun int fsl_mc_obj_reset(struct fsl_mc_io *mc_io,
91*fec2432cSDiana Craciun u32 cmd_flags,
92*fec2432cSDiana Craciun u16 token)
93*fec2432cSDiana Craciun {
94*fec2432cSDiana Craciun struct fsl_mc_command cmd = { 0 };
95*fec2432cSDiana Craciun
96*fec2432cSDiana Craciun /* prepare command */
97*fec2432cSDiana Craciun cmd.header = mc_encode_cmd_header(OBJ_CMDID_RESET, cmd_flags,
98*fec2432cSDiana Craciun token);
99*fec2432cSDiana Craciun
100*fec2432cSDiana Craciun /* send command to mc*/
101*fec2432cSDiana Craciun return mc_send_command(mc_io, &cmd);
102*fec2432cSDiana Craciun }
103*fec2432cSDiana Craciun EXPORT_SYMBOL_GPL(fsl_mc_obj_reset);
104