[U-Boot] [PATCH] driver: net: fsl-mc: Use aligned address for MC FW load

Ashish Kumar ashish.kumar at nxp.com
Tue Nov 8 06:37:42 CET 2016


Hello York,

Please see inline.

Regards
Ashish

-----Original Message-----
From: york sun 
Sent: Tuesday, November 08, 2016 12:23 AM
To: Priyanka Jain <priyanka.jain at nxp.com>; u-boot at lists.denx.de
Cc: Prabhakar Kushwaha <prabhakar.kushwaha at nxp.com>; Ashish Kumar <ashish.kumar at nxp.com>
Subject: Re: [PATCH] driver: net: fsl-mc: Use aligned address for MC FW load

On 10/24/2016 01:05 AM, Priyanka Jain wrote:
> Firmware of Management Complex (MC) should be loaded at 512MB aligned 
> address.
> So use aligned address for firmware load.
>
> Signed-off-by: Priyanka Jain <priyanka.jain at nxp.com>
> Signed-off-by: Prabhakar Kushwaha <prabhakar.kushwaha at nxp.com>
> Signed-off-by: Ashish Kumar <Ashish.Kumar at nxp.com>
> ---
>  drivers/net/fsl-mc/mc.c |   62 ++++++++++++++++++++++++++--------------------
>  1 files changed, 35 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/net/fsl-mc/mc.c b/drivers/net/fsl-mc/mc.c index 
> 1811b0f..c66340b 100644
> --- a/drivers/net/fsl-mc/mc.c
> +++ b/drivers/net/fsl-mc/mc.c
> @@ -29,6 +29,7 @@
>  DECLARE_GLOBAL_DATA_PTR;
>  static int mc_boot_status = -1;
>  static int mc_dpl_applied = -1;
> +static u64 mc_ram_aligned_base_addr;

Why do you need this static variable? You didn't use it.
[Ashish Kumar]  following two function uses global static variable 
-357,7 +369,6 @@ static unsigned long get_mc_boot_timeout_ms(void)
 #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET
 static int load_mc_aiop_img(u64 aiop_fw_addr)
 {
-       u64 mc_ram_addr = mc_get_dram_addr();
 #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR
        void *aiop_img;
 #endif


@@ -440,7 +451,6 @@ int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr)
        size_t raw_image_size = 0;
 #endif
        struct mc_version mc_ver_info;
-       u64 mc_ram_aligned_base_addr;
        u8 mc_ram_num_256mb_blocks;
        size_t mc_ram_size = mc_get_dram_block_size();

