[PATCH 3/7] firmware: ti_sci: Add support for Resoure Management at R5 SPL stage.
Lokesh Vutla
lokeshvutla at ti.com
Tue May 11 06:49:40 CEST 2021
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 at 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
>
More information about the U-Boot
mailing list