Files
Tianling Shen 8f5285bfba atf-20240117-bacca82a8: import new atf (#119)
* atf-20240117-bacca82a8: import new atf

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* atf-20240117-bacca82a8: remove Werror

* atf-20240117-bacca82a8: call bromimage-x86_64 for aarch64 host

* atf-20240117-bacca82a8: export ram boot uart option

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* atf-20240117-bacca82a8: apply openwrt patches

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* atf-20240117-bacca82a8: port board configs

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* build.sh: switch to use atf-20240117-bacca82a8

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* build.sh: support new menuconfig

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* build.sh: pass u-boot path by variable

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

* atf-20231013-0ea67d76a: drop

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>

---------

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
Co-authored-by: hanwckf <hanwckf@vip.qq.com>
2025-08-19 16:26:53 +08:00

97 lines
2.1 KiB
C

// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (C) 2021 MediaTek Inc. All rights reserved.
*
* Author: Weijie Gao <weijie.gao@mediatek.com>
*/
#include <common/bl_common.h>
#include <bl2pl/bl2pl.h>
#include <platform_def.h>
#include <string.h>
#include <tf_unxz.h>
#if defined(XZ_SIMPLE_PRINT_ERROR)
#define BL2PL_ERR xz_simple_puts
#else
#define BL2PL_ERR ERROR
#endif
extern uintptr_t __COPY_SIZE__;
static uint8_t xz_pool[0x6f50 + 0x4d8 + 0x50 + 1024];
#pragma weak bl2pl_platform_setup
void bl2pl_platform_setup(void)
{
}
int bl2pl_main(uintptr_t base_addr)
{
uintptr_t payload_addr, payload_new_addr, load_addr, outbuf;
uint32_t payload_size, bl2pl_size;
struct bl2pl_hdr *payload_hdr;
void (*pfunc)(void);
int ret;
bl2pl_platform_setup();
#if !defined(XZ_SIMPLE_PRINT_ERROR)
NOTICE("BL2PL: %s\n", version_string);
NOTICE("BL2PL: %s\n", build_message);
NOTICE("\n");
#endif
/* Locate the payload */
bl2pl_size = (uintptr_t)&__COPY_SIZE__;
payload_addr = base_addr + bl2pl_size;
/* Validate payload */
payload_hdr = (void *)payload_addr;
if (payload_hdr->magic != BL2PL_HDR_MAGIC) {
BL2PL_ERR("Invalid BL2 payload header\n");
goto fail;
}
if (payload_hdr->load_addr < L2_SRAM_BASE ||
payload_hdr->load_addr >= L2_SRAM_BASE + L2_SRAM_SIZE) {
BL2PL_ERR("Invalid BL2 payload load address\n");
goto fail;
}
if (payload_hdr->size > L2_SRAM_SIZE / 2) {
BL2PL_ERR("BL2 payload is too large\n");
goto fail;
}
/* Calculate new compressed payload address */
payload_new_addr = L2_SRAM_BASE + L2_SRAM_SIZE - payload_hdr->size;
payload_new_addr &= ~(0x10 - 1);
/* Move payload to end of SRAM */
memmove((void *)payload_new_addr,
(void *)payload_addr + sizeof(struct bl2pl_hdr),
payload_hdr->size);
/* Save payload information */
payload_size = payload_hdr->size;
load_addr = payload_hdr->load_addr;
/* Decompress payload */
outbuf = load_addr;
ret = unxz(&payload_new_addr, payload_size, &outbuf,
L2_SRAM_SIZE - payload_size, (uintptr_t)&xz_pool,
sizeof(xz_pool));
if (!ret) {
/* Jump to payload directly */
pfunc = (void (*)(void))load_addr;
(*pfunc)();
}
fail:
while (1);
}