diff options
Diffstat (limited to 'arch')
36 files changed, 800 insertions, 453 deletions
diff --git a/arch/i386/Makefile b/arch/i386/Makefile index e13adc089..9978cac9d 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile @@ -17,7 +17,6 @@ # LD=$(CROSS_COMPILE)ld -m elf_i386 -CPP=$(CC) -E OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S LDFLAGS=-e stext LINKFLAGS =-T $(TOPDIR)/arch/i386/vmlinux.lds $(LDFLAGS) @@ -58,6 +57,12 @@ CFLAGS += $(shell if $(CC) -march=i686 -S -o /dev/null -xc /dev/null >/dev/null AFLAGS := $(AFLAGS) -DCPU=686 endif +ifdef CONFIG_MK7 +CFLAGS := $(CFLAGS) -DCPU=686 -march=pentiumpro -mpentiumpro -malign-functions=4 -fschedule-insns2 -mwide-multiply -fexpensive-optimizations +CFLAGS += $(shell if $(CC) -march=i686 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=i686"; fi) +AFLAGS := $(AFLAGS) -DCPU=686 +endif + HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o SUBDIRS := $(SUBDIRS) arch/i386/kernel arch/i386/mm arch/i386/lib @@ -80,10 +85,13 @@ MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot vmlinux: arch/i386/vmlinux.lds arch/i386/vmlinux.lds: arch/i386/vmlinux.lds.S FORCE - gcc -E -C -P -I$(HPATH) -imacros $(HPATH)/asm-i386/page_offset.h -Ui386 arch/i386/vmlinux.lds.S >arch/i386/vmlinux.lds + $(CPP) -C -P -imacros $(HPATH)/asm-i386/page_offset.h -Ui386 arch/i386/vmlinux.lds.S >arch/i386/vmlinux.lds FORCE: ; +.PHONY: zImage bzImage compressed zlilo bzlilo zdisk bzdisk install \ + clean archclean archmrproper archdep + zImage: vmlinux @$(MAKEBOOT) zImage diff --git a/arch/i386/boot/bootsect.S b/arch/i386/boot/bootsect.S index ffddb4327..e7327e1e1 100644 --- a/arch/i386/boot/bootsect.S +++ b/arch/i386/boot/bootsect.S @@ -247,7 +247,7 @@ die: jne die # es must be at 64kB boundary xorw %bx, %bx # bx is starting address within segment rp_read: #ifdef __BIG_KERNEL__ - lcall bootsect_kludge # in setup.S + .word 0x1eff, 0x0220 # lcall *bootsect_kludge in setup.S #else movw %es, %ax subw $SYSSEG, %ax @@ -401,7 +401,7 @@ kill_motor: pushw %dx movw $0x3f2, %dx xorb %al, %al - outw %al, %dx + outb %al, %dx popw %dx ret diff --git a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S index 1a6d6baa8..859c7248b 100644 --- a/arch/i386/boot/setup.S +++ b/arch/i386/boot/setup.S @@ -145,7 +145,7 @@ start_of_setup: #ifdef SAFE_RESET_DISK_CONTROLLER # Reset the disk controller. movw $0x0000, %ax - movb $0x80, $dl + movb $0x80, %dl int $0x13 #endif @@ -400,7 +400,7 @@ is_disk1: subw $DELTA_INITSEG, %ax # aka INITSEG movw %ax, %ds xorw %ax, %ax - movw %ax, 0xa0 # set table length to 0 + movw %ax, (0xa0) # set table length to 0 movb $0xc0, %ah stc int $0x15 # moves feature table to es:bx @@ -496,7 +496,7 @@ done_apm_bios: cmpw $0, %cs:realmode_swtch jz rmodeswtch_normal - call *%cs:realmode_swtch + lcall %cs:realmode_swtch jmp rmodeswtch_end diff --git a/arch/i386/config.in b/arch/i386/config.in index 872822e6c..9d373d1ed 100644 --- a/arch/i386/config.in +++ b/arch/i386/config.in @@ -19,21 +19,27 @@ choice 'Processor family' \ 486/Cx486 CONFIG_M486 \ 586/K5/5x86/6x86 CONFIG_M586 \ Pentium/K6/TSC CONFIG_M586TSC \ - PPro/6x86MX CONFIG_M686" PPro + PPro/6x86MX CONFIG_M686 \ + Athlon CONFIG_MK7" PPro # # Define implied options from the CPU selection here # if [ "$CONFIG_M386" != "y" ]; then - define_bool CONFIG_X86_WP_WORKS_OK y - define_bool CONFIG_X86_INVLPG y - define_bool CONFIG_X86_BSWAP y - define_bool CONFIG_X86_POPAD_OK y + define_bool CONFIG_X86_WP_WORKS_OK y + define_bool CONFIG_X86_INVLPG y + define_bool CONFIG_X86_BSWAP y + define_bool CONFIG_X86_POPAD_OK y fi if [ "$CONFIG_M686" = "y" -o "$CONFIG_M586TSC" = "y" ]; then - define_bool CONFIG_X86_TSC y + define_bool CONFIG_X86_TSC y fi if [ "$CONFIG_M686" = "y" ]; then - define_bool CONFIG_X86_GOOD_APIC y + define_bool CONFIG_X86_GOOD_APIC y +fi +if [ "$CONFIG_MK7" = "y" ]; then + define_bool CONFIG_X86_TSC y + define_bool CONFIG_X86_GOOD_APIC y + define_bool CONFIG_X86_USE_3DNOW y fi choice 'Maximum Physical Memory' \ @@ -49,8 +55,8 @@ mainmenu_option next_comment comment 'Loadable module support' bool 'Enable loadable module support' CONFIG_MODULES if [ "$CONFIG_MODULES" = "y" ]; then - bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS - bool 'Kernel module loader' CONFIG_KMOD + bool ' Set version information on all module symbols' CONFIG_MODVERSIONS + bool ' Kernel module loader' CONFIG_KMOD fi endmenu @@ -61,28 +67,29 @@ bool 'BIGMEM support' CONFIG_BIGMEM bool 'Networking support' CONFIG_NET bool 'SGI Visual Workstation support' CONFIG_VISWS if [ "$CONFIG_VISWS" = "y" ]; then - define_bool CONFIG_X86_VISWS_APIC y - define_bool CONFIG_X86_LOCAL_APIC y - define_bool CONFIG_PCI y + define_bool CONFIG_X86_VISWS_APIC y + define_bool CONFIG_X86_LOCAL_APIC y + define_bool CONFIG_PCI y else - if [ "$CONFIG_SMP" = "y" ]; then - define_bool CONFIG_X86_IO_APIC y - define_bool CONFIG_X86_LOCAL_APIC y - fi - bool 'PCI support' CONFIG_PCI - if [ "$CONFIG_PCI" = "y" ]; then - choice 'PCI access mode' \ + if [ "$CONFIG_SMP" = "y" ]; then + define_bool CONFIG_X86_IO_APIC y + define_bool CONFIG_X86_LOCAL_APIC y + fi + bool 'PCI support' CONFIG_PCI + if [ "$CONFIG_PCI" = "y" ]; then + choice ' PCI access mode' \ "BIOS CONFIG_PCI_GOBIOS \ Direct CONFIG_PCI_GODIRECT \ Any CONFIG_PCI_GOANY" Any - if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then - define_bool CONFIG_PCI_BIOS y - fi - if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then - define_bool CONFIG_PCI_DIRECT y - fi - fi - bool 'MCA support' CONFIG_MCA + if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then + define_bool CONFIG_PCI_BIOS y + fi + if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then + define_bool CONFIG_PCI_DIRECT y + fi + fi + bool 'MCA support' CONFIG_MCA + fi source drivers/pcmcia/Config.in @@ -96,17 +103,17 @@ tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC source drivers/parport/Config.in -tristate 'Advanced Power Management BIOS support' CONFIG_APM +bool 'Advanced Power Management BIOS support' CONFIG_APM if [ "$CONFIG_APM" != "n" ]; then - bool ' Ignore USER SUSPEND' CONFIG_APM_IGNORE_USER_SUSPEND - bool ' Enable PM at boot time' CONFIG_APM_DO_ENABLE - bool ' Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE - bool ' Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK - bool ' Power off on shutdown' CONFIG_APM_POWER_OFF - bool ' Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND - bool ' Ignore multiple suspend/resume cycles' CONFIG_APM_IGNORE_SUSPEND_BOUNCE - bool ' RTC stores time in GMT' CONFIG_APM_RTC_IS_GMT - bool ' Allow interrupts during APM BIOS calls' CONFIG_APM_ALLOW_INTS + bool ' Ignore USER SUSPEND' CONFIG_APM_IGNORE_USER_SUSPEND + bool ' Enable PM at boot time' CONFIG_APM_DO_ENABLE + bool ' Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE + bool ' Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK + bool ' Power off on shutdown' CONFIG_APM_POWER_OFF + bool ' Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND + bool ' Ignore multiple suspend/resume cycles' CONFIG_APM_IGNORE_SUSPEND_BOUNCE + bool ' RTC stores time in GMT' CONFIG_APM_RTC_IS_GMT + bool ' Allow interrupts during APM BIOS calls' CONFIG_APM_ALLOW_INTS fi endmenu @@ -118,7 +125,7 @@ source drivers/pnp/Config.in source drivers/block/Config.in if [ "$CONFIG_NET" = "y" ]; then - source net/Config.in + source net/Config.in fi mainmenu_option next_comment @@ -127,22 +134,22 @@ comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI if [ "$CONFIG_SCSI" != "n" ]; then - source drivers/scsi/Config.in + source drivers/scsi/Config.in fi endmenu if [ "$CONFIG_NET" = "y" ]; then - mainmenu_option next_comment - comment 'Network device support' - - bool 'Network device support' CONFIG_NETDEVICES - if [ "$CONFIG_NETDEVICES" = "y" ]; then - source drivers/net/Config.in - if [ "$CONFIG_ATM" = "y" ]; then - source drivers/atm/Config.in - fi - fi - endmenu + mainmenu_option next_comment + comment 'Network device support' + + bool 'Network device support' CONFIG_NETDEVICES + if [ "$CONFIG_NETDEVICES" = "y" ]; then + source drivers/net/Config.in + if [ "$CONFIG_ATM" = "y" ]; then + source drivers/atm/Config.in + fi + fi + endmenu fi source net/ax25/Config.in @@ -152,10 +159,10 @@ source net/irda/Config.in mainmenu_option next_comment comment 'ISDN subsystem' if [ "$CONFIG_NET" != "n" ]; then - tristate 'ISDN support' CONFIG_ISDN - if [ "$CONFIG_ISDN" != "n" ]; then - source drivers/isdn/Config.in - fi + tristate 'ISDN support' CONFIG_ISDN + if [ "$CONFIG_ISDN" != "n" ]; then + source drivers/isdn/Config.in + fi fi endmenu @@ -164,7 +171,7 @@ comment 'Old CD-ROM drivers (not SCSI, not IDE)' bool 'Support non-SCSI/IDE/ATAPI CDROM drives' CONFIG_CD_NO_IDESCSI if [ "$CONFIG_CD_NO_IDESCSI" != "n" ]; then - source drivers/cdrom/Config.in + source drivers/cdrom/Config.in fi endmenu @@ -177,15 +184,15 @@ source drivers/misc/Config.in source fs/Config.in if [ "$CONFIG_VT" = "y" ]; then - mainmenu_option next_comment - comment 'Console drivers' - bool 'VGA text console' CONFIG_VGA_CONSOLE - bool 'Video mode selection support' CONFIG_VIDEO_SELECT - if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'MDA text console (dual-headed) (EXPERIMENTAL)' CONFIG_MDA_CONSOLE - source drivers/video/Config.in - fi - endmenu + mainmenu_option next_comment + comment 'Console drivers' + bool 'VGA text console' CONFIG_VGA_CONSOLE + bool 'Video mode selection support' CONFIG_VIDEO_SELECT + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + tristate 'MDA text console (dual-headed) (EXPERIMENTAL)' CONFIG_MDA_CONSOLE + source drivers/video/Config.in + fi + endmenu fi mainmenu_option next_comment @@ -193,7 +200,7 @@ comment 'Sound' tristate 'Sound card support' CONFIG_SOUND if [ "$CONFIG_SOUND" != "n" ]; then - source drivers/sound/Config.in + source drivers/sound/Config.in fi endmenu @@ -203,4 +210,3 @@ comment 'Kernel hacking' #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ endmenu - diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 4523a6c7e..49137cda4 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig @@ -17,6 +17,7 @@ CONFIG_ISA=y # CONFIG_M586 is not set # CONFIG_M586TSC is not set CONFIG_M686=y +# CONFIG_MK7 is not set CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y @@ -203,6 +204,7 @@ CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_NCR53C406A is not set # CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_SIM710 is not set # CONFIG_SCSI_NCR53C7xx is not set # CONFIG_SCSI_NCR53C8XX is not set CONFIG_SCSI_SYM53C8XX=y diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index 4b88dda89..c0cb65324 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S @@ -237,8 +237,11 @@ tracesys: movl $-ENOSYS,EAX(%esp) call SYMBOL_NAME(syscall_trace) movl ORIG_EAX(%esp),%eax + cmpl $(NR_syscalls),%eax + jae tracesys_exit call *SYMBOL_NAME(sys_call_table)(,%eax,4) movl %eax,EAX(%esp) # save the return value +tracesys_exit: call SYMBOL_NAME(syscall_trace) jmp ret_from_sys_call badsys: diff --git a/arch/i386/kernel/pci-pc.c b/arch/i386/kernel/pci-pc.c index be3076f30..8ce187d3f 100644 --- a/arch/i386/kernel/pci-pc.c +++ b/arch/i386/kernel/pci-pc.c @@ -120,7 +120,7 @@ static struct pci_ops pci_direct_conf1 = { #define IOADDR(devfn, where) ((0xC000 | ((devfn & 0x78) << 5)) + where) #define FUNC(devfn) (((devfn & 7) << 1) | 0xf0) -#define SET(dev) if (dev->devfn) return PCIBIOS_DEVICE_NOT_FOUND; \ +#define SET(dev) if (dev->devfn & 0x80) return PCIBIOS_DEVICE_NOT_FOUND; \ outb(FUNC(dev->devfn), 0xCF8); \ outb(dev->bus->number, 0xCFA); diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c index e86451291..1e6576860 100644 --- a/arch/i386/kernel/ptrace.c +++ b/arch/i386/kernel/ptrace.c @@ -71,8 +71,6 @@ static int putreg(struct task_struct *child, unsigned long regno, unsigned long value) { switch (regno >> 2) { - case ORIG_EAX: - return -EIO; case FS: if (value && (value & 3) != 3) return -EIO; diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 88ba3feeb..734cfca65 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -25,6 +25,10 @@ * * Memory region support * David Parsons <orc@pell.chi.il.us>, July-August 1999 + * + * Cleaned up cache-detection code + * Dave Jones <dave@powertweak.com>, October 1999 + * */ /* @@ -462,7 +466,7 @@ void __init setup_memory_region(void) void __init setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * memory_end_p) { - unsigned long memory_start, memory_end; + unsigned long high_pfn, max_pfn; char c = ' ', *to = command_line, *from = COMMAND_LINE; int len = 0; int i; @@ -493,7 +497,6 @@ void __init setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigne if (!MOUNT_ROOT_RDONLY) root_mountflags &= ~MS_RDONLY; - memory_start = (unsigned long) &_end; init_mm.start_code = (unsigned long) &_text; init_mm.end_code = (unsigned long) &_etext; init_mm.end_data = (unsigned long) &_edata; @@ -557,51 +560,53 @@ void __init setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigne *to = '\0'; *cmdline_p = command_line; -#define VMALLOC_RESERVE (128 << 20) /* 128MB for vmalloc and initrd */ -#define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) - - memory_end = 0; + /* Find the highest page frame number we have available */ + max_pfn = 0; for (i=0; i < e820.nr_map; i++) { /* RAM? */ if (e820.map[i].type == E820_RAM) { - unsigned long end = e820.map[i].addr + e820.map[i].size; + unsigned long end_pfn = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT; - if (end > memory_end) - memory_end = end; + if (end_pfn > max_pfn) + max_pfn = end_pfn; } } - memory_end &= PAGE_MASK; - ram_resources[1].end = memory_end-1; +/* + * We can only allocate a limited amount of direct-mapped memory + */ +#define VMALLOC_RESERVE (128 << 20) /* 128MB for vmalloc and initrd */ +#define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) +#define MAXMEM_PFN (MAXMEM >> PAGE_SHIFT) + + high_pfn = MAXMEM_PFN; + if (max_pfn < high_pfn) + high_pfn = max_pfn; + +/* + * But the bigmem stuff may be able to use more of it + * (but currently only up to about 4GB) + */ #ifdef CONFIG_BIGMEM - bigmem_start = bigmem_end = memory_end; -#endif - if (memory_end > MAXMEM) - { -#ifdef CONFIG_BIGMEM -#define MAXBIGMEM ((unsigned long)(~(VMALLOC_RESERVE-1))) - bigmem_start = MAXMEM; - bigmem_end = (memory_end < MAXBIGMEM) ? memory_end : MAXBIGMEM; -#endif - memory_end = MAXMEM; -#ifdef CONFIG_BIGMEM - printk(KERN_NOTICE "%ldMB BIGMEM available.\n", - (bigmem_end-bigmem_start)>>20); -#else - printk(KERN_WARNING "Warning only %ldMB will be used.\n", - MAXMEM>>20); + #define MAXBIGMEM ((unsigned long)(~(VMALLOC_RESERVE-1))) + #define MAXBIGMEM_PFN (MAXBIGMEM >> PAGE_SHIFT) + if (max_pfn > MAX_PFN) + max_pfn = MAX_PFN; + +/* When debugging, make half of "normal" memory be BIGMEM memory instead */ +#ifdef BIGMEM_DEBUG + high_pfn >>= 1; #endif - } -#if defined(CONFIG_BIGMEM) && defined(BIGMEM_DEBUG) - else { - memory_end -= memory_end/4; - bigmem_start = memory_end; - } + + bigmem_start = high_pfn << PAGE_SHIFT; + bigmem_end = max_pfn << PAGE_SHIFT; + printk(KERN_NOTICE "%ldMB BIGMEM available.\n", (bigmem_end-bigmem_start) >> 20); #endif - memory_end += PAGE_OFFSET; - *memory_start_p = memory_start; - *memory_end_p = memory_end; + ram_resources[1].end = (high_pfn << PAGE_SHIFT)-1; + + *memory_start_p = (unsigned long) &_end; + *memory_end_p = PAGE_OFFSET + (high_pfn << PAGE_SHIFT); #ifdef __SMP__ /* @@ -876,6 +881,15 @@ static void __init cyrix_model(struct cpuinfo_x86 *c) * on the MediaGX. So we turn it off for now. */ +#ifdef CONFIG_PCI + /* It isnt really a PCI quirk directly, but the cure is the + same. The MediaGX has deep magic SMM stuff that handles the + SB emulation. It thows away the fifo on disable_dma() which + is wrong and ruins the audio. */ + + printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bug.\n"); + isa_dma_bridge_buggy = 1; +#endif /* GXm supports extended cpuid levels 'ala' AMD */ if (c->cpuid_level == 2) { get_model_name(c); /* get CPU marketing name */ @@ -888,15 +902,6 @@ static void __init cyrix_model(struct cpuinfo_x86 *c) c->x86_model = (dir1 & 0x20) ? 1 : 2; c->x86_capability&=~X86_FEATURE_TSC; } -#ifdef CONFIG_PCI - /* It isnt really a PCI quirk directly, but the cure is the - same. The MediaGX has deep magic SMM stuff that handles the - SB emulation. It thows away the fifo on disable_dma() which - is wrong and ruins the audio. */ - - printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bug.\n"); - isa_dma_bridge_buggy = 1; -#endif break; case 5: /* 6x86MX/M II */ @@ -1129,49 +1134,47 @@ void __init identify_cpu(struct cpuinfo_x86 *c) } } - for (i = 0; i < sizeof(cpu_models)/sizeof(struct cpu_model_info); i++) { - if (c->cpuid_level > 1) { - /* supports eax=2 call */ - int edx, cache_size, dummy; - - cpuid(2, &dummy, &dummy, &dummy, &edx); + if (c->cpuid_level > 1) { + /* supports eax=2 call */ + int edx, dummy; - /* We need only the LSB */ - edx &= 0xff; + cpuid(2, &dummy, &dummy, &dummy, &edx); - switch (edx) { - case 0x40: - cache_size = 0; - break; + /* We need only the LSB */ + edx &= 0xff; - case 0x41: - cache_size = 128; - break; + switch (edx) { + case 0x40: + c->x86_cache_size = 0; + break; - case 0x42: - cache_size = 256; - break; + case 0x41: + c->x86_cache_size = 128; + break; - case 0x43: - cache_size = 512; - break; + case 0x42: + c->x86_cache_size = 256; + break; - case 0x44: - cache_size = 1024; - break; + case 0x43: + c->x86_cache_size = 512; + break; - case 0x45: - cache_size = 2048; - break; + case 0x44: + c->x86_cache_size = 1024; + break; - default: - cache_size = 0; - break; - } + case 0x45: + c->x86_cache_size = 2048; + break; - c->x86_cache_size = cache_size; + default: + c->x86_cache_size = 0; + break; } + } + for (i = 0; i < sizeof(cpu_models)/sizeof(struct cpu_model_info); i++) { if (cpu_models[i].vendor == c->x86_vendor && cpu_models[i].x86 == c->x86) { if (c->x86_model <= 16) diff --git a/arch/i386/mm/init.c b/arch/i386/mm/init.c index 05684997f..b1140f892 100644 --- a/arch/i386/mm/init.c +++ b/arch/i386/mm/init.c @@ -367,6 +367,22 @@ void __init test_wp_bit(void) printk(".\n"); } +static void __init mem_init_region(unsigned long pfn, unsigned long count, unsigned long start_mem_pfn) +{ + printk("memory region: %luk @ %08lx000\n", count << 2, pfn); + + do { + if (pfn >= max_mapnr) + break; + + /* Avoid the kernel mapping between HIGH_MEMORY and "start_mem".. */ + if (pfn < (HIGH_MEMORY >> PAGE_SHIFT) || pfn >= start_mem_pfn) + clear_bit(PG_reserved, &mem_map[pfn].flags); + + pfn++; + } while (--count > 0); +} + void __init mem_init(unsigned long start_mem, unsigned long end_mem) { unsigned long start_low_mem = PAGE_SIZE; @@ -412,45 +428,22 @@ void __init mem_init(unsigned long start_mem, unsigned long end_mem) /* walk the whitelist, unreserving good memory */ for (avail = i = 0; i < e820.nr_map; i++) { - unsigned long addr, end, size; + unsigned long start_pfn, end_pfn; if (e820.map[i].type != E820_RAM) /* not usable memory */ continue; - addr = e820.map[i].addr; - size = e820.map[i].size; - /* Silently ignore memory regions starting above 4gb */ - if (addr != e820.map[i].addr) + start_pfn = (e820.map[i].addr + PAGE_SIZE - 1) >> PAGE_SHIFT; + end_pfn = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT; + + /* We have a certain amount of low memory reserved */ + if (start_pfn < MAP_NR(start_low_mem)) + start_pfn = MAP_NR(start_low_mem); + + if (end_pfn <= start_pfn) continue; - printk("memory region: %luk @ %08lx\n", size >> 10, addr ); - - /* Make sure we don't get fractional pages */ - end = PAGE_OFFSET + ((addr + size) & PAGE_MASK); - addr= PAGE_OFFSET + PAGE_ALIGN(addr); - - for ( ; addr < end; addr += PAGE_SIZE) { - - /* this little bit of grossness is for dealing - * with memory borrowing for system bookkeeping - * (smp stacks, zero page, kernel code, etc) - * without having to go back and edit the e820 - * map to compensate. - * - * if we're in low memory (<1024k), we need to - * avoid the smp stack and zero page. - * if we're in high memory, we need to avoid - * the kernel code. - * in any case, we don't want to hack mem_map - * entries above end_mem. - */ - if ( (addr < start_low_mem) - || (addr >= (HIGH_MEMORY + PAGE_OFFSET)&& addr <= start_mem) - || (addr > end_mem) ) - continue; - - clear_bit(PG_reserved, &mem_map[MAP_NR(addr)].flags); - } + mem_init_region(start_pfn, end_pfn - start_pfn, MAP_NR(start_mem)); } for (tmp = PAGE_OFFSET ; tmp < end_mem ; tmp += PAGE_SIZE) { diff --git a/arch/mips/sgi/kernel/indy_timer.c b/arch/mips/sgi/kernel/indy_timer.c index 0b388bf32..00c1c3c68 100644 --- a/arch/mips/sgi/kernel/indy_timer.c +++ b/arch/mips/sgi/kernel/indy_timer.c @@ -1,4 +1,4 @@ -/* $Id: indy_timer.c,v 1.15 1999/10/21 00:23:05 ralf Exp $ +/* $Id: indy_timer.c,v 1.16 2000/01/17 23:32:46 ralf Exp $ * * indy_timer.c: Setting up the clock on the INDY 8254 controller. * @@ -33,6 +33,8 @@ static unsigned long r4k_offset; /* Amount to increment compare reg each time */ static unsigned long r4k_cur; /* What counter should be at next timer irq */ +extern rwlock_t xtime_lock; + static inline void ack_r4ktimer(unsigned long newval) { write_32bit_cp0_register(CP0_COMPARE, newval); diff --git a/arch/mips64/Makefile b/arch/mips64/Makefile index 6879aca98..d7ffcedb9 100644 --- a/arch/mips64/Makefile +++ b/arch/mips64/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 1999/12/04 03:59:00 ralf Exp $ +# $Id: Makefile,v 1.4 2000/01/17 23:32:46 ralf Exp $ # # This file is subject to the terms and conditions of the GNU General Public # License. See the file "COPYING" in the main directory of this archive @@ -67,7 +67,7 @@ endif # Board-dependent options and extra files # ifdef CONFIG_SGI_IP22 -LIBS += arch/mips64/sgi-ip22/sgikern.a arch/mips64/arc/arclib.a +LIBS += arch/mips64/sgi-ip22/ip22.a arch/mips64/arc/arclib.a SUBDIRS += arch/mips64/sgi-ip22 arch/mips64/arc # # Set LOADADDR to >= 0x88069000 if you want to leave space for symmon, diff --git a/arch/mips64/defconfig-ip22 b/arch/mips64/defconfig-ip22 index 71fac0fc9..273653d5d 100644 --- a/arch/mips64/defconfig-ip22 +++ b/arch/mips64/defconfig-ip22 @@ -11,8 +11,11 @@ # Machine selection # CONFIG_SGI_IP22=y +# CONFIG_SGI_IP27 is not set CONFIG_BOOT_ELF32=y CONFIG_ARC32=y +CONFIG_BOARD_SCACHE=y +CONFIG_ARC_MEMORY=y # # CPU selection @@ -28,13 +31,13 @@ CONFIG_CPU_R5000=y # General setup # # CONFIG_CPU_LITTLE_ENDIAN is not set -# CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_MISC is not set CONFIG_NET=y CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_SYSCTL is not set +CONFIG_BINFMT_ELF=y +# CONFIG_MIPS32_COMPAT is not set +# CONFIG_BINFMT_MISC is not set # # Loadable module support diff --git a/arch/mips64/sgi-ip22/Makefile b/arch/mips64/sgi-ip22/Makefile index 3265aab41..f303d90da 100644 --- a/arch/mips64/sgi-ip22/Makefile +++ b/arch/mips64/sgi-ip22/Makefile @@ -10,7 +10,7 @@ $(CC) $(CFLAGS) -c $< -o $*.o L_TARGET = ip22.a -L_OBJS = ip22-mc.o ip22-sc.o ip22-hpc.o ip22-int.o ip22-rtc.o \ +L_OBJS = ip22-berr.o ip22-mc.o ip22-sc.o ip22-hpc.o ip22-int.o ip22-rtc.o \ ip22-setup.o system.o ip22-timer.o ip22-irq.o ip22-reset.o time.o include $(TOPDIR)/Rules.make diff --git a/arch/mips64/sgi-ip22/ip22-berr.c b/arch/mips64/sgi-ip22/ip22-berr.c new file mode 100644 index 000000000..32797fcf4 --- /dev/null +++ b/arch/mips64/sgi-ip22/ip22-berr.c @@ -0,0 +1,95 @@ +/* $Id: ip22-berr.c,v 1.1 2000/01/21 21:35:46 ralf Exp $ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1994, 1995, 1996, 1999, 2000 by Ralf Baechle + * Copyright (C) 1999, 2000 by Silicon Graphics + */ +#include <linux/init.h> +#include <linux/kernel.h> +#include <asm/uaccess.h> +#include <asm/paccess.h> +#include <asm/addrspace.h> + +extern asmlinkage void handle_ibe(void); +extern asmlinkage void handle_dbe(void); + +extern const struct exception_table_entry __start___dbe_table[]; +extern const struct exception_table_entry __stop___dbe_table[]; + +static inline unsigned long +search_one_table(const struct exception_table_entry *first, + const struct exception_table_entry *last, + unsigned long value) +{ + while (first <= last) { + const struct exception_table_entry *mid; + long diff; + + mid = (last - first) / 2 + first; + diff = mid->insn - value; + if (diff == 0) + return mid->nextinsn; + else if (diff < 0) + first = mid+1; + else + last = mid-1; + } + return 0; +} + +static inline unsigned long +search_dbe_table(unsigned long addr) +{ + unsigned long ret; + + /* There is only the kernel to search. */ + ret = search_one_table(__start___dbe_table, __stop___dbe_table-1, addr); + if (ret) return ret; + + return 0; +} + +void do_ibe(struct pt_regs *regs) +{ + printk("Got ibe at 0x%lx\n", regs->cp0_epc); + show_regs(regs); + dump_tlb_addr(regs->cp0_epc); + force_sig(SIGBUS, current); + while(1); +} + +void do_dbe(struct pt_regs *regs) +{ + unsigned long fixup; + + fixup = search_dbe_table(regs->cp0_epc); + if (fixup) { + long new_epc; + + new_epc = fixup_exception(dpf_reg, fixup, regs->cp0_epc); + regs->cp0_epc = new_epc; + return; + } + + printk("Got dbe at 0x%lx\n", regs->cp0_epc); + show_regs(regs); + dump_tlb_all(); + while(1); + force_sig(SIGBUS, current); +} + +void __init +bus_error_init(void) +{ + int dummy; + + set_except_vector(6, handle_ibe); + set_except_vector(7, handle_dbe); + + /* At this time nothing uses the DBE protection mechanism on the + Indy, so this here is needed to make the kernel link. */ + get_dbe(dummy, (int *)KSEG0); +} diff --git a/arch/mips64/sgi-ip22/ip22-timer.c b/arch/mips64/sgi-ip22/ip22-timer.c index ff8ece37a..c5e038b72 100644 --- a/arch/mips64/sgi-ip22/ip22-timer.c +++ b/arch/mips64/sgi-ip22/ip22-timer.c @@ -33,6 +33,8 @@ static unsigned long r4k_offset; /* Amount to increment compare reg each time */ static unsigned long r4k_cur; /* What counter should be at next timer irq */ +extern rwlock_t xtime_lock; + static inline void ack_r4ktimer(unsigned long newval) { write_32bit_cp0_register(CP0_COMPARE, newval); diff --git a/arch/mips64/sgi-ip27/ip27-setup.c b/arch/mips64/sgi-ip27/ip27-setup.c index 39858a23f..ace1d7b8f 100644 --- a/arch/mips64/sgi-ip27/ip27-setup.c +++ b/arch/mips64/sgi-ip27/ip27-setup.c @@ -9,6 +9,7 @@ * Copyright (C) 1999 Ralf Baechle (ralf@gnu.org) * Copyright (C) 1999 Silcon Graphics, Inc. */ +#include <linux/config.h> #include <linux/init.h> #include <linux/kernel.h> #include <asm/sn/types.h> @@ -20,6 +21,11 @@ #include <asm/mipsregs.h> #include <asm/sn/klconfig.h> +/* Check against user dumbness. */ +#ifdef CONFIG_VT +#error "CONFIG_VT not allowed for IP27." +#endif + /* * get_nasid() returns the physical node id number of the caller. */ diff --git a/arch/ppc/Makefile b/arch/ppc/Makefile index 6282a0a6d..82bdb59ed 100644 --- a/arch/ppc/Makefile +++ b/arch/ppc/Makefile @@ -88,6 +88,7 @@ $(BOOT_TARGETS): $(CHECKS) vmlinux @$(MAKECHRPBOOT) $@ znetboot: $(CHECKS) vmlinux +ifdef CONFIG_ALL_PPC ifdef CONFIG_SMP ifdef CONFIG_PPC64 cp -f vmlinux /tftpboot/vmlinux.smp.64 @@ -101,6 +102,7 @@ else cp -f vmlinux /tftpboot/vmlinux endif endif +endif @$(MAKECOFFBOOT) $@ @$(MAKEBOOT) $@ @$(MAKECHRPBOOT) $@ diff --git a/arch/ppc/boot/Makefile b/arch/ppc/boot/Makefile index 8709e3729..41a8a915f 100644 --- a/arch/ppc/boot/Makefile +++ b/arch/ppc/boot/Makefile @@ -35,6 +35,12 @@ else TFTPIMAGE=/tftpboot/zImage.prep$(MSIZE) endif +ifeq ($(CONFIG_SMP),y) +TFTPSIMAGE=/tftpboot/sImage.smp +else +TFTPSIMAGE=/tftpboot/sImage +endif + ifeq ($(CONFIG_PPC64),y) MSIZE=.64 else @@ -121,7 +127,7 @@ ifdef CONFIG_PREP cp zImage $(TFTPIMAGE) endif ifdef CONFIG_GEMINI - cp sImage /tftpboot/ + cp sImage $(TFTPSIMAGE) endif znetboot.initrd : zImage.initrd diff --git a/arch/ppc/config.in b/arch/ppc/config.in index af3d5876f..46908b644 100644 --- a/arch/ppc/config.in +++ b/arch/ppc/config.in @@ -82,6 +82,8 @@ define_bool CONFIG_BINFMT_ELF y define_bool CONFIG_KERNEL_ELF y tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC +source drivers/pcmcia/Config.in + source drivers/parport/Config.in if [ "$CONFIG_8xx" != "y" ]; then diff --git a/arch/ppc/kernel/Makefile b/arch/ppc/kernel/Makefile index 5e61fd001..2f190db09 100644 --- a/arch/ppc/kernel/Makefile +++ b/arch/ppc/kernel/Makefile @@ -14,7 +14,7 @@ O_TARGET := kernel.o OX_OBJS := ppc_ksyms.o setup.o KHEAD := head.o -ifdef CONFIG_PPC_ALL +ifdef CONFIG_ALL_PPC CONFIG_PMAC=y CONFIG_PREP=y CONFIG_CHRP=y @@ -65,10 +65,13 @@ O_OBJS += apus_setup.o prom.o open_pic.o else ifneq ($(CONFIG_8xx),y) O_OBJS += chrp_setup.o chrp_pci.o chrp_time.o \ - pmac_time.o pmac_support.o pmac_pci.o pmac_setup.o \ + pmac_time.o pmac_pci.o pmac_setup.o \ prom.o open_pic.o feature.o \ i8259.o pmac_pic.o indirect_pci.o \ gemini_pci.o gemini_prom.o gemini_setup.o +ifeq ($(CONFIG_NVRAM),y) +O_OBJS += pmac_support.o +endif ifeq ($(CONFIG_PREP), y) O_OBJS += prep_pci.o prep_setup.o prep_nvram.o prep_time.o residual.o diff --git a/arch/ppc/kernel/chrp_setup.c b/arch/ppc/kernel/chrp_setup.c index 2739c541d..4f71def9a 100644 --- a/arch/ppc/kernel/chrp_setup.c +++ b/arch/ppc/kernel/chrp_setup.c @@ -498,7 +498,9 @@ void __init chrp_init_IRQ(void) void __init chrp_init2(void) { +#ifdef CONFIG_NVRAM pmac_nvram_init(); +#endif } #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) @@ -599,12 +601,6 @@ chrp_ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_ hw->irq = chrp_ide_irq; } -#if defined(CONFIG_BLK_DEV_IDE_MODULE) -EXPORT_SYMBOL(chrp_ide_irq); -EXPORT_SYMBOL(chrp_ide_ports_known); -EXPORT_SYMBOL(chrp_ide_regbase); -EXPORT_SYMBOL(chrp_ide_probe); -#endif #endif void __init diff --git a/arch/ppc/kernel/hashtable.S b/arch/ppc/kernel/hashtable.S index 74f00ce10..c87385c53 100644 --- a/arch/ppc/kernel/hashtable.S +++ b/arch/ppc/kernel/hashtable.S @@ -1,7 +1,7 @@ /* * arch/ppc/kernel/hashtable.S * - * $Id: hashtable.S,v 1.3 1999/09/05 11:56:27 paulus Exp $ + * $Id: hashtable.S,v 1.6 1999/10/08 01:56:15 paulus Exp $ * * PowerPC version * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) @@ -35,7 +35,7 @@ * _PAGE_RW (2) if a write. r20 contains DSISR or SRR1, * so bit 1 (0x40000000) is set if the exception was due * to no matching PTE being found in the hash table. - * r5 contains the physical address of the current task's thread. + * SPRG3 contains the physical address of the current task's thread. * * Returns to the caller if the access is illegal or there is no * mapping for the address. Otherwise it places an appropriate PTE @@ -53,12 +53,14 @@ Hash_msk = (((1 << Hash_bits) - 1) * 64) .globl hash_page hash_page: #ifdef __SMP__ + SAVE_2GPRS(7,r21) eieio lis r2,hash_table_lock@h ori r2,r2,hash_table_lock@l tophys(r2,r2) - lis r6,100000000@h + lis r6,0x0fff0000@h mtctr r6 + mfspr r5,SPRG3 lwz r0,PROCESSOR-THREAD(r5) or r0,r0,r6 10: lwarx r6,0,r2 @@ -66,10 +68,18 @@ hash_page: bne- 12f stwcx. r0,0,r2 beq+ 11f -12: cmpw r6,r0 + /* spin here a bit */ +12: mfctr r7 + li r8,1000 + mtctr r8 +13: + bdnz 13b + mtctr r7 + cmpw r6,r0 bdnzf 2,10b tw 31,31,31 11: eieio + REST_2GPRS(7, r21) #endif /* Get PTE (linux-style) and check access */ mfspr r2,SPRG3 /* current task's THREAD (phys) */ @@ -182,7 +192,7 @@ hash_page_patch_B: 10: mtctr r2 addi r3,r4,-8 /* search primary PTEG */ 1: lwzu r0,8(r3) /* get next PTE */ - srwi. r0,r0,31 /* only want to check valid bit */ + rlwinm. r0,r0,0,0,0 /* only want to check valid bit */ bdnzf 2,1b /* loop while ctr != 0 && !cr0.eq */ beq+ found_empty @@ -195,7 +205,7 @@ hash_page_patch_C: addi r3,r3,-8 mtctr r2 2: lwzu r0,8(r3) - srwi. r0,r0,31 /* only want to check valid bit */ + rlwinm. r0,r0,0,0,0 /* only want to check valid bit */ bdnzf 2,2b beq+ found_empty @@ -209,19 +219,20 @@ hash_page_patch_C: * put the PTE in the primary PTEG. */ xori r5,r5,0x40 /* clear H bit again */ - lwz r2,next_slot@l(0) + lis r3,next_slot@ha + tophys(r3,r3) + lwz r2,next_slot@l(r3) addi r2,r2,8 andi. r2,r2,0x38 - stw r2,next_slot@l(0) + stw r2,next_slot@l(r3) add r3,r4,r2 11: /* update counter of evicted pages */ - lis r2,htab_evicts@h - ori r2,r2,htab_evicts@l + lis r2,htab_evicts@ha tophys(r2,r2) - lwz r4,0(r2) + lwz r4,htab_evicts@l(r2) addi r4,r4,1 - stw r4,0(r2) + stw r4,htab_evicts@l(r2) #ifndef __SMP__ /* Store PTE in PTEG */ @@ -271,12 +282,11 @@ found_slot: * update the htab misses count * -- Cort */ - lis r2,htab_reloads@h - ori r2,r2,htab_reloads@l + lis r2,htab_reloads@ha tophys(r2,r2) - lwz r3,0(r2) + lwz r3,htab_reloads@l(r2) addi r3,r3,1 - stw r3,0(r2) + stw r3,htab_reloads@l(r2) #ifdef __SMP__ lis r2,hash_table_lock@ha @@ -322,13 +332,13 @@ hash_page_out: .globl hash_table_lock hash_table_lock: .long 0 - .text #endif /* __SMP__ */ -/* next_slot is assumed to be within the first 32kB of physical RAM */ + .data next_slot: .long 0 + .text /* * Flush entries from the hash table with VSIDs in the range * given. diff --git a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S index 85de3348f..b3b07a003 100644 --- a/arch/ppc/kernel/head.S +++ b/arch/ppc/kernel/head.S @@ -1,7 +1,7 @@ /* * arch/ppc/kernel/head.S * - * $Id: head.S,v 1.147 1999/09/15 23:58:53 cort Exp $ + * $Id: head.S,v 1.154 1999/10/12 00:33:31 cort Exp $ * * PowerPC version * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) @@ -51,6 +51,10 @@ /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ #define LOAD_BAT(n, reg, RA, RB) \ + /* see the comment for clear_bats() -- Cort */ \ + li RA,0; \ + mtspr IBAT##n##U,RA; \ + mtspr DBAT##n##U,RA; \ lwz RA,(n*16)+0(reg); \ lwz RB,(n*16)+4(reg); \ mtspr IBAT##n##U,RA; \ @@ -150,7 +154,7 @@ __start: */ mr r4,r30 bl fix_mem_constants -#endif +#endif /* CONFIG_APUS */ /* * Use the first pair of BAT registers to map the 1st 16MB @@ -158,7 +162,7 @@ __start: * call OF any more. */ lis r11,KERNELBASE@h -#ifndef CONFIG_PPC64xxx +#ifndef CONFIG_PPC64 mfspr r9,PVR rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */ cmpi 0,r9,1 @@ -173,10 +177,19 @@ __start: mtspr IBAT1L,r10 b 5f #endif /* CONFIG_PPC64 */ -4: - tophys(r8,r11) + +4: tophys(r8,r11) +#ifdef __SMP__ + ori r8,r8,0x12 /* R/W access, M=1 */ +#else ori r8,r8,2 /* R/W access */ +#endif /* __SMP__ */ +#ifdef CONFIG_APUS + ori r11,r11,BL_8M<<2|0x2 /* set up 8MB BAT registers for 604 */ +#else ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */ +#endif /* CONFIG_APUS */ + #ifdef CONFIG_PPC64 /* clear out the high 32 bits in the BAT */ clrldi r11,r11,32 @@ -185,32 +198,14 @@ __start: clrldi r16,r16,63 mtsdr1 r16 #else /* CONFIG_PPC64 */ - /* - * allow secondary cpus to get at all of ram in early bootup - * since their init_task may be up there -- Cort + /* + * If the MMU is off clear the bats. See clear_bat() -- Cort */ -#if 0 - oris r18,r8,0x10000000@h - oris r21,r11,(KERNELBASE+0x10000000)@h -#else - lis r18,0x9000 - ori r18,r18,0x12 - lis r21,0x9000 - ori r21,r21,0x7fe -#endif - mtspr DBAT1L,r18 /* N.B. 6xx (not 601) have valid */ - mtspr DBAT1U,r21 /* bit in upper BAT register */ - mtspr IBAT1L,r18 - mtspr IBAT1U,r21 - -#if 0 /* for now, otherwise we overflow the 0x100 bytes we have here */ - oris r18,r8,0x20000000@h - oris r21,r11,(KERNELBASE+0x20000000)@h - mtspr DBAT2L,r18 /* N.B. 6xx (not 601) have valid */ - mtspr DBAT2U,r21 /* bit in upper BAT register */ - mtspr IBAT2L,r18 - mtspr IBAT2U,r21 -#endif /* 0 */ + mfmsr r20 + andi. r20,r20,MSR_DR + bne 100f + bl clear_bats +100: #endif /* CONFIG_PPC64 */ mtspr DBAT0L,r8 /* N.B. 6xx (not 601) have valid */ mtspr DBAT0U,r11 /* bit in upper BAT register */ @@ -218,27 +213,7 @@ __start: mtspr IBAT0U,r11 5: isync -#ifdef CONFIG_APUS - /* Unfortunately the APUS specific instructions bloat the - * code so it cannot fit in the 0x100 bytes available. We have - * to do it the crude way. */ - - /* Map 0xfff00000 so we can access VTOP/PTOV constant when - MMU is enabled. */ - lis r8,0xfff0 - ori r11,r8,0x2 /* r/w */ - ori r8,r8,0x2 /* 128KB, supervisor */ - mtspr DBAT3U,r8 - mtspr DBAT3L,r11 - - /* Copy exception code to exception vector base. */ - lis r3,KERNELBASE@h - tophys(r4,r3) - lis r3,0xfff0 /* Copy to 0xfff00000 on APUS */ - li r5,0x4000 /* # bytes of memory to copy */ - li r6,0 - bl copy_and_flush /* copy the first 0x4000 bytes */ -#else /* CONFIG_APUS */ +#ifndef CONFIG_APUS /* * We need to run with _start at physical address 0. * On CHRP, we are loaded at 0x10000 since OF on CHRP uses @@ -267,7 +242,6 @@ __start: * this shouldn't bother the pmac since it just gets turned on again * as we jump to our code at KERNELBASE. -- Cort */ - turn_on_mmu: mfmsr r0 ori r0,r0,MSR_DR|MSR_IR @@ -335,7 +309,8 @@ label: \ /* System reset */ #ifdef CONFIG_SMP /* MVME/MTX and gemini start the secondary here */ #ifdef CONFIG_GEMINI - STD_EXCEPTION(0x100, Reset, __secondary_start_gemini) + . = 0x100 + b __secondary_start_gemini #else /* CONFIG_GEMINI */ STD_EXCEPTION(0x100, Reset, __secondary_start_psurge) #endif /* CONFIG_GEMINI */ @@ -356,7 +331,6 @@ DataAccess: mfspr r3,DAR /* into the hash table */ rlwinm r4,r23,32-13,30,30 /* MSR_PR -> _PAGE_USER */ rlwimi r4,r20,32-23,29,29 /* DSISR_STORE -> _PAGE_RW */ - mfspr r5,SPRG3 /* phys addr of THREAD */ bl hash_page 1: stw r20,_DSISR(r21) mr r5,r20 @@ -378,7 +352,6 @@ InstructionAccess: mr r3,r22 /* into the hash table */ rlwinm r4,r23,32-13,30,30 /* MSR_PR -> _PAGE_USER */ mr r20,r23 /* SRR1 has reason bits */ - mfspr r5,SPRG3 /* phys addr of THREAD */ bl hash_page 1: addi r3,r1,STACK_FRAME_OVERHEAD mr r4,r22 @@ -392,35 +365,8 @@ InstructionAccess: /* External interrupt */ . = 0x500; HardwareInterrupt: +#ifndef CONFIG_APUS EXCEPTION_PROLOG; -#ifdef CONFIG_APUS - /* This is horrible, but there's no way around it. Enable the - data cache so the IRQ hardware register can be accessed - without cache intervention. Then disable interrupts and get - the current emulated m68k IPL value. */ - - mfmsr 20 - xori r20,r20,MSR_DR - sync - mtmsr r20 - sync - - lis r3,APUS_IPL_EMU@h - - li r20,(IPLEMU_SETRESET|IPLEMU_DISABLEINT) - stb r20,APUS_IPL_EMU@l(r3) - eieio - - lbz r3,APUS_IPL_EMU@l(r3) - - mfmsr r20 - xori r20,r20,MSR_DR - sync - mtmsr r20 - sync - - stw r3,(_CCR+4)(r21); -#endif addi r3,r1,STACK_FRAME_OVERHEAD li r20,MSR_KERNEL li r4,0 @@ -429,7 +375,12 @@ HardwareInterrupt: do_IRQ_intercept: .long do_IRQ; .long ret_from_except - +#else + EXCEPTION_PROLOG; + addi r3,r1,STACK_FRAME_OVERHEAD + li r20,MSR_KERNEL + bl apus_interrupt_entry +#endif /* CONFIG_APUS */ /* Alignment exception */ . = 0x600 @@ -723,8 +674,6 @@ DataStoreTLBMiss: .globl transfer_to_handler transfer_to_handler: stw r22,_NIP(r21) - lis r22,MSR_POW@h - andc r23,r23,r22 stw r23,_MSR(r21) SAVE_GPR(7, r21) SAVE_4GPRS(8, r21) @@ -974,6 +923,19 @@ fix_mem_constants: cmpw r12,r13 bne 1b +/* + * Map the memory where the exception handlers will + * be copied to when hash constants have been patched. + */ +#ifdef CONFIG_APUS_FAST_EXCEPT + lis r8,0xfff0 +#else + lis r8,0 +#endif + ori r8,r8,0x2 /* 128KB, supervisor */ + mtspr DBAT3U,r8 + mtspr DBAT3L,r8 + lis r12,__ptov_table_begin@h ori r12,r12,__ptov_table_begin@l add r12,r12,r10 /* table begin phys address */ @@ -1026,11 +988,9 @@ __secondary_hold: mtlr r5 mr r24,r3 /* cpu # */ blr - +#ifdef CONFIG_GEMINI .globl __secondary_start_gemini __secondary_start_gemini: -1011: b 1011b - mfspr r4,HID0 ori r4,r4,HID0_ICFI li r3,0 @@ -1040,6 +1000,7 @@ __secondary_start_gemini: sync bl prom_init b __secondary_start +#endif /* CONFIG_GEMINI */ .globl __secondary_start_psurge __secondary_start_psurge: @@ -1281,3 +1242,44 @@ swapper_pg_dir: .globl cmd_line cmd_line: .space 512 + +/* + * An undocumented "feature" of 604e requires that the v bit + * be cleared before changing BAT values. + * + * Also, newer IBM firmware does not clear bat3 and 4 so + * this makes sure it's done. + * -- Cort + */ +clear_bats: + mfmsr r20 + andi. r19,r20,MSR_DR + beqlr + + li r20,0 + + mtspr DBAT0U,r20 + mtspr DBAT0L,r20 + mtspr IBAT0U,r20 + mtspr IBAT0L,r20 + sync + isync + + mtspr DBAT1U,r20 + mtspr DBAT1L,r20 + mtspr IBAT1U,r20 + mtspr IBAT1L,r20 + sync + isync + + mtspr DBAT2U,r20 + mtspr DBAT2L,r20 + mtspr IBAT2U,r20 + mtspr IBAT2L,r20 + + mtspr DBAT3U,r20 + mtspr DBAT3L,r20 + mtspr IBAT3U,r20 + mtspr IBAT3L,r20 + + blr diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S index 32be1899a..4d041cc98 100644 --- a/arch/ppc/kernel/misc.S +++ b/arch/ppc/kernel/misc.S @@ -53,13 +53,29 @@ _GLOBAL(__no_use_save_flags) /* void __no_use_restore_flags(unsigned long flags) */ _GLOBAL(__no_use_restore_flags) - andi. r4,r3,MSR_EE - bne 10f - lis r4,ppc_n_lost_interrupts@ha - lwz r4,ppc_n_lost_interrupts@l(r4) - cmpi 0,r4,0 /* lost interrupts to process first? */ +/* + * Just set/clear the MSR_EE bit through restore/flags but do not + * change anything else. This is needed by the RT system and makes + * sense anyway. + * -- Cort + */ + mfmsr r4 + /* Copy all except the MSR_EE bit from r4 (current MSR value) + to r3. This is the sort of thing the rlwimi instruction is + designed for. -- paulus. */ + rlwimi r3,r4,0,17,15 + /* Check if things are setup the way we want _already_. */ + cmpw 0,r3,r4 + beqlr + /* are we enabling interrupts? */ + rlwinm. r0,r3,0,16,16 + beq 1f + /* if so, check if there are any lost interrupts */ + lis r7,ppc_n_lost_interrupts@ha + lwz r7,ppc_n_lost_interrupts@l(r7) + cmpi 0,r7,0 /* lost interrupts to process first? */ bne- do_lost_interrupts -10: sync +1: sync mtmsr r3 isync blr diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c index 575a18afe..de0a0a36d 100644 --- a/arch/ppc/kernel/pci.c +++ b/arch/ppc/kernel/pci.c @@ -92,7 +92,7 @@ static void __init pcibios_claim_resources(struct pci_bus *bus) struct resource *pr; if (!r->start) continue; - pr = pci_find_parent_resource(dev, r, 0); + pr = pci_find_parent_resource(dev, r); if (!pr || request_resource(pr, r) < 0) { printk(KERN_ERR "PCI: Address space collision on region %d of device %s\n", idx, dev->name); @@ -141,3 +141,8 @@ void __init fix_intr(struct device_node *node, struct pci_dev *dev) } } #endif + +int pcibios_assign_resource(struct pci_dev *pdev, int resource) +{ + return 0; +} diff --git a/arch/ppc/kernel/pmac_setup.c b/arch/ppc/kernel/pmac_setup.c index 6de8e5036..3418a7e8b 100644 --- a/arch/ppc/kernel/pmac_setup.c +++ b/arch/ppc/kernel/pmac_setup.c @@ -371,11 +371,18 @@ int boot_target; int boot_part; kdev_t boot_dev; +extern void via_pmu_start(void); + void __init pmac_init2(void) { +#ifdef CONFIG_ADB_PMU + via_pmu_start(); +#endif +#ifdef CONFIG_NVRAM pmac_nvram_init(); -#ifdef CONFIG_PMAC_PBOOK +#endif +#ifdef CONFIG_PMAC_PBOOK media_bay_init(); #endif } @@ -411,7 +418,7 @@ note_scsi_host(struct device_node *node, void *host) } #endif -#ifdef CONFIG_BLK_DEV_IDE_PMAC +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) extern int pmac_ide_count; extern struct device_node *pmac_ide_node[]; static int ide_majors[] = { 3, 22, 33, 34, 56, 57, 88, 89 }; @@ -441,7 +448,7 @@ kdev_t __init find_ide_boot(void) return 0; } -#endif /* CONFIG_BLK_DEV_IDE_PMAC */ +#endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */ void __init find_boot_device(void) { @@ -452,7 +459,7 @@ void __init find_boot_device(void) return; } #endif -#ifdef CONFIG_BLK_DEV_IDE_PMAC +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) boot_dev = find_ide_boot(); #endif } @@ -564,7 +571,7 @@ pmac_ide_default_irq(ide_ioreg_t base) ide_ioreg_t pmac_ide_default_io_base(int index) { -#if defined(CONFIG_BLK_DEV_IDE_PMAC) +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) return pmac_ide_regbase[index]; #else return 0; @@ -602,7 +609,7 @@ pmac_ide_fix_driveid(struct hd_driveid *id) ppc_generic_ide_fix_driveid(id); } -#if defined(CONFIG_BLK_DEV_IDE_PMAC) +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) /* This is declared in drivers/block/ide-pmac.c */ void pmac_ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq); #else @@ -659,7 +666,7 @@ pmac_init(unsigned long r3, unsigned long r4, unsigned long r5, #endif #endif -#if defined(CONFIG_BLK_DEV_IDE_PMAC) +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) ppc_ide_md.insw = pmac_ide_insw; ppc_ide_md.outsw = pmac_ide_outsw; ppc_ide_md.default_irq = pmac_ide_default_irq; diff --git a/arch/ppc/kernel/pmac_support.c b/arch/ppc/kernel/pmac_support.c index 9d043ee85..abbec2ee0 100644 --- a/arch/ppc/kernel/pmac_support.c +++ b/arch/ppc/kernel/pmac_support.c @@ -55,7 +55,6 @@ void pmac_nvram_init(void) } } -#ifdef CONFIG_NVRAM unsigned char nvram_read_byte(int addr) { struct adb_request req; @@ -101,4 +100,3 @@ void nvram_write_byte(unsigned char val, int addr) } eieio(); } -#endif /* CONFIG_NVRAM */ diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c index 547b1142c..cabce054c 100644 --- a/arch/ppc/kernel/ppc_ksyms.c +++ b/arch/ppc/kernel/ppc_ksyms.c @@ -34,6 +34,7 @@ #ifdef __SMP__ #include <asm/smplock.h> #endif /* __SMP__ */ +#include "time.h" /* Tell string.h we don't want memcpy etc. as cpp defines */ #define EXPORT_SYMTAB_STROPS @@ -134,7 +135,7 @@ EXPORT_SYMBOL(csum_tcpudp_magic); EXPORT_SYMBOL(__copy_tofrom_user); EXPORT_SYMBOL(__clear_user); EXPORT_SYMBOL(__strncpy_from_user); -EXPORT_SYMBOL(strlen_user); +EXPORT_SYMBOL(__strnlen_user); /* EXPORT_SYMBOL(inb); @@ -162,6 +163,12 @@ EXPORT_SYMBOL(iounmap); EXPORT_SYMBOL(ide_insw); EXPORT_SYMBOL(ide_outsw); EXPORT_SYMBOL(ppc_ide_md); +#ifdef CONFIG_BLK_DEV_IDE_MODULE +EXPORT_SYMBOL(chrp_ide_irq); +EXPORT_SYMBOL(chrp_ide_ports_known); +EXPORT_SYMBOL(chrp_ide_regbase); +EXPORT_SYMBOL(chrp_ide_probe); +#endif EXPORT_SYMBOL(start_thread); EXPORT_SYMBOL(kernel_thread); @@ -257,3 +264,6 @@ EXPORT_SYMBOL(timer_interrupt); extern unsigned long do_IRQ_intercept; EXPORT_SYMBOL(do_IRQ_intercept); EXPORT_SYMBOL(irq_desc); +void ppc_irq_dispatch_handler(struct pt_regs *, int); +EXPORT_SYMBOL(ppc_irq_dispatch_handler); +EXPORT_SYMBOL(decrementer_count); diff --git a/arch/ppc/kernel/prom.c b/arch/ppc/kernel/prom.c index 79e86ed35..22dcf8cbe 100644 --- a/arch/ppc/kernel/prom.c +++ b/arch/ppc/kernel/prom.c @@ -1,5 +1,5 @@ /* - * $Id: prom.c,v 1.77 1999/09/14 01:13:19 cort Exp $ + * $Id: prom.c,v 1.79 1999/10/08 01:56:32 paulus Exp $ * * Procedures for interfacing to the Open Firmware PROM on * Power Macintosh computers. @@ -147,6 +147,7 @@ extern unsigned long reloc_offset(void); extern char cmd_line[512]; /* XXX */ boot_infos_t *boot_infos = 0; /* init it so it's in data segment not bss */ +unsigned long dev_tree_size; /* * prom_init() is called very early on, before the kernel text @@ -557,7 +558,7 @@ prom_init(int r3, int r4, prom_entry pp) else prom_print(RELOC("...failed\n")); } -#endif +#endif } /* @@ -754,8 +755,7 @@ finish_device_tree(void) unsigned long mem = (unsigned long) klimit; mem = finish_node(allnodes, mem, NULL); - printk(KERN_INFO "device tree used %lu bytes\n", - mem - (unsigned long) allnodes); + dev_tree_size = mem - (unsigned long) allnodes; klimit = (char *) mem; } @@ -1494,6 +1494,7 @@ void drawchar(char c) { unsigned long offset = reloc_offset(); + int cline = 0, x; switch (c) { case '\b': @@ -1509,6 +1510,7 @@ drawchar(char c) case '\n': RELOC(g_loc_X) = 0; RELOC(g_loc_Y)++; + cline = 1; break; default: draw_byte(c, RELOC(g_loc_X)++, RELOC(g_loc_Y)); @@ -1516,11 +1518,23 @@ drawchar(char c) if (RELOC(g_loc_X) >= RELOC(g_max_loc_X)) { RELOC(g_loc_X) = 0; RELOC(g_loc_Y)++; + cline = 1; } +#if 0 while (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) { scrollscreen(); RELOC(g_loc_Y)--; } +#else + /* wrap around from bottom to top of screen so we don't + waste time scrolling each line. -- paulus. */ + if (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) + RELOC(g_loc_Y) = 0; + if (cline) { + for (x = 0; x < RELOC(g_max_loc_X); ++x) + draw_byte(' ', x, RELOC(g_loc_Y)); + } +#endif } __pmac diff --git a/arch/ppc/kernel/residual.c b/arch/ppc/kernel/residual.c index 09eafd5f7..1c4bdfbd8 100644 --- a/arch/ppc/kernel/residual.c +++ b/arch/ppc/kernel/residual.c @@ -1,5 +1,5 @@ /* - * $Id: residual.c,v 1.16 1999/09/17 17:23:09 cort Exp $ + * $Id: residual.c,v 1.17 1999/09/27 18:40:23 cort Exp $ * * Code to deal with the PReP residual data. * @@ -41,12 +41,13 @@ #include <linux/blk.h> #include <linux/ioport.h> #include <linux/pci.h> +#include <linux/ide.h> +#include <asm/init.h> #include <asm/mmu.h> #include <asm/processor.h> #include <asm/io.h> #include <asm/pgtable.h> -#include <linux/ide.h> #include <asm/ide.h> diff --git a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c index 7ae97c81d..57955efca 100644 --- a/arch/ppc/kernel/setup.c +++ b/arch/ppc/kernel/setup.c @@ -1,5 +1,5 @@ /* - * $Id: setup.c,v 1.159 1999/09/18 18:40:38 dmalek Exp $ + * $Id: setup.c,v 1.160 1999/10/08 01:56:38 paulus Exp $ * Common prep/pmac/chrp boot and setup code. */ @@ -489,6 +489,28 @@ identify_machine(unsigned long r3, unsigned long r4, unsigned long r5, m8xx_init(r3, r4, r5, r6, r7); #endif + /* Look for mem= option on command line */ + if (strstr(cmd_line, "mem=")) { + char *p, *q; + unsigned long maxmem = 0; + extern unsigned long __max_memory; + + for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) { + q = p + 4; + if (p > cmd_line && p[-1] != ' ') + continue; + maxmem = simple_strtoul(q, &q, 0); + if (*q == 'k' || *q == 'K') { + maxmem <<= 10; + ++q; + } else if (*q == 'm' || *q == 'M') { + maxmem <<= 20; + ++q; + } + } + __max_memory = maxmem; + } + /* this is for modules since _machine can be a define -- Cort */ ppc_md.ppc_machine = _machine; @@ -533,7 +555,7 @@ void __init setup_arch(char **cmdline_p, if (strstr(cmd_line, "xmon")) xmon(0); #endif /* CONFIG_XMON */ - + /* reboot on panic */ panic_timeout = 180; diff --git a/arch/ppc/kernel/traps.c b/arch/ppc/kernel/traps.c index 76a223157..99a9c2bce 100644 --- a/arch/ppc/kernel/traps.c +++ b/arch/ppc/kernel/traps.c @@ -101,30 +101,27 @@ MachineCheckException(struct pt_regs *regs) } #endif printk("Machine check in kernel mode.\n"); - printk("Caused by (from msr): "); - printk("regs %p ",regs); - switch( regs->msr & 0x0000F000) - { - case (1<<12) : - printk("Machine check signal - probably due to mm fault\n" - "with mmu off\n"); + printk("Caused by (from SRR1=%lx): ", regs->msr); + switch (regs->msr & 0xF0000) { + case 0x80000: + printk("Machine check signal\n"); break; - case (1<<13) : + case 0x40000: printk("Transfer error ack signal\n"); break; - case (1<<14) : - printk("Data parity signal\n"); + case 0x20000: + printk("Data parity error signal\n"); break; - case (1<<15) : - printk("Address parity signal\n"); + case 0x10000: + printk("Address parity error signal\n"); break; default: printk("Unknown values in msr\n"); } - show_regs(regs); #if defined(CONFIG_XMON) || defined(CONFIG_KGDB) debugger(regs); #endif + show_regs(regs); print_backtrace((unsigned long *)regs->gpr[1]); panic("machine check"); } diff --git a/arch/ppc/lib/string.S b/arch/ppc/lib/string.S index be5504940..4ab90f8b7 100644 --- a/arch/ppc/lib/string.S +++ b/arch/ppc/lib/string.S @@ -380,16 +380,26 @@ __strncpy_from_user: .long 1b,99b .text - .globl strlen_user -strlen_user: - addi r4,r3,-1 -1: lbzu r0,1(r4) +/* r3 = str, r4 = len (> 0), r5 = top (highest addr) */ + .globl __strnlen_user +__strnlen_user: + addi r7,r3,-1 + subf r6,r7,r5 /* top+1 - str */ + cmplw 0,r4,r6 + bge 0f + mr r6,r4 +0: mtctr r6 /* ctr = min(len, top - str) */ +1: lbzu r0,1(r7) /* get next byte */ cmpwi 0,r0,0 - bne 1b - subf r3,r3,r4 - addi r3,r3,1 + bdnzf 2,1b /* loop if --ctr != 0 && byte != 0 */ + addi r7,r7,1 + subf r3,r3,r7 /* number of bytes we have looked at */ + beqlr /* return if we found a 0 byte */ + cmpw 0,r3,r4 /* did we look at all len bytes? */ + blt 99f /* if not, must have hit top */ + addi r3,r4,1 /* return len + 1 to indicate no null found */ blr -99: li r3,0 +99: li r3,0 /* bad address, return 0 */ blr .section __ex_table,"a" .align 2 diff --git a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c index e407ab4c3..eb158fb1e 100644 --- a/arch/ppc/mm/init.c +++ b/arch/ppc/mm/init.c @@ -1,5 +1,5 @@ /* - * $Id: init.c,v 1.188 1999/09/18 18:40:44 dmalek Exp $ + * $Id: init.c,v 1.193 1999/10/11 18:50:35 geert Exp $ * * PowerPC version * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) @@ -113,7 +113,9 @@ struct mem_pieces prom_mem; static void remove_mem_piece(struct mem_pieces *, unsigned, unsigned, int); void *find_mem_piece(unsigned, unsigned); static void print_mem_pieces(struct mem_pieces *); +#if defined(CONFIG_PREP) || defined(CONFIG_APUS) || defined(CONFIG_ALL_PPC) static void append_mem_piece(struct mem_pieces *, unsigned, unsigned); +#endif extern struct task_struct *current_set[NR_CPUS]; @@ -182,6 +184,8 @@ static inline unsigned long p_mapped_by_bats(unsigned long pa) */ int __map_without_bats = 0; +/* max amount of RAM to use */ +unsigned long __max_memory; void __bad_pte(pmd_t *pmd) { @@ -677,6 +681,7 @@ static void __init print_mem_pieces(struct mem_pieces *mp) printk("\n"); } +#if defined(CONFIG_PREP) || defined(CONFIG_APUS) || defined(CONFIG_PPC_ALL) /* * Add some memory to an array of pieces */ @@ -691,6 +696,7 @@ append_mem_piece(struct mem_pieces *mp, unsigned start, unsigned size) rp->address = start; rp->size = size; } +#endif #ifndef CONFIG_8xx static void hash_init(void); @@ -738,6 +744,7 @@ static void __init coalesce_mem_pieces(struct mem_pieces *mp) mp->n_regions = d; } +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) || defined(CONFIG_ALL_PPC) /* * Read in a property describing some pieces of memory. */ @@ -760,6 +767,7 @@ static void __init get_mem_prop(char *name, struct mem_pieces *mp) sort_mem_pieces(mp); coalesce_mem_pieces(mp); } +#endif /* CONFIG_PMAC || CONFIG_CHRP || CONFIG_ALL_PPC */ /* * Set up one of the I/D BAT (block address translation) register pairs. @@ -933,7 +941,7 @@ void __init free_initmem(void) a = (unsigned long)(&START); \ for (; a < (unsigned long)(&END); a += PAGE_SIZE) { \ clear_bit(PG_reserved, &mem_map[MAP_NR(a)].flags); \ - atomic_set(&mem_map[MAP_NR(a)].count, 1); \ + set_page_count(mem_map+MAP_NR(a), 1); \ free_page(a); \ CNT++; \ } \ @@ -1005,8 +1013,10 @@ void __init MMU_init(void) else if (_machine == _MACH_apus ) end_of_DRAM = apus_find_end_of_memory(); #endif +#ifdef CONFIG_GEMINI else if ( _machine == _MACH_gemini ) end_of_DRAM = gemini_find_end_of_memory(); +#endif /* CONFIG_GEMINI */ else /* prep */ end_of_DRAM = prep_find_end_of_memory(); @@ -1037,14 +1047,16 @@ void __init MMU_init(void) setbat(3, 0x90000000, 0x90000000, 0x10000000, IO_PAGE); break; case _MACH_Pmac: +#if 0 { unsigned long base = 0xf3000000; struct device_node *macio = find_devices("mac-io"); if (macio && macio->n_addrs) base = macio->addrs[0].address; setbat(0, base, base, 0x100000, IO_PAGE); - ioremap_base = 0xf0000000; } +#endif + ioremap_base = 0xf0000000; break; case _MACH_apus: /* Map PPC exception vectors. */ @@ -1172,17 +1184,13 @@ void __init mem_init(unsigned long start_mem, unsigned long end_mem) remove_mem_piece(&phys_avail, __pa(avail_start), start_mem - avail_start, 1); - for (addr = PAGE_OFFSET; addr < end_mem; addr += PAGE_SIZE) - set_bit(PG_reserved, &mem_map[MAP_NR(addr)].flags); - for (i = 0; i < phys_avail.n_regions; ++i) { a = (unsigned long) __va(phys_avail.regions[i].address); - lim = a + phys_avail.regions[i].size; + lim = (a + phys_avail.regions[i].size) & PAGE_MASK; a = PAGE_ALIGN(a); for (; a < lim; a += PAGE_SIZE) clear_bit(PG_reserved, &mem_map[MAP_NR(a)].flags); } - phys_avail.n_regions = 0; #ifdef CONFIG_BLK_DEV_INITRD /* if we are booted from BootX with an initial ramdisk, @@ -1196,7 +1204,7 @@ void __init mem_init(unsigned long start_mem, unsigned long end_mem) /* free the prom's memory - no-op on prep */ for (i = 0; i < prom_mem.n_regions; ++i) { a = (unsigned long) __va(prom_mem.regions[i].address); - lim = a + prom_mem.regions[i].size; + lim = (a + prom_mem.regions[i].size) & PAGE_MASK; a = PAGE_ALIGN(a); for (; a < lim; a += PAGE_SIZE) clear_bit(PG_reserved, &mem_map[MAP_NR(a)].flags); @@ -1215,12 +1223,12 @@ void __init mem_init(unsigned long start_mem, unsigned long end_mem) datapages++; continue; } - atomic_set(&mem_map[MAP_NR(addr)].count, 1); + set_page_count(mem_map + MAP_NR(addr), 1); #ifdef CONFIG_BLK_DEV_INITRD if (!initrd_start || addr < (initrd_start & PAGE_MASK) || addr >= initrd_end) #endif /* CONFIG_BLK_DEV_INITRD */ -#ifndef CONFIG_8xx +#ifndef CONFIG_8xx if ( !rtas_data || addr < (rtas_data & PAGE_MASK) || addr >= (rtas_data+rtas_size)) @@ -1238,7 +1246,7 @@ void __init mem_init(unsigned long start_mem, unsigned long end_mem) } #ifndef CONFIG_8xx -#if defined(CONFIG_PMAC) || defined(CONFIG_PPC_ALL) +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) || defined(CONFIG_ALL_PPC) /* * On systems with Open Firmware, collect information about * physical RAM and which pieces are already in use. @@ -1286,8 +1294,12 @@ unsigned long __init *pmac_find_end_of_memory(void) * to our nearest IO area. * -- Cort */ - if ( phys_mem.regions[0].size >= RAM_LIMIT ) - phys_mem.regions[0].size = RAM_LIMIT; + if (__max_memory == 0 || __max_memory > RAM_LIMIT) + __max_memory = RAM_LIMIT; + if (phys_mem.regions[0].size >= __max_memory) { + phys_mem.regions[0].size = __max_memory; + phys_mem.n_regions = 1; + } total = phys_mem.regions[0].size; if (phys_mem.n_regions > 1) { @@ -1300,20 +1312,15 @@ unsigned long __init *pmac_find_end_of_memory(void) if (boot_infos == 0) { /* record which bits the prom is using */ get_mem_prop("available", &phys_avail); + prom_mem = phys_mem; + for (i = 0; i < phys_avail.n_regions; ++i) + remove_mem_piece(&prom_mem, + phys_avail.regions[i].address, + phys_avail.regions[i].size, 0); } else { /* booted from BootX - it's all available (after klimit) */ phys_avail = phys_mem; - } - prom_mem = phys_mem; - for (i = 0; i < phys_avail.n_regions; ++i) - { - if ( phys_avail.regions[i].address >= RAM_LIMIT ) - continue; - if ( (phys_avail.regions[i].address+phys_avail.regions[i].size) - >= RAM_LIMIT ) - phys_avail.regions[i].size = RAM_LIMIT - phys_avail.regions[i].address; - remove_mem_piece(&prom_mem, phys_avail.regions[i].address, - phys_avail.regions[i].size, 1); + prom_mem.n_regions = 0; } /* @@ -1331,9 +1338,9 @@ unsigned long __init *pmac_find_end_of_memory(void) #undef RAM_LIMIT return __va(total); } -#endif /* defined(CONFIG_PMAC) || defined(CONFIG_PPC_ALL) */ +#endif /* CONFIG_PMAC || CONFIG_CHRP || CONFIG_ALL_PPC */ -#if defined(CONFIG_PREP) || defined(CONFIG_PPC_ALL) +#if defined(CONFIG_PREP) || defined(CONFIG_ALL_PPC) /* * This finds the amount of physical ram and does necessary * setup for prep. This is pretty architecture specific so @@ -1365,10 +1372,10 @@ unsigned long __init *prep_find_end_of_memory(void) return (__va(total)); } -#endif /* defined(CONFIG_PREP) || defined(CONFIG_PPC_ALL) */ +#endif /* defined(CONFIG_PREP) || defined(CONFIG_ALL_PPC) */ -#if defined(CONFIG_GEMINI) || defined(CONFIG_PPC_ALL) +#if defined(CONFIG_GEMINI) unsigned long __init *gemini_find_end_of_memory(void) { unsigned long total, kstart, ksize, *ret; @@ -1389,7 +1396,7 @@ unsigned long __init *gemini_find_end_of_memory(void) remove_mem_piece( &phys_avail, kstart, ksize, 0 ); return ret; } -#endif /* defined(CONFIG_GEMINI) || defined(CONFIG_PPC_ALL) */ +#endif /* defined(CONFIG_GEMINI) || defined(CONFIG_ALL_PPC) */ #ifdef CONFIG_APUS #define HARDWARE_MAPPED_SIZE (512*1024) diff --git a/arch/ppc/pmac_defconfig b/arch/ppc/pmac_defconfig index 1962b2ae6..514843d00 100644 --- a/arch/ppc/pmac_defconfig +++ b/arch/ppc/pmac_defconfig @@ -7,15 +7,18 @@ # CONFIG_PPC=y CONFIG_6xx=y +# CONFIG_PPC64 is not set +# CONFIG_82xx is not set # CONFIG_8xx is not set CONFIG_PMAC=y # CONFIG_PREP is not set # CONFIG_CHRP is not set # CONFIG_ALL_PPC is not set +# CONFIG_GEMINI is not set # CONFIG_APUS is not set -# CONFIG_MBX is not set -CONFIG_MACH_SPECIFIC=y # CONFIG_SMP is not set +CONFIG_MACH_SPECIFIC=y +CONFIG_6xx=y # # General setup @@ -25,8 +28,6 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set CONFIG_KMOD=y CONFIG_PCI=y -# CONFIG_PCI_QUIRKS is not set -CONFIG_PCI_OLD_PROC=y CONFIG_NET=y CONFIG_SYSCTL=y CONFIG_SYSVIPC=y @@ -34,27 +35,35 @@ CONFIG_SYSVIPC=y CONFIG_BINFMT_ELF=y CONFIG_KERNEL_ELF=y CONFIG_BINFMT_MISC=m -# CONFIG_BINFMT_JAVA is not set + +# +# PCMCIA/Cardbus support +# +CONFIG_PCMCIA=m +CONFIG_CARDBUS=y # CONFIG_PARPORT is not set # CONFIG_VGA_CONSOLE is not set CONFIG_FB=y CONFIG_FB_COMPAT_XPMAC=y CONFIG_PMAC_PBOOK=y -CONFIG_MAC_KEYBOARD=y CONFIG_MAC_FLOPPY=y CONFIG_MAC_SERIAL=y -CONFIG_ADBMOUSE=y -CONFIG_BLK_DEV_IDE_PMAC=y +# CONFIG_SERIAL_CONSOLE is not set +CONFIG_ADB=y +CONFIG_ADB_CUDA=y +CONFIG_ADB_MACIO=y +CONFIG_ADB_PMU=y +CONFIG_ADB_KEYBOARD=y CONFIG_PROC_DEVICETREE=y -# CONFIG_KGDB is not set -# CONFIG_XMON is not set # CONFIG_TOTALMP is not set CONFIG_BOOTX_TEXT=y +# CONFIG_MOTOROLA_HOTSWAP is not set # -# Plug and Play support +# Plug and Play configuration # # CONFIG_PNP is not set +# CONFIG_ISAPNP is not set # # Block devices @@ -67,24 +76,45 @@ CONFIG_BLK_DEV_IDE=y # # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDETAPE is not set CONFIG_BLK_DEV_IDEFLOPPY=y # 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 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 is not set +# CONFIG_BLK_DEV_AEC6210 is not set +CONFIG_BLK_DEV_CMD646=y +# CONFIG_BLK_DEV_CY82C693 is not set +# 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 is not set +# CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_SL82C105 is not set CONFIG_BLK_DEV_IDE_PMAC=y CONFIG_BLK_DEV_IDEDMA_PMAC=y -CONFIG_BLK_DEV_IDEDMA=y CONFIG_IDEDMA_PMAC_AUTO=y +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_AUTO=y # CONFIG_IDE_CHIPSETS is not set +# CONFIG_BLK_CPQ_DA is not set # # Additional Block Devices # -# CONFIG_BLK_DEV_LOOP is not set +CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_RAM=y @@ -92,16 +122,19 @@ CONFIG_BLK_DEV_INITRD=y # CONFIG_BLK_DEV_XD is not set CONFIG_PARIDE_PARPORT=y # CONFIG_PARIDE is not set +CONFIG_BLK_DEV_IDE_MODES=y # CONFIG_BLK_DEV_HD is not set # # Networking options # CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set CONFIG_NETLINK=y # CONFIG_RTNETLINK is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_FIREWALL is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set # CONFIG_FILTER is not set CONFIG_UNIX=y CONFIG_INET=y @@ -118,16 +151,17 @@ CONFIG_IP_ALIAS=y # # (it is safe to leave these untouched) # -CONFIG_INET_RARP=y -CONFIG_IP_NOSR=y CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set # # # # CONFIG_IPX is not set CONFIG_ATALK=m +# CONFIG_DECNET is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_BRIDGE is not set @@ -136,7 +170,6 @@ CONFIG_ATALK=m # CONFIG_WAN_ROUTER is not set # CONFIG_NET_FASTROUTE is not set # CONFIG_NET_HW_FLOWCONTROL is not set -# CONFIG_CPU_IS_SLOW is not set # # QoS and/or fair queueing @@ -173,9 +206,11 @@ CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AHA1740 is not set CONFIG_SCSI_AIC7XXX=y -# CONFIG_OVERRIDE_CMDS is not set +# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=15 +# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_AM53C974 is not set @@ -189,15 +224,19 @@ CONFIG_AIC7XXX_RESET_DELAY=15 # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_GENERIC_NCR5380 is not set # CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_NCR53C406A is not set +# CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_NCR53C7xx is not set # CONFIG_SCSI_NCR53C8XX is not set +# CONFIG_SCSI_SYM53C8XX is not set # CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PCI2000 is not set # CONFIG_SCSI_PCI2220I is not set # CONFIG_SCSI_PSI240I is not set # CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_SEAGATE is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_T128 is not set @@ -212,10 +251,19 @@ CONFIG_SCSI_MAC53C94=y # Network device support # CONFIG_NETDEVICES=y + +# +# ARCnet devices +# # CONFIG_ARCNET is not set # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set # CONFIG_ETHERTAP is not set +# CONFIG_NET_SB1000 is not set + +# +# Ethernet (10 or 100Mbit) +# CONFIG_NET_ETHERNET=y CONFIG_MACE=y CONFIG_BMAC=y @@ -223,12 +271,16 @@ CONFIG_BMAC=y # CONFIG_LANCE is not set # CONFIG_NET_VENDOR_SMC is not set # CONFIG_NET_VENDOR_RACAL is not set -# CONFIG_RTL8139 is not set # CONFIG_YELLOWFIN is not set -# CONFIG_ACENIC is not set +# CONFIG_RTL8139 is not set +# CONFIG_SIS900 is not set +# CONFIG_DM9102 is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set # CONFIG_NET_ISA is not set CONFIG_NET_EISA=y # CONFIG_PCNET32 is not set +# CONFIG_ACENIC is not set # CONFIG_AC3200 is not set # CONFIG_APRICOT is not set # CONFIG_CS89x0 is not set @@ -247,22 +299,43 @@ CONFIG_DE4X5=y # CONFIG_NET_POCKET is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set -# CONFIG_DLCI is not set + +# +# Appletalk devices +# # CONFIG_LTPC is not set # CONFIG_COPS is not set # CONFIG_IPDDP is not set CONFIG_PPP=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_BSDCOMP=m +# CONFIG_SLIP is not set # -# CCP compressors for PPP are only built as modules. +# Wireless LAN (non-hamradio) # -# CONFIG_SLIP is not set # CONFIG_NET_RADIO is not set + +# +# Token Ring driver support +# # CONFIG_TR is not set -# CONFIG_SHAPER is not set -# CONFIG_HOSTESS_SV11 is not set -# CONFIG_COSA is not set +# CONFIG_NET_FC is not set # CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network devices +# +# CONFIG_PCMCIA_PCNET is not set +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_RAYCS is not set # # Amateur Radio support @@ -275,24 +348,32 @@ CONFIG_PPP=y # CONFIG_ISDN is not set # -# CD-ROM drivers (not for SCSI or IDE/ATAPI drives) +# Old CD-ROM drivers (not SCSI, not IDE) # # CONFIG_CD_NO_IDESCSI is not set # # Console drivers # + +# +# Frame-buffer support +# +CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y +# CONFIG_FB_CLGEN is not set +# CONFIG_FB_PM2 is not set CONFIG_FB_OF=y CONFIG_FB_CONTROL=y CONFIG_FB_PLATINUM=y CONFIG_FB_VALKYRIE=y -CONFIG_FB_ATY=y CONFIG_FB_IMSTT=y CONFIG_FB_CT65550=y # CONFIG_FB_S3TRIO is not set +# CONFIG_FB_VGA16 is not set # CONFIG_FB_MATROX is not set CONFIG_FB_ATY=y +# CONFIG_FB_3DFX is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FBCON_ADVANCED is not set CONFIG_FBCON_CFB8=y @@ -314,11 +395,20 @@ CONFIG_FONT_SUN12x22=y # CONFIG_VT=y CONFIG_VT_CONSOLE=y -# CONFIG_SERIAL is not set +CONFIG_SERIAL=m # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 + +# +# Mice +# +CONFIG_BUSMOUSE=y +# CONFIG_ATIXL_BUSMOUSE is not set +# CONFIG_LOGIBUSMOUSE is not set +# CONFIG_MS_BUSMOUSE is not set +CONFIG_ADBMOUSE=y # CONFIG_MOUSE is not set # CONFIG_QIC02_TAPE is not set # CONFIG_WATCHDOG is not set @@ -334,11 +424,51 @@ CONFIG_NVRAM=y # Joystick support # # CONFIG_JOYSTICK is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # # CONFIG_FTAPE is not set +# CONFIG_DRM is not set + +# +# USB drivers - not for the faint of heart +# +CONFIG_USB=y + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +CONFIG_USB_OHCI=y +CONFIG_USB_OHCI_DEBUG=y +# CONFIG_USB_OHCI_HCD is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEBUG_ISOC=y +CONFIG_USB_PROC=y +# CONFIG_USB_EZUSB is not set + +# +# USB Devices +# +CONFIG_USB_HUB=y +CONFIG_USB_MOUSE=y +CONFIG_USB_HP_SCANNER=m +CONFIG_USB_KBD=y +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_CPIA is not set +CONFIG_USB_SCSI=m +CONFIG_USB_SCSI_DEBUG=y +# CONFIG_USB_USS720 is not set # # Filesystems @@ -347,13 +477,15 @@ CONFIG_NVRAM=y CONFIG_AUTOFS_FS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set -CONFIG_HFS_FS=y -CONFIG_FAT_FS=m -CONFIG_MSDOS_FS=m +# CONFIG_HFS_FS is not set +# CONFIG_FAT_FS is not set +# CONFIG_MSDOS_FS is not set # CONFIG_UMSDOS_FS is not set -CONFIG_VFAT_FS=m +# CONFIG_VFAT_FS is not set +# CONFIG_EFS_FS is not set CONFIG_ISO9660_FS=y # CONFIG_JOLIET is not set +# CONFIG_UDF_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_HPFS_FS is not set @@ -380,52 +512,38 @@ CONFIG_LOCKD=y # # Partition Types # -# CONFIG_BSD_DISKLABEL is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_OSF_PARTITION is not set CONFIG_MAC_PARTITION=y -# CONFIG_SMD_DISKLABEL is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set -CONFIG_NLS=y - -# -# Native Language Support -# -CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_ACORN_PARTITION is not set +# CONFIG_NLS is not set # # Sound # CONFIG_SOUND=y CONFIG_DMASOUND=y +# CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_ES1370 is not set # CONFIG_SOUND_ES1371 is not set +# CONFIG_SOUND_ESSSOLO1 is not set +# CONFIG_SOUND_MAESTRO is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_OSS is not set + +# +# Kernel hacking +# +CONFIG_MAGIC_SYSRQ=y +# CONFIG_KGDB is not set +# CONFIG_XMON is not set |