summaryrefslogtreecommitdiffstats
path: root/arch/ppc
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-01-21 22:34:01 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-01-21 22:34:01 +0000
commit9e30c3705aed9fbec4c3304570e4d6e707856bcb (patch)
treeb19e6acb5a67af31a4e7742e05c2166dc3f1444c /arch/ppc
parent72919904796333a20c6a5d5c380091b42e407aa9 (diff)
Merge with Linux 2.3.22.
Diffstat (limited to 'arch/ppc')
-rw-r--r--arch/ppc/Makefile2
-rw-r--r--arch/ppc/boot/Makefile8
-rw-r--r--arch/ppc/config.in2
-rw-r--r--arch/ppc/kernel/Makefile7
-rw-r--r--arch/ppc/kernel/chrp_setup.c8
-rw-r--r--arch/ppc/kernel/hashtable.S46
-rw-r--r--arch/ppc/kernel/head.S180
-rw-r--r--arch/ppc/kernel/misc.S28
-rw-r--r--arch/ppc/kernel/pci.c7
-rw-r--r--arch/ppc/kernel/pmac_setup.c21
-rw-r--r--arch/ppc/kernel/pmac_support.c2
-rw-r--r--arch/ppc/kernel/ppc_ksyms.c12
-rw-r--r--arch/ppc/kernel/prom.c22
-rw-r--r--arch/ppc/kernel/residual.c5
-rw-r--r--arch/ppc/kernel/setup.c26
-rw-r--r--arch/ppc/kernel/traps.c23
-rw-r--r--arch/ppc/lib/string.S26
-rw-r--r--arch/ppc/mm/init.c67
-rw-r--r--arch/ppc/pmac_defconfig254
19 files changed, 486 insertions, 260 deletions
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