diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-01-07 02:33:00 +0000 |
---|---|---|
committer | <ralf@linux-mips.org> | 1997-01-07 02:33:00 +0000 |
commit | beb116954b9b7f3bb56412b2494b562f02b864b1 (patch) | |
tree | 120e997879884e1b9d93b265221b939d2ef1ade1 /arch/ppc/kernel/setup.c | |
parent | 908d4681a1dc3792ecafbe64265783a86c4cccb6 (diff) |
Import of Linux/MIPS 2.1.14
Diffstat (limited to 'arch/ppc/kernel/setup.c')
-rw-r--r-- | arch/ppc/kernel/setup.c | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c new file mode 100644 index 000000000..6f330b052 --- /dev/null +++ b/arch/ppc/kernel/setup.c @@ -0,0 +1,246 @@ +/* + * linux/arch/ppc/kernel/setup.c + * + * Copyright (C) 1995 Linus Torvalds + * Adapted from 'alpha' version by Gary Thomas + */ + +/* + * bootup setup stuff.. + */ + +#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/ldt.h> +#include <linux/user.h> +#include <linux/a.out.h> +#include <linux/tty.h> +#include <linux/major.h> + +#define SIO_CONFIG_RA 0x398 +#define SIO_CONFIG_RD 0x399 + +#include <asm/pgtable.h> + +extern unsigned long *end_of_DRAM; +extern PTE *Hash; +extern unsigned long Hash_size, Hash_mask; + +char sda_root[] = "root=/dev/sda1"; +extern int root_mountflags; + +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 + +/* + * The format of "screen_info" is strange, and due to early + * i386-setup code. This is just enough to make the console + * code think we're on a EGA+ colour display. + */ + /* this is changed only in minor ways from the original + -- Cort + */ +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 */ +}; + + +unsigned long bios32_init(unsigned long memory_start, unsigned long memory_end) +{ + return memory_start; +} + +unsigned long find_end_of_memory(void) +{ + unsigned char dram_size = inb(0x0804); + unsigned long total; + extern BAT BAT2; +printk("DRAM Size = %x\n", dram_size); +printk("Config registers = %x/%x/%x/%x\n", inb(0x0800), inb(0x0801), inb(0x0802), inb(0x0803)); + switch (dram_size & 0x07) + { + case 0: + total = 0x08000000; /* 128M */ + break; + case 1: + total = 0x02000000; /* 32M */ + break; + case 2: + total = 0x00800000; /* 8M */ + break; + case 3: + total = 0x00400000; /* 4M - can't happen! */ + break; + case 4: + total = 0x10000000; /* 256M */ + break; + case 5: + total = 0x04000000; /* 64M */ + break; + case 6: + total = 0x01000000; /* 16M */ + break; + case 7: + total = 0x04000000; /* Can't happen */ + break; + } + switch ((dram_size>>4) & 0x07) + { + case 0: + total += 0x08000000; /* 128M */ + break; + case 1: + total += 0x02000000; /* 32M */ + break; + case 2: + total += 0x00800000; /* 8M */ + break; + case 3: + total += 0x00000000; /* Module not present */ + break; + case 4: + total += 0x10000000; /* 256M */ + break; + case 5: + total += 0x04000000; /* 64M */ + break; + case 6: + total += 0x01000000; /* 16M */ + break; + case 7: + total += 0x00000000; /* Module not present */ + break; + } +/* TEMP */ total = 0x01000000; +/* _cnpause(); */ +/* CAUTION!! This can be done more elegantly! */ + if (total < 0x01000000) + { + Hash_size = HASH_TABLE_SIZE_64K; + Hash_mask = HASH_TABLE_MASK_64K; + } else + { + Hash_size = HASH_TABLE_SIZE_128K; + Hash_mask = HASH_TABLE_MASK_128K; + } + switch(total) + { + case 0x01000000: +/* BAT2[0][1] = BL_16M;*/ + break; + default: + printk("WARNING: setup.c: find_end_of_memory() unknown total ram size %x\n", total); + break; + } + + Hash = (PTE *)((total-Hash_size)+KERNELBASE); + bzero(Hash, Hash_size); + return ((unsigned long)Hash); +} + +int size_memory; + +/* #define DEFAULT_ROOT_DEVICE 0x0200 /* fd0 */ +#define DEFAULT_ROOT_DEVICE 0x0801 /* sda1 */ + +void setup_arch(char **cmdline_p, + unsigned long * memory_start_p, unsigned long * memory_end_p) +{ + extern int _end; + extern char cmd_line[]; + unsigned char reg; + + /* Set up floppy in PS/2 mode */ + outb(0x09, SIO_CONFIG_RA); + reg = inb(SIO_CONFIG_RD); + reg = (reg & 0x3F) | 0x40; + outb(reg, SIO_CONFIG_RD); + outb(reg, SIO_CONFIG_RD); /* Have to write twice to change! */ + ROOT_DEV = to_kdev_t(DEFAULT_ROOT_DEVICE); + /*ROOT_DEV = MKDEV(UNNAMED_MAJOR, 255);*/ /* nfs */ + aux_device_present = 0xaa; + /*nfsaddrs=myip:serverip:gateip:netmaskip:clientname*/ + strcpy(cmd_line, + "nfsaddrs=129.138.6.13:129.138.6.90:129.138.6.1:255.255.255.0:pandora"); + /* strcpy(cmd_line,"root=/dev/sda1");*/ + *cmdline_p = cmd_line; + *memory_start_p = (unsigned long) &_end; + *memory_end_p = (unsigned long *)end_of_DRAM; + size_memory = *memory_end_p - KERNELBASE; /* Relative size of memory */ + +#ifdef CONFIG_BLK_DEV_RAM + rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; + rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); + rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); + rd_prompt = 0; + rd_doload = 0; + rd_image_start = 0; +#endif +} + +asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on) +{ + return -EIO; +} +#if 0 +extern char builtin_ramdisk_image; +extern long builtin_ramdisk_size; + +void +builtin_ramdisk_init(void) +{ + if ((ROOT_DEV == to_kdev_t(DEFAULT_ROOT_DEVICE)) && (builtin_ramdisk_size != 0)) + { + rd_preloaded_init(&builtin_ramdisk_image, builtin_ramdisk_size); + } else + { /* Not ramdisk - assume root needs to be mounted read only */ + root_mountflags |= MS_RDONLY; + } +} +#endif +#define MAJOR(n) (((n)&0xFF00)>>8) +#define MINOR(n) ((n)&0x00FF) + +int +get_cpuinfo(char *buffer) +{ + int pvr = _get_PVR(); + char *model; + switch (pvr>>16) + { + case 3: + model = "603"; + break; + case 4: + model = "604"; + break; + case 6: + model = "603e"; + break; + case 7: + model = "603ev"; + break; + default: + model = "unknown"; + break; + } + return sprintf(buffer, "PowerPC %s rev %d.%d\n", model, MAJOR(pvr), MINOR(pvr)); +} |