plat/rpi3/rpi3_bl31_setup.c
/*******************************************************************************
 * Perform any BL31 early platform setup. 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. BL2 has flushed this information to memory, so we are guaranteed
 * to pick up good data.
 ******************************************************************************/
Perform any BL31 early platform setup. 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. BL2 has flushed this information to memory, so we are guaranteed
to pick up good data.
Perform any BL31 early platform setup . 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 . BL2 has flushed this information to memory so we are guaranteed to pick up good data .
void bl31_early_platform_setup(void *from_bl2,
			       void *plat_params_from_bl2)
{
	rpi3_console_init();
	assert(((uintptr_t)plat_params_from_bl2) == RPI3_BL31_PLAT_PARAM_VAL);
	bl_params_t *params_from_bl2 = (bl_params_t *)from_bl2;
	assert(params_from_bl2 != NULL);
	assert(params_from_bl2->h.type == PARAM_BL_PARAMS);
	assert(params_from_bl2->h.version >= VERSION_2);
	bl_params_node_t *bl_params = params_from_bl2->head;
	while (bl_params) {
		if (bl_params->image_id == BL32_IMAGE_ID) {
			bl32_image_ep_info = *bl_params->ep_info;
		}
		if (bl_params->image_id == BL33_IMAGE_ID) {
			bl33_image_ep_info = *bl_params->ep_info;
		}
		bl_params = bl_params->next_params_info;
	}
	if (bl33_image_ep_info.pc == 0) {
		panic();
	}
#if RPI3_DIRECT_LINUX_BOOT
# if RPI3_BL33_IN_AARCH32
	VERBOSE("rpi3: Preparing to boot 32-bit Linux kernel\n");
	bl33_image_ep_info.args.arg0 = 0U;
	bl33_image_ep_info.args.arg1 = ~0U;
	bl33_image_ep_info.args.arg2 = (u_register_t) RPI3_PRELOADED_DTB_BASE;
# else
	VERBOSE("rpi3: Preparing to boot 64-bit Linux kernel\n");
	bl33_image_ep_info.args.arg0 = (u_register_t) RPI3_PRELOADED_DTB_BASE;
	bl33_image_ep_info.args.arg1 = 0ULL;
	bl33_image_ep_info.args.arg2 = 0ULL;
	bl33_image_ep_info.args.arg3 = 0ULL;
# endif 
#endif 
}
void bl31_early_platform_setup ( void * from_bl2 , void * plat_params_from_bl2 ) { rpi3_console_init ( ) ; assert ( ( ( uintptr_t ) plat_params_from_bl2 ) == RPI3_BL31_PLAT_PARAM_VAL ) ; bl_params_t * params_from_bl2 = ( bl_params_t * ) from_bl2 ; assert ( params_from_bl2 != NULL ) ; assert ( params_from_bl2 -> h . type == PARAM_BL_PARAMS ) ; assert ( params_from_bl2 -> h . version >= VERSION_2 ) ; bl_params_node_t * bl_params = params_from_bl2 -> head ; while ( bl_params ) { if ( bl_params -> image_id == BL32_IMAGE_ID ) { bl32_image_ep_info = * bl_params -> ep_info ; } if ( bl_params -> image_id == BL33_IMAGE_ID ) { bl33_image_ep_info = * bl_params -> ep_info ; } bl_params = bl_params -> next_params_info ; } if ( bl33_image_ep_info . pc == 0 ) { panic ( ) ; } #if RPI3_DIRECT_LINUX_BOOT # if RPI3_BL33_IN_AARCH32 VERBOSE ( " \n " ) ; bl33_image_ep_info . args . arg0 = 0U ; bl33_image_ep_info . args . arg1 = ~ 0U ; bl33_image_ep_info . args . arg2 = ( u_register_t ) RPI3_PRELOADED_DTB_BASE ; # else VERBOSE ( " \n " ) ; bl33_image_ep_info . args . arg0 = ( u_register_t ) RPI3_PRELOADED_DTB_BASE ; bl33_image_ep_info . args . arg1 = 0ULL ; bl33_image_ep_info . args . arg2 = 0ULL ; bl33_image_ep_info . args . arg3 = 0ULL ; # endif #endif }
Perform any BL31 early platform setup.
Perform any BL31 early platform setup .
/* Initialize the console to provide early debug support */ /*
	 * In debug builds, we pass a special value in 'plat_params_from_bl2'
	 * to verify platform parameters from BL2 to BL31.
	 * In release builds, it's not used.
	 */ /*
	 * Check params passed from BL2 should not be NULL,
	 */ /*
	 * Copy BL33 and BL32 (if present), entry point information.
	 * They are stored in Secure RAM, in BL2's address space.
	 */ /*
	 * According to the file ``Documentation/arm/Booting`` of the Linux
	 * kernel tree, Linux expects:
	 * r0 = 0
	 * r1 = machine type number, optional in DT-only platforms (~0 if so)
	 * r2 = Physical address of the device tree blob
	 */ /*
	 * According to the file ``Documentation/arm64/booting.txt`` of the
	 * Linux kernel tree, Linux expects the physical address of the device
	 * tree blob (DTB) in x0, while x1-x3 are reserved for future use and
	 * must be 0.
	 */ /* RPI3_BL33_IN_AARCH32 */ /* RPI3_DIRECT_LINUX_BOOT */