xref: /openbmc/linux/drivers/bus/fsl-mc/obj-api.c (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
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