18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/h8300/mm/init.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, 68c2ecf20Sopenharmony_ci * Kenneth Albanowski <kjahds@kjahds.com>, 78c2ecf20Sopenharmony_ci * Copyright (C) 2000 Lineo, Inc. (www.lineo.com) 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Based on: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * linux/arch/m68knommu/mm/init.c 128c2ecf20Sopenharmony_ci * linux/arch/m68k/mm/init.c 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * Copyright (C) 1995 Hamish Macdonald 158c2ecf20Sopenharmony_ci * 168c2ecf20Sopenharmony_ci * JAN/1999 -- hacked to support ColdFire (gerg@snapgear.com) 178c2ecf20Sopenharmony_ci * DEC/2000 -- linux 2.4 support <davidm@snapgear.com> 188c2ecf20Sopenharmony_ci */ 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/signal.h> 218c2ecf20Sopenharmony_ci#include <linux/sched.h> 228c2ecf20Sopenharmony_ci#include <linux/kernel.h> 238c2ecf20Sopenharmony_ci#include <linux/errno.h> 248c2ecf20Sopenharmony_ci#include <linux/string.h> 258c2ecf20Sopenharmony_ci#include <linux/types.h> 268c2ecf20Sopenharmony_ci#include <linux/ptrace.h> 278c2ecf20Sopenharmony_ci#include <linux/mman.h> 288c2ecf20Sopenharmony_ci#include <linux/mm.h> 298c2ecf20Sopenharmony_ci#include <linux/swap.h> 308c2ecf20Sopenharmony_ci#include <linux/init.h> 318c2ecf20Sopenharmony_ci#include <linux/highmem.h> 328c2ecf20Sopenharmony_ci#include <linux/pagemap.h> 338c2ecf20Sopenharmony_ci#include <linux/memblock.h> 348c2ecf20Sopenharmony_ci#include <linux/gfp.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include <asm/setup.h> 378c2ecf20Sopenharmony_ci#include <asm/segment.h> 388c2ecf20Sopenharmony_ci#include <asm/page.h> 398c2ecf20Sopenharmony_ci#include <asm/sections.h> 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* 428c2ecf20Sopenharmony_ci * ZERO_PAGE is a special page that is used for zero-initialized 438c2ecf20Sopenharmony_ci * data and COW. 448c2ecf20Sopenharmony_ci */ 458c2ecf20Sopenharmony_ciunsigned long empty_zero_page; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* 488c2ecf20Sopenharmony_ci * paging_init() continues the virtual memory environment setup which 498c2ecf20Sopenharmony_ci * was begun by the code in arch/head.S. 508c2ecf20Sopenharmony_ci * The parameters are pointers to where to stick the starting and ending 518c2ecf20Sopenharmony_ci * addresses of available kernel virtual memory. 528c2ecf20Sopenharmony_ci */ 538c2ecf20Sopenharmony_civoid __init paging_init(void) 548c2ecf20Sopenharmony_ci{ 558c2ecf20Sopenharmony_ci /* 568c2ecf20Sopenharmony_ci * Make sure start_mem is page aligned, otherwise bootmem and 578c2ecf20Sopenharmony_ci * page_alloc get different views og the world. 588c2ecf20Sopenharmony_ci */ 598c2ecf20Sopenharmony_ci unsigned long start_mem = PAGE_ALIGN(memory_start); 608c2ecf20Sopenharmony_ci unsigned long end_mem = memory_end & PAGE_MASK; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci pr_debug("start_mem is %#lx\nvirtual_end is %#lx\n", 638c2ecf20Sopenharmony_ci start_mem, end_mem); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci /* 668c2ecf20Sopenharmony_ci * Initialize the bad page table and bad page to point 678c2ecf20Sopenharmony_ci * to a couple of allocated pages. 688c2ecf20Sopenharmony_ci */ 698c2ecf20Sopenharmony_ci empty_zero_page = (unsigned long)memblock_alloc(PAGE_SIZE, PAGE_SIZE); 708c2ecf20Sopenharmony_ci if (!empty_zero_page) 718c2ecf20Sopenharmony_ci panic("%s: Failed to allocate %lu bytes align=0x%lx\n", 728c2ecf20Sopenharmony_ci __func__, PAGE_SIZE, PAGE_SIZE); 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci /* 758c2ecf20Sopenharmony_ci * Set up SFC/DFC registers (user data space). 768c2ecf20Sopenharmony_ci */ 778c2ecf20Sopenharmony_ci set_fs(USER_DS); 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci pr_debug("before free_area_init\n"); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci pr_debug("free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n", 828c2ecf20Sopenharmony_ci start_mem, end_mem); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci { 858c2ecf20Sopenharmony_ci unsigned long max_zone_pfn[MAX_NR_ZONES] = {0, }; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci max_zone_pfn[ZONE_NORMAL] = end_mem >> PAGE_SHIFT; 888c2ecf20Sopenharmony_ci free_area_init(max_zone_pfn); 898c2ecf20Sopenharmony_ci } 908c2ecf20Sopenharmony_ci} 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_civoid __init mem_init(void) 938c2ecf20Sopenharmony_ci{ 948c2ecf20Sopenharmony_ci pr_devel("Mem_init: start=%lx, end=%lx\n", memory_start, memory_end); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci high_memory = (void *) (memory_end & PAGE_MASK); 978c2ecf20Sopenharmony_ci max_mapnr = MAP_NR(high_memory); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci /* this will put all low memory onto the freelists */ 1008c2ecf20Sopenharmony_ci memblock_free_all(); 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci mem_init_print_info(NULL); 1038c2ecf20Sopenharmony_ci} 104