Home | History | Annotate | Line # | Download | only in walnut
machdep.c revision 1.1
      1  1.1  scw /*	$NetBSD: machdep.c,v 1.1 2002/12/09 12:16:22 scw Exp $	*/
      2  1.1  scw 
      3  1.1  scw /*
      4  1.1  scw  * Copyright 2001, 2002 Wasabi Systems, Inc.
      5  1.1  scw  * All rights reserved.
      6  1.1  scw  *
      7  1.1  scw  * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
      8  1.1  scw  *
      9  1.1  scw  * Redistribution and use in source and binary forms, with or without
     10  1.1  scw  * modification, are permitted provided that the following conditions
     11  1.1  scw  * are met:
     12  1.1  scw  * 1. Redistributions of source code must retain the above copyright
     13  1.1  scw  *    notice, this list of conditions and the following disclaimer.
     14  1.1  scw  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.1  scw  *    notice, this list of conditions and the following disclaimer in the
     16  1.1  scw  *    documentation and/or other materials provided with the distribution.
     17  1.1  scw  * 3. All advertising materials mentioning features or use of this software
     18  1.1  scw  *    must display the following acknowledgement:
     19  1.1  scw  *      This product includes software developed for the NetBSD Project by
     20  1.1  scw  *      Wasabi Systems, Inc.
     21  1.1  scw  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
     22  1.1  scw  *    or promote products derived from this software without specific prior
     23  1.1  scw  *    written permission.
     24  1.1  scw  *
     25  1.1  scw  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
     26  1.1  scw  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     27  1.1  scw  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     28  1.1  scw  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     29  1.1  scw  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30  1.1  scw  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31  1.1  scw  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32  1.1  scw  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33  1.1  scw  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34  1.1  scw  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     35  1.1  scw  * POSSIBILITY OF SUCH DAMAGE.
     36  1.1  scw  */
     37  1.1  scw 
     38  1.1  scw /*
     39  1.1  scw  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
     40  1.1  scw  * Copyright (C) 1995, 1996 TooLs GmbH.
     41  1.1  scw  * All rights reserved.
     42  1.1  scw  *
     43  1.1  scw  * Redistribution and use in source and binary forms, with or without
     44  1.1  scw  * modification, are permitted provided that the following conditions
     45  1.1  scw  * are met:
     46  1.1  scw  * 1. Redistributions of source code must retain the above copyright
     47  1.1  scw  *    notice, this list of conditions and the following disclaimer.
     48  1.1  scw  * 2. Redistributions in binary form must reproduce the above copyright
     49  1.1  scw  *    notice, this list of conditions and the following disclaimer in the
     50  1.1  scw  *    documentation and/or other materials provided with the distribution.
     51  1.1  scw  * 3. All advertising materials mentioning features or use of this software
     52  1.1  scw  *    must display the following acknowledgement:
     53  1.1  scw  *	This product includes software developed by TooLs GmbH.
     54  1.1  scw  * 4. The name of TooLs GmbH may not be used to endorse or promote products
     55  1.1  scw  *    derived from this software without specific prior written permission.
     56  1.1  scw  *
     57  1.1  scw  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
     58  1.1  scw  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     59  1.1  scw  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     60  1.1  scw  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     61  1.1  scw  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     62  1.1  scw  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     63  1.1  scw  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     64  1.1  scw  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     65  1.1  scw  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     66  1.1  scw  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     67  1.1  scw  */
     68  1.1  scw 
     69  1.1  scw #include "opt_compat_netbsd.h"
     70  1.1  scw #include "opt_ddb.h"
     71  1.1  scw #include "opt_ipkdb.h"
     72  1.1  scw 
     73  1.1  scw #include <sys/param.h>
     74  1.1  scw #include <sys/buf.h>
     75  1.1  scw #include <sys/exec.h>
     76  1.1  scw #include <sys/malloc.h>
     77  1.1  scw #include <sys/mbuf.h>
     78  1.1  scw #include <sys/mount.h>
     79  1.1  scw #include <sys/msgbuf.h>
     80  1.1  scw #include <sys/proc.h>
     81  1.1  scw #include <sys/reboot.h>
     82  1.1  scw #include <sys/syscallargs.h>
     83  1.1  scw #include <sys/syslog.h>
     84  1.1  scw #include <sys/systm.h>
     85  1.1  scw #include <sys/kernel.h>
     86  1.1  scw #include <sys/user.h>
     87  1.1  scw #include <sys/boot_flag.h>
     88  1.1  scw #include <sys/properties.h>
     89  1.1  scw 
     90  1.1  scw #include <uvm/uvm_extern.h>
     91  1.1  scw 
     92  1.1  scw #include <net/netisr.h>
     93  1.1  scw 
     94  1.1  scw #include <machine/bus.h>
     95  1.1  scw #include <machine/powerpc.h>
     96  1.1  scw #include <machine/trap.h>
     97  1.1  scw #include <machine/walnut.h>
     98  1.1  scw #include <machine/dcr.h>
     99  1.1  scw 
    100  1.1  scw #include <powerpc/spr.h>
    101  1.1  scw #include <machine/bus.h>
    102  1.1  scw 
    103  1.1  scw #include <dev/cons.h>
    104  1.1  scw 
    105  1.1  scw #ifdef DDB
    106  1.1  scw #include <machine/db_machdep.h>
    107  1.1  scw #include <ddb/db_extern.h>
    108  1.1  scw #endif
    109  1.1  scw 
    110  1.1  scw #include "com.h"
    111  1.1  scw #if NCOM > 0
    112  1.1  scw #include <dev/ic/comreg.h>	/* For COM_FREQ */
    113  1.1  scw #endif
    114  1.1  scw 
    115  1.1  scw /*
    116  1.1  scw  * Global variables used here and there
    117  1.1  scw  */
    118  1.1  scw struct vm_map *exec_map = NULL;
    119  1.1  scw struct vm_map *mb_map = NULL;
    120  1.1  scw struct vm_map *phys_map = NULL;
    121  1.1  scw 
    122  1.1  scw /*
    123  1.1  scw  * This should probably be in autoconf!				XXX
    124  1.1  scw  */
    125  1.1  scw char cpu_model[80];
    126  1.1  scw char machine[] = MACHINE;		/* from <machine/param.h> */
    127  1.1  scw char machine_arch[] = MACHINE_ARCH;	/* from <machine/param.h> */
    128  1.1  scw 
    129  1.1  scw struct pcb *curpcb;
    130  1.1  scw struct pmap *curpm;
    131  1.1  scw struct proc *fpuproc;		/* XXX - shouldn't need this on fpu-less CPUs */
    132  1.1  scw 
    133  1.1  scw extern struct user *proc0paddr;
    134  1.1  scw 
    135  1.1  scw char bootpath[256];
    136  1.1  scw paddr_t msgbuf_paddr;
    137  1.1  scw vaddr_t msgbuf_vaddr;
    138  1.1  scw 
    139  1.1  scw #ifdef DDB
    140  1.1  scw void *startsym, *endsym;
    141  1.1  scw #endif
    142  1.1  scw 
    143  1.1  scw int lcsplx(int);
    144  1.1  scw void initppc(u_int, u_int, char *, void *);
    145  1.1  scw 
    146  1.1  scw static void dumpsys(void);
    147  1.1  scw static void install_extint(void (*)(void));
    148  1.1  scw 
    149  1.1  scw #define MEMREGIONS	8
    150  1.1  scw struct mem_region physmemr[MEMREGIONS];		/* Hard code memory */
    151  1.1  scw struct mem_region availmemr[MEMREGIONS];	/* Who's supposed to set these up? */
    152  1.1  scw 
    153  1.1  scw struct board_cfg_data board_data;
    154  1.1  scw struct propdb *board_info = NULL;
    155  1.1  scw 
    156  1.1  scw void
    157  1.1  scw initppc(u_int startkernel, u_int endkernel, char *args, void *info_block)
    158  1.1  scw {
    159  1.1  scw 	extern int defaulttrap, defaultsize;
    160  1.1  scw 	extern int sctrap, scsize;
    161  1.1  scw 	extern int alitrap, alisize;
    162  1.1  scw 	extern int dsitrap, dsisize;
    163  1.1  scw 	extern int isitrap, isisize;
    164  1.1  scw 	extern int mchktrap, mchksize;
    165  1.1  scw 	extern int tlbimiss4xx, tlbim4size;
    166  1.1  scw 	extern int tlbdmiss4xx, tlbdm4size;
    167  1.1  scw 	extern int pitfitwdog, pitfitwdogsize;
    168  1.1  scw 	extern int debugtrap, debugsize;
    169  1.1  scw 	extern int errata51handler, errata51size;
    170  1.1  scw #ifdef DDB
    171  1.1  scw 	extern int ddblow, ddbsize;
    172  1.1  scw #endif
    173  1.1  scw #ifdef IPKDB
    174  1.1  scw 	extern int ipkdblow, ipkdbsize;
    175  1.1  scw #endif
    176  1.1  scw 	int exc;
    177  1.1  scw 	extern char _edata, _end;
    178  1.1  scw 
    179  1.1  scw 	/* Disable all external interrupts */
    180  1.1  scw 	mtdcr(DCR_UIC0_ER, 0);
    181  1.1  scw 
    182  1.1  scw         /* Initialize cache info for memcpy, etc. */
    183  1.1  scw         cpu_probe_cache();
    184  1.1  scw 
    185  1.1  scw 	memset(&_edata, 0, &_end-&_edata); /* Clear BSS area */
    186  1.1  scw 
    187  1.1  scw 	/* Save info block */
    188  1.1  scw 	if (info_block == NULL)
    189  1.1  scw 		/* XXX why isn't r3 set correctly?!?!? */
    190  1.1  scw 		info_block = (void *)0x8e10;
    191  1.1  scw 	memcpy(&board_data, info_block, sizeof(board_data));
    192  1.1  scw 
    193  1.1  scw 	memset(physmemr, 0, sizeof physmemr);
    194  1.1  scw 	memset(availmemr, 0, sizeof availmemr);
    195  1.1  scw 	physmemr[0].start = 0;
    196  1.1  scw 	physmemr[0].size = board_data.mem_size & ~PGOFSET;
    197  1.1  scw 	/* Lower memory reserved by eval board BIOS */
    198  1.1  scw 	availmemr[0].start = startkernel;
    199  1.1  scw 	availmemr[0].size = board_data.mem_size - availmemr[0].start;
    200  1.1  scw 
    201  1.1  scw 	proc0.p_addr = proc0paddr;
    202  1.1  scw 	memset(proc0.p_addr, 0, sizeof *proc0.p_addr);
    203  1.1  scw 
    204  1.1  scw 	curpcb = &proc0paddr->u_pcb;
    205  1.1  scw 
    206  1.1  scw 	curpm = curpcb->pcb_pmreal = curpcb->pcb_pm = pmap_kernel();
    207  1.1  scw 
    208  1.1  scw 	/*
    209  1.1  scw 	 * Set up trap vectors
    210  1.1  scw 	 */
    211  1.1  scw 	for (exc = EXC_RSVD; exc <= EXC_LAST; exc += 0x100)
    212  1.1  scw 		switch (exc) {
    213  1.1  scw 		default:
    214  1.1  scw 			memcpy((void *)exc, &defaulttrap, (size_t)&defaultsize);
    215  1.1  scw 			break;
    216  1.1  scw 		case EXC_EXI:
    217  1.1  scw 			/*
    218  1.1  scw 			 * This one is (potentially) installed during autoconf
    219  1.1  scw 			 */
    220  1.1  scw 			break;
    221  1.1  scw 		case EXC_SC:
    222  1.1  scw 			memcpy((void *)EXC_SC, &sctrap, (size_t)&scsize);
    223  1.1  scw 			break;
    224  1.1  scw 		case EXC_ALI:
    225  1.1  scw 			memcpy((void *)EXC_ALI, &alitrap, (size_t)&alisize);
    226  1.1  scw 			break;
    227  1.1  scw 		case EXC_DSI:
    228  1.1  scw 			memcpy((void *)EXC_DSI, &dsitrap, (size_t)&dsisize);
    229  1.1  scw 			break;
    230  1.1  scw 		case EXC_ISI:
    231  1.1  scw 			memcpy((void *)EXC_ISI, &isitrap, (size_t)&isisize);
    232  1.1  scw 			break;
    233  1.1  scw 		case EXC_MCHK:
    234  1.1  scw 			memcpy((void *)EXC_MCHK, &mchktrap, (size_t)&mchksize);
    235  1.1  scw 			break;
    236  1.1  scw 		case EXC_ITMISS:
    237  1.1  scw 			memcpy((void *)EXC_ITMISS, &tlbimiss4xx,
    238  1.1  scw 				(size_t)&tlbim4size);
    239  1.1  scw 			break;
    240  1.1  scw 		case EXC_DTMISS:
    241  1.1  scw 			memcpy((void *)EXC_DTMISS, &tlbdmiss4xx,
    242  1.1  scw 				(size_t)&tlbdm4size);
    243  1.1  scw 			break;
    244  1.1  scw 		/*
    245  1.1  scw 		 * EXC_PIT, EXC_FIT, EXC_WDOG handlers
    246  1.1  scw 		 * are spaced by 0x10 bytes only..
    247  1.1  scw 		 */
    248  1.1  scw 		case EXC_PIT:
    249  1.1  scw 			memcpy((void *)EXC_PIT, &pitfitwdog,
    250  1.1  scw 				(size_t)&pitfitwdogsize);
    251  1.1  scw 			break;
    252  1.1  scw 		case EXC_DEBUG:
    253  1.1  scw 			memcpy((void *)EXC_DEBUG, &debugtrap,
    254  1.1  scw 				(size_t)&debugsize);
    255  1.1  scw 			break;
    256  1.1  scw 		case EXC_DTMISS|EXC_ALI:
    257  1.1  scw                         /* PPC405GP Rev D errata item 51 */
    258  1.1  scw 			memcpy((void *)(EXC_DTMISS|EXC_ALI), &errata51handler,
    259  1.1  scw 				(size_t)&errata51size);
    260  1.1  scw 			break;
    261  1.1  scw 		case EXC_PGM:
    262  1.1  scw #if defined(DDB)
    263  1.1  scw 			memcpy((void *)exc, &ddblow, (size_t)&ddbsize);
    264  1.1  scw #elif defined(IPKDB)
    265  1.1  scw 			memcpy((void *)exc, &ipkdblow, (size_t)&ipkdbsize);
    266  1.1  scw #else
    267  1.1  scw 			memcpy((void *)exc, &pgmtrap, (size_t)&pgmsize);
    268  1.1  scw #endif
    269  1.1  scw 			break;
    270  1.1  scw 		}
    271  1.1  scw 
    272  1.1  scw 	__syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
    273  1.1  scw 	mtspr(SPR_EVPR, 0);		/* Set Exception vector base */
    274  1.1  scw 	consinit();
    275  1.1  scw 
    276  1.1  scw 	/* Handle trap instruction as PGM exception */
    277  1.1  scw 	{
    278  1.1  scw 	  int dbcr0;
    279  1.1  scw 	  asm volatile("mfspr %0,%1":"=r"(dbcr0):"K"(SPR_DBCR0));
    280  1.1  scw 	  asm volatile("mtspr %0,%1"::"K"(SPR_DBCR0),"r"(dbcr0 & ~DBCR0_TDE));
    281  1.1  scw 	}
    282  1.1  scw 
    283  1.1  scw 	/*
    284  1.1  scw 	 * external interrupt handler install
    285  1.1  scw 	 */
    286  1.1  scw 	install_extint(ext_intr);
    287  1.1  scw 
    288  1.1  scw 	/*
    289  1.1  scw 	 * Now enable translation (and machine checks/recoverable interrupts).
    290  1.1  scw 	 */
    291  1.1  scw 	asm volatile ("mfmsr %0; ori %0,%0,%1; mtmsr %0; isync"
    292  1.1  scw 		      : : "r"(0), "K"(PSL_IR|PSL_DR));
    293  1.1  scw 	/* XXXX PSL_ME - With ME set kernel gets stuck... */
    294  1.1  scw 
    295  1.1  scw 	uvm_setpagesize();
    296  1.1  scw 
    297  1.1  scw 	/*
    298  1.1  scw 	 * Initialize pmap module.
    299  1.1  scw 	 */
    300  1.1  scw 	pmap_bootstrap(startkernel, endkernel);
    301  1.1  scw 
    302  1.1  scw 	consinit();
    303  1.1  scw 
    304  1.1  scw #ifdef DEBUG
    305  1.1  scw 	printf("Board config data:\n");
    306  1.1  scw 	printf("  usr_config_ver = %s\n", board_data.usr_config_ver);
    307  1.1  scw 	printf("  rom_sw_ver = %s\n", board_data.rom_sw_ver);
    308  1.1  scw 	printf("  mem_size = %u\n", board_data.mem_size);
    309  1.1  scw 	printf("  mac_address_local = %02x:%02x:%02x:%02x:%02x:%02x\n",
    310  1.1  scw 	    board_data.mac_address_local[0], board_data.mac_address_local[1],
    311  1.1  scw 	    board_data.mac_address_local[2], board_data.mac_address_local[3],
    312  1.1  scw 	    board_data.mac_address_local[4], board_data.mac_address_local[5]);
    313  1.1  scw 	printf("  mac_address_pci = %02x:%02x:%02x:%02x:%02x:%02x\n",
    314  1.1  scw 	    board_data.mac_address_pci[0], board_data.mac_address_pci[1],
    315  1.1  scw 	    board_data.mac_address_pci[2], board_data.mac_address_pci[3],
    316  1.1  scw 	    board_data.mac_address_pci[4], board_data.mac_address_pci[5]);
    317  1.1  scw 	printf("  processor_speed = %u\n", board_data.processor_speed);
    318  1.1  scw 	printf("  plb_speed = %u\n", board_data.plb_speed);
    319  1.1  scw 	printf("  pci_speed = %u\n", board_data.pci_speed);
    320  1.1  scw #endif
    321  1.1  scw 
    322  1.1  scw #ifdef DDB
    323  1.1  scw 	ddb_init((int)((u_int)endsym - (u_int)startsym), startsym, endsym);
    324  1.1  scw 	if (boothowto & RB_KDB)
    325  1.1  scw 		Debugger();
    326  1.1  scw #endif
    327  1.1  scw #ifdef IPKDB
    328  1.1  scw 	/*
    329  1.1  scw 	 * Now trap to IPKDB
    330  1.1  scw 	 */
    331  1.1  scw 	ipkdb_init();
    332  1.1  scw 	if (boothowto & RB_KDB)
    333  1.1  scw 		ipkdb_connect(0);
    334  1.1  scw #endif
    335  1.1  scw 	fake_mapiodev = 0;
    336  1.1  scw }
    337  1.1  scw 
    338  1.1  scw static void
    339  1.1  scw install_extint(void (*handler)(void))
    340  1.1  scw {
    341  1.1  scw 	extern int extint, extsize;
    342  1.1  scw 	extern u_long extint_call;
    343  1.1  scw 	u_long offset = (u_long)handler - (u_long)&extint_call;
    344  1.1  scw 	int omsr, msr;
    345  1.1  scw 
    346  1.1  scw #ifdef	DIAGNOSTIC
    347  1.1  scw 	if (offset > 0x1ffffff)
    348  1.1  scw 		panic("install_extint: too far away");
    349  1.1  scw #endif
    350  1.1  scw 	asm volatile ("mfmsr %0; andi. %1,%0,%2; mtmsr %1"
    351  1.1  scw 		      : "=r"(omsr), "=r"(msr) : "K"((u_short)~PSL_EE));
    352  1.1  scw 	extint_call = (extint_call & 0xfc000003) | offset;
    353  1.1  scw 	memcpy((void *)EXC_EXI, &extint, (size_t)&extsize);
    354  1.1  scw 	__syncicache((void *)&extint_call, sizeof extint_call);
    355  1.1  scw 	__syncicache((void *)EXC_EXI, (int)&extsize);
    356  1.1  scw 	asm volatile ("mtmsr %0" :: "r"(omsr));
    357  1.1  scw }
    358  1.1  scw 
    359  1.1  scw /*
    360  1.1  scw  * Machine dependent startup code.
    361  1.1  scw  */
    362  1.1  scw 
    363  1.1  scw char msgbuf[MSGBUFSIZE];
    364  1.1  scw 
    365  1.1  scw void
    366  1.1  scw cpu_startup(void)
    367  1.1  scw {
    368  1.1  scw 	caddr_t v;
    369  1.1  scw 	vaddr_t minaddr, maxaddr;
    370  1.1  scw 	u_int sz, i, base, residual;
    371  1.1  scw 	char pbuf[9];
    372  1.1  scw 
    373  1.1  scw 	proc0.p_addr = proc0paddr;
    374  1.1  scw 	v = (caddr_t)proc0paddr + USPACE;
    375  1.1  scw 
    376  1.1  scw 	/*
    377  1.1  scw 	 * Initialize error message buffer (at end of core).
    378  1.1  scw 	 */
    379  1.1  scw #if 0	/* For some reason this fails... --Artem
    380  1.1  scw 	 * Besides, do we really have to put it at the end of core?
    381  1.1  scw 	 * Let's use static buffer for now
    382  1.1  scw 	 */
    383  1.1  scw 	if (!(msgbuf_vaddr = uvm_km_alloc(kernel_map, round_page(MSGBUFSIZE))))
    384  1.1  scw 		panic("startup: no room for message buffer");
    385  1.1  scw 	for (i = 0; i < btoc(MSGBUFSIZE); i++)
    386  1.1  scw 		pmap_kenter_pa(msgbuf_vaddr + i * NBPG,
    387  1.1  scw 			msgbuf_paddr + i * NBPG, VM_PROT_READ|VM_PROT_WRITE);
    388  1.1  scw 	initmsgbuf((caddr_t)msgbuf_vaddr, round_page(MSGBUFSIZE));
    389  1.1  scw #else
    390  1.1  scw 	initmsgbuf((caddr_t)msgbuf, round_page(MSGBUFSIZE));
    391  1.1  scw #endif
    392  1.1  scw 
    393  1.1  scw 
    394  1.1  scw 	printf("%s", version);
    395  1.1  scw 	printf("Walnut PowerPC 405GP Evaluation Board\n");
    396  1.1  scw 
    397  1.1  scw 	format_bytes(pbuf, sizeof(pbuf), ctob(physmem));
    398  1.1  scw 	printf("total memory = %s\n", pbuf);
    399  1.1  scw 
    400  1.1  scw 	/*
    401  1.1  scw 	 * Find out how much space we need, allocate it,
    402  1.1  scw 	 * and then give everything true virtual addresses.
    403  1.1  scw 	 */
    404  1.1  scw 	sz = (u_int)allocsys(NULL, NULL);
    405  1.1  scw 	if ((v = (caddr_t)uvm_km_zalloc(kernel_map, round_page(sz))) == 0)
    406  1.1  scw 		panic("startup: no room for tables");
    407  1.1  scw 	if (allocsys(v, NULL) - v != sz)
    408  1.1  scw 		panic("startup: table size inconsistency");
    409  1.1  scw 
    410  1.1  scw 	/*
    411  1.1  scw 	 * Now allocate buffers proper.  They are different than the above
    412  1.1  scw 	 * in that they usually occupy more virtual memory than physical.
    413  1.1  scw 	 */
    414  1.1  scw 	sz = MAXBSIZE * nbuf;
    415  1.1  scw 	minaddr = 0;
    416  1.1  scw 	if (uvm_map(kernel_map, (vaddr_t *)&minaddr, round_page(sz),
    417  1.1  scw 		NULL, UVM_UNKNOWN_OFFSET, 0,
    418  1.1  scw 		UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE,
    419  1.1  scw 			    UVM_ADV_NORMAL, 0)) != 0)
    420  1.1  scw 		panic("startup: cannot allocate VM for buffers");
    421  1.1  scw 	buffers = (char *)minaddr;
    422  1.1  scw 	base = bufpages / nbuf;
    423  1.1  scw 	residual = bufpages % nbuf;
    424  1.1  scw 	if (base >= MAXBSIZE) {
    425  1.1  scw 		/* Don't want to alloc more physical mem than ever needed */
    426  1.1  scw 		base = MAXBSIZE;
    427  1.1  scw 		residual = 0;
    428  1.1  scw 	}
    429  1.1  scw 	for (i = 0; i < nbuf; i++) {
    430  1.1  scw 		vsize_t curbufsize;
    431  1.1  scw 		vaddr_t curbuf;
    432  1.1  scw 		struct vm_page *pg;
    433  1.1  scw 
    434  1.1  scw 		curbuf = (vaddr_t)buffers + i * MAXBSIZE;
    435  1.1  scw 		curbufsize = NBPG * (i < residual ? base + 1 : base);
    436  1.1  scw 
    437  1.1  scw 		while (curbufsize) {
    438  1.1  scw 			pg = uvm_pagealloc(NULL, 0, NULL, 0);
    439  1.1  scw 			if (pg == NULL)
    440  1.1  scw 				panic("cpu_startup: not enough memory for "
    441  1.1  scw 				    "buffer cache");
    442  1.1  scw 			pmap_kenter_pa(curbuf, VM_PAGE_TO_PHYS(pg),
    443  1.1  scw 			    VM_PROT_READ | VM_PROT_WRITE);
    444  1.1  scw 			curbuf += PAGE_SIZE;
    445  1.1  scw 			curbufsize -= PAGE_SIZE;
    446  1.1  scw 		}
    447  1.1  scw 	}
    448  1.1  scw 
    449  1.1  scw 	/*
    450  1.1  scw 	 * Allocate a submap for exec arguments.  This map effectively
    451  1.1  scw 	 * limits the number of processes exec'ing at any time.
    452  1.1  scw 	 */
    453  1.1  scw 	exec_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
    454  1.1  scw 				 16*NCARGS, VM_MAP_PAGEABLE, FALSE, NULL);
    455  1.1  scw 
    456  1.1  scw 	/*
    457  1.1  scw 	 * Allocate a submap for physio
    458  1.1  scw 	 */
    459  1.1  scw 	phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
    460  1.1  scw 				 VM_PHYS_SIZE, 0, FALSE, NULL);
    461  1.1  scw 
    462  1.1  scw 	/*
    463  1.1  scw 	 * No need to allocate an mbuf cluster submap.  Mbuf clusters
    464  1.1  scw 	 * are allocated via the pool allocator, and we use direct-mapped
    465  1.1  scw 	 * pool pages.
    466  1.1  scw 	 */
    467  1.1  scw 
    468  1.1  scw 	format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free));
    469  1.1  scw 	printf("avail memory = %s\n", pbuf);
    470  1.1  scw 	format_bytes(pbuf, sizeof(pbuf), bufpages * NBPG);
    471  1.1  scw 	printf("using %u buffers containing %s of memory\n", nbuf, pbuf);
    472  1.1  scw 
    473  1.1  scw 	/*
    474  1.1  scw 	 * Set up the buffers.
    475  1.1  scw 	 */
    476  1.1  scw 	bufinit();
    477  1.1  scw 
    478  1.1  scw 	/*
    479  1.1  scw 	 * Set up the board properties database.
    480  1.1  scw 	 */
    481  1.1  scw 	if (!(board_info = propdb_create("board info")))
    482  1.1  scw 		panic("Cannot create board info database");
    483  1.1  scw 
    484  1.1  scw 	if (board_info_set("mem-size", &board_data.mem_size,
    485  1.1  scw 		sizeof(&board_data.mem_size), PROP_CONST, 0))
    486  1.1  scw 		panic("setting mem-size");
    487  1.1  scw 	if (board_info_set("emac-mac-addr", &board_data.mac_address_local,
    488  1.1  scw 		sizeof(&board_data.mac_address_local), PROP_CONST, 0))
    489  1.1  scw 		panic("setting emac-mac-addr");
    490  1.1  scw 	if (board_info_set("sip0-mac-addr", &board_data.mac_address_pci,
    491  1.1  scw 		sizeof(&board_data.mac_address_pci), PROP_CONST, 0))
    492  1.1  scw 		panic("setting sip0-mac-addr");
    493  1.1  scw 	if (board_info_set("processor-frequency", &board_data.processor_speed,
    494  1.1  scw 		sizeof(&board_data.processor_speed), PROP_CONST, 0))
    495  1.1  scw 		panic("setting processor-frequency");
    496  1.1  scw #if NCOM > 0
    497  1.1  scw 	{
    498  1.1  scw 		unsigned int comfreq = COM_FREQ * 6;
    499  1.1  scw 		if (board_info_set("com-opb-frequency", &comfreq,
    500  1.1  scw 			sizeof(&comfreq), 0, 0))
    501  1.1  scw 			panic("setting com-opb-frequency");
    502  1.1  scw 	}
    503  1.1  scw #endif
    504  1.1  scw }
    505  1.1  scw 
    506  1.1  scw 
    507  1.1  scw static void
    508  1.1  scw dumpsys(void)
    509  1.1  scw {
    510  1.1  scw 
    511  1.1  scw 	printf("dumpsys: TBD\n");
    512  1.1  scw }
    513  1.1  scw 
    514  1.1  scw /*
    515  1.1  scw  * Soft networking interrupts.
    516  1.1  scw  */
    517  1.1  scw void
    518  1.1  scw softnet(void)
    519  1.1  scw {
    520  1.1  scw 	int isr;
    521  1.1  scw 
    522  1.1  scw 	isr = netisr;
    523  1.1  scw 	netisr = 0;
    524  1.1  scw 
    525  1.1  scw #define DONETISR(bit, fn) do {		\
    526  1.1  scw 	if (isr & (1 << bit))		\
    527  1.1  scw 		fn();			\
    528  1.1  scw } while (0)
    529  1.1  scw 
    530  1.1  scw #include <net/netisr_dispatch.h>
    531  1.1  scw 
    532  1.1  scw #undef DONETISR
    533  1.1  scw 
    534  1.1  scw }
    535  1.1  scw 
    536  1.1  scw /*
    537  1.1  scw  * Soft tty interrupts.
    538  1.1  scw  */
    539  1.1  scw void
    540  1.1  scw softserial(void)
    541  1.1  scw {
    542  1.1  scw #if NCOM > 0
    543  1.1  scw 	void comsoft(void);	/* XXX from dev/ic/com.c */
    544  1.1  scw 
    545  1.1  scw 	comsoft();
    546  1.1  scw #endif
    547  1.1  scw }
    548  1.1  scw 
    549  1.1  scw /*
    550  1.1  scw  * Halt or reboot the machine after syncing/dumping according to howto.
    551  1.1  scw  */
    552  1.1  scw void
    553  1.1  scw cpu_reboot(int howto, char *what)
    554  1.1  scw {
    555  1.1  scw 	static int syncing;
    556  1.1  scw 	static char str[256];
    557  1.1  scw 	char *ap = str, *ap1 = ap;
    558  1.1  scw 
    559  1.1  scw 	boothowto = howto;
    560  1.1  scw 	if (!cold && !(howto & RB_NOSYNC) && !syncing) {
    561  1.1  scw 		syncing = 1;
    562  1.1  scw 		vfs_shutdown();		/* sync */
    563  1.1  scw 		resettodr();		/* set wall clock */
    564  1.1  scw 	}
    565  1.1  scw 
    566  1.1  scw 	splhigh();
    567  1.1  scw 
    568  1.1  scw 	if (!cold && (howto & RB_DUMP))
    569  1.1  scw 		dumpsys();
    570  1.1  scw 
    571  1.1  scw 	doshutdownhooks();
    572  1.1  scw 
    573  1.1  scw 	if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
    574  1.1  scw 	  /* Power off here if we know how...*/
    575  1.1  scw 	}
    576  1.1  scw 
    577  1.1  scw 	if (howto & RB_HALT) {
    578  1.1  scw 		printf("halted\n\n");
    579  1.1  scw 
    580  1.1  scw 		goto reboot;	/* XXX for now... */
    581  1.1  scw 
    582  1.1  scw #ifdef DDB
    583  1.1  scw 		printf("dropping to debugger\n");
    584  1.1  scw 		while(1)
    585  1.1  scw 			Debugger();
    586  1.1  scw #endif
    587  1.1  scw 	}
    588  1.1  scw 
    589  1.1  scw 	printf("rebooting\n\n");
    590  1.1  scw 	if (what && *what) {
    591  1.1  scw 		if (strlen(what) > sizeof str - 5)
    592  1.1  scw 			printf("boot string too large, ignored\n");
    593  1.1  scw 		else {
    594  1.1  scw 			strcpy(str, what);
    595  1.1  scw 			ap1 = ap = str + strlen(str);
    596  1.1  scw 			*ap++ = ' ';
    597  1.1  scw 		}
    598  1.1  scw 	}
    599  1.1  scw 	*ap++ = '-';
    600  1.1  scw 	if (howto & RB_SINGLE)
    601  1.1  scw 		*ap++ = 's';
    602  1.1  scw 	if (howto & RB_KDB)
    603  1.1  scw 		*ap++ = 'd';
    604  1.1  scw 	*ap++ = 0;
    605  1.1  scw 	if (ap[-2] == '-')
    606  1.1  scw 		*ap1 = 0;
    607  1.1  scw 
    608  1.1  scw 	/* flush cache for msgbuf */
    609  1.1  scw 	__syncicache((void *)msgbuf_paddr, round_page(MSGBUFSIZE));
    610  1.1  scw 
    611  1.1  scw  reboot:
    612  1.1  scw 	ppc4xx_reset();
    613  1.1  scw 
    614  1.1  scw 	printf("ppc4xx_reset() failed!\n");
    615  1.1  scw #ifdef DDB
    616  1.1  scw 	while(1)
    617  1.1  scw 		Debugger();
    618  1.1  scw #else
    619  1.1  scw 	while (1)
    620  1.1  scw 		/* nothing */;
    621  1.1  scw #endif
    622  1.1  scw }
    623  1.1  scw 
    624  1.1  scw int
    625  1.1  scw lcsplx(int ipl)
    626  1.1  scw {
    627  1.1  scw 
    628  1.1  scw 	return spllower(ipl); 	/* XXX */
    629  1.1  scw }
    630  1.1  scw 
    631  1.1  scw void
    632  1.1  scw mem_regions(struct mem_region **mem, struct mem_region **avail)
    633  1.1  scw {
    634  1.1  scw 
    635  1.1  scw 	*mem = physmemr;
    636  1.1  scw 	*avail = availmemr;
    637  1.1  scw }
    638