| /**************************************************************************** |
| * arch/arm/src/goldfish/goldfish_boot.c |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. The |
| * ASF licenses this file to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance with the |
| * License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations |
| * under the License. |
| * |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * Included Files |
| ****************************************************************************/ |
| |
| #include <nuttx/config.h> |
| |
| #include "arm_internal.h" |
| #include "arm_cpu_psci.h" |
| |
| #include "goldfish_irq.h" |
| #include "goldfish_memorymap.h" |
| #include "smp.h" |
| #include "gic.h" |
| #include "scu.h" |
| |
| #ifdef CONFIG_DEVICE_TREE |
| # include <nuttx/fdt.h> |
| #endif |
| |
| #ifdef CONFIG_SCHED_INSTRUMENTATION |
| # include <sched/sched.h> |
| # include <nuttx/sched_note.h> |
| #endif |
| |
| #include <nuttx/syslog/syslog_rpmsg.h> |
| |
| /**************************************************************************** |
| * Private Data |
| ****************************************************************************/ |
| |
| #ifdef CONFIG_SYSLOG_RPMSG |
| static char g_syslog_rpmsg_buf[4096]; |
| #endif |
| |
| /**************************************************************************** |
| * Public Functions |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * Name: arm_boot |
| * |
| * Description: |
| * Complete boot operations started in arm_head.S |
| * |
| ****************************************************************************/ |
| |
| void arm_boot(void) |
| { |
| #ifdef CONFIG_ARCH_PERF_EVENTS |
| /* Perf init */ |
| |
| up_perf_init(0); |
| #endif |
| |
| /* Set the page table for section */ |
| |
| goldfish_setupmappings(); |
| |
| #ifdef CONFIG_SMP |
| /* Enable SMP cache coherency for CPU0 */ |
| |
| arm_enable_smp(0); |
| #endif |
| |
| arm_fpuconfig(); |
| |
| #ifdef CONFIG_ARM_PSCI |
| arm_psci_init("smc"); |
| #endif |
| |
| #ifdef CONFIG_DEVICE_TREE |
| fdt_register((const char *)0x40000000); |
| #endif |
| |
| #ifdef USE_EARLYSERIALINIT |
| /* Perform early serial initialization if we are going to use the serial |
| * driver. |
| */ |
| |
| arm_earlyserialinit(); |
| #endif |
| |
| #ifdef CONFIG_SYSLOG_RPMSG |
| syslog_rpmsg_init_early(g_syslog_rpmsg_buf, sizeof(g_syslog_rpmsg_buf)); |
| #endif |
| } |
| |
| #if defined(CONFIG_ARM_PSCI) && defined(CONFIG_SMP) |
| int up_cpu_start(int cpu) |
| { |
| #ifdef CONFIG_SCHED_INSTRUMENTATION |
| /* Notify of the start event */ |
| |
| sched_note_cpu_start(this_task(), cpu); |
| #endif |
| |
| #ifdef CONFIG_ARCH_ADDRENV |
| /* Copy cpu0 page table to target cpu. */ |
| |
| memcpy((uint32_t *)(PGTABLE_BASE_VADDR + PGTABLE_SIZE * cpu), |
| (uint32_t *)PGTABLE_BASE_VADDR, PGTABLE_SIZE); |
| UP_DSB(); |
| #endif |
| |
| return psci_cpu_on(cpu, (uintptr_t)__start); |
| } |
| #endif |