mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 10:04:26 +00:00

This patch extends the build option `USE_COHERENT_MEMORY` to conditionally remove coherent memory from the memory maps of all boot loader stages. The patch also adds necessary documentation for coherent memory removal in firmware-design, porting and user guides. Fixes ARM-Software/tf-issues#106 Change-Id: I260e8768c6a5c2efc402f5804a80657d8ce38773
197 lines
7.5 KiB
C
197 lines
7.5 KiB
C
/*
|
|
* Copyright (c) 2013-2014, 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 <arch.h>
|
|
#include <arm_gic.h>
|
|
#include <assert.h>
|
|
#include <bl31.h>
|
|
#include <bl_common.h>
|
|
#include <cci400.h>
|
|
#include <console.h>
|
|
#include <mmio.h>
|
|
#include <platform.h>
|
|
#include <stddef.h>
|
|
#include "juno_def.h"
|
|
#include "juno_private.h"
|
|
#include "mhu.h"
|
|
|
|
/*******************************************************************************
|
|
* Declarations of linker defined symbols which will help us find the layout
|
|
* of trusted RAM
|
|
******************************************************************************/
|
|
extern unsigned long __RO_START__;
|
|
extern unsigned long __RO_END__;
|
|
extern unsigned long __BL31_END__;
|
|
|
|
#if USE_COHERENT_MEM
|
|
extern unsigned long __COHERENT_RAM_START__;
|
|
extern unsigned long __COHERENT_RAM_END__;
|
|
#endif
|
|
|
|
/*
|
|
* The next 3 constants identify the extents of the code, RO data region and the
|
|
* limit of the BL3-1 image. These addresses are used by the MMU setup code and
|
|
* therefore they must be page-aligned. It is the responsibility of the linker
|
|
* script to ensure that __RO_START__, __RO_END__ & __BL31_END__ linker symbols
|
|
* refer to page-aligned addresses.
|
|
*/
|
|
#define BL31_RO_BASE (unsigned long)(&__RO_START__)
|
|
#define BL31_RO_LIMIT (unsigned long)(&__RO_END__)
|
|
#define BL31_END (unsigned long)(&__BL31_END__)
|
|
|
|
#if USE_COHERENT_MEM
|
|
/*
|
|
* The next 2 constants identify the extents of the coherent memory region.
|
|
* These addresses are used by the MMU setup code and therefore they must be
|
|
* page-aligned. It is the responsibility of the linker script to ensure that
|
|
* __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols
|
|
* refer to page-aligned addresses.
|
|
*/
|
|
#define BL31_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__)
|
|
#define BL31_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__)
|
|
#endif
|
|
|
|
/******************************************************************************
|
|
* Placeholder variables for copying the arguments that have been passed to
|
|
* BL3-1 from BL2.
|
|
******************************************************************************/
|
|
static entry_point_info_t bl32_ep_info;
|
|
static entry_point_info_t bl33_ep_info;
|
|
|
|
/*******************************************************************************
|
|
* Return a pointer to the 'entry_point_info' structure of the next image for
|
|
* the security state specified. BL3-3 corresponds to the non-secure image type
|
|
* while BL3-2 corresponds to the secure image type. A NULL pointer is returned
|
|
* if the image does not exist.
|
|
******************************************************************************/
|
|
entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
|
|
{
|
|
entry_point_info_t *next_image_info;
|
|
|
|
next_image_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info;
|
|
|
|
/* None of the images on this platform can have 0x0 as the entrypoint */
|
|
if (next_image_info->pc)
|
|
return next_image_info;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Perform any BL3-1 specific platform actions. Here is an opportunity to copy
|
|
* parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they
|
|
* are lost (potentially). This needs to be done before the MMU is initialized
|
|
* so that the memory layout can be used while creating page tables. Also, BL2
|
|
* has flushed this information to memory, so we are guaranteed to pick up good
|
|
* data
|
|
******************************************************************************/
|
|
void bl31_early_platform_setup(bl31_params_t *from_bl2,
|
|
void *plat_params_from_bl2)
|
|
{
|
|
/* Initialize the console to provide early debug support */
|
|
console_init(PL011_UART2_BASE, PL011_UART2_CLK_IN_HZ, PL011_BAUDRATE);
|
|
|
|
/*
|
|
* Initialise the CCI-400 driver for BL31 so that it is accessible after
|
|
* a warm boot. BL1 should have already enabled CCI coherency for this
|
|
* cluster during cold boot.
|
|
*/
|
|
cci_init(CCI400_BASE,
|
|
CCI400_SL_IFACE3_CLUSTER_IX,
|
|
CCI400_SL_IFACE4_CLUSTER_IX);
|
|
|
|
/*
|
|
* Check params passed from BL2 should not be NULL,
|
|
*/
|
|
assert(from_bl2 != NULL);
|
|
assert(from_bl2->h.type == PARAM_BL31);
|
|
assert(from_bl2->h.version >= VERSION_1);
|
|
/*
|
|
* In debug builds, we pass a special value in 'plat_params_from_bl2'
|
|
* to verify platform parameters from BL2 to BL3-1.
|
|
* In release builds, it's not used.
|
|
*/
|
|
assert(((unsigned long long)plat_params_from_bl2) ==
|
|
JUNO_BL31_PLAT_PARAM_VAL);
|
|
|
|
/*
|
|
* Copy BL3-2 and BL3-3 entry point information.
|
|
* They are stored in Secure RAM, in BL2's address space.
|
|
*/
|
|
bl32_ep_info = *from_bl2->bl32_ep_info;
|
|
bl33_ep_info = *from_bl2->bl33_ep_info;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Initialize the MHU and the GIC.
|
|
******************************************************************************/
|
|
void bl31_platform_setup(void)
|
|
{
|
|
unsigned int reg_val;
|
|
|
|
mhu_secure_init();
|
|
|
|
/* Initialize the gic cpu and distributor interfaces */
|
|
plat_gic_init();
|
|
arm_gic_setup();
|
|
|
|
/* Enable and initialize the System level generic timer */
|
|
mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN);
|
|
|
|
/* Allow access to the System counter timer module */
|
|
reg_val = (1 << CNTACR_RPCT_SHIFT) | (1 << CNTACR_RVCT_SHIFT);
|
|
reg_val |= (1 << CNTACR_RFRQ_SHIFT) | (1 << CNTACR_RVOFF_SHIFT);
|
|
reg_val |= (1 << CNTACR_RWVT_SHIFT) | (1 << CNTACR_RWPT_SHIFT);
|
|
mmio_write_32(SYS_TIMCTL_BASE + CNTACR_BASE(1), reg_val);
|
|
|
|
reg_val = (1 << CNTNSAR_NS_SHIFT(1));
|
|
mmio_write_32(SYS_TIMCTL_BASE + CNTNSAR, reg_val);
|
|
|
|
/* Topologies are best known to the platform. */
|
|
plat_setup_topology();
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Perform the very early platform specific architectural setup here. At the
|
|
* moment this is only intializes the mmu in a quick and dirty way.
|
|
******************************************************************************/
|
|
void bl31_plat_arch_setup()
|
|
{
|
|
configure_mmu_el3(BL31_RO_BASE,
|
|
(BL31_END - BL31_RO_BASE),
|
|
BL31_RO_BASE,
|
|
BL31_RO_LIMIT
|
|
#if USE_COHERENT_MEM
|
|
,
|
|
BL31_COHERENT_RAM_BASE,
|
|
BL31_COHERENT_RAM_LIMIT
|
|
#endif
|
|
);
|
|
}
|