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.s...@amd.com>
> ---
>  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
> 

Reply via email to