diff mbox series

[3/7] firmware: ti_sci: Add support for Resoure Management at R5 SPL stage.

Message ID 20210510172442.11146-4-vigneshr@ti.com
State Changes Requested
Delegated to: Lokesh Vutla
Headers show
Series J72xx: R5 SPL DMA support post HSM Rearch | expand

Commit Message

Raghavendra, Vignesh May 10, 2021, 5:24 p.m. UTC
On J721e and J7200, MCU R5 core (boot master) itself would run Device
Manager (DM) Firmware and interact with TI Foundational Security (TIFS)
firmware to enable DMA and such other Resource Management (RM) services.
So, during R5 SPL stage there is no such RM service available and ti_sci
driver will have to directly interact with TIFS using DM to DMSC
channels to request RM resources.

Therefore add DT binding and driver for the same. This driver will
handle Resource Management services at R5 SPL stage.

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
---
 .../firmware/ti,j721e-dm-sci.txt              | 32 +++++++
 drivers/firmware/ti_sci.c                     | 91 +++++++++++++++++--
 2 files changed, 113 insertions(+), 10 deletions(-)
 create mode 100644 doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt

Comments

Lokesh Vutla May 11, 2021, 4:49 a.m. UTC | #1
On 10/05/21 10:54 pm, Vignesh Raghavendra wrote:
> On J721e and J7200, MCU R5 core (boot master) itself would run Device
> Manager (DM) Firmware and interact with TI Foundational Security (TIFS)
> firmware to enable DMA and such other Resource Management (RM) services.
> So, during R5 SPL stage there is no such RM service available and ti_sci
> driver will have to directly interact with TIFS using DM to DMSC
> channels to request RM resources.

So, PM services are also not available at R5 and I do not see a new compatible
for PM services. Can you help me understand why we cannot follow the same as
being done in PM services.

One of my worry is ti_sci driver already needs a heavy cleanup. Now adding more
stuff to it will just keep increase the burden

Thanks and regards,
Lokesh

