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
>