Hello,

Thank you for the reviews, please find my comments below:

On 5/21/2026 12:48 PM, Mathieu Poirier wrote:
> Good morning,
> 
> I don't recal reviewing the first revision of this set.  Can you provide a 
> link
> to it so that I can read the comments that were provided?
> 

Here it is:
https://lore.kernel.org/linux-remoteproc/[email protected]/

The device-tree bindings needed rework in v1, so I sent v2, before we
ever reviewed the driver part.


> On Fri, May 01, 2026 at 07:37:07AM -0700, Tanmay Shah wrote:
>> remoteproc framework has capability to start (or attach to) the remote
> 
> The remoteproc framework...
> 

Ack.

>> processor automatically if auto boot flag is set by the driver during
>> probe. If remote core is not started before the Linux boot, and linux is
>> expected to start the remote core then it uses "firmware-name" property
>> to load default firmware during auto boot.
>>
>> Signed-off-by: Tanmay Shah <[email protected]>
>> ---
>>  drivers/remoteproc/xlnx_r5_remoteproc.c | 48 +++++++++++++++++--------
>>  1 file changed, 34 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c 
>> b/drivers/remoteproc/xlnx_r5_remoteproc.c
>> index 45a62cb98072..652030f9cea2 100644
>> --- a/drivers/remoteproc/xlnx_r5_remoteproc.c
>> +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c
>> @@ -899,17 +899,18 @@ static const struct rproc_ops zynqmp_r5_rproc_ops = {
>>  };
>>  
>>  /**
>> - * zynqmp_r5_add_rproc_core() - Add core data to framework.
>> - * Allocate and add struct rproc object for each r5f core
>> + * zynqmp_r5_alloc_rproc_core() - alloc rproc core data structure
>> + * Allocate struct rproc object for each r5f core
>>   * This is called for each individual r5f core
>>   *
>>   * @cdev: Device node of each r5 core
>>   *
>>   * Return: zynqmp_r5_core object for success else error code pointer
>>   */
>> -static struct zynqmp_r5_core *zynqmp_r5_add_rproc_core(struct device *cdev)
>> +static struct zynqmp_r5_core *zynqmp_r5_alloc_rproc_core(struct device 
>> *cdev)
> 
> Why is there a need to change the function's name?
> 

Before, the function was actually adding the rproc core by calling
rproc_add() function, but now it only allocates the memory by calling
rproc_alloc(). For auto boot to work it's important to add rproc core
after all the other hw is initialized (such as mbox, tcm, sram,
power-domains etc). More details below [1].

