Home | History | Annotate | Download | only in fsl-mc
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Freescale Layerscape MC I/O wrapper
      4  *
      5  * Copyright 2013-2016 Freescale Semiconductor, Inc.
      6  * Copyright 2017 NXP
      7  */
      8 
      9 #include <fsl-mc/fsl_mc_sys.h>
     10 #include <fsl-mc/fsl_mc_cmd.h>
     11 #include <fsl-mc/fsl_dprc.h>
     12 
     13 int dprc_get_container_id(struct fsl_mc_io *mc_io,
     14 			  uint32_t cmd_flags,
     15 			  int *container_id)
     16 {
     17 	struct mc_command cmd = { 0 };
     18 	int err;
     19 
     20 	/* prepare command */
     21 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONT_ID,
     22 					  cmd_flags,
     23 					  0);
     24 
     25 	/* send command to mc*/
     26 	err = mc_send_command(mc_io, &cmd);
     27 	if (err)
     28 		return err;
     29 
     30 	/* retrieve response parameters */
     31 	DPRC_RSP_GET_CONTAINER_ID(cmd, *container_id);
     32 
     33 	return 0;
     34 }
     35 
     36 int dprc_open(struct fsl_mc_io *mc_io,
     37 	      uint32_t cmd_flags,
     38 	      int container_id,
     39 	      uint16_t *token)
     40 {
     41 	struct mc_command cmd = { 0 };
     42 	int err;
     43 
     44 	/* prepare command */
     45 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags,
     46 					  0);
     47 	DPRC_CMD_OPEN(cmd, container_id);
     48 
     49 	/* send command to mc*/
     50 	err = mc_send_command(mc_io, &cmd);
     51 	if (err)
     52 		return err;
     53 
     54 	/* retrieve response parameters */
     55 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
     56 
     57 	return 0;
     58 }
     59 
     60 int dprc_close(struct fsl_mc_io *mc_io,
     61 	       uint32_t cmd_flags,
     62 	       uint16_t token)
     63 {
     64 	struct mc_command cmd = { 0 };
     65 
     66 	/* prepare command */
     67 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags,
     68 					  token);
     69 
     70 	/* send command to mc*/
     71 	return mc_send_command(mc_io, &cmd);
     72 }
     73 
     74 int dprc_create_container(struct fsl_mc_io *mc_io,
     75 			  uint32_t cmd_flags,
     76 			  uint16_t token,
     77 			  struct dprc_cfg *cfg,
     78 			  int *child_container_id,
     79 			  uint64_t *child_portal_paddr)
     80 {
     81 	struct mc_command cmd = { 0 };
     82 	int err;
     83 
     84 	/* prepare command */
     85 	DPRC_CMD_CREATE_CONTAINER(cmd, cfg);
     86 
     87 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CREATE_CONT,
     88 					  cmd_flags,
     89 					  token);
     90 
     91 	/* send command to mc*/
     92 	err = mc_send_command(mc_io, &cmd);
     93 	if (err)
     94 		return err;
     95 
     96 	/* retrieve response parameters */
     97 	DPRC_RSP_CREATE_CONTAINER(cmd, *child_container_id,
     98 				  *child_portal_paddr);
     99 
    100 	return 0;
    101 }
    102 
    103 int dprc_destroy_container(struct fsl_mc_io *mc_io,
    104 			   uint32_t cmd_flags,
    105 			   uint16_t token,
    106 			   int child_container_id)
    107 {
    108 	struct mc_command cmd = { 0 };
    109 
    110 	/* prepare command */
    111 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DESTROY_CONT,
    112 					  cmd_flags,
    113 					  token);
    114 	DPRC_CMD_DESTROY_CONTAINER(cmd, child_container_id);
    115 
    116 	/* send command to mc*/
    117 	return mc_send_command(mc_io, &cmd);
    118 }
    119 
    120 int dprc_reset_container(struct fsl_mc_io *mc_io,
    121 			 uint32_t cmd_flags,
    122 			 uint16_t token,
    123 			 int child_container_id)
    124 {
    125 	struct mc_command cmd = { 0 };
    126 
    127 	/* prepare command */
    128 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
    129 					  cmd_flags,
    130 					  token);
    131 	DPRC_CMD_RESET_CONTAINER(cmd, child_container_id);
    132 
    133 	/* send command to mc*/
    134 	return mc_send_command(mc_io, &cmd);
    135 }
    136 
    137 int dprc_get_attributes(struct fsl_mc_io *mc_io,
    138 			uint32_t cmd_flags,
    139 			uint16_t token,
    140 			struct dprc_attributes *attr)
    141 {
    142 	struct mc_command cmd = { 0 };
    143 	int err;
    144 
    145 	/* prepare command */
    146 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
    147 					  cmd_flags,
    148 					  token);
    149 
    150 	/* send command to mc*/
    151 	err = mc_send_command(mc_io, &cmd);
    152 	if (err)
    153 		return err;
    154 
    155 	/* retrieve response parameters */
    156 	DPRC_RSP_GET_ATTRIBUTES(cmd, attr);
    157 
    158 	return 0;
    159 }
    160 
    161 int dprc_get_obj_count(struct fsl_mc_io *mc_io,
    162 		       uint32_t cmd_flags,
    163 		       uint16_t token,
    164 		       int *obj_count)
    165 {
    166 	struct mc_command cmd = { 0 };
    167 	int err;
    168 
    169 	/* prepare command */
    170 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
    171 					  cmd_flags,
    172 					  token);
    173 
    174 	/* send command to mc*/
    175 	err = mc_send_command(mc_io, &cmd);
    176 	if (err)
    177 		return err;
    178 
    179 	/* retrieve response parameters */
    180 	DPRC_RSP_GET_OBJ_COUNT(cmd, *obj_count);
    181 
    182 	return 0;
    183 }
    184 
    185 int dprc_get_obj(struct fsl_mc_io *mc_io,
    186 		 uint32_t cmd_flags,
    187 		 uint16_t token,
    188 		 int obj_index,
    189 		 struct dprc_obj_desc *obj_desc)
    190 {
    191 	struct mc_command cmd = { 0 };
    192 	int err;
    193 
    194 	/* prepare command */
    195 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
    196 					  cmd_flags,
    197 					  token);
    198 	DPRC_CMD_GET_OBJ(cmd, obj_index);
    199 
    200 	/* send command to mc*/
    201 	err = mc_send_command(mc_io, &cmd);
    202 	if (err)
    203 		return err;
    204 
    205 	/* retrieve response parameters */
    206 	DPRC_RSP_GET_OBJ(cmd, obj_desc);
    207 
    208 	return 0;
    209 }
    210 
    211 int dprc_get_res_count(struct fsl_mc_io *mc_io,
    212 		       uint32_t cmd_flags,
    213 		       uint16_t token,
    214 		       char *type,
    215 		       int *res_count)
    216 {
    217 	struct mc_command cmd = { 0 };
    218 	int err;
    219 
    220 	*res_count = 0;
    221 
    222 	/* prepare command */
    223 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
    224 					  cmd_flags,
    225 					  token);
    226 	DPRC_CMD_GET_RES_COUNT(cmd, type);
    227 
    228 	/* send command to mc*/
    229 	err = mc_send_command(mc_io, &cmd);
    230 	if (err)
    231 		return err;
    232 
    233 	/* retrieve response parameters */
    234 	DPRC_RSP_GET_RES_COUNT(cmd, *res_count);
    235 
    236 	return 0;
    237 }
    238 
    239 int dprc_get_res_ids(struct fsl_mc_io *mc_io,
    240 		     uint32_t cmd_flags,
    241 		     uint16_t token,
    242 		     char *type,
    243 		     struct dprc_res_ids_range_desc *range_desc)
    244 {
    245 	struct mc_command cmd = { 0 };
    246 	int err;
    247 
    248 	/* prepare command */
    249 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
    250 					  cmd_flags,
    251 					  token);
    252 	DPRC_CMD_GET_RES_IDS(cmd, range_desc, type);
    253 
    254 	/* send command to mc*/
    255 	err = mc_send_command(mc_io, &cmd);
    256 	if (err)
    257 		return err;
    258 
    259 	/* retrieve response parameters */
    260 	DPRC_RSP_GET_RES_IDS(cmd, range_desc);
    261 
    262 	return 0;
    263 }
    264 
    265 int dprc_get_obj_region(struct fsl_mc_io *mc_io,
    266 			uint32_t cmd_flags,
    267 			uint16_t token,
    268 			char *obj_type,
    269 			int obj_id,
    270 			uint8_t region_index,
    271 			struct dprc_region_desc *region_desc)
    272 {
    273 	struct mc_command cmd = { 0 };
    274 	int err;
    275 
    276 	/* prepare command */
    277 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
    278 					  cmd_flags,
    279 					  token);
    280 	DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index);
    281 
    282 	/* send command to mc*/
    283 	err = mc_send_command(mc_io, &cmd);
    284 	if (err)
    285 		return err;
    286 
    287 	/* retrieve response parameters */
    288 	DPRC_RSP_GET_OBJ_REGION(cmd, region_desc);
    289 
    290 	return 0;
    291 }
    292 
    293 int dprc_connect(struct fsl_mc_io *mc_io,
    294 		 uint32_t cmd_flags,
    295 		 uint16_t token,
    296 		 const struct dprc_endpoint *endpoint1,
    297 		 const struct dprc_endpoint *endpoint2,
    298 		 const struct dprc_connection_cfg *cfg)
    299 {
    300 	struct mc_command cmd = { 0 };
    301 
    302 	/* prepare command */
    303 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
    304 					  cmd_flags,
    305 					  token);
    306 	DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2, cfg);
    307 
    308 	/* send command to mc*/
    309 	return mc_send_command(mc_io, &cmd);
    310 }
    311 
    312 int dprc_disconnect(struct fsl_mc_io *mc_io,
    313 		    uint32_t cmd_flags,
    314 		    uint16_t token,
    315 		    const struct dprc_endpoint *endpoint)
    316 {
    317 	struct mc_command cmd = { 0 };
    318 
    319 	/* prepare command */
    320 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
    321 					  cmd_flags,
    322 					  token);
    323 	DPRC_CMD_DISCONNECT(cmd, endpoint);
    324 
    325 	/* send command to mc*/
    326 	return mc_send_command(mc_io, &cmd);
    327 }
    328 
    329 int dprc_get_connection(struct fsl_mc_io *mc_io,
    330 			uint32_t cmd_flags,
    331 			uint16_t token,
    332 			const struct dprc_endpoint *endpoint1,
    333 			struct dprc_endpoint *endpoint2,
    334 			int *state)
    335 {
    336 	struct mc_command cmd = { 0 };
    337 	int err;
    338 
    339 	/* prepare command */
    340 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
    341 					  cmd_flags,
    342 					  token);
    343 	DPRC_CMD_GET_CONNECTION(cmd, endpoint1);
    344 
    345 	/* send command to mc*/
    346 	err = mc_send_command(mc_io, &cmd);
    347 	if (err)
    348 		return err;
    349 
    350 	/* retrieve response parameters */
    351 	DPRC_RSP_GET_CONNECTION(cmd, endpoint2, *state);
    352 
    353 	return 0;
    354 }
    355 
    356 int dprc_get_api_version(struct fsl_mc_io *mc_io,
    357 			 u32 cmd_flags,
    358 			 u16 *major_ver,
    359 			 u16 *minor_ver)
    360 {
    361 	struct mc_command cmd = { 0 };
    362 	int err;
    363 
    364 	/* prepare command */
    365 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_API_VERSION,
    366 					  cmd_flags, 0);
    367 
    368 	/* send command to mc */
    369 	err = mc_send_command(mc_io, &cmd);
    370 	if (err)
    371 		return err;
    372 
    373 	/* retrieve response parameters */
    374 	mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
    375 
    376 	return 0;
    377 }
    378