Home | History | Annotate | Line # | Download | only in amiga
      1 /*	$NetBSD: pmap_bootstrap.c,v 1.11 2023/12/20 00:40:42 thorpej Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1999 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Jason R. Thorpe.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*
     33  * Copyright (c) 1991 Regents of the University of California.
     34  * All rights reserved.
     35  *
     36  * This code is derived from software contributed to Berkeley by
     37  * the Systems Programming Group of the University of Utah Computer
     38  * Science Department.
     39  *
     40  * Redistribution and use in source and binary forms, with or without
     41  * modification, are permitted provided that the following conditions
     42  * are met:
     43  * 1. Redistributions of source code must retain the above copyright
     44  *    notice, this list of conditions and the following disclaimer.
     45  * 2. Redistributions in binary form must reproduce the above copyright
     46  *    notice, this list of conditions and the following disclaimer in the
     47  *    documentation and/or other materials provided with the distribution.
     48  * 3. Neither the name of the University nor the names of its contributors
     49  *    may be used to endorse or promote products derived from this software
     50  *    without specific prior written permission.
     51  *
     52  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     53  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     54  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     55  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     56  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     57  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     58  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     59  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     60  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     61  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     62  * SUCH DAMAGE.
     63  *
     64  *	@(#)pmap.c	7.5 (Berkeley) 5/10/91
     65  */
     66 
     67 #include <sys/cdefs.h>
     68 __KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.11 2023/12/20 00:40:42 thorpej Exp $");
     69 
     70 #include <sys/param.h>
     71 #include <sys/systm.h>
     72 #include <sys/proc.h>
     73 
     74 #include <uvm/uvm.h>
     75 
     76 #include <machine/pte.h>
     77 #include <machine/cpu.h>
     78 #include <machine/vmparam.h>
     79 
     80 #include <m68k/cacheops.h>
     81 
     82 #include <amiga/amiga/memlist.h>
     83 
     84 extern paddr_t		avail_start;
     85 extern paddr_t		avail_end;
     86 
     87 extern paddr_t	msgbufpa;
     88 
     89 u_long	noncontig_enable;
     90 
     91 extern paddr_t z2mem_start;
     92 
     93 extern vaddr_t reserve_dumppages(vaddr_t);
     94 
     95 /*
     96  * All those kernel PT submaps that BSD is so fond of
     97  */
     98 void	*CADDR1, *CADDR2;
     99 char	*vmmap;
    100 
    101 /*
    102  *	Bootstrap the system enough to run with virtual memory.
    103  *
    104  *	This is called after mapping has already been enabled
    105  *	and just syncs the pmap module with what has already been done.
    106  */
    107 void
    108 pmap_bootstrap(paddr_t firstaddr, paddr_t loadaddr)
    109 {
    110 	vaddr_t va;
    111 	int i;
    112 	struct boot_memseg *sp, *esp;
    113 	paddr_t fromads, toads;
    114 
    115 	fromads = firstaddr;
    116 	toads = maxmem << PGSHIFT;
    117 
    118 	/* XXX: allow for msgbuf */
    119 	toads -= m68k_round_page(MSGBUFSIZE);
    120 	msgbufpa = toads;
    121 	/*
    122 	 * first segment of memory is always the one loadbsd found
    123 	 * for loading the kernel into.
    124 	 */
    125 
    126 	uvmexp.pagesize = NBPG;
    127 	uvm_md_init();
    128 
    129 	/*
    130 	 * May want to check if first segment is Zorro-II?
    131 	 */
    132 	uvm_page_physload(atop(fromads), atop(toads),
    133 	    atop(fromads), atop(toads), VM_FREELIST_DEFAULT);
    134 
    135 	sp = memlist->m_seg;
    136 	esp = sp + memlist->m_nseg;
    137 	i = 1;
    138 	for (; noncontig_enable && sp < esp; sp++) {
    139 		if ((sp->ms_attrib & MEMF_FAST) == 0)
    140 			continue;		/* skip if not FastMem */
    141 		if (firstaddr >= sp->ms_start &&
    142 		    firstaddr < sp->ms_start + sp->ms_size)
    143 			continue;		/* skip kernel segment */
    144 		if (sp->ms_size == 0)
    145 			continue;		/* skip zero size segments */
    146 		fromads = sp->ms_start;
    147 		toads = sp->ms_start + sp->ms_size;
    148 #ifdef DEBUG_A4000
    149 		/*
    150 		 * My A4000 doesn't seem to like Zorro II memory - this
    151 		 * hack is to skip the motherboard memory and use the
    152 		 * Zorro II memory.  Only for trying to debug the problem.
    153 		 * Michael L. Hitch
    154 		 */
    155 		if (toads == 0x08000000)
    156 			continue;	/* skip A4000 motherboard mem */
    157 #endif
    158 		/*
    159 		 * Deal with Zorro II memory stolen for DMA bounce buffers.
    160 		 * This needs to be handled better.
    161 		 *
    162 		 * XXX is: disabled. This is handled now in amiga_init.c
    163 		 * by removing the stolen memory from the memlist.
    164 		 *
    165 		 * XXX is: enabled again, but check real size and position.
    166 		 * We check z2mem_start is in this segment, and set its end
    167 		 * to the z2mem_start.
    168 		 *
    169 		 */
    170 		if ((fromads <= z2mem_start) && (toads > z2mem_start))
    171 			toads = z2mem_start;
    172 
    173 		uvm_page_physload(atop(fromads), atop(toads),
    174 		    atop(fromads), atop(toads), (fromads & 0xff000000) ?
    175 		    VM_FREELIST_DEFAULT : VM_FREELIST_ZORROII);
    176 		physmem += (toads - fromads) / PAGE_SIZE;
    177 		++i;
    178 		if (noncontig_enable == 1)
    179 			break;		/* Only two segments enabled */
    180 	}
    181 
    182 	mem_size = physmem << PGSHIFT;
    183 
    184 	avail_start = firstaddr;
    185 	avail_end   = toads;
    186 
    187 	virtual_end = VM_MAX_KERNEL_ADDRESS;
    188 
    189 	/*
    190 	 * Allocate all the submaps we need
    191 	 */
    192 #define	SYSMAP(c, v, n)	\
    193 	v = (c)va; va += ((n)*PAGE_SIZE);
    194 
    195 	va = virtual_avail;
    196 
    197 	SYSMAP(void *	,CADDR1	 ,1			)
    198 	SYSMAP(void *	,CADDR2	 ,1			)
    199 	SYSMAP(void *	,vmmap	 ,1			)
    200 	SYSMAP(void *	,msgbufaddr ,btoc(MSGBUFSIZE)	)
    201 
    202 	DCIS();
    203 
    204 	virtual_avail = reserve_dumppages(va);
    205 }
    206