Re: [PATCH] remoteproc: zynqmp: change tcm address translation method

From: Mathieu Poirier
Date: Fri Sep 29 2023 - 12:58:22 EST


On Mon, Sep 25, 2023 at 10:26:48AM -0700, Tanmay Shah wrote:
> Introduce device address in hardcode TCM table.
> Device address is used for address translation.
> Also, previous method(hack) to mask few bits from address
> to achieve address translation is removed
>
> Signed-off-by: Tanmay Shah <tanmay.shah@xxxxxxx>
> ---
> drivers/remoteproc/xlnx_r5_remoteproc.c | 58 +++++++++----------------
> 1 file changed, 20 insertions(+), 38 deletions(-)
>

Applied.

Thanks,
Mathieu

> diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c b/drivers/remoteproc/xlnx_r5_remoteproc.c
> index efd758c2f4ed..4395edea9a64 100644
> --- a/drivers/remoteproc/xlnx_r5_remoteproc.c
> +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c
> @@ -39,12 +39,14 @@ enum zynqmp_r5_cluster_mode {
> * struct mem_bank_data - Memory Bank description
> *
> * @addr: Start address of memory bank
> + * @da: device address
> * @size: Size of Memory bank
> * @pm_domain_id: Power-domains id of memory bank for firmware to turn on/off
> * @bank_name: name of the bank for remoteproc framework
> */
> struct mem_bank_data {
> phys_addr_t addr;
> + u32 da;
> size_t size;
> u32 pm_domain_id;
> char *bank_name;
> @@ -76,18 +78,18 @@ struct mbox_info {
> * accepted for system-dt specifications and upstreamed in linux kernel
> */
> 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"},
> + {0xffe00000UL, 0x0, 0x10000UL, PD_R5_0_ATCM, "atcm0"}, /* TCM 64KB each */
> + {0xffe20000UL, 0x20000, 0x10000UL, PD_R5_0_BTCM, "btcm0"},
> + {0xffe90000UL, 0x0, 0x10000UL, PD_R5_1_ATCM, "atcm1"},
> + {0xffeb0000UL, 0x20000, 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, ""},
> + {0xffe00000UL, 0x0, 0x20000UL, PD_R5_0_ATCM, "atcm0"}, /* TCM 128KB each */
> + {0xffe20000UL, 0x20000, 0x20000UL, PD_R5_0_BTCM, "btcm0"},
> + {0, 0, 0, PD_R5_1_ATCM, ""},
> + {0, 0, 0, PD_R5_1_BTCM, ""},
> };
>
> /**
> @@ -534,30 +536,6 @@ static int tcm_mem_map(struct rproc *rproc,
> /* clear TCMs */
> memset_io(va, 0, mem->len);
>
> - /*
> - * The R5s expect their TCM banks to be at address 0x0 and 0x2000,
> - * while on the Linux side they are at 0xffexxxxx.
> - *
> - * Zero out the high 12 bits of the address. This will give
> - * expected values for TCM Banks 0A and 0B (0x0 and 0x20000).
> - */
> - mem->da &= 0x000fffff;
> -
> - /*
> - * TCM Banks 1A and 1B still have to be translated.
> - *
> - * Below handle these two banks' absolute addresses (0xffe90000 and
> - * 0xffeb0000) and convert to the expected relative addresses
> - * (0x0 and 0x20000).
> - */
> - if (mem->da == 0x90000 || mem->da == 0xB0000)
> - mem->da -= 0x90000;
> -
> - /* if translated TCM bank address is not valid report error */
> - if (mem->da != 0x0 && mem->da != 0x20000) {
> - dev_err(&rproc->dev, "invalid TCM address: %x\n", mem->da);
> - return -EINVAL;
> - }
> return 0;
> }
>
> @@ -579,6 +557,7 @@ static int add_tcm_carveout_split_mode(struct rproc *rproc)
> u32 pm_domain_id;
> size_t bank_size;
> char *bank_name;
> + u32 da;
>
> r5_core = rproc->priv;
> dev = r5_core->dev;
> @@ -591,6 +570,7 @@ static int add_tcm_carveout_split_mode(struct rproc *rproc)
> */
> for (i = 0; i < num_banks; i++) {
> bank_addr = r5_core->tcm_banks[i]->addr;
> + da = r5_core->tcm_banks[i]->da;
> bank_name = r5_core->tcm_banks[i]->bank_name;
> bank_size = r5_core->tcm_banks[i]->size;
> pm_domain_id = r5_core->tcm_banks[i]->pm_domain_id;
> @@ -603,11 +583,11 @@ static int add_tcm_carveout_split_mode(struct rproc *rproc)
> goto release_tcm_split;
> }
>
> - dev_dbg(dev, "TCM carveout split mode %s addr=%llx, size=0x%lx",
> - bank_name, bank_addr, bank_size);
> + dev_dbg(dev, "TCM carveout split mode %s addr=%llx, da=0x%x, size=0x%lx",
> + bank_name, bank_addr, da, bank_size);
>
> rproc_mem = rproc_mem_entry_init(dev, NULL, bank_addr,
> - bank_size, bank_addr,
> + bank_size, da,
> tcm_mem_map, tcm_mem_unmap,
> bank_name);
> if (!rproc_mem) {
> @@ -648,6 +628,7 @@ static int add_tcm_carveout_lockstep_mode(struct rproc *rproc)
> struct device *dev;
> u32 pm_domain_id;
> char *bank_name;
> + u32 da;
>
> r5_core = rproc->priv;
> dev = r5_core->dev;
> @@ -679,11 +660,12 @@ static int add_tcm_carveout_lockstep_mode(struct rproc *rproc)
> continue;
>
> bank_addr = r5_core->tcm_banks[i]->addr;
> + da = r5_core->tcm_banks[i]->da;
> 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,
> + bank_size, da,
> tcm_mem_map, tcm_mem_unmap,
> bank_name);
> if (!rproc_mem) {
> @@ -695,8 +677,8 @@ static int add_tcm_carveout_lockstep_mode(struct rproc *rproc)
> /* 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);
> + dev_dbg(dev, "TCM carveout lockstep mode %s addr=0x%llx, da=0x%x, size=0x%lx",
> + bank_name, bank_addr, da, bank_size);
> }
>
> return 0;
>
> base-commit: 1a93ced18d7b81be39beba26b1c168ef21c8d0ad
> --
> 2.25.1
>