>>  {
>>      struct zynqmp_r5_core *r5_core;
>> +    const char *fw_name = NULL;
>>      struct rproc *r5_rproc;
>>      int ret;
>>  
>> @@ -918,10 +919,15 @@ static struct zynqmp_r5_core 
>> *zynqmp_r5_add_rproc_core(struct device *cdev)
>>      if (ret)
>>              return ERR_PTR(ret);
>>  
>> +    ret = rproc_of_parse_firmware(cdev, 0, &fw_name);
>> +    if (ret < 0 && ret != -EINVAL)
>> +            return ERR_PTR(dev_err_probe(cdev, ret,
>> +                                         "failed to parse 
>> firmware-name\n"));
>> +
>>      /* Allocate remoteproc instance */
>>      r5_rproc = rproc_alloc(cdev, dev_name(cdev),
>>                             &zynqmp_r5_rproc_ops,
>> -                           NULL, sizeof(struct zynqmp_r5_core));
>> +                           fw_name, sizeof(struct zynqmp_r5_core));
>>      if (!r5_rproc) {
>>              dev_err(cdev, "failed to allocate memory for rproc instance\n");
>>              return ERR_PTR(-ENOMEM);
>> @@ -932,6 +938,11 @@ static struct zynqmp_r5_core 
>> *zynqmp_r5_add_rproc_core(struct device *cdev)
>>      r5_rproc->recovery_disabled = true;
>>      r5_rproc->has_iommu = false;
>>      r5_rproc->auto_boot = false;
>> +
>> +    /* attempt to boot automatically if the firmware-name is provided */
>> +    if (fw_name)
>> +            r5_rproc->auto_boot = true;
>> +
> 
> What happens when a firmware name needs to be provided in the DT but you don't
> want to automatically boot the remote processor?
> 

I think that use case is not needed. If the user/system-designer doesn't
want auto-boot, then having firmware-name in the device-tree serves no
purpose. User can always load the firmware via sysfs once kernel boots.

>>      r5_core = r5_rproc->priv;
>>      r5_core->dev = cdev;
>>      r5_core->np = dev_of_node(cdev);
>> @@ -941,13 +952,6 @@ static struct zynqmp_r5_core 
>> *zynqmp_r5_add_rproc_core(struct device *cdev)
>>              goto free_rproc;
>>      }
>>  
>> -    /* Add R5 remoteproc core */
>> -    ret = rproc_add(r5_rproc);
>> -    if (ret) {
>> -            dev_err(cdev, "failed to add r5 remoteproc\n");
>> -            goto free_rproc;
>> -    }
>> -
> 
> I'm not sure why there is a need to move this to zynqmp_r5_cluster_init()?  Is
> it simply to make the error path easier to handle?  If so, please do that in a
> separate patch.
> 

[1] This was moved to make auto-boot work. The remote core can auto-boot
only after other hardware is initialized. The zynqmp_r5_core_init()
initializes sram, TCM and power-domains of the core. Also, mailbox is
requested before zynqmp_r5_core_init() as well. We can't auto-boot core
directly without all this. So, I had to move rproc_add() at the end of
the cluster init, and rename above function from
zynqmp_r5_add_rproc_core to zynqmp_r5_alloc_rproc_core.

If you prefer, I will add above explanation in the commit text, or as
comment right before rproc_add().



>>      r5_core->rproc = r5_rproc;
>>      return r5_core;
>>  
>> @@ -1280,6 +1284,7 @@ static int zynqmp_r5_core_init(struct 
>> zynqmp_r5_cluster *cluster,
>>                      if (zynqmp_r5_get_rsc_table_va(r5_core))
>>                              dev_dbg(r5_core->dev, "rsc tbl not found\n");
>>                      r5_core->rproc->state = RPROC_DETACHED;
>> +                    r5_core->rproc->auto_boot = true;
> 
> I thought this was done in zynqmp_r5_add_rproc_core() - what am I missing?
> 

That function is now zynqmp_r5_alloc_core() as mentioned above. Also,
until now, auto_boot was set to 'false' only to show that it is
disabled. It is actually used and enabled now.

> Thanks,
> Mathieu
> 
>>              }
>>      }
>>  
>> @@ -1304,7 +1309,7 @@ static int zynqmp_r5_cluster_init(struct 
>> zynqmp_r5_cluster *cluster)
>>      enum rpu_oper_mode fw_reg_val;
>>      struct device **child_devs;
>>      enum rpu_tcm_comb tcm_mode;
>> -    int core_count, ret, i;
>> +    int core_count, ret, i, j;
>>      struct mbox_info *ipi;
>>  
>>      ret = of_property_read_u32(dev_node, "xlnx,cluster-mode", 
>> &cluster_mode);
>> @@ -1390,7 +1395,7 @@ static int zynqmp_r5_cluster_init(struct 
>> zynqmp_r5_cluster *cluster)
>>              child_devs[i] = &child_pdev->dev;
>>  
>>              /* create and add remoteproc instance of type struct rproc */
>> -            r5_cores[i] = zynqmp_r5_add_rproc_core(&child_pdev->dev);
>> +            r5_cores[i] = zynqmp_r5_alloc_rproc_core(&child_pdev->dev);
>>              if (IS_ERR(r5_cores[i])) {
>>                      ret = PTR_ERR(r5_cores[i]);
>>                      r5_cores[i] = NULL;
>> @@ -1435,16 +1440,31 @@ static int zynqmp_r5_cluster_init(struct 
>> zynqmp_r5_cluster *cluster)
>>              goto release_r5_cores;
>>      }
>>  
>> +    for (j = 0; j < cluster->core_count; j++) {
>> +            /* Add R5 remoteproc core */
>> +            ret = rproc_add(r5_cores[j]->rproc);
>> +            if (ret) {
>> +                    dev_err_probe(r5_cores[j]->dev, ret,
>> +                                  "failed to add remoteproc\n");
>> +                    goto delete_r5_cores;
>> +            }
>> +    }
>> +
>>      kfree(child_devs);
>>      return 0;
>>  
>> +delete_r5_cores:
>> +    i = core_count - 1;
>> +    /* delete previous added rproc */
>> +    while (--j >= 0)
>> +            rproc_del(r5_cores[j]->rproc);
>> +
>>  release_r5_cores:
>>      while (i >= 0) {
>>              put_device(child_devs[i]);
>>              if (r5_cores[i]) {
>>                      zynqmp_r5_free_mbox(r5_cores[i]->ipi);
>>                      of_reserved_mem_device_release(r5_cores[i]->dev);
>> -                    rproc_del(r5_cores[i]->rproc);
>>                      rproc_free(r5_cores[i]->rproc);
>>              }
>>              i--;
>> -- 
>> 2.34.1
>>


Reply via email to