firmware: ti_sci: Add support for NAVSS resource management
Texas Instruments' System Control Interface (TI-SCI) Message Protocol abstracts management of NAVSS resources, like PSI-L pairing and unpairing, UDMAP tx/rx/flow configuration and Rings. This patch adds support for requesting and configuring such resources from TI-SCI firmware. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> Signed-off-by: Vignesh R <vigneshr@ti.com>
This commit is contained in:
		
							parent
							
								
									02f173ca15
								
							
						
					
					
						commit
						fd6b40b1ba
					
				|  | @ -7,7 +7,7 @@ | ||||||
| 
 | 
 | ||||||
| &cbass_wakeup { | &cbass_wakeup { | ||||||
| 	dmsc: dmsc { | 	dmsc: dmsc { | ||||||
| 		compatible = "ti,k2g-sci"; | 		compatible = "ti,am654-sci"; | ||||||
| 		ti,host-id = <12>; | 		ti,host-id = <12>; | ||||||
| 		#address-cells = <1>; | 		#address-cells = <1>; | ||||||
| 		#size-cells = <1>; | 		#size-cells = <1>; | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <mailbox.h> | #include <mailbox.h> | ||||||
| #include <dm/device.h> | #include <dm/device.h> | ||||||
|  | #include <linux/compat.h> | ||||||
| #include <linux/err.h> | #include <linux/err.h> | ||||||
| #include <linux/soc/ti/k3-sec-proxy.h> | #include <linux/soc/ti/k3-sec-proxy.h> | ||||||
| #include <linux/soc/ti/ti_sci_protocol.h> | #include <linux/soc/ti/ti_sci_protocol.h> | ||||||
|  | @ -31,16 +32,37 @@ struct ti_sci_xfer { | ||||||
| 	u8 rx_len; | 	u8 rx_len; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_rm_type_map - Structure representing TISCI Resource | ||||||
|  |  *				management representation of dev_ids. | ||||||
|  |  * @dev_id:	TISCI device ID | ||||||
|  |  * @type:	Corresponding id as identified by TISCI RM. | ||||||
|  |  * | ||||||
|  |  * Note: This is used only as a work around for using RM range apis | ||||||
|  |  *	for AM654 SoC. For future SoCs dev_id will be used as type | ||||||
|  |  *	for RM range APIs. In order to maintain ABI backward compatibility | ||||||
|  |  *	type is not being changed for AM654 SoC. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_rm_type_map { | ||||||
|  | 	u32 dev_id; | ||||||
|  | 	u16 type; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct ti_sci_desc - Description of SoC integration |  * struct ti_sci_desc - Description of SoC integration | ||||||
|  * @host_id:		Host identifier representing the compute entity |  * @default_host_id:	Host identifier representing the compute entity | ||||||
|  * @max_rx_timeout_us:	Timeout for communication with SoC (in Microseconds) |  * @max_rx_timeout_ms:	Timeout for communication with SoC (in Milliseconds) | ||||||
|  |  * @max_msgs: Maximum number of messages that can be pending | ||||||
|  |  *		  simultaneously in the system | ||||||
|  * @max_msg_size: Maximum size of data per message that can be handled. |  * @max_msg_size: Maximum size of data per message that can be handled. | ||||||
|  |  * @rm_type_map: RM resource type mapping structure. | ||||||
|  */ |  */ | ||||||
| struct ti_sci_desc { | struct ti_sci_desc { | ||||||
| 	u8 host_id; | 	u8 default_host_id; | ||||||
| 	int max_rx_timeout_us; | 	int max_rx_timeout_ms; | ||||||
|  | 	int max_msgs; | ||||||
| 	int max_msg_size; | 	int max_msg_size; | ||||||
|  | 	struct ti_sci_rm_type_map *rm_type_map; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -136,7 +158,7 @@ static inline int ti_sci_get_response(struct ti_sci_info *info, | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	/* Receive the response */ | 	/* Receive the response */ | ||||||
| 	ret = mbox_recv(chan, msg, info->desc->max_rx_timeout_us); | 	ret = mbox_recv(chan, msg, info->desc->max_rx_timeout_ms); | ||||||
| 	if (ret) { | 	if (ret) { | ||||||
| 		dev_err(info->dev, "%s: Message receive failed. ret = %d\n", | 		dev_err(info->dev, "%s: Message receive failed. ret = %d\n", | ||||||
| 			__func__, ret); | 			__func__, ret); | ||||||
|  | @ -1441,6 +1463,147 @@ static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle) | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int ti_sci_get_resource_type(struct ti_sci_info *info, u16 dev_id, | ||||||
|  | 				    u16 *type) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_rm_type_map *rm_type_map = info->desc->rm_type_map; | ||||||
|  | 	bool found = false; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	/* If map is not provided then assume dev_id is used as type */ | ||||||
|  | 	if (!rm_type_map) { | ||||||
|  | 		*type = dev_id; | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; rm_type_map[i].dev_id; i++) { | ||||||
|  | 		if (rm_type_map[i].dev_id == dev_id) { | ||||||
|  | 			*type = rm_type_map[i].type; | ||||||
|  | 			found = true; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!found) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ti_sci_get_resource_range - Helper to get a range of resources assigned | ||||||
|  |  *			       to a host. Resource is uniquely identified by | ||||||
|  |  *			       type and subtype. | ||||||
|  |  * @handle:		Pointer to TISCI handle. | ||||||
|  |  * @dev_id:		TISCI device ID. | ||||||
|  |  * @subtype:		Resource assignment subtype that is being requested | ||||||
|  |  *			from the given device. | ||||||
|  |  * @s_host:		Host processor ID to which the resources are allocated | ||||||
|  |  * @range_start:	Start index of the resource range | ||||||
|  |  * @range_num:		Number of resources in the range | ||||||
|  |  * | ||||||
|  |  * Return: 0 if all went fine, else return appropriate error. | ||||||
|  |  */ | ||||||
|  | static int ti_sci_get_resource_range(const struct ti_sci_handle *handle, | ||||||
|  | 				     u32 dev_id, u8 subtype, u8 s_host, | ||||||
|  | 				     u16 *range_start, u16 *range_num) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_resp_get_resource_range *resp; | ||||||
|  | 	struct ti_sci_msg_req_get_resource_range req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	u16 type; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TI_SCI_MSG_GET_RESOURCE_RANGE, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(dev, "Message alloc failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_get_resource_type(info, dev_id, &type); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(dev, "rm type lookup failed for %u\n", dev_id); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req.secondary_host = s_host; | ||||||
|  | 	req.type = type & MSG_RM_RESOURCE_TYPE_MASK; | ||||||
|  | 	req.subtype = subtype & MSG_RM_RESOURCE_SUBTYPE_MASK; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(dev, "Mbox send fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = (struct ti_sci_msg_resp_get_resource_range *)xfer->tx_message.buf; | ||||||
|  | 	if (!ti_sci_is_response_ack(resp)) { | ||||||
|  | 		ret = -ENODEV; | ||||||
|  | 	} else if (!resp->range_start && !resp->range_num) { | ||||||
|  | 		ret = -ENODEV; | ||||||
|  | 	} else { | ||||||
|  | 		*range_start = resp->range_start; | ||||||
|  | 		*range_num = resp->range_num; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ti_sci_cmd_get_resource_range - Get a range of resources assigned to host | ||||||
|  |  *				   that is same as ti sci interface host. | ||||||
|  |  * @handle:		Pointer to TISCI handle. | ||||||
|  |  * @dev_id:		TISCI device ID. | ||||||
|  |  * @subtype:		Resource assignment subtype that is being requested | ||||||
|  |  *			from the given device. | ||||||
|  |  * @range_start:	Start index of the resource range | ||||||
|  |  * @range_num:		Number of resources in the range | ||||||
|  |  * | ||||||
|  |  * Return: 0 if all went fine, else return appropriate error. | ||||||
|  |  */ | ||||||
|  | static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle, | ||||||
|  | 					 u32 dev_id, u8 subtype, | ||||||
|  | 					 u16 *range_start, u16 *range_num) | ||||||
|  | { | ||||||
|  | 	return ti_sci_get_resource_range(handle, dev_id, subtype, | ||||||
|  | 					 TI_SCI_IRQ_SECONDARY_HOST_INVALID, | ||||||
|  | 					 range_start, range_num); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ti_sci_cmd_get_resource_range_from_shost - Get a range of resources | ||||||
|  |  *					      assigned to a specified host. | ||||||
|  |  * @handle:		Pointer to TISCI handle. | ||||||
|  |  * @dev_id:		TISCI device ID. | ||||||
|  |  * @subtype:		Resource assignment subtype that is being requested | ||||||
|  |  *			from the given device. | ||||||
|  |  * @s_host:		Host processor ID to which the resources are allocated | ||||||
|  |  * @range_start:	Start index of the resource range | ||||||
|  |  * @range_num:		Number of resources in the range | ||||||
|  |  * | ||||||
|  |  * Return: 0 if all went fine, else return appropriate error. | ||||||
|  |  */ | ||||||
|  | static | ||||||
|  | int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle, | ||||||
|  | 					     u32 dev_id, u8 subtype, u8 s_host, | ||||||
|  | 					     u16 *range_start, u16 *range_num) | ||||||
|  | { | ||||||
|  | 	return ti_sci_get_resource_range(handle, dev_id, subtype, s_host, | ||||||
|  | 					 range_start, range_num); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * ti_sci_cmd_proc_request() - Command to request a physical processor control |  * ti_sci_cmd_proc_request() - Command to request a physical processor control | ||||||
|  * @handle:	Pointer to TI SCI handle |  * @handle:	Pointer to TI SCI handle | ||||||
|  | @ -1803,6 +1966,416 @@ static int ti_sci_cmd_get_proc_boot_status(const struct ti_sci_handle *handle, | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * ti_sci_cmd_ring_config() - configure RA ring | ||||||
|  |  * @handle:	pointer to TI SCI handle | ||||||
|  |  * @valid_params: Bitfield defining validity of ring configuration parameters. | ||||||
|  |  * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated | ||||||
|  |  * @index: Ring index. | ||||||
|  |  * @addr_lo: The ring base address lo 32 bits | ||||||
|  |  * @addr_hi: The ring base address hi 32 bits | ||||||
|  |  * @count: Number of ring elements. | ||||||
|  |  * @mode: The mode of the ring | ||||||
|  |  * @size: The ring element size. | ||||||
|  |  * @order_id: Specifies the ring's bus order ID. | ||||||
|  |  * | ||||||
|  |  * Return: 0 if all went well, else returns appropriate error value. | ||||||
|  |  * | ||||||
|  |  * See @ti_sci_msg_rm_ring_cfg_req for more info. | ||||||
|  |  */ | ||||||
|  | static int ti_sci_cmd_ring_config(const struct ti_sci_handle *handle, | ||||||
|  | 				  u32 valid_params, u16 nav_id, u16 index, | ||||||
|  | 				  u32 addr_lo, u32 addr_hi, u32 count, | ||||||
|  | 				  u8 mode, u8 size, u8 order_id) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_rm_ring_cfg_resp *resp; | ||||||
|  | 	struct ti_sci_msg_rm_ring_cfg_req req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TI_SCI_MSG_RM_RING_CFG, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(info->dev, "RM_RA:Message config failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 	req.valid_params = valid_params; | ||||||
|  | 	req.nav_id = nav_id; | ||||||
|  | 	req.index = index; | ||||||
|  | 	req.addr_lo = addr_lo; | ||||||
|  | 	req.addr_hi = addr_hi; | ||||||
|  | 	req.count = count; | ||||||
|  | 	req.mode = mode; | ||||||
|  | 	req.size = size; | ||||||
|  | 	req.order_id = order_id; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(info->dev, "RM_RA:Mbox config send fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = (struct ti_sci_msg_rm_ring_cfg_resp *)xfer->tx_message.buf; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "RM_RA:config ring %u ret:%d\n", index, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ti_sci_cmd_ring_get_config() - get RA ring configuration | ||||||
|  |  * @handle:	pointer to TI SCI handle | ||||||
|  |  * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated | ||||||
|  |  * @index: Ring index. | ||||||
|  |  * @addr_lo: returns ring's base address lo 32 bits | ||||||
|  |  * @addr_hi: returns ring's base address hi 32 bits | ||||||
|  |  * @count: returns number of ring elements. | ||||||
|  |  * @mode: returns mode of the ring | ||||||
|  |  * @size: returns ring element size. | ||||||
|  |  * @order_id: returns ring's bus order ID. | ||||||
|  |  * | ||||||
|  |  * Return: 0 if all went well, else returns appropriate error value. | ||||||
|  |  * | ||||||
|  |  * See @ti_sci_msg_rm_ring_get_cfg_req for more info. | ||||||
|  |  */ | ||||||
|  | static int ti_sci_cmd_ring_get_config(const struct ti_sci_handle *handle, | ||||||
|  | 				      u32 nav_id, u32 index, u8 *mode, | ||||||
|  | 				      u32 *addr_lo, u32 *addr_hi, | ||||||
|  | 				      u32 *count, u8 *size, u8 *order_id) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_rm_ring_get_cfg_resp *resp; | ||||||
|  | 	struct ti_sci_msg_rm_ring_get_cfg_req req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TI_SCI_MSG_RM_RING_GET_CFG, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(info->dev, | ||||||
|  | 			"RM_RA:Message get config failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 	req.nav_id = nav_id; | ||||||
|  | 	req.index = index; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(info->dev, "RM_RA:Mbox get config send fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = (struct ti_sci_msg_rm_ring_get_cfg_resp *)xfer->tx_message.buf; | ||||||
|  | 
 | ||||||
|  | 	if (!ti_sci_is_response_ack(resp)) { | ||||||
|  | 		ret = -ENODEV; | ||||||
|  | 	} else { | ||||||
|  | 		if (mode) | ||||||
|  | 			*mode = resp->mode; | ||||||
|  | 		if (addr_lo) | ||||||
|  | 			*addr_lo = resp->addr_lo; | ||||||
|  | 		if (addr_hi) | ||||||
|  | 			*addr_hi = resp->addr_hi; | ||||||
|  | 		if (count) | ||||||
|  | 			*count = resp->count; | ||||||
|  | 		if (size) | ||||||
|  | 			*size = resp->size; | ||||||
|  | 		if (order_id) | ||||||
|  | 			*order_id = resp->order_id; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "RM_RA:get config ring %u ret:%d\n", index, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle, | ||||||
|  | 				   u32 nav_id, u32 src_thread, u32 dst_thread) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_hdr *resp; | ||||||
|  | 	struct ti_sci_msg_psil_pair req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TI_SCI_MSG_RM_PSIL_PAIR, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(info->dev, "RM_PSIL:Message alloc failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 	req.nav_id = nav_id; | ||||||
|  | 	req.src_thread = src_thread; | ||||||
|  | 	req.dst_thread = dst_thread; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(info->dev, "RM_PSIL:Mbox send fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf; | ||||||
|  | 	ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "RM_PSIL: nav: %u link pair %u->%u ret:%u\n", | ||||||
|  | 		nav_id, src_thread, dst_thread, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle, | ||||||
|  | 				     u32 nav_id, u32 src_thread, u32 dst_thread) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_hdr *resp; | ||||||
|  | 	struct ti_sci_msg_psil_unpair req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TI_SCI_MSG_RM_PSIL_UNPAIR, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(info->dev, "RM_PSIL:Message alloc failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 	req.nav_id = nav_id; | ||||||
|  | 	req.src_thread = src_thread; | ||||||
|  | 	req.dst_thread = dst_thread; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(info->dev, "RM_PSIL:Mbox send fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf; | ||||||
|  | 	ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "RM_PSIL: link unpair %u->%u ret:%u\n", | ||||||
|  | 		src_thread, dst_thread, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int ti_sci_cmd_rm_udmap_tx_ch_cfg( | ||||||
|  | 			const struct ti_sci_handle *handle, | ||||||
|  | 			const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_rm_udmap_tx_ch_cfg_resp *resp; | ||||||
|  | 	struct ti_sci_msg_rm_udmap_tx_ch_cfg_req req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TISCI_MSG_RM_UDMAP_TX_CH_CFG, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(info->dev, "Message TX_CH_CFG alloc failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 	req.valid_params = params->valid_params; | ||||||
|  | 	req.nav_id = params->nav_id; | ||||||
|  | 	req.index = params->index; | ||||||
|  | 	req.tx_pause_on_err = params->tx_pause_on_err; | ||||||
|  | 	req.tx_filt_einfo = params->tx_filt_einfo; | ||||||
|  | 	req.tx_filt_pswords = params->tx_filt_pswords; | ||||||
|  | 	req.tx_atype = params->tx_atype; | ||||||
|  | 	req.tx_chan_type = params->tx_chan_type; | ||||||
|  | 	req.tx_supr_tdpkt = params->tx_supr_tdpkt; | ||||||
|  | 	req.tx_fetch_size = params->tx_fetch_size; | ||||||
|  | 	req.tx_credit_count = params->tx_credit_count; | ||||||
|  | 	req.txcq_qnum = params->txcq_qnum; | ||||||
|  | 	req.tx_priority = params->tx_priority; | ||||||
|  | 	req.tx_qos = params->tx_qos; | ||||||
|  | 	req.tx_orderid = params->tx_orderid; | ||||||
|  | 	req.fdepth = params->fdepth; | ||||||
|  | 	req.tx_sched_priority = params->tx_sched_priority; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(info->dev, "Mbox send TX_CH_CFG fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = | ||||||
|  | 	      (struct ti_sci_msg_rm_udmap_tx_ch_cfg_resp *)xfer->tx_message.buf; | ||||||
|  | 	ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "TX_CH_CFG: chn %u ret:%u\n", params->index, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int ti_sci_cmd_rm_udmap_rx_ch_cfg( | ||||||
|  | 			const struct ti_sci_handle *handle, | ||||||
|  | 			const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_rm_udmap_rx_ch_cfg_resp *resp; | ||||||
|  | 	struct ti_sci_msg_rm_udmap_rx_ch_cfg_req req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TISCI_MSG_RM_UDMAP_RX_CH_CFG, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(info->dev, "Message RX_CH_CFG alloc failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req.valid_params = params->valid_params; | ||||||
|  | 	req.nav_id = params->nav_id; | ||||||
|  | 	req.index = params->index; | ||||||
|  | 	req.rx_fetch_size = params->rx_fetch_size; | ||||||
|  | 	req.rxcq_qnum = params->rxcq_qnum; | ||||||
|  | 	req.rx_priority = params->rx_priority; | ||||||
|  | 	req.rx_qos = params->rx_qos; | ||||||
|  | 	req.rx_orderid = params->rx_orderid; | ||||||
|  | 	req.rx_sched_priority = params->rx_sched_priority; | ||||||
|  | 	req.flowid_start = params->flowid_start; | ||||||
|  | 	req.flowid_cnt = params->flowid_cnt; | ||||||
|  | 	req.rx_pause_on_err = params->rx_pause_on_err; | ||||||
|  | 	req.rx_atype = params->rx_atype; | ||||||
|  | 	req.rx_chan_type = params->rx_chan_type; | ||||||
|  | 	req.rx_ignore_short = params->rx_ignore_short; | ||||||
|  | 	req.rx_ignore_long = params->rx_ignore_long; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(info->dev, "Mbox send RX_CH_CFG fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = | ||||||
|  | 	      (struct ti_sci_msg_rm_udmap_rx_ch_cfg_resp *)xfer->tx_message.buf; | ||||||
|  | 	ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "RX_CH_CFG: chn %u ret:%d\n", params->index, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int ti_sci_cmd_rm_udmap_rx_flow_cfg( | ||||||
|  | 			const struct ti_sci_handle *handle, | ||||||
|  | 			const struct ti_sci_msg_rm_udmap_flow_cfg *params) | ||||||
|  | { | ||||||
|  | 	struct ti_sci_msg_rm_udmap_flow_cfg_resp *resp; | ||||||
|  | 	struct ti_sci_msg_rm_udmap_flow_cfg_req req; | ||||||
|  | 	struct ti_sci_xfer *xfer; | ||||||
|  | 	struct ti_sci_info *info; | ||||||
|  | 	int ret = 0; | ||||||
|  | 
 | ||||||
|  | 	if (IS_ERR(handle)) | ||||||
|  | 		return PTR_ERR(handle); | ||||||
|  | 	if (!handle) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	info = handle_to_ti_sci_info(handle); | ||||||
|  | 
 | ||||||
|  | 	xfer = ti_sci_setup_one_xfer(info, TISCI_MSG_RM_UDMAP_FLOW_CFG, | ||||||
|  | 				     TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, | ||||||
|  | 				     (u32 *)&req, sizeof(req), sizeof(*resp)); | ||||||
|  | 	if (IS_ERR(xfer)) { | ||||||
|  | 		ret = PTR_ERR(xfer); | ||||||
|  | 		dev_err(dev, "RX_FL_CFG: Message alloc failed(%d)\n", ret); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req.valid_params = params->valid_params; | ||||||
|  | 	req.nav_id = params->nav_id; | ||||||
|  | 	req.flow_index = params->flow_index; | ||||||
|  | 	req.rx_einfo_present = params->rx_einfo_present; | ||||||
|  | 	req.rx_psinfo_present = params->rx_psinfo_present; | ||||||
|  | 	req.rx_error_handling = params->rx_error_handling; | ||||||
|  | 	req.rx_desc_type = params->rx_desc_type; | ||||||
|  | 	req.rx_sop_offset = params->rx_sop_offset; | ||||||
|  | 	req.rx_dest_qnum = params->rx_dest_qnum; | ||||||
|  | 	req.rx_src_tag_hi = params->rx_src_tag_hi; | ||||||
|  | 	req.rx_src_tag_lo = params->rx_src_tag_lo; | ||||||
|  | 	req.rx_dest_tag_hi = params->rx_dest_tag_hi; | ||||||
|  | 	req.rx_dest_tag_lo = params->rx_dest_tag_lo; | ||||||
|  | 	req.rx_src_tag_hi_sel = params->rx_src_tag_hi_sel; | ||||||
|  | 	req.rx_src_tag_lo_sel = params->rx_src_tag_lo_sel; | ||||||
|  | 	req.rx_dest_tag_hi_sel = params->rx_dest_tag_hi_sel; | ||||||
|  | 	req.rx_dest_tag_lo_sel = params->rx_dest_tag_lo_sel; | ||||||
|  | 	req.rx_fdq0_sz0_qnum = params->rx_fdq0_sz0_qnum; | ||||||
|  | 	req.rx_fdq1_qnum = params->rx_fdq1_qnum; | ||||||
|  | 	req.rx_fdq2_qnum = params->rx_fdq2_qnum; | ||||||
|  | 	req.rx_fdq3_qnum = params->rx_fdq3_qnum; | ||||||
|  | 	req.rx_ps_location = params->rx_ps_location; | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_do_xfer(info, xfer); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(dev, "RX_FL_CFG: Mbox send fail %d\n", ret); | ||||||
|  | 		goto fail; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp = | ||||||
|  | 	       (struct ti_sci_msg_rm_udmap_flow_cfg_resp *)xfer->tx_message.buf; | ||||||
|  | 	ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL; | ||||||
|  | 
 | ||||||
|  | fail: | ||||||
|  | 	dev_dbg(info->dev, "RX_FL_CFG: %u ret:%d\n", params->flow_index, ret); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * ti_sci_setup_ops() - Setup the operations structures |  * ti_sci_setup_ops() - Setup the operations structures | ||||||
|  * @info:	pointer to TISCI pointer |  * @info:	pointer to TISCI pointer | ||||||
|  | @ -1814,7 +2387,11 @@ static void ti_sci_setup_ops(struct ti_sci_info *info) | ||||||
| 	struct ti_sci_dev_ops *dops = &ops->dev_ops; | 	struct ti_sci_dev_ops *dops = &ops->dev_ops; | ||||||
| 	struct ti_sci_clk_ops *cops = &ops->clk_ops; | 	struct ti_sci_clk_ops *cops = &ops->clk_ops; | ||||||
| 	struct ti_sci_core_ops *core_ops = &ops->core_ops; | 	struct ti_sci_core_ops *core_ops = &ops->core_ops; | ||||||
|  | 	struct ti_sci_rm_core_ops *rm_core_ops = &ops->rm_core_ops; | ||||||
| 	struct ti_sci_proc_ops *pops = &ops->proc_ops; | 	struct ti_sci_proc_ops *pops = &ops->proc_ops; | ||||||
|  | 	struct ti_sci_rm_ringacc_ops *rops = &ops->rm_ring_ops; | ||||||
|  | 	struct ti_sci_rm_psil_ops *psilops = &ops->rm_psil_ops; | ||||||
|  | 	struct ti_sci_rm_udmap_ops *udmap_ops = &ops->rm_udmap_ops; | ||||||
| 
 | 
 | ||||||
| 	bops->board_config = ti_sci_cmd_set_board_config; | 	bops->board_config = ti_sci_cmd_set_board_config; | ||||||
| 	bops->board_config_rm = ti_sci_cmd_set_board_config_rm; | 	bops->board_config_rm = ti_sci_cmd_set_board_config_rm; | ||||||
|  | @ -1850,6 +2427,10 @@ static void ti_sci_setup_ops(struct ti_sci_info *info) | ||||||
| 
 | 
 | ||||||
| 	core_ops->reboot_device = ti_sci_cmd_core_reboot; | 	core_ops->reboot_device = ti_sci_cmd_core_reboot; | ||||||
| 
 | 
 | ||||||
|  | 	rm_core_ops->get_range = ti_sci_cmd_get_resource_range; | ||||||
|  | 	rm_core_ops->get_range_from_shost = | ||||||
|  | 		ti_sci_cmd_get_resource_range_from_shost; | ||||||
|  | 
 | ||||||
| 	pops->proc_request = ti_sci_cmd_proc_request; | 	pops->proc_request = ti_sci_cmd_proc_request; | ||||||
| 	pops->proc_release = ti_sci_cmd_proc_release; | 	pops->proc_release = ti_sci_cmd_proc_release; | ||||||
| 	pops->proc_handover = ti_sci_cmd_proc_handover; | 	pops->proc_handover = ti_sci_cmd_proc_handover; | ||||||
|  | @ -1857,6 +2438,16 @@ static void ti_sci_setup_ops(struct ti_sci_info *info) | ||||||
| 	pops->set_proc_boot_ctrl = ti_sci_cmd_set_proc_boot_ctrl; | 	pops->set_proc_boot_ctrl = ti_sci_cmd_set_proc_boot_ctrl; | ||||||
| 	pops->proc_auth_boot_image = ti_sci_cmd_proc_auth_boot_image; | 	pops->proc_auth_boot_image = ti_sci_cmd_proc_auth_boot_image; | ||||||
| 	pops->get_proc_boot_status = ti_sci_cmd_get_proc_boot_status; | 	pops->get_proc_boot_status = ti_sci_cmd_get_proc_boot_status; | ||||||
|  | 
 | ||||||
|  | 	rops->config = ti_sci_cmd_ring_config; | ||||||
|  | 	rops->get_config = ti_sci_cmd_ring_get_config; | ||||||
|  | 
 | ||||||
|  | 	psilops->pair = ti_sci_cmd_rm_psil_pair; | ||||||
|  | 	psilops->unpair = ti_sci_cmd_rm_psil_unpair; | ||||||
|  | 
 | ||||||
|  | 	udmap_ops->tx_ch_cfg = ti_sci_cmd_rm_udmap_tx_ch_cfg; | ||||||
|  | 	udmap_ops->rx_ch_cfg = ti_sci_cmd_rm_udmap_rx_ch_cfg; | ||||||
|  | 	udmap_ops->rx_flow_cfg = ti_sci_cmd_rm_udmap_rx_flow_cfg; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -1969,7 +2560,7 @@ static int ti_sci_of_to_info(struct udevice *dev, struct ti_sci_info *info) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	info->host_id = dev_read_u32_default(dev, "ti,host-id", | 	info->host_id = dev_read_u32_default(dev, "ti,host-id", | ||||||
| 					     info->desc->host_id); | 					     info->desc->default_host_id); | ||||||
| 
 | 
 | ||||||
| 	info->is_secure = dev_read_bool(dev, "ti,secure-host"); | 	info->is_secure = dev_read_bool(dev, "ti,secure-host"); | ||||||
| 
 | 
 | ||||||
|  | @ -2009,17 +2600,164 @@ static int ti_sci_probe(struct udevice *dev) | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * ti_sci_get_free_resource() - Get a free resource from TISCI resource. | ||||||
|  |  * @res:	Pointer to the TISCI resource | ||||||
|  |  * | ||||||
|  |  * Return: resource num if all went ok else TI_SCI_RESOURCE_NULL. | ||||||
|  |  */ | ||||||
|  | u16 ti_sci_get_free_resource(struct ti_sci_resource *res) | ||||||
|  | { | ||||||
|  | 	u16 set, free_bit; | ||||||
|  | 
 | ||||||
|  | 	for (set = 0; set < res->sets; set++) { | ||||||
|  | 		free_bit = find_first_zero_bit(res->desc[set].res_map, | ||||||
|  | 					       res->desc[set].num); | ||||||
|  | 		if (free_bit != res->desc[set].num) { | ||||||
|  | 			set_bit(free_bit, res->desc[set].res_map); | ||||||
|  | 			return res->desc[set].start + free_bit; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return TI_SCI_RESOURCE_NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ti_sci_release_resource() - Release a resource from TISCI resource. | ||||||
|  |  * @res:	Pointer to the TISCI resource | ||||||
|  |  */ | ||||||
|  | void ti_sci_release_resource(struct ti_sci_resource *res, u16 id) | ||||||
|  | { | ||||||
|  | 	u16 set; | ||||||
|  | 
 | ||||||
|  | 	for (set = 0; set < res->sets; set++) { | ||||||
|  | 		if (res->desc[set].start <= id && | ||||||
|  | 		    (res->desc[set].num + res->desc[set].start) > id) | ||||||
|  | 			clear_bit(id - res->desc[set].start, | ||||||
|  | 				  res->desc[set].res_map); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * devm_ti_sci_get_of_resource() - Get a TISCI resource assigned to a device | ||||||
|  |  * @handle:	TISCI handle | ||||||
|  |  * @dev:	Device pointer to which the resource is assigned | ||||||
|  |  * @of_prop:	property name by which the resource are represented | ||||||
|  |  * | ||||||
|  |  * Note: This function expects of_prop to be in the form of tuples | ||||||
|  |  *	<type, subtype>. Allocates and initializes ti_sci_resource structure | ||||||
|  |  *	for each of_prop. Client driver can directly call | ||||||
|  |  *	ti_sci_(get_free, release)_resource apis for handling the resource. | ||||||
|  |  * | ||||||
|  |  * Return: Pointer to ti_sci_resource if all went well else appropriate | ||||||
|  |  *	   error pointer. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_resource * | ||||||
|  | devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle, | ||||||
|  | 			    struct udevice *dev, u32 dev_id, char *of_prop) | ||||||
|  | { | ||||||
|  | 	u32 resource_subtype; | ||||||
|  | 	u16 resource_type; | ||||||
|  | 	struct ti_sci_resource *res; | ||||||
|  | 	int sets, i, ret; | ||||||
|  | 	u32 *temp; | ||||||
|  | 
 | ||||||
|  | 	res = devm_kzalloc(dev, sizeof(*res), GFP_KERNEL); | ||||||
|  | 	if (!res) | ||||||
|  | 		return ERR_PTR(-ENOMEM); | ||||||
|  | 
 | ||||||
|  | 	sets = dev_read_size(dev, of_prop); | ||||||
|  | 	if (sets < 0) { | ||||||
|  | 		dev_err(dev, "%s resource type ids not available\n", of_prop); | ||||||
|  | 		return ERR_PTR(sets); | ||||||
|  | 	} | ||||||
|  | 	temp = malloc(sets); | ||||||
|  | 	sets /= sizeof(u32); | ||||||
|  | 	res->sets = sets; | ||||||
|  | 
 | ||||||
|  | 	res->desc = devm_kcalloc(dev, res->sets, sizeof(*res->desc), | ||||||
|  | 				 GFP_KERNEL); | ||||||
|  | 	if (!res->desc) | ||||||
|  | 		return ERR_PTR(-ENOMEM); | ||||||
|  | 
 | ||||||
|  | 	ret = ti_sci_get_resource_type(handle_to_ti_sci_info(handle), dev_id, | ||||||
|  | 				       &resource_type); | ||||||
|  | 	if (ret) { | ||||||
|  | 		dev_err(dev, "No valid resource type for %u\n", dev_id); | ||||||
|  | 		return ERR_PTR(-EINVAL); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ret = dev_read_u32_array(dev, of_prop, temp, res->sets); | ||||||
|  | 	if (ret) | ||||||
|  | 		return ERR_PTR(-EINVAL); | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < res->sets; i++) { | ||||||
|  | 		resource_subtype = temp[i]; | ||||||
|  | 		ret = handle->ops.rm_core_ops.get_range(handle, dev_id, | ||||||
|  | 							resource_subtype, | ||||||
|  | 							&res->desc[i].start, | ||||||
|  | 							&res->desc[i].num); | ||||||
|  | 		if (ret) { | ||||||
|  | 			dev_err(dev, "type %d subtype %d not allocated for host %d\n", | ||||||
|  | 				resource_type, resource_subtype, | ||||||
|  | 				handle_to_ti_sci_info(handle)->host_id); | ||||||
|  | 			return ERR_PTR(ret); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		dev_dbg(dev, "res type = %d, subtype = %d, start = %d, num = %d\n", | ||||||
|  | 			resource_type, resource_subtype, res->desc[i].start, | ||||||
|  | 			res->desc[i].num); | ||||||
|  | 
 | ||||||
|  | 		res->desc[i].res_map = | ||||||
|  | 			devm_kzalloc(dev, BITS_TO_LONGS(res->desc[i].num) * | ||||||
|  | 				     sizeof(*res->desc[i].res_map), GFP_KERNEL); | ||||||
|  | 		if (!res->desc[i].res_map) | ||||||
|  | 			return ERR_PTR(-ENOMEM); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return res; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Description for K2G */ | ||||||
|  | static const struct ti_sci_desc ti_sci_pmmc_k2g_desc = { | ||||||
|  | 	.default_host_id = 2, | ||||||
|  | 	/* Conservative duration */ | ||||||
|  | 	.max_rx_timeout_ms = 10000, | ||||||
|  | 	/* Limited by MBOX_TX_QUEUE_LEN. K2G can handle upto 128 messages! */ | ||||||
|  | 	.max_msgs = 20, | ||||||
|  | 	.max_msg_size = 64, | ||||||
|  | 	.rm_type_map = NULL, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static struct ti_sci_rm_type_map ti_sci_am654_rm_type_map[] = { | ||||||
|  | 	{.dev_id = 56, .type = 0x00b}, /* GIC_IRQ */ | ||||||
|  | 	{.dev_id = 179, .type = 0x000}, /* MAIN_NAV_UDMASS_IA0 */ | ||||||
|  | 	{.dev_id = 187, .type = 0x009}, /* MAIN_NAV_RA */ | ||||||
|  | 	{.dev_id = 188, .type = 0x006}, /* MAIN_NAV_UDMAP */ | ||||||
|  | 	{.dev_id = 194, .type = 0x007}, /* MCU_NAV_UDMAP */ | ||||||
|  | 	{.dev_id = 195, .type = 0x00a}, /* MCU_NAV_RA */ | ||||||
|  | 	{.dev_id = 0, .type = 0x000}, /* end of table */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /* Description for AM654 */ | /* Description for AM654 */ | ||||||
| static const struct ti_sci_desc ti_sci_sysfw_am654_desc = { | static const struct ti_sci_desc ti_sci_pmmc_am654_desc = { | ||||||
| 	.host_id = 4, | 	.default_host_id = 12, | ||||||
| 	.max_rx_timeout_us = 1000000, | 	/* Conservative duration */ | ||||||
|  | 	.max_rx_timeout_ms = 10000, | ||||||
|  | 	/* Limited by MBOX_TX_QUEUE_LEN. K2G can handle upto 128 messages! */ | ||||||
|  | 	.max_msgs = 20, | ||||||
| 	.max_msg_size = 60, | 	.max_msg_size = 60, | ||||||
|  | 	.rm_type_map = ti_sci_am654_rm_type_map, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const struct udevice_id ti_sci_ids[] = { | static const struct udevice_id ti_sci_ids[] = { | ||||||
| 	{ | 	{ | ||||||
| 		.compatible = "ti,k2g-sci", | 		.compatible = "ti,k2g-sci", | ||||||
| 		.data = (ulong)&ti_sci_sysfw_am654_desc | 		.data = (ulong)&ti_sci_pmmc_k2g_desc | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.compatible = "ti,am654-sci", | ||||||
|  | 		.data = (ulong)&ti_sci_pmmc_am654_desc | ||||||
| 	}, | 	}, | ||||||
| 	{ /* Sentinel */ }, | 	{ /* Sentinel */ }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -50,6 +50,34 @@ | ||||||
| #define TISCI_MSG_PROC_AUTH_BOOT_IMIAGE	0xc120 | #define TISCI_MSG_PROC_AUTH_BOOT_IMIAGE	0xc120 | ||||||
| #define TISCI_MSG_GET_PROC_BOOT_STATUS	0xc400 | #define TISCI_MSG_GET_PROC_BOOT_STATUS	0xc400 | ||||||
| 
 | 
 | ||||||
|  | /* Resource Management Requests */ | ||||||
|  | #define TI_SCI_MSG_GET_RESOURCE_RANGE	0x1500 | ||||||
|  | 
 | ||||||
|  | /* NAVSS resource management */ | ||||||
|  | /* Ringacc requests */ | ||||||
|  | #define TI_SCI_MSG_RM_RING_CFG			0x1110 | ||||||
|  | #define TI_SCI_MSG_RM_RING_GET_CFG		0x1111 | ||||||
|  | 
 | ||||||
|  | /* PSI-L requests */ | ||||||
|  | #define TI_SCI_MSG_RM_PSIL_PAIR			0x1280 | ||||||
|  | #define TI_SCI_MSG_RM_PSIL_UNPAIR		0x1281 | ||||||
|  | 
 | ||||||
|  | #define TI_SCI_MSG_RM_UDMAP_TX_ALLOC		0x1200 | ||||||
|  | #define TI_SCI_MSG_RM_UDMAP_TX_FREE		0x1201 | ||||||
|  | #define TI_SCI_MSG_RM_UDMAP_RX_ALLOC		0x1210 | ||||||
|  | #define TI_SCI_MSG_RM_UDMAP_RX_FREE		0x1211 | ||||||
|  | #define TI_SCI_MSG_RM_UDMAP_FLOW_CFG		0x1220 | ||||||
|  | #define TI_SCI_MSG_RM_UDMAP_OPT_FLOW_CFG	0x1221 | ||||||
|  | 
 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_TX_CH_CFG		0x1205 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_TX_CH_GET_CFG	0x1206 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_RX_CH_CFG		0x1215 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_RX_CH_GET_CFG	0x1216 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_FLOW_CFG		0x1230 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_CFG	0x1231 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_FLOW_GET_CFG		0x1232 | ||||||
|  | #define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_GET_CFG	0x1233 | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses |  * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses | ||||||
|  * @type:	Type of messages: One of TI_SCI_MSG* values |  * @type:	Type of messages: One of TI_SCI_MSG* values | ||||||
|  | @ -505,6 +533,45 @@ struct ti_sci_msg_resp_get_clock_freq { | ||||||
| 	u64 freq_hz; | 	u64 freq_hz; | ||||||
| } __packed; | } __packed; | ||||||
| 
 | 
 | ||||||
|  | #define TI_SCI_IRQ_SECONDARY_HOST_INVALID	0xff | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_req_get_resource_range - Request to get a host's assigned | ||||||
|  |  *					      range of resources. | ||||||
|  |  * @hdr:		Generic Header | ||||||
|  |  * @type:		Unique resource assignment type | ||||||
|  |  * @subtype:		Resource assignment subtype within the resource type. | ||||||
|  |  * @secondary_host:	Host processing entity to which the resources are | ||||||
|  |  *			allocated. This is required only when the destination | ||||||
|  |  *			host id id different from ti sci interface host id, | ||||||
|  |  *			else TI_SCI_IRQ_SECONDARY_HOST_INVALID can be passed. | ||||||
|  |  * | ||||||
|  |  * Request type is TI_SCI_MSG_GET_RESOURCE_RANGE. Responded with requested | ||||||
|  |  * resource range which is of type TI_SCI_MSG_GET_RESOURCE_RANGE. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_req_get_resource_range { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | #define MSG_RM_RESOURCE_TYPE_MASK	GENMASK(9, 0) | ||||||
|  | #define MSG_RM_RESOURCE_SUBTYPE_MASK	GENMASK(5, 0) | ||||||
|  | 	u16 type; | ||||||
|  | 	u8 subtype; | ||||||
|  | 	u8 secondary_host; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_resp_get_resource_range - Response to resource get range. | ||||||
|  |  * @hdr:		Generic Header | ||||||
|  |  * @range_start:	Start index of the resource range. | ||||||
|  |  * @range_num:		Number of resources in the range. | ||||||
|  |  * | ||||||
|  |  * Response to request TI_SCI_MSG_GET_RESOURCE_RANGE. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_resp_get_resource_range { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u16 range_start; | ||||||
|  | 	u16 range_num; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
| #define TISCI_ADDR_LOW_MASK		GENMASK_ULL(31, 0) | #define TISCI_ADDR_LOW_MASK		GENMASK_ULL(31, 0) | ||||||
| #define TISCI_ADDR_HIGH_MASK		GENMASK_ULL(63, 32) | #define TISCI_ADDR_HIGH_MASK		GENMASK_ULL(63, 32) | ||||||
| #define TISCI_ADDR_HIGH_SHIFT		32 | #define TISCI_ADDR_HIGH_SHIFT		32 | ||||||
|  | @ -677,4 +744,579 @@ struct ti_sci_msg_resp_get_proc_boot_status { | ||||||
| 	u32 status_flags; | 	u32 status_flags; | ||||||
| } __packed; | } __packed; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_rm_ring_cfg_req - Configure a Navigator Subsystem ring | ||||||
|  |  * | ||||||
|  |  * Configures the non-real-time registers of a Navigator Subsystem ring. | ||||||
|  |  * @hdr:	Generic Header | ||||||
|  |  * @valid_params: Bitfield defining validity of ring configuration parameters. | ||||||
|  |  *	The ring configuration fields are not valid, and will not be used for | ||||||
|  |  *	ring configuration, if their corresponding valid bit is zero. | ||||||
|  |  *	Valid bit usage: | ||||||
|  |  *	0 - Valid bit for @tisci_msg_rm_ring_cfg_req addr_lo | ||||||
|  |  *	1 - Valid bit for @tisci_msg_rm_ring_cfg_req addr_hi | ||||||
|  |  *	2 - Valid bit for @tisci_msg_rm_ring_cfg_req count | ||||||
|  |  *	3 - Valid bit for @tisci_msg_rm_ring_cfg_req mode | ||||||
|  |  *	4 - Valid bit for @tisci_msg_rm_ring_cfg_req size | ||||||
|  |  *	5 - Valid bit for @tisci_msg_rm_ring_cfg_req order_id | ||||||
|  |  * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated | ||||||
|  |  * @index: ring index to be configured. | ||||||
|  |  * @addr_lo: 32 LSBs of ring base address to be programmed into the ring's | ||||||
|  |  *	RING_BA_LO register | ||||||
|  |  * @addr_hi: 16 MSBs of ring base address to be programmed into the ring's | ||||||
|  |  *	RING_BA_HI register. | ||||||
|  |  * @count: Number of ring elements. Must be even if mode is CREDENTIALS or QM | ||||||
|  |  *	modes. | ||||||
|  |  * @mode: Specifies the mode the ring is to be configured. | ||||||
|  |  * @size: Specifies encoded ring element size. To calculate the encoded size use | ||||||
|  |  *	the formula (log2(size_bytes) - 2), where size_bytes cannot be | ||||||
|  |  *	greater than 256. | ||||||
|  |  * @order_id: Specifies the ring's bus order ID. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_ring_cfg_req { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 valid_params; | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 index; | ||||||
|  | 	u32 addr_lo; | ||||||
|  | 	u32 addr_hi; | ||||||
|  | 	u32 count; | ||||||
|  | 	u8 mode; | ||||||
|  | 	u8 size; | ||||||
|  | 	u8 order_id; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_rm_ring_cfg_resp - Response to configuring a ring. | ||||||
|  |  * | ||||||
|  |  * @hdr:	Generic Header | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_ring_cfg_resp { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_rm_ring_get_cfg_req - Get RA ring's configuration | ||||||
|  |  * | ||||||
|  |  * Gets the configuration of the non-real-time register fields of a ring.  The | ||||||
|  |  * host, or a supervisor of the host, who owns the ring must be the requesting | ||||||
|  |  * host.  The values of the non-real-time registers are returned in | ||||||
|  |  * @ti_sci_msg_rm_ring_get_cfg_resp. | ||||||
|  |  * | ||||||
|  |  * @hdr: Generic Header | ||||||
|  |  * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated | ||||||
|  |  * @index: ring index. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_ring_get_cfg_req { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 index; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_rm_ring_get_cfg_resp -  Ring get configuration response | ||||||
|  |  * | ||||||
|  |  * Response received by host processor after RM has handled | ||||||
|  |  * @ti_sci_msg_rm_ring_get_cfg_req. The response contains the ring's | ||||||
|  |  * non-real-time register values. | ||||||
|  |  * | ||||||
|  |  * @hdr: Generic Header | ||||||
|  |  * @addr_lo: Ring 32 LSBs of base address | ||||||
|  |  * @addr_hi: Ring 16 MSBs of base address. | ||||||
|  |  * @count: Ring number of elements. | ||||||
|  |  * @mode: Ring mode. | ||||||
|  |  * @size: encoded Ring element size | ||||||
|  |  * @order_id: ing order ID. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_ring_get_cfg_resp { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 addr_lo; | ||||||
|  | 	u32 addr_hi; | ||||||
|  | 	u32 count; | ||||||
|  | 	u8 mode; | ||||||
|  | 	u8 size; | ||||||
|  | 	u8 order_id; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_psil_pair - Pairs a PSI-L source thread to a destination | ||||||
|  |  *				 thread | ||||||
|  |  * @hdr:	Generic Header | ||||||
|  |  * @nav_id:	SoC Navigator Subsystem device ID whose PSI-L config proxy is | ||||||
|  |  *		used to pair the source and destination threads. | ||||||
|  |  * @src_thread:	PSI-L source thread ID within the PSI-L System thread map. | ||||||
|  |  * | ||||||
|  |  * UDMAP transmit channels mapped to source threads will have their | ||||||
|  |  * TCHAN_THRD_ID register programmed with the destination thread if the pairing | ||||||
|  |  * is successful. | ||||||
|  | 
 | ||||||
|  |  * @dst_thread: PSI-L destination thread ID within the PSI-L System thread map. | ||||||
|  |  * PSI-L destination threads start at index 0x8000.  The request is NACK'd if | ||||||
|  |  * the destination thread is not greater than or equal to 0x8000. | ||||||
|  |  * | ||||||
|  |  * UDMAP receive channels mapped to destination threads will have their | ||||||
|  |  * RCHAN_THRD_ID register programmed with the source thread if the pairing | ||||||
|  |  * is successful. | ||||||
|  |  * | ||||||
|  |  * Request type is TI_SCI_MSG_RM_PSIL_PAIR, response is a generic ACK or NACK | ||||||
|  |  * message. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_psil_pair { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 nav_id; | ||||||
|  | 	u32 src_thread; | ||||||
|  | 	u32 dst_thread; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_msg_psil_unpair - Unpairs a PSI-L source thread from a | ||||||
|  |  *				   destination thread | ||||||
|  |  * @hdr:	Generic Header | ||||||
|  |  * @nav_id:	SoC Navigator Subsystem device ID whose PSI-L config proxy is | ||||||
|  |  *		used to unpair the source and destination threads. | ||||||
|  |  * @src_thread:	PSI-L source thread ID within the PSI-L System thread map. | ||||||
|  |  * | ||||||
|  |  * UDMAP transmit channels mapped to source threads will have their | ||||||
|  |  * TCHAN_THRD_ID register cleared if the unpairing is successful. | ||||||
|  |  * | ||||||
|  |  * @dst_thread: PSI-L destination thread ID within the PSI-L System thread map. | ||||||
|  |  * PSI-L destination threads start at index 0x8000.  The request is NACK'd if | ||||||
|  |  * the destination thread is not greater than or equal to 0x8000. | ||||||
|  |  * | ||||||
|  |  * UDMAP receive channels mapped to destination threads will have their | ||||||
|  |  * RCHAN_THRD_ID register cleared if the unpairing is successful. | ||||||
|  |  * | ||||||
|  |  * Request type is TI_SCI_MSG_RM_PSIL_UNPAIR, response is a generic ACK or NACK | ||||||
|  |  * message. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_psil_unpair { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 nav_id; | ||||||
|  | 	u32 src_thread; | ||||||
|  | 	u32 dst_thread; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Configures a Navigator Subsystem UDMAP transmit channel | ||||||
|  |  * | ||||||
|  |  * Configures the non-real-time registers of a Navigator Subsystem UDMAP | ||||||
|  |  * transmit channel.  The channel index must be assigned to the host defined | ||||||
|  |  * in the TISCI header via the RM board configuration resource assignment | ||||||
|  |  * range list. | ||||||
|  |  * | ||||||
|  |  * @hdr: Generic Header | ||||||
|  |  * | ||||||
|  |  * @valid_params: Bitfield defining validity of tx channel configuration | ||||||
|  |  * parameters. The tx channel configuration fields are not valid, and will not | ||||||
|  |  * be used for ch configuration, if their corresponding valid bit is zero. | ||||||
|  |  * Valid bit usage: | ||||||
|  |  *    0 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_pause_on_err | ||||||
|  |  *    1 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_atype | ||||||
|  |  *    2 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_chan_type | ||||||
|  |  *    3 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_fetch_size | ||||||
|  |  *    4 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::txcq_qnum | ||||||
|  |  *    5 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_priority | ||||||
|  |  *    6 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_qos | ||||||
|  |  *    7 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_orderid | ||||||
|  |  *    8 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_sched_priority | ||||||
|  |  *    9 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_filt_einfo | ||||||
|  |  *   10 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_filt_pswords | ||||||
|  |  *   11 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_supr_tdpkt | ||||||
|  |  *   12 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_credit_count | ||||||
|  |  *   13 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::fdepth | ||||||
|  |  * | ||||||
|  |  * @nav_id: SoC device ID of Navigator Subsystem where tx channel is located | ||||||
|  |  * | ||||||
|  |  * @index: UDMAP transmit channel index. | ||||||
|  |  * | ||||||
|  |  * @tx_pause_on_err: UDMAP transmit channel pause on error configuration to | ||||||
|  |  * be programmed into the tx_pause_on_err field of the channel's TCHAN_TCFG | ||||||
|  |  * register. | ||||||
|  |  * | ||||||
|  |  * @tx_filt_einfo: UDMAP transmit channel extended packet information passing | ||||||
|  |  * configuration to be programmed into the tx_filt_einfo field of the | ||||||
|  |  * channel's TCHAN_TCFG register. | ||||||
|  |  * | ||||||
|  |  * @tx_filt_pswords: UDMAP transmit channel protocol specific word passing | ||||||
|  |  * configuration to be programmed into the tx_filt_pswords field of the | ||||||
|  |  * channel's TCHAN_TCFG register. | ||||||
|  |  * | ||||||
|  |  * @tx_atype: UDMAP transmit channel non Ring Accelerator access pointer | ||||||
|  |  * interpretation configuration to be programmed into the tx_atype field of | ||||||
|  |  * the channel's TCHAN_TCFG register. | ||||||
|  |  * | ||||||
|  |  * @tx_chan_type: UDMAP transmit channel functional channel type and work | ||||||
|  |  * passing mechanism configuration to be programmed into the tx_chan_type | ||||||
|  |  * field of the channel's TCHAN_TCFG register. | ||||||
|  |  * | ||||||
|  |  * @tx_supr_tdpkt: UDMAP transmit channel teardown packet generation suppression | ||||||
|  |  * configuration to be programmed into the tx_supr_tdpkt field of the channel's | ||||||
|  |  * TCHAN_TCFG register. | ||||||
|  |  * | ||||||
|  |  * @tx_fetch_size: UDMAP transmit channel number of 32-bit descriptor words to | ||||||
|  |  * fetch configuration to be programmed into the tx_fetch_size field of the | ||||||
|  |  * channel's TCHAN_TCFG register.  The user must make sure to set the maximum | ||||||
|  |  * word count that can pass through the channel for any allowed descriptor type. | ||||||
|  |  * | ||||||
|  |  * @tx_credit_count: UDMAP transmit channel transfer request credit count | ||||||
|  |  * configuration to be programmed into the count field of the TCHAN_TCREDIT | ||||||
|  |  * register.  Specifies how many credits for complete TRs are available. | ||||||
|  |  * | ||||||
|  |  * @txcq_qnum: UDMAP transmit channel completion queue configuration to be | ||||||
|  |  * programmed into the txcq_qnum field of the TCHAN_TCQ register. The specified | ||||||
|  |  * completion queue must be assigned to the host, or a subordinate of the host, | ||||||
|  |  * requesting configuration of the transmit channel. | ||||||
|  |  * | ||||||
|  |  * @tx_priority: UDMAP transmit channel transmit priority value to be programmed | ||||||
|  |  * into the priority field of the channel's TCHAN_TPRI_CTRL register. | ||||||
|  |  * | ||||||
|  |  * @tx_qos: UDMAP transmit channel transmit qos value to be programmed into the | ||||||
|  |  * qos field of the channel's TCHAN_TPRI_CTRL register. | ||||||
|  |  * | ||||||
|  |  * @tx_orderid: UDMAP transmit channel bus order id value to be programmed into | ||||||
|  |  * the orderid field of the channel's TCHAN_TPRI_CTRL register. | ||||||
|  |  * | ||||||
|  |  * @fdepth: UDMAP transmit channel FIFO depth configuration to be programmed | ||||||
|  |  * into the fdepth field of the TCHAN_TFIFO_DEPTH register. Sets the number of | ||||||
|  |  * Tx FIFO bytes which are allowed to be stored for the channel. Check the UDMAP | ||||||
|  |  * section of the TRM for restrictions regarding this parameter. | ||||||
|  |  * | ||||||
|  |  * @tx_sched_priority: UDMAP transmit channel tx scheduling priority | ||||||
|  |  * configuration to be programmed into the priority field of the channel's | ||||||
|  |  * TCHAN_TST_SCHED register. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_tx_ch_cfg_req { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 valid_params; | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 index; | ||||||
|  | 	u8 tx_pause_on_err; | ||||||
|  | 	u8 tx_filt_einfo; | ||||||
|  | 	u8 tx_filt_pswords; | ||||||
|  | 	u8 tx_atype; | ||||||
|  | 	u8 tx_chan_type; | ||||||
|  | 	u8 tx_supr_tdpkt; | ||||||
|  | 	u16 tx_fetch_size; | ||||||
|  | 	u8 tx_credit_count; | ||||||
|  | 	u16 txcq_qnum; | ||||||
|  | 	u8 tx_priority; | ||||||
|  | 	u8 tx_qos; | ||||||
|  | 	u8 tx_orderid; | ||||||
|  | 	u16 fdepth; | ||||||
|  | 	u8 tx_sched_priority; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  *  Response to configuring a UDMAP transmit channel. | ||||||
|  |  * | ||||||
|  |  * @hdr: Standard TISCI header | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_tx_ch_cfg_resp { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive channel | ||||||
|  |  * | ||||||
|  |  * Configures the non-real-time registers of a Navigator Subsystem UDMAP | ||||||
|  |  * receive channel.  The channel index must be assigned to the host defined | ||||||
|  |  * in the TISCI header via the RM board configuration resource assignment | ||||||
|  |  * range list. | ||||||
|  |  * | ||||||
|  |  * @hdr: Generic Header | ||||||
|  |  * | ||||||
|  |  * @valid_params: Bitfield defining validity of rx channel configuration | ||||||
|  |  * parameters. | ||||||
|  |  * The rx channel configuration fields are not valid, and will not be used for | ||||||
|  |  * ch configuration, if their corresponding valid bit is zero. | ||||||
|  |  * Valid bit usage: | ||||||
|  |  *    0 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_pause_on_err | ||||||
|  |  *    1 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_atype | ||||||
|  |  *    2 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_chan_type | ||||||
|  |  *    3 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_fetch_size | ||||||
|  |  *    4 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rxcq_qnum | ||||||
|  |  *    5 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_priority | ||||||
|  |  *    6 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_qos | ||||||
|  |  *    7 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_orderid | ||||||
|  |  *    8 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_sched_priority | ||||||
|  |  *    9 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::flowid_start | ||||||
|  |  *   10 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::flowid_cnt | ||||||
|  |  *   11 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_ignore_short | ||||||
|  |  *   12 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_ignore_long | ||||||
|  |  * | ||||||
|  |  * @nav_id: SoC device ID of Navigator Subsystem where rx channel is located | ||||||
|  |  * | ||||||
|  |  * @index: UDMAP receive channel index. | ||||||
|  |  * | ||||||
|  |  * @rx_fetch_size: UDMAP receive channel number of 32-bit descriptor words to | ||||||
|  |  * fetch configuration to be programmed into the rx_fetch_size field of the | ||||||
|  |  * channel's RCHAN_RCFG register. | ||||||
|  |  * | ||||||
|  |  * @rxcq_qnum: UDMAP receive channel completion queue configuration to be | ||||||
|  |  * programmed into the rxcq_qnum field of the RCHAN_RCQ register. | ||||||
|  |  * The specified completion queue must be assigned to the host, or a subordinate | ||||||
|  |  * of the host, requesting configuration of the receive channel. | ||||||
|  |  * | ||||||
|  |  * @rx_priority: UDMAP receive channel receive priority value to be programmed | ||||||
|  |  * into the priority field of the channel's RCHAN_RPRI_CTRL register. | ||||||
|  |  * | ||||||
|  |  * @rx_qos: UDMAP receive channel receive qos value to be programmed into the | ||||||
|  |  * qos field of the channel's RCHAN_RPRI_CTRL register. | ||||||
|  |  * | ||||||
|  |  * @rx_orderid: UDMAP receive channel bus order id value to be programmed into | ||||||
|  |  * the orderid field of the channel's RCHAN_RPRI_CTRL register. | ||||||
|  |  * | ||||||
|  |  * @rx_sched_priority: UDMAP receive channel rx scheduling priority | ||||||
|  |  * configuration to be programmed into the priority field of the channel's | ||||||
|  |  * RCHAN_RST_SCHED register. | ||||||
|  |  * | ||||||
|  |  * @flowid_start: UDMAP receive channel additional flows starting index | ||||||
|  |  * configuration to program into the flow_start field of the RCHAN_RFLOW_RNG | ||||||
|  |  * register. Specifies the starting index for flow IDs the receive channel is to | ||||||
|  |  * make use of beyond the default flow. flowid_start and @ref flowid_cnt must be | ||||||
|  |  * set as valid and configured together. The starting flow ID set by | ||||||
|  |  * @ref flowid_cnt must be a flow index within the Navigator Subsystem's subset | ||||||
|  |  * of flows beyond the default flows statically mapped to receive channels. | ||||||
|  |  * The additional flows must be assigned to the host, or a subordinate of the | ||||||
|  |  * host, requesting configuration of the receive channel. | ||||||
|  |  * | ||||||
|  |  * @flowid_cnt: UDMAP receive channel additional flows count configuration to | ||||||
|  |  * program into the flowid_cnt field of the RCHAN_RFLOW_RNG register. | ||||||
|  |  * This field specifies how many flow IDs are in the additional contiguous range | ||||||
|  |  * of legal flow IDs for the channel.  @ref flowid_start and flowid_cnt must be | ||||||
|  |  * set as valid and configured together. Disabling the valid_params field bit | ||||||
|  |  * for flowid_cnt indicates no flow IDs other than the default are to be | ||||||
|  |  * allocated and used by the receive channel. @ref flowid_start plus flowid_cnt | ||||||
|  |  * cannot be greater than the number of receive flows in the receive channel's | ||||||
|  |  * Navigator Subsystem.  The additional flows must be assigned to the host, or a | ||||||
|  |  * subordinate of the host, requesting configuration of the receive channel. | ||||||
|  |  * | ||||||
|  |  * @rx_pause_on_err: UDMAP receive channel pause on error configuration to be | ||||||
|  |  * programmed into the rx_pause_on_err field of the channel's RCHAN_RCFG | ||||||
|  |  * register. | ||||||
|  |  * | ||||||
|  |  * @rx_atype: UDMAP receive channel non Ring Accelerator access pointer | ||||||
|  |  * interpretation configuration to be programmed into the rx_atype field of the | ||||||
|  |  * channel's RCHAN_RCFG register. | ||||||
|  |  * | ||||||
|  |  * @rx_chan_type: UDMAP receive channel functional channel type and work passing | ||||||
|  |  * mechanism configuration to be programmed into the rx_chan_type field of the | ||||||
|  |  * channel's RCHAN_RCFG register. | ||||||
|  |  * | ||||||
|  |  * @rx_ignore_short: UDMAP receive channel short packet treatment configuration | ||||||
|  |  * to be programmed into the rx_ignore_short field of the RCHAN_RCFG register. | ||||||
|  |  * | ||||||
|  |  * @rx_ignore_long: UDMAP receive channel long packet treatment configuration to | ||||||
|  |  * be programmed into the rx_ignore_long field of the RCHAN_RCFG register. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_rx_ch_cfg_req { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 valid_params; | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 index; | ||||||
|  | 	u16 rx_fetch_size; | ||||||
|  | 	u16 rxcq_qnum; | ||||||
|  | 	u8 rx_priority; | ||||||
|  | 	u8 rx_qos; | ||||||
|  | 	u8 rx_orderid; | ||||||
|  | 	u8 rx_sched_priority; | ||||||
|  | 	u16 flowid_start; | ||||||
|  | 	u16 flowid_cnt; | ||||||
|  | 	u8 rx_pause_on_err; | ||||||
|  | 	u8 rx_atype; | ||||||
|  | 	u8 rx_chan_type; | ||||||
|  | 	u8 rx_ignore_short; | ||||||
|  | 	u8 rx_ignore_long; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Response to configuring a UDMAP receive channel. | ||||||
|  |  * | ||||||
|  |  * @hdr: Standard TISCI header | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_rx_ch_cfg_resp { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive flow | ||||||
|  |  * | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive flow's registers. | ||||||
|  |  * Configuration does not include the flow registers which handle size-based | ||||||
|  |  * free descriptor queue routing. | ||||||
|  |  * | ||||||
|  |  * The flow index must be assigned to the host defined in the TISCI header via | ||||||
|  |  * the RM board configuration resource assignment range list. | ||||||
|  |  * | ||||||
|  |  * @hdr: Standard TISCI header | ||||||
|  |  * | ||||||
|  |  * @valid_params | ||||||
|  |  * Bitfield defining validity of rx flow configuration parameters.  The | ||||||
|  |  * rx flow configuration fields are not valid, and will not be used for flow | ||||||
|  |  * configuration, if their corresponding valid bit is zero.  Valid bit usage: | ||||||
|  |  *     0 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_einfo_present | ||||||
|  |  *     1 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_psinfo_present | ||||||
|  |  *     2 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_error_handling | ||||||
|  |  *     3 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_desc_type | ||||||
|  |  *     4 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_sop_offset | ||||||
|  |  *     5 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_qnum | ||||||
|  |  *     6 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_hi | ||||||
|  |  *     7 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_lo | ||||||
|  |  *     8 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_hi | ||||||
|  |  *     9 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_lo | ||||||
|  |  *    10 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_hi_sel | ||||||
|  |  *    11 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_lo_sel | ||||||
|  |  *    12 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_hi_sel | ||||||
|  |  *    13 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_lo_sel | ||||||
|  |  *    14 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq0_sz0_qnum | ||||||
|  |  *    15 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq1_sz0_qnum | ||||||
|  |  *    16 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq2_sz0_qnum | ||||||
|  |  *    17 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq3_sz0_qnum | ||||||
|  |  *    18 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_ps_location | ||||||
|  |  * | ||||||
|  |  * @nav_id: SoC device ID of Navigator Subsystem from which the receive flow is | ||||||
|  |  * allocated | ||||||
|  |  * | ||||||
|  |  * @flow_index: UDMAP receive flow index for non-optional configuration. | ||||||
|  |  * | ||||||
|  |  * @rx_einfo_present: | ||||||
|  |  * UDMAP receive flow extended packet info present configuration to be | ||||||
|  |  * programmed into the rx_einfo_present field of the flow's RFLOW_RFA register. | ||||||
|  |  * | ||||||
|  |  * @rx_psinfo_present: | ||||||
|  |  * UDMAP receive flow PS words present configuration to be programmed into the | ||||||
|  |  * rx_psinfo_present field of the flow's RFLOW_RFA register. | ||||||
|  |  * | ||||||
|  |  * @rx_error_handling: | ||||||
|  |  * UDMAP receive flow error handling configuration to be programmed into the | ||||||
|  |  * rx_error_handling field of the flow's RFLOW_RFA register. | ||||||
|  |  * | ||||||
|  |  * @rx_desc_type: | ||||||
|  |  * UDMAP receive flow descriptor type configuration to be programmed into the | ||||||
|  |  * rx_desc_type field field of the flow's RFLOW_RFA register. | ||||||
|  |  * | ||||||
|  |  * @rx_sop_offset: | ||||||
|  |  * UDMAP receive flow start of packet offset configuration to be programmed | ||||||
|  |  * into the rx_sop_offset field of the RFLOW_RFA register.  See the UDMAP | ||||||
|  |  * section of the TRM for more information on this setting.  Valid values for | ||||||
|  |  * this field are 0-255 bytes. | ||||||
|  |  * | ||||||
|  |  * @rx_dest_qnum: | ||||||
|  |  * UDMAP receive flow destination queue configuration to be programmed into the | ||||||
|  |  * rx_dest_qnum field of the flow's RFLOW_RFA register.  The specified | ||||||
|  |  * destination queue must be valid within the Navigator Subsystem and must be | ||||||
|  |  * owned by the host, or a subordinate of the host, requesting allocation and | ||||||
|  |  * configuration of the receive flow. | ||||||
|  |  * | ||||||
|  |  * @rx_src_tag_hi: | ||||||
|  |  * UDMAP receive flow source tag high byte constant configuration to be | ||||||
|  |  * programmed into the rx_src_tag_hi field of the flow's RFLOW_RFB register. | ||||||
|  |  * See the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_src_tag_lo: | ||||||
|  |  * UDMAP receive flow source tag low byte constant configuration to be | ||||||
|  |  * programmed into the rx_src_tag_lo field of the flow's RFLOW_RFB register. | ||||||
|  |  * See the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_dest_tag_hi: | ||||||
|  |  * UDMAP receive flow destination tag high byte constant configuration to be | ||||||
|  |  * programmed into the rx_dest_tag_hi field of the flow's RFLOW_RFB register. | ||||||
|  |  * See the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_dest_tag_lo: | ||||||
|  |  * UDMAP receive flow destination tag low byte constant configuration to be | ||||||
|  |  * programmed into the rx_dest_tag_lo field of the flow's RFLOW_RFB register. | ||||||
|  |  * See the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_src_tag_hi_sel: | ||||||
|  |  * UDMAP receive flow source tag high byte selector configuration to be | ||||||
|  |  * programmed into the rx_src_tag_hi_sel field of the RFLOW_RFC register.  See | ||||||
|  |  * the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_src_tag_lo_sel: | ||||||
|  |  * UDMAP receive flow source tag low byte selector configuration to be | ||||||
|  |  * programmed into the rx_src_tag_lo_sel field of the RFLOW_RFC register.  See | ||||||
|  |  * the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_dest_tag_hi_sel: | ||||||
|  |  * UDMAP receive flow destination tag high byte selector configuration to be | ||||||
|  |  * programmed into the rx_dest_tag_hi_sel field of the RFLOW_RFC register.  See | ||||||
|  |  * the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_dest_tag_lo_sel: | ||||||
|  |  * UDMAP receive flow destination tag low byte selector configuration to be | ||||||
|  |  * programmed into the rx_dest_tag_lo_sel field of the RFLOW_RFC register.  See | ||||||
|  |  * the UDMAP section of the TRM for more information on this setting. | ||||||
|  |  * | ||||||
|  |  * @rx_fdq0_sz0_qnum: | ||||||
|  |  * UDMAP receive flow free descriptor queue 0 configuration to be programmed | ||||||
|  |  * into the rx_fdq0_sz0_qnum field of the flow's RFLOW_RFD register.  See the | ||||||
|  |  * UDMAP section of the TRM for more information on this setting. The specified | ||||||
|  |  * free queue must be valid within the Navigator Subsystem and must be owned | ||||||
|  |  * by the host, or a subordinate of the host, requesting allocation and | ||||||
|  |  * configuration of the receive flow. | ||||||
|  |  * | ||||||
|  |  * @rx_fdq1_qnum: | ||||||
|  |  * UDMAP receive flow free descriptor queue 1 configuration to be programmed | ||||||
|  |  * into the rx_fdq1_qnum field of the flow's RFLOW_RFD register.  See the | ||||||
|  |  * UDMAP section of the TRM for more information on this setting.  The specified | ||||||
|  |  * free queue must be valid within the Navigator Subsystem and must be owned | ||||||
|  |  * by the host, or a subordinate of the host, requesting allocation and | ||||||
|  |  * configuration of the receive flow. | ||||||
|  |  * | ||||||
|  |  * @rx_fdq2_qnum: | ||||||
|  |  * UDMAP receive flow free descriptor queue 2 configuration to be programmed | ||||||
|  |  * into the rx_fdq2_qnum field of the flow's RFLOW_RFE register.  See the | ||||||
|  |  * UDMAP section of the TRM for more information on this setting.  The specified | ||||||
|  |  * free queue must be valid within the Navigator Subsystem and must be owned | ||||||
|  |  * by the host, or a subordinate of the host, requesting allocation and | ||||||
|  |  * configuration of the receive flow. | ||||||
|  |  * | ||||||
|  |  * @rx_fdq3_qnum: | ||||||
|  |  * UDMAP receive flow free descriptor queue 3 configuration to be programmed | ||||||
|  |  * into the rx_fdq3_qnum field of the flow's RFLOW_RFE register.  See the | ||||||
|  |  * UDMAP section of the TRM for more information on this setting.  The specified | ||||||
|  |  * free queue must be valid within the Navigator Subsystem and must be owned | ||||||
|  |  * by the host, or a subordinate of the host, requesting allocation and | ||||||
|  |  * configuration of the receive flow. | ||||||
|  |  * | ||||||
|  |  * @rx_ps_location: | ||||||
|  |  * UDMAP receive flow PS words location configuration to be programmed into the | ||||||
|  |  * rx_ps_location field of the flow's RFLOW_RFA register. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_flow_cfg_req { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | 	u32 valid_params; | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 flow_index; | ||||||
|  | 	u8 rx_einfo_present; | ||||||
|  | 	u8 rx_psinfo_present; | ||||||
|  | 	u8 rx_error_handling; | ||||||
|  | 	u8 rx_desc_type; | ||||||
|  | 	u16 rx_sop_offset; | ||||||
|  | 	u16 rx_dest_qnum; | ||||||
|  | 	u8 rx_src_tag_hi; | ||||||
|  | 	u8 rx_src_tag_lo; | ||||||
|  | 	u8 rx_dest_tag_hi; | ||||||
|  | 	u8 rx_dest_tag_lo; | ||||||
|  | 	u8 rx_src_tag_hi_sel; | ||||||
|  | 	u8 rx_src_tag_lo_sel; | ||||||
|  | 	u8 rx_dest_tag_hi_sel; | ||||||
|  | 	u8 rx_dest_tag_lo_sel; | ||||||
|  | 	u16 rx_fdq0_sz0_qnum; | ||||||
|  | 	u16 rx_fdq1_qnum; | ||||||
|  | 	u16 rx_fdq2_qnum; | ||||||
|  | 	u16 rx_fdq3_qnum; | ||||||
|  | 	u8 rx_ps_location; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  *  Response to configuring a Navigator Subsystem UDMAP receive flow | ||||||
|  |  * | ||||||
|  |  * @hdr: Standard TISCI header | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_flow_cfg_resp { | ||||||
|  | 	struct ti_sci_msg_hdr hdr; | ||||||
|  | } __packed; | ||||||
|  | 
 | ||||||
| #endif /* __TI_SCI_H */ | #endif /* __TI_SCI_H */ | ||||||
|  |  | ||||||
|  | @ -212,6 +212,31 @@ struct ti_sci_clk_ops { | ||||||
| 			u64 *current_freq); | 			u64 *current_freq); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_rm_core_ops - Resource management core operations | ||||||
|  |  * @get_range:		Get a range of resources belonging to ti sci host. | ||||||
|  |  * @get_rage_from_shost:	Get a range of resources belonging to | ||||||
|  |  *				specified host id. | ||||||
|  |  *			- s_host: Host processing entity to which the | ||||||
|  |  *				  resources are allocated | ||||||
|  |  * | ||||||
|  |  * NOTE: for these functions, all the parameters are consolidated and defined | ||||||
|  |  * as below: | ||||||
|  |  * - handle:	Pointer to TISCI handle as retrieved by *ti_sci_get_handle | ||||||
|  |  * - dev_id:	TISCI device ID. | ||||||
|  |  * - subtype:	Resource assignment subtype that is being requested | ||||||
|  |  *		from the given device. | ||||||
|  |  * - range_start:	Start index of the resource range | ||||||
|  |  * - range_end:		Number of resources in the range | ||||||
|  |  */ | ||||||
|  | struct ti_sci_rm_core_ops { | ||||||
|  | 	int (*get_range)(const struct ti_sci_handle *handle, u32 dev_id, | ||||||
|  | 			 u8 subtype, u16 *range_start, u16 *range_num); | ||||||
|  | 	int (*get_range_from_shost)(const struct ti_sci_handle *handle, | ||||||
|  | 				    u32 dev_id, u8 subtype, u8 s_host, | ||||||
|  | 				    u16 *range_start, u16 *range_num); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct ti_sci_core_ops - SoC Core Operations |  * struct ti_sci_core_ops - SoC Core Operations | ||||||
|  * @reboot_device: Reboot the SoC |  * @reboot_device: Reboot the SoC | ||||||
|  | @ -257,6 +282,230 @@ struct ti_sci_proc_ops { | ||||||
| 				    u32 *sts_flags); | 				    u32 *sts_flags); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #define TI_SCI_RING_MODE_RING			(0) | ||||||
|  | #define TI_SCI_RING_MODE_MESSAGE		(1) | ||||||
|  | #define TI_SCI_RING_MODE_CREDENTIALS		(2) | ||||||
|  | #define TI_SCI_RING_MODE_QM			(3) | ||||||
|  | 
 | ||||||
|  | #define TI_SCI_MSG_UNUSED_SECONDARY_HOST TI_SCI_RM_NULL_U8 | ||||||
|  | 
 | ||||||
|  | /* RA config.addr_lo parameter is valid for RM ring configure TI_SCI message */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID	BIT(0) | ||||||
|  | /* RA config.addr_hi parameter is valid for RM ring configure TI_SCI message */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID	BIT(1) | ||||||
|  |  /* RA config.count parameter is valid for RM ring configure TI_SCI message */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID	BIT(2) | ||||||
|  | /* RA config.mode parameter is valid for RM ring configure TI_SCI message */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_RING_MODE_VALID	BIT(3) | ||||||
|  | /* RA config.size parameter is valid for RM ring configure TI_SCI message */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID	BIT(4) | ||||||
|  | /* RA config.order_id parameter is valid for RM ring configure TISCI message */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_RING_ORDER_ID_VALID	BIT(5) | ||||||
|  | 
 | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER \ | ||||||
|  | 	(TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID | \ | ||||||
|  | 	TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID | \ | ||||||
|  | 	TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID | \ | ||||||
|  | 	TI_SCI_MSG_VALUE_RM_RING_MODE_VALID | \ | ||||||
|  | 	TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_rm_ringacc_ops - Ring Accelerator Management operations | ||||||
|  |  * @config: configure the SoC Navigator Subsystem Ring Accelerator ring | ||||||
|  |  * @get_config: get the SoC Navigator Subsystem Ring Accelerator ring | ||||||
|  |  *		configuration | ||||||
|  |  */ | ||||||
|  | struct ti_sci_rm_ringacc_ops { | ||||||
|  | 	int (*config)(const struct ti_sci_handle *handle, | ||||||
|  | 		      u32 valid_params, u16 nav_id, u16 index, | ||||||
|  | 		      u32 addr_lo, u32 addr_hi, u32 count, u8 mode, | ||||||
|  | 		      u8 size, u8 order_id | ||||||
|  | 	); | ||||||
|  | 	int (*get_config)(const struct ti_sci_handle *handle, | ||||||
|  | 			  u32 nav_id, u32 index, u8 *mode, | ||||||
|  | 			  u32 *addr_lo, u32 *addr_hi, u32 *count, | ||||||
|  | 			  u8 *size, u8 *order_id); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_rm_psil_ops - PSI-L thread operations | ||||||
|  |  * @pair: pair PSI-L source thread to a destination thread. | ||||||
|  |  *	If the src_thread is mapped to UDMA tchan, the corresponding channel's | ||||||
|  |  *	TCHAN_THRD_ID register is updated. | ||||||
|  |  *	If the dst_thread is mapped to UDMA rchan, the corresponding channel's | ||||||
|  |  *	RCHAN_THRD_ID register is updated. | ||||||
|  |  * @unpair: unpair PSI-L source thread from a destination thread. | ||||||
|  |  *	If the src_thread is mapped to UDMA tchan, the corresponding channel's | ||||||
|  |  *	TCHAN_THRD_ID register is cleared. | ||||||
|  |  *	If the dst_thread is mapped to UDMA rchan, the corresponding channel's | ||||||
|  |  *	RCHAN_THRD_ID register is cleared. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_rm_psil_ops { | ||||||
|  | 	int (*pair)(const struct ti_sci_handle *handle, u32 nav_id, | ||||||
|  | 		    u32 src_thread, u32 dst_thread); | ||||||
|  | 	int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id, | ||||||
|  | 		      u32 src_thread, u32 dst_thread); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* UDMAP channel types */ | ||||||
|  | #define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR		2 | ||||||
|  | #define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR_SB		3	/* RX only */ | ||||||
|  | #define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBRR		10 | ||||||
|  | #define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBVR		11 | ||||||
|  | #define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR	12 | ||||||
|  | #define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBVR	13 | ||||||
|  | 
 | ||||||
|  | /* UDMAP channel atypes */ | ||||||
|  | #define TI_SCI_RM_UDMAP_ATYPE_PHYS			0 | ||||||
|  | #define TI_SCI_RM_UDMAP_ATYPE_INTERMEDIATE		1 | ||||||
|  | #define TI_SCI_RM_UDMAP_ATYPE_VIRTUAL			2 | ||||||
|  | 
 | ||||||
|  | /* UDMAP channel scheduling priorities */ | ||||||
|  | #define TI_SCI_RM_UDMAP_SCHED_PRIOR_HIGH		0 | ||||||
|  | #define TI_SCI_RM_UDMAP_SCHED_PRIOR_MEDHIGH		1 | ||||||
|  | #define TI_SCI_RM_UDMAP_SCHED_PRIOR_MEDLOW		2 | ||||||
|  | #define TI_SCI_RM_UDMAP_SCHED_PRIOR_LOW			3 | ||||||
|  | 
 | ||||||
|  | #define TI_SCI_RM_UDMAP_RX_FLOW_DESC_HOST		0 | ||||||
|  | #define TI_SCI_RM_UDMAP_RX_FLOW_DESC_MONO		2 | ||||||
|  | 
 | ||||||
|  | /* UDMAP TX/RX channel valid_params common declarations */ | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID		BIT(0) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID                BIT(1) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID            BIT(2) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID           BIT(3) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID              BIT(4) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PRIORITY_VALID             BIT(5) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_QOS_VALID                  BIT(6) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ORDER_ID_VALID             BIT(7) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_SCHED_PRIORITY_VALID       BIT(8) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Configures a Navigator Subsystem UDMAP transmit channel | ||||||
|  |  * | ||||||
|  |  * Configures a Navigator Subsystem UDMAP transmit channel registers. | ||||||
|  |  * See @ti_sci_msg_rm_udmap_tx_ch_cfg_req | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_tx_ch_cfg { | ||||||
|  | 	u32 valid_params; | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_EINFO_VALID        BIT(9) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_PSWORDS_VALID      BIT(10) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID        BIT(11) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_CREDIT_COUNT_VALID      BIT(12) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FDEPTH_VALID            BIT(13) | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 index; | ||||||
|  | 	u8 tx_pause_on_err; | ||||||
|  | 	u8 tx_filt_einfo; | ||||||
|  | 	u8 tx_filt_pswords; | ||||||
|  | 	u8 tx_atype; | ||||||
|  | 	u8 tx_chan_type; | ||||||
|  | 	u8 tx_supr_tdpkt; | ||||||
|  | 	u16 tx_fetch_size; | ||||||
|  | 	u8 tx_credit_count; | ||||||
|  | 	u16 txcq_qnum; | ||||||
|  | 	u8 tx_priority; | ||||||
|  | 	u8 tx_qos; | ||||||
|  | 	u8 tx_orderid; | ||||||
|  | 	u16 fdepth; | ||||||
|  | 	u8 tx_sched_priority; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive channel | ||||||
|  |  * | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive channel registers. | ||||||
|  |  * See @ti_sci_msg_rm_udmap_rx_ch_cfg_req | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_rx_ch_cfg { | ||||||
|  | 	u32 valid_params; | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID      BIT(9) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID        BIT(10) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_SHORT_VALID      BIT(11) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_LONG_VALID       BIT(12) | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 index; | ||||||
|  | 	u16 rx_fetch_size; | ||||||
|  | 	u16 rxcq_qnum; | ||||||
|  | 	u8 rx_priority; | ||||||
|  | 	u8 rx_qos; | ||||||
|  | 	u8 rx_orderid; | ||||||
|  | 	u8 rx_sched_priority; | ||||||
|  | 	u16 flowid_start; | ||||||
|  | 	u16 flowid_cnt; | ||||||
|  | 	u8 rx_pause_on_err; | ||||||
|  | 	u8 rx_atype; | ||||||
|  | 	u8 rx_chan_type; | ||||||
|  | 	u8 rx_ignore_short; | ||||||
|  | 	u8 rx_ignore_long; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive flow | ||||||
|  |  * | ||||||
|  |  * Configures a Navigator Subsystem UDMAP receive flow's registers. | ||||||
|  |  * See @tis_ci_msg_rm_udmap_flow_cfg_req | ||||||
|  |  */ | ||||||
|  | struct ti_sci_msg_rm_udmap_flow_cfg { | ||||||
|  | 	u32 valid_params; | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID	BIT(0) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID     BIT(1) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID     BIT(2) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DESC_TYPE_VALID          BIT(3) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SOP_OFFSET_VALID         BIT(4) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_QNUM_VALID          BIT(5) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_VALID         BIT(6) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_VALID         BIT(7) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_VALID        BIT(8) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_VALID        BIT(9) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_SEL_VALID     BIT(10) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_SEL_VALID     BIT(11) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_SEL_VALID    BIT(12) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_SEL_VALID    BIT(13) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ0_SZ0_QNUM_VALID      BIT(14) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ1_QNUM_VALID          BIT(15) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ2_QNUM_VALID          BIT(16) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ3_QNUM_VALID          BIT(17) | ||||||
|  | #define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PS_LOCATION_VALID        BIT(18) | ||||||
|  | 	u16 nav_id; | ||||||
|  | 	u16 flow_index; | ||||||
|  | 	u8 rx_einfo_present; | ||||||
|  | 	u8 rx_psinfo_present; | ||||||
|  | 	u8 rx_error_handling; | ||||||
|  | 	u8 rx_desc_type; | ||||||
|  | 	u16 rx_sop_offset; | ||||||
|  | 	u16 rx_dest_qnum; | ||||||
|  | 	u8 rx_src_tag_hi; | ||||||
|  | 	u8 rx_src_tag_lo; | ||||||
|  | 	u8 rx_dest_tag_hi; | ||||||
|  | 	u8 rx_dest_tag_lo; | ||||||
|  | 	u8 rx_src_tag_hi_sel; | ||||||
|  | 	u8 rx_src_tag_lo_sel; | ||||||
|  | 	u8 rx_dest_tag_hi_sel; | ||||||
|  | 	u8 rx_dest_tag_lo_sel; | ||||||
|  | 	u16 rx_fdq0_sz0_qnum; | ||||||
|  | 	u16 rx_fdq1_qnum; | ||||||
|  | 	u16 rx_fdq2_qnum; | ||||||
|  | 	u16 rx_fdq3_qnum; | ||||||
|  | 	u8 rx_ps_location; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_rm_udmap_ops - UDMA Management operations | ||||||
|  |  * @tx_ch_cfg: configure SoC Navigator Subsystem UDMA transmit channel. | ||||||
|  |  * @rx_ch_cfg: configure SoC Navigator Subsystem UDMA receive channel. | ||||||
|  |  * @rx_flow_cfg: configure SoC Navigator Subsystem UDMA receive flow. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_rm_udmap_ops { | ||||||
|  | 	int (*tx_ch_cfg)(const struct ti_sci_handle *handle, | ||||||
|  | 			 const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params); | ||||||
|  | 	int (*rx_ch_cfg)(const struct ti_sci_handle *handle, | ||||||
|  | 			 const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params); | ||||||
|  | 	int (*rx_flow_cfg)( | ||||||
|  | 		const struct ti_sci_handle *handle, | ||||||
|  | 		const struct ti_sci_msg_rm_udmap_flow_cfg *params); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct ti_sci_ops - Function support for TI SCI |  * struct ti_sci_ops - Function support for TI SCI | ||||||
|  * @board_ops:	Miscellaneous operations |  * @board_ops:	Miscellaneous operations | ||||||
|  | @ -264,6 +513,7 @@ struct ti_sci_proc_ops { | ||||||
|  * @clk_ops:	Clock specific operations |  * @clk_ops:	Clock specific operations | ||||||
|  * @core_ops:	Core specific operations |  * @core_ops:	Core specific operations | ||||||
|  * @proc_ops:	Processor specific operations |  * @proc_ops:	Processor specific operations | ||||||
|  |  * @ring_ops: Ring Accelerator Management operations | ||||||
|  */ |  */ | ||||||
| struct ti_sci_ops { | struct ti_sci_ops { | ||||||
| 	struct ti_sci_board_ops board_ops; | 	struct ti_sci_board_ops board_ops; | ||||||
|  | @ -271,6 +521,10 @@ struct ti_sci_ops { | ||||||
| 	struct ti_sci_clk_ops clk_ops; | 	struct ti_sci_clk_ops clk_ops; | ||||||
| 	struct ti_sci_core_ops core_ops; | 	struct ti_sci_core_ops core_ops; | ||||||
| 	struct ti_sci_proc_ops proc_ops; | 	struct ti_sci_proc_ops proc_ops; | ||||||
|  | 	struct ti_sci_rm_core_ops rm_core_ops; | ||||||
|  | 	struct ti_sci_rm_ringacc_ops rm_ring_ops; | ||||||
|  | 	struct ti_sci_rm_psil_ops rm_psil_ops; | ||||||
|  | 	struct ti_sci_rm_udmap_ops rm_udmap_ops; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -283,12 +537,42 @@ struct ti_sci_handle { | ||||||
| 	struct ti_sci_version_info version; | 	struct ti_sci_version_info version; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #define TI_SCI_RESOURCE_NULL	0xffff | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_resource_desc - Description of TI SCI resource instance range. | ||||||
|  |  * @start:	Start index of the resource. | ||||||
|  |  * @num:	Number of resources. | ||||||
|  |  * @res_map:	Bitmap to manage the allocation of these resources. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_resource_desc { | ||||||
|  | 	u16 start; | ||||||
|  | 	u16 num; | ||||||
|  | 	unsigned long *res_map; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * struct ti_sci_resource - Structure representing a resource assigned | ||||||
|  |  *			    to a device. | ||||||
|  |  * @sets:	Number of sets available from this resource type | ||||||
|  |  * @desc:	Array of resource descriptors. | ||||||
|  |  */ | ||||||
|  | struct ti_sci_resource { | ||||||
|  | 	u16 sets; | ||||||
|  | 	struct ti_sci_resource_desc *desc; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| #if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL) | #if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL) | ||||||
| 
 | 
 | ||||||
| const struct ti_sci_handle *ti_sci_get_handle_from_sysfw(struct udevice *dev); | const struct ti_sci_handle *ti_sci_get_handle_from_sysfw(struct udevice *dev); | ||||||
| const struct ti_sci_handle *ti_sci_get_handle(struct udevice *dev); | const struct ti_sci_handle *ti_sci_get_handle(struct udevice *dev); | ||||||
| const struct ti_sci_handle *ti_sci_get_by_phandle(struct udevice *dev, | const struct ti_sci_handle *ti_sci_get_by_phandle(struct udevice *dev, | ||||||
| 						  const char *property); | 						  const char *property); | ||||||
|  | u16 ti_sci_get_free_resource(struct ti_sci_resource *res); | ||||||
|  | void ti_sci_release_resource(struct ti_sci_resource *res, u16 id); | ||||||
|  | struct ti_sci_resource * | ||||||
|  | devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle, | ||||||
|  | 			    struct udevice *dev, u32 dev_id, char *of_prop); | ||||||
| 
 | 
 | ||||||
| #else	/* CONFIG_TI_SCI_PROTOCOL */ | #else	/* CONFIG_TI_SCI_PROTOCOL */ | ||||||
| 
 | 
 | ||||||
|  | @ -309,6 +593,22 @@ const struct ti_sci_handle *ti_sci_get_by_phandle(struct udevice *dev, | ||||||
| { | { | ||||||
| 	return ERR_PTR(-EINVAL); | 	return ERR_PTR(-EINVAL); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static inline u16 ti_sci_get_free_resource(struct ti_sci_resource *res) | ||||||
|  | { | ||||||
|  | 	return TI_SCI_RESOURCE_NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void ti_sci_release_resource(struct ti_sci_resource *res, u16 id) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline struct ti_sci_resource * | ||||||
|  | devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle, | ||||||
|  | 			    struct udevice *dev, u32 dev_id, char *of_prop) | ||||||
|  | { | ||||||
|  | 	return ERR_PTR(-EINVAL); | ||||||
|  | } | ||||||
| #endif	/* CONFIG_TI_SCI_PROTOCOL */ | #endif	/* CONFIG_TI_SCI_PROTOCOL */ | ||||||
| 
 | 
 | ||||||
| #endif	/* __TISCI_PROTOCOL_H */ | #endif	/* __TISCI_PROTOCOL_H */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue