From owner-p4-projects@FreeBSD.ORG Mon May 7 16:41:29 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 84D8216A417; Mon, 7 May 2007 16:41:29 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 27AFA16A406 for ; Mon, 7 May 2007 16:41:29 +0000 (UTC) (envelope-from bms@incunabulum.net) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 1A32613C469 for ; Mon, 7 May 2007 16:41:24 +0000 (UTC) (envelope-from bms@incunabulum.net) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l47GfN7d062741 for ; Mon, 7 May 2007 16:41:23 GMT (envelope-from bms@incunabulum.net) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l47GfNnM062738 for perforce@freebsd.org; Mon, 7 May 2007 16:41:23 GMT (envelope-from bms@incunabulum.net) Date: Mon, 7 May 2007 16:41:23 GMT Message-Id: <200705071641.l47GfNnM062738@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bms@incunabulum.net using -f From: Bruce M Simpson To: Perforce Change Reviews Cc: Subject: PERFORCE change 119428 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 May 2007 16:41:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=119428 Change 119428 by bms@bms_anglepoise on 2007/05/07 16:41:19 Call OS and arch independent cfe_init() routine before initializing low level console (CFE is used on some PPC and ARM boards also). Use CFE to discover memory regions rather than hardcoding them; thus preserving the CFE arena at runtime. Clean up locore<->cfe glue a little. Affected files ... .. //depot/projects/mips2/src/sys/mips/mips/locore.S#18 edit .. //depot/projects/mips2/src/sys/mips/mips/machdep.c#31 edit Differences ... ==== //depot/projects/mips2/src/sys/mips/mips/locore.S#18 (text+ko) ==== @@ -42,8 +42,6 @@ #endif #ifdef CFE /* assumes MIPS32 */ -GLOBAL(cfe_present) - .space 4 GLOBAL(cfe_handle) .space 4 GLOBAL(cfe_vector) @@ -126,8 +124,6 @@ */ li t1, 0x43464531 bne a3, t1, no_cfe /* Check for "CFE1" signature */ - li t1, 0x1 - sw t1, cfe_present sw a0, cfe_handle /* Firmware data segment */ sw a2, cfe_vector /* Firmware entry vector */ no_cfe: ==== //depot/projects/mips2/src/sys/mips/mips/machdep.c#31 (text+ko) ==== @@ -70,6 +70,10 @@ #include #include +#ifdef CFE +#include +#endif + #ifdef CPU_SENTRY5 /* XXX */ void sentry5_reset(void); @@ -79,6 +83,11 @@ #include #endif +#ifdef CFE +extern uint32_t cfe_handle; +extern uint32_t cfe_vector; +#endif + int cold = 1; int clocks_running = 0; @@ -169,6 +178,38 @@ printf("entry: mips_init()\n"); bootverbose = 0; +#ifdef CFE + /* + * Query DRAM memory map from CFE. + */ + physmem = 0; + for (i = 0; i < 10; i += 2) { + int result; + uint64_t addr, len, type; + + result = cfe_enummem(i, 0, &addr, &len, &type); + if (result < 0) { + phys_avail[i] = phys_avail[i + 1] = 0; + break; + } + if (type != CFE_MI_AVAILABLE) + continue; + + phys_avail[i] = addr; + if (i == 0 && addr == 0) { + /* + * If this is the first physical memory segment probed + * from CFE, omit the region at the start of physical + * memory where the kernel has been loaded. + */ + phys_avail[i] += MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); + } + phys_avail[i + 1] = addr + len; + physmem += len; + } + + realmem = btoc(physmem); +#else /* !CFE */ realmem = btoc(64 << 20); for (i = 0; i < 10; i++) { @@ -178,6 +219,8 @@ /* phys_avail regions are in bytes */ phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); phys_avail[1] = ctob(realmem); +#endif + physmem = realmem; init_param1(); @@ -486,7 +529,21 @@ kernend = round_page((vm_offset_t)&end); memset(&edata, 0, kernend - (vm_offset_t)(&edata)); +#ifdef CFE + /* + * Initialize CFE firmware trampolines before + * we initialize the low-level console. + */ + if (cfe_handle != 0) + cfe_init(cfe_handle, cfe_vector); +#endif cninit(); + +#ifdef CFE + if (cfe_handle == 0) + panic("CFE was not detected by locore.\n"); +#endif + mips_init(); tick_init_params(); }