mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 02:15:45 +01:00 
			
		
		
		
	Current Management Complex Flibs does not support APIs for adding and destroying the objects. Add APIs to create and destroy objects for DPBP, DPIO, DPNI and DPRC. Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com> Reviewed-by: York Sun <yorksun@freescale.com>
		
			
				
	
	
		
			356 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			356 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Freescale Layerscape MC I/O wrapper
 | |
|  *
 | |
|  * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
 | |
|  * Author: German Rivera <German.Rivera@freescale.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| #include <fsl-mc/fsl_mc_sys.h>
 | |
| #include <fsl-mc/fsl_mc_cmd.h>
 | |
| #include <fsl-mc/fsl_dprc.h>
 | |
| 
 | |
| int dprc_get_container_id(struct fsl_mc_io *mc_io,
 | |
| 			  uint32_t cmd_flags,
 | |
| 			  int *container_id)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONT_ID,
 | |
| 					  cmd_flags,
 | |
| 					  0);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_CONTAINER_ID(cmd, *container_id);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_open(struct fsl_mc_io *mc_io,
 | |
| 	      uint32_t cmd_flags,
 | |
| 	      int container_id,
 | |
| 	      uint16_t *token)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags,
 | |
| 					  0);
 | |
| 	DPRC_CMD_OPEN(cmd, container_id);
 | |
| 
 | |
| 	/* 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 0;
 | |
| }
 | |
| 
 | |
| int dprc_close(struct fsl_mc_io *mc_io,
 | |
| 	       uint32_t cmd_flags,
 | |
| 	       uint16_t token)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags,
 | |
| 					  token);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	return mc_send_command(mc_io, &cmd);
 | |
| }
 | |
| 
 | |
| int dprc_create_container(struct fsl_mc_io *mc_io,
 | |
| 			  uint32_t cmd_flags,
 | |
| 			  uint16_t token,
 | |
| 			  struct dprc_cfg *cfg,
 | |
| 			  int *child_container_id,
 | |
| 			  uint64_t *child_portal_paddr)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	DPRC_CMD_CREATE_CONTAINER(cmd, cfg);
 | |
| 
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CREATE_CONT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_CREATE_CONTAINER(cmd, *child_container_id,
 | |
| 				  *child_portal_paddr);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_destroy_container(struct fsl_mc_io *mc_io,
 | |
| 			   uint32_t cmd_flags,
 | |
| 			   uint16_t token,
 | |
| 			   int child_container_id)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DESTROY_CONT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_DESTROY_CONTAINER(cmd, child_container_id);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	return mc_send_command(mc_io, &cmd);
 | |
| }
 | |
| 
 | |
| int dprc_reset_container(struct fsl_mc_io *mc_io,
 | |
| 			 uint32_t cmd_flags,
 | |
| 			 uint16_t token,
 | |
| 			 int child_container_id)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_RESET_CONTAINER(cmd, child_container_id);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	return mc_send_command(mc_io, &cmd);
 | |
| }
 | |
| 
 | |
| int dprc_get_attributes(struct fsl_mc_io *mc_io,
 | |
| 			uint32_t cmd_flags,
 | |
| 			uint16_t token,
 | |
| 			struct dprc_attributes *attr)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_ATTRIBUTES(cmd, attr);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_get_obj_count(struct fsl_mc_io *mc_io,
 | |
| 		       uint32_t cmd_flags,
 | |
| 		       uint16_t token,
 | |
| 		       int *obj_count)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_OBJ_COUNT(cmd, *obj_count);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_get_obj(struct fsl_mc_io *mc_io,
 | |
| 		 uint32_t cmd_flags,
 | |
| 		 uint16_t token,
 | |
| 		 int obj_index,
 | |
| 		 struct dprc_obj_desc *obj_desc)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_GET_OBJ(cmd, obj_index);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_OBJ(cmd, obj_desc);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_get_res_count(struct fsl_mc_io *mc_io,
 | |
| 		       uint32_t cmd_flags,
 | |
| 		       uint16_t token,
 | |
| 		       char *type,
 | |
| 		       int *res_count)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	*res_count = 0;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_GET_RES_COUNT(cmd, type);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_RES_COUNT(cmd, *res_count);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_get_res_ids(struct fsl_mc_io *mc_io,
 | |
| 		     uint32_t cmd_flags,
 | |
| 		     uint16_t token,
 | |
| 		     char *type,
 | |
| 		     struct dprc_res_ids_range_desc *range_desc)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_GET_RES_IDS(cmd, range_desc, type);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_RES_IDS(cmd, range_desc);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_get_obj_region(struct fsl_mc_io *mc_io,
 | |
| 			uint32_t cmd_flags,
 | |
| 			uint16_t token,
 | |
| 			char *obj_type,
 | |
| 			int obj_id,
 | |
| 			uint8_t region_index,
 | |
| 			struct dprc_region_desc *region_desc)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_OBJ_REGION(cmd, region_desc);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dprc_connect(struct fsl_mc_io *mc_io,
 | |
| 		 uint32_t cmd_flags,
 | |
| 		 uint16_t token,
 | |
| 		 const struct dprc_endpoint *endpoint1,
 | |
| 		 const struct dprc_endpoint *endpoint2,
 | |
| 		 const struct dprc_connection_cfg *cfg)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2, cfg);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	return mc_send_command(mc_io, &cmd);
 | |
| }
 | |
| 
 | |
| int dprc_disconnect(struct fsl_mc_io *mc_io,
 | |
| 		    uint32_t cmd_flags,
 | |
| 		    uint16_t token,
 | |
| 		    const struct dprc_endpoint *endpoint)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_DISCONNECT(cmd, endpoint);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	return mc_send_command(mc_io, &cmd);
 | |
| }
 | |
| 
 | |
| int dprc_get_connection(struct fsl_mc_io *mc_io,
 | |
| 			uint32_t cmd_flags,
 | |
| 			uint16_t token,
 | |
| 			const struct dprc_endpoint *endpoint1,
 | |
| 			struct dprc_endpoint *endpoint2,
 | |
| 			int *state)
 | |
| {
 | |
| 	struct mc_command cmd = { 0 };
 | |
| 	int err;
 | |
| 
 | |
| 	/* prepare command */
 | |
| 	cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
 | |
| 					  cmd_flags,
 | |
| 					  token);
 | |
| 	DPRC_CMD_GET_CONNECTION(cmd, endpoint1);
 | |
| 
 | |
| 	/* send command to mc*/
 | |
| 	err = mc_send_command(mc_io, &cmd);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	/* retrieve response parameters */
 | |
| 	DPRC_RSP_GET_CONNECTION(cmd, endpoint2, *state);
 | |
| 
 | |
| 	return 0;
 | |
| }
 |