1 Star 0 Fork 10

马青宇/plat-raspi

forked from YingyiTech/plat-raspi
关闭
 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
setup.c 5.61 KB
一键复制 编辑 原始数据 按行查看 历史
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Authors: Santiago Pagani <santiagopagani@gmail.com>
*
* Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. Neither the name of the copyright holder 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.
*
* THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
*/
#include <uk/plat/common/bootinfo.h>
#include <arm/cpu.h>
#if CONFIG_RASPI_LCD
#include <raspi/lfb.h>
#endif
#if CONFIG_RASPI_TOUCHSCREEN
#include <raspi/touchscreen.h>
#endif
#include <raspi/console.h>
#include <raspi/time.h>
#include <raspi/irq.h>
smccc_conduit_fn_t smccc_psci_call;
static uint64_t assembly_entry;
static uint64_t hardware_init_done;
uint64_t _libraspiplat_get_reset_time(void)
{
return assembly_entry;
}
uint64_t _libraspiplat_get_hardware_init_time(void)
{
return hardware_init_done;
}
static char *cmdline;
static __sz cmdline_len;
static inline int cmdline_init(struct ukplat_bootinfo *bi)
{
char *cmdl;
if (bi->cmdline_len) {
cmdl = (char *)bi->cmdline;
cmdline_len = bi->cmdline_len;
} else {
cmdl = CONFIG_UK_NAME;
cmdline_len = sizeof(CONFIG_UK_NAME) - 1;
}
/* TODO: Only extract what we need before passing to application. */
/* This is not the original command-line, but one that will be thrashed
* by `ukplat_entry_argp` to obtain argc/argv. So mark it as a kernel
* resource instead.
*/
cmdline = ukplat_memregion_alloc(cmdline_len + 1, UKPLAT_MEMRT_KERNEL,
UKPLAT_MEMRF_READ |
UKPLAT_MEMRF_WRITE |
UKPLAT_MEMRF_MAP);
if (unlikely(!cmdline))
return -ENOMEM;
memcpy(cmdline, cmdl, cmdline_len);
cmdline[cmdline_len] = 0;
return 0;
}
static void __noreturn _ukplat_entry2(void)
{
ukplat_entry_argp(NULL, cmdline, cmdline_len);
ukplat_lcpu_halt();
}
/* Ported from plat/common/arm/lcpu.c to avoid dependency on unsupported
* librarys.
* TODO: Remove this when use unified interrupt controller and timer.
*/
void __noreturn lcpu_arch_jump_to(void *sp, ukplat_lcpu_entry_t entry)
{
__asm__ __volatile__ (
"mov sp, %0\n" /* set the sp */
"br %1\n" /* branch to the entry function */
:
: "r"(sp), "r"(entry)
: /* sp not needed */);
/* just make the compiler happy about returning function */
__builtin_unreachable();
}
void _libraspiplat_entry(uint64_t low0, uint64_t hi0, uint64_t low1,
uint64_t hi1, void *fdtp)
{
int rc;
void *bstack;
struct ukplat_bootinfo *bi;
if (hi0 == hi1) {
assembly_entry = ((hi0 << 32)&0xFFFFFFFF00000000) | (low0&0xFFFFFFFF);
} else {
assembly_entry = ((hi1 << 32)&0xFFFFFFFF00000000) | (low1&0xFFFFFFFF);
}
/* TODO: Initial console with dtb */
_libraspiplat_init_console();
ukplat_bootinfo_fdt_setup(fdtp);
bi = ukplat_bootinfo_get();
if (unlikely(!bi))
UK_CRASH("Invalid bootinfo");
uk_pr_debug("Device tree location @%p\n", bi);
rc = cmdline_init(bi);
if (unlikely(rc < 0))
UK_CRASH("Failed to initialize command-line\n");
/* Allocate boot stack */
bstack = ukplat_memregion_alloc(__STACK_SIZE, UKPLAT_MEMRT_STACK,
UKPLAT_MEMRF_READ |
UKPLAT_MEMRF_WRITE |
UKPLAT_MEMRF_MAP);
if (unlikely(!bstack))
UK_CRASH("Boot stack alloc failed\n");
bstack = (void *)((__uptr)bstack + __STACK_SIZE);
/* Initialize paging */
rc = ukplat_mem_init();
if (unlikely(rc))
UK_CRASH("Could not initialize paging (%d)\n", rc);
#if defined(CONFIG_ENFORCE_W_XOR_X) && defined(CONFIG_PAGING)
enforce_w_xor_x();
#endif /* CONFIG_ENFORCE_W_XOR_X && CONFIG_PAGING */
#if CONFIG_RASPI_LCD
lfb_init();
#endif
#if CONFIG_RASPI_TOUCHSCREEN
touchscreen_init();
#endif
hardware_init_done = get_system_timer();
/* TODO: Use unified interrupt controller instead of raspi specific one
*/
ukplat_irq_init();
/* TODO: Initialize interrupt controller */
/* Initialize logical boot CPU */
rc = lcpu_init(lcpu_get_bsp());
if (unlikely(rc))
UK_CRASH("Failed to initialize bootstrapping CPU: %d\n", rc);
/*
* Switch away from the bootstrap stack as early as possible.
*/
uk_pr_info("Switch from bootstrap stack to stack @%p\n", bstack);
/* Print boot information */
uk_pr_info("Print bootinfo before jump to entry:\n");
ukplat_bootinfo_print();
/*
* Enter Unikraft with new allocated stack.
*/
lcpu_arch_jump_to(bstack, _ukplat_entry2);
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/zlaazlaa/plat-raspi.git
git@gitee.com:zlaazlaa/plat-raspi.git
zlaazlaa
plat-raspi
plat-raspi
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385