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