Browse Source
This patch adds Firmware Update support for ARM platforms. New files arm_bl1_fwu.c and juno_bl1_setup.c were added to provide platform specific Firmware update code. BL1 now includes mmap entry for `ARM_MAP_NS_DRAM1` to map DRAM for authenticating NS_BL2U image(For both FVP and JUNO platform). Change-Id: Ie116cd83f5dc00aa53d904c2f1beb23d58926555pull/453/head
Yatharth Kochar
9 years ago
12 changed files with 277 additions and 8 deletions
@ -0,0 +1,87 @@ |
|||
/*
|
|||
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* Redistributions of source code must retain the above copyright notice, this |
|||
* list of conditions and the following disclaimer. |
|||
* |
|||
* Redistributions in binary form must reproduce the above copyright notice, |
|||
* this list of conditions and the following disclaimer in the documentation |
|||
* and/or other materials provided with the distribution. |
|||
* |
|||
* Neither the name of ARM nor the names of its contributors may be used |
|||
* to endorse or promote products derived from this software without specific |
|||
* prior written permission. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
* POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#include <bl_common.h> |
|||
#include <errno.h> |
|||
#include <platform.h> |
|||
#include <plat_arm.h> |
|||
#include <tbbr_img_def.h> |
|||
#include <v2m_def.h> |
|||
|
|||
#define RESET_REASON_WDOG_RESET (0x2) |
|||
|
|||
/*******************************************************************************
|
|||
* The following function checks if Firmware update is needed, |
|||
* by checking if TOC in FIP image is valid or watchdog reset happened. |
|||
******************************************************************************/ |
|||
unsigned int bl1_plat_get_next_image_id(void) |
|||
{ |
|||
unsigned int *reset_flags_ptr = (unsigned int *)SSC_GPRETN; |
|||
unsigned int *nv_flags_ptr = (unsigned int *) |
|||
(V2M_SYSREGS_BASE + V2M_SYS_NVFLAGS); |
|||
/*
|
|||
* Check if TOC is invalid or watchdog reset happened. |
|||
*/ |
|||
if ((arm_io_is_toc_valid() != 1) || |
|||
((*reset_flags_ptr & RESET_REASON_WDOG_RESET) && |
|||
((*nv_flags_ptr == -EAUTH) || (*nv_flags_ptr == -ENOENT)))) |
|||
return NS_BL1U_IMAGE_ID; |
|||
|
|||
return BL2_IMAGE_ID; |
|||
} |
|||
|
|||
/*******************************************************************************
|
|||
* On JUNO update the arg2 with address of SCP_BL2U image info. |
|||
******************************************************************************/ |
|||
void bl1_plat_set_ep_info(unsigned int image_id, |
|||
entry_point_info_t *ep_info) |
|||
{ |
|||
if (image_id == BL2U_IMAGE_ID) { |
|||
image_desc_t *image_desc = bl1_plat_get_image_desc(SCP_BL2U_IMAGE_ID); |
|||
ep_info->args.arg2 = (unsigned long)&image_desc->image_info; |
|||
} |
|||
} |
|||
|
|||
/*******************************************************************************
|
|||
* On Juno clear SYS_NVFLAGS and wait for watchdog reset. |
|||
******************************************************************************/ |
|||
__dead2 void bl1_plat_fwu_done(void *cookie, void *rsvd_ptr) |
|||
{ |
|||
unsigned int *nv_flags_clr = (unsigned int *) |
|||
(V2M_SYSREGS_BASE + V2M_SYS_NVFLAGSCLR); |
|||
unsigned int *nv_flags_ptr = (unsigned int *) |
|||
(V2M_SYSREGS_BASE + V2M_SYS_NVFLAGS); |
|||
|
|||
/* Clear the NV flags register. */ |
|||
*nv_flags_clr = *nv_flags_ptr; |
|||
|
|||
while (1) |
|||
wfi(); |
|||
} |
@ -0,0 +1,114 @@ |
|||
/*
|
|||
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* Redistributions of source code must retain the above copyright notice, this |
|||
* list of conditions and the following disclaimer. |
|||
* |
|||
* Redistributions in binary form must reproduce the above copyright notice, |
|||
* this list of conditions and the following disclaimer in the documentation |
|||
* and/or other materials provided with the distribution. |
|||
* |
|||
* Neither the name of ARM nor the names of its contributors may be used |
|||
* to endorse or promote products derived from this software without specific |
|||
* prior written permission. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
* POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#include <assert.h> |
|||
#include <bl_common.h> |
|||
#include <debug.h> |
|||
#include <errno.h> |
|||
#include <plat_arm.h> |
|||
#include <tbbr_img_desc.h> |
|||
|
|||
|
|||
/* Struct to keep track of usable memory */ |
|||
typedef struct bl1_mem_info{ |
|||
uintptr_t mem_base; |
|||
unsigned int mem_size; |
|||
} bl1_mem_info_t; |
|||
|
|||
bl1_mem_info_t fwu_addr_map_secure[] = { |
|||
{ |
|||
.mem_base = ARM_SHARED_RAM_BASE, |
|||
.mem_size = ARM_SHARED_RAM_SIZE |
|||
}, |
|||
{ |
|||
.mem_size = 0 |
|||
} |
|||
}; |
|||
|
|||
bl1_mem_info_t fwu_addr_map_non_secure[] = { |
|||
{ |
|||
.mem_base = ARM_NS_DRAM1_BASE, |
|||
.mem_size = ARM_NS_DRAM1_SIZE |
|||
}, |
|||
{ |
|||
.mem_base = V2M_FLASH0_BASE, |
|||
.mem_size = V2M_FLASH0_SIZE |
|||
}, |
|||
{ |
|||
.mem_size = 0 |
|||
} |
|||
}; |
|||
|
|||
int bl1_plat_mem_check(uintptr_t mem_base, |
|||
unsigned int mem_size, |
|||
unsigned int flags) |
|||
{ |
|||
unsigned int index = 0; |
|||
bl1_mem_info_t *mmap; |
|||
|
|||
assert(mem_base); |
|||
assert(mem_size); |
|||
|
|||
/*
|
|||
* Check the given image source and size. |
|||
*/ |
|||
if (GET_SEC_STATE(flags) == SECURE) |
|||
mmap = fwu_addr_map_secure; |
|||
else |
|||
mmap = fwu_addr_map_non_secure; |
|||
|
|||
while (mmap[index].mem_size) { |
|||
if ((mem_base >= mmap[index].mem_base) && |
|||
((mem_base + mem_size) |
|||
<= (mmap[index].mem_base + |
|||
mmap[index].mem_size))) |
|||
return 0; |
|||
|
|||
index++; |
|||
} |
|||
|
|||
return -ENOMEM; |
|||
} |
|||
|
|||
/*******************************************************************************
|
|||
* This function does linear search for image_id and returns image_desc. |
|||
******************************************************************************/ |
|||
image_desc_t *bl1_plat_get_image_desc(unsigned int image_id) |
|||
{ |
|||
unsigned int index = 0; |
|||
|
|||
while (bl1_tbbr_image_descs[index].image_id != INVALID_IMAGE_ID) { |
|||
if (bl1_tbbr_image_descs[index].image_id == image_id) |
|||
return &bl1_tbbr_image_descs[index]; |
|||
index++; |
|||
} |
|||
|
|||
return NULL; |
|||
} |
Loading…
Reference in new issue