11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/arch/alpha/kernel/setup.c 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1995 Linus Torvalds 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2.3.x bootmem, 1999 Andrea Arcangeli <andrea@suse.de> */ 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bootup setup stuff. 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/stddef.h> 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/unistd.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ptrace.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/user.h> 21894673ee6122a3ce1958e1fe096901ba5356a96bJon Smirl#include <linux/screen_info.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mc146818rtc.h> 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/console.h> 25917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says#include <linux/cpu.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h> 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h> 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h> 30e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling#include <linux/platform_device.h> 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bootmem.h> 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h> 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/seq_file.h> 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/root_dev.h> 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/initrd.h> 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/eisa.h> 3722a9835c350782a5c3257343713932af3ac92ee0Dave Hansen#include <linux/pfn.h> 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MAGIC_SYSRQ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sysrq.h> 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/reboot.h> 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/notifier.h> 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/setup.h> 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h> 4574fd1b687fbeba566ceb59cc1fdbc7a64c5e0c0bRichard Henderson#include <linux/log2.h> 4600cd1176801d676607115fdda6e1f64b7e1ce02fPaul Gortmaker#include <linux/export.h> 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 48e041c683412d5bf44dc2b109053e3b837b71742dAlan Sternextern struct atomic_notifier_head panic_notifier_list; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int alpha_panic_event(struct notifier_block *, unsigned long, void *); 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct notifier_block alpha_panic_block = { 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_panic_event, 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds INT_MAX /* try to do it first */ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h> 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable.h> 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/hwrpb.h> 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/dma.h> 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mmu_context.h> 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/console.h> 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "proto.h" 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pci_impl.h" 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hwrpb_struct *hwrpb; 68cff52daffa080eff6353f44df418b080dacefb96Al ViroEXPORT_SYMBOL(hwrpb); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long srm_hae; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint alpha_l1i_cacheshape; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint alpha_l1d_cacheshape; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint alpha_l2_cacheshape; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint alpha_l3_cacheshape; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_VERBOSE_MCHECK 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 0=minimum, 1=verbose, 2=all */ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* These can be overridden via the command line, ie "verbose_mcheck=2") */ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 822258a5bb1064351b552aceaff29393967d694fa3Rusty Russell#ifdef CONFIG_NUMA 832258a5bb1064351b552aceaff29393967d694fa3Rusty Russellstruct cpumask node_to_cpumask_map[MAX_NUMNODES] __read_mostly; 842258a5bb1064351b552aceaff29393967d694fa3Rusty RussellEXPORT_SYMBOL(node_to_cpumask_map); 852258a5bb1064351b552aceaff29393967d694fa3Rusty Russell#endif 862258a5bb1064351b552aceaff29393967d694fa3Rusty Russell 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Which processor we booted from. */ 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint boot_cpuid; 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Using SRM callbacks for initial console output. This works from 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * setup_arch() time through the end of time_init(), as those places 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are under our (Alpha) control. 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "srmcons" specified in the boot command arguments allows us to 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * see kernel messages during the period of time before the true 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * console device is "registered" during console_init(). 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * As of this version (2.5.59), console_init() will call 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * disable_early_printk() as the last action before initializing 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the console drivers. That's the last possible time srmcons can be 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * unregistered without interfering with console behavior. 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * By default, OFF; set it with a bootcommand arg of "srmcons" or 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "console=srm". The meaning of these two args is: 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "srmcons" - early callback prints 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "console=srm" - full callback based console, including early prints 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint srmcons_output = 0; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Enforce a memory size limit; useful for testing. By default, none. */ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long mem_size_limit = 0; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Set AGP GART window size (0 means disabled). */ 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long alpha_agpgart_size = DEFAULT_AGP_APER_SIZE; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ALPHA_GENERIC 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct alpha_machine_vector alpha_mv; 118994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#endif 119994dcf7055df88623d25f3593b931a018a76b502Richard Henderson 120994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#ifndef alpha_using_srm 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint alpha_using_srm; 122cff52daffa080eff6353f44df418b080dacefb96Al ViroEXPORT_SYMBOL(alpha_using_srm); 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 125994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#ifndef alpha_using_qemu 126994dcf7055df88623d25f3593b931a018a76b502Richard Hendersonint alpha_using_qemu; 127994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#endif 128994dcf7055df88623d25f3593b931a018a76b502Richard Henderson 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long, 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long); 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct alpha_machine_vector *get_sysvec_byname(const char *); 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void get_sysnames(unsigned long, unsigned long, unsigned long, 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char **, char **); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void determine_cpu_caches (unsigned int); 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1363c253ca0f0930b767a5d6ac0c1b3c6f5619e28f9Alon Bar-Levstatic char __initdata command_line[COMMAND_LINE_SIZE]; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The format of "screen_info" is strange, and due to early 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * i386-setup code. This is just enough to make the console 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * code think we're on a VGA color display. 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct screen_info screen_info = { 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .orig_x = 0, 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .orig_y = 25, 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .orig_video_cols = 80, 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .orig_video_lines = 25, 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .orig_video_isVGA = 1, 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .orig_video_points = 16 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 153cff52daffa080eff6353f44df418b080dacefb96Al ViroEXPORT_SYMBOL(screen_info); 154cff52daffa080eff6353f44df418b080dacefb96Al Viro 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The direct map I/O window, if any. This should be the same 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for all busses, since it's used by virt_to_bus. 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __direct_map_base; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __direct_map_size; 162cff52daffa080eff6353f44df418b080dacefb96Al ViroEXPORT_SYMBOL(__direct_map_base); 163cff52daffa080eff6353f44df418b080dacefb96Al ViroEXPORT_SYMBOL(__direct_map_size); 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Declare all of the machine vectors. 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* GCC 2.7.2 (on alpha at least) is lame. It does not support either 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __attribute__((weak)) or #pragma weak. Bypass it and talk directly 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds to the assembler. */ 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define WEAK(X) \ 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds extern struct alpha_machine_vector X; \ 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds asm(".weak "#X) 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(alcor_mv); 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(alphabook1_mv); 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(avanti_mv); 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(cabriolet_mv); 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(clipper_mv); 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(dp264_mv); 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(eb164_mv); 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(eb64p_mv); 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(eb66_mv); 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(eb66p_mv); 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(eiger_mv); 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(jensen_mv); 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(lx164_mv); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(lynx_mv); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(marvel_ev7_mv); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(miata_mv); 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(mikasa_mv); 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(mikasa_primo_mv); 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(monet_mv); 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(nautilus_mv); 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(noname_mv); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(noritake_mv); 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(noritake_primo_mv); 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(p2k_mv); 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(pc164_mv); 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(privateer_mv); 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(rawhide_mv); 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(ruffian_mv); 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(rx164_mv); 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(sable_mv); 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(sable_gamma_mv); 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(shark_mv); 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(sx164_mv); 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(takara_mv); 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(titan_mv); 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(webbrick_mv); 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(wildfire_mv); 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(xl_mv); 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsWEAK(xlt_mv); 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef WEAK 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * I/O resources inherited from PeeCees. Except for perhaps the 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * turbochannel alphas, everyone has these on some sort of SuperIO chip. 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ??? If this becomes less standard, move the struct out into the 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * machine vector. 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsreserve_std_resources(void) 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct resource standard_io_resources[] = { 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "rtc", .start = -1, .end = -1 }, 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "dma1", .start = 0x00, .end = 0x1f }, 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "pic1", .start = 0x20, .end = 0x3f }, 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "timer", .start = 0x40, .end = 0x5f }, 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "keyboard", .start = 0x60, .end = 0x6f }, 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "dma page reg", .start = 0x80, .end = 0x8f }, 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "pic2", .start = 0xa0, .end = 0xbf }, 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .name = "dma2", .start = 0xc0, .end = 0xdf }, 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct resource *io = &ioport_resource; 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size_t i; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (hose_head) { 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pci_controller *hose; 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (hose = hose_head; hose; hose = hose->next) 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (hose->index == 0) { 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds io = hose->io_space; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fix up for the Jensen's queer RTC placement. */ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds standard_io_resources[0].start = RTC_PORT(0); 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds standard_io_resources[0].end = RTC_PORT(0) + 0x10; 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 25725c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser for (i = 0; i < ARRAY_SIZE(standard_io_resources); ++i) 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds request_resource(io, standard_io_resources+i); 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PFN_MAX PFN_DOWN(0x80000000) 262fb26b3e63e9685ce250377bf905c78425a8e8b2bRoel Kluin#define for_each_mem_cluster(memdesc, _cluster, i) \ 263fb26b3e63e9685ce250377bf905c78425a8e8b2bRoel Kluin for ((_cluster) = (memdesc)->cluster, (i) = 0; \ 264fb26b3e63e9685ce250377bf905c78425a8e8b2bRoel Kluin (i) < (memdesc)->numclusters; (i)++, (_cluster)++) 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned long __init 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsget_mem_size_limit(char *s) 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long end = 0; 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *from = s; 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = simple_strtoul(from, &from, 0); 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( *from == 'K' || *from == 'k' ) { 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = end << 10; 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds from++; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if ( *from == 'M' || *from == 'm' ) { 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = end << 20; 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds from++; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if ( *from == 'G' || *from == 'g' ) { 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = end << 30; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds from++; 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return end >> PAGE_SHIFT; /* Return the PFN of the limit. */ 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_INITRD 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid * __init 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmove_initrd(unsigned long mem_limit) 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *start; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long size; 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size = initrd_end - initrd_start; 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = __alloc_bootmem(PAGE_ALIGN(size), PAGE_SIZE, 0); 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!start || __pa(start) + size > mem_limit) { 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds initrd_start = initrd_end = 0; 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NULL; 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memmove(start, (void *)initrd_start, size); 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds initrd_start = (unsigned long)start; 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds initrd_end = initrd_start + size; 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("initrd moved to %p\n", start); 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return start; 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_DISCONTIGMEM 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssetup_memory(void *kernel_end) 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct memclust_struct * cluster; 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct memdesc_struct * memdesc; 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long start_kernel_pfn, end_kernel_pfn; 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long bootmap_size, bootmap_pages, bootmap_start; 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long start, end; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long i; 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Find free clusters, and init and free the bootmem accordingly. */ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memdesc = (struct memdesc_struct *) 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (hwrpb->mddt_offset + (unsigned long) hwrpb); 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for_each_mem_cluster(memdesc, cluster, i) { 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("memcluster %lu, usage %01lx, start %8lu, end %8lu\n", 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i, cluster->usage, cluster->start_pfn, 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cluster->start_pfn + cluster->numpages); 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Bit 0 is console/PALcode reserved. Bit 1 is 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds non-volatile memory -- we might want to mark 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds this for later. */ 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cluster->usage & 3) 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = cluster->start_pfn + cluster->numpages; 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (end > max_low_pfn) 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds max_low_pfn = end; 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Except for the NUMA systems (wildfire, marvel) all of the 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alpha systems we run on support 32GB of memory or less. 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Since the NUMA systems introduce large holes in memory addressing, 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * we can get into a situation where there is not enough contiguous 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * memory for the memory map. 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Limit memory to the first 32GB to limit the NUMA systems to 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * memory on their first node (wildfire) or 2 (marvel) to avoid 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * not being able to produce the memory map. In order to access 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * all of the memory on the NUMA systems, build with discontiguous 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * memory support. 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the user specified a memory limit, let that memory limit stand. 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!mem_size_limit) 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mem_size_limit = (32ul * 1024 * 1024 * 1024) >> PAGE_SHIFT; 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (mem_size_limit && max_low_pfn >= mem_size_limit) 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("setup: forcing memory size to %ldK (from %ldK).\n", 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mem_size_limit << (PAGE_SHIFT - 10), 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds max_low_pfn << (PAGE_SHIFT - 10)); 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds max_low_pfn = mem_size_limit; 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Find the bounds of kernel memory. */ 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start_kernel_pfn = PFN_DOWN(KERNEL_START_PHYS); 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end_kernel_pfn = PFN_UP(virt_to_phys(kernel_end)); 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bootmap_start = -1; 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds try_again: 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (max_low_pfn <= end_kernel_pfn) 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds panic("not enough memory to boot"); 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We need to know how many physically contiguous pages 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds we'll need for the bootmap. */ 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bootmap_pages = bootmem_bootmap_pages(max_low_pfn); 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Now find a good region where to allocate the bootmap. */ 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for_each_mem_cluster(memdesc, cluster, i) { 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cluster->usage & 3) 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = cluster->start_pfn; 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = start + cluster->numpages; 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (start >= max_low_pfn) 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (end > max_low_pfn) 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = max_low_pfn; 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (start < start_kernel_pfn) { 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (end > end_kernel_pfn 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds && end - end_kernel_pfn >= bootmap_pages) { 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bootmap_start = end_kernel_pfn; 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (end > start_kernel_pfn) 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = start_kernel_pfn; 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (start < end_kernel_pfn) 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = end_kernel_pfn; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (end - start >= bootmap_pages) { 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bootmap_start = start; 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (bootmap_start == ~0UL) { 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds max_low_pfn >>= 1; 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto try_again; 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Allocate the bootmap and mark the whole MM as reserved. */ 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bootmap_size = init_bootmem(bootmap_start, max_low_pfn); 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Mark the free regions. */ 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for_each_mem_cluster(memdesc, cluster, i) { 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cluster->usage & 3) 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = cluster->start_pfn; 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = cluster->start_pfn + cluster->numpages; 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (start >= max_low_pfn) 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (end > max_low_pfn) 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = max_low_pfn; 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (start < start_kernel_pfn) { 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (end > end_kernel_pfn) { 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free_bootmem(PFN_PHYS(start), 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (PFN_PHYS(start_kernel_pfn) 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds - PFN_PHYS(start))); 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("freeing pages %ld:%ld\n", 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start, start_kernel_pfn); 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = end_kernel_pfn; 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (end > start_kernel_pfn) 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds end = start_kernel_pfn; 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (start < end_kernel_pfn) 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = end_kernel_pfn; 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (start >= end) 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free_bootmem(PFN_PHYS(start), PFN_PHYS(end) - PFN_PHYS(start)); 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("freeing pages %ld:%ld\n", start, end); 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Reserve the bootmap memory. */ 44272a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle reserve_bootmem(PFN_PHYS(bootmap_start), bootmap_size, 44372a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle BOOTMEM_DEFAULT); 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_INITRD 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds initrd_start = INITRD_START; 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (initrd_start) { 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds initrd_end = initrd_start+INITRD_SIZE; 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Initial ramdisk at: 0x%p (%lu bytes)\n", 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (void *) initrd_start, INITRD_SIZE); 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((void *)initrd_end > phys_to_virt(PFN_PHYS(max_low_pfn))) { 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!move_initrd(PFN_PHYS(max_low_pfn))) 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("initrd extends beyond end of memory " 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "(0x%08lx > 0x%p)\ndisabling initrd\n", 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds initrd_end, 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds phys_to_virt(PFN_PHYS(max_low_pfn))); 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserve_bootmem(virt_to_phys((void *)initrd_start), 46172a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle INITRD_SIZE, BOOTMEM_DEFAULT); 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_BLK_DEV_INITRD */ 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void setup_memory(void *); 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !CONFIG_DISCONTIGMEM */ 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __init 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldspage_is_ram(unsigned long pfn) 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct memclust_struct * cluster; 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct memdesc_struct * memdesc; 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long i; 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memdesc = (struct memdesc_struct *) 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (hwrpb->mddt_offset + (unsigned long) hwrpb); 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for_each_mem_cluster(memdesc, cluster, i) 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pfn >= cluster->start_pfn && 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pfn < cluster->start_pfn + cluster->numpages) { 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (cluster->usage & 3) ? 0 : 1; 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 490917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain saysstatic int __init 491917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain saysregister_cpus(void) 492917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says{ 493917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says int i; 494917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says 495917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says for_each_possible_cpu(i) { 496917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL); 497917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says if (!p) 498917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says return -ENOMEM; 49976b67ed9dce69a6a329cdd66f94af1787f417b62KAMEZAWA Hiroyuki register_cpu(p, i); 500917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says } 501917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says return 0; 502917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says} 503917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says 504917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain saysarch_initcall(register_cpus); 505917b1f78a9871a1985004df09ed1eb2e0dc3bf4fBrian Uhrain says 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssetup_arch(char **cmdline_p) 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds extern char _end[]; 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct alpha_machine_vector *vec = NULL; 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct percpu_struct *cpu; 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *type_name, *var_name, *p; 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *kernel_end = _end; /* end of kernel */ 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *args = command_line; 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb = (struct hwrpb_struct*) __va(INIT_HWRPB->phys_addr); 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds boot_cpuid = hard_smp_processor_id(); 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Pre-process the system type to make sure it will be valid. 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This may restore real CABRIO and EB66+ family names, ie 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * EB64+ and EB66. 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Oh, and "white box" AS800 (aka DIGITAL Server 3000 series) 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and AS1200 (DIGITAL Server 5000 series) have the type as 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the negative of the real one. 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((long)hwrpb->sys_type < 0) { 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb->sys_type = -((long)hwrpb->sys_type); 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb_update_checksum(hwrpb); 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Register a call for panic conditions. */ 536e041c683412d5bf44dc2b109053e3b837b71742dAlan Stern atomic_notifier_chain_register(&panic_notifier_list, 537e041c683412d5bf44dc2b109053e3b837b71742dAlan Stern &alpha_panic_block); 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 539994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#ifndef alpha_using_srm 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Assume that we've booted from SRM if we haven't booted from MILO. 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Detect the later by looking for "MILO" in the system serial nr. */ 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_using_srm = strncmp((const char *)hwrpb->ssn, "MILO", 4) != 0; 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 544994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#ifndef alpha_using_qemu 545994dcf7055df88623d25f3593b931a018a76b502Richard Henderson /* Similarly, look for QEMU. */ 546994dcf7055df88623d25f3593b931a018a76b502Richard Henderson alpha_using_qemu = strstr((const char *)hwrpb->ssn, "QEMU") != 0; 547994dcf7055df88623d25f3593b931a018a76b502Richard Henderson#endif 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we are using SRM, we want to allow callbacks 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds as early as possible, so do this NOW, and then 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds they should work immediately thereafter. 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kernel_end = callback_init(kernel_end); 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Locate the command line. 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Hack for Jensen... since we're restricted to 8 or 16 chars for 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds boot flags depending on the boot mode, we need some shorthand. 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds This should do for installation. */ 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(COMMAND_LINE, "INSTALL") == 0) { 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(command_line, "root=/dev/fd0 load_ramdisk=1", sizeof command_line); 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(command_line, COMMAND_LINE, sizeof command_line); 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5663c253ca0f0930b767a5d6ac0c1b3c6f5619e28f9Alon Bar-Lev strcpy(boot_command_line, command_line); 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *cmdline_p = command_line; 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Process command-line arguments. 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while ((p = strsep(&args, " \t")) != NULL) { 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!*p) continue; 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "alpha_mv=", 9) == 0) { 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = get_sysvec_byname(p+9); 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "cycle=", 6) == 0) { 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds est_cycle_freq = simple_strtol(p+6, NULL, 0); 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "mem=", 4) == 0) { 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mem_size_limit = get_mem_size_limit(p+4); 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "srmcons", 7) == 0) { 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srmcons_output |= 1; 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "console=srm", 11) == 0) { 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srmcons_output |= 2; 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "gartsize=", 9) == 0) { 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_agpgart_size = 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_mem_size_limit(p+9) << PAGE_SHIFT; 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_VERBOSE_MCHECK 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(p, "verbose_mcheck=", 15) == 0) { 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_verbose_mcheck = simple_strtol(p+15, NULL, 0); 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Replace the command line, now that we've killed it with strsep. */ 6083c253ca0f0930b767a5d6ac0c1b3c6f5619e28f9Alon Bar-Lev strcpy(command_line, boot_command_line); 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we want SRM console printk echoing early, do it now. */ 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (alpha_using_srm && srmcons_output) { 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds register_srm_console(); 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If "console=srm" was specified, clear the srmcons_output 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * flag now so that time.c won't unregister_srm_console 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (srmcons_output & 2) 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srmcons_output = 0; 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MAGIC_SYSRQ 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we're using SRM, make sysrq-b halt back to the prom, 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds not auto-reboot. */ 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (alpha_using_srm) { 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sysrq_key_op *op = __sysrq_get_key_op('b'); 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds op->handler = (void *) machine_halt; 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Identify and reconfigure for the current system. 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset); 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_sysnames(hwrpb->sys_type, hwrpb->sys_variation, 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu->type, &type_name, &var_name); 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (*var_name == '0') 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var_name = ""; 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!vec) { 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = get_sysvec(hwrpb->sys_type, hwrpb->sys_variation, 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu->type); 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!vec) { 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds panic("Unsupported system type: %s%s%s (%ld %ld)\n", 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds type_name, (*var_name ? " variation " : ""), var_name, 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb->sys_type, hwrpb->sys_variation); 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (vec != &alpha_mv) { 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_mv = *vec; 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Booting " 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ALPHA_GENERIC 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "GENERIC " 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "on %s%s%s using machine vector %s from %s\n", 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds type_name, (*var_name ? " variation " : ""), 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var_name, alpha_mv.vector_name, 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (alpha_using_srm ? "SRM" : "MILO")); 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Major Options: " 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_SMP 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "SMP " 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ALPHA_EV56 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "EV56 " 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ALPHA_EV67 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "EV67 " 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "LEGACY_START " 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_VERBOSE_MCHECK 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "VERBOSE_MCHECK " 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_DISCONTIGMEM 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "DISCONTIGMEM " 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_NUMA 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "NUMA " 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_DEBUG_SPINLOCK 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "DEBUG_SPINLOCK " 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MAGIC_SYSRQ 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "MAGIC_SYSRQ " 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "\n"); 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Command line: %s\n", command_line); 6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Sync up the HAE. 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Save the SRM's current value for restoration. 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srm_hae = *alpha_mv.hae_register; 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __set_hae(alpha_mv.hae_cache); 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Reset enable correctable error reports. */ 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wrmces(0x7); 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Find our memory. */ 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds setup_memory(kernel_end); 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* First guess at cpu cache sizes. Do this before init_arch. */ 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds determine_cpu_caches(cpu->type); 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Initialize the machine. Usually has to do with setting up 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DMA windows and the like. */ 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (alpha_mv.init_arch) 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_mv.init_arch(); 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Reserve standard resources. */ 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserve_std_resources(); 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Give us a default console. TGA users will see nothing until 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * chr_dev_init is called, rather late in the boot sequence. 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_VT 7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_VGA_CONSOLE) 7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds conswitchp = &vga_con; 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(CONFIG_DUMMY_CONSOLE) 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds conswitchp = &dummy_con; 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Default root filesystem to sda2. */ 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ROOT_DEV = Root_SDA2; 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_EISA 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* FIXME: only set this when we actually have EISA in this box? */ 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EISA_bus = 1; 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Check ASN in HWRPB for validity, report if bad. 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FIXME: how was this failing? Should we trust it instead, 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and copy the value into alpha_mv.max_asn? 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (hwrpb->max_asn != MAX_ASN) { 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Max ASN from HWRPB is bad (0x%lx)\n", hwrpb->max_asn); 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Identify the flock of penguins. 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_SMP 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds setup_smp(); 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds paging_init(); 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char sys_unknown[] = "Unknown"; 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char systype_names[][16] = { 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "0", 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "ADU", "Cobra", "Ruby", "Flamingo", "Mannequin", "Jensen", 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Pelican", "Morgan", "Sable", "Medulla", "Noname", 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Turbolaser", "Avanti", "Mustang", "Alcor", "Tradewind", 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Mikasa", "EB64", "EB66", "EB64+", "AlphaBook1", 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Rawhide", "K2", "Lynx", "XL", "EB164", "Noritake", 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Cortex", "29", "Miata", "XXM", "Takara", "Yukon", 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Tsunami", "Wildfire", "CUSCO", "Eiger", "Titan", "Marvel" 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char unofficial_names[][8] = {"100", "Ruffian"}; 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char api_names[][16] = {"200", "Nautilus"}; 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char eb164_names[][8] = {"EB164", "PC164", "LX164", "SX164", "RX164"}; 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int eb164_indices[] = {0,0,0,1,1,1,1,1,2,2,2,2,3,3,3,3,4}; 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char alcor_names[][16] = {"Alcor", "Maverick", "Bret"}; 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int alcor_indices[] = {0,0,0,1,1,1,0,0,0,0,0,0,2,2,2,2,2,2}; 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char eb64p_names[][16] = {"EB64+", "Cabriolet", "AlphaPCI64"}; 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int eb64p_indices[] = {0,0,1,2}; 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char eb66_names[][8] = {"EB66", "EB66+"}; 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int eb66_indices[] = {0,0,1}; 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char marvel_names[][16] = { 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Marvel/EV7" 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int marvel_indices[] = { 0 }; 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char rawhide_names[][16] = { 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Dodge", "Wrangler", "Durango", "Tincup", "DaVinci" 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int rawhide_indices[] = {0,0,0,1,1,2,2,3,3,4,4}; 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char titan_names[][16] = { 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "DEFAULT", "Privateer", "Falcon", "Granite" 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int titan_indices[] = {0,1,2,2,3}; 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char tsunami_names[][16] = { 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "0", "DP264", "Warhol", "Windjammer", "Monet", "Clipper", 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Goldrush", "Webbrick", "Catamaran", "Brisbane", "Melbourne", 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Flying Clipper", "Shark" 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tsunami_indices[] = {0,1,2,3,4,5,6,7,8,9,10,11,12}; 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct alpha_machine_vector * __init 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsget_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *systype_vecs[] __initdata = 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* 0 */ 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* ADU */ 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Cobra */ 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Ruby */ 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Flamingo */ 8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Mannequin */ 8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &jensen_mv, 8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Pelican */ 8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Morgan */ 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Sable -- see below. */ 8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Medulla */ 8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &noname_mv, 8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Turbolaser */ 8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &avanti_mv, 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Mustang */ 8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Alcor, Bret, Maverick. HWRPB inaccurate? */ 8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Tradewind */ 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Mikasa -- see below. */ 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* EB64 */ 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* EB66 -- see variation. */ 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* EB64+ -- see variation. */ 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &alphabook1_mv, 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &rawhide_mv, 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* K2 */ 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &lynx_mv, /* Lynx */ 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &xl_mv, 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* EB164 -- see variation. */ 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Noritake -- see below. */ 8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Cortex */ 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* 29 */ 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &miata_mv, 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* XXM */ 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &takara_mv, 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Yukon */ 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Tsunami -- see variation. */ 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &wildfire_mv, /* Wildfire */ 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* CUSCO */ 8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eiger_mv, /* Eiger */ 8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Titan */ 8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* Marvel */ 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *unofficial_vecs[] __initdata = 8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* 100 */ 8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &ruffian_mv, 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *api_vecs[] __initdata = 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* 200 */ 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &nautilus_mv, 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *alcor_vecs[] __initdata = 8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &alcor_mv, &xlt_mv, &xlt_mv 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *eb164_vecs[] __initdata = 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb164_mv, &pc164_mv, &lx164_mv, &sx164_mv, &rx164_mv 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *eb64p_vecs[] __initdata = 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb64p_mv, 8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &cabriolet_mv, 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &cabriolet_mv /* AlphaPCI64 */ 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *eb66_vecs[] __initdata = 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb66_mv, 8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb66p_mv 8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *marvel_vecs[] __initdata = 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &marvel_ev7_mv, 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *titan_vecs[] __initdata = 9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &titan_mv, /* default */ 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &privateer_mv, /* privateer */ 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &titan_mv, /* falcon */ 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &privateer_mv, /* granite */ 9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *tsunami_vecs[] __initdata = 9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, 9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &dp264_mv, /* dp264 */ 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &dp264_mv, /* warhol */ 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &dp264_mv, /* windjammer */ 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &monet_mv, /* monet */ 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &clipper_mv, /* clipper */ 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &dp264_mv, /* goldrush */ 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &webbrick_mv, /* webbrick */ 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &dp264_mv, /* catamaran */ 9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* brisbane? */ 9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* melbourne? */ 9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL, /* flying clipper? */ 9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &shark_mv, /* shark */ 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* ??? Do we need to distinguish between Rawhides? */ 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct alpha_machine_vector *vec; 9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Search the system tables first... */ 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = NULL; 93125c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (type < ARRAY_SIZE(systype_vecs)) { 9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = systype_vecs[type]; 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if ((type > ST_API_BIAS) && 93425c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser (type - ST_API_BIAS) < ARRAY_SIZE(api_vecs)) { 9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = api_vecs[type - ST_API_BIAS]; 9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if ((type > ST_UNOFFICIAL_BIAS) && 93725c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_vecs)) { 9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS]; 9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we've not found one, try for a variation. */ 9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!vec) { 9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Member ID is a bit-field. */ 9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long member = (variation >> 10) & 0x3f; 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu &= 0xffffffff; /* make it usable */ 9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (type) { 9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_ALCOR: 95125c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(alcor_indices)) 9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = alcor_vecs[alcor_indices[member]]; 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_EB164: 95525c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(eb164_indices)) 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = eb164_vecs[eb164_indices[member]]; 9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PC164 may show as EB164 variation with EV56 CPU, 9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds but, since no true EB164 had anything but EV5... */ 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (vec == &eb164_mv && cpu == EV56_CPU) 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &pc164_mv; 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_EB64P: 96325c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(eb64p_indices)) 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = eb64p_vecs[eb64p_indices[member]]; 9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_EB66: 96725c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(eb66_indices)) 9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = eb66_vecs[eb66_indices[member]]; 9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_MARVEL: 97125c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(marvel_indices)) 9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = marvel_vecs[marvel_indices[member]]; 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_TITAN: 9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = titan_vecs[0]; /* default */ 97625c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(titan_indices)) 9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = titan_vecs[titan_indices[member]]; 9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_TSUNAMI: 98025c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(tsunami_indices)) 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = tsunami_vecs[tsunami_indices[member]]; 9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_1000: 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu == EV5_CPU || cpu == EV56_CPU) 9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &mikasa_primo_mv; 9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &mikasa_mv; 9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_NORITAKE: 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu == EV5_CPU || cpu == EV56_CPU) 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &noritake_primo_mv; 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &noritake_mv; 9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_2100_A500: 9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu == EV5_CPU || cpu == EV56_CPU) 9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &sable_gamma_mv; 9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vec = &sable_mv; 10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return vec; 10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct alpha_machine_vector * __init 10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsget_sysvec_byname(const char *name) 10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct alpha_machine_vector *all_vecs[] __initdata = 10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &alcor_mv, 10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &alphabook1_mv, 10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &avanti_mv, 10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &cabriolet_mv, 10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &clipper_mv, 10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &dp264_mv, 10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb164_mv, 10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb64p_mv, 10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb66_mv, 10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eb66p_mv, 10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &eiger_mv, 10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &jensen_mv, 10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &lx164_mv, 10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &lynx_mv, 10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &miata_mv, 10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &mikasa_mv, 10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &mikasa_primo_mv, 10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &monet_mv, 10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &nautilus_mv, 10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &noname_mv, 10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &noritake_mv, 10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &noritake_primo_mv, 10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &p2k_mv, 10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &pc164_mv, 10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &privateer_mv, 10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &rawhide_mv, 10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &ruffian_mv, 10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &rx164_mv, 10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sable_mv, 10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sable_gamma_mv, 10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &shark_mv, 10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sx164_mv, 10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &takara_mv, 10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &webbrick_mv, 10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &wildfire_mv, 10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &xl_mv, 10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &xlt_mv 10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size_t i; 10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 105225c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser for (i = 0; i < ARRAY_SIZE(all_vecs); ++i) { 10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct alpha_machine_vector *mv = all_vecs[i]; 10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcasecmp(mv->vector_name, name) == 0) 10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mv; 10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NULL; 10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsget_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, 10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char **type_name, char **variation_name) 10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long member; 10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If not in the tables, make it UNKNOWN, 10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else set type name to family */ 106825c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (type < ARRAY_SIZE(systype_names)) { 10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *type_name = systype_names[type]; 10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if ((type > ST_API_BIAS) && 107125c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser (type - ST_API_BIAS) < ARRAY_SIZE(api_names)) { 10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *type_name = api_names[type - ST_API_BIAS]; 10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if ((type > ST_UNOFFICIAL_BIAS) && 107425c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) { 10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS]; 10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *type_name = sys_unknown; 10781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = sys_unknown; 10791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 10801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Set variation to "0"; if variation is zero, done. */ 10831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = systype_names[0]; 10841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (variation == 0) { 10851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 10861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds member = (variation >> 10) & 0x3f; /* member ID is a bit-field */ 10891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu &= 0xffffffff; /* make it usable */ 10911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (type) { /* select by family */ 10931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: /* default to variation "0" for now */ 10941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 10951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_EB164: 109625c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(eb164_indices)) 10971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = eb164_names[eb164_indices[member]]; 10981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PC164 may show as EB164 variation, but with EV56 CPU, 10991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds so, since no true EB164 had anything but EV5... */ 11001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (eb164_indices[member] == 0 && cpu == EV56_CPU) 11011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = eb164_names[1]; /* make it PC164 */ 11021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_ALCOR: 110425c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(alcor_indices)) 11051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = alcor_names[alcor_indices[member]]; 11061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_EB64P: 110825c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(eb64p_indices)) 11091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = eb64p_names[eb64p_indices[member]]; 11101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_EB66: 111225c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(eb66_indices)) 11131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = eb66_names[eb66_indices[member]]; 11141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_MARVEL: 111625c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(marvel_indices)) 11171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = marvel_names[marvel_indices[member]]; 11181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_RAWHIDE: 112025c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(rawhide_indices)) 11211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = rawhide_names[rawhide_indices[member]]; 11221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_TITAN: 11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = titan_names[0]; /* default */ 112525c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(titan_indices)) 11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = titan_names[titan_indices[member]]; 11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ST_DEC_TSUNAMI: 112925c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (member < ARRAY_SIZE(tsunami_indices)) 11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *variation_name = tsunami_names[tsunami_indices[member]]; 11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A change was made to the HWRPB via an ECO and the following code 11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * tracks a part of the ECO. In HWRPB versions less than 5, the ECO 11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * was not implemented in the console firmware. If it's revision 5 or 11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * greater we can get the name of the platform as an ASCII string from 11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the HWRPB. That's what this function does. It checks the revision 11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * level and if the string is in the HWRPB it returns the address of 11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the string--a pointer to the name of the platform. 11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns: 11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Pointer to a ASCII string if it's in the HWRPB 11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Pointer to a blank string if the data is not in the HWRPB. 11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char * 11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsplatform_string(void) 11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct dsr_struct *dsr; 11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static char unk_system_string[] = "N/A"; 11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Go to the console for the string pointer. 11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the rpb_vers is not 5 or greater the rpb 11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is old and does not have this data in it. 11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (hwrpb->revision < 5) 11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (unk_system_string); 11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* The Dynamic System Recognition struct 11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * has the system platform name starting 11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * after the character count of the string. 11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 11661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dsr = ((struct dsr_struct *) 11671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((char *)hwrpb + hwrpb->dsr_offset)); 11681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ((char *)dsr + (dsr->sysname_off + 11691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sizeof(long))); 11701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 11741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsget_nr_processors(struct percpu_struct *cpubase, unsigned long num) 11751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct percpu_struct *cpu; 11771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long i; 11781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int count = 0; 11791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < num; i++) { 11811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu = (struct percpu_struct *) 11821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((char *)cpubase + i*hwrpb->processor_size); 11831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((cpu->flags & 0x1cc) == 0x1cc) 11841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds count++; 11851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 11871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 11901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsshow_cache_size (struct seq_file *f, const char *which, int shape) 11911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (shape == -1) 11931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds seq_printf (f, "%s\t\t: n/a\n", which); 11941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (shape == 0) 11951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds seq_printf (f, "%s\t\t: unknown\n", which); 11961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 11971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds seq_printf (f, "%s\t\t: %dK, %d-way, %db line\n", 11981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds which, shape >> 10, shape & 15, 11991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1 << ((shape >> 4) & 15)); 12001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 12031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsshow_cpuinfo(struct seq_file *f, void *slot) 12041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 12051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds extern struct unaligned_stat { 12061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long count, va, pc; 12071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } unaligned[2]; 12081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static char cpu_names[][8] = { 12101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "EV3", "EV4", "Simulate", "LCA4", "EV5", "EV45", "EV56", 12111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "EV6", "PCA56", "PCA57", "EV67", "EV68CB", "EV68AL", 12121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "EV68CX", "EV7", "EV79", "EV69" 12131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 12141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct percpu_struct *cpu = slot; 12161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int cpu_index; 12171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *cpu_name; 12181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *systype_name; 12191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *sysvariation_name; 12201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int nr_processors; 1221fddd87d6e135924b92499917bace103e46c22d00Richard Henderson unsigned long timer_freq; 12221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_index = (unsigned) (cpu->type - 1); 12241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_name = "Unknown"; 122525c8716cb08dea386c7d6220b82eba732ccbf976Tobias Klauser if (cpu_index < ARRAY_SIZE(cpu_names)) 12261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_name = cpu_names[cpu_index]; 12271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_sysnames(hwrpb->sys_type, hwrpb->sys_variation, 12291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu->type, &systype_name, &sysvariation_name); 12301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nr_processors = get_nr_processors(cpu, hwrpb->nr_processors); 12321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1233fddd87d6e135924b92499917bace103e46c22d00Richard Henderson#if CONFIG_HZ == 1024 || CONFIG_HZ == 1200 1234fddd87d6e135924b92499917bace103e46c22d00Richard Henderson timer_freq = (100UL * hwrpb->intr_freq) / 4096; 1235fddd87d6e135924b92499917bace103e46c22d00Richard Henderson#else 1236fddd87d6e135924b92499917bace103e46c22d00Richard Henderson timer_freq = 100UL * CONFIG_HZ; 1237fddd87d6e135924b92499917bace103e46c22d00Richard Henderson#endif 1238fddd87d6e135924b92499917bace103e46c22d00Richard Henderson 12391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds seq_printf(f, "cpu\t\t\t: Alpha\n" 12401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cpu model\t\t: %s\n" 12411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cpu variation\t\t: %ld\n" 12421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cpu revision\t\t: %ld\n" 12431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cpu serial number\t: %s\n" 12441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "system type\t\t: %s\n" 12451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "system variation\t: %s\n" 12461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "system revision\t\t: %ld\n" 12471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "system serial number\t: %s\n" 12481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cycle frequency [Hz]\t: %lu %s\n" 12491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "timer frequency [Hz]\t: %lu.%02lu\n" 12501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "page size [bytes]\t: %ld\n" 12511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "phys. address bits\t: %ld\n" 12521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "max. addr. space #\t: %ld\n" 12531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "BogoMIPS\t\t: %lu.%02lu\n" 12541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "kernel unaligned acc\t: %ld (pc=%lx,va=%lx)\n" 12551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "user unaligned acc\t: %ld (pc=%lx,va=%lx)\n" 12561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "platform string\t\t: %s\n" 12571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cpus detected\t\t: %d\n", 12581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_name, cpu->variation, cpu->revision, 12591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (char*)cpu->serial_no, 12601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds systype_name, sysvariation_name, hwrpb->sys_revision, 12611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (char*)hwrpb->ssn, 12621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds est_cycle_freq ? : hwrpb->cycle_freq, 12631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds est_cycle_freq ? "est." : "", 1264fddd87d6e135924b92499917bace103e46c22d00Richard Henderson timer_freq / 100, timer_freq % 100, 12651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb->pagesize, 12661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb->pa_bits, 12671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hwrpb->max_asn, 12681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds loops_per_jiffy / (500000/HZ), 12691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (loops_per_jiffy / (5000/HZ)) % 100, 12701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unaligned[0].count, unaligned[0].pc, unaligned[0].va, 12711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unaligned[1].count, unaligned[1].pc, unaligned[1].va, 12721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds platform_string(), nr_processors); 12731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_SMP 12755f0e3da6e186598bbd2569410ab60fa645ba00c9Randy Dunlap seq_printf(f, "cpus active\t\t: %u\n" 12761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cpu active mask\t\t: %016lx\n", 127781740fc6b2144f5d197affb10f3c4062fddf21e4KOSAKI Motohiro num_online_cpus(), cpumask_bits(cpu_possible_mask)[0]); 12781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 12791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_cache_size (f, "L1 Icache", alpha_l1i_cacheshape); 12811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_cache_size (f, "L1 Dcache", alpha_l1d_cacheshape); 12821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_cache_size (f, "L2 cache", alpha_l2_cacheshape); 12831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_cache_size (f, "L3 cache", alpha_l3_cacheshape); 12841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 12861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init 12891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsread_mem_block(int *addr, int stride, int size) 12901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 12911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds long nloads = size / stride, cnt, tmp; 12921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __asm__ __volatile__( 12941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " rpcc %0\n" 12951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "1: ldl %3,0(%2)\n" 12961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " subq %1,1,%1\n" 12971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Next two XORs introduce an explicit data dependency between 12981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds consecutive loads in the loop, which will give us true load 12991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds latency. */ 13001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " xor %3,%2,%2\n" 13011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " xor %3,%2,%2\n" 13021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " addq %2,%4,%2\n" 13031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " bne %1,1b\n" 13041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " rpcc %3\n" 13051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " subl %3,%0,%0\n" 13061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds : "=&r" (cnt), "=&r" (nloads), "=&r" (addr), "=&r" (tmp) 13071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds : "r" (stride), "1" (nloads), "2" (addr)); 13081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cnt / (size / stride); 13101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CSHAPE(totalsize, linesize, assoc) \ 13131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((totalsize & ~0xff) | (linesize << 4) | assoc) 13141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ??? EV5 supports up to 64M, but did the systems with more than 13161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16M of BCACHE ever exist? */ 13171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_BCACHE_SIZE 16*1024*1024 13181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Note that the offchip caches are direct mapped on all Alphas. */ 13201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init 13211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsexternal_cache_probe(int minsize, int width) 13221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int cycles, prev_cycles = 1000000; 13241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int stride = 1 << width; 13251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds long size = minsize, maxsize = MAX_BCACHE_SIZE * 2; 13261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (maxsize > (max_low_pfn + 1) << PAGE_SHIFT) 132874fd1b687fbeba566ceb59cc1fdbc7a64c5e0c0bRichard Henderson maxsize = 1 << (ilog2(max_low_pfn + 1) + PAGE_SHIFT); 13291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Get the first block cached. */ 13311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds read_mem_block(__va(0), stride, size); 13321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (size < maxsize) { 13341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Get an average load latency in cycles. */ 13351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cycles = read_mem_block(__va(0), stride, size); 13361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cycles > prev_cycles * 2) { 13371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fine, we exceed the cache. */ 13381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("%ldK Bcache detected; load hit latency %d " 13391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cycles, load miss latency %d cycles\n", 13401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size >> 11, prev_cycles, cycles); 13411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return CSHAPE(size >> 1, width, 1); 13421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Try to get the next block cached. */ 13441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds read_mem_block(__va(size), stride, size); 13451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prev_cycles = cycles; 13461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size <<= 1; 13471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -1; /* No BCACHE found. */ 13491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init 13521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdetermine_cpu_caches (unsigned int cpu_type) 13531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int L1I, L1D, L2, L3; 13551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (cpu_type) { 13571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV4_CPU: 13581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV45_CPU: 13591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 13601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu_type == EV4_CPU) 13611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = CSHAPE(8*1024, 5, 1); 13621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 13631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = CSHAPE(16*1024, 5, 1); 13641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1D = L1I; 13651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = -1; 13661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* BIU_CTL is a write-only Abox register. PALcode has a 13681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds shadow copy, and may be available from some versions 13691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds of the CSERVE PALcall. If we can get it, then 13701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long biu_ctl, size; 13721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size = 128*1024 * (1 << ((biu_ctl >> 28) & 7)); 13731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = CSHAPE (size, 5, 1); 13741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Unfortunately, we can't rely on that. 13761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 13771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = external_cache_probe(128*1024, 5); 13781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 13791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LCA4_CPU: 13821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 13831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long car, size; 13841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = L1D = CSHAPE(8*1024, 5, 1); 13861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = -1; 13871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds car = *(vuip) phys_to_virt (0x120000078UL); 13891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size = 64*1024 * (1 << ((car >> 5) & 7)); 13901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* No typo -- 8 byte cacheline size. Whodathunk. */ 13911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = (car & 1 ? CSHAPE (size, 3, 1) : -1); 13921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 13931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV5_CPU: 13961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV56_CPU: 13971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 13981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long sc_ctl, width; 13991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = L1D = CSHAPE(8*1024, 5, 1); 14011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check the line size of the Scache. */ 14031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sc_ctl = *(vulp) phys_to_virt (0xfffff000a8UL); 14041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds width = sc_ctl & 0x1000 ? 6 : 5; 14051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = CSHAPE (96*1024, width, 3); 14061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* BC_CONTROL and BC_CONFIG are write-only IPRs. PALcode 14081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds has a shadow copy, and may be available from some versions 14091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds of the CSERVE PALcall. If we can get it, then 14101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long bc_control, bc_config, size; 14121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size = 1024*1024 * (1 << ((bc_config & 7) - 1)); 14131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = (bc_control & 1 ? CSHAPE (size, width, 1) : -1); 14141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Unfortunately, we can't rely on that. 14161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = external_cache_probe(1024*1024, width); 14181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 14201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case PCA56_CPU: 14221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case PCA57_CPU: 14231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 14241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu_type == PCA56_CPU) { 14251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = CSHAPE(16*1024, 6, 1); 14261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1D = CSHAPE(8*1024, 5, 1); 14271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 14281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = CSHAPE(32*1024, 6, 2); 14291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1D = CSHAPE(16*1024, 5, 1); 14301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 14311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = -1; 14321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1433280da4e4d306667b7faa95152b54f7ca4266ff1eRichard Henderson#if 0 1434280da4e4d306667b7faa95152b54f7ca4266ff1eRichard Henderson unsigned long cbox_config, size; 1435280da4e4d306667b7faa95152b54f7ca4266ff1eRichard Henderson 14361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cbox_config = *(vulp) phys_to_virt (0xfffff00008UL); 14371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size = 512*1024 * (1 << ((cbox_config >> 12) & 3)); 14381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = ((cbox_config >> 31) & 1 ? CSHAPE (size, 6, 1) : -1); 14401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 14411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = external_cache_probe(512*1024, 6); 14421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 14431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 14451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV6_CPU: 14471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV67_CPU: 14481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV68CB_CPU: 14491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV68AL_CPU: 14501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV68CX_CPU: 14511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV69_CPU: 14521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = L1D = CSHAPE(64*1024, 6, 2); 14531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = external_cache_probe(1024*1024, 6); 14541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = -1; 14551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV7_CPU: 14581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case EV79_CPU: 14591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = L1D = CSHAPE(64*1024, 6, 2); 14601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L2 = CSHAPE(7*1024*1024/4, 6, 7); 14611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L3 = -1; 14621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 14651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Nothing known about this cpu type. */ 14661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds L1I = L1D = L2 = L3 = 0; 14671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 14691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_l1i_cacheshape = L1I; 14711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_l1d_cacheshape = L1D; 14721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_l2_cacheshape = L2; 14731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds alpha_l3_cacheshape = L3; 14741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 14771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We show only CPU #0 info. 14781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void * 14801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsc_start(struct seq_file *f, loff_t *pos) 14811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return *pos ? NULL : (char *)hwrpb + hwrpb->processor_offset; 14831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void * 14861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsc_next(struct seq_file *f, void *v, loff_t *pos) 14871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NULL; 14891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 14921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsc_stop(struct seq_file *f, void *v) 14931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 149603a44825be987d720df854f63b2f7bd30e46bddeJan Engelhardtconst struct seq_operations cpuinfo_op = { 14971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .start = c_start, 14981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .next = c_next, 14991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .stop = c_stop, 15001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .show = show_cpuinfo, 15011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 15021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 15051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsalpha_panic_event(struct notifier_block *this, unsigned long event, void *ptr) 15061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 15071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 1 15081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* FIXME FIXME FIXME */ 15091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we are using SRM and serial console, just hard halt here. */ 15101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (alpha_using_srm && srmcons_output) 15111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __halt(); 15121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 15131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NOTIFY_DONE; 15141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1515e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling 1516e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neulingstatic __init int add_pcspkr(void) 1517e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling{ 1518e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling struct platform_device *pd; 1519e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling int ret; 1520e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling 1521e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling pd = platform_device_alloc("pcspkr", -1); 1522e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling if (!pd) 1523e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling return -ENOMEM; 1524e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling 1525e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling ret = platform_device_add(pd); 1526e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling if (ret) 1527e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling platform_device_put(pd); 1528e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling 1529e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling return ret; 1530e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neuling} 1531e5c6c8e457d16c7cbc12f849ad18d4d508950de2Michael Neulingdevice_initcall(add_pcspkr); 1532