2019-05-23 11:14:57 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2017-07-10 18:00:26 -07:00
/*
* Copyright ( C ) 2009 Sunplus Core Technology Co . , Ltd .
* Chen Liqin < liqin . chen @ sunplusct . com >
* Lennox Wu < lennox . wu @ sunplusct . com >
* Copyright ( C ) 2012 Regents of the University of California
*/
# include <linux/init.h>
# include <linux/mm.h>
# include <linux/memblock.h>
# include <linux/sched.h>
# include <linux/console.h>
# include <linux/screen_info.h>
# include <linux/of_fdt.h>
# include <linux/of_platform.h>
# include <linux/sched/task.h>
2018-04-27 08:43:14 +02:00
# include <linux/swiotlb.h>
2020-03-17 18:11:44 -07:00
# include <linux/smp.h>
2017-07-10 18:00:26 -07:00
2019-10-28 13:10:38 +01:00
# include <asm/clint.h>
2020-03-17 18:11:44 -07:00
# include <asm/cpu_ops.h>
2017-07-10 18:00:26 -07:00
# include <asm/setup.h>
# include <asm/sections.h>
2020-03-17 18:11:35 -07:00
# include <asm/sbi.h>
2017-07-10 18:00:26 -07:00
# include <asm/tlbflush.h>
# include <asm/thread_info.h>
2020-01-06 10:38:32 -08:00
# include <asm/kasan.h>
2017-07-10 18:00:26 -07:00
2019-10-17 15:00:17 -07:00
# include "head.h"
2017-07-10 18:00:26 -07:00
# ifdef CONFIG_DUMMY_CONSOLE
struct screen_info screen_info = {
. orig_video_lines = 30 ,
. orig_video_cols = 80 ,
. orig_video_mode = 0 ,
. orig_video_ega_bx = 0 ,
. orig_video_isVGA = 1 ,
. orig_video_points = 8
} ;
# endif
2020-02-04 19:19:47 +08:00
/*
* The lucky hart to first increment this variable will boot the other cores .
* This is used before the kernel initializes the BSS so it can ' t be in the
* BSS .
*/
atomic_t hart_lottery __section ( . sdata ) ;
2018-10-02 12:15:05 -07:00
unsigned long boot_cpu_hartid ;
2020-03-17 18:11:44 -07:00
static DEFINE_PER_CPU ( struct cpu , cpu_devices ) ;
2017-07-10 18:00:26 -07:00
2019-06-28 13:36:21 -07:00
void __init parse_dtb ( void )
2017-07-10 18:00:26 -07:00
{
2019-06-28 13:36:21 -07:00
if ( early_init_dt_scan ( dtb_early_va ) )
2018-12-17 19:15:12 -08:00
return ;
pr_err ( " No DTB passed to the kernel \n " ) ;
# ifdef CONFIG_CMDLINE_FORCE
strlcpy ( boot_command_line , CONFIG_CMDLINE , COMMAND_LINE_SIZE ) ;
pr_info ( " Forcing kernel command line to: %s \n " , boot_command_line ) ;
# endif
2017-07-10 18:00:26 -07:00
}
void __init setup_arch ( char * * cmdline_p )
{
init_mm . start_code = ( unsigned long ) _stext ;
init_mm . end_code = ( unsigned long ) _etext ;
init_mm . end_data = ( unsigned long ) _edata ;
init_mm . brk = ( unsigned long ) _end ;
2019-01-07 19:19:14 +05:30
* cmdline_p = boot_command_line ;
parse_early_param ( ) ;
2017-07-10 18:00:26 -07:00
setup_bootmem ( ) ;
paging_init ( ) ;
2020-04-14 13:43:24 +09:00
# if IS_ENABLED(CONFIG_BUILTIN_DTB)
unflatten_and_copy_device_tree ( ) ;
# else
2017-07-10 18:00:26 -07:00
unflatten_device_tree ( ) ;
2020-04-14 13:43:24 +09:00
# endif
2019-10-28 13:10:38 +01:00
clint_init_boot_cpu ( ) ;
2018-10-02 16:52:28 +08:00
# ifdef CONFIG_SWIOTLB
2018-04-27 08:43:14 +02:00
swiotlb_init ( 1 ) ;
2018-10-02 16:52:28 +08:00
# endif
2017-07-10 18:00:26 -07:00
2020-01-06 10:38:32 -08:00
# ifdef CONFIG_KASAN
kasan_init ( ) ;
# endif
2020-03-17 18:11:35 -07:00
# if IS_ENABLED(CONFIG_RISCV_SBI)
sbi_init ( ) ;
# endif
2017-07-10 18:00:26 -07:00
# ifdef CONFIG_SMP
setup_smp ( ) ;
# endif
riscv_fill_hwcap ( ) ;
}
2020-03-17 18:11:44 -07:00
static int __init topology_init ( void )
{
int i ;
for_each_possible_cpu ( i ) {
struct cpu * cpu = & per_cpu ( cpu_devices , i ) ;
cpu - > hotpluggable = cpu_has_hotplug ( i ) ;
register_cpu ( cpu , i ) ;
}
return 0 ;
}
subsys_initcall ( topology_init ) ;