Good morning,

On Tue, Sep 12, 2023 at 07:43:23PM -0700, Tanmay Shah wrote:
> In lockstep mode following is TCM address map:
> 
> |      *TCM*         |   *R5 View* | *Linux view* |
> | R5_0 ATCM (128 KB) | 0x0000_0000 | 0xFFE0_0000  |
> | R5_0 BTCM (128 KB) | 0x0002_0000 | 0xFFE2_0000  |
> 
> Current driver keeps single TCM carveout in lockstep mode
> as ATCM and BTCM addresses form contiguous memory region.
> 
> Although the addresses are contiguous, it is not same type
> of memory. ATCM typically holds interrupt or exception code
> that must be accessed at high speed. BTCM typically holds
> a block of data for intensive processing, such as audio or
> video processing. As both are different types of memory,
> they should be allocated as different carveout. This patch
> is fixing TCM carveout allocation in lockstep mode.
> 
> Signed-off-by: Tanmay Shah <[email protected]>
> ---
>  drivers/remoteproc/xlnx_r5_remoteproc.c | 66 ++++++++++++++++---------
>  1 file changed, 43 insertions(+), 23 deletions(-)
> 

Applied.

Thanks,
Mathieu

> diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c 
> b/drivers/remoteproc/xlnx_r5_remoteproc.c
> index feca6de68da2..efd758c2f4ed 100644
> --- a/drivers/remoteproc/xlnx_r5_remoteproc.c
> +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c
> @@ -75,13 +75,21 @@ struct mbox_info {
>   * Hardcoded TCM bank values. This will be removed once TCM bindings are
>   * accepted for system-dt specifications and upstreamed in linux kernel
>   */
> -static const struct mem_bank_data zynqmp_tcm_banks[] = {
> +static const struct mem_bank_data zynqmp_tcm_banks_split[] = {
>       {0xffe00000UL, 0x10000UL, PD_R5_0_ATCM, "atcm0"}, /* TCM 64KB each */
>       {0xffe20000UL, 0x10000UL, PD_R5_0_BTCM, "btcm0"},
>       {0xffe90000UL, 0x10000UL, PD_R5_1_ATCM, "atcm1"},
>       {0xffeb0000UL, 0x10000UL, PD_R5_1_BTCM, "btcm1"},
>  };
>  
> +/* In lockstep mode cluster combines each 64KB TCM and makes 128KB TCM */
> +static const struct mem_bank_data zynqmp_tcm_banks_lockstep[] = {
> +     {0xffe00000UL, 0x20000UL, PD_R5_0_ATCM, "atcm0"}, /* TCM 128KB each */
> +     {0xffe20000UL, 0x20000UL, PD_R5_0_BTCM, "btcm0"},
> +     {0, 0, PD_R5_1_ATCM, ""},
> +     {0, 0, PD_R5_1_BTCM, ""},
> +};
> +
>  /**
>   * struct zynqmp_r5_core
>   *
> @@ -650,14 +658,11 @@ static int add_tcm_carveout_lockstep_mode(struct rproc 
> *rproc)
>       /*
>        * In lockstep mode, TCM is contiguous memory block
>        * However, each TCM block still needs to be enabled individually.
> -      * So, Enable each TCM block individually, but add their size
> -      * to create contiguous memory region.
> +      * So, Enable each TCM block individually.
> +      * Although ATCM and BTCM is contiguous memory block, add two separate
> +      * carveouts for both.
>        */
> -     bank_addr = r5_core->tcm_banks[0]->addr;
> -     bank_name = r5_core->tcm_banks[0]->bank_name;
> -
>       for (i = 0; i < num_banks; i++) {
> -             bank_size += r5_core->tcm_banks[i]->size;
>               pm_domain_id = r5_core->tcm_banks[i]->pm_domain_id;
>  
>               /* Turn on each TCM bank individually */
> @@ -668,23 +673,31 @@ static int add_tcm_carveout_lockstep_mode(struct rproc 
> *rproc)
>                       dev_err(dev, "failed to turn on TCM 0x%x", 
> pm_domain_id);
>                       goto release_tcm_lockstep;
>               }
> -     }
>  
> -     dev_dbg(dev, "TCM add carveout lockstep mode %s addr=0x%llx, 
> size=0x%lx",
> -             bank_name, bank_addr, bank_size);
> -
> -     /* Register TCM address range, TCM map and unmap functions */
> -     rproc_mem = rproc_mem_entry_init(dev, NULL, bank_addr,
> -                                      bank_size, bank_addr,
> -                                      tcm_mem_map, tcm_mem_unmap,
> -                                      bank_name);
> -     if (!rproc_mem) {
> -             ret = -ENOMEM;
> -             goto release_tcm_lockstep;
> -     }
> +             bank_size = r5_core->tcm_banks[i]->size;
> +             if (bank_size == 0)
> +                     continue;
>  
> -     /* If registration is success, add carveouts */
> -     rproc_add_carveout(rproc, rproc_mem);
> +             bank_addr = r5_core->tcm_banks[i]->addr;
> +             bank_name = r5_core->tcm_banks[i]->bank_name;
> +
> +             /* Register TCM address range, TCM map and unmap functions */
> +             rproc_mem = rproc_mem_entry_init(dev, NULL, bank_addr,
> +                                              bank_size, bank_addr,
> +                                              tcm_mem_map, tcm_mem_unmap,
> +                                              bank_name);
> +             if (!rproc_mem) {
> +                     ret = -ENOMEM;
> +                     zynqmp_pm_release_node(pm_domain_id);
> +                     goto release_tcm_lockstep;
> +             }
> +
> +             /* If registration is success, add carveouts */
> +             rproc_add_carveout(rproc, rproc_mem);
> +
> +             dev_dbg(dev, "TCM add carveout lockstep mode %s addr=0x%llx, 
> size=0x%lx",
> +                     bank_name, bank_addr, bank_size);
> +     }
>  
>       return 0;
>  
> @@ -895,12 +908,19 @@ static struct zynqmp_r5_core 
> *zynqmp_r5_add_rproc_core(struct device *cdev)
>   */
>  static int zynqmp_r5_get_tcm_node(struct zynqmp_r5_cluster *cluster)
>  {
> +     const struct mem_bank_data *zynqmp_tcm_banks;
>       struct device *dev = cluster->dev;
>       struct zynqmp_r5_core *r5_core;
>       int tcm_bank_count, tcm_node;
>       int i, j;
>  
> -     tcm_bank_count = ARRAY_SIZE(zynqmp_tcm_banks);
> +     if (cluster->mode == SPLIT_MODE) {
> +             zynqmp_tcm_banks = zynqmp_tcm_banks_split;
> +             tcm_bank_count = ARRAY_SIZE(zynqmp_tcm_banks_split);
> +     } else {
> +             zynqmp_tcm_banks = zynqmp_tcm_banks_lockstep;
> +             tcm_bank_count = ARRAY_SIZE(zynqmp_tcm_banks_lockstep);
> +     }
>  
>       /* count per core tcm banks */
>       tcm_bank_count = tcm_bank_count / cluster->core_count;
> 
> base-commit: 6995e2de6891c724bfeb2db33d7b87775f913ad1
> -- 
> 2.25.1
> 

Reply via email to