aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/Kconfig13
-rw-r--r--arch/powerpc/Makefile9
-rw-r--r--arch/powerpc/boot/crt0.S23
-rw-r--r--arch/powerpc/configs/ppc64_defconfig1579
-rw-r--r--arch/powerpc/configs/pseries_defconfig1
-rw-r--r--arch/powerpc/kernel/Makefile7
-rw-r--r--arch/powerpc/kernel/align.c530
-rw-r--r--arch/powerpc/kernel/idle_64.c121
-rw-r--r--arch/powerpc/kernel/misc_32.S8
-rw-r--r--arch/powerpc/kernel/nvram_64.c742
-rw-r--r--arch/powerpc/kernel/rtas-rtc.c6
-rw-r--r--arch/powerpc/kernel/time.c28
-rw-r--r--arch/powerpc/platforms/chrp/setup.c11
-rw-r--r--arch/powerpc/platforms/chrp/smp.c1
-rw-r--r--arch/powerpc/platforms/chrp/time.c3
-rw-r--r--arch/powerpc/platforms/maple/time.c11
-rw-r--r--arch/powerpc/platforms/pseries/eeh.c3
-rw-r--r--arch/powerpc/platforms/pseries/setup.c4
18 files changed, 3049 insertions, 51 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 94df74bcc0ee..bb2efdd566a9 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -598,19 +598,6 @@ config ARCH_MEMORY_PROBE
598 def_bool y 598 def_bool y
599 depends on MEMORY_HOTPLUG 599 depends on MEMORY_HOTPLUG
600 600
601# Some NUMA nodes have memory ranges that span
602# other nodes. Even though a pfn is valid and
603# between a node's start and end pfns, it may not
604# reside on that node.
605#
606# This is a relatively temporary hack that should
607# be able to go away when sparsemem is fully in
608# place
609
610config NODES_SPAN_OTHER_NODES
611 def_bool y
612 depends on NEED_MULTIPLE_NODES
613
614config PPC_64K_PAGES 601config PPC_64K_PAGES
615 bool "64k page size" 602 bool "64k page size"
616 depends on PPC64 603 depends on PPC64
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 99dbea8c5c50..98f67c78d1bd 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -33,6 +33,8 @@ endif
33 33
34export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY 34export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY
35 35
36KBUILD_DEFCONFIG := $(shell uname -m)_defconfig
37
36ifeq ($(CONFIG_PPC64),y) 38ifeq ($(CONFIG_PPC64),y)
37OLDARCH := ppc64 39OLDARCH := ppc64
38SZ := 64 40SZ := 64
@@ -111,9 +113,6 @@ cpu-as-$(CONFIG_E200) += -Wa,-me200
111AFLAGS += $(cpu-as-y) 113AFLAGS += $(cpu-as-y)
112CFLAGS += $(cpu-as-y) 114CFLAGS += $(cpu-as-y)
113 115
114# Default to the common case.
115KBUILD_DEFCONFIG := common_defconfig
116
117head-y := arch/powerpc/kernel/head_32.o 116head-y := arch/powerpc/kernel/head_32.o
118head-$(CONFIG_PPC64) := arch/powerpc/kernel/head_64.o 117head-$(CONFIG_PPC64) := arch/powerpc/kernel/head_64.o
119head-$(CONFIG_8xx) := arch/powerpc/kernel/head_8xx.o 118head-$(CONFIG_8xx) := arch/powerpc/kernel/head_8xx.o
@@ -125,11 +124,11 @@ head-$(CONFIG_PPC64) += arch/powerpc/kernel/entry_64.o
125head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o 124head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o
126 125
127core-y += arch/powerpc/kernel/ \ 126core-y += arch/powerpc/kernel/ \
128 arch/$(OLDARCH)/kernel/ \
129 arch/powerpc/mm/ \ 127 arch/powerpc/mm/ \
130 arch/powerpc/lib/ \ 128 arch/powerpc/lib/ \
131 arch/powerpc/sysdev/ \ 129 arch/powerpc/sysdev/ \
132 arch/powerpc/platforms/ 130 arch/powerpc/platforms/
131core-$(CONFIG_PPC32) += arch/ppc/kernel/
133core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/ 132core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/
134core-$(CONFIG_XMON) += arch/powerpc/xmon/ 133core-$(CONFIG_XMON) += arch/powerpc/xmon/
135core-$(CONFIG_APUS) += arch/ppc/amiga/ 134core-$(CONFIG_APUS) += arch/ppc/amiga/
@@ -165,7 +164,7 @@ define archhelp
165 @echo ' (your) ~/bin/installkernel or' 164 @echo ' (your) ~/bin/installkernel or'
166 @echo ' (distribution) /sbin/installkernel or' 165 @echo ' (distribution) /sbin/installkernel or'
167 @echo ' install to $$(INSTALL_PATH) and run lilo' 166 @echo ' install to $$(INSTALL_PATH) and run lilo'
168 @echo ' *_defconfig - Select default config from arch/$(ARCH)/ppc/configs' 167 @echo ' *_defconfig - Select default config from arch/$(ARCH)/configs'
169endef 168endef
170 169
171archclean: 170archclean:
diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
index 9cc442263939..d2f2ace56cd3 100644
--- a/arch/powerpc/boot/crt0.S
+++ b/arch/powerpc/boot/crt0.S
@@ -14,43 +14,42 @@
14 .text 14 .text
15 .globl _zimage_start 15 .globl _zimage_start
16_zimage_start: 16_zimage_start:
17 bl reloc_offset 17 bl 1f
18 18
19reloc_offset: 191:
20 mflr r0 20 mflr r0
21 lis r9,reloc_offset@ha 21 lis r9,1b@ha
22 addi r9,r9,reloc_offset@l 22 addi r9,r9,1b@l
23 subf. r0,r9,r0 23 subf. r0,r9,r0
24 beq clear_caches 24 beq 3f
25 25
26reloc_got2:
27 lis r9,__got2_start@ha 26 lis r9,__got2_start@ha
28 addi r9,r9,__got2_start@l 27 addi r9,r9,__got2_start@l
29 lis r8,__got2_end@ha 28 lis r8,__got2_end@ha
30 addi r8,r8,__got2_end@l 29 addi r8,r8,__got2_end@l
31 subf. r8,r9,r8 30 subf. r8,r9,r8
32 beq clear_caches 31 beq 3f
33 srwi. r8,r8,2 32 srwi. r8,r8,2
34 mtctr r8 33 mtctr r8
35 add r9,r0,r9 34 add r9,r0,r9
36reloc_got2_loop: 352:
37 lwz r8,0(r9) 36 lwz r8,0(r9)
38 add r8,r8,r0 37 add r8,r8,r0
39 stw r8,0(r9) 38 stw r8,0(r9)
40 addi r9,r9,4 39 addi r9,r9,4
41 bdnz reloc_got2_loop 40 bdnz 2b
42 41
43clear_caches: 423:
44 lis r9,_start@h 43 lis r9,_start@h
45 add r9,r0,r9 44 add r9,r0,r9
46 lis r8,_etext@ha 45 lis r8,_etext@ha
47 addi r8,r8,_etext@l 46 addi r8,r8,_etext@l
48 add r8,r0,r8 47 add r8,r0,r8
491: dcbf r0,r9 484: dcbf r0,r9
50 icbi r0,r9 49 icbi r0,r9
51 addi r9,r9,0x20 50 addi r9,r9,0x20
52 cmplwi 0,r9,8 51 cmplwi 0,r9,8
53 blt 1b 52 blt 4b
54 sync 53 sync
55 isync 54 isync
56 55
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
new file mode 100644
index 000000000000..b5ba3bbd96fb
--- /dev/null
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -0,0 +1,1579 @@
1#
2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.15-rc1
4# Fri Nov 18 16:23:24 2005
5#
6CONFIG_PPC64=y
7CONFIG_64BIT=y
8CONFIG_PPC_MERGE=y
9CONFIG_MMU=y
10CONFIG_GENERIC_HARDIRQS=y
11CONFIG_RWSEM_XCHGADD_ALGORITHM=y
12CONFIG_GENERIC_CALIBRATE_DELAY=y
13CONFIG_PPC=y
14CONFIG_EARLY_PRINTK=y
15CONFIG_COMPAT=y
16CONFIG_SYSVIPC_COMPAT=y
17CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
18CONFIG_ARCH_MAY_HAVE_PC_FDC=y
19
20#
21# Processor support
22#
23# CONFIG_POWER4_ONLY is not set
24CONFIG_POWER3=y
25CONFIG_POWER4=y
26CONFIG_PPC_FPU=y
27CONFIG_ALTIVEC=y
28CONFIG_PPC_STD_MMU=y
29CONFIG_SMP=y
30CONFIG_NR_CPUS=32
31
32#
33# Code maturity level options
34#
35CONFIG_EXPERIMENTAL=y
36CONFIG_CLEAN_COMPILE=y
37CONFIG_LOCK_KERNEL=y
38CONFIG_INIT_ENV_ARG_LIMIT=32
39
40#
41# General setup
42#
43CONFIG_LOCALVERSION=""
44CONFIG_LOCALVERSION_AUTO=y
45CONFIG_SWAP=y
46CONFIG_SYSVIPC=y
47CONFIG_POSIX_MQUEUE=y
48# CONFIG_BSD_PROCESS_ACCT is not set
49CONFIG_SYSCTL=y
50# CONFIG_AUDIT is not set
51CONFIG_HOTPLUG=y
52CONFIG_KOBJECT_UEVENT=y
53CONFIG_IKCONFIG=y
54CONFIG_IKCONFIG_PROC=y
55CONFIG_CPUSETS=y
56CONFIG_INITRAMFS_SOURCE=""
57# CONFIG_EMBEDDED is not set
58CONFIG_KALLSYMS=y
59CONFIG_KALLSYMS_ALL=y
60# CONFIG_KALLSYMS_EXTRA_PASS is not set
61CONFIG_PRINTK=y
62CONFIG_BUG=y
63CONFIG_BASE_FULL=y
64CONFIG_FUTEX=y
65CONFIG_EPOLL=y
66CONFIG_SHMEM=y
67CONFIG_CC_ALIGN_FUNCTIONS=0
68CONFIG_CC_ALIGN_LABELS=0
69CONFIG_CC_ALIGN_LOOPS=0
70CONFIG_CC_ALIGN_JUMPS=0
71# CONFIG_TINY_SHMEM is not set
72CONFIG_BASE_SMALL=0
73
74#
75# Loadable module support
76#
77CONFIG_MODULES=y
78CONFIG_MODULE_UNLOAD=y
79# CONFIG_MODULE_FORCE_UNLOAD is not set
80CONFIG_OBSOLETE_MODPARM=y
81CONFIG_MODVERSIONS=y
82CONFIG_MODULE_SRCVERSION_ALL=y
83CONFIG_KMOD=y
84CONFIG_STOP_MACHINE=y
85
86#
87# Block layer
88#
89
90#
91# IO Schedulers
92#
93CONFIG_IOSCHED_NOOP=y
94CONFIG_IOSCHED_AS=y
95CONFIG_IOSCHED_DEADLINE=y
96CONFIG_IOSCHED_CFQ=y
97CONFIG_DEFAULT_AS=y
98# CONFIG_DEFAULT_DEADLINE is not set
99# CONFIG_DEFAULT_CFQ is not set
100# CONFIG_DEFAULT_NOOP is not set
101CONFIG_DEFAULT_IOSCHED="anticipatory"
102
103#
104# Platform support
105#
106CONFIG_PPC_MULTIPLATFORM=y
107# CONFIG_PPC_ISERIES is not set
108# CONFIG_EMBEDDED6xx is not set
109# CONFIG_APUS is not set
110CONFIG_PPC_PSERIES=y
111CONFIG_PPC_PMAC=y
112CONFIG_PPC_PMAC64=y
113CONFIG_PPC_MAPLE=y
114# CONFIG_PPC_CELL is not set
115CONFIG_PPC_OF=y
116CONFIG_XICS=y
117CONFIG_U3_DART=y
118CONFIG_MPIC=y
119CONFIG_PPC_RTAS=y
120CONFIG_RTAS_ERROR_LOGGING=y
121CONFIG_RTAS_PROC=y
122CONFIG_RTAS_FLASH=m
123# CONFIG_MMIO_NVRAM is not set
124CONFIG_MPIC_BROKEN_U3=y
125CONFIG_IBMVIO=y
126# CONFIG_PPC_MPC106 is not set
127CONFIG_GENERIC_TBSYNC=y
128CONFIG_CPU_FREQ=y
129CONFIG_CPU_FREQ_TABLE=y
130# CONFIG_CPU_FREQ_DEBUG is not set
131CONFIG_CPU_FREQ_STAT=y
132# CONFIG_CPU_FREQ_STAT_DETAILS is not set
133CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
134# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
135CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
136CONFIG_CPU_FREQ_GOV_POWERSAVE=y
137CONFIG_CPU_FREQ_GOV_USERSPACE=y
138# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
139# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
140CONFIG_CPU_FREQ_PMAC64=y
141# CONFIG_WANT_EARLY_SERIAL is not set
142
143#
144# Kernel options
145#
146# CONFIG_HZ_100 is not set
147CONFIG_HZ_250=y
148# CONFIG_HZ_1000 is not set
149CONFIG_HZ=250
150CONFIG_PREEMPT_NONE=y
151# CONFIG_PREEMPT_VOLUNTARY is not set
152# CONFIG_PREEMPT is not set
153# CONFIG_PREEMPT_BKL is not set
154CONFIG_BINFMT_ELF=y
155CONFIG_BINFMT_MISC=m
156CONFIG_FORCE_MAX_ZONEORDER=13
157CONFIG_IOMMU_VMERGE=y
158CONFIG_HOTPLUG_CPU=y
159CONFIG_KEXEC=y
160CONFIG_IRQ_ALL_CPUS=y
161CONFIG_PPC_SPLPAR=y
162CONFIG_EEH=y
163CONFIG_SCANLOG=m
164CONFIG_LPARCFG=y
165# CONFIG_NUMA is not set
166CONFIG_ARCH_SELECT_MEMORY_MODEL=y
167CONFIG_ARCH_FLATMEM_ENABLE=y
168CONFIG_ARCH_SPARSEMEM_ENABLE=y
169CONFIG_ARCH_SPARSEMEM_DEFAULT=y
170CONFIG_SELECT_MEMORY_MODEL=y
171# CONFIG_FLATMEM_MANUAL is not set
172# CONFIG_DISCONTIGMEM_MANUAL is not set
173CONFIG_SPARSEMEM_MANUAL=y
174CONFIG_SPARSEMEM=y
175CONFIG_HAVE_MEMORY_PRESENT=y
176# CONFIG_SPARSEMEM_STATIC is not set
177CONFIG_SPARSEMEM_EXTREME=y
178# CONFIG_MEMORY_HOTPLUG is not set
179CONFIG_SPLIT_PTLOCK_CPUS=4096
180# CONFIG_PPC_64K_PAGES is not set
181# CONFIG_SCHED_SMT is not set
182CONFIG_PROC_DEVICETREE=y
183# CONFIG_CMDLINE_BOOL is not set
184# CONFIG_PM is not set
185CONFIG_SECCOMP=y
186CONFIG_ISA_DMA_API=y
187
188#
189# Bus options
190#
191CONFIG_GENERIC_ISA_DMA=y
192CONFIG_PPC_I8259=y
193# CONFIG_PPC_INDIRECT_PCI is not set
194CONFIG_PCI=y
195CONFIG_PCI_DOMAINS=y
196# CONFIG_PCI_LEGACY_PROC is not set
197# CONFIG_PCI_DEBUG is not set
198
199#
200# PCCARD (PCMCIA/CardBus) support
201#
202# CONFIG_PCCARD is not set
203
204#
205# PCI Hotplug Support
206#
207CONFIG_HOTPLUG_PCI=m
208# CONFIG_HOTPLUG_PCI_FAKE is not set
209# CONFIG_HOTPLUG_PCI_CPCI is not set
210# CONFIG_HOTPLUG_PCI_SHPC is not set
211CONFIG_HOTPLUG_PCI_RPA=m
212CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
213CONFIG_KERNEL_START=0xc000000000000000
214
215#
216# Networking
217#
218CONFIG_NET=y
219
220#
221# Networking options
222#
223CONFIG_PACKET=y
224# CONFIG_PACKET_MMAP is not set
225CONFIG_UNIX=y
226CONFIG_XFRM=y
227CONFIG_XFRM_USER=m
228CONFIG_NET_KEY=m
229CONFIG_INET=y
230CONFIG_IP_MULTICAST=y
231# CONFIG_IP_ADVANCED_ROUTER is not set
232CONFIG_IP_FIB_HASH=y
233# CONFIG_IP_PNP is not set
234CONFIG_NET_IPIP=y
235# CONFIG_NET_IPGRE is not set
236# CONFIG_IP_MROUTE is not set
237# CONFIG_ARPD is not set
238CONFIG_SYN_COOKIES=y
239CONFIG_INET_AH=m
240CONFIG_INET_ESP=m
241CONFIG_INET_IPCOMP=m
242CONFIG_INET_TUNNEL=y
243CONFIG_INET_DIAG=y
244CONFIG_INET_TCP_DIAG=y
245# CONFIG_TCP_CONG_ADVANCED is not set
246CONFIG_TCP_CONG_BIC=y
247
248#
249# IP: Virtual Server Configuration
250#
251# CONFIG_IP_VS is not set
252# CONFIG_IPV6 is not set
253CONFIG_NETFILTER=y
254# CONFIG_NETFILTER_DEBUG is not set
255
256#
257# Core Netfilter Configuration
258#
259CONFIG_NETFILTER_NETLINK=y
260CONFIG_NETFILTER_NETLINK_QUEUE=m
261CONFIG_NETFILTER_NETLINK_LOG=m
262
263#
264# IP: Netfilter Configuration
265#
266CONFIG_IP_NF_CONNTRACK=m
267CONFIG_IP_NF_CT_ACCT=y
268CONFIG_IP_NF_CONNTRACK_MARK=y
269CONFIG_IP_NF_CONNTRACK_EVENTS=y
270CONFIG_IP_NF_CONNTRACK_NETLINK=m
271CONFIG_IP_NF_CT_PROTO_SCTP=m
272CONFIG_IP_NF_FTP=m
273CONFIG_IP_NF_IRC=m
274# CONFIG_IP_NF_NETBIOS_NS is not set
275CONFIG_IP_NF_TFTP=m
276CONFIG_IP_NF_AMANDA=m
277# CONFIG_IP_NF_PPTP is not set
278CONFIG_IP_NF_QUEUE=m
279CONFIG_IP_NF_IPTABLES=m
280CONFIG_IP_NF_MATCH_LIMIT=m
281CONFIG_IP_NF_MATCH_IPRANGE=m
282CONFIG_IP_NF_MATCH_MAC=m
283CONFIG_IP_NF_MATCH_PKTTYPE=m
284CONFIG_IP_NF_MATCH_MARK=m
285CONFIG_IP_NF_MATCH_MULTIPORT=m
286CONFIG_IP_NF_MATCH_TOS=m
287CONFIG_IP_NF_MATCH_RECENT=m
288CONFIG_IP_NF_MATCH_ECN=m
289CONFIG_IP_NF_MATCH_DSCP=m
290CONFIG_IP_NF_MATCH_AH_ESP=m
291CONFIG_IP_NF_MATCH_LENGTH=m
292CONFIG_IP_NF_MATCH_TTL=m
293CONFIG_IP_NF_MATCH_TCPMSS=m
294CONFIG_IP_NF_MATCH_HELPER=m
295CONFIG_IP_NF_MATCH_STATE=m
296CONFIG_IP_NF_MATCH_CONNTRACK=m
297CONFIG_IP_NF_MATCH_OWNER=m
298CONFIG_IP_NF_MATCH_ADDRTYPE=m
299CONFIG_IP_NF_MATCH_REALM=m
300CONFIG_IP_NF_MATCH_SCTP=m
301CONFIG_IP_NF_MATCH_DCCP=m
302CONFIG_IP_NF_MATCH_COMMENT=m
303CONFIG_IP_NF_MATCH_CONNMARK=m
304CONFIG_IP_NF_MATCH_CONNBYTES=m
305CONFIG_IP_NF_MATCH_HASHLIMIT=m
306CONFIG_IP_NF_MATCH_STRING=m
307CONFIG_IP_NF_FILTER=m
308CONFIG_IP_NF_TARGET_REJECT=m
309CONFIG_IP_NF_TARGET_LOG=m
310CONFIG_IP_NF_TARGET_ULOG=m
311CONFIG_IP_NF_TARGET_TCPMSS=m
312CONFIG_IP_NF_TARGET_NFQUEUE=m
313CONFIG_IP_NF_NAT=m
314CONFIG_IP_NF_NAT_NEEDED=y
315CONFIG_IP_NF_TARGET_MASQUERADE=m
316CONFIG_IP_NF_TARGET_REDIRECT=m
317CONFIG_IP_NF_TARGET_NETMAP=m
318CONFIG_IP_NF_TARGET_SAME=m
319CONFIG_IP_NF_NAT_SNMP_BASIC=m
320CONFIG_IP_NF_NAT_IRC=m
321CONFIG_IP_NF_NAT_FTP=m
322CONFIG_IP_NF_NAT_TFTP=m
323CONFIG_IP_NF_NAT_AMANDA=m
324CONFIG_IP_NF_MANGLE=m
325CONFIG_IP_NF_TARGET_TOS=m
326CONFIG_IP_NF_TARGET_ECN=m
327CONFIG_IP_NF_TARGET_DSCP=m
328CONFIG_IP_NF_TARGET_MARK=m
329CONFIG_IP_NF_TARGET_CLASSIFY=m
330CONFIG_IP_NF_TARGET_TTL=m
331CONFIG_IP_NF_TARGET_CONNMARK=m
332CONFIG_IP_NF_TARGET_CLUSTERIP=m
333CONFIG_IP_NF_RAW=m
334CONFIG_IP_NF_TARGET_NOTRACK=m
335CONFIG_IP_NF_ARPTABLES=m
336CONFIG_IP_NF_ARPFILTER=m
337CONFIG_IP_NF_ARP_MANGLE=m
338
339#
340# DCCP Configuration (EXPERIMENTAL)
341#
342# CONFIG_IP_DCCP is not set
343
344#
345# SCTP Configuration (EXPERIMENTAL)
346#
347# CONFIG_IP_SCTP is not set
348# CONFIG_ATM is not set
349# CONFIG_BRIDGE is not set
350# CONFIG_VLAN_8021Q is not set
351# CONFIG_DECNET is not set
352CONFIG_LLC=y
353# CONFIG_LLC2 is not set
354# CONFIG_IPX is not set
355# CONFIG_ATALK is not set
356# CONFIG_X25 is not set
357# CONFIG_LAPB is not set
358# CONFIG_NET_DIVERT is not set
359# CONFIG_ECONET is not set
360# CONFIG_WAN_ROUTER is not set
361
362#
363# QoS and/or fair queueing
364#
365# CONFIG_NET_SCHED is not set
366CONFIG_NET_CLS_ROUTE=y
367
368#
369# Network testing
370#
371# CONFIG_NET_PKTGEN is not set
372# CONFIG_HAMRADIO is not set
373# CONFIG_IRDA is not set
374# CONFIG_BT is not set
375# CONFIG_IEEE80211 is not set
376
377#
378# Device Drivers
379#
380
381#
382# Generic Driver Options
383#
384CONFIG_STANDALONE=y
385CONFIG_PREVENT_FIRMWARE_BUILD=y
386CONFIG_FW_LOADER=y
387# CONFIG_DEBUG_DRIVER is not set
388
389#
390# Connector - unified userspace <-> kernelspace linker
391#
392# CONFIG_CONNECTOR is not set
393
394#
395# Memory Technology Devices (MTD)
396#
397# CONFIG_MTD is not set
398
399#
400# Parallel port support
401#
402# CONFIG_PARPORT is not set
403
404#
405# Plug and Play support
406#
407
408#
409# Block devices
410#
411CONFIG_BLK_DEV_FD=y
412# CONFIG_BLK_CPQ_DA is not set
413# CONFIG_BLK_CPQ_CISS_DA is not set
414# CONFIG_BLK_DEV_DAC960 is not set
415# CONFIG_BLK_DEV_UMEM is not set
416# CONFIG_BLK_DEV_COW_COMMON is not set
417CONFIG_BLK_DEV_LOOP=y
418# CONFIG_BLK_DEV_CRYPTOLOOP is not set
419CONFIG_BLK_DEV_NBD=m
420# CONFIG_BLK_DEV_SX8 is not set
421# CONFIG_BLK_DEV_UB is not set
422CONFIG_BLK_DEV_RAM=y
423CONFIG_BLK_DEV_RAM_COUNT=16
424CONFIG_BLK_DEV_RAM_SIZE=65536
425CONFIG_BLK_DEV_INITRD=y
426# CONFIG_CDROM_PKTCDVD is not set
427# CONFIG_ATA_OVER_ETH is not set
428
429#
430# ATA/ATAPI/MFM/RLL support
431#
432CONFIG_IDE=y
433CONFIG_BLK_DEV_IDE=y
434
435#
436# Please see Documentation/ide.txt for help/info on IDE drives
437#
438# CONFIG_BLK_DEV_IDE_SATA is not set
439CONFIG_BLK_DEV_IDEDISK=y
440# CONFIG_IDEDISK_MULTI_MODE is not set
441CONFIG_BLK_DEV_IDECD=y
442# CONFIG_BLK_DEV_IDETAPE is not set
443# CONFIG_BLK_DEV_IDEFLOPPY is not set
444# CONFIG_BLK_DEV_IDESCSI is not set
445# CONFIG_IDE_TASK_IOCTL is not set
446
447#
448# IDE chipset support/bugfixes
449#
450CONFIG_IDE_GENERIC=y
451CONFIG_BLK_DEV_IDEPCI=y
452CONFIG_IDEPCI_SHARE_IRQ=y
453# CONFIG_BLK_DEV_OFFBOARD is not set
454CONFIG_BLK_DEV_GENERIC=y
455# CONFIG_BLK_DEV_OPTI621 is not set
456# CONFIG_BLK_DEV_SL82C105 is not set
457CONFIG_BLK_DEV_IDEDMA_PCI=y
458# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
459CONFIG_IDEDMA_PCI_AUTO=y
460# CONFIG_IDEDMA_ONLYDISK is not set
461# CONFIG_BLK_DEV_AEC62XX is not set
462# CONFIG_BLK_DEV_ALI15X3 is not set
463CONFIG_BLK_DEV_AMD74XX=y
464# CONFIG_BLK_DEV_CMD64X is not set
465# CONFIG_BLK_DEV_TRIFLEX is not set
466# CONFIG_BLK_DEV_CY82C693 is not set
467# CONFIG_BLK_DEV_CS5520 is not set
468# CONFIG_BLK_DEV_CS5530 is not set
469# CONFIG_BLK_DEV_HPT34X is not set
470# CONFIG_BLK_DEV_HPT366 is not set
471# CONFIG_BLK_DEV_SC1200 is not set
472# CONFIG_BLK_DEV_PIIX is not set
473# CONFIG_BLK_DEV_IT821X is not set
474# CONFIG_BLK_DEV_NS87415 is not set
475# CONFIG_BLK_DEV_PDC202XX_OLD is not set
476# CONFIG_BLK_DEV_PDC202XX_NEW is not set
477# CONFIG_BLK_DEV_SVWKS is not set
478# CONFIG_BLK_DEV_SIIMAGE is not set
479# CONFIG_BLK_DEV_SLC90E66 is not set
480# CONFIG_BLK_DEV_TRM290 is not set
481# CONFIG_BLK_DEV_VIA82CXXX is not set
482CONFIG_BLK_DEV_IDE_PMAC=y
483CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
484CONFIG_BLK_DEV_IDEDMA_PMAC=y
485# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set
486# CONFIG_IDE_ARM is not set
487CONFIG_BLK_DEV_IDEDMA=y
488# CONFIG_IDEDMA_IVB is not set
489CONFIG_IDEDMA_AUTO=y
490# CONFIG_BLK_DEV_HD is not set
491
492#
493# SCSI device support
494#
495# CONFIG_RAID_ATTRS is not set
496CONFIG_SCSI=y
497CONFIG_SCSI_PROC_FS=y
498
499#
500# SCSI support type (disk, tape, CD-ROM)
501#
502CONFIG_BLK_DEV_SD=y
503CONFIG_CHR_DEV_ST=y
504# CONFIG_CHR_DEV_OSST is not set
505CONFIG_BLK_DEV_SR=y
506CONFIG_BLK_DEV_SR_VENDOR=y
507CONFIG_CHR_DEV_SG=y
508# CONFIG_CHR_DEV_SCH is not set
509
510#
511# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
512#
513CONFIG_SCSI_MULTI_LUN=y
514CONFIG_SCSI_CONSTANTS=y
515# CONFIG_SCSI_LOGGING is not set
516
517#
518# SCSI Transport Attributes
519#
520CONFIG_SCSI_SPI_ATTRS=y
521CONFIG_SCSI_FC_ATTRS=y
522CONFIG_SCSI_ISCSI_ATTRS=m
523# CONFIG_SCSI_SAS_ATTRS is not set
524
525#
526# SCSI low-level drivers
527#
528# CONFIG_ISCSI_TCP is not set
529# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
530# CONFIG_SCSI_3W_9XXX is not set
531# CONFIG_SCSI_ACARD is not set
532# CONFIG_SCSI_AACRAID is not set
533# CONFIG_SCSI_AIC7XXX is not set
534# CONFIG_SCSI_AIC7XXX_OLD is not set
535# CONFIG_SCSI_AIC79XX is not set
536# CONFIG_MEGARAID_NEWGEN is not set
537# CONFIG_MEGARAID_LEGACY is not set
538# CONFIG_MEGARAID_SAS is not set
539CONFIG_SCSI_SATA=y
540# CONFIG_SCSI_SATA_AHCI is not set
541CONFIG_SCSI_SATA_SVW=y
542# CONFIG_SCSI_ATA_PIIX is not set
543# CONFIG_SCSI_SATA_MV is not set
544# CONFIG_SCSI_SATA_NV is not set
545# CONFIG_SCSI_PDC_ADMA is not set
546# CONFIG_SCSI_SATA_QSTOR is not set
547# CONFIG_SCSI_SATA_PROMISE is not set
548# CONFIG_SCSI_SATA_SX4 is not set
549# CONFIG_SCSI_SATA_SIL is not set
550# CONFIG_SCSI_SATA_SIL24 is not set
551# CONFIG_SCSI_SATA_SIS is not set
552# CONFIG_SCSI_SATA_ULI is not set
553# CONFIG_SCSI_SATA_VIA is not set
554# CONFIG_SCSI_SATA_VITESSE is not set
555# CONFIG_SCSI_BUSLOGIC is not set
556# CONFIG_SCSI_DMX3191D is not set
557# CONFIG_SCSI_EATA is not set
558# CONFIG_SCSI_FUTURE_DOMAIN is not set
559# CONFIG_SCSI_GDTH is not set
560# CONFIG_SCSI_IPS is not set
561CONFIG_SCSI_IBMVSCSI=y
562# CONFIG_SCSI_INITIO is not set
563# CONFIG_SCSI_INIA100 is not set
564CONFIG_SCSI_SYM53C8XX_2=y
565CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
566CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
567CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
568# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
569CONFIG_SCSI_IPR=y
570CONFIG_SCSI_IPR_TRACE=y
571CONFIG_SCSI_IPR_DUMP=y
572# CONFIG_SCSI_QLOGIC_FC is not set
573# CONFIG_SCSI_QLOGIC_1280 is not set
574CONFIG_SCSI_QLA2XXX=y
575CONFIG_SCSI_QLA21XX=m
576CONFIG_SCSI_QLA22XX=m
577CONFIG_SCSI_QLA2300=m
578CONFIG_SCSI_QLA2322=m
579CONFIG_SCSI_QLA6312=m
580CONFIG_SCSI_QLA24XX=m
581CONFIG_SCSI_LPFC=m
582# CONFIG_SCSI_DC395x is not set
583# CONFIG_SCSI_DC390T is not set
584CONFIG_SCSI_DEBUG=m
585
586#
587# Multi-device support (RAID and LVM)
588#
589CONFIG_MD=y
590CONFIG_BLK_DEV_MD=y
591CONFIG_MD_LINEAR=y
592CONFIG_MD_RAID0=y
593CONFIG_MD_RAID1=y
594CONFIG_MD_RAID10=y
595CONFIG_MD_RAID5=y
596CONFIG_MD_RAID6=m
597CONFIG_MD_MULTIPATH=m
598CONFIG_MD_FAULTY=m
599CONFIG_BLK_DEV_DM=y
600CONFIG_DM_CRYPT=m
601CONFIG_DM_SNAPSHOT=m
602CONFIG_DM_MIRROR=m
603CONFIG_DM_ZERO=m
604CONFIG_DM_MULTIPATH=m
605CONFIG_DM_MULTIPATH_EMC=m
606
607#
608# Fusion MPT device support
609#
610# CONFIG_FUSION is not set
611# CONFIG_FUSION_SPI is not set
612# CONFIG_FUSION_FC is not set
613# CONFIG_FUSION_SAS is not set
614
615#
616# IEEE 1394 (FireWire) support
617#
618CONFIG_IEEE1394=y
619
620#
621# Subsystem Options
622#
623# CONFIG_IEEE1394_VERBOSEDEBUG is not set
624# CONFIG_IEEE1394_OUI_DB is not set
625CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y
626CONFIG_IEEE1394_CONFIG_ROM_IP1394=y
627# CONFIG_IEEE1394_EXPORT_FULL_API is not set
628
629#
630# Device Drivers
631#
632# CONFIG_IEEE1394_PCILYNX is not set
633CONFIG_IEEE1394_OHCI1394=y
634
635#
636# Protocol Drivers
637#
638CONFIG_IEEE1394_VIDEO1394=m
639CONFIG_IEEE1394_SBP2=m
640# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
641CONFIG_IEEE1394_ETH1394=m
642CONFIG_IEEE1394_DV1394=m
643CONFIG_IEEE1394_RAWIO=y
644CONFIG_IEEE1394_CMP=m
645CONFIG_IEEE1394_AMDTP=m
646
647#
648# I2O device support
649#
650# CONFIG_I2O is not set
651
652#
653# Macintosh device drivers
654#
655CONFIG_ADB_PMU=y
656CONFIG_PMAC_SMU=y
657CONFIG_THERM_PM72=y
658CONFIG_WINDFARM=y
659CONFIG_WINDFARM_PM81=y
660CONFIG_WINDFARM_PM91=y
661
662#
663# Network device support
664#
665CONFIG_NETDEVICES=y
666CONFIG_DUMMY=m
667CONFIG_BONDING=m
668# CONFIG_EQUALIZER is not set
669CONFIG_TUN=m
670
671#
672# ARCnet devices
673#
674# CONFIG_ARCNET is not set
675
676#
677# PHY device support
678#
679# CONFIG_PHYLIB is not set
680
681#
682# Ethernet (10 or 100Mbit)
683#
684CONFIG_NET_ETHERNET=y
685CONFIG_MII=y
686# CONFIG_HAPPYMEAL is not set
687CONFIG_SUNGEM=y
688# CONFIG_CASSINI is not set
689CONFIG_NET_VENDOR_3COM=y
690CONFIG_VORTEX=y
691# CONFIG_TYPHOON is not set
692
693#
694# Tulip family network device support
695#
696# CONFIG_NET_TULIP is not set
697# CONFIG_HP100 is not set
698CONFIG_IBMVETH=m
699CONFIG_NET_PCI=y
700CONFIG_PCNET32=y
701# CONFIG_AMD8111_ETH is not set
702# CONFIG_ADAPTEC_STARFIRE is not set
703# CONFIG_B44 is not set
704# CONFIG_FORCEDETH is not set
705# CONFIG_DGRS is not set
706# CONFIG_EEPRO100 is not set
707CONFIG_E100=y
708# CONFIG_FEALNX is not set
709# CONFIG_NATSEMI is not set
710# CONFIG_NE2K_PCI is not set
711# CONFIG_8139CP is not set
712# CONFIG_8139TOO is not set
713# CONFIG_SIS900 is not set
714# CONFIG_EPIC100 is not set
715# CONFIG_SUNDANCE is not set
716# CONFIG_VIA_RHINE is not set
717
718#
719# Ethernet (1000 Mbit)
720#
721CONFIG_ACENIC=y
722CONFIG_ACENIC_OMIT_TIGON_I=y
723# CONFIG_DL2K is not set
724CONFIG_E1000=y
725# CONFIG_E1000_NAPI is not set
726# CONFIG_NS83820 is not set
727# CONFIG_HAMACHI is not set
728# CONFIG_YELLOWFIN is not set
729# CONFIG_R8169 is not set
730# CONFIG_SIS190 is not set
731# CONFIG_SKGE is not set
732# CONFIG_SK98LIN is not set
733# CONFIG_VIA_VELOCITY is not set
734CONFIG_TIGON3=y
735# CONFIG_BNX2 is not set
736# CONFIG_MV643XX_ETH is not set
737
738#
739# Ethernet (10000 Mbit)
740#
741# CONFIG_CHELSIO_T1 is not set
742CONFIG_IXGB=m
743# CONFIG_IXGB_NAPI is not set
744# CONFIG_S2IO is not set
745
746#
747# Token Ring devices
748#
749CONFIG_TR=y
750CONFIG_IBMOL=y
751# CONFIG_3C359 is not set
752# CONFIG_TMS380TR is not set
753
754#
755# Wireless LAN (non-hamradio)
756#
757# CONFIG_NET_RADIO is not set
758
759#
760# Wan interfaces
761#
762# CONFIG_WAN is not set
763# CONFIG_FDDI is not set
764# CONFIG_HIPPI is not set
765CONFIG_PPP=m
766# CONFIG_PPP_MULTILINK is not set
767# CONFIG_PPP_FILTER is not set
768CONFIG_PPP_ASYNC=m
769CONFIG_PPP_SYNC_TTY=m
770CONFIG_PPP_DEFLATE=m
771CONFIG_PPP_BSDCOMP=m
772# CONFIG_PPP_MPPE is not set
773CONFIG_PPPOE=m
774# CONFIG_SLIP is not set
775# CONFIG_NET_FC is not set
776# CONFIG_SHAPER is not set
777CONFIG_NETCONSOLE=y
778CONFIG_NETPOLL=y
779CONFIG_NETPOLL_RX=y
780CONFIG_NETPOLL_TRAP=y
781CONFIG_NET_POLL_CONTROLLER=y
782
783#
784# ISDN subsystem
785#
786# CONFIG_ISDN is not set
787
788#
789# Telephony Support
790#
791# CONFIG_PHONE is not set
792
793#
794# Input device support
795#
796CONFIG_INPUT=y
797
798#
799# Userland interfaces
800#
801CONFIG_INPUT_MOUSEDEV=y
802# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
803CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
804CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
805# CONFIG_INPUT_JOYDEV is not set
806# CONFIG_INPUT_TSDEV is not set
807CONFIG_INPUT_EVDEV=m
808# CONFIG_INPUT_EVBUG is not set
809
810#
811# Input Device Drivers
812#
813CONFIG_INPUT_KEYBOARD=y
814CONFIG_KEYBOARD_ATKBD=y
815# CONFIG_KEYBOARD_SUNKBD is not set
816# CONFIG_KEYBOARD_LKKBD is not set
817# CONFIG_KEYBOARD_XTKBD is not set
818# CONFIG_KEYBOARD_NEWTON is not set
819CONFIG_INPUT_MOUSE=y
820CONFIG_MOUSE_PS2=y
821# CONFIG_MOUSE_SERIAL is not set
822# CONFIG_MOUSE_VSXXXAA is not set
823# CONFIG_INPUT_JOYSTICK is not set
824# CONFIG_INPUT_TOUCHSCREEN is not set
825CONFIG_INPUT_MISC=y
826CONFIG_INPUT_PCSPKR=m
827# CONFIG_INPUT_UINPUT is not set
828
829#
830# Hardware I/O ports
831#
832CONFIG_SERIO=y
833CONFIG_SERIO_I8042=y
834# CONFIG_SERIO_SERPORT is not set
835# CONFIG_SERIO_PCIPS2 is not set
836CONFIG_SERIO_LIBPS2=y
837# CONFIG_SERIO_RAW is not set
838# CONFIG_GAMEPORT is not set
839
840#
841# Character devices
842#
843CONFIG_VT=y
844CONFIG_VT_CONSOLE=y
845CONFIG_HW_CONSOLE=y
846# CONFIG_SERIAL_NONSTANDARD is not set
847
848#
849# Serial drivers
850#
851CONFIG_SERIAL_8250=y
852CONFIG_SERIAL_8250_CONSOLE=y
853CONFIG_SERIAL_8250_NR_UARTS=4
854# CONFIG_SERIAL_8250_EXTENDED is not set
855
856#
857# Non-8250 serial port support
858#
859CONFIG_SERIAL_CORE=y
860CONFIG_SERIAL_CORE_CONSOLE=y
861# CONFIG_SERIAL_PMACZILOG is not set
862CONFIG_SERIAL_ICOM=m
863CONFIG_SERIAL_JSM=m
864CONFIG_UNIX98_PTYS=y
865CONFIG_LEGACY_PTYS=y
866CONFIG_LEGACY_PTY_COUNT=256
867CONFIG_HVC_CONSOLE=y
868CONFIG_HVCS=m
869
870#
871# IPMI
872#
873# CONFIG_IPMI_HANDLER is not set
874
875#
876# Watchdog Cards
877#
878# CONFIG_WATCHDOG is not set
879# CONFIG_RTC is not set
880# CONFIG_GEN_RTC is not set
881# CONFIG_DTLK is not set
882# CONFIG_R3964 is not set
883# CONFIG_APPLICOM is not set
884
885#
886# Ftape, the floppy tape device driver
887#
888# CONFIG_AGP is not set
889# CONFIG_DRM is not set
890CONFIG_RAW_DRIVER=y
891CONFIG_MAX_RAW_DEVS=256
892# CONFIG_HANGCHECK_TIMER is not set
893
894#
895# TPM devices
896#
897# CONFIG_TCG_TPM is not set
898# CONFIG_TELCLOCK is not set
899
900#
901# I2C support
902#
903CONFIG_I2C=y
904CONFIG_I2C_CHARDEV=y
905
906#
907# I2C Algorithms
908#
909CONFIG_I2C_ALGOBIT=y
910# CONFIG_I2C_ALGOPCF is not set
911# CONFIG_I2C_ALGOPCA is not set
912
913#
914# I2C Hardware Bus support
915#
916# CONFIG_I2C_ALI1535 is not set
917# CONFIG_I2C_ALI1563 is not set
918# CONFIG_I2C_ALI15X3 is not set
919# CONFIG_I2C_AMD756 is not set
920CONFIG_I2C_AMD8111=y
921# CONFIG_I2C_I801 is not set
922# CONFIG_I2C_I810 is not set
923# CONFIG_I2C_PIIX4 is not set
924CONFIG_I2C_KEYWEST=y
925CONFIG_I2C_PMAC_SMU=y
926# CONFIG_I2C_NFORCE2 is not set
927# CONFIG_I2C_PARPORT_LIGHT is not set
928# CONFIG_I2C_PROSAVAGE is not set
929# CONFIG_I2C_SAVAGE4 is not set
930# CONFIG_SCx200_ACB is not set
931# CONFIG_I2C_SIS5595 is not set
932# CONFIG_I2C_SIS630 is not set
933# CONFIG_I2C_SIS96X is not set
934# CONFIG_I2C_STUB is not set
935# CONFIG_I2C_VIA is not set
936# CONFIG_I2C_VIAPRO is not set
937# CONFIG_I2C_VOODOO3 is not set
938# CONFIG_I2C_PCA_ISA is not set
939
940#
941# Miscellaneous I2C Chip support
942#
943# CONFIG_SENSORS_DS1337 is not set
944# CONFIG_SENSORS_DS1374 is not set
945# CONFIG_SENSORS_EEPROM is not set
946# CONFIG_SENSORS_PCF8574 is not set
947# CONFIG_SENSORS_PCA9539 is not set
948# CONFIG_SENSORS_PCF8591 is not set
949# CONFIG_SENSORS_RTC8564 is not set
950# CONFIG_SENSORS_MAX6875 is not set
951# CONFIG_RTC_X1205_I2C is not set
952# CONFIG_I2C_DEBUG_CORE is not set
953# CONFIG_I2C_DEBUG_ALGO is not set
954# CONFIG_I2C_DEBUG_BUS is not set
955# CONFIG_I2C_DEBUG_CHIP is not set
956
957#
958# Dallas's 1-wire bus
959#
960# CONFIG_W1 is not set
961
962#
963# Hardware Monitoring support
964#
965# CONFIG_HWMON is not set
966# CONFIG_HWMON_VID is not set
967
968#
969# Misc devices
970#
971
972#
973# Multimedia Capabilities Port drivers
974#
975
976#
977# Multimedia devices
978#
979# CONFIG_VIDEO_DEV is not set
980
981#
982# Digital Video Broadcasting Devices
983#
984# CONFIG_DVB is not set
985
986#
987# Graphics support
988#
989CONFIG_FB=y
990CONFIG_FB_CFB_FILLRECT=y
991CONFIG_FB_CFB_COPYAREA=y
992CONFIG_FB_CFB_IMAGEBLIT=y
993CONFIG_FB_MACMODES=y
994CONFIG_FB_MODE_HELPERS=y
995CONFIG_FB_TILEBLITTING=y
996# CONFIG_FB_CIRRUS is not set
997# CONFIG_FB_PM2 is not set
998# CONFIG_FB_CYBER2000 is not set
999CONFIG_FB_OF=y
1000# CONFIG_FB_CONTROL is not set
1001# CONFIG_FB_PLATINUM is not set
1002# CONFIG_FB_VALKYRIE is not set
1003# CONFIG_FB_CT65550 is not set
1004# CONFIG_FB_ASILIANT is not set
1005# CONFIG_FB_IMSTT is not set
1006# CONFIG_FB_VGA16 is not set
1007# CONFIG_FB_S1D13XXX is not set
1008# CONFIG_FB_NVIDIA is not set
1009# CONFIG_FB_RIVA is not set
1010CONFIG_FB_MATROX=y
1011CONFIG_FB_MATROX_MILLENIUM=y
1012CONFIG_FB_MATROX_MYSTIQUE=y
1013CONFIG_FB_MATROX_G=y
1014CONFIG_FB_MATROX_I2C=m
1015CONFIG_FB_MATROX_MAVEN=m
1016CONFIG_FB_MATROX_MULTIHEAD=y
1017# CONFIG_FB_RADEON_OLD is not set
1018CONFIG_FB_RADEON=y
1019CONFIG_FB_RADEON_I2C=y
1020# CONFIG_FB_RADEON_DEBUG is not set
1021# CONFIG_FB_ATY128 is not set
1022# CONFIG_FB_ATY is not set
1023# CONFIG_FB_SAVAGE is not set
1024# CONFIG_FB_SIS is not set
1025# CONFIG_FB_NEOMAGIC is not set
1026# CONFIG_FB_KYRO is not set
1027# CONFIG_FB_3DFX is not set
1028# CONFIG_FB_VOODOO1 is not set
1029# CONFIG_FB_CYBLA is not set
1030# CONFIG_FB_TRIDENT is not set
1031# CONFIG_FB_VIRTUAL is not set
1032
1033#
1034# Console display driver support
1035#
1036# CONFIG_VGA_CONSOLE is not set
1037CONFIG_DUMMY_CONSOLE=y
1038CONFIG_FRAMEBUFFER_CONSOLE=y
1039# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
1040# CONFIG_FONTS is not set
1041CONFIG_FONT_8x8=y
1042CONFIG_FONT_8x16=y
1043
1044#
1045# Logo configuration
1046#
1047CONFIG_LOGO=y
1048CONFIG_LOGO_LINUX_MONO=y
1049CONFIG_LOGO_LINUX_VGA16=y
1050CONFIG_LOGO_LINUX_CLUT224=y
1051CONFIG_BACKLIGHT_LCD_SUPPORT=y
1052CONFIG_BACKLIGHT_CLASS_DEVICE=y
1053CONFIG_BACKLIGHT_DEVICE=y
1054CONFIG_LCD_CLASS_DEVICE=y
1055CONFIG_LCD_DEVICE=y
1056
1057#
1058# Sound
1059#
1060CONFIG_SOUND=m
1061
1062#
1063# Advanced Linux Sound Architecture
1064#
1065CONFIG_SND=m
1066CONFIG_SND_TIMER=m
1067CONFIG_SND_PCM=m
1068CONFIG_SND_SEQUENCER=m
1069CONFIG_SND_SEQ_DUMMY=m
1070CONFIG_SND_OSSEMUL=y
1071CONFIG_SND_MIXER_OSS=m
1072CONFIG_SND_PCM_OSS=m
1073CONFIG_SND_SEQUENCER_OSS=y
1074# CONFIG_SND_VERBOSE_PRINTK is not set
1075# CONFIG_SND_DEBUG is not set
1076CONFIG_SND_GENERIC_DRIVER=y
1077
1078#
1079# Generic devices
1080#
1081# CONFIG_SND_DUMMY is not set
1082# CONFIG_SND_VIRMIDI is not set
1083# CONFIG_SND_MTPAV is not set
1084# CONFIG_SND_SERIAL_U16550 is not set
1085# CONFIG_SND_MPU401 is not set
1086
1087#
1088# PCI devices
1089#
1090# CONFIG_SND_ALI5451 is not set
1091# CONFIG_SND_ATIIXP is not set
1092# CONFIG_SND_ATIIXP_MODEM is not set
1093# CONFIG_SND_AU8810 is not set
1094# CONFIG_SND_AU8820 is not set
1095# CONFIG_SND_AU8830 is not set
1096# CONFIG_SND_AZT3328 is not set
1097# CONFIG_SND_BT87X is not set
1098# CONFIG_SND_CS46XX is not set
1099# CONFIG_SND_CS4281 is not set
1100# CONFIG_SND_EMU10K1 is not set
1101# CONFIG_SND_EMU10K1X is not set
1102# CONFIG_SND_CA0106 is not set
1103# CONFIG_SND_KORG1212 is not set
1104# CONFIG_SND_MIXART is not set
1105# CONFIG_SND_NM256 is not set
1106# CONFIG_SND_RME32 is not set
1107# CONFIG_SND_RME96 is not set
1108# CONFIG_SND_RME9652 is not set
1109# CONFIG_SND_HDSP is not set
1110# CONFIG_SND_HDSPM is not set
1111# CONFIG_SND_TRIDENT is not set
1112# CONFIG_SND_YMFPCI is not set
1113# CONFIG_SND_AD1889 is not set
1114# CONFIG_SND_ALS4000 is not set
1115# CONFIG_SND_CMIPCI is not set
1116# CONFIG_SND_ENS1370 is not set
1117# CONFIG_SND_ENS1371 is not set
1118# CONFIG_SND_ES1938 is not set
1119# CONFIG_SND_ES1968 is not set
1120# CONFIG_SND_MAESTRO3 is not set
1121# CONFIG_SND_FM801 is not set
1122# CONFIG_SND_ICE1712 is not set
1123# CONFIG_SND_ICE1724 is not set
1124# CONFIG_SND_INTEL8X0 is not set
1125# CONFIG_SND_INTEL8X0M is not set
1126# CONFIG_SND_SONICVIBES is not set
1127# CONFIG_SND_VIA82XX is not set
1128# CONFIG_SND_VIA82XX_MODEM is not set
1129# CONFIG_SND_VX222 is not set
1130# CONFIG_SND_HDA_INTEL is not set
1131
1132#
1133# ALSA PowerMac devices
1134#
1135CONFIG_SND_POWERMAC=m
1136CONFIG_SND_POWERMAC_AUTO_DRC=y
1137
1138#
1139# USB devices
1140#
1141# CONFIG_SND_USB_AUDIO is not set
1142# CONFIG_SND_USB_USX2Y is not set
1143
1144#
1145# Open Sound System
1146#
1147# CONFIG_SOUND_PRIME is not set
1148
1149#
1150# USB support
1151#
1152CONFIG_USB_ARCH_HAS_HCD=y
1153CONFIG_USB_ARCH_HAS_OHCI=y
1154CONFIG_USB=y
1155# CONFIG_USB_DEBUG is not set
1156
1157#
1158# Miscellaneous USB options
1159#
1160CONFIG_USB_DEVICEFS=y
1161# CONFIG_USB_BANDWIDTH is not set
1162# CONFIG_USB_DYNAMIC_MINORS is not set
1163# CONFIG_USB_OTG is not set
1164
1165#
1166# USB Host Controller Drivers
1167#
1168CONFIG_USB_EHCI_HCD=y
1169# CONFIG_USB_EHCI_SPLIT_ISO is not set
1170# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
1171# CONFIG_USB_ISP116X_HCD is not set
1172CONFIG_USB_OHCI_HCD=y
1173# CONFIG_USB_OHCI_BIG_ENDIAN is not set
1174CONFIG_USB_OHCI_LITTLE_ENDIAN=y
1175# CONFIG_USB_UHCI_HCD is not set
1176# CONFIG_USB_SL811_HCD is not set
1177
1178#
1179# USB Device Class drivers
1180#
1181# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
1182# CONFIG_USB_ACM is not set
1183# CONFIG_USB_PRINTER is not set
1184
1185#
1186# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
1187#
1188
1189#
1190# may also be needed; see USB_STORAGE Help for more information
1191#
1192CONFIG_USB_STORAGE=m
1193# CONFIG_USB_STORAGE_DEBUG is not set
1194# CONFIG_USB_STORAGE_DATAFAB is not set
1195# CONFIG_USB_STORAGE_FREECOM is not set
1196# CONFIG_USB_STORAGE_ISD200 is not set
1197# CONFIG_USB_STORAGE_DPCM is not set
1198# CONFIG_USB_STORAGE_USBAT is not set
1199# CONFIG_USB_STORAGE_SDDR09 is not set
1200# CONFIG_USB_STORAGE_SDDR55 is not set
1201# CONFIG_USB_STORAGE_JUMPSHOT is not set
1202# CONFIG_USB_STORAGE_ONETOUCH is not set
1203
1204#
1205# USB Input Devices
1206#
1207CONFIG_USB_HID=y
1208CONFIG_USB_HIDINPUT=y
1209# CONFIG_HID_FF is not set
1210CONFIG_USB_HIDDEV=y
1211# CONFIG_USB_AIPTEK is not set
1212# CONFIG_USB_WACOM is not set
1213# CONFIG_USB_ACECAD is not set
1214# CONFIG_USB_KBTAB is not set
1215# CONFIG_USB_POWERMATE is not set
1216# CONFIG_USB_MTOUCH is not set
1217# CONFIG_USB_ITMTOUCH is not set
1218# CONFIG_USB_EGALAX is not set
1219# CONFIG_USB_YEALINK is not set
1220# CONFIG_USB_XPAD is not set
1221# CONFIG_USB_ATI_REMOTE is not set
1222# CONFIG_USB_KEYSPAN_REMOTE is not set
1223# CONFIG_USB_APPLETOUCH is not set
1224
1225#
1226# USB Imaging devices
1227#
1228# CONFIG_USB_MDC800 is not set
1229# CONFIG_USB_MICROTEK is not set
1230
1231#
1232# USB Multimedia devices
1233#
1234# CONFIG_USB_DABUSB is not set
1235
1236#
1237# Video4Linux support is needed for USB Multimedia device support
1238#
1239
1240#
1241# USB Network Adapters
1242#
1243# CONFIG_USB_CATC is not set
1244# CONFIG_USB_KAWETH is not set
1245# CONFIG_USB_PEGASUS is not set
1246# CONFIG_USB_RTL8150 is not set
1247# CONFIG_USB_USBNET is not set
1248# CONFIG_USB_MON is not set
1249
1250#
1251# USB port drivers
1252#
1253
1254#
1255# USB Serial Converter support
1256#
1257# CONFIG_USB_SERIAL is not set
1258
1259#
1260# USB Miscellaneous drivers
1261#
1262# CONFIG_USB_EMI62 is not set
1263# CONFIG_USB_EMI26 is not set
1264# CONFIG_USB_AUERSWALD is not set
1265# CONFIG_USB_RIO500 is not set
1266# CONFIG_USB_LEGOTOWER is not set
1267# CONFIG_USB_LCD is not set
1268# CONFIG_USB_LED is not set
1269# CONFIG_USB_CYTHERM is not set
1270# CONFIG_USB_PHIDGETKIT is not set
1271# CONFIG_USB_PHIDGETSERVO is not set
1272# CONFIG_USB_IDMOUSE is not set
1273# CONFIG_USB_SISUSBVGA is not set
1274# CONFIG_USB_LD is not set
1275# CONFIG_USB_TEST is not set
1276
1277#
1278# USB DSL modem support
1279#
1280
1281#
1282# USB Gadget Support
1283#
1284# CONFIG_USB_GADGET is not set
1285
1286#
1287# MMC/SD Card support
1288#
1289# CONFIG_MMC is not set
1290
1291#
1292# InfiniBand support
1293#
1294CONFIG_INFINIBAND=m
1295# CONFIG_INFINIBAND_USER_MAD is not set
1296# CONFIG_INFINIBAND_USER_ACCESS is not set
1297CONFIG_INFINIBAND_MTHCA=m
1298# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
1299CONFIG_INFINIBAND_IPOIB=m
1300# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
1301# CONFIG_INFINIBAND_SRP is not set
1302
1303#
1304# SN Devices
1305#
1306
1307#
1308# File systems
1309#
1310CONFIG_EXT2_FS=y
1311CONFIG_EXT2_FS_XATTR=y
1312CONFIG_EXT2_FS_POSIX_ACL=y
1313CONFIG_EXT2_FS_SECURITY=y
1314CONFIG_EXT2_FS_XIP=y
1315CONFIG_FS_XIP=y
1316CONFIG_EXT3_FS=y
1317CONFIG_EXT3_FS_XATTR=y
1318CONFIG_EXT3_FS_POSIX_ACL=y
1319CONFIG_EXT3_FS_SECURITY=y
1320CONFIG_JBD=y
1321# CONFIG_JBD_DEBUG is not set
1322CONFIG_FS_MBCACHE=y
1323CONFIG_REISERFS_FS=y
1324# CONFIG_REISERFS_CHECK is not set
1325# CONFIG_REISERFS_PROC_INFO is not set
1326CONFIG_REISERFS_FS_XATTR=y
1327CONFIG_REISERFS_FS_POSIX_ACL=y
1328CONFIG_REISERFS_FS_SECURITY=y
1329CONFIG_JFS_FS=y
1330CONFIG_JFS_POSIX_ACL=y
1331CONFIG_JFS_SECURITY=y
1332# CONFIG_JFS_DEBUG is not set
1333# CONFIG_JFS_STATISTICS is not set
1334CONFIG_FS_POSIX_ACL=y
1335CONFIG_XFS_FS=m
1336CONFIG_XFS_EXPORT=y
1337# CONFIG_XFS_QUOTA is not set
1338CONFIG_XFS_SECURITY=y
1339CONFIG_XFS_POSIX_ACL=y
1340# CONFIG_XFS_RT is not set
1341# CONFIG_MINIX_FS is not set
1342# CONFIG_ROMFS_FS is not set
1343CONFIG_INOTIFY=y
1344# CONFIG_QUOTA is not set
1345CONFIG_DNOTIFY=y
1346CONFIG_AUTOFS_FS=y
1347# CONFIG_AUTOFS4_FS is not set
1348# CONFIG_FUSE_FS is not set
1349
1350#
1351# CD-ROM/DVD Filesystems
1352#
1353CONFIG_ISO9660_FS=y
1354# CONFIG_JOLIET is not set
1355# CONFIG_ZISOFS is not set
1356CONFIG_UDF_FS=m
1357CONFIG_UDF_NLS=y
1358
1359#
1360# DOS/FAT/NT Filesystems
1361#
1362CONFIG_FAT_FS=y
1363CONFIG_MSDOS_FS=y
1364CONFIG_VFAT_FS=y
1365CONFIG_FAT_DEFAULT_CODEPAGE=437
1366CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
1367# CONFIG_NTFS_FS is not set
1368
1369#
1370# Pseudo filesystems
1371#
1372CONFIG_PROC_FS=y
1373CONFIG_PROC_KCORE=y
1374CONFIG_SYSFS=y
1375CONFIG_TMPFS=y
1376CONFIG_HUGETLBFS=y
1377CONFIG_HUGETLB_PAGE=y
1378CONFIG_RAMFS=y
1379# CONFIG_RELAYFS_FS is not set
1380
1381#
1382# Miscellaneous filesystems
1383#
1384# CONFIG_ADFS_FS is not set
1385# CONFIG_AFFS_FS is not set
1386CONFIG_HFS_FS=m
1387CONFIG_HFSPLUS_FS=m
1388# CONFIG_BEFS_FS is not set
1389# CONFIG_BFS_FS is not set
1390# CONFIG_EFS_FS is not set
1391CONFIG_CRAMFS=y
1392# CONFIG_VXFS_FS is not set
1393# CONFIG_HPFS_FS is not set
1394# CONFIG_QNX4FS_FS is not set
1395# CONFIG_SYSV_FS is not set
1396# CONFIG_UFS_FS is not set
1397
1398#
1399# Network File Systems
1400#
1401CONFIG_NFS_FS=y
1402CONFIG_NFS_V3=y
1403CONFIG_NFS_V3_ACL=y
1404CONFIG_NFS_V4=y
1405# CONFIG_NFS_DIRECTIO is not set
1406CONFIG_NFSD=m
1407CONFIG_NFSD_V2_ACL=y
1408CONFIG_NFSD_V3=y
1409CONFIG_NFSD_V3_ACL=y
1410CONFIG_NFSD_V4=y
1411CONFIG_NFSD_TCP=y
1412CONFIG_LOCKD=y
1413CONFIG_LOCKD_V4=y
1414CONFIG_EXPORTFS=m
1415CONFIG_NFS_ACL_SUPPORT=y
1416CONFIG_NFS_COMMON=y
1417CONFIG_SUNRPC=y
1418CONFIG_SUNRPC_GSS=y
1419CONFIG_RPCSEC_GSS_KRB5=y
1420CONFIG_RPCSEC_GSS_SPKM3=m
1421# CONFIG_SMB_FS is not set
1422CONFIG_CIFS=m
1423# CONFIG_CIFS_STATS is not set
1424CONFIG_CIFS_XATTR=y
1425CONFIG_CIFS_POSIX=y
1426# CONFIG_CIFS_EXPERIMENTAL is not set
1427# CONFIG_NCP_FS is not set
1428# CONFIG_CODA_FS is not set
1429# CONFIG_AFS_FS is not set
1430# CONFIG_9P_FS is not set
1431
1432#
1433# Partition Types
1434#
1435CONFIG_PARTITION_ADVANCED=y
1436# CONFIG_ACORN_PARTITION is not set
1437# CONFIG_OSF_PARTITION is not set
1438# CONFIG_AMIGA_PARTITION is not set
1439# CONFIG_ATARI_PARTITION is not set
1440CONFIG_MAC_PARTITION=y
1441CONFIG_MSDOS_PARTITION=y
1442# CONFIG_BSD_DISKLABEL is not set
1443# CONFIG_MINIX_SUBPARTITION is not set
1444# CONFIG_SOLARIS_X86_PARTITION is not set
1445# CONFIG_UNIXWARE_DISKLABEL is not set
1446# CONFIG_LDM_PARTITION is not set
1447# CONFIG_SGI_PARTITION is not set
1448# CONFIG_ULTRIX_PARTITION is not set
1449# CONFIG_SUN_PARTITION is not set
1450# CONFIG_EFI_PARTITION is not set
1451
1452#
1453# Native Language Support
1454#
1455CONFIG_NLS=y
1456CONFIG_NLS_DEFAULT="iso8859-1"
1457CONFIG_NLS_CODEPAGE_437=y
1458CONFIG_NLS_CODEPAGE_737=m
1459CONFIG_NLS_CODEPAGE_775=m
1460CONFIG_NLS_CODEPAGE_850=m
1461CONFIG_NLS_CODEPAGE_852=m
1462CONFIG_NLS_CODEPAGE_855=m
1463CONFIG_NLS_CODEPAGE_857=m
1464CONFIG_NLS_CODEPAGE_860=m
1465CONFIG_NLS_CODEPAGE_861=m
1466CONFIG_NLS_CODEPAGE_862=m
1467CONFIG_NLS_CODEPAGE_863=m
1468CONFIG_NLS_CODEPAGE_864=m
1469CONFIG_NLS_CODEPAGE_865=m
1470CONFIG_NLS_CODEPAGE_866=m
1471CONFIG_NLS_CODEPAGE_869=m
1472CONFIG_NLS_CODEPAGE_936=m
1473CONFIG_NLS_CODEPAGE_950=m
1474CONFIG_NLS_CODEPAGE_932=m
1475CONFIG_NLS_CODEPAGE_949=m
1476CONFIG_NLS_CODEPAGE_874=m
1477CONFIG_NLS_ISO8859_8=m
1478CONFIG_NLS_CODEPAGE_1250=m
1479CONFIG_NLS_CODEPAGE_1251=m
1480CONFIG_NLS_ASCII=m
1481CONFIG_NLS_ISO8859_1=y
1482CONFIG_NLS_ISO8859_2=m
1483CONFIG_NLS_ISO8859_3=m
1484CONFIG_NLS_ISO8859_4=m
1485CONFIG_NLS_ISO8859_5=m
1486CONFIG_NLS_ISO8859_6=m
1487CONFIG_NLS_ISO8859_7=m
1488CONFIG_NLS_ISO8859_9=m
1489CONFIG_NLS_ISO8859_13=m
1490CONFIG_NLS_ISO8859_14=m
1491CONFIG_NLS_ISO8859_15=m
1492CONFIG_NLS_KOI8_R=m
1493CONFIG_NLS_KOI8_U=m
1494CONFIG_NLS_UTF8=m
1495
1496#
1497# Library routines
1498#
1499CONFIG_CRC_CCITT=m
1500# CONFIG_CRC16 is not set
1501CONFIG_CRC32=y
1502CONFIG_LIBCRC32C=m
1503CONFIG_ZLIB_INFLATE=y
1504CONFIG_ZLIB_DEFLATE=m
1505CONFIG_TEXTSEARCH=y
1506CONFIG_TEXTSEARCH_KMP=m
1507CONFIG_TEXTSEARCH_BM=m
1508CONFIG_TEXTSEARCH_FSM=m
1509
1510#
1511# Instrumentation Support
1512#
1513CONFIG_PROFILING=y
1514CONFIG_OPROFILE=y
1515# CONFIG_KPROBES is not set
1516
1517#
1518# Kernel hacking
1519#
1520# CONFIG_PRINTK_TIME is not set
1521CONFIG_DEBUG_KERNEL=y
1522CONFIG_MAGIC_SYSRQ=y
1523CONFIG_LOG_BUF_SHIFT=17
1524CONFIG_DETECT_SOFTLOCKUP=y
1525# CONFIG_SCHEDSTATS is not set
1526# CONFIG_DEBUG_SLAB is not set
1527# CONFIG_DEBUG_SPINLOCK is not set
1528# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
1529# CONFIG_DEBUG_KOBJECT is not set
1530# CONFIG_DEBUG_INFO is not set
1531CONFIG_DEBUG_FS=y
1532# CONFIG_DEBUG_VM is not set
1533# CONFIG_RCU_TORTURE_TEST is not set
1534CONFIG_DEBUG_STACKOVERFLOW=y
1535CONFIG_DEBUG_STACK_USAGE=y
1536CONFIG_DEBUGGER=y
1537CONFIG_XMON=y
1538# CONFIG_XMON_DEFAULT is not set
1539CONFIG_IRQSTACKS=y
1540CONFIG_BOOTX_TEXT=y
1541
1542#
1543# Security options
1544#
1545# CONFIG_KEYS is not set
1546# CONFIG_SECURITY is not set
1547
1548#
1549# Cryptographic options
1550#
1551CONFIG_CRYPTO=y
1552CONFIG_CRYPTO_HMAC=y
1553CONFIG_CRYPTO_NULL=m
1554CONFIG_CRYPTO_MD4=m
1555CONFIG_CRYPTO_MD5=y
1556CONFIG_CRYPTO_SHA1=m
1557CONFIG_CRYPTO_SHA256=m
1558CONFIG_CRYPTO_SHA512=m
1559CONFIG_CRYPTO_WP512=m
1560CONFIG_CRYPTO_TGR192=m
1561CONFIG_CRYPTO_DES=y
1562CONFIG_CRYPTO_BLOWFISH=m
1563CONFIG_CRYPTO_TWOFISH=m
1564CONFIG_CRYPTO_SERPENT=m
1565CONFIG_CRYPTO_AES=m
1566CONFIG_CRYPTO_CAST5=m
1567CONFIG_CRYPTO_CAST6=m
1568CONFIG_CRYPTO_TEA=m
1569CONFIG_CRYPTO_ARC4=m
1570CONFIG_CRYPTO_KHAZAD=m
1571CONFIG_CRYPTO_ANUBIS=m
1572CONFIG_CRYPTO_DEFLATE=m
1573CONFIG_CRYPTO_MICHAEL_MIC=m
1574CONFIG_CRYPTO_CRC32C=m
1575CONFIG_CRYPTO_TEST=m
1576
1577#
1578# Hardware crypto devices
1579#
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig
index b4745c918a4a..b589b196eb3f 100644
--- a/arch/powerpc/configs/pseries_defconfig
+++ b/arch/powerpc/configs/pseries_defconfig
@@ -165,7 +165,6 @@ CONFIG_SPARSEMEM_EXTREME=y
165# CONFIG_MEMORY_HOTPLUG is not set 165# CONFIG_MEMORY_HOTPLUG is not set
166CONFIG_SPLIT_PTLOCK_CPUS=4096 166CONFIG_SPLIT_PTLOCK_CPUS=4096
167CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y 167CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
168CONFIG_NODES_SPAN_OTHER_NODES=y
169# CONFIG_PPC_64K_PAGES is not set 168# CONFIG_PPC_64K_PAGES is not set
170CONFIG_SCHED_SMT=y 169CONFIG_SCHED_SMT=y
171CONFIG_PROC_DEVICETREE=y 170CONFIG_PROC_DEVICETREE=y
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 4970e3721a84..9ed551b6c172 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -12,12 +12,12 @@ CFLAGS_btext.o += -fPIC
12endif 12endif
13 13
14obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ 14obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
15 irq.o signal_32.o pmc.o vdso.o 15 irq.o align.o signal_32.o pmc.o vdso.o
16obj-y += vdso32/ 16obj-y += vdso32/
17obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ 17obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
18 signal_64.o ptrace32.o systbl.o \ 18 signal_64.o ptrace32.o systbl.o \
19 paca.o ioctl32.o cpu_setup_power4.o \ 19 paca.o ioctl32.o cpu_setup_power4.o \
20 firmware.o sysfs.o udbg.o 20 firmware.o sysfs.o udbg.o idle_64.o
21obj-$(CONFIG_PPC64) += vdso64/ 21obj-$(CONFIG_PPC64) += vdso64/
22obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o 22obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
23obj-$(CONFIG_POWER4) += idle_power4.o 23obj-$(CONFIG_POWER4) += idle_power4.o
@@ -35,6 +35,7 @@ obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
35obj-$(CONFIG_PPC_MAPLE) += udbg_16550.o 35obj-$(CONFIG_PPC_MAPLE) += udbg_16550.o
36udbgscc-$(CONFIG_PPC64) := udbg_scc.o 36udbgscc-$(CONFIG_PPC64) := udbg_scc.o
37obj-$(CONFIG_PPC_PMAC) += $(udbgscc-y) 37obj-$(CONFIG_PPC_PMAC) += $(udbgscc-y)
38obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o
38 39
39ifeq ($(CONFIG_PPC_MERGE),y) 40ifeq ($(CONFIG_PPC_MERGE),y)
40 41
@@ -78,5 +79,7 @@ smpobj-$(CONFIG_SMP) += smp.o
78 79
79endif 80endif
80 81
82obj-$(CONFIG_PPC64) += $(obj64-y)
83
81extra-$(CONFIG_PPC_FPU) += fpu.o 84extra-$(CONFIG_PPC_FPU) += fpu.o
82extra-$(CONFIG_PPC64) += entry_64.o 85extra-$(CONFIG_PPC64) += entry_64.o
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
new file mode 100644
index 000000000000..faaec9c6f78f
--- /dev/null
+++ b/arch/powerpc/kernel/align.c
@@ -0,0 +1,530 @@
1/* align.c - handle alignment exceptions for the Power PC.
2 *
3 * Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
4 * Copyright (c) 1998-1999 TiVo, Inc.
5 * PowerPC 403GCX modifications.
6 * Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
7 * PowerPC 403GCX/405GP modifications.
8 * Copyright (c) 2001-2002 PPC64 team, IBM Corp
9 * 64-bit and Power4 support
10 * Copyright (c) 2005 Benjamin Herrenschmidt, IBM Corp
11 * <benh@kernel.crashing.org>
12 * Merge ppc32 and ppc64 implementations
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version
17 * 2 of the License, or (at your option) any later version.
18 */
19
20#include <linux/kernel.h>
21#include <linux/mm.h>
22#include <asm/processor.h>
23#include <asm/uaccess.h>
24#include <asm/system.h>
25#include <asm/cache.h>
26#include <asm/cputable.h>
27
28struct aligninfo {
29 unsigned char len;
30 unsigned char flags;
31};
32
33#define IS_XFORM(inst) (((inst) >> 26) == 31)
34#define IS_DSFORM(inst) (((inst) >> 26) >= 56)
35
36#define INVALID { 0, 0 }
37
38#define LD 1 /* load */
39#define ST 2 /* store */
40#define SE 4 /* sign-extend value */
41#define F 8 /* to/from fp regs */
42#define U 0x10 /* update index register */
43#define M 0x20 /* multiple load/store */
44#define SW 0x40 /* byte swap int or ... */
45#define S 0x40 /* ... single-precision fp */
46#define SX 0x40 /* byte count in XER */
47#define HARD 0x80 /* string, stwcx. */
48
49#define DCBZ 0x5f /* 8xx/82xx dcbz faults when cache not enabled */
50
51#define SWAP(a, b) (t = (a), (a) = (b), (b) = t)
52
53/*
54 * The PowerPC stores certain bits of the instruction that caused the
55 * alignment exception in the DSISR register. This array maps those
56 * bits to information about the operand length and what the
57 * instruction would do.
58 */
59static struct aligninfo aligninfo[128] = {
60 { 4, LD }, /* 00 0 0000: lwz / lwarx */
61 INVALID, /* 00 0 0001 */
62 { 4, ST }, /* 00 0 0010: stw */
63 INVALID, /* 00 0 0011 */
64 { 2, LD }, /* 00 0 0100: lhz */
65 { 2, LD+SE }, /* 00 0 0101: lha */
66 { 2, ST }, /* 00 0 0110: sth */
67 { 4, LD+M }, /* 00 0 0111: lmw */
68 { 4, LD+F+S }, /* 00 0 1000: lfs */
69 { 8, LD+F }, /* 00 0 1001: lfd */
70 { 4, ST+F+S }, /* 00 0 1010: stfs */
71 { 8, ST+F }, /* 00 0 1011: stfd */
72 INVALID, /* 00 0 1100 */
73 { 8, LD }, /* 00 0 1101: ld/ldu/lwa */
74 INVALID, /* 00 0 1110 */
75 { 8, ST }, /* 00 0 1111: std/stdu */
76 { 4, LD+U }, /* 00 1 0000: lwzu */
77 INVALID, /* 00 1 0001 */
78 { 4, ST+U }, /* 00 1 0010: stwu */
79 INVALID, /* 00 1 0011 */
80 { 2, LD+U }, /* 00 1 0100: lhzu */
81 { 2, LD+SE+U }, /* 00 1 0101: lhau */
82 { 2, ST+U }, /* 00 1 0110: sthu */
83 { 4, ST+M }, /* 00 1 0111: stmw */
84 { 4, LD+F+S+U }, /* 00 1 1000: lfsu */
85 { 8, LD+F+U }, /* 00 1 1001: lfdu */
86 { 4, ST+F+S+U }, /* 00 1 1010: stfsu */
87 { 8, ST+F+U }, /* 00 1 1011: stfdu */
88 INVALID, /* 00 1 1100 */
89 INVALID, /* 00 1 1101 */
90 INVALID, /* 00 1 1110 */
91 INVALID, /* 00 1 1111 */
92 { 8, LD }, /* 01 0 0000: ldx */
93 INVALID, /* 01 0 0001 */
94 { 8, ST }, /* 01 0 0010: stdx */
95 INVALID, /* 01 0 0011 */
96 INVALID, /* 01 0 0100 */
97 { 4, LD+SE }, /* 01 0 0101: lwax */
98 INVALID, /* 01 0 0110 */
99 INVALID, /* 01 0 0111 */
100 { 4, LD+M+HARD+SX }, /* 01 0 1000: lswx */
101 { 4, LD+M+HARD }, /* 01 0 1001: lswi */
102 { 4, ST+M+HARD+SX }, /* 01 0 1010: stswx */
103 { 4, ST+M+HARD }, /* 01 0 1011: stswi */
104 INVALID, /* 01 0 1100 */
105 { 8, LD+U }, /* 01 0 1101: ldu */
106 INVALID, /* 01 0 1110 */
107 { 8, ST+U }, /* 01 0 1111: stdu */
108 { 8, LD+U }, /* 01 1 0000: ldux */
109 INVALID, /* 01 1 0001 */
110 { 8, ST+U }, /* 01 1 0010: stdux */
111 INVALID, /* 01 1 0011 */
112 INVALID, /* 01 1 0100 */
113 { 4, LD+SE+U }, /* 01 1 0101: lwaux */
114 INVALID, /* 01 1 0110 */
115 INVALID, /* 01 1 0111 */
116 INVALID, /* 01 1 1000 */
117 INVALID, /* 01 1 1001 */
118 INVALID, /* 01 1 1010 */
119 INVALID, /* 01 1 1011 */
120 INVALID, /* 01 1 1100 */
121 INVALID, /* 01 1 1101 */
122 INVALID, /* 01 1 1110 */
123 INVALID, /* 01 1 1111 */
124 INVALID, /* 10 0 0000 */
125 INVALID, /* 10 0 0001 */
126 INVALID, /* 10 0 0010: stwcx. */
127 INVALID, /* 10 0 0011 */
128 INVALID, /* 10 0 0100 */
129 INVALID, /* 10 0 0101 */
130 INVALID, /* 10 0 0110 */
131 INVALID, /* 10 0 0111 */
132 { 4, LD+SW }, /* 10 0 1000: lwbrx */
133 INVALID, /* 10 0 1001 */
134 { 4, ST+SW }, /* 10 0 1010: stwbrx */
135 INVALID, /* 10 0 1011 */
136 { 2, LD+SW }, /* 10 0 1100: lhbrx */
137 { 4, LD+SE }, /* 10 0 1101 lwa */
138 { 2, ST+SW }, /* 10 0 1110: sthbrx */
139 INVALID, /* 10 0 1111 */
140 INVALID, /* 10 1 0000 */
141 INVALID, /* 10 1 0001 */
142 INVALID, /* 10 1 0010 */
143 INVALID, /* 10 1 0011 */
144 INVALID, /* 10 1 0100 */
145 INVALID, /* 10 1 0101 */
146 INVALID, /* 10 1 0110 */
147 INVALID, /* 10 1 0111 */
148 INVALID, /* 10 1 1000 */
149 INVALID, /* 10 1 1001 */
150 INVALID, /* 10 1 1010 */
151 INVALID, /* 10 1 1011 */
152 INVALID, /* 10 1 1100 */
153 INVALID, /* 10 1 1101 */
154 INVALID, /* 10 1 1110 */
155 { 0, ST+HARD }, /* 10 1 1111: dcbz */
156 { 4, LD }, /* 11 0 0000: lwzx */
157 INVALID, /* 11 0 0001 */
158 { 4, ST }, /* 11 0 0010: stwx */
159 INVALID, /* 11 0 0011 */
160 { 2, LD }, /* 11 0 0100: lhzx */
161 { 2, LD+SE }, /* 11 0 0101: lhax */
162 { 2, ST }, /* 11 0 0110: sthx */
163 INVALID, /* 11 0 0111 */
164 { 4, LD+F+S }, /* 11 0 1000: lfsx */
165 { 8, LD+F }, /* 11 0 1001: lfdx */
166 { 4, ST+F+S }, /* 11 0 1010: stfsx */
167 { 8, ST+F }, /* 11 0 1011: stfdx */
168 INVALID, /* 11 0 1100 */
169 { 8, LD+M }, /* 11 0 1101: lmd */
170 INVALID, /* 11 0 1110 */
171 { 8, ST+M }, /* 11 0 1111: stmd */
172 { 4, LD+U }, /* 11 1 0000: lwzux */
173 INVALID, /* 11 1 0001 */
174 { 4, ST+U }, /* 11 1 0010: stwux */
175 INVALID, /* 11 1 0011 */
176 { 2, LD+U }, /* 11 1 0100: lhzux */
177 { 2, LD+SE+U }, /* 11 1 0101: lhaux */
178 { 2, ST+U }, /* 11 1 0110: sthux */
179 INVALID, /* 11 1 0111 */
180 { 4, LD+F+S+U }, /* 11 1 1000: lfsux */
181 { 8, LD+F+U }, /* 11 1 1001: lfdux */
182 { 4, ST+F+S+U }, /* 11 1 1010: stfsux */
183 { 8, ST+F+U }, /* 11 1 1011: stfdux */
184 INVALID, /* 11 1 1100 */
185 INVALID, /* 11 1 1101 */
186 INVALID, /* 11 1 1110 */
187 INVALID, /* 11 1 1111 */
188};
189
190/*
191 * Create a DSISR value from the instruction
192 */
193static inline unsigned make_dsisr(unsigned instr)
194{
195 unsigned dsisr;
196
197
198 /* bits 6:15 --> 22:31 */
199 dsisr = (instr & 0x03ff0000) >> 16;
200
201 if (IS_XFORM(instr)) {
202 /* bits 29:30 --> 15:16 */
203 dsisr |= (instr & 0x00000006) << 14;
204 /* bit 25 --> 17 */
205 dsisr |= (instr & 0x00000040) << 8;
206 /* bits 21:24 --> 18:21 */
207 dsisr |= (instr & 0x00000780) << 3;
208 } else {
209 /* bit 5 --> 17 */
210 dsisr |= (instr & 0x04000000) >> 12;
211 /* bits 1: 4 --> 18:21 */
212 dsisr |= (instr & 0x78000000) >> 17;
213 /* bits 30:31 --> 12:13 */
214 if (IS_DSFORM(instr))
215 dsisr |= (instr & 0x00000003) << 18;
216 }
217
218 return dsisr;
219}
220
221/*
222 * The dcbz (data cache block zero) instruction
223 * gives an alignment fault if used on non-cacheable
224 * memory. We handle the fault mainly for the
225 * case when we are running with the cache disabled
226 * for debugging.
227 */
228static int emulate_dcbz(struct pt_regs *regs, unsigned char __user *addr)
229{
230 long __user *p;
231 int i, size;
232
233#ifdef __powerpc64__
234 size = ppc64_caches.dline_size;
235#else
236 size = L1_CACHE_BYTES;
237#endif
238 p = (long __user *) (regs->dar & -size);
239 if (user_mode(regs) && !access_ok(VERIFY_WRITE, p, size))
240 return -EFAULT;
241 for (i = 0; i < size / sizeof(long); ++i)
242 if (__put_user(0, p+i))
243 return -EFAULT;
244 return 1;
245}
246
247/*
248 * Emulate load & store multiple instructions
249 * On 64-bit machines, these instructions only affect/use the
250 * bottom 4 bytes of each register, and the loads clear the
251 * top 4 bytes of the affected register.
252 */
253#ifdef CONFIG_PPC64
254#define REG_BYTE(rp, i) *((u8 *)((rp) + ((i) >> 2)) + ((i) & 3) + 4)
255#else
256#define REG_BYTE(rp, i) *((u8 *)(rp) + (i))
257#endif
258
259static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
260 unsigned int reg, unsigned int nb,
261 unsigned int flags, unsigned int instr)
262{
263 unsigned long *rptr;
264 unsigned int nb0, i;
265
266 /*
267 * We do not try to emulate 8 bytes multiple as they aren't really
268 * available in our operating environments and we don't try to
269 * emulate multiples operations in kernel land as they should never
270 * be used/generated there at least not on unaligned boundaries
271 */
272 if (unlikely((nb > 4) || !user_mode(regs)))
273 return 0;
274
275 /* lmw, stmw, lswi/x, stswi/x */
276 nb0 = 0;
277 if (flags & HARD) {
278 if (flags & SX) {
279 nb = regs->xer & 127;
280 if (nb == 0)
281 return 1;
282 } else {
283 if (__get_user(instr,
284 (unsigned int __user *)regs->nip))
285 return -EFAULT;
286 nb = (instr >> 11) & 0x1f;
287 if (nb == 0)
288 nb = 32;
289 }
290 if (nb + reg * 4 > 128) {
291 nb0 = nb + reg * 4 - 128;
292 nb = 128 - reg * 4;
293 }
294 } else {
295 /* lwm, stmw */
296 nb = (32 - reg) * 4;
297 }
298
299 if (!access_ok((flags & ST ? VERIFY_WRITE: VERIFY_READ), addr, nb+nb0))
300 return -EFAULT; /* bad address */
301
302 rptr = &regs->gpr[reg];
303 if (flags & LD) {
304 /*
305 * This zeroes the top 4 bytes of the affected registers
306 * in 64-bit mode, and also zeroes out any remaining
307 * bytes of the last register for lsw*.
308 */
309 memset(rptr, 0, ((nb + 3) / 4) * sizeof(unsigned long));
310 if (nb0 > 0)
311 memset(&regs->gpr[0], 0,
312 ((nb0 + 3) / 4) * sizeof(unsigned long));
313
314 for (i = 0; i < nb; ++i)
315 if (__get_user(REG_BYTE(rptr, i), addr + i))
316 return -EFAULT;
317 if (nb0 > 0) {
318 rptr = &regs->gpr[0];
319 addr += nb;
320 for (i = 0; i < nb0; ++i)
321 if (__get_user(REG_BYTE(rptr, i), addr + i))
322 return -EFAULT;
323 }
324
325 } else {
326 for (i = 0; i < nb; ++i)
327 if (__put_user(REG_BYTE(rptr, i), addr + i))
328 return -EFAULT;
329 if (nb0 > 0) {
330 rptr = &regs->gpr[0];
331 addr += nb;
332 for (i = 0; i < nb0; ++i)
333 if (__put_user(REG_BYTE(rptr, i), addr + i))
334 return -EFAULT;
335 }
336 }
337 return 1;
338}
339
340
341/*
342 * Called on alignment exception. Attempts to fixup
343 *
344 * Return 1 on success
345 * Return 0 if unable to handle the interrupt
346 * Return -EFAULT if data address is bad
347 */
348
349int fix_alignment(struct pt_regs *regs)
350{
351 unsigned int instr, nb, flags;
352 unsigned int reg, areg;
353 unsigned int dsisr;
354 unsigned char __user *addr;
355 unsigned char __user *p;
356 int ret, t;
357 union {
358 u64 ll;
359 double dd;
360 unsigned char v[8];
361 struct {
362 unsigned hi32;
363 int low32;
364 } x32;
365 struct {
366 unsigned char hi48[6];
367 short low16;
368 } x16;
369 } data;
370
371 /*
372 * We require a complete register set, if not, then our assembly
373 * is broken
374 */
375 CHECK_FULL_REGS(regs);
376
377 dsisr = regs->dsisr;
378
379 /* Some processors don't provide us with a DSISR we can use here,
380 * let's make one up from the instruction
381 */
382 if (cpu_has_feature(CPU_FTR_NODSISRALIGN)) {
383 unsigned int real_instr;
384 if (unlikely(__get_user(real_instr,
385 (unsigned int __user *)regs->nip)))
386 return -EFAULT;
387 dsisr = make_dsisr(real_instr);
388 }
389
390 /* extract the operation and registers from the dsisr */
391 reg = (dsisr >> 5) & 0x1f; /* source/dest register */
392 areg = dsisr & 0x1f; /* register to update */
393 instr = (dsisr >> 10) & 0x7f;
394 instr |= (dsisr >> 13) & 0x60;
395
396 /* Lookup the operation in our table */
397 nb = aligninfo[instr].len;
398 flags = aligninfo[instr].flags;
399
400 /* DAR has the operand effective address */
401 addr = (unsigned char __user *)regs->dar;
402
403 /* A size of 0 indicates an instruction we don't support, with
404 * the exception of DCBZ which is handled as a special case here
405 */
406 if (instr == DCBZ)
407 return emulate_dcbz(regs, addr);
408 if (unlikely(nb == 0))
409 return 0;
410
411 /* Load/Store Multiple instructions are handled in their own
412 * function
413 */
414 if (flags & M)
415 return emulate_multiple(regs, addr, reg, nb, flags, instr);
416
417 /* Verify the address of the operand */
418 if (unlikely(user_mode(regs) &&
419 !access_ok((flags & ST ? VERIFY_WRITE : VERIFY_READ),
420 addr, nb)))
421 return -EFAULT;
422
423 /* Force the fprs into the save area so we can reference them */
424 if (flags & F) {
425 /* userland only */
426 if (unlikely(!user_mode(regs)))
427 return 0;
428 flush_fp_to_thread(current);
429 }
430
431 /* If we are loading, get the data from user space, else
432 * get it from register values
433 */
434 if (flags & LD) {
435 data.ll = 0;
436 ret = 0;
437 p = addr;
438 switch (nb) {
439 case 8:
440 ret |= __get_user(data.v[0], p++);
441 ret |= __get_user(data.v[1], p++);
442 ret |= __get_user(data.v[2], p++);
443 ret |= __get_user(data.v[3], p++);
444 case 4:
445 ret |= __get_user(data.v[4], p++);
446 ret |= __get_user(data.v[5], p++);
447 case 2:
448 ret |= __get_user(data.v[6], p++);
449 ret |= __get_user(data.v[7], p++);
450 if (unlikely(ret))
451 return -EFAULT;
452 }
453 } else if (flags & F)
454 data.dd = current->thread.fpr[reg];
455 else
456 data.ll = regs->gpr[reg];
457
458 /* Perform other misc operations like sign extension, byteswap,
459 * or floating point single precision conversion
460 */
461 switch (flags & ~U) {
462 case LD+SE: /* sign extend */
463 if ( nb == 2 )
464 data.ll = data.x16.low16;
465 else /* nb must be 4 */
466 data.ll = data.x32.low32;
467 break;
468 case LD+S: /* byte-swap */
469 case ST+S:
470 if (nb == 2) {
471 SWAP(data.v[6], data.v[7]);
472 } else {
473 SWAP(data.v[4], data.v[7]);
474 SWAP(data.v[5], data.v[6]);
475 }
476 break;
477
478 /* Single-precision FP load and store require conversions... */
479 case LD+F+S:
480#ifdef CONFIG_PPC_FPU
481 preempt_disable();
482 enable_kernel_fp();
483 cvt_fd((float *)&data.v[4], &data.dd, &current->thread);
484 preempt_enable();
485#else
486 return 0;
487#endif
488 break;
489 case ST+F+S:
490#ifdef CONFIG_PPC_FPU
491 preempt_disable();
492 enable_kernel_fp();
493 cvt_df(&data.dd, (float *)&data.v[4], &current->thread);
494 preempt_enable();
495#else
496 return 0;
497#endif
498 break;
499 }
500
501 /* Store result to memory or update registers */
502 if (flags & ST) {
503 ret = 0;
504 p = addr;
505 switch (nb) {
506 case 8:
507 ret |= __put_user(data.v[0], p++);
508 ret |= __put_user(data.v[1], p++);
509 ret |= __put_user(data.v[2], p++);
510 ret |= __put_user(data.v[3], p++);
511 case 4:
512 ret |= __put_user(data.v[4], p++);
513 ret |= __put_user(data.v[5], p++);
514 case 2:
515 ret |= __put_user(data.v[6], p++);
516 ret |= __put_user(data.v[7], p++);
517 }
518 if (unlikely(ret))
519 return -EFAULT;
520 } else if (flags & F)
521 current->thread.fpr[reg] = data.dd;
522 else
523 regs->gpr[reg] = data.ll;
524
525 /* Update RA as needed */
526 if (flags & U)
527 regs->gpr[areg] = regs->dar;
528
529 return 1;
530}
diff --git a/arch/powerpc/kernel/idle_64.c b/arch/powerpc/kernel/idle_64.c
new file mode 100644
index 000000000000..b879d3057ef8
--- /dev/null
+++ b/arch/powerpc/kernel/idle_64.c
@@ -0,0 +1,121 @@
1/*
2 * Idle daemon for PowerPC. Idle daemon will handle any action
3 * that needs to be taken when the system becomes idle.
4 *
5 * Originally Written by Cort Dougan (cort@cs.nmt.edu)
6 *
7 * iSeries supported added by Mike Corrigan <mikejc@us.ibm.com>
8 *
9 * Additional shared processor, SMT, and firmware support
10 * Copyright (c) 2003 Dave Engebretsen <engebret@us.ibm.com>
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
16 */
17
18#include <linux/config.h>
19#include <linux/sched.h>
20#include <linux/kernel.h>
21#include <linux/smp.h>
22#include <linux/cpu.h>
23#include <linux/sysctl.h>
24
25#include <asm/system.h>
26#include <asm/processor.h>
27#include <asm/cputable.h>
28#include <asm/time.h>
29#include <asm/machdep.h>
30#include <asm/smp.h>
31
32extern void power4_idle(void);
33
34void default_idle(void)
35{
36 unsigned int cpu = smp_processor_id();
37 set_thread_flag(TIF_POLLING_NRFLAG);
38
39 while (1) {
40 if (!need_resched()) {
41 while (!need_resched() && !cpu_is_offline(cpu)) {
42 ppc64_runlatch_off();
43
44 /*
45 * Go into low thread priority and possibly
46 * low power mode.
47 */
48 HMT_low();
49 HMT_very_low();
50 }
51
52 HMT_medium();
53 }
54
55 ppc64_runlatch_on();
56 preempt_enable_no_resched();
57 schedule();
58 preempt_disable();
59 if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING)
60 cpu_die();
61 }
62}
63
64void native_idle(void)
65{
66 while (1) {
67 ppc64_runlatch_off();
68
69 if (!need_resched())
70 power4_idle();
71
72 if (need_resched()) {
73 ppc64_runlatch_on();
74 preempt_enable_no_resched();
75 schedule();
76 preempt_disable();
77 }
78
79 if (cpu_is_offline(smp_processor_id()) &&
80 system_state == SYSTEM_RUNNING)
81 cpu_die();
82 }
83}
84
85void cpu_idle(void)
86{
87 BUG_ON(NULL == ppc_md.idle_loop);
88 ppc_md.idle_loop();
89}
90
91int powersave_nap;
92
93#ifdef CONFIG_SYSCTL
94/*
95 * Register the sysctl to set/clear powersave_nap.
96 */
97static ctl_table powersave_nap_ctl_table[]={
98 {
99 .ctl_name = KERN_PPC_POWERSAVE_NAP,
100 .procname = "powersave-nap",
101 .data = &powersave_nap,
102 .maxlen = sizeof(int),
103 .mode = 0644,
104 .proc_handler = &proc_dointvec,
105 },
106 { 0, },
107};
108static ctl_table powersave_nap_sysctl_root[] = {
109 { 1, "kernel", NULL, 0, 0755, powersave_nap_ctl_table, },
110 { 0,},
111};
112
113static int __init
114register_powersave_nap_sysctl(void)
115{
116 register_sysctl_table(powersave_nap_sysctl_root, 0);
117
118 return 0;
119}
120__initcall(register_powersave_nap_sysctl);
121#endif
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index f6d84a75ed26..624a983a9676 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -27,14 +27,6 @@
27 27
28 .text 28 .text
29 29
30 .align 5
31_GLOBAL(__delay)
32 cmpwi 0,r3,0
33 mtctr r3
34 beqlr
351: bdnz 1b
36 blr
37
38/* 30/*
39 * This returns the high 64 bits of the product of two 64-bit numbers. 31 * This returns the high 64 bits of the product of two 64-bit numbers.
40 */ 32 */
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
new file mode 100644
index 000000000000..c0fcd29918ce
--- /dev/null
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -0,0 +1,742 @@
1/*
2 * c 2001 PPC 64 Team, IBM Corp
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 *
9 * /dev/nvram driver for PPC64
10 *
11 * This perhaps should live in drivers/char
12 *
13 * TODO: Split the /dev/nvram part (that one can use
14 * drivers/char/generic_nvram.c) from the arch & partition
15 * parsing code.
16 */
17
18#include <linux/module.h>
19
20#include <linux/types.h>
21#include <linux/errno.h>
22#include <linux/fs.h>
23#include <linux/miscdevice.h>
24#include <linux/fcntl.h>
25#include <linux/nvram.h>
26#include <linux/init.h>
27#include <linux/slab.h>
28#include <linux/spinlock.h>
29#include <asm/uaccess.h>
30#include <asm/nvram.h>
31#include <asm/rtas.h>
32#include <asm/prom.h>
33#include <asm/machdep.h>
34
35#undef DEBUG_NVRAM
36
37static int nvram_scan_partitions(void);
38static int nvram_setup_partition(void);
39static int nvram_create_os_partition(void);
40static int nvram_remove_os_partition(void);
41
42static struct nvram_partition * nvram_part;
43static long nvram_error_log_index = -1;
44static long nvram_error_log_size = 0;
45
46int no_logging = 1; /* Until we initialize everything,
47 * make sure we don't try logging
48 * anything */
49
50extern volatile int error_log_cnt;
51
52struct err_log_info {
53 int error_type;
54 unsigned int seq_num;
55};
56
57static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin)
58{
59 int size;
60
61 if (ppc_md.nvram_size == NULL)
62 return -ENODEV;
63 size = ppc_md.nvram_size();
64
65 switch (origin) {
66 case 1:
67 offset += file->f_pos;
68 break;
69 case 2:
70 offset += size;
71 break;
72 }
73 if (offset < 0)
74 return -EINVAL;
75 file->f_pos = offset;
76 return file->f_pos;
77}
78
79
80static ssize_t dev_nvram_read(struct file *file, char __user *buf,
81 size_t count, loff_t *ppos)
82{
83 ssize_t len;
84 char *tmp_buffer;
85 int size;
86
87 if (ppc_md.nvram_size == NULL)
88 return -ENODEV;
89 size = ppc_md.nvram_size();
90
91 if (!access_ok(VERIFY_WRITE, buf, count))
92 return -EFAULT;
93 if (*ppos >= size)
94 return 0;
95 if (count > size)
96 count = size;
97
98 tmp_buffer = (char *) kmalloc(count, GFP_KERNEL);
99 if (!tmp_buffer) {
100 printk(KERN_ERR "dev_read_nvram: kmalloc failed\n");
101 return -ENOMEM;
102 }
103
104 len = ppc_md.nvram_read(tmp_buffer, count, ppos);
105 if ((long)len <= 0) {
106 kfree(tmp_buffer);
107 return len;
108 }
109
110 if (copy_to_user(buf, tmp_buffer, len)) {
111 kfree(tmp_buffer);
112 return -EFAULT;
113 }
114
115 kfree(tmp_buffer);
116 return len;
117
118}
119
120static ssize_t dev_nvram_write(struct file *file, const char __user *buf,
121 size_t count, loff_t *ppos)
122{
123 ssize_t len;
124 char * tmp_buffer;
125 int size;
126
127 if (ppc_md.nvram_size == NULL)
128 return -ENODEV;
129 size = ppc_md.nvram_size();
130
131 if (!access_ok(VERIFY_READ, buf, count))
132 return -EFAULT;
133 if (*ppos >= size)
134 return 0;
135 if (count > size)
136 count = size;
137
138 tmp_buffer = (char *) kmalloc(count, GFP_KERNEL);
139 if (!tmp_buffer) {
140 printk(KERN_ERR "dev_nvram_write: kmalloc failed\n");
141 return -ENOMEM;
142 }
143
144 if (copy_from_user(tmp_buffer, buf, count)) {
145 kfree(tmp_buffer);
146 return -EFAULT;
147 }
148
149 len = ppc_md.nvram_write(tmp_buffer, count, ppos);
150 if ((long)len <= 0) {
151 kfree(tmp_buffer);
152 return len;
153 }
154
155 kfree(tmp_buffer);
156 return len;
157}
158
159static int dev_nvram_ioctl(struct inode *inode, struct file *file,
160 unsigned int cmd, unsigned long arg)
161{
162 switch(cmd) {
163#ifdef CONFIG_PPC_PMAC
164 case OBSOLETE_PMAC_NVRAM_GET_OFFSET:
165 printk(KERN_WARNING "nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n");
166 case IOC_NVRAM_GET_OFFSET: {
167 int part, offset;
168
169 if (_machine != PLATFORM_POWERMAC)
170 return -EINVAL;
171 if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0)
172 return -EFAULT;
173 if (part < pmac_nvram_OF || part > pmac_nvram_NR)
174 return -EINVAL;
175 offset = pmac_get_partition(part);
176 if (offset < 0)
177 return offset;
178 if (copy_to_user((void __user*)arg, &offset, sizeof(offset)) != 0)
179 return -EFAULT;
180 return 0;
181 }
182#endif /* CONFIG_PPC_PMAC */
183 }
184 return -EINVAL;
185}
186
187struct file_operations nvram_fops = {
188 .owner = THIS_MODULE,
189 .llseek = dev_nvram_llseek,
190 .read = dev_nvram_read,
191 .write = dev_nvram_write,
192 .ioctl = dev_nvram_ioctl,
193};
194
195static struct miscdevice nvram_dev = {
196 NVRAM_MINOR,
197 "nvram",
198 &nvram_fops
199};
200
201
202#ifdef DEBUG_NVRAM
203static void nvram_print_partitions(char * label)
204{
205 struct list_head * p;
206 struct nvram_partition * tmp_part;
207
208 printk(KERN_WARNING "--------%s---------\n", label);
209 printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n");
210 list_for_each(p, &nvram_part->partition) {
211 tmp_part = list_entry(p, struct nvram_partition, partition);
212 printk(KERN_WARNING "%d \t%02x\t%02x\t%d\t%s\n",
213 tmp_part->index, tmp_part->header.signature,
214 tmp_part->header.checksum, tmp_part->header.length,
215 tmp_part->header.name);
216 }
217}
218#endif
219
220
221static int nvram_write_header(struct nvram_partition * part)
222{
223 loff_t tmp_index;
224 int rc;
225
226 tmp_index = part->index;
227 rc = ppc_md.nvram_write((char *)&part->header, NVRAM_HEADER_LEN, &tmp_index);
228
229 return rc;
230}
231
232
233static unsigned char nvram_checksum(struct nvram_header *p)
234{
235 unsigned int c_sum, c_sum2;
236 unsigned short *sp = (unsigned short *)p->name; /* assume 6 shorts */
237 c_sum = p->signature + p->length + sp[0] + sp[1] + sp[2] + sp[3] + sp[4] + sp[5];
238
239 /* The sum may have spilled into the 3rd byte. Fold it back. */
240 c_sum = ((c_sum & 0xffff) + (c_sum >> 16)) & 0xffff;
241 /* The sum cannot exceed 2 bytes. Fold it into a checksum */
242 c_sum2 = (c_sum >> 8) + (c_sum << 8);
243 c_sum = ((c_sum + c_sum2) >> 8) & 0xff;
244 return c_sum;
245}
246
247
248/*
249 * Find an nvram partition, sig can be 0 for any
250 * partition or name can be NULL for any name, else
251 * tries to match both
252 */
253struct nvram_partition *nvram_find_partition(int sig, const char *name)
254{
255 struct nvram_partition * part;
256 struct list_head * p;
257
258 list_for_each(p, &nvram_part->partition) {
259 part = list_entry(p, struct nvram_partition, partition);
260
261 if (sig && part->header.signature != sig)
262 continue;
263 if (name && 0 != strncmp(name, part->header.name, 12))
264 continue;
265 return part;
266 }
267 return NULL;
268}
269EXPORT_SYMBOL(nvram_find_partition);
270
271
272static int nvram_remove_os_partition(void)
273{
274 struct list_head *i;
275 struct list_head *j;
276 struct nvram_partition * part;
277 struct nvram_partition * cur_part;
278 int rc;
279
280 list_for_each(i, &nvram_part->partition) {
281 part = list_entry(i, struct nvram_partition, partition);
282 if (part->header.signature != NVRAM_SIG_OS)
283 continue;
284
285 /* Make os partition a free partition */
286 part->header.signature = NVRAM_SIG_FREE;
287 sprintf(part->header.name, "wwwwwwwwwwww");
288 part->header.checksum = nvram_checksum(&part->header);
289
290 /* Merge contiguous free partitions backwards */
291 list_for_each_prev(j, &part->partition) {
292 cur_part = list_entry(j, struct nvram_partition, partition);
293 if (cur_part == nvram_part || cur_part->header.signature != NVRAM_SIG_FREE) {
294 break;
295 }
296
297 part->header.length += cur_part->header.length;
298 part->header.checksum = nvram_checksum(&part->header);
299 part->index = cur_part->index;
300
301 list_del(&cur_part->partition);
302 kfree(cur_part);
303 j = &part->partition; /* fixup our loop */
304 }
305
306 /* Merge contiguous free partitions forwards */
307 list_for_each(j, &part->partition) {
308 cur_part = list_entry(j, struct nvram_partition, partition);
309 if (cur_part == nvram_part || cur_part->header.signature != NVRAM_SIG_FREE) {
310 break;
311 }
312
313 part->header.length += cur_part->header.length;
314 part->header.checksum = nvram_checksum(&part->header);
315
316 list_del(&cur_part->partition);
317 kfree(cur_part);
318 j = &part->partition; /* fixup our loop */
319 }
320
321 rc = nvram_write_header(part);
322 if (rc <= 0) {
323 printk(KERN_ERR "nvram_remove_os_partition: nvram_write failed (%d)\n", rc);
324 return rc;
325 }
326
327 }
328
329 return 0;
330}
331
332/* nvram_create_os_partition
333 *
334 * Create a OS linux partition to buffer error logs.
335 * Will create a partition starting at the first free
336 * space found if space has enough room.
337 */
338static int nvram_create_os_partition(void)
339{
340 struct nvram_partition *part;
341 struct nvram_partition *new_part;
342 struct nvram_partition *free_part = NULL;
343 int seq_init[2] = { 0, 0 };
344 loff_t tmp_index;
345 long size = 0;
346 int rc;
347
348 /* Find a free partition that will give us the maximum needed size
349 If can't find one that will give us the minimum size needed */
350 list_for_each_entry(part, &nvram_part->partition, partition) {
351 if (part->header.signature != NVRAM_SIG_FREE)
352 continue;
353
354 if (part->header.length >= NVRAM_MAX_REQ) {
355 size = NVRAM_MAX_REQ;
356 free_part = part;
357 break;
358 }
359 if (!size && part->header.length >= NVRAM_MIN_REQ) {
360 size = NVRAM_MIN_REQ;
361 free_part = part;
362 }
363 }
364 if (!size)
365 return -ENOSPC;
366
367 /* Create our OS partition */
368 new_part = kmalloc(sizeof(*new_part), GFP_KERNEL);
369 if (!new_part) {
370 printk(KERN_ERR "nvram_create_os_partition: kmalloc failed\n");
371 return -ENOMEM;
372 }
373
374 new_part->index = free_part->index;
375 new_part->header.signature = NVRAM_SIG_OS;
376 new_part->header.length = size;
377 strcpy(new_part->header.name, "ppc64,linux");
378 new_part->header.checksum = nvram_checksum(&new_part->header);
379
380 rc = nvram_write_header(new_part);
381 if (rc <= 0) {
382 printk(KERN_ERR "nvram_create_os_partition: nvram_write_header \
383 failed (%d)\n", rc);
384 return rc;
385 }
386
387 /* make sure and initialize to zero the sequence number and the error
388 type logged */
389 tmp_index = new_part->index + NVRAM_HEADER_LEN;
390 rc = ppc_md.nvram_write((char *)&seq_init, sizeof(seq_init), &tmp_index);
391 if (rc <= 0) {
392 printk(KERN_ERR "nvram_create_os_partition: nvram_write "
393 "failed (%d)\n", rc);
394 return rc;
395 }
396
397 nvram_error_log_index = new_part->index + NVRAM_HEADER_LEN;
398 nvram_error_log_size = ((part->header.length - 1) *
399 NVRAM_BLOCK_LEN) - sizeof(struct err_log_info);
400
401 list_add_tail(&new_part->partition, &free_part->partition);
402
403 if (free_part->header.length <= size) {
404 list_del(&free_part->partition);
405 kfree(free_part);
406 return 0;
407 }
408
409 /* Adjust the partition we stole the space from */
410 free_part->index += size * NVRAM_BLOCK_LEN;
411 free_part->header.length -= size;
412 free_part->header.checksum = nvram_checksum(&free_part->header);
413
414 rc = nvram_write_header(free_part);
415 if (rc <= 0) {
416 printk(KERN_ERR "nvram_create_os_partition: nvram_write_header "
417 "failed (%d)\n", rc);
418 return rc;
419 }
420
421 return 0;
422}
423
424
425/* nvram_setup_partition
426 *
427 * This will setup the partition we need for buffering the
428 * error logs and cleanup partitions if needed.
429 *
430 * The general strategy is the following:
431 * 1.) If there is ppc64,linux partition large enough then use it.
432 * 2.) If there is not a ppc64,linux partition large enough, search
433 * for a free partition that is large enough.
434 * 3.) If there is not a free partition large enough remove
435 * _all_ OS partitions and consolidate the space.
436 * 4.) Will first try getting a chunk that will satisfy the maximum
437 * error log size (NVRAM_MAX_REQ).
438 * 5.) If the max chunk cannot be allocated then try finding a chunk
439 * that will satisfy the minum needed (NVRAM_MIN_REQ).
440 */
441static int nvram_setup_partition(void)
442{
443 struct list_head * p;
444 struct nvram_partition * part;
445 int rc;
446
447 /* For now, we don't do any of this on pmac, until I
448 * have figured out if it's worth killing some unused stuffs
449 * in our nvram, as Apple defined partitions use pretty much
450 * all of the space
451 */
452 if (_machine == PLATFORM_POWERMAC)
453 return -ENOSPC;
454
455 /* see if we have an OS partition that meets our needs.
456 will try getting the max we need. If not we'll delete
457 partitions and try again. */
458 list_for_each(p, &nvram_part->partition) {
459 part = list_entry(p, struct nvram_partition, partition);
460 if (part->header.signature != NVRAM_SIG_OS)
461 continue;
462
463 if (strcmp(part->header.name, "ppc64,linux"))
464 continue;
465
466 if (part->header.length >= NVRAM_MIN_REQ) {
467 /* found our partition */
468 nvram_error_log_index = part->index + NVRAM_HEADER_LEN;
469 nvram_error_log_size = ((part->header.length - 1) *
470 NVRAM_BLOCK_LEN) - sizeof(struct err_log_info);
471 return 0;
472 }
473 }
474
475 /* try creating a partition with the free space we have */
476 rc = nvram_create_os_partition();
477 if (!rc) {
478 return 0;
479 }
480
481 /* need to free up some space */
482 rc = nvram_remove_os_partition();
483 if (rc) {
484 return rc;
485 }
486
487 /* create a partition in this new space */
488 rc = nvram_create_os_partition();
489 if (rc) {
490 printk(KERN_ERR "nvram_create_os_partition: Could not find a "
491 "NVRAM partition large enough\n");
492 return rc;
493 }
494
495 return 0;
496}
497
498
499static int nvram_scan_partitions(void)
500{
501 loff_t cur_index = 0;
502 struct nvram_header phead;
503 struct nvram_partition * tmp_part;
504 unsigned char c_sum;
505 char * header;
506 int total_size;
507 int err;
508
509 if (ppc_md.nvram_size == NULL)
510 return -ENODEV;
511 total_size = ppc_md.nvram_size();
512
513 header = (char *) kmalloc(NVRAM_HEADER_LEN, GFP_KERNEL);
514 if (!header) {
515 printk(KERN_ERR "nvram_scan_partitions: Failed kmalloc\n");
516 return -ENOMEM;
517 }
518
519 while (cur_index < total_size) {
520
521 err = ppc_md.nvram_read(header, NVRAM_HEADER_LEN, &cur_index);
522 if (err != NVRAM_HEADER_LEN) {
523 printk(KERN_ERR "nvram_scan_partitions: Error parsing "
524 "nvram partitions\n");
525 goto out;
526 }
527
528 cur_index -= NVRAM_HEADER_LEN; /* nvram_read will advance us */
529
530 memcpy(&phead, header, NVRAM_HEADER_LEN);
531
532 err = 0;
533 c_sum = nvram_checksum(&phead);
534 if (c_sum != phead.checksum) {
535 printk(KERN_WARNING "WARNING: nvram partition checksum"
536 " was %02x, should be %02x!\n",
537 phead.checksum, c_sum);
538 printk(KERN_WARNING "Terminating nvram partition scan\n");
539 goto out;
540 }
541 if (!phead.length) {
542 printk(KERN_WARNING "WARNING: nvram corruption "
543 "detected: 0-length partition\n");
544 goto out;
545 }
546 tmp_part = (struct nvram_partition *)
547 kmalloc(sizeof(struct nvram_partition), GFP_KERNEL);
548 err = -ENOMEM;
549 if (!tmp_part) {
550 printk(KERN_ERR "nvram_scan_partitions: kmalloc failed\n");
551 goto out;
552 }
553
554 memcpy(&tmp_part->header, &phead, NVRAM_HEADER_LEN);
555 tmp_part->index = cur_index;
556 list_add_tail(&tmp_part->partition, &nvram_part->partition);
557
558 cur_index += phead.length * NVRAM_BLOCK_LEN;
559 }
560 err = 0;
561
562 out:
563 kfree(header);
564 return err;
565}
566
567static int __init nvram_init(void)
568{
569 int error;
570 int rc;
571
572 if (ppc_md.nvram_size == NULL || ppc_md.nvram_size() <= 0)
573 return -ENODEV;
574
575 rc = misc_register(&nvram_dev);
576 if (rc != 0) {
577 printk(KERN_ERR "nvram_init: failed to register device\n");
578 return rc;
579 }
580
581 /* initialize our anchor for the nvram partition list */
582 nvram_part = (struct nvram_partition *) kmalloc(sizeof(struct nvram_partition), GFP_KERNEL);
583 if (!nvram_part) {
584 printk(KERN_ERR "nvram_init: Failed kmalloc\n");
585 return -ENOMEM;
586 }
587 INIT_LIST_HEAD(&nvram_part->partition);
588
589 /* Get all the NVRAM partitions */
590 error = nvram_scan_partitions();
591 if (error) {
592 printk(KERN_ERR "nvram_init: Failed nvram_scan_partitions\n");
593 return error;
594 }
595
596 if(nvram_setup_partition())
597 printk(KERN_WARNING "nvram_init: Could not find nvram partition"
598 " for nvram buffered error logging.\n");
599
600#ifdef DEBUG_NVRAM
601 nvram_print_partitions("NVRAM Partitions");
602#endif
603
604 return rc;
605}
606
607void __exit nvram_cleanup(void)
608{
609 misc_deregister( &nvram_dev );
610}
611
612
613#ifdef CONFIG_PPC_PSERIES
614
615/* nvram_write_error_log
616 *
617 * We need to buffer the error logs into nvram to ensure that we have
618 * the failure information to decode. If we have a severe error there
619 * is no way to guarantee that the OS or the machine is in a state to
620 * get back to user land and write the error to disk. For example if
621 * the SCSI device driver causes a Machine Check by writing to a bad
622 * IO address, there is no way of guaranteeing that the device driver
623 * is in any state that is would also be able to write the error data
624 * captured to disk, thus we buffer it in NVRAM for analysis on the
625 * next boot.
626 *
627 * In NVRAM the partition containing the error log buffer will looks like:
628 * Header (in bytes):
629 * +-----------+----------+--------+------------+------------------+
630 * | signature | checksum | length | name | data |
631 * |0 |1 |2 3|4 15|16 length-1|
632 * +-----------+----------+--------+------------+------------------+
633 *
634 * The 'data' section would look like (in bytes):
635 * +--------------+------------+-----------------------------------+
636 * | event_logged | sequence # | error log |
637 * |0 3|4 7|8 nvram_error_log_size-1|
638 * +--------------+------------+-----------------------------------+
639 *
640 * event_logged: 0 if event has not been logged to syslog, 1 if it has
641 * sequence #: The unique sequence # for each event. (until it wraps)
642 * error log: The error log from event_scan
643 */
644int nvram_write_error_log(char * buff, int length, unsigned int err_type)
645{
646 int rc;
647 loff_t tmp_index;
648 struct err_log_info info;
649
650 if (no_logging) {
651 return -EPERM;
652 }
653
654 if (nvram_error_log_index == -1) {
655 return -ESPIPE;
656 }
657
658 if (length > nvram_error_log_size) {
659 length = nvram_error_log_size;
660 }
661
662 info.error_type = err_type;
663 info.seq_num = error_log_cnt;
664
665 tmp_index = nvram_error_log_index;
666
667 rc = ppc_md.nvram_write((char *)&info, sizeof(struct err_log_info), &tmp_index);
668 if (rc <= 0) {
669 printk(KERN_ERR "nvram_write_error_log: Failed nvram_write (%d)\n", rc);
670 return rc;
671 }
672
673 rc = ppc_md.nvram_write(buff, length, &tmp_index);
674 if (rc <= 0) {
675 printk(KERN_ERR "nvram_write_error_log: Failed nvram_write (%d)\n", rc);
676 return rc;
677 }
678
679 return 0;
680}
681
682/* nvram_read_error_log
683 *
684 * Reads nvram for error log for at most 'length'
685 */
686int nvram_read_error_log(char * buff, int length, unsigned int * err_type)
687{
688 int rc;
689 loff_t tmp_index;
690 struct err_log_info info;
691
692 if (nvram_error_log_index == -1)
693 return -1;
694
695 if (length > nvram_error_log_size)
696 length = nvram_error_log_size;
697
698 tmp_index = nvram_error_log_index;
699
700 rc = ppc_md.nvram_read((char *)&info, sizeof(struct err_log_info), &tmp_index);
701 if (rc <= 0) {
702 printk(KERN_ERR "nvram_read_error_log: Failed nvram_read (%d)\n", rc);
703 return rc;
704 }
705
706 rc = ppc_md.nvram_read(buff, length, &tmp_index);
707 if (rc <= 0) {
708 printk(KERN_ERR "nvram_read_error_log: Failed nvram_read (%d)\n", rc);
709 return rc;
710 }
711
712 error_log_cnt = info.seq_num;
713 *err_type = info.error_type;
714
715 return 0;
716}
717
718/* This doesn't actually zero anything, but it sets the event_logged
719 * word to tell that this event is safely in syslog.
720 */
721int nvram_clear_error_log(void)
722{
723 loff_t tmp_index;
724 int clear_word = ERR_FLAG_ALREADY_LOGGED;
725 int rc;
726
727 tmp_index = nvram_error_log_index;
728
729 rc = ppc_md.nvram_write((char *)&clear_word, sizeof(int), &tmp_index);
730 if (rc <= 0) {
731 printk(KERN_ERR "nvram_clear_error_log: Failed nvram_write (%d)\n", rc);
732 return rc;
733 }
734
735 return 0;
736}
737
738#endif /* CONFIG_PPC_PSERIES */
739
740module_init(nvram_init);
741module_exit(nvram_cleanup);
742MODULE_LICENSE("GPL");
diff --git a/arch/powerpc/kernel/rtas-rtc.c b/arch/powerpc/kernel/rtas-rtc.c
index 7b948662704c..635d3b9a8811 100644
--- a/arch/powerpc/kernel/rtas-rtc.c
+++ b/arch/powerpc/kernel/rtas-rtc.c
@@ -15,7 +15,7 @@ unsigned long __init rtas_get_boot_time(void)
15{ 15{
16 int ret[8]; 16 int ret[8];
17 int error, wait_time; 17 int error, wait_time;
18 unsigned long max_wait_tb; 18 u64 max_wait_tb;
19 19
20 max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; 20 max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
21 do { 21 do {
@@ -45,7 +45,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
45{ 45{
46 int ret[8]; 46 int ret[8];
47 int error, wait_time; 47 int error, wait_time;
48 unsigned long max_wait_tb; 48 u64 max_wait_tb;
49 49
50 max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; 50 max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
51 do { 51 do {
@@ -80,7 +80,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
80int rtas_set_rtc_time(struct rtc_time *tm) 80int rtas_set_rtc_time(struct rtc_time *tm)
81{ 81{
82 int error, wait_time; 82 int error, wait_time;
83 unsigned long max_wait_tb; 83 u64 max_wait_tb;
84 84
85 max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT; 85 max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
86 do { 86 do {
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 070b4b458aaf..de8479769bb7 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -130,6 +130,34 @@ unsigned long tb_last_stamp;
130 */ 130 */
131DEFINE_PER_CPU(unsigned long, last_jiffy); 131DEFINE_PER_CPU(unsigned long, last_jiffy);
132 132
133void __delay(unsigned long loops)
134{
135 unsigned long start;
136 int diff;
137
138 if (__USE_RTC()) {
139 start = get_rtcl();
140 do {
141 /* the RTCL register wraps at 1000000000 */
142 diff = get_rtcl() - start;
143 if (diff < 0)
144 diff += 1000000000;
145 } while (diff < loops);
146 } else {
147 start = get_tbl();
148 while (get_tbl() - start < loops)
149 HMT_low();
150 HMT_medium();
151 }
152}
153EXPORT_SYMBOL(__delay);
154
155void udelay(unsigned long usecs)
156{
157 __delay(tb_ticks_per_usec * usecs);
158}
159EXPORT_SYMBOL(udelay);
160
133static __inline__ void timer_check_rtc(void) 161static __inline__ void timer_check_rtc(void)
134{ 162{
135 /* 163 /*
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c
index 4099ddab9205..dda5f2c72c25 100644
--- a/arch/powerpc/platforms/chrp/setup.c
+++ b/arch/powerpc/platforms/chrp/setup.c
@@ -257,6 +257,13 @@ void __init chrp_setup_arch(void)
257 if (rtas_token("display-character") >= 0) 257 if (rtas_token("display-character") >= 0)
258 ppc_md.progress = rtas_progress; 258 ppc_md.progress = rtas_progress;
259 259
260 /* use RTAS time-of-day routines if available */
261 if (rtas_token("get-time-of-day") != RTAS_UNKNOWN_SERVICE) {
262 ppc_md.get_boot_time = rtas_get_boot_time;
263 ppc_md.get_rtc_time = rtas_get_rtc_time;
264 ppc_md.set_rtc_time = rtas_set_rtc_time;
265 }
266
260#ifdef CONFIG_BOOTX_TEXT 267#ifdef CONFIG_BOOTX_TEXT
261 if (ppc_md.progress == NULL && boot_text_mapped) 268 if (ppc_md.progress == NULL && boot_text_mapped)
262 ppc_md.progress = btext_progress; 269 ppc_md.progress = btext_progress;
@@ -505,9 +512,11 @@ void __init chrp_init(void)
505 ppc_md.halt = rtas_halt; 512 ppc_md.halt = rtas_halt;
506 513
507 ppc_md.time_init = chrp_time_init; 514 ppc_md.time_init = chrp_time_init;
515 ppc_md.calibrate_decr = chrp_calibrate_decr;
516
517 /* this may get overridden with rtas routines later... */
508 ppc_md.set_rtc_time = chrp_set_rtc_time; 518 ppc_md.set_rtc_time = chrp_set_rtc_time;
509 ppc_md.get_rtc_time = chrp_get_rtc_time; 519 ppc_md.get_rtc_time = chrp_get_rtc_time;
510 ppc_md.calibrate_decr = chrp_calibrate_decr;
511 520
512#ifdef CONFIG_SMP 521#ifdef CONFIG_SMP
513 smp_ops = &chrp_smp_ops; 522 smp_ops = &chrp_smp_ops;
diff --git a/arch/powerpc/platforms/chrp/smp.c b/arch/powerpc/platforms/chrp/smp.c
index bb2315997d45..b616053bc331 100644
--- a/arch/powerpc/platforms/chrp/smp.c
+++ b/arch/powerpc/platforms/chrp/smp.c
@@ -34,6 +34,7 @@
34#include <asm/machdep.h> 34#include <asm/machdep.h>
35#include <asm/smp.h> 35#include <asm/smp.h>
36#include <asm/mpic.h> 36#include <asm/mpic.h>
37#include <asm/rtas.h>
37 38
38static void __devinit smp_chrp_kick_cpu(int nr) 39static void __devinit smp_chrp_kick_cpu(int nr)
39{ 40{
diff --git a/arch/powerpc/platforms/chrp/time.c b/arch/powerpc/platforms/chrp/time.c
index 9e53535ddb82..737ee5d9f0aa 100644
--- a/arch/powerpc/platforms/chrp/time.c
+++ b/arch/powerpc/platforms/chrp/time.c
@@ -87,7 +87,6 @@ int chrp_set_rtc_time(struct rtc_time *tmarg)
87 87
88 chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); 88 chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
89 89
90 tm.tm_year -= 1900;
91 if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { 90 if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
92 BIN_TO_BCD(tm.tm_sec); 91 BIN_TO_BCD(tm.tm_sec);
93 BIN_TO_BCD(tm.tm_min); 92 BIN_TO_BCD(tm.tm_min);
@@ -156,7 +155,7 @@ void chrp_get_rtc_time(struct rtc_time *tm)
156 BCD_TO_BIN(mon); 155 BCD_TO_BIN(mon);
157 BCD_TO_BIN(year); 156 BCD_TO_BIN(year);
158 } 157 }
159 if ((year += 1900) < 1970) 158 if (year < 70)
160 year += 100; 159 year += 100;
161 tm->tm_sec = sec; 160 tm->tm_sec = sec;
162 tm->tm_min = min; 161 tm->tm_min = min;
diff --git a/arch/powerpc/platforms/maple/time.c b/arch/powerpc/platforms/maple/time.c
index 40fc07a8e606..15846cc938ac 100644
--- a/arch/powerpc/platforms/maple/time.c
+++ b/arch/powerpc/platforms/maple/time.c
@@ -158,6 +158,11 @@ int maple_set_rtc_time(struct rtc_time *tm)
158 return 0; 158 return 0;
159} 159}
160 160
161static struct resource rtc_iores = {
162 .name = "rtc",
163 .flags = IORESOURCE_BUSY,
164};
165
161unsigned long __init maple_get_boot_time(void) 166unsigned long __init maple_get_boot_time(void)
162{ 167{
163 struct rtc_time tm; 168 struct rtc_time tm;
@@ -172,7 +177,11 @@ unsigned long __init maple_get_boot_time(void)
172 printk(KERN_INFO "Maple: No device node for RTC, assuming " 177 printk(KERN_INFO "Maple: No device node for RTC, assuming "
173 "legacy address (0x%x)\n", maple_rtc_addr); 178 "legacy address (0x%x)\n", maple_rtc_addr);
174 } 179 }
175 180
181 rtc_iores.start = maple_rtc_addr;
182 rtc_iores.end = maple_rtc_addr + 7;
183 request_resource(&ioport_resource, &rtc_iores);
184
176 maple_get_rtc_time(&tm); 185 maple_get_rtc_time(&tm);
177 return mktime(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, 186 return mktime(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
178 tm.tm_hour, tm.tm_min, tm.tm_sec); 187 tm.tm_hour, tm.tm_min, tm.tm_sec);
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c
index 79de2310e70b..c8d2a40dc5b4 100644
--- a/arch/powerpc/platforms/pseries/eeh.c
+++ b/arch/powerpc/platforms/pseries/eeh.c
@@ -86,7 +86,8 @@ static int ibm_read_slot_reset_state;
86static int ibm_read_slot_reset_state2; 86static int ibm_read_slot_reset_state2;
87static int ibm_slot_error_detail; 87static int ibm_slot_error_detail;
88 88
89static int eeh_subsystem_enabled; 89int eeh_subsystem_enabled;
90EXPORT_SYMBOL(eeh_subsystem_enabled);
90 91
91/* Lock to avoid races due to multiple reports of an error */ 92/* Lock to avoid races due to multiple reports of an error */
92static DEFINE_SPINLOCK(confirm_error_lock); 93static DEFINE_SPINLOCK(confirm_error_lock);
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index b9d9732b2e06..4a465f067ede 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -504,7 +504,7 @@ static void pseries_dedicated_idle(void)
504 lpaca->lppaca.idle = 1; 504 lpaca->lppaca.idle = 1;
505 505
506 if (!need_resched()) { 506 if (!need_resched()) {
507 start_snooze = __get_tb() + 507 start_snooze = get_tb() +
508 *smt_snooze_delay * tb_ticks_per_usec; 508 *smt_snooze_delay * tb_ticks_per_usec;
509 509
510 while (!need_resched() && !cpu_is_offline(cpu)) { 510 while (!need_resched() && !cpu_is_offline(cpu)) {
@@ -518,7 +518,7 @@ static void pseries_dedicated_idle(void)
518 HMT_very_low(); 518 HMT_very_low();
519 519
520 if (*smt_snooze_delay != 0 && 520 if (*smt_snooze_delay != 0 &&
521 __get_tb() > start_snooze) { 521 get_tb() > start_snooze) {
522 HMT_medium(); 522 HMT_medium();
523 dedicated_idle_sleep(cpu); 523 dedicated_idle_sleep(cpu);
524 } 524 }