>  #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET
>  static int mc_aiop_applied = -1;
>  #endif
> @@ -87,12 +88,15 @@ void dump_mc_ccsr_regs(struct mc_ccsr_registers 
> __iomem *mc_ccsr_regs)
>  /**
>   * Copying MC firmware or DPL image to DDR
>   */
> -static int mc_copy_image(const char *title,
> -			 u64 image_addr, u32 image_size, u64 mc_ram_addr)
> +static int mc_copy_image(const char *title, u64 image_addr,
> +			 u32 image_size, u64 mc_ram_aligned_base_addr)
>  {
> -	debug("%s copied to address %p\n", title, (void *)mc_ram_addr);
> -	memcpy((void *)mc_ram_addr, (void *)image_addr, image_size);
> -	flush_dcache_range(mc_ram_addr, mc_ram_addr + image_size);
> +	debug("%s copied to address %p\n", title,
> +	      (void *)mc_ram_aligned_base_addr);
> +	memcpy((void *)mc_ram_aligned_base_addr,
> +	       (void *)image_addr, image_size);
> +	flush_dcache_range(mc_ram_aligned_base_addr,
> +			   mc_ram_aligned_base_addr + image_size);
>  	return 0;
>  }
>
> @@ -224,7 +228,8 @@ static int mc_fixup_dpc(u64 dpc_addr)
>  	return 0;
>  }
>
> -static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size, u64 
> mc_dpc_addr)
> +static int load_mc_dpc(u64 mc_ram_aligned_base_addr, size_t mc_ram_size,
> +		       u64 mc_dpc_addr)
>  {
>  	u64 mc_dpc_offset;
>  #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR
> @@ -246,7 +251,8 @@ static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpc_addr)
>  	 * Load the MC DPC blob in the MC private DRAM block:
>  	 */
>  #ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR
> -	printf("MC DPC is preloaded to %#llx\n", mc_ram_addr + mc_dpc_offset);
> +	printf("MC DPC is preloaded to %#llx\n",
> +	       mc_ram_aligned_base_addr + mc_dpc_offset);
>  #else
>  	/*
>  	 * Get address and size of the DPC blob stored in flash:
> @@ -270,18 +276,20 @@ static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpc_addr)
>  		return -EINVAL;
>  	}
>
> -	mc_copy_image("MC DPC blob",
> -		      (u64)dpc_fdt_hdr, dpc_size, mc_ram_addr + mc_dpc_offset);
> +	mc_copy_image("MC DPC blob", (u64)dpc_fdt_hdr, dpc_size,
> +		      mc_ram_aligned_base_addr + mc_dpc_offset);
>  #endif /* not defined CONFIG_SYS_LS_MC_DPC_IN_DDR */
>
> -	if (mc_fixup_dpc(mc_ram_addr + mc_dpc_offset))
> +	if (mc_fixup_dpc(mc_ram_aligned_base_addr + mc_dpc_offset))
>  		return -EINVAL;
>
> -	dump_ram_words("DPC", (void *)(mc_ram_addr + mc_dpc_offset));
> +	dump_ram_words("DPC",
> +		       (void *)(mc_ram_aligned_base_addr + mc_dpc_offset));
>  	return 0;
>  }
>
> -static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size, u64 
> mc_dpl_addr)
> +static int load_mc_dpl(u64 mc_ram_aligned_base_addr, size_t mc_ram_size,
> +		       u64 mc_dpl_addr)
>  {
>  	u64 mc_dpl_offset;
>  #ifndef CONFIG_SYS_LS_MC_DPL_IN_DDR
> @@ -303,7 +311,8 @@ static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpl_addr)
>  	 * Load the MC DPL blob in the MC private DRAM block:
>  	 */
>  #ifdef CONFIG_SYS_LS_MC_DPL_IN_DDR
> -	printf("MC DPL is preloaded to %#llx\n", mc_ram_addr + mc_dpl_offset);
> +	printf("MC DPL is preloaded to %#llx\n",
> +	       mc_ram_aligned_base_addr + mc_dpl_offset);
>  #else
>  	/*
>  	 * Get address and size of the DPL blob stored in flash:
> @@ -323,11 +332,12 @@ static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpl_addr)
>  		return -EINVAL;
>  	}
>
> -	mc_copy_image("MC DPL blob",
> -		      (u64)dpl_fdt_hdr, dpl_size, mc_ram_addr + mc_dpl_offset);
> +	mc_copy_image("MC DPL blob", (u64)dpl_fdt_hdr, dpl_size,
> +		      mc_ram_aligned_base_addr + mc_dpl_offset);
>  #endif /* not defined CONFIG_SYS_LS_MC_DPL_IN_DDR */
>
> -	dump_ram_words("DPL", (void *)(mc_ram_addr + mc_dpl_offset));
> +	dump_ram_words("DPL",
> +		       (void *)(mc_ram_aligned_base_addr + mc_dpl_offset));
>  	return 0;
>  }
>
> @@ -364,7 +374,6 @@ __weak bool soc_has_aiop(void)
>
>  static int load_mc_aiop_img(u64 aiop_fw_addr)  {
> -	u64 mc_ram_addr = mc_get_dram_addr();
>  #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR
>  	void *aiop_img;
>  #endif
> @@ -377,13 +386,14 @@ static int load_mc_aiop_img(u64 aiop_fw_addr)
>  	 */
>
>  #ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR
> -	printf("MC AIOP is preloaded to %#llx\n", mc_ram_addr +
> +	printf("MC AIOP is preloaded to %#llx\n", mc_ram_aligned_base_addr +
>  	       CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET);
>  #else
>  	aiop_img = (void *)aiop_fw_addr;
>  	mc_copy_image("MC AIOP image",
>  		      (u64)aiop_img, CONFIG_SYS_LS_MC_AIOP_IMG_MAX_LENGTH,
> -		      mc_ram_addr + CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET);
> +		      mc_ram_aligned_base_addr +
> +		      CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET);
>  #endif
>  	mc_aiop_applied = 0;
>
> @@ -450,7 +460,6 @@ int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr)
>  	size_t raw_image_size = 0;
>  #endif
>  	struct mc_version mc_ver_info;
> -	u64 mc_ram_aligned_base_addr;
>  	u8 mc_ram_num_256mb_blocks;
>  	size_t mc_ram_size = mc_get_dram_block_size();
>
> @@ -478,7 +487,7 @@ int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr)
>  	dmb();
>
>  #ifdef CONFIG_SYS_LS_MC_FW_IN_DDR
> -	printf("MC firmware is preloaded to %#llx\n", mc_ram_addr);
> +	printf("MC firmware is preloaded to %#llx\n", 
> +mc_ram_aligned_base_addr);
>  #else
>  	error = parse_mc_firmware_fit_image(mc_fw_addr, &raw_image_addr,
>  					    &raw_image_size);
> @@ -487,12 +496,12 @@ int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr)
>  	/*
>  	 * Load the MC FW at the beginning of the MC private DRAM block:
>  	 */
> -	mc_copy_image("MC Firmware",
> -		      (u64)raw_image_addr, raw_image_size, mc_ram_addr);
> +	mc_copy_image("MC Firmware", (u64)raw_image_addr, raw_image_size,
> +		      mc_ram_aligned_base_addr);
>  #endif
> -	dump_ram_words("firmware", (void *)mc_ram_addr);
> +	dump_ram_words("firmware", (void *)mc_ram_aligned_base_addr);
>
> -	error = load_mc_dpc(mc_ram_addr, mc_ram_size, mc_dpc_addr);
> +	error = load_mc_dpc(mc_ram_aligned_base_addr, mc_ram_size, 
> +mc_dpc_addr);
>  	if (error != 0)
>  		goto out;
>
> @@ -569,10 +578,9 @@ int mc_apply_dpl(u64 mc_dpl_addr)
>  	struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR;
>  	int error = 0;
>  	u32 reg_gsr;
> -	u64 mc_ram_addr = mc_get_dram_addr();
>  	size_t mc_ram_size = mc_get_dram_block_size();
>
> -	error = load_mc_dpl(mc_ram_addr, mc_ram_size, mc_dpl_addr);
> +	error = load_mc_dpl(mc_ram_aligned_base_addr, mc_ram_size, 
> +mc_dpl_addr);
>  	if (error != 0)
>  		return error;
>
>

Do you have substantial change beside the changing name from mc_ram_addr to mc_ram_aligned_base_addr?
[Ashish Kumar] It is not exactly name change. Here intent is to use userdefine memory size for MC  before this only 512MB of memory can be allocated to MC since it incorrectly used mc_ram_addr in place of mc_aligned_base_addr.
Ok, Name changes are there only in the function parameters to avoid confusion and retain the function signatures.

York



More information about the U-Boot mailing list