diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-03-19 01:28:40 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-03-19 01:28:40 +0000 |
commit | 8abb719409c9060a7c0676f76e9182c1e0b8ca46 (patch) | |
tree | b88cc5a6cd513a04a512b7e6215c873c90a1c5dd /arch/arm | |
parent | f01bd7aeafd95a08aafc9e3636bb26974df69d82 (diff) |
Merge with 2.3.99-pre1.
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/Makefile | 15 | ||||
-rw-r--r-- | arch/arm/boot/compressed/Makefile | 5 | ||||
-rw-r--r-- | arch/arm/config.in | 15 | ||||
-rw-r--r-- | arch/arm/defconfig | 90 | ||||
-rw-r--r-- | arch/arm/kernel/Makefile | 78 | ||||
-rw-r--r-- | arch/arm/kernel/arch.c | 322 | ||||
-rw-r--r-- | arch/arm/kernel/arch.h | 15 | ||||
-rw-r--r-- | arch/arm/kernel/armksyms.c | 3 | ||||
-rw-r--r-- | arch/arm/kernel/bios32.c | 79 | ||||
-rw-r--r-- | arch/arm/kernel/head-armv.S | 16 | ||||
-rw-r--r-- | arch/arm/kernel/ptrace.c | 42 | ||||
-rw-r--r-- | arch/arm/kernel/setup.c | 392 | ||||
-rw-r--r-- | arch/arm/lib/Makefile | 36 | ||||
-rw-r--r-- | arch/arm/lib/io-shark.c | 79 | ||||
-rw-r--r-- | arch/arm/mm/init.c | 31 | ||||
-rw-r--r-- | arch/arm/mm/proc-arm6,7.S | 135 | ||||
-rw-r--r-- | arch/arm/vmlinux-armo.lds.in | 127 | ||||
-rw-r--r-- | arch/arm/vmlinux-armv.lds.in | 8 |
18 files changed, 863 insertions, 625 deletions
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 6b4033705..ad8e9423a 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -121,6 +121,11 @@ MACHINE = ebsa110 ARCHDIR = ebsa110 endif +ifeq ($(CONFIG_ARCH_CLPS7500),y) +MACHINE = clps7500 +ARCHDIR = cl7500 +endif + ifeq ($(CONFIG_FOOTBRIDGE),y) MACHINE = footbridge ARCHDIR = ebsa285 @@ -135,6 +140,11 @@ MACHINE = nexuspci ARCHDIR = nexuspci endif +ifeq ($(CONFIG_ARCH_SHARK),y) +MACHINE = shark +ARCHDIR = shark +endif + ifeq ($(CONFIG_ARCH_SA1100),y) MACHINE = sa1100 ARCHDIR = sa1100 @@ -160,6 +170,11 @@ DRIVERS += drivers/acorn/net/acorn-net.a DRIVERS += drivers/acorn/scsi/acorn-scsi.a endif +ifeq ($(CONFIG_ARCH_CLPS7500),y) +SUBDIRS += drivers/acorn/char +DRIVERS += drivers/acorn/char/acorn-char.o +endif + MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot # The following is a hack to get 'constants.h' up diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index fca3e8c92..37d79da39 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -25,6 +25,10 @@ ifeq ($(CONFIG_ARCH_RPC),y) ZTEXTADDR = 0x10008000 endif +ifeq ($(CONFIG_ARCH_CLPS7500),y) +ZTEXTADDR = 0x10008000 +endif + ifeq ($(CONFIG_ARCH_EBSA110),y) ZTEXTADDR = 0x00008000 endif @@ -39,7 +43,6 @@ endif ifeq ($(CONFIG_ARCH_NEXUSPCI),y) HEAD = head-nexuspci.o -OBJS += $(TOPDIR)/arch/arm/lib/ll_char_wr_scc.o ZTEXTADDR = 0x40200000 ZRELADDR = 0x40008000 endif diff --git a/arch/arm/config.in b/arch/arm/config.in index 4c7a5fe19..ff4f954df 100644 --- a/arch/arm/config.in +++ b/arch/arm/config.in @@ -37,6 +37,7 @@ if [ "$CONFIG_HOST_FOOTBRIDGE" = "y" ]; then bool ' Include support for EBSA285' CONFIG_ARCH_EBSA285 bool ' Include support for CATS' CONFIG_CATS bool ' Include support for NetWinder' CONFIG_ARCH_NETWINDER + bool ' Include support for Compaq Personal Server' CONFIG_PERSONAL_SERVER fi if [ "$CONFIG_ADDIN_FOOTBRIDGE" = "y" ]; then @@ -170,6 +171,7 @@ source drivers/parport/Config.in if [ "$CONFIG_ARCH_EBSA110" = "y" -o \ "$CONFIG_ARCH_SA1100" = "y" -o \ "$CONFIG_ARCH_NETWINDER" = "y" -o \ + "$CONFIG_PERSONAL_SERVER" = "y" -o \ "$CONFIG_CATS" = "y" ]; then string 'Initial kernel command string' CONFIG_CMDLINE fi @@ -254,6 +256,19 @@ fi # endmenu mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support?' CONFIG_SCSI diff --git a/arch/arm/defconfig b/arch/arm/defconfig index e43a8d2a9..45c89eeb3 100644 --- a/arch/arm/defconfig +++ b/arch/arm/defconfig @@ -87,46 +87,6 @@ CONFIG_ISAPNP=y # Block devices # # CONFIG_BLK_DEV_FD is not set -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_IDE is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDESCSI is not set - -# -# IDE chipset support/bugfixes -# -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_RZ1000 is not set -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_BLK_DEV_IDEDMA_PCI=y -CONFIG_IDEDMA_PCI_AUTO=y -CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=y -CONFIG_IDEDMA_PCI_EXPERIMENTAL=y -CONFIG_BLK_DEV_OFFBOARD=y -# CONFIG_BLK_DEV_AEC6210 is not set -# CONFIG_BLK_DEV_ALI15X3 is not set -# CONFIG_BLK_DEV_CMD646 is not set -CONFIG_BLK_DEV_CY82C693=y -# CONFIG_BLK_DEV_HPT34X is not set -# CONFIG_BLK_DEV_HPT366 is not set -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_OPTI621 is not set -CONFIG_BLK_DEV_PDC202XX=y -# CONFIG_PDC202XX_FORCE_BURST_BIT is not set -# CONFIG_PDC202XX_FORCE_MASTER_MODE is not set -# CONFIG_BLK_DEV_TRM290 is not set -CONFIG_BLK_DEV_SL82C105=y -CONFIG_BLK_DEV_IDEDMA=y -CONFIG_IDEDMA_AUTO=y -# CONFIG_IDE_CHIPSETS is not set # CONFIG_BLK_CPQ_DA is not set # @@ -172,8 +132,6 @@ CONFIG_PARIDE_KBIC=m CONFIG_PARIDE_KTTI=m CONFIG_PARIDE_ON20=m CONFIG_PARIDE_ON26=m -CONFIG_BLK_DEV_IDE_MODES=y -# CONFIG_BLK_DEV_HD is not set # # Character devices @@ -509,6 +467,54 @@ CONFIG_SLIP_MODE_SLIP6=y # CONFIG_NET_PCMCIA is not set # +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=y +CONFIG_IDEDMA_PCI_EXPERIMENTAL=y +CONFIG_BLK_DEV_OFFBOARD=y +# CONFIG_BLK_DEV_AEC6210 is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_CMD64X is not set +CONFIG_BLK_DEV_CY82C693=y +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_PDC202XX=y +# CONFIG_PDC202XX_BURST is not set +# CONFIG_PDC202XX_MASTER is not set +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_SL82C105=y +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_AUTO=y +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDE_MODES=y +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # # CONFIG_SCSI is not set diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 3920edade..c454c1350 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -8,71 +8,55 @@ HEAD_OBJ = head-$(PROCESSOR).o ENTRY_OBJ = entry-$(PROCESSOR).o -O_TARGET := kernel.o -O_OBJS := $(ENTRY_OBJ) ioport.o irq.o process.o ptrace.o \ - semaphore.o setup.o signal.o sys_arm.o time.o traps.o - ifeq ($(CONFIG_ISA_DMA),y) ISA_DMA_OBJS += dma-isa.o endif -O_OBJS_arc = dma-arc.o iic.o fiq.o time-acorn.o oldlatches.o -O_OBJS_a5k = dma-a5k.o iic.o fiq.o time-acorn.o -O_OBJS_rpc = dma-rpc.o iic.o fiq.o time-acorn.o +O_OBJS_arc = dma-arc.o oldlatches.o +O_OBJS_a5k = dma-a5k.o +O_OBJS_rpc = dma-rpc.o O_OBJS_ebsa110 = dma-dummy.o -O_OBJS_footbridge = dma-footbridge.o $(ISA_DMA_OBJS) isa.o +O_OBJS_footbridge = dma.o dma-footbridge.o $(ISA_DMA_OBJS) hw-footbridge.o isa.o O_OBJS_nexuspci = dma-dummy.o O_OBJS_sa1100 = dma-dummy.o fiq.o -OX_OBJS_arc = dma.o -OX_OBJS_a5k = dma.o -OX_OBJS_rpc = dma.o -OX_OBJS_ebsa110 = -OX_OBJS_footbridge= dma.o hw-footbridge.o -OX_OBJS_nexuspci = -OX_OBJS_sa1100 = +O_TARGET := kernel.o -all: kernel.o $(HEAD_OBJ) init_task.o +# Object file lists. -O_OBJS += $(O_OBJS_$(MACHINE)) +obj-y := arch.o $(ENTRY_OBJ) ioport.o irq.o process.o ptrace.o \ + semaphore.o setup.o signal.o sys_arm.o time.o traps.o \ + $(O_OBJS_$(MACHINE)) +obj-m := +obj-n := +obj- := -ifeq ($(CONFIG_DEBUG_LL),y) - O_OBJS += debug-$(PROCESSOR).o -endif +export-objs := armksyms.o dma.o ecard.o hw-footbridge.o leds-$(MACHINE).o -ifeq ($(CONFIG_MODULES),y) - OX_OBJS = armksyms.o -endif +obj-$(CONFIG_ARCH_ACORN) += dma.o ecard.o iic.o fiq.o time-acorn.o +obj-$(CONFIG_DEBUG_LL) += debug-$(PROCESSOR).o +obj-$(CONFIG_MODULES) += armksyms.o +obj-$(CONFIG_LEDS) += leds-$(MACHINE).o +obj-$(CONFIG_ARTHUR) += arthur.o -ifeq ($(CONFIG_ARCH_ACORN),y) - OX_OBJS += ecard.o +ifeq ($(MACHINE),nexuspci) + obj-$(CONFIG_PCI) += plx9080.o +else + obj-$(CONFIG_PCI) += bios32.o dec21285.o endif -ifeq ($(CONFIG_PCI),y) - ifeq ($(MACHINE),nexuspci) - O_OBJS += plx9080.o - else - O_OBJS += bios32.o dec21285.o - endif -endif +# Files that are both resident and modular; remove from modular. -ifeq ($(CONFIG_LEDS),y) - OX_OBJS += leds-$(MACHINE).o -endif +obj-m := $(filter-out $(obj-y), $(obj-m)) -ifeq ($(CONFIG_MODULES),y) - OX_OBJS += $(OX_OBJS_$(MACHINE)) -else - O_OBJS += $(OX_OBJS_$(MACHINE)) -endif +# Translate to Rules.make lists. -ifeq ($(CONFIG_ARTHUR),y) - O_OBJS += arthur.o -else - ifeq ($(CONFIG_ARTHUR),m) - M_OBJS += arthur.o - endif -endif +O_OBJS := $(filter-out $(export-objs), $(obj-y)) +OX_OBJS := $(filter $(export-objs), $(obj-y)) +M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m))) +MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) + +all: kernel.o $(HEAD_OBJ) init_task.o $(HEAD_OBJ): $(HEAD_OBJ:.o=.S) $(CC) -D__ASSEMBLY__ $(AFLAGS) -DTEXTADDR=$(TEXTADDR) -traditional -c $(HEAD_OBJ:.o=.S) -o $@ diff --git a/arch/arm/kernel/arch.c b/arch/arm/kernel/arch.c new file mode 100644 index 000000000..8645497ae --- /dev/null +++ b/arch/arm/kernel/arch.c @@ -0,0 +1,322 @@ +/* + * linux/arch/arm/kernel/arch.c + * + * Architecture specifics + */ +#include <linux/config.h> +#include <linux/tty.h> +#include <linux/init.h> + +#include <asm/elf.h> +#include <asm/setup.h> +#include <asm/system.h> + +#include "arch.h" + +extern unsigned int system_rev; +extern unsigned int system_serial_low; +extern unsigned int system_serial_high; + +unsigned int vram_size; +#ifdef CONFIG_ARCH_ACORN +unsigned int memc_ctrl_reg; +unsigned int number_mfm_drives; +#endif + +/* + * Architecture specific fixups. This is where any + * parameters in the params struct are fixed up, or + * any additional architecture specific information + * is pulled from the params struct. + */ +static void __init +fixup_acorn(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ +#ifdef CONFIG_ARCH_ACORN + int i; + + if (machine_is_riscpc()) { + /* + * RiscPC can't handle half-word loads and stores + */ + elf_hwcap &= ~HWCAP_HALF; + + switch (params->u1.s.pages_in_vram) { + case 512: + vram_size += PAGE_SIZE * 256; + case 256: + vram_size += PAGE_SIZE * 256; + default: + break; + } + + if (vram_size) { + desc->video_start = 0x02000000; + desc->video_end = 0x02000000 + vram_size; + } + + for (i = 0; i < 4; i++) { + mi->bank[i].start = PHYS_OFFSET + (i << 26); + mi->bank[i].size = + params->u1.s.pages_in_bank[i] * + params->u1.s.page_size; + } + mi->nr_banks = 4; + } + memc_ctrl_reg = params->u1.s.memc_control_reg; + number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3; +#endif +} + +static void __init +fixup_ebsa285(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + ORIG_X = params->u1.s.video_x; + ORIG_Y = params->u1.s.video_y; + ORIG_VIDEO_COLS = params->u1.s.video_num_cols; + ORIG_VIDEO_LINES = params->u1.s.video_num_rows; +} + +/* + * Older NeTTroms either do not provide a parameters + * page, or they don't supply correct information in + * the parameter page. + */ +static void __init +fixup_netwinder(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + if (params->u1.s.nr_pages != 0x2000 && + params->u1.s.nr_pages != 0x4000) { + printk(KERN_WARNING "Warning: bad NeTTrom parameters " + "detected, using defaults\n"); + + params->u1.s.nr_pages = 0x2000; /* 32MB */ + params->u1.s.ramdisk_size = 0; + params->u1.s.flags = FLAG_READONLY; + params->u1.s.initrd_start = 0; + params->u1.s.initrd_size = 0; + params->u1.s.rd_start = 0; + } +} + +/* + * CATS uses soft-reboot by default, since + * hard reboots fail on early boards. + */ +static void __init +fixup_cats(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + ORIG_VIDEO_LINES = 25; + ORIG_VIDEO_POINTS = 16; + ORIG_Y = 24; +} + +static void __init +fixup_coebsa285(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ +#if 0 + extern unsigned long boot_memory_end; + extern char boot_command_line[]; + + mi->nr_banks = 1; + mi->bank[0].start = PHYS_OFFSET; + mi->bank[0].size = boot_memory_end; + + *cmdline = boot_command_line; +#endif +} + +static void __init +fixup_sa1100(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ +#ifdef CONFIG_ARCH_SA1100 + int i; + extern struct mem_desc { + unsigned long phys_start; + unsigned long length; + } mem_desc[]; + extern unsigned int mem_desc_size; + + for( i = 0; i < mem_desc_size; i++ ) { + if( i >= NR_BANKS ) { + printk( __FUNCTION__ + ": mem_desc too large for meminfo structure\n"); + break; + } + mi->bank[i].start = mem_desc[i].phys_start; + mi->bank[i].size = mem_desc[i].length; + } + mi->nr_banks = i; + +#if defined(CONFIG_SA1100_BRUTUS) + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk( 1, 0, 0, 8192 ); + setup_initrd( __phys_to_virt(0xd8000000), 0x00400000 ); +#elif defined(CONFIG_SA1100_EMPEG) + ROOT_DEV = MKDEV( 3, 1 ); /* /dev/hda1 */ + setup_ramdisk( 1, 0, 0, 4096 ); + setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) ); +#elif defined(CONFIG_SA1100_TIFON) + ROOT_DEV = MKDEV(UNNAMED_MAJOR, 0); + setup_ramdisk(1, 0, 0, 4096); + setup_initrd( 0xd0000000 + 0x1100004, 0x140000 ); +#elif defined(CONFIG_SA1100_VICTOR) + ROOT_DEV = MKDEV( 60, 2 ); + + /* Get command line parameters passed from the loader (if any) */ + if( *((char*)0xc0000000) ) + strcpy( default_command_line, ((char *)0xc0000000) ); + + /* power off if any problem */ + strcat( default_command_line, " panic=1" ); +#elif defined(CONFIG_SA1100_LART) + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk(1, 0, 0, 8192); + setup_initrd(0xc0400000, 0x00400000); +#endif +#endif +} + +#define NO_PARAMS 0 +#define NO_VIDEO 0, 0 + +/* + * This is the list of all architectures supported by + * this kernel. This should be integrated with the list + * in head-armv.S. + */ +static struct machine_desc machine_desc[] __attribute__ ((__section__ (".arch.info"))) = { + { + MACH_TYPE_EBSA110, + "EBSA110", /* RMK */ + 0x00000400, + NO_VIDEO, + 1, 0, 1, 1, 1, + NULL + }, { + MACH_TYPE_RISCPC, + "Acorn-RiscPC", /* RMK */ + 0x10000100, + NO_VIDEO, + 1, 1, 0, 0, 0, + fixup_acorn + }, { + 2, + "unknown", + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_NEXUSPCI, + "FTV/PCI", /* Philip Blundell */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_EBSA285, + "EBSA285", /* RMK */ + 0x00000100, + 0x000a0000, 0x000bffff, + 0, 0, 0, 0, 0, + fixup_ebsa285 + }, { + MACH_TYPE_NETWINDER, + "Rebel-NetWinder", /* RMK */ + 0x00000100, + 0x000a0000, 0x000bffff, + 1, 0, 1, 0, 0, + fixup_netwinder + }, { + MACH_TYPE_CATS, + "Chalice-CATS", /* Philip Blundell */ + NO_PARAMS, + 0x000a0000, 0x000bffff, + 0, 0, 0, 0, 1, + fixup_cats + }, { + MACH_TYPE_TBOX, + "unknown-TBOX", /* Philip Blundell */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_CO285, + "co-EBSA285", /* Mark van Doesburg */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_coebsa285 + }, { + MACH_TYPE_CLPS7110, + "CL-PS7110", /* Werner Almesberger */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_ARCHIMEDES, + "Acorn-Archimedes",/* RMK/DAG */ + 0x0207c000, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_acorn + }, { + MACH_TYPE_A5K, + "Acorn-A5000", /* RMK/PB */ + 0x0207c000, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_acorn + }, { + MACH_TYPE_ETOILE, + "Etoile", /* Alex de Vries */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_LACIE_NAS, + "LaCie_NAS", /* Benjamin Herrenschmidt */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_CLPS7500, + "CL-PS7500", /* Philip Blundell */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_SHARK, + "Shark", /* Alexander Schulz */ + NO_PARAMS, + 0x06000000, 0x06000000+0x001fffff, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_SA1100, + "SA1100-based", /* Nicolas Pitre */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_sa1100 + }, { + MACH_TYPE_PERSONAL_SERVER, + "Compaq Personal Server", + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + } +}; diff --git a/arch/arm/kernel/arch.h b/arch/arm/kernel/arch.h new file mode 100644 index 000000000..b7635b11e --- /dev/null +++ b/arch/arm/kernel/arch.h @@ -0,0 +1,15 @@ +struct machine_desc { + unsigned int nr; /* architecture number */ + const char *name; /* architecture name */ + unsigned int param_offset; /* parameter page */ + unsigned int video_start; /* start of video RAM */ + unsigned int video_end; /* end of video RAM */ + unsigned int reserve_lp0 :1; /* never has lp0 */ + unsigned int reserve_lp1 :1; /* never has lp1 */ + unsigned int reserve_lp2 :1; /* never has lp2 */ + unsigned int broken_hlt :1; /* hlt is broken */ + unsigned int soft_reboot :1; /* soft reboot */ + void (*fixup)(struct machine_desc *, + struct param_struct *, char **, + struct meminfo *); +}; diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index c445daeee..5a1b4ed31 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -8,6 +8,7 @@ #include <linux/pci.h> #include <linux/delay.h> #include <linux/in6.h> +#include <linux/vt_kern.h> #include <asm/byteorder.h> #include <asm/elf.h> @@ -83,6 +84,8 @@ EXPORT_SYMBOL(fpundefinstr); EXPORT_SYMBOL(ret_from_exception); #endif +EXPORT_SYMBOL(kd_mksound); + /* platform dependent support */ EXPORT_SYMBOL(dump_thread); EXPORT_SYMBOL(dump_fpu); diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 7a1b57c22..1b0a064d0 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -222,8 +222,9 @@ static u8 __init no_swizzle(struct pci_dev *dev, u8 *pin) return 0; } -#ifdef CONFIG_FOOTBRIDGE /* ebsa285 host-specific stuff */ + +#ifdef CONFIG_ARCH_EBSA285 static int irqmap_ebsa285[] __initdata = { IRQ_IN1, IRQ_IN0, IRQ_PCI, IRQ_IN3 }; static u8 __init ebsa285_swizzle(struct pci_dev *dev, u8 *pin) @@ -251,7 +252,9 @@ static struct hw_pci ebsa285_pci __initdata = { ebsa285_swizzle, ebsa285_map_irq }; +#endif +#ifdef CONFIG_CATS /* cats host-specific stuff */ static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 }; @@ -277,7 +280,9 @@ static struct hw_pci cats_pci __initdata = { no_swizzle, cats_map_irq }; +#endif +#ifdef CONFIG_ARCH_NETWINDER /* netwinder host-specific stuff */ static int __init netwinder_map_irq(struct pci_dev *dev, u8 slot, u8 pin) { @@ -318,6 +323,41 @@ static struct hw_pci netwinder_pci __initdata = { }; #endif +#ifdef CONFIG_PERSONAL_SERVER +static int irqmap_personal_server[] __initdata = { + IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0, + IRQ_DOORBELLHOST, IRQ_DMA1, IRQ_DMA2, IRQ_PCI +}; + +static int __init personal_server_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +{ + unsigned char line; + + pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &line); + + if (line > 0x40 && line <= 0x5f) { + /* line corresponds to the bit controlling this interrupt + * in the footbridge. Ignore the first 8 interrupt bits, + * look up the rest in the map. IN0 is bit number 8 + */ + return irqmap_personal_server[(line & 0x1f) - 8]; + } else if (line == 0) { + /* no interrupt */ + return 0; + } else + return irqmap_personal_server[(line - 1) & 3]; +} + +static struct hw_pci personal_server_pci __initdata = { + dc21285_init, + 0x9000, + 0x00100000, + no_swizzle, + personal_server_map_irq +}; + +#endif + #ifdef CONFIG_ARCH_NEXUSPCI /* * Owing to a PCB cockup, issue A backplanes are wired thus: @@ -352,17 +392,38 @@ void __init pcibios_init(void) { struct hw_pci *hw_pci = NULL; -#ifdef CONFIG_FOOTBRIDGE - if (machine_is_ebsa285()) - hw_pci = &ebsa285_pci; - else if (machine_is_cats()) - hw_pci = &cats_pci; - else if (machine_is_netwinder()) - hw_pci = &netwinder_pci; + do { +#ifdef CONFIG_ARCH_EBSA285 + if (machine_is_ebsa285()) { + hw_pci = &ebsa285_pci; + break; + } +#endif +#ifdef CONFIG_CATS + if (machine_is_cats()) { + hw_pci = &cats_pci; + break; + } +#endif +#ifdef CONFIG_ARCH_NETWINDER + if (machine_is_netwinder()) { + hw_pci = &netwinder_pci; + break; + } +#endif +#ifdef CONFIG_PERSONAL_SERVER + if (machine_is_personal_server()) { + hw_pci = &personal_server_pci; + break; + } #endif #ifdef CONFIG_ARCH_NEXUSPCI - hw_pci = &ftv_pci; + if (machine_is_nexuspci()) { + hw_pci = &ftv_pci; + break; + } #endif + } while (0); if (hw_pci == NULL) return; diff --git a/arch/arm/kernel/head-armv.S b/arch/arm/kernel/head-armv.S index 35e71a4a9..27a280b8b 100644 --- a/arch/arm/kernel/head-armv.S +++ b/arch/arm/kernel/head-armv.S @@ -22,6 +22,7 @@ .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x8000 + SWAPPER_PGDIR_OFFSET .section ".text.init",#alloc,#execinstr + .type stext, #function ENTRY(stext) ENTRY(_stext) @@ -311,6 +312,7 @@ __lookup_architecture_type: * required for debugging information to be shown to the user. * paging_init() does the real page table initialisation. */ + .type __arch_types_start, #object @ 0x00 - DEC EBSA110 __arch_types_start: .long 0 @@ -398,15 +400,15 @@ __arch_types_start: @ 0x0e - CL-PS7500 .long 0 - .long 0 - .long 0 - .long 0 + .long 0x10000000 + .long 0x03000000 + .long 0xe0000000 - @ 0x0f - Shark - .long 0 - .long 0 - .long 0 + @ 0x0f - Digital Shark (DNARD) .long 0 + .long 0x08000000 + .long 0x40000000 + .long 0xe0000000 @ 0x10 - SA1100 .long 0 diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 0692d1a6c..0ace4c898 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -521,6 +521,48 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) /* give it a chance to run. */ ret = 0; goto out; + + case PTRACE_GETREGS: + { /* Get all gp regs from the child. */ + unsigned char *stack; + + ret = 0; + stack = (unsigned char *)((unsigned long)child + 8192 - sizeof(struct pt_regs)); + if (copy_to_user((void *)data, stack, + sizeof(struct pt_regs))) + ret = -EFAULT; + + goto out; + }; + + case PTRACE_SETREGS: + { + /* Set all gp regs in the child. */ + unsigned char *stack; + + ret = 0; + stack = (unsigned char *)((unsigned long)child + 8192 - sizeof(struct pt_regs)); + if (copy_from_user(stack, (void *)data, + sizeof(struct pt_regs))) + ret = -EFAULT; + goto out; + }; + + case PTRACE_GETFPREGS: + /* Get the child FPU state. */ + ret = 0; + if (copy_to_user((void *)data, &child->thread.fpstate, + sizeof(struct user_fp))) + ret = -EFAULT; + goto out; + + case PTRACE_SETFPREGS: + /* Set the child FPU state. */ + ret = 0; + if (copy_from_user(&child->thread.fpstate, (void *)data, + sizeof(struct user_fp))) + ret = -EFAULT; + goto out; case PTRACE_DETACH: /* detach a process that was attached. */ ret = -EIO; diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 5815529aa..6a3429bdd 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -1,13 +1,12 @@ /* * linux/arch/arm/kernel/setup.c * - * Copyright (C) 1995-1999 Russell King + * Copyright (C) 1995-2000 Russell King */ #include <linux/config.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/stddef.h> -#include <linux/tty.h> #include <linux/ioport.h> #include <linux/delay.h> #include <linux/utsname.h> @@ -23,6 +22,8 @@ #include <asm/setup.h> #include <asm/system.h> +#include "arch.h" + #ifndef MEM_SIZE #define MEM_SIZE (16*1024*1024) #endif @@ -31,6 +32,7 @@ #define CONFIG_CMDLINE "" #endif +extern void paging_init(struct meminfo *); extern void reboot_setup(char *str); extern void disable_hlt(void); extern int root_mountflags; @@ -38,33 +40,11 @@ extern int _stext, _text, _etext, _edata, _end; unsigned int processor_id; unsigned int __machine_arch_type; -unsigned int vram_size; unsigned int system_rev; unsigned int system_serial_low; unsigned int system_serial_high; unsigned int elf_hwcap; -#ifdef CONFIG_ARCH_ACORN -unsigned int memc_ctrl_reg; -unsigned int number_mfm_drives; -#endif - -struct meminfo meminfo; - -struct machine_desc { - const char *name; /* architecture name */ - unsigned int param_offset; /* parameter page */ - unsigned int video_start; /* start of video RAM */ - unsigned int video_end; /* end of video RAM */ - unsigned int reserve_lp0 :1; /* never has lp0 */ - unsigned int reserve_lp1 :1; /* never has lp1 */ - unsigned int reserve_lp2 :1; /* never has lp2 */ - unsigned int broken_hlt :1; /* hlt is broken */ - unsigned int soft_reboot :1; /* soft reboot */ - void (*fixup)(struct machine_desc *, - struct param_struct *, char **); -}; - #ifdef MULTI_CPU struct processor processor; #endif @@ -156,6 +136,33 @@ static void __init setup_processor(void) cpu_proc_init(); } +static struct machine_desc * __init setup_architecture(unsigned int nr) +{ + extern struct machine_desc __arch_info_begin, __arch_info_end; + struct machine_desc *list; + + /* + * locate architecture in the list of supported architectures. + */ + for (list = &__arch_info_begin; list < &__arch_info_end; list++) + if (list->nr == nr) + break; + + /* + * If the architecture type is not recognised, then we + * can co nothing... + */ + if (list >= &__arch_info_end) { + printk("Architecture configuration botched (nr %d), unable " + "to continue.\n", nr); + while (1); + } + + printk("Architecture: %s\n", list->name); + + return list; +} + static unsigned long __init memparse(char *ptr, char **retptr) { unsigned long ret = simple_strtoul(ptr, retptr, 0); @@ -180,7 +187,7 @@ static unsigned long __init memparse(char *ptr, char **retptr) * are "size[KkMm]" */ static void __init -parse_cmdline(char **cmdline_p, char *from) +parse_cmdline(struct meminfo *mi, char **cmdline_p, char *from) { char c = ' ', *to = command_line; int usermem = 0, len = 0; @@ -198,7 +205,7 @@ parse_cmdline(char **cmdline_p, char *from) */ if (usermem == 0) { usermem = 1; - meminfo.nr_banks = 0; + mi->nr_banks = 0; } start = PHYS_OFFSET; @@ -206,9 +213,9 @@ parse_cmdline(char **cmdline_p, char *from) if (*from == '@') start = memparse(from + 1, &from); - meminfo.bank[meminfo.nr_banks].start = start; - meminfo.bank[meminfo.nr_banks].size = size; - meminfo.nr_banks += 1; + mi->bank[mi->nr_banks].start = start; + mi->bank[mi->nr_banks].size = size; + mi->nr_banks += 1; } c = *from++; if (!c) @@ -265,7 +272,8 @@ static void __init setup_initrd(unsigned int start, unsigned int size) #define free_bootmem(s,sz) free_bootmem((s)<<PAGE_SHIFT, (sz)<<PAGE_SHIFT) #define reserve_bootmem(s,sz) reserve_bootmem((s)<<PAGE_SHIFT, (sz)<<PAGE_SHIFT) -static unsigned int __init find_bootmap_pfn(unsigned int bootmap_pages) +static unsigned int __init +find_bootmap_pfn(struct meminfo *mi, unsigned int bootmap_pages) { unsigned int start_pfn, bank, bootmap_pfn; @@ -278,25 +286,25 @@ static unsigned int __init find_bootmap_pfn(unsigned int bootmap_pages) */ #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start) { - if (__pa(initrd_end) > meminfo.end) { + if (__pa(initrd_end) > mi->end) { printk ("initrd extends beyond end of memory " "(0x%08lx > 0x%08lx) - disabling initrd\n", - __pa(initrd_end), meminfo.end); + __pa(initrd_end), mi->end); initrd_start = 0; initrd_end = 0; } } #endif - for (bank = 0; bank < meminfo.nr_banks; bank ++) { + for (bank = 0; bank < mi->nr_banks; bank ++) { unsigned int start, end; - if (meminfo.bank[bank].size == 0) + if (mi->bank[bank].size == 0) continue; - start = O_PFN_UP(meminfo.bank[bank].start); - end = O_PFN_DOWN(meminfo.bank[bank].size + - meminfo.bank[bank].start); + start = O_PFN_UP(mi->bank[bank].start); + end = O_PFN_DOWN(mi->bank[bank].size + + mi->bank[bank].start); if (end < start_pfn) continue; @@ -322,7 +330,7 @@ static unsigned int __init find_bootmap_pfn(unsigned int bootmap_pages) /* * Initialise the bootmem allocator. */ -static void __init setup_bootmem(void) +static void __init setup_bootmem(struct meminfo *mi) { unsigned int end_pfn, start_pfn, bootmap_pages, bootmap_pfn; unsigned int i; @@ -330,21 +338,21 @@ static void __init setup_bootmem(void) /* * Calculate the physical address of the top of memory. */ - meminfo.end = 0; - for (i = 0; i < meminfo.nr_banks; i++) { + mi->end = 0; + for (i = 0; i < mi->nr_banks; i++) { unsigned long end; - if (meminfo.bank[i].size != 0) { - end = meminfo.bank[i].start + meminfo.bank[i].size; - if (meminfo.end < end) - meminfo.end = end; + if (mi->bank[i].size != 0) { + end = mi->bank[i].start + mi->bank[i].size; + if (mi->end < end) + mi->end = end; } } start_pfn = O_PFN_UP(PHYS_OFFSET); - end_pfn = O_PFN_DOWN(meminfo.end); + end_pfn = O_PFN_DOWN(mi->end); bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn); - bootmap_pfn = find_bootmap_pfn(bootmap_pages); + bootmap_pfn = find_bootmap_pfn(mi, bootmap_pages); /* * Initialise the boot-time allocator @@ -354,10 +362,10 @@ static void __init setup_bootmem(void) /* * Register all available RAM with the bootmem allocator. */ - for (i = 0; i < meminfo.nr_banks; i++) - if (meminfo.bank[i].size) - free_bootmem(O_PFN_UP(meminfo.bank[i].start), - PFN_SIZE(meminfo.bank[i].size)); + for (i = 0; i < mi->nr_banks; i++) + if (mi->bank[i].size) + free_bootmem(O_PFN_UP(mi->bank[i].start), + PFN_SIZE(mi->bank[i].size)); /* * Register the reserved regions with bootmem @@ -379,7 +387,8 @@ static void __init setup_bootmem(void) #endif } -static void __init request_standard_resources(struct machine_desc *mdesc) +static void __init +request_standard_resources(struct meminfo *mi, struct machine_desc *mdesc) { struct resource *res; int i; @@ -389,14 +398,14 @@ static void __init request_standard_resources(struct machine_desc *mdesc) kernel_data.start = __virt_to_bus(init_mm.end_code); kernel_data.end = __virt_to_bus(init_mm.brk - 1); - for (i = 0; i < meminfo.nr_banks; i++) { + for (i = 0; i < mi->nr_banks; i++) { unsigned long virt_start, virt_end; - if (meminfo.bank[i].size == 0) + if (mi->bank[i].size == 0) continue; - virt_start = __phys_to_virt(meminfo.bank[i].start); - virt_end = virt_start + meminfo.bank[i].size - 1; + virt_start = __phys_to_virt(mi->bank[i].start); + virt_end = virt_start + mi->bank[i].size - 1; res = alloc_bootmem_low(sizeof(*res)); res->name = "System RAM"; @@ -432,270 +441,15 @@ static void __init request_standard_resources(struct machine_desc *mdesc) request_resource(&ioport_resource, &lp2); } -/* - * Architecture specific fixups. This is where any - * parameters in the params struct are fixed up, or - * any additional architecture specific information - * is pulled from the params struct. - */ -static void __init -fixup_acorn(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ -#ifdef CONFIG_ARCH_ACORN - int i; - - if (machine_is_riscpc()) { - /* - * RiscPC can't handle half-word loads and stores - */ - elf_hwcap &= ~HWCAP_HALF; - - switch (params->u1.s.pages_in_vram) { - case 512: - vram_size += PAGE_SIZE * 256; - case 256: - vram_size += PAGE_SIZE * 256; - default: - break; - } - - if (vram_size) { - desc->video_start = 0x02000000; - desc->video_end = 0x02000000 + vram_size; - } - - for (i = 0; i < 4; i++) { - meminfo.bank[i].start = PHYS_OFFSET + (i << 26); - meminfo.bank[i].size = - params->u1.s.pages_in_bank[i] * - params->u1.s.page_size; - } - meminfo.nr_banks = 4; - } - memc_ctrl_reg = params->u1.s.memc_control_reg; - number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3; -#endif -} - -static void __init -fixup_ebsa285(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ - ORIG_X = params->u1.s.video_x; - ORIG_Y = params->u1.s.video_y; - ORIG_VIDEO_COLS = params->u1.s.video_num_cols; - ORIG_VIDEO_LINES = params->u1.s.video_num_rows; -} - -/* - * Older NeTTroms either do not provide a parameters - * page, or they don't supply correct information in - * the parameter page. - */ -static void __init -fixup_netwinder(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ - if (params->u1.s.nr_pages != 0x2000 && - params->u1.s.nr_pages != 0x4000) { - printk(KERN_WARNING "Warning: bad NeTTrom parameters " - "detected, using defaults\n"); - - params->u1.s.nr_pages = 0x2000; /* 32MB */ - params->u1.s.ramdisk_size = 0; - params->u1.s.flags = FLAG_READONLY; - params->u1.s.initrd_start = 0; - params->u1.s.initrd_size = 0; - params->u1.s.rd_start = 0; - } -} - -/* - * CATS uses soft-reboot by default, since - * hard reboots fail on early boards. - */ -static void __init -fixup_cats(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ - ORIG_VIDEO_LINES = 25; - ORIG_VIDEO_POINTS = 16; - ORIG_Y = 24; -} - -static void __init -fixup_coebsa285(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ -#if 0 - extern unsigned long boot_memory_end; - extern char boot_command_line[]; - - meminfo.nr_banks = 1; - meminfo.bank[0].start = PHYS_OFFSET; - meminfo.bank[0].size = boot_memory_end; - - *cmdline = boot_command_line; -#endif -} - -static void __init -fixup_sa1100(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ -#ifdef CONFIG_ARCH_SA1100 - int i; - extern struct mem_desc { - unsigned long phys_start; - unsigned long length; - } mem_desc[]; - extern unsigned int mem_desc_size; - - for( i = 0; i < mem_desc_size; i++ ) { - if( i >= NR_BANKS ) { - printk( __FUNCTION__ - ": mem_desc too large for meminfo structure\n"); - break; - } - meminfo.bank[i].start = mem_desc[i].phys_start; - meminfo.bank[i].size = mem_desc[i].length; - } - meminfo.nr_banks = i; - -#if defined(CONFIG_SA1100_BRUTUS) - ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); - setup_ramdisk( 1, 0, 0, 8192 ); - setup_initrd( __phys_to_virt(0xd8000000), 0x00400000 ); -#elif defined(CONFIG_SA1100_EMPEG) - ROOT_DEV = MKDEV( 3, 1 ); /* /dev/hda1 */ - setup_ramdisk( 1, 0, 0, 4096 ); - setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) ); -#elif defined(CONFIG_SA1100_TIFON) - ROOT_DEV = MKDEV(UNNAMED_MAJOR, 0); - setup_ramdisk(1, 0, 0, 4096); - setup_initrd( 0xd0000000 + 0x1100004, 0x140000 ); -#elif defined(CONFIG_SA1100_VICTOR) - ROOT_DEV = MKDEV( 60, 2 ); - - /* Get command line parameters passed from the loader (if any) */ - if( *((char*)0xc0000000) ) - strcpy( default_command_line, ((char *)0xc0000000) ); - - /* power off if any problem */ - strcat( default_command_line, " panic=1" ); -#elif defined(CONFIG_SA1100_LART) - ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); - setup_ramdisk(1, 0, 0, 8192); - setup_initrd(0xc0400000, 0x00400000); -#endif -#endif -} - -#define NO_PARAMS 0 -#define NO_VIDEO 0, 0 - -/* - * This is the list of all architectures supported by - * this kernel. This should be integrated with the list - * in head-armv.S. - */ -static struct machine_desc machine_desc[] __initdata = { - { "EBSA110", /* RMK */ - 0x00000400, - NO_VIDEO, - 1, 0, 1, 1, 1, - NULL - }, { "Acorn-RiscPC", /* RMK */ - 0x10000100, - NO_VIDEO, - 1, 1, 0, 0, 0, - fixup_acorn - }, { "unknown", - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "FTV/PCI", /* Philip Blundell */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "EBSA285", /* RMK */ - 0x00000100, - 0x000a0000, 0x000bffff, - 0, 0, 0, 0, 0, - fixup_ebsa285 - }, { "Rebel-NetWinder", /* RMK */ - 0x00000100, - 0x000a0000, 0x000bffff, - 1, 0, 1, 0, 0, - fixup_netwinder - }, { "Chalice-CATS", /* Philip Blundell */ - NO_PARAMS, - 0x000a0000, 0x000bffff, - 0, 0, 0, 0, 1, - fixup_cats - }, { "unknown-TBOX", /* Philip Blundell */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "co-EBSA285", /* Mark van Doesburg */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_coebsa285 - }, { "CL-PS7110", /* Werner Almesberger */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "Acorn-Archimedes",/* RMK/DAG */ - 0x0207c000, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_acorn - }, { "Acorn-A5000", /* RMK/PB */ - 0x0207c000, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_acorn - }, { "Etoile", /* Alex de Vries */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "LaCie_NAS", /* Benjamin Herrenschmidt */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "CL-PS7500", /* Philip Blundell */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "Shark", /* Alexander Schulz */ - NO_PARAMS, - /* do you really mean 0x200000? */ - 0x06000000, 0x06000000+0x00200000, - 0, 0, 0, 0, 0, - NULL - }, { "SA1100-based", /* Nicolas Pitre */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_sa1100 - } -}; - void __init setup_arch(char **cmdline_p) { struct param_struct *params = NULL; struct machine_desc *mdesc; + struct meminfo meminfo; char *from = default_command_line; + memset(&meminfo, 0, sizeof(meminfo)); + #if defined(CONFIG_ARCH_ARC) __machine_arch_type = MACH_TYPE_ARCHIMEDES; #elif defined(CONFIG_ARCH_A5K) @@ -706,7 +460,7 @@ void __init setup_arch(char **cmdline_p) ROOT_DEV = MKDEV(0, 255); - mdesc = machine_desc + machine_arch_type; + mdesc = setup_architecture(machine_arch_type); machine_name = mdesc->name; if (mdesc->broken_hlt) @@ -719,7 +473,7 @@ void __init setup_arch(char **cmdline_p) params = phys_to_virt(mdesc->param_offset); if (mdesc->fixup) - mdesc->fixup(mdesc, params, &from); + mdesc->fixup(mdesc, params, &from, &meminfo); if (params && params->u1.s.page_size != PAGE_SIZE) { printk(KERN_WARNING "Warning: bad configuration page, " @@ -763,11 +517,11 @@ void __init setup_arch(char **cmdline_p) memcpy(saved_command_line, from, COMMAND_LINE_SIZE); saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; - parse_cmdline(cmdline_p, from); - setup_bootmem(); - request_standard_resources(mdesc); + parse_cmdline(&meminfo, cmdline_p, from); + setup_bootmem(&meminfo); + request_standard_resources(&meminfo, mdesc); - paging_init(); + paging_init(&meminfo); #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 5046a3377..510a38451 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -14,37 +14,25 @@ L_OBJS := changebit.o csumipv6.o csumpartial.o csumpartialcopy.o \ O_TARGET := lib.o O_OBJS := backtrace.o delay.o +L_OBJS_arc := io-acorn.o +L_OBJS_a5k := io-acorn.o floppydma.o +L_OBJS_rpc := io-acorn.o floppydma.o +L_OBJS_clps7500 := io-acorn.o +L_OBJS_ebsa110 := io-ebsa110.o +L_OBJS_footbridge := io-footbridge.o +L_OBJS_nexuspci := io-footbridge.o +L_OBJS_sa1100 := io-footbridge.o +L_OBJS_shark := io-shark.o + ifeq ($(PROCESSOR),armo) L_OBJS += uaccess-armo.o endif -ifdef CONFIG_ARCH_ACORN - L_OBJS += io-acorn.o - ifdef CONFIG_ARCH_A5K - L_OBJS += floppydma.o - endif - ifdef CONFIG_ARCH_RPC - L_OBJS += floppydma.o - endif -endif - -ifeq ($(MACHINE),ebsa110) - L_OBJS += io-ebsa110.o -else +ifneq ($(MACHINE),ebsa110) OX_OBJS += io.o endif -ifeq ($(MACHINE),footbridge) - L_OBJS += io-footbridge.o -endif - -# -# SA1100 IO routines happen to be the -# same as the footbridge routines -# -ifeq ($(MACHINE),sa1100) - L_OBJS += io-footbridge.o -endif +L_OBJS += $(L_OBJS_$(MACHINE)) include $(TOPDIR)/Rules.make diff --git a/arch/arm/lib/io-shark.c b/arch/arm/lib/io-shark.c new file mode 100644 index 000000000..41595bc6f --- /dev/null +++ b/arch/arm/lib/io-shark.c @@ -0,0 +1,79 @@ +/* + * linux/arch/arm/lib/io-shark.c + * + * by Alexander.Schulz@stud.uni-karlsruhe.de + * + * derived from: + * linux/arch/arm/lib/io-ebsa.S + * Copyright (C) 1995, 1996 Russell King + */ +#include <linux/kernel.h> + +#include <asm/io.h> + +void print_warning(void) +{ + printk(KERN_WARNING "ins?/outs? not implemented on this architecture\n"); +} + +void insl(unsigned int port, void *to, int len) +{ + print_warning(); +} + +void insb(unsigned int port, void *to, int len) +{ + print_warning(); +} + +void outsl(unsigned int port, const void *from, int len) +{ + print_warning(); +} + +void outsb(unsigned int port, const void *from, int len) +{ + print_warning(); +} + +/* these should be in assembler again */ + +/* + * Purpose: read a block of data from a hardware register to memory. + * Proto : insw(int from_port, void *to, int len_in_words); + * Proto : inswb(int from_port, void *to, int len_in_bytes); + * Notes : increment to + */ + +void insw(unsigned int port, void *to, int len) +{ + int i; + + for (i = 0; i < len; i++) + ((unsigned short *) to)[i] = inw(port); +} + +void inswb(unsigned int port, void *to, int len) +{ + insw(port, to, len >> 2); +} + +/* + * Purpose: write a block of data from memory to a hardware register. + * Proto : outsw(int to_reg, void *from, int len_in_words); + * Proto : outswb(int to_reg, void *from, int len_in_bytes); + * Notes : increments from + */ + +void outsw(unsigned int port, const void *from, int len) +{ + int i; + + for (i = 0; i < len; i++) + outw(((unsigned short *) from)[i], port); +} + +void outswb(unsigned int port, const void *from, int len) +{ + outsw(port, from, len >> 2); +} diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index c58e66647..e7b8c8bb9 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -33,6 +33,7 @@ #include "map.h" static unsigned long totalram_pages; +struct meminfo meminfo; pgd_t swapper_pg_dir[PTRS_PER_PGD]; /* @@ -160,12 +161,14 @@ void show_mem(void) /* * paging_init() sets up the page tables... */ -void __init paging_init(void) +void __init paging_init(struct meminfo *mi) { void *zero_page, *bad_page, *bad_table; unsigned long zone_size[MAX_NR_ZONES]; int i; + memcpy(&meminfo, mi, sizeof(meminfo)); + #ifdef CONFIG_CPU_32 #define TABLE_OFFSET (PTRS_PER_PTE) #else @@ -197,12 +200,12 @@ void __init paging_init(void) * any problems with DMA or highmem, so all memory is * allocated to the DMA zone. */ - for (i = 0; i < meminfo.nr_banks; i++) { - if (meminfo.bank[i].size) { + for (i = 0; i < mi->nr_banks; i++) { + if (mi->bank[i].size) { unsigned int end; - end = (meminfo.bank[i].start - PHYS_OFFSET + - meminfo.bank[i].size) >> PAGE_SHIFT; + end = (mi->bank[i].start - PHYS_OFFSET + + mi->bank[i].size) >> PAGE_SHIFT; if (zone_size[0] < end) zone_size[0] = end; } @@ -328,24 +331,6 @@ void free_initmem(void) (unsigned long)(&__init_end), "init"); -#ifdef CONFIG_FOOTBRIDGE - { - extern int __netwinder_begin, __netwinder_end, - __ebsa285_begin, __ebsa285_end; - - if (!machine_is_netwinder()) - free_area((unsigned long)(&__netwinder_begin), - (unsigned long)(&__netwinder_end), - "netwinder"); - - if (!machine_is_ebsa285() && !machine_is_cats() && - !machine_is_co285()) - free_area((unsigned long)(&__ebsa285_begin), - (unsigned long)(&__ebsa285_end), - "ebsa285/cats"); - } -#endif - printk("\n"); } diff --git a/arch/arm/mm/proc-arm6,7.S b/arch/arm/mm/proc-arm6,7.S index c6c776acf..9814d2a9c 100644 --- a/arch/arm/mm/proc-arm6,7.S +++ b/arch/arm/mm/proc-arm6,7.S @@ -107,19 +107,45 @@ msg: .ascii "DA*%p=%p\n\0" ENTRY(cpu_arm6_data_abort) ldr r4, [r0] @ read instruction causing problem mov r2, r4, lsr #19 @ r2 b1 = L -Ldata_simple: + and r1, r4, #14 << 24 and r2, r2, #2 @ check read/write bit - mrc p15, 0, r0, c6, c0, 0 @ get FAR + teq r1, #4 << 23 + bne Ldata_simple + + +Ldata_ldmstm: tst r4, #1 << 21 @ check writeback bit + beq Ldata_simple + mov r7, #0x11 + orr r7, r7, r7, lsl #8 + and r0, r4, r7 + and r1, r4, r7, lsl #1 + add r0, r0, r1, lsr #1 + and r1, r4, r7, lsl #2 + add r0, r0, r1, lsr #2 + and r1, r4, r7, lsl #3 + add r0, r0, r1, lsr #3 + add r0, r0, r0, lsr #8 + add r0, r0, r0, lsr #4 + and r7, r0, #15 @ r7 = no. of registers to transfer. + and r5, r4, #15 << 16 @ Get Rn + ldr r0, [sp, r5, lsr #14] @ Get register + tst r4, #1 << 23 @ U bit + subne r7, r0, r7, lsl #2 + addeq r7, r0, r7, lsl #2 @ Do correction (signed) +Ldata_saver7: str r7, [sp, r5, lsr #14] @ Put register +Ldata_simple: mrc p15, 0, r0, c6, c0, 0 @ get FAR mrc p15, 0, r1, c5, c0, 0 @ get FSR - and r1, r1, #15 + and r1, r1, #255 mov pc, lr ENTRY(cpu_arm7_data_abort) ldr r4, [r0] @ read instruction causing problem mov r2, r4, lsr #19 @ r2 b1 = L and r1, r4, #15 << 24 + and r2, r2, #2 @ check read/write bit add pc, pc, r1, lsr #22 @ Now branch to the relevent processing routine movs pc, lr + b Ldata_unknown b Ldata_unknown b Ldata_unknown @@ -141,106 +167,24 @@ Ldata_unknown: @ Part of jumptable mov r2, r3 b baddataabort -Ldata_ldmstm: tst r4, #1 << 21 @ check writeback bit - beq Ldata_simple - - mov r7, #0x11 - orr r7, r7, r7, lsl #8 - and r0, r4, r7 - and r1, r4, r7, lsl #1 - add r0, r0, r1, lsr #1 - and r1, r4, r7, lsl #2 - add r0, r0, r1, lsr #2 - and r1, r4, r7, lsl #3 - add r0, r0, r1, lsr #3 - add r0, r0, r0, lsr #8 - add r0, r0, r0, lsr #4 - and r7, r0, #15 @ r7 = no. of registers to transfer. - and r5, r4, #15 << 16 @ Get Rn - ldr r0, [sp, r5, lsr #14] @ Get register - eor r6, r4, r4, lsl #2 - tst r6, #1 << 23 @ Check inc/dec ^ writeback - rsbeq r7, r7, #0 - add r7, r0, r7, lsl #2 @ Do correction (signed) - str r7, [sp, r5, lsr #14] @ Put register - -Ldata_lateldrpostconst: - movs r1, r4, lsl #20 @ Get offset - beq Ldata_simple @ if offset is zero, no effect - and r5, r4, #15 << 16 @ Get Rn - ldr r0, [sp, r5, lsr #14] - tst r4, #1 << 23 @ U bit - subne r0, r0, r1, lsr #20 - addeq r0, r0, r1, lsr #20 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple Ldata_lateldrpreconst: tst r4, #1 << 21 @ check writeback bit - movnes r1, r4, lsl #20 @ Get offset + beq Ldata_simple +Ldata_lateldrpostconst: + movs r1, r4, lsl #20 @ Get offset beq Ldata_simple and r5, r4, #15 << 16 @ Get Rn ldr r0, [sp, r5, lsr #14] tst r4, #1 << 23 @ U bit - subne r0, r0, r1, lsr #20 - addeq r0, r0, r1, lsr #20 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple - -Ldata_lateldrpostreg: - and r5, r4, #15 - ldr r1, [sp, r5, lsl #2] @ Get Rm - mov r3, r4, lsr #7 - ands r3, r3, #31 - and r6, r4, #0x70 - orreq r6, r6, #8 - add pc, pc, r6 - mov r0, r0 - - mov r1, r1, lsl r3 @ 0: LSL #!0 - b 1f - b 1f @ 1: LSL #0 - mov r0, r0 - b 1f @ 2: MUL? - mov r0, r0 - b 1f @ 3: MUL? - mov r0, r0 - mov r1, r1, lsr r3 @ 4: LSR #!0 - b 1f - mov r1, r1, lsr #32 @ 5: LSR #32 - b 1f - b 1f @ 6: MUL? - mov r0, r0 - b 1f @ 7: MUL? - mov r0, r0 - mov r1, r1, asr r3 @ 8: ASR #!0 - b 1f - mov r1, r1, asr #32 @ 9: ASR #32 - b 1f - b 1f @ A: MUL? - mov r0, r0 - b 1f @ B: MUL? - mov r0, r0 - mov r1, r1, ror r3 @ C: ROR #!0 - b 1f - mov r1, r1, rrx @ D: RRX - b 1f - mov r0, r0 @ E: MUL? - mov r0, r0 - mov r0, r0 @ F: MUL? - - -1: and r5, r4, #15 << 16 @ Get Rn - ldr r0, [sp, r5, lsr #14] - tst r4, #1 << 23 @ U bit - subne r0, r0, r1 - addeq r0, r0, r1 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple + subne r7, r0, r1, lsr #20 + addeq r7, r0, r1, lsr #20 + b Ldata_saver7 Ldata_lateldrprereg: tst r4, #1 << 21 @ check writeback bit beq Ldata_simple +Ldata_lateldrpostreg: and r5, r4, #15 ldr r1, [sp, r5, lsl #2] @ Get Rm mov r3, r4, lsr #7 @@ -286,10 +230,9 @@ Ldata_lateldrprereg: 1: and r5, r4, #15 << 16 @ Get Rn ldr r0, [sp, r5, lsr #14] tst r4, #1 << 23 @ U bit - subne r0, r0, r1 - addeq r0, r0, r1 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple + subne r7, r0, r1 + addeq r7, r0, r1 + b Ldata_saver7 /* * Function: arm6_7_check_bugs (void) diff --git a/arch/arm/vmlinux-armo.lds.in b/arch/arm/vmlinux-armo.lds.in index 94c155232..9d5ee058d 100644 --- a/arch/arm/vmlinux-armo.lds.in +++ b/arch/arm/vmlinux-armo.lds.in @@ -6,76 +6,89 @@ OUTPUT_ARCH(arm) ENTRY(stext) SECTIONS { - . = TEXTADDR; + . = TEXTADDR; - __init_begin = .; /* Init code and data */ - .text.init : { *(.text.init) } - __proc_info_begin = .; - .proc.info : { *(.proc.info) } - __proc_info_end = .; - .data.init : { *(.data.init) } - . = ALIGN(16); - __setup_start = .; - .setup.init : { *(.setup.init) } - __setup_end = .; - __initcall_start = .; - .initcall.init : { *(.initcall.init) } - __initcall_end = .; - . = ALIGN(32768); - __init_end = .; - - .init.task : { - *(.init.task) - } + .init : { + __init_begin = .; /* Init code and data */ + *(.text.init) + __proc_info_begin = .; + *(.proc.info) + __proc_info_end = .; + __arch_info_begin = .; + *(.arch.info) + __arch_info_end = .; + *(.data.init) + . = ALIGN(16); + __setup_start = .; + *(.setup.init) + __setup_end = .; + __initcall_start = .; + *(.initcall.init) + __initcall_end = .; + . = ALIGN(32768); + __init_end = .; + } - /DISCARD/ : { /* Exit code and data */ - *(.text.exit) - *(.data.exit) - } + .init.task : { + *(.init.task) + } - _text = .; /* Text and read-only data */ - .text : { - *(.text) - *(.fixup) - *(.gnu.warning) + /DISCARD/ : { /* Exit code and data */ + *(.text.exit) + *(.data.exit) } - .text.lock : { *(.text.lock) } /* out-of-line lock text */ - .rodata : { *(.rodata) } - .kstrtab : { *(.kstrtab) } + .text : { + _text = .; /* Text and read-only data */ + *(.text) + *(.fixup) + *(.gnu.warning) + *(.text.lock) /* out-of-line lock text */ + *(.rodata) + *(.kstrtab) + . = ALIGN(16); /* Exception table */ + __start___ex_table = .; + *(__ex_table) + __stop___ex_table = .; - . = ALIGN(16); /* Exception table */ - __start___ex_table = .; - __ex_table : { *(__ex_table) } - __stop___ex_table = .; + __start___ksymtab = .; /* Kernel symbol table */ + *(__ksymtab) + __stop___ksymtab = .; - __start___ksymtab = .; /* Kernel symbol table */ - __ksymtab : { *(__ksymtab) } - __stop___ksymtab = .; + *(.got) /* Global offset table */ + + _etext = .; /* End of text section */ + } - .got : { *(.got) } /* Global offset table */ + .data : { + /* + * The cacheline aligned data + */ + . = ALIGN(32); + *(.data.cacheline_aligned) - _etext = .; /* End of text section */ + /* + * and the usual data section + */ + *(.data) + CONSTRUCTORS - .data : { /* Data */ - *(.data) - CONSTRUCTORS + _edata = .; } - _edata = .; /* End of data section */ - __bss_start = .; /* BSS */ - .bss : { - *(.bss) + .bss : { + __bss_start = .; /* BSS */ + *(.bss) + _end = . ; } - _end = . ; - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } } diff --git a/arch/arm/vmlinux-armv.lds.in b/arch/arm/vmlinux-armv.lds.in index d2a79ca9d..1476ba939 100644 --- a/arch/arm/vmlinux-armv.lds.in +++ b/arch/arm/vmlinux-armv.lds.in @@ -13,6 +13,9 @@ SECTIONS __proc_info_begin = .; *(.proc.info) __proc_info_end = .; + __arch_info_begin = .; + *(.arch.info) + __arch_info_end = .; *(.data.init) . = ALIGN(16); __setup_start = .; @@ -25,6 +28,11 @@ SECTIONS __init_end = .; } + /DISCARD/ : { /* Exit code and data */ + *(.text.exit) + *(.data.exit) + } + .text : { /* Real text segment */ _text = .; /* Text and read-only data */ *(.text) |