Home | History | Annotate | Line # | Download | only in arm
      1  1.10  nonaka /*	$NetBSD: arm_boot.cpp,v 1.10 2009/01/29 21:23:38 nonaka Exp $	*/
      2   1.1     uch 
      3   1.1     uch /*-
      4   1.1     uch  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5   1.1     uch  * All rights reserved.
      6   1.1     uch  *
      7   1.1     uch  * This code is derived from software contributed to The NetBSD Foundation
      8   1.1     uch  * by UCHIYAMA Yasushi.
      9   1.1     uch  *
     10   1.1     uch  * Redistribution and use in source and binary forms, with or without
     11   1.1     uch  * modification, are permitted provided that the following conditions
     12   1.1     uch  * are met:
     13   1.1     uch  * 1. Redistributions of source code must retain the above copyright
     14   1.1     uch  *    notice, this list of conditions and the following disclaimer.
     15   1.1     uch  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1     uch  *    notice, this list of conditions and the following disclaimer in the
     17   1.1     uch  *    documentation and/or other materials provided with the distribution.
     18   1.1     uch  *
     19   1.1     uch  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.1     uch  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.1     uch  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.1     uch  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.1     uch  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.1     uch  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.1     uch  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.1     uch  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.1     uch  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.1     uch  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.1     uch  * POSSIBILITY OF SUCH DAMAGE.
     30   1.1     uch  */
     31   1.1     uch 
     32   1.1     uch #include <hpcboot.h>
     33   1.1     uch 
     34   1.1     uch #include <arch.h>
     35   1.1     uch #include <memory.h>
     36   1.1     uch 
     37   1.1     uch #include <arm/arm_arch.h>
     38   1.8   rafal #include <arm/arm_sa1100.h>
     39   1.8   rafal #include <arm/arm_pxa2x0.h>
     40   1.1     uch #include <arm/arm_boot.h>
     41   1.1     uch #include <arm/arm_console.h>
     42   1.1     uch 
     43   1.3     uch ARMBoot::ARMBoot()
     44   1.1     uch {
     45   1.1     uch }
     46   1.1     uch 
     47   1.3     uch ARMBoot::~ARMBoot()
     48   1.1     uch {
     49   1.1     uch 	if (_mem)
     50   1.1     uch 		delete _mem;
     51   1.1     uch 	if (_arch)
     52   1.1     uch 		delete _arch;
     53   1.1     uch 
     54   1.1     uch 	ARMConsole::Destroy();
     55   1.1     uch }
     56   1.1     uch 
     57   1.1     uch BOOL
     58   1.3     uch ARMBoot::setup()
     59   1.1     uch {
     60   1.3     uch 	struct HpcMenuInterface::HpcMenuPreferences &pref = HPC_PREFERENCE;
     61   1.3     uch 
     62   1.1     uch 	platid_t platid;
     63   1.1     uch 	platid.dw.dw0 = pref.platid_hi;
     64   1.1     uch 	platid.dw.dw1 = pref.platid_lo;
     65   1.1     uch 
     66   1.1     uch 	if (platid_match(&platid, &platid_mask_CPU_ARM_STRONGARM_SA1100))
     67   1.2  toshii 		args.architecture = ARCHITECTURE_ARM_SA1100;
     68   1.2  toshii 	else if (platid_match(&platid, &platid_mask_CPU_ARM_STRONGARM_SA1110))
     69   1.1     uch 		args.architecture = ARCHITECTURE_ARM_SA1100;
     70   1.8   rafal 	else if (platid_match(&platid, &platid_mask_CPU_ARM_XSCALE_PXA250))
     71   1.8   rafal 		args.architecture = ARCHITECTURE_ARM_PXA250;
     72  1.10  nonaka 	else if (platid_match(&platid, &platid_mask_CPU_ARM_XSCALE_PXA270))
     73  1.10  nonaka 		args.architecture = ARCHITECTURE_ARM_PXA270;
     74   1.1     uch 	else
     75   1.1     uch 		return FALSE;
     76   1.1     uch 
     77   1.1     uch 	args.memory = MEMORY_MANAGER_LOCKPAGES;
     78   1.1     uch 
     79   1.3     uch 	return super::setup();
     80   1.1     uch }
     81   1.1     uch 
     82   1.1     uch BOOL
     83   1.3     uch ARMBoot::create()
     84   1.1     uch {
     85   1.1     uch 	BOOL(*lock_pages)(LPVOID, DWORD, PDWORD, int);
     86   1.1     uch 	BOOL(*unlock_pages)(LPVOID, DWORD);
     87   1.1     uch 
     88   1.8   rafal 	// Architecture dependent ops.
     89   1.8   rafal 	switch (args.architecture) {
     90   1.8   rafal 	default:
     91   1.8   rafal 		DPRINTF((TEXT("Unsupported architecture.\n")));
     92   1.8   rafal 		return FALSE;
     93   1.8   rafal 	case ARCHITECTURE_ARM_SA1100:
     94   1.8   rafal 		_arch = new SA1100Architecture(_cons, _mem);
     95   1.8   rafal 		break;
     96   1.8   rafal 	case ARCHITECTURE_ARM_PXA250:
     97  1.10  nonaka 	case ARCHITECTURE_ARM_PXA270:
     98   1.8   rafal 		_arch = new PXA2X0Architecture(_cons, _mem);
     99   1.8   rafal 		break;
    100   1.8   rafal 	}
    101   1.1     uch 	_arch->setDebug() = args.architectureDebug;
    102   1.1     uch 
    103   1.1     uch 	lock_pages = _arch->_load_LockPages();
    104   1.1     uch 	unlock_pages = _arch->_load_UnlockPages();
    105   1.1     uch 	if (lock_pages == 0 || unlock_pages == 0) {
    106   1.1     uch 
    107   1.1     uch 		DPRINTF((TEXT("couldn't find LockPages/UnlockPages.\n")));
    108   1.1     uch 		return FALSE;
    109   1.1     uch 	}
    110   1.1     uch 
    111   1.1     uch 	// Memory manager.
    112   1.1     uch 	switch(args.memory)
    113   1.1     uch 	{
    114   1.1     uch 	default:
    115   1.1     uch 	case MEMORY_MANAGER_VIRTUALCOPY:
    116   1.1     uch 		// FALLTHROUGH
    117   1.1     uch 	case MEMORY_MANAGER_SOFTMMU:
    118   1.1     uch 		// FALLTHROUGH
    119   1.1     uch 	case MEMORY_MANAGER_HARDMMU:
    120   1.1     uch 		DPRINTF((TEXT("unsupported memory address detection method.\n")));
    121   1.1     uch 		return FALSE;
    122   1.1     uch 	case MEMORY_MANAGER_LOCKPAGES:
    123   1.1     uch 		_mem = new MemoryManager_LockPages(lock_pages, unlock_pages,
    124   1.4     uch 		    _cons, 4096);
    125   1.1     uch 		break;
    126   1.1     uch 	}
    127   1.1     uch 	_mem->setDebug() = args.memorymanagerDebug;
    128   1.1     uch 
    129   1.1     uch 	// Console
    130   1.1     uch 	if (args.console == CONSOLE_SERIAL) {
    131   1.8   rafal 		_cons = ARMConsole::Instance(_mem, args.architecture);
    132   1.8   rafal 		if (_cons == NULL || !_cons->init()) {
    133   1.1     uch 			_cons = Console::Instance();
    134   1.1     uch 			DPRINTF((TEXT("use LCD console instead.\n")));
    135   1.1     uch 		}
    136   1.5     uch 	} else {
    137   1.5     uch 		_cons = Console::Instance();
    138   1.1     uch 	}
    139   1.6     uch 
    140   1.1     uch 	// File Manager, Loader
    141   1.3     uch 	return super::create();
    142   1.1     uch }
    143