11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * IP32 basic setup 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 51da177e4SLinus Torvalds * License. See the file "COPYING" in the main directory of this archive 61da177e4SLinus Torvalds * for more details. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * Copyright (C) 2000 Harald Koerfgen 91da177e4SLinus Torvalds * Copyright (C) 2002, 2003, 2005 Ilya A. Volynets 1054d0a216SRalf Baechle * Copyright (C) 2006 Ralf Baechle <ralf@linux-mips.org> 111da177e4SLinus Torvalds */ 121da177e4SLinus Torvalds #include <linux/console.h> 131da177e4SLinus Torvalds #include <linux/init.h> 141da177e4SLinus Torvalds #include <linux/interrupt.h> 151da177e4SLinus Torvalds #include <linux/param.h> 161da177e4SLinus Torvalds #include <linux/sched.h> 171da177e4SLinus Torvalds 181da177e4SLinus Torvalds #include <asm/bootinfo.h> 191da177e4SLinus Torvalds #include <asm/mipsregs.h> 201da177e4SLinus Torvalds #include <asm/mmu_context.h> 211da177e4SLinus Torvalds #include <asm/sgialib.h> 221da177e4SLinus Torvalds #include <asm/time.h> 231da177e4SLinus Torvalds #include <asm/traps.h> 241da177e4SLinus Torvalds #include <asm/io.h> 251da177e4SLinus Torvalds #include <asm/ip32/crime.h> 261da177e4SLinus Torvalds #include <asm/ip32/mace.h> 271da177e4SLinus Torvalds #include <asm/ip32/ip32_ints.h> 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds extern void ip32_be_init(void); 301da177e4SLinus Torvalds extern void crime_init(void); 311da177e4SLinus Torvalds 321da177e4SLinus Torvalds #ifdef CONFIG_SGI_O2MACE_ETH 331da177e4SLinus Torvalds /* 341da177e4SLinus Torvalds * This is taken care of in here 'cause they say using Arc later on is 351da177e4SLinus Torvalds * problematic 361da177e4SLinus Torvalds */ 371da177e4SLinus Torvalds extern char o2meth_eaddr[8]; str2hexnum(unsigned char c)381da177e4SLinus Torvaldsstatic inline unsigned char str2hexnum(unsigned char c) 391da177e4SLinus Torvalds { 401da177e4SLinus Torvalds if (c >= '0' && c <= '9') 411da177e4SLinus Torvalds return c - '0'; 421da177e4SLinus Torvalds if (c >= 'a' && c <= 'f') 431da177e4SLinus Torvalds return c - 'a' + 10; 441da177e4SLinus Torvalds return 0; /* foo */ 451da177e4SLinus Torvalds } 461da177e4SLinus Torvalds str2eaddr(unsigned char * ea,unsigned char * str)471da177e4SLinus Torvaldsstatic inline void str2eaddr(unsigned char *ea, unsigned char *str) 481da177e4SLinus Torvalds { 491da177e4SLinus Torvalds int i; 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds for (i = 0; i < 6; i++) { 521da177e4SLinus Torvalds unsigned char num; 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds if(*str == ':') 551da177e4SLinus Torvalds str++; 561da177e4SLinus Torvalds num = str2hexnum(*str++) << 4; 571da177e4SLinus Torvalds num |= (str2hexnum(*str++)); 581da177e4SLinus Torvalds ea[i] = num; 591da177e4SLinus Torvalds } 601da177e4SLinus Torvalds } 611da177e4SLinus Torvalds #endif 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds /* An arbitrary time; this can be decreased if reliability looks good */ 641da177e4SLinus Torvalds #define WAIT_MS 10 651da177e4SLinus Torvalds plat_time_init(void)664b550488SRalf Baechlevoid __init plat_time_init(void) 671da177e4SLinus Torvalds { 681da177e4SLinus Torvalds printk(KERN_INFO "Calibrating system timer... "); 691da177e4SLinus Torvalds write_c0_count(0); 701da177e4SLinus Torvalds crime->timer = 0; 711da177e4SLinus Torvalds while (crime->timer < CRIME_MASTER_FREQ * WAIT_MS / 1000) ; 721da177e4SLinus Torvalds mips_hpt_frequency = read_c0_count() * 1000 / WAIT_MS; 731da177e4SLinus Torvalds printk("%d MHz CPU detected\n", mips_hpt_frequency * 2 / 1000000); 741da177e4SLinus Torvalds } 751da177e4SLinus Torvalds plat_mem_setup(void)762925aba4SRalf Baechlevoid __init plat_mem_setup(void) 771da177e4SLinus Torvalds { 781da177e4SLinus Torvalds board_be_init = ip32_be_init; 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds #ifdef CONFIG_SGI_O2MACE_ETH 811da177e4SLinus Torvalds { 821da177e4SLinus Torvalds char *mac = ArcGetEnvironmentVariable("eaddr"); 831da177e4SLinus Torvalds str2eaddr(o2meth_eaddr, mac); 841da177e4SLinus Torvalds } 851da177e4SLinus Torvalds #endif 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds #if defined(CONFIG_SERIAL_CORE_CONSOLE) 881da177e4SLinus Torvalds { 891da177e4SLinus Torvalds char* con = ArcGetEnvironmentVariable("console"); 901da177e4SLinus Torvalds if (con && *con == 'd') { 91*599a8945SDmitri Vorobiev static char options[8] __initdata; 921da177e4SLinus Torvalds char *baud = ArcGetEnvironmentVariable("dbaud"); 931da177e4SLinus Torvalds if (baud) 941da177e4SLinus Torvalds strcpy(options, baud); 951da177e4SLinus Torvalds add_preferred_console("ttyS", *(con + 1) == '2' ? 1 : 0, 961da177e4SLinus Torvalds baud ? options : NULL); 971da177e4SLinus Torvalds } 981da177e4SLinus Torvalds } 991da177e4SLinus Torvalds #endif 1001da177e4SLinus Torvalds } 101