patch-2.4.20 linux-2.4.20/arch/parisc/kernel/setup.c
Next file: linux-2.4.20/arch/parisc/kernel/signal.c
Previous file: linux-2.4.20/arch/parisc/kernel/semaphore.c
Back to the patch index
Back to the overall index
- Lines: 834
- Date:
Thu Nov 28 15:53:10 2002
- Orig file:
linux-2.4.19/arch/parisc/kernel/setup.c
- Orig date:
Fri Feb 9 11:29:44 2001
diff -urN linux-2.4.19/arch/parisc/kernel/setup.c linux-2.4.20/arch/parisc/kernel/setup.c
@@ -1,12 +1,13 @@
/* $Id: setup.c,v 1.8 2000/02/02 04:42:38 prumpf Exp $
*
* Initial setup-routines for HP 9000 based hardware.
- *
+ *
* Copyright (C) 1991, 1992, 1995 Linus Torvalds
- * Modifications for PA-RISC (C) 1999 Helge Deller <helge.deller@ruhr-uni-bochum.de>
+ * Modifications for PA-RISC (C) 1999 Helge Deller <deller@gmx.de>
* Modifications copyright 1999 SuSE GmbH (Philipp Rumpf)
* Modifications copyright 2000 Martin K. Petersen <mkp@mkp.net>
* Modifications copyright 2000 Philipp Rumpf <prumpf@tux.org>
+ * Modifications copyright 2001 Ryan Bradetich <rbradetich@uswest.net>
*
* Initial PA-RISC Version: 04-23-1999 by Helge Deller
*
@@ -19,596 +20,308 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/mm.h>
-#include <linux/ptrace.h>
-#include <linux/sched.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/user.h>
-#include <linux/tty.h>
#include <linux/config.h>
-#include <linux/fs.h>
-#include <linux/kdev_t.h>
-#include <linux/major.h>
-#include <linux/string.h>
-#include <linux/blk.h>
+#include <linux/kernel.h>
+#include <linux/blk.h> /* for initrd_start and initrd_end */
#include <linux/init.h>
-#include <linux/interrupt.h>
#include <linux/console.h>
-#include <linux/bootmem.h>
-#include <linux/delay.h>
+#include <linux/seq_file.h>
+#define PCI_DEBUG
#include <linux/pci.h>
-#include <linux/threads.h>
+#undef PCI_DEBUG
+#include <linux/proc_fs.h>
-#include <asm/cache.h>
-#include <asm/hardware.h> /* for register_driver() stuff */
#include <asm/processor.h>
-#include <asm/page.h>
#include <asm/pdc.h>
#include <asm/led.h>
-#include <asm/real.h>
-#include <asm/system.h>
#include <asm/machdep.h> /* for pa7300lc_init() proto */
-#include <asm/irq.h> /* for struct irq_region */
-#include <asm/pdcpat.h> /* for PA_VIEW PDC_PAT_CPU_GET_NUMBER etc */
-
-#include <linux/proc_fs.h>
-
#define COMMAND_LINE_SIZE 1024
char saved_command_line[COMMAND_LINE_SIZE];
+char command_line[COMMAND_LINE_SIZE];
-/*
-** KLUGE ALERT!
-**
-** We *really* should be using a combination of request_resource()
-** and request_region()! But request_region() requires kmalloc since
-** returns a new struct resource. And kmalloc just isn't available
-** until after mem_init() is called from start_kernel().
-**
-** FIXME: assume contiguous memory initially.
-** Additional chunks of memory might be added to sysram_resource.sibling.
-*/
-static struct resource sysrom_resource = {
- name: "System ROM", start: 0x0f0000000UL, end: 0x0f00fffffUL,
- flags: IORESOURCE_BUSY | IORESOURCE_MEM,
- parent: &iomem_resource, sibling: NULL, child: NULL };
-
-static struct resource pdcdata_resource;
-
-static struct resource sysram_resource = {
- name: "System RAM", start: 0UL, end: ~0UL /* bogus */,
- flags: IORESOURCE_MEM,
- parent: &iomem_resource, sibling: &sysrom_resource, child: &pdcdata_resource};
-
-extern char _text; /* start of kernel code, defined by linker */
-extern int data_start;
-extern char _edata; /* end of data, begin BSS, defined by linker */
-extern char _end; /* end of BSS, defined by linker */
-
-static struct resource data_resource = {
- name: "kernel Data", start: virt_to_phys(&data_start), end: virt_to_phys(&_end)-1,
- flags: IORESOURCE_BUSY | IORESOURCE_MEM,
- parent: &sysram_resource, sibling: NULL, child: NULL};
-
-static struct resource code_resource = {
- name: "Kernel Code", start: virt_to_phys(&_text), end: virt_to_phys(&data_start)-1,
- flags: IORESOURCE_BUSY | IORESOURCE_MEM,
- parent: &sysram_resource, sibling: &data_resource, child: NULL};
-
-static struct resource pdcdata_resource = {
- name: "PDC data (Page Zero)", start: 0, end: 0x9ff,
- flags: IORESOURCE_BUSY | IORESOURCE_MEM,
- parent: &sysram_resource, sibling: &code_resource, child: NULL};
-
-
+/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
+struct proc_dir_entry * proc_runway_root = NULL;
+struct proc_dir_entry * proc_gsc_root = NULL;
+#ifdef CONFIG_EISA
+int EISA_bus; /* This has to go somewhere in architecture specific code. */
+#endif
-struct system_cpuinfo_parisc boot_cpu_data;
-struct cpuinfo_parisc cpu_data[NR_CPUS];
-
-extern void do_inventory(void);
-extern void cache_init(void);
-extern struct hp_device * register_module(void *hpa);
-
-static int cpu_driver_callback(struct hp_device *, struct pa_iodc_driver *);
-
-static struct pa_iodc_driver cpu_drivers_for[] = {
- {HPHW_NPROC, 0x0, 0x0, 0x0, 0, 0,
- DRIVER_CHECK_HWTYPE,
- "CPU", "PARISC", (void *) cpu_driver_callback},
- {0,0,0,0,0,0,
- 0,
- (char *) NULL, (char *) NULL, (void *) NULL }
-};
+void __init setup_cmdline(char **cmdline_p)
+{
+ extern unsigned int boot_args[];
-static long fallback_cpu_hpa[] = { 0xfffa0000L, 0xfffbe000L, 0x0 };
+ /* Collect stuff passed in from the boot loader */
+ /* boot_args[0] is free-mem start, boot_args[1] is ptr to command line */
+ if (boot_args[0] < 64) {
+ /* called from hpux boot loader */
+ saved_command_line[0] = '\0';
+ } else {
+ strcpy(saved_command_line, (char *)__va(boot_args[1]));
-/*
-** PARISC CPU driver - claim "device" and initialize CPU data structures.
-**
-** Consolidate per CPU initialization into (mostly) one module.
-** Monarch CPU will initialize boot_cpu_data which shouldn't
-** change once the system has booted.
-**
-** The callback *should* do per-instance initialization of
-** everything including the monarch. Some of the code that's
-** in setup.c:start_parisc() should migrate here and start_parisc()
-** should "register_driver(cpu_driver_for)" before calling
-** do_inventory().
-**
-** The goal of consolidating CPU initialization into one place is
-** to make sure all CPU's get initialized the same way.
-** It would be nice if the even the manarch through the exact same code path.
-** (up to rendevous at least).
-*/
-#undef ASSERT
-#define ASSERT(expr) \
- if(!(expr)) { \
- printk( "\n" __FILE__ ":%d: Assertion " #expr " failed!\n",__LINE__); \
- panic(#expr); \
+#ifdef CONFIG_BLK_DEV_INITRD
+ if (boot_args[2] != 0) /* did palo pass us a ramdisk? */
+ {
+ initrd_start = (unsigned long)__va(boot_args[2]);
+ initrd_end = (unsigned long)__va(boot_args[3]);
+ }
+#endif
}
-static int
-cpu_driver_callback(struct hp_device *d, struct pa_iodc_driver *dri)
+ strcpy(command_line, saved_command_line);
+ *cmdline_p = command_line;
+}
+
+#ifdef CONFIG_PA11
+void __init dma_ops_init(void)
{
-#ifdef __LP64__
- extern int pdc_pat; /* arch/parisc/kernel/inventory.c */
- static unsigned long pdc_result[32] __attribute__ ((aligned (8))) = {0,0,0,0};
-#endif
- struct cpuinfo_parisc *p;
+ switch (boot_cpu_data.cpu_type) {
+ case pcx:
+ /*
+ * We've got way too many dependencies on 1.1 semantics
+ * to support 1.0 boxes at this point.
+ */
+ panic( "PA-RISC Linux currently only supports machines that conform to\n"
+ "the PA-RISC 1.1 or 2.0 architecture specification.\n");
-#ifndef CONFIG_SMP
- if (boot_cpu_data.cpu_count > 0) {
- printk(KERN_INFO "CONFIG_SMP disabled - not claiming addional CPUs\n");
- return(1);
+ case pcxs:
+ case pcxt:
+ hppa_dma_ops = &pcx_dma_ops;
+ break;
+ case pcxl2:
+ pa7300lc_init();
+ case pcxl: /* falls through */
+ hppa_dma_ops = &pcxl_dma_ops;
+ break;
+ default:
+ break;
}
+}
#endif
- p = &cpu_data[boot_cpu_data.cpu_count];
- boot_cpu_data.cpu_count++;
-
-/* TODO: Enable FP regs - done early in start_parisc() now */
-
- /* initialize counters */
- memset(p, 0, sizeof(struct cpuinfo_parisc));
+extern int init_per_cpu(int cpuid);
+extern void collect_boot_cpu_data(void);
- p->hpa = (unsigned long) d->hpa; /* save CPU hpa */
+void __init setup_arch(char **cmdline_p)
+{
+ init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */
#ifdef __LP64__
- if (pdc_pat) {
- ulong status;
- pdc_pat_cell_mod_maddr_block_t pa_pdc_cell;
-
- status = pdc_pat_cell_module(& pdc_result, d->pcell_loc,
- d->mod_index, PA_VIEW, & pa_pdc_cell);
-
- ASSERT(PDC_RET_OK == status);
-
- /* verify it's the same as what do_pat_inventory() found */
- ASSERT(d->mod_info == pa_pdc_cell.mod_info);
- ASSERT(d->pmod_loc == pa_pdc_cell.mod_location);
- ASSERT(d->mod_path == pa_pdc_cell.mod_path);
-
- p->txn_addr = pa_pdc_cell.mod[0]; /* id_eid for IO sapic */
-
- /* get the cpu number */
- status = mem_pdc_call( PDC_PAT_CPU, PDC_PAT_CPU_GET_NUMBER,
- __pa(& pdc_result), d->hpa);
+ printk(KERN_INFO "The 64-bit Kernel has started...\n");
+#else
+ printk(KERN_INFO "The 32-bit Kernel has started...\n");
+#endif
- ASSERT(PDC_RET_OK == status);
+ pdc_console_init();
- p->cpuid = pdc_result[0];
+#ifdef CONFIG_PDC_NARROW
+ printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n");
+#endif
+ setup_pdc();
+ setup_cmdline(cmdline_p);
+ collect_boot_cpu_data();
+ do_memory_inventory(); /* probe for physical memory */
+ cache_init();
+ paging_init();
- } else
+#ifdef CONFIG_CHASSIS_LCD_LED
+ /* initialize the LCD/LED after boot_cpu_data is available ! */
+ led_init(); /* LCD/LED initialization */
#endif
- {
- p->txn_addr = (unsigned long) d->hpa; /* for normal parisc */
- /* logical CPU ID and update global counter */
- p->cpuid = boot_cpu_data.cpu_count - 1;
- }
+#ifdef CONFIG_PA11
+ dma_ops_init();
+#endif
- /*
- ** itimer and ipi IRQ handlers are statically initialized in
- ** arch/parisc/kernel/irq.c
- */
- p->region = irq_region[IRQ_FROM_REGION(CPU_IRQ_REGION)];
+#ifdef CONFIG_VT
+# if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
+ conswitchp = &dummy_con; /* we use take_over_console() later ! */
+# endif
+#endif
- return(0);
}
+/*
+ * Display cpu info for all cpu's.
+ * for parisc this is in processor.c
+ */
+extern int show_cpuinfo (struct seq_file *m, void *v);
-void __xchg_called_with_bad_pointer(void)
+static void *
+c_start (struct seq_file *m, loff_t *pos)
{
- printk(KERN_EMERG "xchg() called with bad pointer !\n");
+ /* Looks like the caller will call repeatedly until we return
+ * 0, signaling EOF perhaps. This could be used to sequence
+ * through CPUs for example. Since we print all cpu info in our
+ * show_cpuinfo() disregarding 'pos' (which I assume is 'v' above)
+ * we only allow for one "position". */
+ return ((long)*pos < 1) ? (void *)1 : NULL;
}
-
-/* Some versions of IODC don't list the CPU, and since we don't walk
- * the bus yet, we have to probe for processors at well known hpa
- * addresses.
- */
-
-void __init register_fallback_cpu (void)
+static void *
+c_next (struct seq_file *m, void *v, loff_t *pos)
{
- struct hp_device *d = NULL;
- int i = 0;
-
-#ifdef CONFIG_SMP
-#error "Revisit CPU fallback addresses for SMP (Assuming bus walk hasn't been implemented)"
-#endif
- printk ("No CPUs reported by firmware - probing...\n");
-
- while (fallback_cpu_hpa[i]) {
-
- d = register_module ((void *) fallback_cpu_hpa[i]);
-
- if (d > 0) {
- printk ("Found CPU at %lx\n", fallback_cpu_hpa[i]);
- cpu_driver_callback (d, 0);
- return;
- }
-
- i++;
- }
-
- panic ("No CPUs found. System halted.\n");
- return;
+ ++*pos;
+ return c_start(m, pos);
}
-
-/*
- * Get CPU information and store it in the boot_cpu_data structure. */
-void __init collect_boot_cpu_data(void)
+static void
+c_stop (struct seq_file *m, void *v)
{
- memset(&boot_cpu_data,0,sizeof(boot_cpu_data));
-
- boot_cpu_data.cpu_hz = 100 * PAGE0->mem_10msec; /* Hz of this PARISC */
-
- /* get CPU-Model Information... */
-#define p ((unsigned long *)&boot_cpu_data.pdc.model)
- if(pdc_model_info(&boot_cpu_data.pdc.model)==0)
- printk("model %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
- p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]);
-#undef p
-
- if(pdc_model_versions(&boot_cpu_data.pdc.versions, 0)==0)
- printk("vers %08lx\n", boot_cpu_data.pdc.versions.cpuid);
-
- if(pdc_model_cpuid(&boot_cpu_data.pdc.cpuid)==0)
- printk("cpuid %08lx\n", boot_cpu_data.pdc.cpuid.cpuid);
-
- printk("CPUID vers %ld rev %ld\n",
- (boot_cpu_data.pdc.cpuid.cpuid >> 5) & 127,
- boot_cpu_data.pdc.cpuid.cpuid & 31);
-
- if (pdc_model_sysmodel(boot_cpu_data.pdc.sys_model_name)==0)
- printk("model %s\n",boot_cpu_data.pdc.sys_model_name);
-
- boot_cpu_data.model_name = parisc_getHWdescription(HPHW_NPROC,
- boot_cpu_data.pdc.model.hversion>>4,
- boot_cpu_data.pdc.model.sversion>>8);
-
- boot_cpu_data.hversion = boot_cpu_data.pdc.model.hversion;
- boot_cpu_data.sversion = boot_cpu_data.pdc.model.sversion;
-
- boot_cpu_data.cpu_type =
- parisc_get_cpu_type(boot_cpu_data.pdc.model.hversion);
-
- boot_cpu_data.cpu_name = cpu_name_version[boot_cpu_data.cpu_type][0];
- boot_cpu_data.family_name = cpu_name_version[boot_cpu_data.cpu_type][1];
}
+struct seq_operations cpuinfo_op = {
+ start: c_start,
+ next: c_next,
+ stop: c_stop,
+ show: show_cpuinfo
+};
-#ifdef __LP64__
-#define COMMAND_GLOBAL 0xfffffffffffe0030UL
-#else
-#define COMMAND_GLOBAL 0xfffe0030
-#endif
-
-#define CMD_RESET 5 /* reset any module */
-
-/*
-** The Wright Brothers and Gecko systems have a H/W problem
-** (Lasi...'nuf said) may cause a broadcast reset to lockup
-** the system. An HVERSION dependent PDC call was developed
-** to perform a "safe", platform specific broadcast reset instead
-** of kludging up all the code.
-**
-** Older machines which do not implement PDC_BROADCAST_RESET will
-** return (with an error) and the regular broadcast reset can be
-** issued. Obviously, if the PDC does implement PDC_BROADCAST_RESET
-** the PDC call will not return (the system will be reset).
-*/
-static int
-reset_parisc(struct notifier_block *self, unsigned long command, void *ptr)
+static void parisc_proc_mkdir(void)
{
- printk("%s: %s(cmd=%lu)\n", __FILE__, __FUNCTION__, command);
-
- switch(command) {
- case MACH_RESTART:
-#ifdef FASTBOOT_SELFTEST_SUPPORT
- /*
- ** If user has modified the Firmware Selftest Bitmap,
- ** run the tests specified in the bitmap after the
- ** system is rebooted w/PDC_DO_RESET.
- **
- ** ftc_bitmap = 0x1AUL "Skip destructive memory tests"
- **
- ** Using "directed resets" at each processor with the MEM_TOC
- ** vector cleared will also avoid running destructive
- ** memory self tests. (Not implemented yet)
- */
- if (ftc_bitmap) {
- mem_pdc_call( PDC_BROADCAST_RESET,
- PDC_DO_FIRM_TEST_RESET, PDC_FIRM_TEST_MAGIC,
- ftc_bitmap);
+ /*
+ ** Can't call proc_mkdir() until after proc_root_init() has been
+ ** called by start_kernel(). In other words, this code can't
+ ** live in arch/.../setup.c because start_parisc() calls
+ ** start_kernel().
+ */
+ switch (boot_cpu_data.cpu_type) {
+ case pcxl:
+ case pcxl2:
+ if (NULL == proc_gsc_root)
+ {
+ proc_gsc_root = proc_mkdir("bus/gsc", 0);
}
-#endif
-
- /* "Normal" system reset */
- (void) mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_RESET,
- 0L, 0L, 0L);
-
- /* Nope...box should reset with just CMD_RESET now */
- gsc_writel(CMD_RESET, COMMAND_GLOBAL);
-
- /* Wait for RESET to lay us to rest. */
- while (1) ;
-
break;
+ case pcxt_:
+ case pcxu:
+ case pcxu_:
+ case pcxw:
+ case pcxw_:
+ case pcxw2:
+ if (NULL == proc_runway_root)
+ {
+ proc_runway_root = proc_mkdir("bus/runway", 0);
+ }
+ break;
}
- return NOTIFY_DONE;
}
-static struct notifier_block parisc_block = { reset_parisc, NULL, 0 };
+static struct resource central_bus = {
+ name: "Central Bus",
+ start: (unsigned long)0xfffffffffff80000,
+ end: (unsigned long)0xfffffffffffaffff,
+ flags: IORESOURCE_MEM,
+};
+static struct resource local_broadcast = {
+ name: "Local Broadcast",
+ start: (unsigned long)0xfffffffffffb0000,
+ end: (unsigned long)0xfffffffffffdffff,
+ flags: IORESOURCE_MEM,
+};
-/* start_parisc() will be called from head.S to setup our new memory_start
- and actually start our kernel !
- Memory-Layout is:
- - Kernel-Image (code+data+BSS)
- - Stack (stack-size see below!, stack-setup-code is in head.S)
- - memory_start at end of stack..
-*/
-
-unsigned long mem_start, mem_max;
-unsigned long start_pfn, max_pfn;
-extern asmlinkage void __init start_kernel(void);
-
-#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-#define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
-#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
+static struct resource global_broadcast = {
+ name: "Global Broadcast",
+ start: (unsigned long)0xfffffffffffe0000,
+ end: (unsigned long)0xffffffffffffffff,
+ flags: IORESOURCE_MEM,
+};
-void __init start_parisc(unsigned arg0, unsigned arg1,
- unsigned arg2, unsigned arg3)
+int __init parisc_init_resources(void)
{
- register unsigned long ccr;
- unsigned long memory_start;
-
- /* Clear BSS */
+ int result;
- {
- char *p = &_edata, *q = &_end;
-
- while (p < q) {
- *p++ = 0;
- }
+ result = request_resource(&iomem_resource, ¢ral_bus);
+ if (result < 0) {
+ printk(KERN_ERR
+ "%s: failed to claim %s address space!\n",
+ __FILE__, central_bus.name);
+ return result;
}
-
- pdc_console_init();
-
-#ifdef __LP64__
- printk("The 64-bit Kernel has started...\n");
-#else
- printk("The 32-bit Kernel has started...\n");
-#endif
-
- /*
- ** Enable FP coprocessor
- **
- ** REVISIT: ccr should be set by PDC_COPROC results to support PA1.0.
- ** Hardcoding works for PA1.1 processors.
- **
- ** REVISIT: this could be done in the "code 22" trap handler.
- ** (frowands idea - that way we know which processes need FP
- ** registers saved on the interrupt stack.)
- **
- ** NEWS FLASH: wide kernels need FP coprocessor enabled to handle
- ** formatted printing of %lx for example (double divides I think)
- */
- ccr = 0xc0;
- mtctl(ccr, 10);
- printk("Enabled FP coprocessor\n");
-
-#ifdef __LP64__
- printk( "If this is the LAST MESSAGE YOU SEE, you're probably using\n"
- "32-bit millicode by mistake.\n");
-#endif
-
- memory_start = (unsigned long) &_end;
- memory_start = (memory_start + PAGE_SIZE) & PAGE_MASK;
- printk("Free memory starts at: 0x%lx\n", memory_start);
-
- /* Collect stuff passed in from the boot loader */
- printk(KERN_WARNING "%s(0x%x,0x%x,0x%x,0x%x)\n",
- __FUNCTION__, arg0, arg1, arg2, arg3);
-
- /* arg0 is free-mem start, arg1 is ptr to command line */
- if (arg0 < 64) {
- /* called from hpux boot loader */
- saved_command_line[0] = '\0';
- } else {
- strcpy(saved_command_line, (char *)__va(arg1));
- printk("PALO command line: '%s'\nPALO initrd %x-%x\n",
- saved_command_line, arg2, arg3);
-
-#ifdef CONFIG_BLK_DEV_INITRD
- if (arg2 != 0) /* did palo pass us a ramdisk? */
- {
- initrd_start = (unsigned long)__va(arg2);
- initrd_end = (unsigned long)__va(arg3);
- }
-#endif
+ result = request_resource(&iomem_resource, &local_broadcast);
+ if (result < 0) {
+ printk(KERN_ERR
+ "%s: failed to claim %saddress space!\n",
+ __FILE__, local_broadcast.name);
+ return result;
}
- mem_start = __pa(memory_start);
-#define MAX_MEM (512*1024*1024)
- mem_max = (PAGE0->imm_max_mem > MAX_MEM ? MAX_MEM : PAGE0->imm_max_mem);
-
- collect_boot_cpu_data();
+ result = request_resource(&iomem_resource, &global_broadcast);
+ if (result < 0) {
+ printk(KERN_ERR
+ "%s: failed to claim %s address space!\n",
+ __FILE__, global_broadcast.name);
+ return result;
+ }
- /* initialize the LCD/LED after boot_cpu_data is available ! */
- led_init(); /* LCD/LED initialization */
+ return 0;
+}
- do_inventory(); /* probe for hardware */
- register_driver(cpu_drivers_for); /* claim all the CPUs */
+extern void gsc_init(void);
+extern void processor_init(void);
+extern void ccio_init(void);
+extern void dino_init(void);
+extern void iosapic_init(void);
+extern void lba_init(void);
+extern void sba_init(void);
+extern void eisa_init(void);
- if (boot_cpu_data.cpu_count == 0)
- register_fallback_cpu();
+void __init parisc_init(void)
+{
+ parisc_proc_mkdir();
+ parisc_init_resources();
+ do_device_inventory(); /* probe for hardware */
- printk("CPU(s): %d x %s at %d.%06d MHz\n",
+ processor_init();
+ printk(KERN_INFO "CPU(s): %d x %s at %d.%06d MHz\n",
boot_cpu_data.cpu_count,
boot_cpu_data.cpu_name,
- boot_cpu_data.cpu_hz / 1000000,
+ boot_cpu_data.cpu_hz / 1000000,
boot_cpu_data.cpu_hz % 1000000 );
- switch (boot_cpu_data.cpu_type) {
- case pcx:
- case pcxs:
- case pcxt:
- hppa_dma_ops = &pcx_dma_ops;
- break;
- case pcxl2:
- pa7300lc_init();
- case pcxl: /* falls through */
- hppa_dma_ops = &pcxl_dma_ops;
- break;
- default:
- break;
- }
-
-#if 1
- /* KLUGE! this really belongs in kernel/resource.c! */
- iomem_resource.end = ~0UL;
-#endif
- sysram_resource.end = mem_max - 1;
- notifier_chain_register(&mach_notifier, &parisc_block);
- start_kernel(); /* now back to arch-generic code... */
-}
-
-void __init setup_arch(char **cmdline_p)
-{
- unsigned long bootmap_size;
- unsigned long start_pfn;
- unsigned long mem_free;
-
- *cmdline_p = saved_command_line;
-
- /* initialize bootmem */
-
- start_pfn = PFN_UP(mem_start);
- max_pfn = PFN_DOWN(mem_max);
-
- bootmap_size = init_bootmem(start_pfn, max_pfn);
-
- mem_start += bootmap_size;
- mem_free = mem_max - mem_start;
-
- /* free_bootmem handles rounding nicely */
- printk("free_bootmem(0x%lx, 0x%lx)\n", (unsigned long)mem_start,
- (unsigned long)mem_free);
- free_bootmem(mem_start, mem_free);
-
-#ifdef CONFIG_BLK_DEV_INITRD
- printk("initrd: %08x-%08x\n", (int) initrd_start, (int) initrd_end);
-
- if (initrd_end != 0) {
- initrd_below_start_ok = 1;
- reserve_bootmem(__pa(initrd_start), initrd_end - initrd_start);
- }
+ /* These are in a non-obvious order, will fix when we have an iotree */
+#if defined(CONFIG_IOSAPIC)
+ iosapic_init();
#endif
-
- cache_init();
-
- paging_init();
-
- if((unsigned long)&init_task_union&(INIT_TASK_SIZE - 1)) {
- printk("init_task_union not aligned. Please recompile the kernel after changing the first line in arch/parisc/kernel/init_task.c from \n\"#define PAD 0\" to\n\"#define PAD 1\" or vice versa\n");
- for(;;);
- }
-
-
-#ifdef CONFIG_SERIAL_CONSOLE
- /* nothing */
-#elif CONFIG_VT
-#if defined(CONFIG_STI_CONSOLE)
- conswitchp = &dummy_con; /* we use take_over_console() later ! */
-#elif defined(CONFIG_IODC_CONSOLE)
- conswitchp = &prom_con; /* it's currently really "prom_con" */
-#elif defined(CONFIG_DUMMY_CONSOLE)
- conswitchp = &dummy_con;
+#if defined(CONFIG_IOMMU_SBA)
+ sba_init();
#endif
+#if defined(CONFIG_PCI_LBA)
+ lba_init();
#endif
-}
-
-#ifdef CONFIG_PROC_FS
-/*
- * Get CPU information for use by procfs.
- */
-
-int get_cpuinfo(char *buffer)
-{
- char *p = buffer;
- int n;
+ /* CCIO before any potential subdevices */
+#if defined(CONFIG_IOMMU_CCIO)
+ ccio_init();
+#endif
- for(n=0; n<boot_cpu_data.cpu_count; n++) {
-#ifdef CONFIG_SMP
- if (!(cpu_online_map & (1<<n)))
- continue;
-#endif
- p += sprintf(p, "processor\t: %d\n"
- "cpu family\t: PA-RISC %s\n",
- n, boot_cpu_data.family_name);
-
- p += sprintf(p, "cpu\t\t: %s\n", boot_cpu_data.cpu_name );
-
- /* cpu MHz */
- p += sprintf(p, "cpu MHz\t\t: %d.%06d\n",
- boot_cpu_data.cpu_hz / 1000000,
- boot_cpu_data.cpu_hz % 1000000 );
-
- p += sprintf(p, "model\t\t: %s\n"
- "model name\t: %s\n",
- boot_cpu_data.pdc.sys_model_name,
- boot_cpu_data.model_name);
-
- p += sprintf(p, "hversion\t: 0x%08x\n"
- "sversion\t: 0x%08x\n",
- boot_cpu_data.hversion,
- boot_cpu_data.sversion );
-
- p += get_cache_info(p);
- /* print cachesize info ? */
- p += sprintf(p, "bogomips\t: %lu.%02lu\n",
- (loops_per_sec+2500)/500000,
- ((loops_per_sec+2500)/5000) % 100);
- }
- return p - buffer;
-}
+ /*
+ * Need to register Asp & Wax before the EISA adapters for the IRQ
+ * regions. EISA must come before PCI to be sure it gets IRQ region
+ * 0.
+ */
+#if defined(CONFIG_GSC_LASI) || defined(CONFIG_GSC_WAX)
+ gsc_init();
+#endif
+#ifdef CONFIG_EISA
+ eisa_init();
+#endif
+#if defined(CONFIG_GSC_DINO)
+ dino_init();
#endif
+#ifdef CONFIG_CHASSIS_LCD_LED
+ register_led_regions(); /* register LED port info in procfs */
+#endif
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)