diff mbox series

[v5,03/24] arm: imx: hab: Optimise flow of authenticate_image on is_enabled fail

Message ID 1515433001-13857-4-git-send-email-bryan.odonoghue@linaro.org
State Superseded
Headers show
Series Fix and extend i.MX HAB layer | expand

Commit Message

Bryan O'Donoghue Jan. 8, 2018, 5:36 p.m. UTC
There is no need to call is_enabled() twice in authenticate_image - it does
nothing but add an additional layer of indentation.

We can check for is_enabled() at the start of the function and return the
result code directly.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: Peng Fan <peng.fan@nxp.com>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
Cc: Sven Ebenfeld <sven.ebenfeld@gmail.com>
Cc: George McCollister <george.mccollister@gmail.com>
Cc: Breno Matheus Lima <brenomatheus@gmail.com>
---
 arch/arm/mach-imx/hab.c | 138 ++++++++++++++++++++++++------------------------
 1 file changed, 69 insertions(+), 69 deletions(-)

Comments

Breno Matheus Lima Jan. 11, 2018, 7:34 p.m. UTC | #1
Hi Bryan,

2018-01-08 15:36 GMT-02:00 Bryan O'Donoghue <bryan.odonoghue@linaro.org>:
> There is no need to call is_enabled() twice in authenticate_image - it does
> nothing but add an additional layer of indentation.
>
> We can check for is_enabled() at the start of the function and return the
> result code directly.
>
> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Fabio Estevam <fabio.estevam@nxp.com>
> Cc: Peng Fan <peng.fan@nxp.com>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Sven Ebenfeld <sven.ebenfeld@gmail.com>
> Cc: George McCollister <george.mccollister@gmail.com>
> Cc: Breno Matheus Lima <brenomatheus@gmail.com>
> ---
>  arch/arm/mach-imx/hab.c | 138 ++++++++++++++++++++++++------------------------
>  1 file changed, 69 insertions(+), 69 deletions(-)
>
> diff --git a/arch/arm/mach-imx/hab.c b/arch/arm/mach-imx/hab.c
> index 9fe6d43..6f86c02 100644
> --- a/arch/arm/mach-imx/hab.c
> +++ b/arch/arm/mach-imx/hab.c
> @@ -428,91 +428,91 @@ int authenticate_image(uint32_t ddr_start, uint32_t image_size)
>         hab_rvt_entry = hab_rvt_entry_p;
>         hab_rvt_exit = hab_rvt_exit_p;
>
> -       if (is_hab_enabled()) {
> -               printf("\nAuthenticate image from DDR location 0x%x...\n",
> -                      ddr_start);
> +       if (!is_hab_enabled()) {
> +               puts("hab fuse not enabled\n");
> +               return result;
> +       }

Just another comment in your series, I was working on an open i.MX6UL
EVK and noticed that we may have problem with SPL boards in open mode:

U-Boot SPL 2018.01-rc3-39088-g59b5c4e (Jan 11 2018 - 16:32:52)
Trying to boot from MMC1
hab fuse not enabled
spl: ERROR:  image authentication unsuccessful
### ERROR ### Please RESET the board ###

The imx_hab_authenticate_image() is returning an authentication
failure in this case and we cannot boot u-boot-ivt.img. In this way is
not possible to run hab_status before closing the device.

I think the following fix this issue:

--- a/arch/arm/mach-imx/hab.c
+++ b/arch/arm/mach-imx/hab.c
@@ -492,7 +492,7 @@ int imx_hab_authenticate_image(uint32_t ddr_start,
uint32_t image_size,

        if (!imx_hab_is_enabled()) {
                puts("hab fuse not enabled\n");
-               return result;
+               goto hab_exit;
        }

        printf("\nAuthenticate image from DDR location 0x%x...\n",
@@ -594,7 +594,8 @@ hab_exit_failure_print_status:
 hab_caam_clock_disable:
        hab_caam_clock_enable(0);

-       if (load_addr != 0)
+hab_exit:
+       if (load_addr != 0 || (!imx_hab_is_enabled()))
                result = 0;

Can you please check if is possible to add this on your series? If is
too late I can submit a patch.

Thanks,
Breno Lima
Bryan O'Donoghue Jan. 12, 2018, 11:17 a.m. UTC | #2
On 11/01/18 19:34, Breno Matheus Lima wrote:
> Hi Bryan,
> 
> 2018-01-08 15:36 GMT-02:00 Bryan O'Donoghue <bryan.odonoghue@linaro.org>:
>> There is no need to call is_enabled() twice in authenticate_image - it does
>> nothing but add an additional layer of indentation.
>>
>> We can check for is_enabled() at the start of the function and return the
>> result code directly.
>>
>> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
>> Cc: Stefano Babic <sbabic@denx.de>
>> Cc: Fabio Estevam <fabio.estevam@nxp.com>
>> Cc: Peng Fan <peng.fan@nxp.com>
>> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
>> Cc: Sven Ebenfeld <sven.ebenfeld@gmail.com>
>> Cc: George McCollister <george.mccollister@gmail.com>
>> Cc: Breno Matheus Lima <brenomatheus@gmail.com>
>> ---
>>   arch/arm/mach-imx/hab.c | 138 ++++++++++++++++++++++++------------------------
>>   1 file changed, 69 insertions(+), 69 deletions(-)
>>
>> diff --git a/arch/arm/mach-imx/hab.c b/arch/arm/mach-imx/hab.c
>> index 9fe6d43..6f86c02 100644
>> --- a/arch/arm/mach-imx/hab.c
>> +++ b/arch/arm/mach-imx/hab.c
>> @@ -428,91 +428,91 @@ int authenticate_image(uint32_t ddr_start, uint32_t image_size)
>>          hab_rvt_entry = hab_rvt_entry_p;
>>          hab_rvt_exit = hab_rvt_exit_p;
>>
>> -       if (is_hab_enabled()) {
>> -               printf("\nAuthenticate image from DDR location 0x%x...\n",
>> -                      ddr_start);
>> +       if (!is_hab_enabled()) {
>> +               puts("hab fuse not enabled\n");
>> +               return result;
>> +       }
> 
> Just another comment in your series, I was working on an open i.MX6UL
> EVK and noticed that we may have problem with SPL boards in open mode:
> 
> U-Boot SPL 2018.01-rc3-39088-g59b5c4e (Jan 11 2018 - 16:32:52)
> Trying to boot from MMC1
> hab fuse not enabled
> spl: ERROR:  image authentication unsuccessful
> ### ERROR ### Please RESET the board ###
> 
> The imx_hab_authenticate_image() is returning an authentication
> failure in this case and we cannot boot u-boot-ivt.img. In this way is
> not possible to run hab_status before closing the device.

So, at least on the MX7 - bootrom->authenticate_image() won't run unless 
the board is in locked mode, I suspect that's the same behavior on the MX6.

> I think the following fix this issue:
> 
> --- a/arch/arm/mach-imx/hab.c
> +++ b/arch/arm/mach-imx/hab.c
> @@ -492,7 +492,7 @@ int imx_hab_authenticate_image(uint32_t ddr_start,
> uint32_t image_size,
> 
>          if (!imx_hab_is_enabled()) {
>                  puts("hab fuse not enabled\n");
> -               return result;
> +               goto hab_exit;

Right, what you want is for uboot->authenticate_image() to return zero 
(OK) when the part is unlocked.

If this were the first time we were adding this code in, I'd say that 
would be a crazy thing to do because

1. bootrom->authenticate_image() will return an error
2. uboot->authenticate_image() will not even call 
bootrom->authenticate_image()

However since you already have a dependency on this behavior - I'll 
respin this code ....

---
bod
diff mbox series

Patch

diff --git a/arch/arm/mach-imx/hab.c b/arch/arm/mach-imx/hab.c
index 9fe6d43..6f86c02 100644
--- a/arch/arm/mach-imx/hab.c
+++ b/arch/arm/mach-imx/hab.c
@@ -428,91 +428,91 @@  int authenticate_image(uint32_t ddr_start, uint32_t image_size)
 	hab_rvt_entry = hab_rvt_entry_p;
 	hab_rvt_exit = hab_rvt_exit_p;
 
-	if (is_hab_enabled()) {
-		printf("\nAuthenticate image from DDR location 0x%x...\n",
-		       ddr_start);
+	if (!is_hab_enabled()) {
+		puts("hab fuse not enabled\n");
+		return result;
+	}
 
-		hab_caam_clock_enable(1);
+	printf("\nAuthenticate image from DDR location 0x%x...\n",
+	       ddr_start);
 
-		if (hab_rvt_entry() == HAB_SUCCESS) {
-			/* If not already aligned, Align to ALIGN_SIZE */
-			ivt_offset = (image_size + ALIGN_SIZE - 1) &
-					~(ALIGN_SIZE - 1);
+	hab_caam_clock_enable(1);
 
-			start = ddr_start;
-			bytes = ivt_offset + IVT_SIZE + CSF_PAD_SIZE;
+	if (hab_rvt_entry() == HAB_SUCCESS) {
+		/* If not already aligned, Align to ALIGN_SIZE */
+		ivt_offset = (image_size + ALIGN_SIZE - 1) &
+				~(ALIGN_SIZE - 1);
+
+		start = ddr_start;
+		bytes = ivt_offset + IVT_SIZE + CSF_PAD_SIZE;
 #ifdef DEBUG
-			printf("\nivt_offset = 0x%x, ivt addr = 0x%x\n",
-			       ivt_offset, ddr_start + ivt_offset);
-			puts("Dumping IVT\n");
-			print_buffer(ddr_start + ivt_offset,
-				     (void *)(ddr_start + ivt_offset),
-				     4, 0x8, 0);
-
-			puts("Dumping CSF Header\n");
-			print_buffer(ddr_start + ivt_offset+IVT_SIZE,
-				     (void *)(ddr_start + ivt_offset+IVT_SIZE),
-				     4, 0x10, 0);
+		printf("\nivt_offset = 0x%x, ivt addr = 0x%x\n",
+		       ivt_offset, ddr_start + ivt_offset);
+		puts("Dumping IVT\n");
+		print_buffer(ddr_start + ivt_offset,
+			     (void *)(ddr_start + ivt_offset),
+			     4, 0x8, 0);
+
+		puts("Dumping CSF Header\n");
+		print_buffer(ddr_start + ivt_offset + IVT_SIZE,
+			     (void *)(ddr_start + ivt_offset + IVT_SIZE),
+			     4, 0x10, 0);
 
 #if  !defined(CONFIG_SPL_BUILD)
-			get_hab_status();
+		get_hab_status();
 #endif
 
-			puts("\nCalling authenticate_image in ROM\n");
-			printf("\tivt_offset = 0x%x\n", ivt_offset);
-			printf("\tstart = 0x%08lx\n", start);
-			printf("\tbytes = 0x%x\n", bytes);
+		puts("\nCalling authenticate_image in ROM\n");
+		printf("\tivt_offset = 0x%x\n", ivt_offset);
+		printf("\tstart = 0x%08lx\n", start);
+		printf("\tbytes = 0x%x\n", bytes);
 #endif
-			/*
-			 * If the MMU is enabled, we have to notify the ROM
-			 * code, or it won't flush the caches when needed.
-			 * This is done, by setting the "pu_irom_mmu_enabled"
-			 * word to 1. You can find its address by looking in
-			 * the ROM map. This is critical for
-			 * authenticate_image(). If MMU is enabled, without
-			 * setting this bit, authentication will fail and may
-			 * crash.
-			 */
-			/* Check MMU enabled */
-			if (is_soc_type(MXC_SOC_MX6) && get_cr() & CR_M) {
-				if (is_mx6dq()) {
-					/*
-					 * This won't work on Rev 1.0.0 of
-					 * i.MX6Q/D, since their ROM doesn't
-					 * do cache flushes. don't think any
-					 * exist, so we ignore them.
-					 */
-					if (!is_mx6dqp())
-						writel(1, MX6DQ_PU_IROM_MMU_EN_VAR);
-				} else if (is_mx6sdl()) {
-					writel(1, MX6DLS_PU_IROM_MMU_EN_VAR);
-				} else if (is_mx6sl()) {
-					writel(1, MX6SL_PU_IROM_MMU_EN_VAR);
-				}
+		/*
+		 * If the MMU is enabled, we have to notify the ROM
+		 * code, or it won't flush the caches when needed.
+		 * This is done, by setting the "pu_irom_mmu_enabled"
+		 * word to 1. You can find its address by looking in
+		 * the ROM map. This is critical for
+		 * authenticate_image(). If MMU is enabled, without
+		 * setting this bit, authentication will fail and may
+		 * crash.
+		 */
+		/* Check MMU enabled */
+		if (is_soc_type(MXC_SOC_MX6) && get_cr() & CR_M) {
+			if (is_mx6dq()) {
+				/*
+				 * This won't work on Rev 1.0.0 of
+				 * i.MX6Q/D, since their ROM doesn't
+				 * do cache flushes. don't think any
+				 * exist, so we ignore them.
+				 */
+				if (!is_mx6dqp())
+					writel(1, MX6DQ_PU_IROM_MMU_EN_VAR);
+			} else if (is_mx6sdl()) {
+				writel(1, MX6DLS_PU_IROM_MMU_EN_VAR);
+			} else if (is_mx6sl()) {
+				writel(1, MX6SL_PU_IROM_MMU_EN_VAR);
 			}
+		}
 
-			load_addr = (uint32_t)hab_rvt_authenticate_image(
-					HAB_CID_UBOOT,
-					ivt_offset, (void **)&start,
-					(size_t *)&bytes, NULL);
-			if (hab_rvt_exit() != HAB_SUCCESS) {
-				puts("hab exit function fail\n");
-				load_addr = 0;
-			}
-		} else {
-			puts("hab entry function fail\n");
+		load_addr = (uint32_t)hab_rvt_authenticate_image(
+				HAB_CID_UBOOT,
+				ivt_offset, (void **)&start,
+				(size_t *)&bytes, NULL);
+		if (hab_rvt_exit() != HAB_SUCCESS) {
+			puts("hab exit function fail\n");
+			load_addr = 0;
 		}
+	} else {
+		puts("hab entry function fail\n");
+	}
 
-		hab_caam_clock_enable(0);
+	hab_caam_clock_enable(0);
 
 #if !defined(CONFIG_SPL_BUILD)
-		get_hab_status();
+	get_hab_status();
 #endif
-	} else {
-		puts("hab fuse not enabled\n");
-	}
-
-	if ((!is_hab_enabled()) || (load_addr != 0))
+	if (load_addr != 0)
 		result = 0;
 
 	return result;