mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-20 19:44:23 +00:00
FVP: Add Delay Timer driver to BL1 and BL31
SMMUv3 driver functions which are called from BL1 and BL31 currently use counter-based poll method for testing status bits. Adding Delay Timer driver to BL1 and BL31 is required for timeout-based implementation using timer delay functions for SMMU and other drivers. This patch adds new function `fvp_timer_init()` which initialises either System level generic or SP804 timer based on FVP_USE_SP804_TIMER build flag. In BL2U `bl2u_early_platform_setup()` function the call to `arm_bl2u_early_platform_setup()` (which calls `generic_delay_timer_init()` ignoring FVP_USE_SP804_TIMER flag), is replaced with `arm_console_boot_init()` and `fvp_timer_init()`. Change-Id: Ifd8dcebf4019e877b9bc5641551deef77a44c0d1 Signed-off-by: Alexei Fedorov <Alexei.Fedorov@arm.com>
This commit is contained in:
parent
d1b6013d84
commit
1b597c227e
7 changed files with 55 additions and 14 deletions
|
@ -48,6 +48,9 @@ void bl1_platform_setup(void)
|
||||||
{
|
{
|
||||||
arm_bl1_platform_setup();
|
arm_bl1_platform_setup();
|
||||||
|
|
||||||
|
/* Initialize System level generic or SP804 timer */
|
||||||
|
fvp_timer_init();
|
||||||
|
|
||||||
/* On FVP RevC, initialize SMMUv3 */
|
/* On FVP RevC, initialize SMMUv3 */
|
||||||
if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U)
|
if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U)
|
||||||
smmuv3_security_init(PLAT_FVP_SMMUV3_BASE);
|
smmuv3_security_init(PLAT_FVP_SMMUV3_BASE);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
|
* Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -25,15 +25,6 @@ void bl2_platform_setup(void)
|
||||||
{
|
{
|
||||||
arm_bl2_platform_setup();
|
arm_bl2_platform_setup();
|
||||||
|
|
||||||
#if FVP_USE_SP804_TIMER
|
/* Initialize System level generic or SP804 timer */
|
||||||
/* Enable the clock override for SP804 timer 0, which means that no
|
fvp_timer_init();
|
||||||
* clock dividers are applied and the raw (35 MHz) clock will be used */
|
|
||||||
mmio_write_32(V2M_SP810_BASE, FVP_SP810_CTRL_TIM0_OV);
|
|
||||||
|
|
||||||
/* Initialize delay timer driver using SP804 dual timer 0 */
|
|
||||||
sp804_timer_init(V2M_SP804_TIMER0_BASE,
|
|
||||||
SP804_TIMER_CLKMULT, SP804_TIMER_CLKDIV);
|
|
||||||
#else
|
|
||||||
generic_delay_timer_init();
|
|
||||||
#endif /* FVP_USE_SP804_TIMER */
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
|
* Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -14,6 +14,9 @@ void bl2u_early_platform_setup(struct meminfo *mem_layout, void *plat_info)
|
||||||
{
|
{
|
||||||
arm_bl2u_early_platform_setup(mem_layout, plat_info);
|
arm_bl2u_early_platform_setup(mem_layout, plat_info);
|
||||||
|
|
||||||
|
/* Initialize System level generic or SP804 timer */
|
||||||
|
fvp_timer_init();
|
||||||
|
|
||||||
/* Initialize the platform config for future decision making */
|
/* Initialize the platform config for future decision making */
|
||||||
fvp_config_setup();
|
fvp_config_setup();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
|
* Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -34,6 +34,9 @@ void __init bl31_early_platform_setup2(u_register_t arg0,
|
||||||
*/
|
*/
|
||||||
fvp_interconnect_enable();
|
fvp_interconnect_enable();
|
||||||
|
|
||||||
|
/* Initialize System level generic or SP804 timer */
|
||||||
|
fvp_timer_init();
|
||||||
|
|
||||||
/* On FVP RevC, initialize SMMUv3 */
|
/* On FVP RevC, initialize SMMUv3 */
|
||||||
if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U)
|
if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U)
|
||||||
smmuv3_init(PLAT_FVP_SMMUV3_BASE);
|
smmuv3_init(PLAT_FVP_SMMUV3_BASE);
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include <drivers/arm/cci.h>
|
#include <drivers/arm/cci.h>
|
||||||
#include <drivers/arm/ccn.h>
|
#include <drivers/arm/ccn.h>
|
||||||
#include <drivers/arm/gicv2.h>
|
#include <drivers/arm/gicv2.h>
|
||||||
|
#include <drivers/arm/sp804_delay_timer.h>
|
||||||
|
#include <drivers/generic_delay_timer.h>
|
||||||
#include <lib/mmio.h>
|
#include <lib/mmio.h>
|
||||||
#include <lib/xlat_tables/xlat_tables_compat.h>
|
#include <lib/xlat_tables/xlat_tables_compat.h>
|
||||||
#include <plat/arm/common/arm_config.h>
|
#include <plat/arm/common/arm_config.h>
|
||||||
|
@ -407,3 +409,23 @@ int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
|
||||||
return arm_get_mbedtls_heap(heap_addr, heap_size);
|
return arm_get_mbedtls_heap(heap_addr, heap_size);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void fvp_timer_init(void)
|
||||||
|
{
|
||||||
|
#if FVP_USE_SP804_TIMER
|
||||||
|
/* Enable the clock override for SP804 timer 0, which means that no
|
||||||
|
* clock dividers are applied and the raw (35MHz) clock will be used.
|
||||||
|
*/
|
||||||
|
mmio_write_32(V2M_SP810_BASE, FVP_SP810_CTRL_TIM0_OV);
|
||||||
|
|
||||||
|
/* Initialize delay timer driver using SP804 dual timer 0 */
|
||||||
|
sp804_timer_init(V2M_SP804_TIMER0_BASE,
|
||||||
|
SP804_TIMER_CLKMULT, SP804_TIMER_CLKDIV);
|
||||||
|
#else
|
||||||
|
generic_delay_timer_init();
|
||||||
|
|
||||||
|
/* Enable System level generic timer */
|
||||||
|
mmio_write_32(ARM_SYS_CNTCTL_BASE + CNTCR_OFF,
|
||||||
|
CNTCR_FCREQ(0U) | CNTCR_EN);
|
||||||
|
#endif /* FVP_USE_SP804_TIMER */
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ void fvp_config_setup(void);
|
||||||
void fvp_interconnect_init(void);
|
void fvp_interconnect_init(void);
|
||||||
void fvp_interconnect_enable(void);
|
void fvp_interconnect_enable(void);
|
||||||
void fvp_interconnect_disable(void);
|
void fvp_interconnect_disable(void);
|
||||||
|
void fvp_timer_init(void);
|
||||||
void tsp_early_platform_setup(void);
|
void tsp_early_platform_setup(void);
|
||||||
|
|
||||||
#endif /* FVP_PRIVATE_H */
|
#endif /* FVP_PRIVATE_H */
|
||||||
|
|
|
@ -127,6 +127,7 @@ endif
|
||||||
|
|
||||||
BL1_SOURCES += drivers/arm/smmu/smmu_v3.c \
|
BL1_SOURCES += drivers/arm/smmu/smmu_v3.c \
|
||||||
drivers/arm/sp805/sp805.c \
|
drivers/arm/sp805/sp805.c \
|
||||||
|
drivers/delay_timer/delay_timer.c \
|
||||||
drivers/io/io_semihosting.c \
|
drivers/io/io_semihosting.c \
|
||||||
lib/semihosting/semihosting.c \
|
lib/semihosting/semihosting.c \
|
||||||
lib/semihosting/${ARCH}/semihosting_call.S \
|
lib/semihosting/${ARCH}/semihosting_call.S \
|
||||||
|
@ -138,6 +139,12 @@ BL1_SOURCES += drivers/arm/smmu/smmu_v3.c \
|
||||||
${FVP_CPU_LIBS} \
|
${FVP_CPU_LIBS} \
|
||||||
${FVP_INTERCONNECT_SOURCES}
|
${FVP_INTERCONNECT_SOURCES}
|
||||||
|
|
||||||
|
ifeq (${FVP_USE_SP804_TIMER},1)
|
||||||
|
BL1_SOURCES += drivers/arm/sp804/sp804_delay_timer.c
|
||||||
|
else
|
||||||
|
BL1_SOURCES += drivers/delay_timer/generic_delay_timer.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
BL2_SOURCES += drivers/arm/sp805/sp805.c \
|
BL2_SOURCES += drivers/arm/sp805/sp805.c \
|
||||||
drivers/io/io_semihosting.c \
|
drivers/io/io_semihosting.c \
|
||||||
|
@ -167,8 +174,13 @@ endif
|
||||||
BL2U_SOURCES += plat/arm/board/fvp/fvp_bl2u_setup.c \
|
BL2U_SOURCES += plat/arm/board/fvp/fvp_bl2u_setup.c \
|
||||||
${FVP_SECURITY_SOURCES}
|
${FVP_SECURITY_SOURCES}
|
||||||
|
|
||||||
|
ifeq (${FVP_USE_SP804_TIMER},1)
|
||||||
|
BL2U_SOURCES += drivers/arm/sp804/sp804_delay_timer.c
|
||||||
|
endif
|
||||||
|
|
||||||
BL31_SOURCES += drivers/arm/fvp/fvp_pwrc.c \
|
BL31_SOURCES += drivers/arm/fvp/fvp_pwrc.c \
|
||||||
drivers/arm/smmu/smmu_v3.c \
|
drivers/arm/smmu/smmu_v3.c \
|
||||||
|
drivers/delay_timer/delay_timer.c \
|
||||||
drivers/cfi/v2m/v2m_flash.c \
|
drivers/cfi/v2m/v2m_flash.c \
|
||||||
lib/utils/mem_region.c \
|
lib/utils/mem_region.c \
|
||||||
plat/arm/board/fvp/fvp_bl31_setup.c \
|
plat/arm/board/fvp/fvp_bl31_setup.c \
|
||||||
|
@ -181,6 +193,12 @@ BL31_SOURCES += drivers/arm/fvp/fvp_pwrc.c \
|
||||||
${FVP_INTERCONNECT_SOURCES} \
|
${FVP_INTERCONNECT_SOURCES} \
|
||||||
${FVP_SECURITY_SOURCES}
|
${FVP_SECURITY_SOURCES}
|
||||||
|
|
||||||
|
ifeq (${FVP_USE_SP804_TIMER},1)
|
||||||
|
BL31_SOURCES += drivers/arm/sp804/sp804_delay_timer.c
|
||||||
|
else
|
||||||
|
BL31_SOURCES += drivers/delay_timer/generic_delay_timer.c
|
||||||
|
endif
|
||||||
|
|
||||||
# Add the FDT_SOURCES and options for Dynamic Config (only for Unix env)
|
# Add the FDT_SOURCES and options for Dynamic Config (only for Unix env)
|
||||||
ifdef UNIX_MK
|
ifdef UNIX_MK
|
||||||
FVP_HW_CONFIG_DTS := fdts/${FVP_DT_PREFIX}.dts
|
FVP_HW_CONFIG_DTS := fdts/${FVP_DT_PREFIX}.dts
|
||||||
|
|
Loading…
Add table
Reference in a new issue