2018-09-05 14:25:07 +08:00
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
# include <linux/console.h>
# include <linux/memblock.h>
# include <linux/initrd.h>
# include <linux/of.h>
# include <linux/of_fdt.h>
# include <linux/start_kernel.h>
2020-09-11 10:56:52 +02:00
# include <linux/dma-map-ops.h>
2018-09-05 14:25:07 +08:00
# include <linux/screen_info.h>
# include <asm/sections.h>
# include <asm/mmu_context.h>
# include <asm/pgalloc.h>
# 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
static void __init csky_memblock_init ( void )
{
2020-06-03 15:57:28 -07:00
unsigned long lowmem_size = PFN_DOWN ( LOWMEM_LIMIT - PHYS_OFFSET_OFFSET ) ;
unsigned long sseg_size = PFN_DOWN ( SSEG_SIZE - PHYS_OFFSET_OFFSET ) ;
unsigned long max_zone_pfn [ MAX_NR_ZONES ] = { 0 } ;
2018-09-05 14:25:07 +08:00
signed long size ;
memblock_reserve ( __pa ( _stext ) , _end - _stext ) ;
early_init_fdt_reserve_self ( ) ;
early_init_fdt_scan_reserved_mem ( ) ;
memblock_dump_all ( ) ;
min_low_pfn = PFN_UP ( memblock_start_of_DRAM ( ) ) ;
2020-03-28 19:14:37 +08:00
max_low_pfn = max_pfn = PFN_DOWN ( memblock_end_of_DRAM ( ) ) ;
2018-09-05 14:25:07 +08:00
size = max_pfn - min_low_pfn ;
2020-06-03 15:57:28 -07:00
if ( size > = lowmem_size ) {
max_low_pfn = min_low_pfn + lowmem_size ;
2020-09-07 06:20:18 +00:00
# ifdef CONFIG_PAGE_OFFSET_80000000
2020-03-28 19:14:37 +08:00
write_mmu_msa1 ( read_mmu_msa0 ( ) + SSEG_SIZE ) ;
2020-09-07 06:20:18 +00:00
# endif
2020-06-03 15:57:28 -07:00
} else if ( size > sseg_size ) {
max_low_pfn = min_low_pfn + sseg_size ;
2018-09-05 14:25:07 +08:00
}
2020-06-03 15:57:28 -07:00
max_zone_pfn [ ZONE_NORMAL ] = max_low_pfn ;
2020-09-07 06:20:18 +00:00
mmu_init ( min_low_pfn , max_low_pfn ) ;
2018-09-05 14:25:07 +08:00
# ifdef CONFIG_HIGHMEM
2020-06-03 15:57:28 -07:00
max_zone_pfn [ ZONE_HIGHMEM ] = max_pfn ;
2018-09-05 14:25:07 +08:00
2020-03-28 19:14:37 +08:00
highstart_pfn = max_low_pfn ;
highend_pfn = max_pfn ;
2018-09-05 14:25:07 +08:00
# endif
memblock_set_current_limit ( PFN_PHYS ( max_low_pfn ) ) ;
dma_contiguous_reserve ( 0 ) ;
2020-06-03 15:57:28 -07:00
free_area_init ( max_zone_pfn ) ;
2018-09-05 14:25:07 +08:00
}
void __init setup_arch ( char * * cmdline_p )
{
* cmdline_p = boot_command_line ;
console_verbose ( ) ;
pr_info ( " Phys. mem: %ldMB \n " ,
( unsigned long ) memblock_phys_mem_size ( ) / 1024 / 1024 ) ;
2021-07-07 18:08:34 -07:00
setup_initial_init_mm ( _stext , _etext , _edata , _end ) ;
2018-09-05 14:25:07 +08:00
parse_early_param ( ) ;
csky_memblock_init ( ) ;
unflatten_and_copy_device_tree ( ) ;
# ifdef CONFIG_SMP
setup_smp ( ) ;
# endif
sparse_init ( ) ;
2019-12-01 22:34:19 +08:00
fixaddr_init ( ) ;
2018-09-05 14:25:07 +08:00
# ifdef CONFIG_HIGHMEM
kmap_init ( ) ;
# endif
}
2019-04-19 17:10:52 +08:00
unsigned long va_pa_offset ;
EXPORT_SYMBOL ( va_pa_offset ) ;
2019-04-08 11:12:25 +08:00
2020-09-07 06:20:18 +00:00
static inline unsigned long read_mmu_msa ( void )
{
# ifdef CONFIG_PAGE_OFFSET_80000000
return read_mmu_msa0 ( ) ;
# endif
# ifdef CONFIG_PAGE_OFFSET_A0000000
return read_mmu_msa1 ( ) ;
# endif
}
2019-04-12 19:08:34 +08:00
asmlinkage __visible void __init csky_start ( unsigned int unused ,
void * dtb_start )
2018-09-05 14:25:07 +08:00
{
/* Clean up bss section */
memset ( __bss_start , 0 , __bss_stop - __bss_start ) ;
2020-09-07 06:20:18 +00:00
va_pa_offset = read_mmu_msa ( ) & ~ ( SSEG_SIZE - 1 ) ;
2019-04-08 11:12:25 +08:00
2018-09-05 14:25:07 +08:00
pre_trap_init ( ) ;
2019-04-12 19:08:34 +08:00
if ( dtb_start = = NULL )
2018-09-05 14:25:07 +08:00
early_init_dt_scan ( __dtb_start ) ;
else
2019-04-12 19:08:34 +08:00
early_init_dt_scan ( dtb_start ) ;
2018-09-05 14:25:07 +08:00
start_kernel ( ) ;
asm volatile ( " br . \n " ) ;
}