> 
> Therefore add DT binding and driver for the same. This driver will
> handle Resource Management services at R5 SPL stage.
> 
> Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
> ---
>  .../firmware/ti,j721e-dm-sci.txt              | 32 +++++++
>  drivers/firmware/ti_sci.c                     | 91 +++++++++++++++++--
>  2 files changed, 113 insertions(+), 10 deletions(-)
>  create mode 100644 doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt
> 
> diff --git a/doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt b/doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt
> new file mode 100644
> index 0000000000..0217341f0c
> --- /dev/null
> +++ b/doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt
> @@ -0,0 +1,32 @@
> +Bindings for Texas Instruments System Control Interface (TI-SCI) Message
> +Protocol for Device Manager(DM) to TI Foundational Security(TIFS)
> +Firmware communication
> +
> +Required properties:
> +--------------------
> +- compatible: should be "ti,j721e-dm-sci"
> +- mbox-names:
> +	"rx" - Mailbox corresponding to receive path
> +	"tx" - Mailbox corresponding to transmit path
> +
> +- mboxes: Mailboxes corresponding to the mbox-names. Each value of the mboxes
> +	  property should contain a phandle to the mailbox controller device
> +	  node and an args specifier that will be the phandle to the intended
> +	  sub-mailbox child node to be used for communication.
> +
> +- ti,host-id: Host ID to use for communication.
> +
> +Optional Properties:
> +--------------------
> +- ti,secure-host: If the host is defined as secure.
> +
> +Example:
> +--------
> +	dm_tifs: dm-tifs {
> +		compatible = "ti,j721e-dm-sci";
> +		ti,host-id = <3>;
> +		ti,secure-host;
> +		mbox-names = "rx", "tx";
> +		mboxes= <&mcu_secproxy 21>,
> +			<&mcu_secproxy 23>;
> +	};
> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
> index c27fbc682a..f75ad5db67 100644
> --- a/drivers/firmware/ti_sci.c
> +++ b/drivers/firmware/ti_sci.c
> @@ -1669,8 +1669,9 @@ fail:
>  }
>  
>  static int __maybe_unused
> -ti_sci_get_resource_range_static(u32 dev_id, u8 subtype, u16 *range_start,
> -				 u16 *range_num)
> +ti_sci_cmd_get_resource_range_static(const struct ti_sci_handle *handle,
> +				     u32 dev_id, u8 subtype,
> +				     u16 *range_start, u16 *range_num)
>  {
>  	struct ti_sci_resource_static_data *data;
>  	int i = 0;
> @@ -1711,11 +1712,6 @@ 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)
>  {
> -	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
> -		return ti_sci_get_resource_range_static(dev_id, subtype,
> -							range_start,
> -							range_num);
> -
>  	return ti_sci_get_resource_range(handle, dev_id, subtype,
>  					 TI_SCI_IRQ_SECONDARY_HOST_INVALID,
>  					 range_start, range_num);
> @@ -1739,9 +1735,6 @@ 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)
>  {
> -	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
> -		return -EINVAL;
> -
>  	return ti_sci_get_resource_range(handle, dev_id, subtype, s_host,
>  					 range_start, range_num);
>  }
> @@ -3051,6 +3044,58 @@ static int ti_sci_probe(struct udevice *dev)
>  	return ret;
>  }
>  
> +/**
> + * ti_sci_dm_probe() - Basic probe for DM to TIFS SCI
> + * @dev:	corresponding system controller interface device
> + *
> + * Return: 0 if all goes good, else appropriate error message.
> + */
> +static __maybe_unused int ti_sci_dm_probe(struct udevice *dev)
> +{
> +	struct ti_sci_rm_core_ops *rm_core_ops;
> +	struct ti_sci_rm_udmap_ops *udmap_ops;
> +	struct ti_sci_rm_ringacc_ops *rops;
> +	struct ti_sci_rm_psil_ops *psilops;
> +	struct ti_sci_ops *ops;
> +	struct ti_sci_info *info;
> +	int ret;
> +
> +	debug("%s(dev=%p)\n", __func__, dev);
> +
> +	info = dev_get_priv(dev);
> +	info->desc = (void *)dev_get_driver_data(dev);
> +
> +	ret = ti_sci_of_to_info(dev, info);
> +	if (ret) {
> +		dev_err(dev, "%s: Probe failed with error %d\n", __func__, ret);
> +		return ret;
> +	}
> +
> +	info->dev = dev;
> +	info->seq = 0xA;
> +
> +	list_add_tail(&info->list, &ti_sci_list);
> +
> +	ops = &info->handle.ops;
> +
> +	rm_core_ops = &ops->rm_core_ops;
> +	rm_core_ops->get_range = ti_sci_cmd_get_resource_range_static;
> +
> +	rops = &ops->rm_ring_ops;
> +	rops->config = ti_sci_cmd_ring_config;
> +
> +	psilops = &ops->rm_psil_ops;
> +	psilops->pair = ti_sci_cmd_rm_psil_pair;
> +	psilops->unpair = ti_sci_cmd_rm_psil_unpair;
> +
> +	udmap_ops = &ops->rm_udmap_ops;
> +	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;
> +
> +	return ret;
> +}
> +
>  /*
>   * ti_sci_get_free_resource() - Get a free resource from TISCI resource.
>   * @res:	Pointer to the TISCI resource
> @@ -3188,6 +3233,14 @@ static const struct ti_sci_desc ti_sci_pmmc_am654_desc = {
>  	.max_msg_size = 60,
>  };
>  
> +/* Description for J721e DM to DMSC communication */
> +static const struct ti_sci_desc ti_sci_dm_j721e_desc = {
> +	.default_host_id = 3,
> +	.max_rx_timeout_ms = 10000,
> +	.max_msgs = 20,
> +	.max_msg_size = 60,
> +};
> +
>  static const struct udevice_id ti_sci_ids[] = {
>  	{
>  		.compatible = "ti,k2g-sci",
> @@ -3200,6 +3253,14 @@ static const struct udevice_id ti_sci_ids[] = {
>  	{ /* Sentinel */ },
>  };
>  
> +static __maybe_unused const struct udevice_id ti_sci_dm_ids[] = {
> +	{
> +		.compatible = "ti,j721e-dm-sci",
> +		.data = (ulong)&ti_sci_dm_j721e_desc
> +	},
> +	{ /* Sentinel */ },
> +};
> +
>  U_BOOT_DRIVER(ti_sci) = {
>  	.name = "ti_sci",
>  	.id = UCLASS_FIRMWARE,
> @@ -3207,3 +3268,13 @@ U_BOOT_DRIVER(ti_sci) = {
>  	.probe = ti_sci_probe,
>  	.priv_auto	= sizeof(struct ti_sci_info),
>  };
> +
> +#if IS_ENABLED(CONFIG_K3_DM_FW)
> +U_BOOT_DRIVER(ti_sci_dm) = {
> +	.name = "ti_sci_dm",
> +	.id = UCLASS_FIRMWARE,
> +	.of_match = ti_sci_dm_ids,
> +	.probe = ti_sci_dm_probe,
> +	.priv_auto = sizeof(struct ti_sci_info),
> +};
> +#endif
>
Raghavendra, Vignesh May 11, 2021, 6:20 a.m. UTC | #2
On 5/11/21 10:19 AM, Lokesh Vutla wrote:
> 
> 
> On 10/05/21 10:54 pm, Vignesh Raghavendra wrote:
>> On J721e and J7200, MCU R5 core (boot master) itself would run Device
>> Manager (DM) Firmware and interact with TI Foundational Security (TIFS)
>> firmware to enable DMA and such other Resource Management (RM) services.
>> So, during R5 SPL stage there is no such RM service available and ti_sci
>> driver will have to directly interact with TIFS using DM to DMSC
>> channels to request RM resources.
> 
> So, PM services are also not available at R5 and I do not see a new compatible
> for PM services. Can you help me understand why we cannot follow the same as
> being done in PM services.
> 

PM services can be handled entirely within R5 SPL. But RM service
requests need to forwarded to TIFS for openinng up channelized firewall
and ISC configuration (Message forwarding). These messages have to be
sent on a different secproxy channel than regular messages (DM to TIFS
channel) and the host ID used is R5's non secure host ID.
All these differences make RM service provider a different entity than
existing one.

> One of my worry is ti_sci driver already needs a heavy cleanup. Now adding more
> stuff to it will just keep increase the burden
> 

This patch adds new probe function (ti_sci_dm_probe()) which reassigns
RM GET_RANGE API to function that does static table look up instead of
API call to TIFS. I don't think its adding ady significant code to
existing driver and should not come in the way of any future cleanups.

Regards
Vignesh
diff mbox series

Patch

diff --git a/doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt b/doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt
new file mode 100644
index 0000000000..0217341f0c
--- /dev/null
+++ b/doc/device-tree-bindings/firmware/ti,j721e-dm-sci.txt
@@ -0,0 +1,32 @@ 
+Bindings for Texas Instruments System Control Interface (TI-SCI) Message
+Protocol for Device Manager(DM) to TI Foundational Security(TIFS)
+Firmware communication
+
+Required properties:
+--------------------
+- compatible: should be "ti,j721e-dm-sci"
+- mbox-names:
+	"rx" - Mailbox corresponding to receive path
+	"tx" - Mailbox corresponding to transmit path
+
+- mboxes: Mailboxes corresponding to the mbox-names. Each value of the mboxes
+	  property should contain a phandle to the mailbox controller device
+	  node and an args specifier that will be the phandle to the intended
+	  sub-mailbox child node to be used for communication.
+
+- ti,host-id: Host ID to use for communication.
+
+Optional Properties:
+--------------------
+- ti,secure-host: If the host is defined as secure.
+
+Example:
+--------
+	dm_tifs: dm-tifs {
+		compatible = "ti,j721e-dm-sci";
+		ti,host-id = <3>;
+		ti,secure-host;
+		mbox-names = "rx", "tx";
+		mboxes= <&mcu_secproxy 21>,
+			<&mcu_secproxy 23>;
+	};
diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
index c27fbc682a..f75ad5db67 100644
--- a/drivers/firmware/ti_sci.c
+++ b/drivers/firmware/ti_sci.c
@@ -1669,8 +1669,9 @@  fail:
 }
 
 static int __maybe_unused
-ti_sci_get_resource_range_static(u32 dev_id, u8 subtype, u16 *range_start,
-				 u16 *range_num)
+ti_sci_cmd_get_resource_range_static(const struct ti_sci_handle *handle,
+				     u32 dev_id, u8 subtype,
+				     u16 *range_start, u16 *range_num)
 {
 	struct ti_sci_resource_static_data *data;
 	int i = 0;
@@ -1711,11 +1712,6 @@  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)
 {
-	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
-		return ti_sci_get_resource_range_static(dev_id, subtype,
-							range_start,
-							range_num);
-
 	return ti_sci_get_resource_range(handle, dev_id, subtype,
 					 TI_SCI_IRQ_SECONDARY_HOST_INVALID,
 					 range_start, range_num);
@@ -1739,9 +1735,6 @@  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)
 {
-	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
-		return -EINVAL;
-
 	return ti_sci_get_resource_range(handle, dev_id, subtype, s_host,
 					 range_start, range_num);
 }
@@ -3051,6 +3044,58 @@  static int ti_sci_probe(struct udevice *dev)
 	return ret;
 }
 
+/**
+ * ti_sci_dm_probe() - Basic probe for DM to TIFS SCI
+ * @dev:	corresponding system controller interface device
+ *
+ * Return: 0 if all goes good, else appropriate error message.
+ */
+static __maybe_unused int ti_sci_dm_probe(struct udevice *dev)
+{
+	struct ti_sci_rm_core_ops *rm_core_ops;
+	struct ti_sci_rm_udmap_ops *udmap_ops;
+	struct ti_sci_rm_ringacc_ops *rops;
+	struct ti_sci_rm_psil_ops *psilops;
+	struct ti_sci_ops *ops;
+	struct ti_sci_info *info;
+	int ret;
+
+	debug("%s(dev=%p)\n", __func__, dev);
+
+	info = dev_get_priv(dev);
+	info->desc = (void *)dev_get_driver_data(dev);
+
+	ret = ti_sci_of_to_info(dev, info);
+	if (ret) {
+		dev_err(dev, "%s: Probe failed with error %d\n", __func__, ret);
+		return ret;
+	}
+
+	info->dev = dev;
+	info->seq = 0xA;
+
+	list_add_tail(&info->list, &ti_sci_list);
+
+	ops = &info->handle.ops;
+
+	rm_core_ops = &ops->rm_core_ops;
+	rm_core_ops->get_range = ti_sci_cmd_get_resource_range_static;
+
+	rops = &ops->rm_ring_ops;
+	rops->config = ti_sci_cmd_ring_config;
+
+	psilops = &ops->rm_psil_ops;
+	psilops->pair = ti_sci_cmd_rm_psil_pair;
+	psilops->unpair = ti_sci_cmd_rm_psil_unpair;
+
+	udmap_ops = &ops->rm_udmap_ops;
+	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;
+
+	return ret;
+}
+
 /*
  * ti_sci_get_free_resource() - Get a free resource from TISCI resource.
  * @res:	Pointer to the TISCI resource
@@ -3188,6 +3233,14 @@  static const struct ti_sci_desc ti_sci_pmmc_am654_desc = {
 	.max_msg_size = 60,
 };
 
+/* Description for J721e DM to DMSC communication */
+static const struct ti_sci_desc ti_sci_dm_j721e_desc = {
+	.default_host_id = 3,
+	.max_rx_timeout_ms = 10000,
+	.max_msgs = 20,
+	.max_msg_size = 60,
+};
+
 static const struct udevice_id ti_sci_ids[] = {
 	{
 		.compatible = "ti,k2g-sci",
@@ -3200,6 +3253,14 @@  static const struct udevice_id ti_sci_ids[] = {
 	{ /* Sentinel */ },
 };
 
+static __maybe_unused const struct udevice_id ti_sci_dm_ids[] = {
+	{
+		.compatible = "ti,j721e-dm-sci",
+		.data = (ulong)&ti_sci_dm_j721e_desc
+	},
+	{ /* Sentinel */ },
+};
+
 U_BOOT_DRIVER(ti_sci) = {
 	.name = "ti_sci",
 	.id = UCLASS_FIRMWARE,
@@ -3207,3 +3268,13 @@  U_BOOT_DRIVER(ti_sci) = {
 	.probe = ti_sci_probe,
 	.priv_auto	= sizeof(struct ti_sci_info),
 };
+
+#if IS_ENABLED(CONFIG_K3_DM_FW)
+U_BOOT_DRIVER(ti_sci_dm) = {
+	.name = "ti_sci_dm",
+	.id = UCLASS_FIRMWARE,
+	.of_match = ti_sci_dm_ids,
+	.probe = ti_sci_dm_probe,
+	.priv_auto = sizeof(struct ti_sci_info),
+};
+#endif