1/* 2 * linux/arch/m68knommu/kernel/setup.c 3 * 4 * Copyright (C) 1999-2004 Greg Ungerer (gerg@snapgear.com) 5 * Copyright (C) 1998,1999 D. Jeff Dionne <jeff@lineo.ca> 6 * Copyleft ()) 2000 James D. Schettine {james@telos-systems.com} 7 * Copyright (C) 1998 Kenneth Albanowski <kjahds@kjahds.com> 8 * Copyright (C) 1995 Hamish Macdonald 9 * Copyright (C) 2000 Lineo Inc. (www.lineo.com) 10 * Copyright (C) 2001 Lineo, Inc. <www.lineo.com> 11 * 12 * 68VZ328 Fixes/support Evan Stawnyczy <e@lineo.ca> 13 */ 14 15/* 16 * This file handles the architecture-dependent parts of system setup 17 */ 18 19#include <linux/kernel.h> 20#include <linux/sched.h> 21#include <linux/delay.h> 22#include <linux/interrupt.h> 23#include <linux/fs.h> 24#include <linux/fb.h> 25#include <linux/module.h> 26#include <linux/console.h> 27#include <linux/genhd.h> 28#include <linux/errno.h> 29#include <linux/string.h> 30#include <linux/major.h> 31#include <linux/bootmem.h> 32#include <linux/seq_file.h> 33#include <linux/root_dev.h> 34#include <linux/init.h> 35 36#include <asm/setup.h> 37#include <asm/irq.h> 38#include <asm/machdep.h> 39#include <asm/pgtable.h> 40 41unsigned long memory_start; 42unsigned long memory_end; 43 44EXPORT_SYMBOL(memory_start); 45EXPORT_SYMBOL(memory_end); 46 47char __initdata command_line[COMMAND_LINE_SIZE]; 48 49/* setup some dummy routines */ 50static void dummy_waitbut(void) 51{ 52} 53 54void (*mach_sched_init) (irq_handler_t handler); 55void (*mach_tick)( void ); 56/* machine dependent keyboard functions */ 57int (*mach_keyb_init) (void); 58int (*mach_kbdrate) (struct kbd_repeat *); 59void (*mach_kbd_leds) (unsigned int); 60/* machine dependent irq functions */ 61void (*mach_init_IRQ) (void); 62irq_handler_t mach_default_handler; 63int (*mach_get_irq_list) (struct seq_file *, void *); 64void (*mach_process_int) (int irq, struct pt_regs *fp); 65void (*mach_trap_init) (void); 66/* machine dependent timer functions */ 67unsigned long (*mach_gettimeoffset) (void); 68void (*mach_gettod) (int*, int*, int*, int*, int*, int*); 69int (*mach_hwclk) (int, struct rtc_time*); 70int (*mach_set_clock_mmss) (unsigned long); 71void (*mach_mksound)( unsigned int count, unsigned int ticks ); 72void (*mach_reset)( void ); 73void (*waitbut)(void) = dummy_waitbut; 74void (*mach_debug_init)(void); 75void (*mach_halt)( void ); 76void (*mach_power_off)( void ); 77 78 79#ifdef CONFIG_M68000 80 #define CPU "MC68000" 81#endif 82#ifdef CONFIG_M68328 83 #define CPU "MC68328" 84#endif 85#ifdef CONFIG_M68EZ328 86 #define CPU "MC68EZ328" 87#endif 88#ifdef CONFIG_M68VZ328 89 #define CPU "MC68VZ328" 90#endif 91#ifdef CONFIG_M68332 92 #define CPU "MC68332" 93#endif 94#ifdef CONFIG_M68360 95 #define CPU "MC68360" 96#endif 97#if defined(CONFIG_M5206) 98 #define CPU "COLDFIRE(m5206)" 99#endif 100#if defined(CONFIG_M5206e) 101 #define CPU "COLDFIRE(m5206e)" 102#endif 103#if defined(CONFIG_M520x) 104 #define CPU "COLDFIRE(m520x)" 105#endif 106#if defined(CONFIG_M523x) 107 #define CPU "COLDFIRE(m523x)" 108#endif 109#if defined(CONFIG_M5249) 110 #define CPU "COLDFIRE(m5249)" 111#endif 112#if defined(CONFIG_M5271) 113 #define CPU "COLDFIRE(m5270/5271)" 114#endif 115#if defined(CONFIG_M5272) 116 #define CPU "COLDFIRE(m5272)" 117#endif 118#if defined(CONFIG_M5275) 119 #define CPU "COLDFIRE(m5274/5275)" 120#endif 121#if defined(CONFIG_M528x) 122 #define CPU "COLDFIRE(m5280/5282)" 123#endif 124#if defined(CONFIG_M5307) 125 #define CPU "COLDFIRE(m5307)" 126#endif 127#if defined(CONFIG_M532x) 128 #define CPU "COLDFIRE(m532x)" 129#endif 130#if defined(CONFIG_M5407) 131 #define CPU "COLDFIRE(m5407)" 132#endif 133#ifndef CPU 134 #define CPU "UNKNOWN" 135#endif 136 137/* (es) */ 138/* note: why is this defined here? the must be a better place to put this */ 139#if defined(CONFIG_TELOS) || defined(CONFIG_UCDIMM) || defined(CONFIG_UCSIMM) || \ 140 defined(CONFIG_DRAGEN2) || (defined(CONFIG_PILOT) && defined(CONFIG_M68328)) 141#define CAT_ROMARRAY 142#endif 143/* (/es) */ 144 145extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end; 146extern int _ramstart, _ramend; 147 148void setup_arch(char **cmdline_p) 149{ 150 int bootmap_size; 151 152#if defined(CAT_ROMARRAY) && defined(DEBUG) 153 extern int __data_rom_start; 154 extern int __data_start; 155 int *romarray = (int *)((int) &__data_rom_start + 156 (int)&_edata - (int)&__data_start); 157#endif 158 159 memory_start = PAGE_ALIGN(_ramstart); 160 memory_end = _ramend; /* by now the stack is part of the init task */ 161 162 init_mm.start_code = (unsigned long) &_stext; 163 init_mm.end_code = (unsigned long) &_etext; 164 init_mm.end_data = (unsigned long) &_edata; 165 init_mm.brk = (unsigned long) 0; 166 167 config_BSP(&command_line[0], sizeof(command_line)); 168 169 printk(KERN_INFO "\x0F\r\n\nuClinux/" CPU "\n"); 170 171#ifdef CONFIG_UCDIMM 172 printk(KERN_INFO "uCdimm by Lineo, Inc. <www.lineo.com>\n"); 173#endif 174#ifdef CONFIG_M68VZ328 175 printk(KERN_INFO "M68VZ328 support by Evan Stawnyczy <e@lineo.ca>\n"); 176#endif 177#ifdef CONFIG_COLDFIRE 178 printk(KERN_INFO "COLDFIRE port done by Greg Ungerer, gerg@snapgear.com\n"); 179#ifdef CONFIG_M5307 180 printk(KERN_INFO "Modified for M5307 by Dave Miller, dmiller@intellistor.com\n"); 181#endif 182#ifdef CONFIG_ELITE 183 printk(KERN_INFO "Modified for M5206eLITE by Rob Scott, rscott@mtrob.fdns.net\n"); 184#endif 185#ifdef CONFIG_TELOS 186 printk(KERN_INFO "Modified for Omnia ToolVox by James D. Schettine, james@telos-systems.com\n"); 187#endif 188#endif 189 printk(KERN_INFO "Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n"); 190 191#if defined(CONFIG_PILOT) && defined(CONFIG_M68328) 192 printk(KERN_INFO "TRG SuperPilot FLASH card support <info@trgnet.com>\n"); 193#endif 194 195#if defined(CONFIG_PILOT) && defined(CONFIG_M68EZ328) 196 printk(KERN_INFO "PalmV support by Lineo Inc. <jeff@uclinux.com>\n"); 197#endif 198 199#ifdef CONFIG_M68EZ328ADS 200 printk(KERN_INFO "M68EZ328ADS board support (C) 1999 Vladimir Gurevich <vgurevic@cisco.com>\n"); 201#endif 202 203#ifdef CONFIG_ALMA_ANS 204 printk(KERN_INFO "Alma Electronics board support (C) 1999 Vladimir Gurevich <vgurevic@cisco.com>\n"); 205#endif 206#if defined(CONFIG_M68360) 207 printk(KERN_INFO "QUICC port done by SED Systems <hamilton@sedsystems.ca>,\n"); 208 printk(KERN_INFO "based on 2.0.38 port by Lineo Inc. <mleslie@lineo.com>.\n"); 209#endif 210#ifdef CONFIG_DRAGEN2 211 printk(KERN_INFO "DragonEngine II board support by Georges Menie\n"); 212#endif 213#ifdef CONFIG_M5235EVB 214 printk(KERN_INFO "Motorola M5235EVB support (C)2005 Syn-tech Systems, Inc. (Jate Sujjavanich)"); 215#endif 216 217#ifdef DEBUG 218 printk(KERN_DEBUG "KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x " 219 "BSS=0x%06x-0x%06x\n", (int) &_stext, (int) &_etext, 220 (int) &_sdata, (int) &_edata, 221 (int) &_sbss, (int) &_ebss); 222 printk(KERN_DEBUG "KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x " 223 "STACK=0x%06x-0x%06x\n", 224#ifdef CAT_ROMARRAY 225 (int) romarray, ((int) romarray) + romarray[2], 226#else 227 (int) &_ebss, (int) memory_start, 228#endif 229 (int) memory_start, (int) memory_end, 230 (int) memory_end, (int) _ramend); 231#endif 232 233 /* Keep a copy of command line */ 234 *cmdline_p = &command_line[0]; 235 memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); 236 boot_command_line[COMMAND_LINE_SIZE-1] = 0; 237 238#ifdef DEBUG 239 if (strlen(*cmdline_p)) 240 printk(KERN_DEBUG "Command line: '%s'\n", *cmdline_p); 241#endif 242 243#if defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_DUMMY_CONSOLE) 244 conswitchp = &dummy_con; 245#endif 246 247 /* 248 * Give all the memory to the bootmap allocator, tell it to put the 249 * boot mem_map at the start of memory. 250 */ 251 bootmap_size = init_bootmem_node( 252 NODE_DATA(0), 253 memory_start >> PAGE_SHIFT, /* map goes here */ 254 PAGE_OFFSET >> PAGE_SHIFT, /* 0 on coldfire */ 255 memory_end >> PAGE_SHIFT); 256 /* 257 * Free the usable memory, we have to make sure we do not free 258 * the bootmem bitmap so we then reserve it after freeing it :-) 259 */ 260 free_bootmem(memory_start, memory_end - memory_start); 261 reserve_bootmem(memory_start, bootmap_size); 262 263 /* 264 * Get kmalloc into gear. 265 */ 266 paging_init(); 267} 268 269/* 270 * Get CPU information for use by the procfs. 271 */ 272 273static int show_cpuinfo(struct seq_file *m, void *v) 274{ 275 char *cpu, *mmu, *fpu; 276 u_long clockfreq; 277 278 cpu = CPU; 279 mmu = "none"; 280 fpu = "none"; 281 282#ifdef CONFIG_COLDFIRE 283 clockfreq = (loops_per_jiffy*HZ)*3; 284#else 285 clockfreq = (loops_per_jiffy*HZ)*16; 286#endif 287 288 seq_printf(m, "CPU:\t\t%s\n" 289 "MMU:\t\t%s\n" 290 "FPU:\t\t%s\n" 291 "Clocking:\t%lu.%1luMHz\n" 292 "BogoMips:\t%lu.%02lu\n" 293 "Calibration:\t%lu loops\n", 294 cpu, mmu, fpu, 295 clockfreq/1000000,(clockfreq/100000)%10, 296 (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100, 297 (loops_per_jiffy*HZ)); 298 299 return 0; 300} 301 302static void *c_start(struct seq_file *m, loff_t *pos) 303{ 304 return *pos < NR_CPUS ? ((void *) 0x12345678) : NULL; 305} 306 307static void *c_next(struct seq_file *m, void *v, loff_t *pos) 308{ 309 ++*pos; 310 return c_start(m, pos); 311} 312 313static void c_stop(struct seq_file *m, void *v) 314{ 315} 316 317struct seq_operations cpuinfo_op = { 318 .start = c_start, 319 .next = c_next, 320 .stop = c_stop, 321 .show = show_cpuinfo, 322}; 323 324void arch_gettod(int *year, int *mon, int *day, int *hour, 325 int *min, int *sec) 326{ 327 if (mach_gettod) 328 mach_gettod(year, mon, day, hour, min, sec); 329 else 330 *year = *mon = *day = *hour = *min = *sec = 0; 331} 332