patch-2.1.48 linux/arch/ppc/kernel/prep_setup.c
Next file: linux/arch/ppc/kernel/prep_time.c
Previous file: linux/arch/ppc/kernel/ppc_defs.head
Back to the patch index
Back to the overall index
- Lines: 369
- Date:
Thu Jul 31 13:09:17 1997
- Orig file:
v2.1.47/linux/arch/ppc/kernel/prep_setup.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.1.47/linux/arch/ppc/kernel/prep_setup.c linux/arch/ppc/kernel/prep_setup.c
@@ -0,0 +1,368 @@
+/*
+ * linux/arch/ppc/kernel/setup.c
+ *
+ * Copyright (C) 1995 Linus Torvalds
+ * Adapted from 'alpha' version by Gary Thomas
+ * Modified by Cort Dougan (cort@cs.nmt.edu)
+ */
+
+/*
+ * bootup setup stuff..
+ */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/malloc.h>
+#include <linux/user.h>
+#include <linux/a.out.h>
+#include <linux/tty.h>
+#include <linux/major.h>
+#include <linux/interrupt.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+
+#include <asm/mmu.h>
+#include <asm/processor.h>
+#include <asm/residual.h>
+#include <asm/io.h>
+#include <asm/pgtable.h>
+
+/* for the mac fs */
+kdev_t boot_dev;
+
+extern PTE *Hash, *Hash_end;
+extern unsigned long Hash_size, Hash_mask;
+extern int probingmem;
+extern unsigned long loops_per_sec;
+
+unsigned long empty_zero_page[1024];
+unsigned char aux_device_present;
+
+#ifdef CONFIG_BLK_DEV_RAM
+extern int rd_doload; /* 1 = load ramdisk, 0 = don't load */
+extern int rd_prompt; /* 1 = prompt for ramdisk, 0 = don't prompt */
+extern int rd_image_start; /* starting block # of image */
+#endif
+
+/* copy of the residual data */
+RESIDUAL res;
+/* ptr to residual data from hw, must be initialized so not in bss (gets cleared )*/
+unsigned long resptr = 0;
+int _machine;
+extern unsigned long _TotalMemory;
+
+#define COMMAND_LINE_SIZE 256
+static char command_line[COMMAND_LINE_SIZE] = { 0, };
+char saved_command_line[COMMAND_LINE_SIZE];
+#ifdef HASHSTATS
+unsigned long evicts;
+#endif
+
+struct screen_info screen_info = {
+ 0, 25, /* orig-x, orig-y */
+ { 0, 0 }, /* unused */
+ 0, /* orig-video-page */
+ 0, /* orig-video-mode */
+ 80, /* orig-video-cols */
+ 0,0,0, /* ega_ax, ega_bx, ega_cx */
+ 25, /* orig-video-lines */
+ 1, /* orig-video-isVGA */
+ 16 /* orig-video-points */
+};
+
+void machine_halt(void)
+{
+ machine_restart(NULL);
+}
+
+void machine_power_off(void)
+{
+ machine_restart(NULL);
+}
+
+void machine_restart(char *cmd)
+{
+ unsigned char ctl;
+ unsigned long flags;
+ unsigned long i = 10000;
+
+ _disable_interrupts();
+
+ /* set exception prefix high - to the prom */
+ save_flags( flags );
+ restore_flags( flags|MSR_IP );
+
+ /* make sure bit 0 (reset) is a 0 */
+ outb( inb(0x92) & ~1L , 0x92 );
+ /* signal a reset to system control port A - soft reset */
+ outb( inb(0x92) | 1 , 0x92 );
+
+ while ( i != 0 ) i++;
+ panic("restart failed\n");
+}
+
+int
+get_cpuinfo(char *buffer)
+{
+ extern char *Motherboard_map_name;
+ int i;
+ int pvr = _get_PVR();
+ int len;
+ char *model;
+ PTE *ptr;
+ unsigned long kptes = 0, uptes = 0, overflow = 0;
+ unsigned int ti;
+
+
+ switch (pvr>>16)
+ {
+ case 1:
+ model = "601";
+ break;
+ case 3:
+ model = "603";
+ break;
+ case 4:
+ model = "604";
+ break;
+ case 6:
+ model = "603e";
+ break;
+ case 7:
+ model = "603ev";
+ break;
+ default:
+ model = "unknown";
+ break;
+ }
+
+#ifdef __SMP__
+#define CD(X) (cpu_data[n].X)
+#else
+#define CD(X) (X)
+#define CPUN 0
+#endif
+
+ len = sprintf(buffer,"processor\t: %d\n"
+ "cpu\t\t: %s\n"
+ "revision\t: %d.%d\n"
+ "upgrade\t\t: %s\n"
+ "clock\t\t: %dMHz\n"
+ "bus clock\t: %dMHz\n"
+ "machine\t\t: %s (sn %s)\n"
+ "pci map\t\t: %s\n",
+ CPUN,
+ model,
+ MAJOR(pvr), MINOR(pvr),
+ (inb(IBM_EQUIP_PRESENT) & 2) ? "not upgrade" : "upgrade",
+ (res.VitalProductData.ProcessorHz > 1024) ?
+ res.VitalProductData.ProcessorHz>>20 :
+ res.VitalProductData.ProcessorHz,
+ (res.VitalProductData.ProcessorBusHz > 1024) ?
+ res.VitalProductData.ProcessorBusHz>>20 :
+ res.VitalProductData.ProcessorBusHz,
+ res.VitalProductData.PrintableModel,
+ res.VitalProductData.Serial,
+ Motherboard_map_name
+ );
+
+ /* print info about SIMMs */
+ len += sprintf(buffer+len,"simms\t\t: ");
+ for ( i = 0 ; (res.ActualNumMemories) && (i < MAX_MEMS) ; i++ )
+ {
+ if ( res.Memories[i].SIMMSize != 0 )
+ len += sprintf(buffer+len,"%d:%dM ",i,
+ (res.Memories[i].SIMMSize > 1024) ?
+ res.Memories[i].SIMMSize>>20 :
+ res.Memories[i].SIMMSize);
+ }
+ len += sprintf(buffer+len,"\n");
+
+ /* TLB */
+ len += sprintf(buffer+len,"tlb\t\t:");
+ switch(res.VitalProductData.TLBAttrib)
+ {
+ case CombinedTLB:
+ len += sprintf(buffer+len," %d entries\n",
+ res.VitalProductData.TLBSize);
+ break;
+ case SplitTLB:
+ len += sprintf(buffer+len," (split I/D) %d/%d entries\n",
+ res.VitalProductData.I_TLBSize,
+ res.VitalProductData.D_TLBSize);
+ break;
+ case NoneTLB:
+ len += sprintf(buffer+len," not present\n");
+ break;
+ }
+
+ /* L1 */
+ len += sprintf(buffer+len,"l1\t\t: ");
+ switch(res.VitalProductData.CacheAttrib)
+ {
+ case CombinedCAC:
+ len += sprintf(buffer+len,"%dkB LineSize\n",
+ res.VitalProductData.CacheSize,
+ res.VitalProductData.CacheLineSize);
+ break;
+ case SplitCAC:
+ len += sprintf(buffer+len,"(split I/D) %dkB/%dkB Linesize %dB/%dB\n",
+ res.VitalProductData.I_CacheSize,
+ res.VitalProductData.D_CacheSize,
+ res.VitalProductData.D_CacheLineSize,
+ res.VitalProductData.D_CacheLineSize);
+ break;
+ case NoneCAC:
+ len += sprintf(buffer+len,"not present\n");
+ break;
+ }
+
+ /* L2 */
+ if ( (inb(IBM_EQUIP_PRESENT) & 1) == 0) /* l2 present */
+ {
+ int size;
+
+ len += sprintf(buffer+len,"l2\t\t: %dkB %s\n",
+ ((inb(IBM_L2_STATUS) >> 5) & 1) ? 512 : 256,
+ (inb(IBM_SYS_CTL) & 64) ? "enabled" : "disabled");
+ }
+ else
+ {
+ len += sprintf(buffer+len,"l2\t\t: not present\n");
+ }
+
+
+ len += sprintf(buffer+len, "bogomips\t: %lu.%02lu\n",
+ CD(loops_per_sec+2500)/500000,
+ (CD(loops_per_sec+2500)/5000) % 100);
+
+ /*
+ * Ooh's and aah's info about zero'd pages in idle task
+ */
+ {
+ extern unsigned int zerocount, zerototal, zeropage_hits;
+ len += sprintf(buffer+len,"zero pages\t: total %u (%uKb) "
+ "current: %u (%uKb) hits: %u\n",
+ zerototal, (zerototal*PAGE_SIZE)>>10,
+ zerocount, (zerocount*PAGE_SIZE)>>10,
+ zeropage_hits);
+ }
+
+
+ /* ram/hash table info */
+ len += sprintf(buffer+len,"hash table\t: %dkB (%dk buckets)\n",
+ Hash_size>>10,(Hash_size/(sizeof(PTE)*8)) >> 10);
+
+ /* if booted print info about hash table use (overflows, etc) */
+#ifdef HASHSTATS
+ for ( ptr = Hash ; ptr < (PTE *)(Hash+Hash_size) ; ptr++)
+ {
+ if (ptr->v)
+ {
+ /* user not allowed read or write */
+ if (ptr->pp == PP_RWXX)
+ kptes++;
+ else
+ uptes++;
+ if (ptr->h == 1)
+ overflow++;
+ }
+ }
+ /*len+=sprintf(buffer+len,"Hash %x Hash+Hash_size %x MemEnd %x\n",
+ Hash,Hash+Hash_size,KERNELBASE+_TotalMemory);*/
+ /*len += sprintf(buffer+len,"PTEs: (user/kernel/max) %d (%d%%)/%d "
+ "(%d%%)/%d (%d%% full)\n",
+ uptes,(uptes*100)/(Hash_size/sizeof(PTE)),
+ kptes,(kptes*100)/(Hash_size/sizeof(PTE)),
+ Hash_size/sizeof(PTE),
+ ((uptes+kptes)*100)/(Hash_size/sizeof(PTE)));
+ len += sprintf(buffer+len,"Current Ovflw PTE's: %d Total Evicts: %u\n",
+ overflow,evicts);*/
+#endif /* HASHSTATS */
+ return len;
+}
+
+__initfunc(unsigned long
+bios32_init(unsigned long memory_start, unsigned long memory_end))
+{
+ return memory_start;
+}
+
+__initfunc(void
+setup_arch(char **cmdline_p, unsigned long * memory_start_p,
+ unsigned long * memory_end_p))
+{
+ extern char cmd_line[];
+ extern char _etext[], _edata[], _end[];
+ unsigned char reg;
+ extern int panic_timeout;
+
+ /* Save unparsed command line copy for /proc/cmdline */
+ strcpy( saved_command_line, cmd_line );
+ *cmdline_p = cmd_line;
+
+ *memory_start_p = (unsigned long) Hash+Hash_size;
+ (unsigned long *)*memory_end_p = (unsigned long *)(_TotalMemory+KERNELBASE);
+
+ /* init to some ~sane value until calibrate_delay() runs */
+ loops_per_sec = 50000000;
+
+ /* reboot on panic */
+ /*panic_timeout = 180;*/
+
+ init_task.mm->start_code = PAGE_OFFSET;
+ init_task.mm->end_code = (unsigned long) _etext;
+ init_task.mm->end_data = (unsigned long) _edata;
+ init_task.mm->brk = (unsigned long) _end;
+
+ aux_device_present = 0xaa;
+
+ switch ( _machine )
+ {
+ case _MACH_IBM:
+ ROOT_DEV = to_kdev_t(0x0301); /* hda1 */
+ break;
+ case _MACH_Motorola:
+ ROOT_DEV = to_kdev_t(0x0801); /* sda1 */
+ break;
+ }
+ /*ROOT_DEV = to_kdev_t(0x0811);*/ /* sdb1 */
+#if 0
+ strcpy(cmd_line+strlen(cmd_line),"console=1,9600,n8");
+#endif
+
+#if 0
+ if ( _machine == _MACH_Motorola )
+ {
+ /* get root via nfs from gordito -- only used for testing */
+ ROOT_DEV = MKDEV(UNNAMED_MAJOR, 255); /* nfs */
+ /*nfsaddrs=myip:serverip:gateip:netmaskip:clientname*/
+ strcpy(cmd_line+strlen(cmd_line),
+ "nfsaddrs=129.138.6.13:129.138.6.101:129.138.6.1:255.255.255.0:"
+ "pandora nfsroot=/usr/src/root/");
+ }
+#endif
+
+#ifdef CONFIG_BLK_DEV_RAM
+#if 0
+ ROOT_DEV = to_kdev_t(0x0200); /* floppy */
+ rd_prompt = 1;
+ rd_doload = 1;
+ rd_image_start = 0;
+#endif
+#endif
+
+ request_region(0x20,0x20,"pic1");
+ request_region(0xa0,0x20,"pic2");
+ request_region(0x00,0x20,"dma1");
+ request_region(0x40,0x20,"timer");
+ request_region(0x80,0x10,"dma page reg");
+ request_region(0xc0,0x20,"dma2");
+}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov