diff options
35 files changed, 1187 insertions, 1412 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 9a541486fb7e..5fbe07706ae9 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1154,6 +1154,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1154 | 1154 | ||
1155 | nointroute [IA-64] | 1155 | nointroute [IA-64] |
1156 | 1156 | ||
1157 | nojitter [IA64] Disables jitter checking for ITC timers. | ||
1158 | |||
1157 | nolapic [IA-32,APIC] Do not enable or use the local APIC. | 1159 | nolapic [IA-32,APIC] Do not enable or use the local APIC. |
1158 | 1160 | ||
1159 | nolapic_timer [IA-32,APIC] Do not use the local APIC timer. | 1161 | nolapic_timer [IA-32,APIC] Do not use the local APIC timer. |
@@ -1885,6 +1887,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1885 | vdso=1: enable VDSO (default) | 1887 | vdso=1: enable VDSO (default) |
1886 | vdso=0: disable VDSO mapping | 1888 | vdso=0: disable VDSO mapping |
1887 | 1889 | ||
1890 | vector= [IA-64,SMP] | ||
1891 | vector=percpu: enable percpu vector domain | ||
1892 | |||
1888 | video= [FB] Frame buffer configuration | 1893 | video= [FB] Frame buffer configuration |
1889 | See Documentation/fb/modedb.txt. | 1894 | See Documentation/fb/modedb.txt. |
1890 | 1895 | ||
diff --git a/Documentation/time_interpolators.txt b/Documentation/time_interpolators.txt deleted file mode 100644 index e3b60854fbc2..000000000000 --- a/Documentation/time_interpolators.txt +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | Time Interpolators | ||
2 | ------------------ | ||
3 | |||
4 | Time interpolators are a base of time calculation between timer ticks and | ||
5 | allow an accurate determination of time down to the accuracy of the time | ||
6 | source in nanoseconds. | ||
7 | |||
8 | The architecture specific code typically provides gettimeofday and | ||
9 | settimeofday under Linux. The time interpolator provides both if an arch | ||
10 | defines CONFIG_TIME_INTERPOLATION. The arch still must set up timer tick | ||
11 | operations and call the necessary functions to advance the clock. | ||
12 | |||
13 | With the time interpolator a standardized interface exists for time | ||
14 | interpolation between ticks. The provided logic is highly scalable | ||
15 | and has been tested in SMP situations of up to 512 CPUs. | ||
16 | |||
17 | If CONFIG_TIME_INTERPOLATION is defined then the architecture specific code | ||
18 | (or the device drivers - like HPET) may register time interpolators. | ||
19 | These are typically defined in the following way: | ||
20 | |||
21 | static struct time_interpolator my_interpolator { | ||
22 | .frequency = MY_FREQUENCY, | ||
23 | .source = TIME_SOURCE_MMIO32, | ||
24 | .shift = 8, /* scaling for higher accuracy */ | ||
25 | .drift = -1, /* Unknown drift */ | ||
26 | .jitter = 0 /* time source is stable */ | ||
27 | }; | ||
28 | |||
29 | void time_init(void) | ||
30 | { | ||
31 | .... | ||
32 | /* Initialization of the timer *. | ||
33 | my_interpolator.address = &my_timer; | ||
34 | register_time_interpolator(&my_interpolator); | ||
35 | .... | ||
36 | } | ||
37 | |||
38 | For more details see include/linux/timex.h and kernel/timer.c. | ||
39 | |||
40 | Christoph Lameter <christoph@lameter.com>, October 31, 2004 | ||
41 | |||
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 616c96e73483..36c7b9682aa6 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -62,7 +62,11 @@ config GENERIC_CALIBRATE_DELAY | |||
62 | bool | 62 | bool |
63 | default y | 63 | default y |
64 | 64 | ||
65 | config TIME_INTERPOLATION | 65 | config GENERIC_TIME |
66 | bool | ||
67 | default y | ||
68 | |||
69 | config GENERIC_TIME_VSYSCALL | ||
66 | bool | 70 | bool |
67 | default y | 71 | default y |
68 | 72 | ||
diff --git a/arch/ia64/configs/bigsur_defconfig b/arch/ia64/configs/bigsur_defconfig index 90e9c2e61bf4..9eb48c0927b0 100644 --- a/arch/ia64/configs/bigsur_defconfig +++ b/arch/ia64/configs/bigsur_defconfig | |||
@@ -85,7 +85,7 @@ CONFIG_MMU=y | |||
85 | CONFIG_SWIOTLB=y | 85 | CONFIG_SWIOTLB=y |
86 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 86 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
87 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 87 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
88 | CONFIG_TIME_INTERPOLATION=y | 88 | CONFIG_GENERIC_TIME=y |
89 | CONFIG_EFI=y | 89 | CONFIG_EFI=y |
90 | CONFIG_GENERIC_IOMAP=y | 90 | CONFIG_GENERIC_IOMAP=y |
91 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | 91 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y |
diff --git a/arch/ia64/configs/gensparse_defconfig b/arch/ia64/configs/gensparse_defconfig index 0d29aa2066b3..3a9ed951db08 100644 --- a/arch/ia64/configs/gensparse_defconfig +++ b/arch/ia64/configs/gensparse_defconfig | |||
@@ -86,7 +86,7 @@ CONFIG_MMU=y | |||
86 | CONFIG_SWIOTLB=y | 86 | CONFIG_SWIOTLB=y |
87 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 87 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
88 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 88 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
89 | CONFIG_TIME_INTERPOLATION=y | 89 | CONFIG_GENERIC_TIME=y |
90 | CONFIG_EFI=y | 90 | CONFIG_EFI=y |
91 | CONFIG_GENERIC_IOMAP=y | 91 | CONFIG_GENERIC_IOMAP=y |
92 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | 92 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y |
diff --git a/arch/ia64/configs/sim_defconfig b/arch/ia64/configs/sim_defconfig index d9146c31ea13..c420d9f3df98 100644 --- a/arch/ia64/configs/sim_defconfig +++ b/arch/ia64/configs/sim_defconfig | |||
@@ -86,7 +86,7 @@ CONFIG_MMU=y | |||
86 | CONFIG_SWIOTLB=y | 86 | CONFIG_SWIOTLB=y |
87 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 87 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
88 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 88 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
89 | CONFIG_TIME_INTERPOLATION=y | 89 | CONFIG_GENERIC_TIME=y |
90 | CONFIG_EFI=y | 90 | CONFIG_EFI=y |
91 | CONFIG_GENERIC_IOMAP=y | 91 | CONFIG_GENERIC_IOMAP=y |
92 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | 92 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y |
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig index 64e951de4e57..4c9ffc47bc7a 100644 --- a/arch/ia64/configs/sn2_defconfig +++ b/arch/ia64/configs/sn2_defconfig | |||
@@ -93,7 +93,7 @@ CONFIG_SWIOTLB=y | |||
93 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 93 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
94 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 94 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
95 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 95 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
96 | CONFIG_TIME_INTERPOLATION=y | 96 | CONFIG_GENERIC_TIME=y |
97 | CONFIG_DMI=y | 97 | CONFIG_DMI=y |
98 | CONFIG_EFI=y | 98 | CONFIG_EFI=y |
99 | CONFIG_GENERIC_IOMAP=y | 99 | CONFIG_GENERIC_IOMAP=y |
diff --git a/arch/ia64/configs/tiger_defconfig b/arch/ia64/configs/tiger_defconfig index a1446931b401..3dbb3987df27 100644 --- a/arch/ia64/configs/tiger_defconfig +++ b/arch/ia64/configs/tiger_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.21-rc3 | 3 | # Linux kernel version: 2.6.22 |
4 | # Thu Mar 8 11:07:09 2007 | 4 | # Thu Jul 19 13:54:47 2007 |
5 | # | 5 | # |
6 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 6 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
7 | 7 | ||
@@ -19,15 +19,15 @@ CONFIG_LOCALVERSION="" | |||
19 | CONFIG_LOCALVERSION_AUTO=y | 19 | CONFIG_LOCALVERSION_AUTO=y |
20 | CONFIG_SWAP=y | 20 | CONFIG_SWAP=y |
21 | CONFIG_SYSVIPC=y | 21 | CONFIG_SYSVIPC=y |
22 | # CONFIG_IPC_NS is not set | ||
23 | CONFIG_SYSVIPC_SYSCTL=y | 22 | CONFIG_SYSVIPC_SYSCTL=y |
24 | CONFIG_POSIX_MQUEUE=y | 23 | CONFIG_POSIX_MQUEUE=y |
25 | # CONFIG_BSD_PROCESS_ACCT is not set | 24 | # CONFIG_BSD_PROCESS_ACCT is not set |
26 | # CONFIG_TASKSTATS is not set | 25 | # CONFIG_TASKSTATS is not set |
27 | # CONFIG_UTS_NS is not set | 26 | # CONFIG_USER_NS is not set |
28 | # CONFIG_AUDIT is not set | 27 | # CONFIG_AUDIT is not set |
29 | CONFIG_IKCONFIG=y | 28 | CONFIG_IKCONFIG=y |
30 | CONFIG_IKCONFIG_PROC=y | 29 | CONFIG_IKCONFIG_PROC=y |
30 | CONFIG_LOG_BUF_SHIFT=20 | ||
31 | # CONFIG_CPUSETS is not set | 31 | # CONFIG_CPUSETS is not set |
32 | CONFIG_SYSFS_DEPRECATED=y | 32 | CONFIG_SYSFS_DEPRECATED=y |
33 | # CONFIG_RELAY is not set | 33 | # CONFIG_RELAY is not set |
@@ -46,18 +46,19 @@ CONFIG_BUG=y | |||
46 | CONFIG_ELF_CORE=y | 46 | CONFIG_ELF_CORE=y |
47 | CONFIG_BASE_FULL=y | 47 | CONFIG_BASE_FULL=y |
48 | CONFIG_FUTEX=y | 48 | CONFIG_FUTEX=y |
49 | CONFIG_ANON_INODES=y | ||
49 | CONFIG_EPOLL=y | 50 | CONFIG_EPOLL=y |
51 | CONFIG_SIGNALFD=y | ||
52 | CONFIG_TIMERFD=y | ||
53 | CONFIG_EVENTFD=y | ||
50 | CONFIG_SHMEM=y | 54 | CONFIG_SHMEM=y |
51 | CONFIG_SLAB=y | ||
52 | CONFIG_VM_EVENT_COUNTERS=y | 55 | CONFIG_VM_EVENT_COUNTERS=y |
56 | CONFIG_SLAB=y | ||
57 | # CONFIG_SLUB is not set | ||
58 | # CONFIG_SLOB is not set | ||
53 | CONFIG_RT_MUTEXES=y | 59 | CONFIG_RT_MUTEXES=y |
54 | # CONFIG_TINY_SHMEM is not set | 60 | # CONFIG_TINY_SHMEM is not set |
55 | CONFIG_BASE_SMALL=0 | 61 | CONFIG_BASE_SMALL=0 |
56 | # CONFIG_SLOB is not set | ||
57 | |||
58 | # | ||
59 | # Loadable module support | ||
60 | # | ||
61 | CONFIG_MODULES=y | 62 | CONFIG_MODULES=y |
62 | CONFIG_MODULE_UNLOAD=y | 63 | CONFIG_MODULE_UNLOAD=y |
63 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 64 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
@@ -65,12 +66,9 @@ CONFIG_MODVERSIONS=y | |||
65 | CONFIG_MODULE_SRCVERSION_ALL=y | 66 | CONFIG_MODULE_SRCVERSION_ALL=y |
66 | CONFIG_KMOD=y | 67 | CONFIG_KMOD=y |
67 | CONFIG_STOP_MACHINE=y | 68 | CONFIG_STOP_MACHINE=y |
68 | |||
69 | # | ||
70 | # Block layer | ||
71 | # | ||
72 | CONFIG_BLOCK=y | 69 | CONFIG_BLOCK=y |
73 | # CONFIG_BLK_DEV_IO_TRACE is not set | 70 | # CONFIG_BLK_DEV_IO_TRACE is not set |
71 | # CONFIG_BLK_DEV_BSG is not set | ||
74 | 72 | ||
75 | # | 73 | # |
76 | # IO Schedulers | 74 | # IO Schedulers |
@@ -91,6 +89,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
91 | CONFIG_IA64=y | 89 | CONFIG_IA64=y |
92 | CONFIG_64BIT=y | 90 | CONFIG_64BIT=y |
93 | CONFIG_ZONE_DMA=y | 91 | CONFIG_ZONE_DMA=y |
92 | CONFIG_QUICKLIST=y | ||
94 | CONFIG_MMU=y | 93 | CONFIG_MMU=y |
95 | CONFIG_SWIOTLB=y | 94 | CONFIG_SWIOTLB=y |
96 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 95 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
@@ -98,7 +97,7 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y | |||
98 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 97 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
99 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 98 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
100 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 99 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
101 | CONFIG_TIME_INTERPOLATION=y | 100 | CONFIG_GENERIC_TIME=y |
102 | CONFIG_DMI=y | 101 | CONFIG_DMI=y |
103 | CONFIG_EFI=y | 102 | CONFIG_EFI=y |
104 | CONFIG_GENERIC_IOMAP=y | 103 | CONFIG_GENERIC_IOMAP=y |
@@ -114,8 +113,8 @@ CONFIG_IA64_DIG=y | |||
114 | CONFIG_MCKINLEY=y | 113 | CONFIG_MCKINLEY=y |
115 | # CONFIG_IA64_PAGE_SIZE_4KB is not set | 114 | # CONFIG_IA64_PAGE_SIZE_4KB is not set |
116 | # CONFIG_IA64_PAGE_SIZE_8KB is not set | 115 | # CONFIG_IA64_PAGE_SIZE_8KB is not set |
117 | CONFIG_IA64_PAGE_SIZE_16KB=y | 116 | # CONFIG_IA64_PAGE_SIZE_16KB is not set |
118 | # CONFIG_IA64_PAGE_SIZE_64KB is not set | 117 | CONFIG_IA64_PAGE_SIZE_64KB=y |
119 | CONFIG_PGTABLE_3=y | 118 | CONFIG_PGTABLE_3=y |
120 | # CONFIG_PGTABLE_4 is not set | 119 | # CONFIG_PGTABLE_4 is not set |
121 | # CONFIG_HZ_100 is not set | 120 | # CONFIG_HZ_100 is not set |
@@ -145,6 +144,9 @@ CONFIG_FLAT_NODE_MEM_MAP=y | |||
145 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 144 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
146 | CONFIG_RESOURCES_64BIT=y | 145 | CONFIG_RESOURCES_64BIT=y |
147 | CONFIG_ZONE_DMA_FLAG=1 | 146 | CONFIG_ZONE_DMA_FLAG=1 |
147 | CONFIG_BOUNCE=y | ||
148 | CONFIG_NR_QUICK=1 | ||
149 | CONFIG_VIRT_TO_BUS=y | ||
148 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | 150 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y |
149 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y | 151 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y |
150 | CONFIG_ARCH_FLATMEM_ENABLE=y | 152 | CONFIG_ARCH_FLATMEM_ENABLE=y |
@@ -152,11 +154,11 @@ CONFIG_ARCH_SPARSEMEM_ENABLE=y | |||
152 | CONFIG_ARCH_POPULATES_NODE_MAP=y | 154 | CONFIG_ARCH_POPULATES_NODE_MAP=y |
153 | CONFIG_VIRTUAL_MEM_MAP=y | 155 | CONFIG_VIRTUAL_MEM_MAP=y |
154 | CONFIG_HOLES_IN_ZONE=y | 156 | CONFIG_HOLES_IN_ZONE=y |
155 | CONFIG_IA32_SUPPORT=y | 157 | # CONFIG_IA32_SUPPORT is not set |
156 | CONFIG_COMPAT=y | ||
157 | CONFIG_IA64_MCA_RECOVERY=y | 158 | CONFIG_IA64_MCA_RECOVERY=y |
158 | CONFIG_PERFMON=y | 159 | CONFIG_PERFMON=y |
159 | CONFIG_IA64_PALINFO=y | 160 | CONFIG_IA64_PALINFO=y |
161 | # CONFIG_IA64_MC_ERR_INJECT is not set | ||
160 | # CONFIG_IA64_ESI is not set | 162 | # CONFIG_IA64_ESI is not set |
161 | CONFIG_KEXEC=y | 163 | CONFIG_KEXEC=y |
162 | # CONFIG_CRASH_DUMP is not set | 164 | # CONFIG_CRASH_DUMP is not set |
@@ -166,6 +168,7 @@ CONFIG_KEXEC=y | |||
166 | # | 168 | # |
167 | CONFIG_EFI_VARS=y | 169 | CONFIG_EFI_VARS=y |
168 | CONFIG_EFI_PCDP=y | 170 | CONFIG_EFI_PCDP=y |
171 | CONFIG_DMIID=y | ||
169 | CONFIG_BINFMT_ELF=y | 172 | CONFIG_BINFMT_ELF=y |
170 | CONFIG_BINFMT_MISC=m | 173 | CONFIG_BINFMT_MISC=m |
171 | 174 | ||
@@ -175,7 +178,6 @@ CONFIG_BINFMT_MISC=m | |||
175 | CONFIG_PM=y | 178 | CONFIG_PM=y |
176 | CONFIG_PM_LEGACY=y | 179 | CONFIG_PM_LEGACY=y |
177 | # CONFIG_PM_DEBUG is not set | 180 | # CONFIG_PM_DEBUG is not set |
178 | # CONFIG_PM_SYSFS_DEPRECATED is not set | ||
179 | 181 | ||
180 | # | 182 | # |
181 | # ACPI (Advanced Configuration and Power Interface) Support | 183 | # ACPI (Advanced Configuration and Power Interface) Support |
@@ -205,13 +207,11 @@ CONFIG_ACPI_CONTAINER=m | |||
205 | # | 207 | # |
206 | CONFIG_PCI=y | 208 | CONFIG_PCI=y |
207 | CONFIG_PCI_DOMAINS=y | 209 | CONFIG_PCI_DOMAINS=y |
210 | CONFIG_PCI_SYSCALL=y | ||
208 | # CONFIG_PCIEPORTBUS is not set | 211 | # CONFIG_PCIEPORTBUS is not set |
212 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
209 | # CONFIG_PCI_MSI is not set | 213 | # CONFIG_PCI_MSI is not set |
210 | # CONFIG_PCI_DEBUG is not set | 214 | # CONFIG_PCI_DEBUG is not set |
211 | |||
212 | # | ||
213 | # PCI Hotplug Support | ||
214 | # | ||
215 | CONFIG_HOTPLUG_PCI=m | 215 | CONFIG_HOTPLUG_PCI=m |
216 | # CONFIG_HOTPLUG_PCI_FAKE is not set | 216 | # CONFIG_HOTPLUG_PCI_FAKE is not set |
217 | CONFIG_HOTPLUG_PCI_ACPI=m | 217 | CONFIG_HOTPLUG_PCI_ACPI=m |
@@ -232,7 +232,6 @@ CONFIG_NET=y | |||
232 | # | 232 | # |
233 | # Networking options | 233 | # Networking options |
234 | # | 234 | # |
235 | # CONFIG_NETDEBUG is not set | ||
236 | CONFIG_PACKET=y | 235 | CONFIG_PACKET=y |
237 | # CONFIG_PACKET_MMAP is not set | 236 | # CONFIG_PACKET_MMAP is not set |
238 | CONFIG_UNIX=y | 237 | CONFIG_UNIX=y |
@@ -270,20 +269,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
270 | # CONFIG_INET6_TUNNEL is not set | 269 | # CONFIG_INET6_TUNNEL is not set |
271 | # CONFIG_NETWORK_SECMARK is not set | 270 | # CONFIG_NETWORK_SECMARK is not set |
272 | # CONFIG_NETFILTER is not set | 271 | # CONFIG_NETFILTER is not set |
273 | |||
274 | # | ||
275 | # DCCP Configuration (EXPERIMENTAL) | ||
276 | # | ||
277 | # CONFIG_IP_DCCP is not set | 272 | # CONFIG_IP_DCCP is not set |
278 | |||
279 | # | ||
280 | # SCTP Configuration (EXPERIMENTAL) | ||
281 | # | ||
282 | # CONFIG_IP_SCTP is not set | 273 | # CONFIG_IP_SCTP is not set |
283 | |||
284 | # | ||
285 | # TIPC Configuration (EXPERIMENTAL) | ||
286 | # | ||
287 | # CONFIG_TIPC is not set | 274 | # CONFIG_TIPC is not set |
288 | # CONFIG_ATM is not set | 275 | # CONFIG_ATM is not set |
289 | # CONFIG_BRIDGE is not set | 276 | # CONFIG_BRIDGE is not set |
@@ -309,7 +296,17 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
309 | # CONFIG_HAMRADIO is not set | 296 | # CONFIG_HAMRADIO is not set |
310 | # CONFIG_IRDA is not set | 297 | # CONFIG_IRDA is not set |
311 | # CONFIG_BT is not set | 298 | # CONFIG_BT is not set |
299 | # CONFIG_AF_RXRPC is not set | ||
300 | |||
301 | # | ||
302 | # Wireless | ||
303 | # | ||
304 | # CONFIG_CFG80211 is not set | ||
305 | # CONFIG_WIRELESS_EXT is not set | ||
306 | # CONFIG_MAC80211 is not set | ||
312 | # CONFIG_IEEE80211 is not set | 307 | # CONFIG_IEEE80211 is not set |
308 | # CONFIG_RFKILL is not set | ||
309 | # CONFIG_NET_9P is not set | ||
313 | 310 | ||
314 | # | 311 | # |
315 | # Device Drivers | 312 | # Device Drivers |
@@ -324,25 +321,9 @@ CONFIG_FW_LOADER=m | |||
324 | # CONFIG_DEBUG_DRIVER is not set | 321 | # CONFIG_DEBUG_DRIVER is not set |
325 | # CONFIG_DEBUG_DEVRES is not set | 322 | # CONFIG_DEBUG_DEVRES is not set |
326 | # CONFIG_SYS_HYPERVISOR is not set | 323 | # CONFIG_SYS_HYPERVISOR is not set |
327 | |||
328 | # | ||
329 | # Connector - unified userspace <-> kernelspace linker | ||
330 | # | ||
331 | # CONFIG_CONNECTOR is not set | 324 | # CONFIG_CONNECTOR is not set |
332 | |||
333 | # | ||
334 | # Memory Technology Devices (MTD) | ||
335 | # | ||
336 | # CONFIG_MTD is not set | 325 | # CONFIG_MTD is not set |
337 | |||
338 | # | ||
339 | # Parallel port support | ||
340 | # | ||
341 | # CONFIG_PARPORT is not set | 326 | # CONFIG_PARPORT is not set |
342 | |||
343 | # | ||
344 | # Plug and Play support | ||
345 | # | ||
346 | CONFIG_PNP=y | 327 | CONFIG_PNP=y |
347 | # CONFIG_PNP_DEBUG is not set | 328 | # CONFIG_PNP_DEBUG is not set |
348 | 329 | ||
@@ -350,10 +331,7 @@ CONFIG_PNP=y | |||
350 | # Protocols | 331 | # Protocols |
351 | # | 332 | # |
352 | CONFIG_PNPACPI=y | 333 | CONFIG_PNPACPI=y |
353 | 334 | CONFIG_BLK_DEV=y | |
354 | # | ||
355 | # Block devices | ||
356 | # | ||
357 | # CONFIG_BLK_CPQ_DA is not set | 335 | # CONFIG_BLK_CPQ_DA is not set |
358 | # CONFIG_BLK_CPQ_CISS_DA is not set | 336 | # CONFIG_BLK_CPQ_CISS_DA is not set |
359 | # CONFIG_BLK_DEV_DAC960 is not set | 337 | # CONFIG_BLK_DEV_DAC960 is not set |
@@ -370,16 +348,11 @@ CONFIG_BLK_DEV_RAM_SIZE=4096 | |||
370 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 348 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 |
371 | # CONFIG_CDROM_PKTCDVD is not set | 349 | # CONFIG_CDROM_PKTCDVD is not set |
372 | # CONFIG_ATA_OVER_ETH is not set | 350 | # CONFIG_ATA_OVER_ETH is not set |
373 | 351 | CONFIG_MISC_DEVICES=y | |
374 | # | 352 | # CONFIG_PHANTOM is not set |
375 | # Misc devices | 353 | # CONFIG_EEPROM_93CX6 is not set |
376 | # | ||
377 | # CONFIG_SGI_IOC4 is not set | 354 | # CONFIG_SGI_IOC4 is not set |
378 | # CONFIG_TIFM_CORE is not set | 355 | # CONFIG_TIFM_CORE is not set |
379 | |||
380 | # | ||
381 | # ATA/ATAPI/MFM/RLL support | ||
382 | # | ||
383 | CONFIG_IDE=y | 356 | CONFIG_IDE=y |
384 | CONFIG_IDE_MAX_HWIFS=4 | 357 | CONFIG_IDE_MAX_HWIFS=4 |
385 | CONFIG_BLK_DEV_IDE=y | 358 | CONFIG_BLK_DEV_IDE=y |
@@ -396,6 +369,7 @@ CONFIG_BLK_DEV_IDEFLOPPY=y | |||
396 | CONFIG_BLK_DEV_IDESCSI=m | 369 | CONFIG_BLK_DEV_IDESCSI=m |
397 | # CONFIG_BLK_DEV_IDEACPI is not set | 370 | # CONFIG_BLK_DEV_IDEACPI is not set |
398 | # CONFIG_IDE_TASK_IOCTL is not set | 371 | # CONFIG_IDE_TASK_IOCTL is not set |
372 | CONFIG_IDE_PROC_FS=y | ||
399 | 373 | ||
400 | # | 374 | # |
401 | # IDE chipset support/bugfixes | 375 | # IDE chipset support/bugfixes |
@@ -404,12 +378,12 @@ CONFIG_BLK_DEV_IDESCSI=m | |||
404 | # CONFIG_BLK_DEV_IDEPNP is not set | 378 | # CONFIG_BLK_DEV_IDEPNP is not set |
405 | CONFIG_BLK_DEV_IDEPCI=y | 379 | CONFIG_BLK_DEV_IDEPCI=y |
406 | # CONFIG_IDEPCI_SHARE_IRQ is not set | 380 | # CONFIG_IDEPCI_SHARE_IRQ is not set |
381 | CONFIG_IDEPCI_PCIBUS_ORDER=y | ||
407 | # CONFIG_BLK_DEV_OFFBOARD is not set | 382 | # CONFIG_BLK_DEV_OFFBOARD is not set |
408 | CONFIG_BLK_DEV_GENERIC=y | 383 | CONFIG_BLK_DEV_GENERIC=y |
409 | # CONFIG_BLK_DEV_OPTI621 is not set | 384 | # CONFIG_BLK_DEV_OPTI621 is not set |
410 | CONFIG_BLK_DEV_IDEDMA_PCI=y | 385 | CONFIG_BLK_DEV_IDEDMA_PCI=y |
411 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | 386 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set |
412 | CONFIG_IDEDMA_PCI_AUTO=y | ||
413 | # CONFIG_IDEDMA_ONLYDISK is not set | 387 | # CONFIG_IDEDMA_ONLYDISK is not set |
414 | # CONFIG_BLK_DEV_AEC62XX is not set | 388 | # CONFIG_BLK_DEV_AEC62XX is not set |
415 | # CONFIG_BLK_DEV_ALI15X3 is not set | 389 | # CONFIG_BLK_DEV_ALI15X3 is not set |
@@ -438,7 +412,6 @@ CONFIG_BLK_DEV_PIIX=y | |||
438 | # CONFIG_IDE_ARM is not set | 412 | # CONFIG_IDE_ARM is not set |
439 | CONFIG_BLK_DEV_IDEDMA=y | 413 | CONFIG_BLK_DEV_IDEDMA=y |
440 | # CONFIG_IDEDMA_IVB is not set | 414 | # CONFIG_IDEDMA_IVB is not set |
441 | CONFIG_IDEDMA_AUTO=y | ||
442 | # CONFIG_BLK_DEV_HD is not set | 415 | # CONFIG_BLK_DEV_HD is not set |
443 | 416 | ||
444 | # | 417 | # |
@@ -446,6 +419,7 @@ CONFIG_IDEDMA_AUTO=y | |||
446 | # | 419 | # |
447 | # CONFIG_RAID_ATTRS is not set | 420 | # CONFIG_RAID_ATTRS is not set |
448 | CONFIG_SCSI=y | 421 | CONFIG_SCSI=y |
422 | CONFIG_SCSI_DMA=y | ||
449 | # CONFIG_SCSI_TGT is not set | 423 | # CONFIG_SCSI_TGT is not set |
450 | CONFIG_SCSI_NETLINK=y | 424 | CONFIG_SCSI_NETLINK=y |
451 | CONFIG_SCSI_PROC_FS=y | 425 | CONFIG_SCSI_PROC_FS=y |
@@ -468,6 +442,7 @@ CONFIG_CHR_DEV_SG=m | |||
468 | # CONFIG_SCSI_CONSTANTS is not set | 442 | # CONFIG_SCSI_CONSTANTS is not set |
469 | # CONFIG_SCSI_LOGGING is not set | 443 | # CONFIG_SCSI_LOGGING is not set |
470 | # CONFIG_SCSI_SCAN_ASYNC is not set | 444 | # CONFIG_SCSI_SCAN_ASYNC is not set |
445 | CONFIG_SCSI_WAIT_SCAN=m | ||
471 | 446 | ||
472 | # | 447 | # |
473 | # SCSI Transports | 448 | # SCSI Transports |
@@ -514,15 +489,7 @@ CONFIG_SCSI_QLOGIC_1280=y | |||
514 | # CONFIG_SCSI_DC390T is not set | 489 | # CONFIG_SCSI_DC390T is not set |
515 | # CONFIG_SCSI_DEBUG is not set | 490 | # CONFIG_SCSI_DEBUG is not set |
516 | # CONFIG_SCSI_SRP is not set | 491 | # CONFIG_SCSI_SRP is not set |
517 | |||
518 | # | ||
519 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
520 | # | ||
521 | # CONFIG_ATA is not set | 492 | # CONFIG_ATA is not set |
522 | |||
523 | # | ||
524 | # Multi-device support (RAID and LVM) | ||
525 | # | ||
526 | CONFIG_MD=y | 493 | CONFIG_MD=y |
527 | CONFIG_BLK_DEV_MD=m | 494 | CONFIG_BLK_DEV_MD=m |
528 | CONFIG_MD_LINEAR=m | 495 | CONFIG_MD_LINEAR=m |
@@ -539,6 +506,7 @@ CONFIG_DM_SNAPSHOT=m | |||
539 | CONFIG_DM_MIRROR=m | 506 | CONFIG_DM_MIRROR=m |
540 | CONFIG_DM_ZERO=m | 507 | CONFIG_DM_ZERO=m |
541 | # CONFIG_DM_MULTIPATH is not set | 508 | # CONFIG_DM_MULTIPATH is not set |
509 | # CONFIG_DM_DELAY is not set | ||
542 | 510 | ||
543 | # | 511 | # |
544 | # Fusion MPT device support | 512 | # Fusion MPT device support |
@@ -553,46 +521,25 @@ CONFIG_FUSION_CTL=y | |||
553 | # | 521 | # |
554 | # IEEE 1394 (FireWire) support | 522 | # IEEE 1394 (FireWire) support |
555 | # | 523 | # |
524 | # CONFIG_FIREWIRE is not set | ||
556 | # CONFIG_IEEE1394 is not set | 525 | # CONFIG_IEEE1394 is not set |
557 | |||
558 | # | ||
559 | # I2O device support | ||
560 | # | ||
561 | # CONFIG_I2O is not set | 526 | # CONFIG_I2O is not set |
562 | |||
563 | # | ||
564 | # Network device support | ||
565 | # | ||
566 | CONFIG_NETDEVICES=y | 527 | CONFIG_NETDEVICES=y |
528 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
567 | CONFIG_DUMMY=m | 529 | CONFIG_DUMMY=m |
568 | # CONFIG_BONDING is not set | 530 | # CONFIG_BONDING is not set |
531 | # CONFIG_MACVLAN is not set | ||
569 | # CONFIG_EQUALIZER is not set | 532 | # CONFIG_EQUALIZER is not set |
570 | # CONFIG_TUN is not set | 533 | # CONFIG_TUN is not set |
571 | # CONFIG_NET_SB1000 is not set | 534 | # CONFIG_NET_SB1000 is not set |
572 | |||
573 | # | ||
574 | # ARCnet devices | ||
575 | # | ||
576 | # CONFIG_ARCNET is not set | 535 | # CONFIG_ARCNET is not set |
577 | |||
578 | # | ||
579 | # PHY device support | ||
580 | # | ||
581 | # CONFIG_PHYLIB is not set | 536 | # CONFIG_PHYLIB is not set |
582 | |||
583 | # | ||
584 | # Ethernet (10 or 100Mbit) | ||
585 | # | ||
586 | CONFIG_NET_ETHERNET=y | 537 | CONFIG_NET_ETHERNET=y |
587 | CONFIG_MII=m | 538 | CONFIG_MII=m |
588 | # CONFIG_HAPPYMEAL is not set | 539 | # CONFIG_HAPPYMEAL is not set |
589 | # CONFIG_SUNGEM is not set | 540 | # CONFIG_SUNGEM is not set |
590 | # CONFIG_CASSINI is not set | 541 | # CONFIG_CASSINI is not set |
591 | # CONFIG_NET_VENDOR_3COM is not set | 542 | # CONFIG_NET_VENDOR_3COM is not set |
592 | |||
593 | # | ||
594 | # Tulip family network device support | ||
595 | # | ||
596 | CONFIG_NET_TULIP=y | 543 | CONFIG_NET_TULIP=y |
597 | # CONFIG_DE2104X is not set | 544 | # CONFIG_DE2104X is not set |
598 | CONFIG_TULIP=m | 545 | CONFIG_TULIP=m |
@@ -623,10 +570,7 @@ CONFIG_E100=m | |||
623 | # CONFIG_SUNDANCE is not set | 570 | # CONFIG_SUNDANCE is not set |
624 | # CONFIG_VIA_RHINE is not set | 571 | # CONFIG_VIA_RHINE is not set |
625 | # CONFIG_SC92031 is not set | 572 | # CONFIG_SC92031 is not set |
626 | 573 | CONFIG_NETDEV_1000=y | |
627 | # | ||
628 | # Ethernet (1000 Mbit) | ||
629 | # | ||
630 | # CONFIG_ACENIC is not set | 574 | # CONFIG_ACENIC is not set |
631 | # CONFIG_DL2K is not set | 575 | # CONFIG_DL2K is not set |
632 | CONFIG_E1000=y | 576 | CONFIG_E1000=y |
@@ -639,36 +583,36 @@ CONFIG_E1000=y | |||
639 | # CONFIG_SIS190 is not set | 583 | # CONFIG_SIS190 is not set |
640 | # CONFIG_SKGE is not set | 584 | # CONFIG_SKGE is not set |
641 | # CONFIG_SKY2 is not set | 585 | # CONFIG_SKY2 is not set |
642 | # CONFIG_SK98LIN is not set | ||
643 | # CONFIG_VIA_VELOCITY is not set | 586 | # CONFIG_VIA_VELOCITY is not set |
644 | CONFIG_TIGON3=y | 587 | CONFIG_TIGON3=y |
645 | # CONFIG_BNX2 is not set | 588 | # CONFIG_BNX2 is not set |
646 | # CONFIG_QLA3XXX is not set | 589 | # CONFIG_QLA3XXX is not set |
647 | # CONFIG_ATL1 is not set | 590 | # CONFIG_ATL1 is not set |
648 | 591 | CONFIG_NETDEV_10000=y | |
649 | # | ||
650 | # Ethernet (10000 Mbit) | ||
651 | # | ||
652 | # CONFIG_CHELSIO_T1 is not set | 592 | # CONFIG_CHELSIO_T1 is not set |
653 | # CONFIG_CHELSIO_T3 is not set | 593 | # CONFIG_CHELSIO_T3 is not set |
654 | # CONFIG_IXGB is not set | 594 | # CONFIG_IXGB is not set |
655 | # CONFIG_S2IO is not set | 595 | # CONFIG_S2IO is not set |
656 | # CONFIG_MYRI10GE is not set | 596 | # CONFIG_MYRI10GE is not set |
657 | # CONFIG_NETXEN_NIC is not set | 597 | # CONFIG_NETXEN_NIC is not set |
658 | 598 | # CONFIG_MLX4_CORE is not set | |
659 | # | ||
660 | # Token Ring devices | ||
661 | # | ||
662 | # CONFIG_TR is not set | 599 | # CONFIG_TR is not set |
663 | 600 | ||
664 | # | 601 | # |
665 | # Wireless LAN (non-hamradio) | 602 | # Wireless LAN |
666 | # | 603 | # |
667 | # CONFIG_NET_RADIO is not set | 604 | # CONFIG_WLAN_PRE80211 is not set |
605 | # CONFIG_WLAN_80211 is not set | ||
668 | 606 | ||
669 | # | 607 | # |
670 | # Wan interfaces | 608 | # USB Network Adapters |
671 | # | 609 | # |
610 | # CONFIG_USB_CATC is not set | ||
611 | # CONFIG_USB_KAWETH is not set | ||
612 | # CONFIG_USB_PEGASUS is not set | ||
613 | # CONFIG_USB_RTL8150 is not set | ||
614 | # CONFIG_USB_USBNET_MII is not set | ||
615 | # CONFIG_USB_USBNET is not set | ||
672 | # CONFIG_WAN is not set | 616 | # CONFIG_WAN is not set |
673 | # CONFIG_FDDI is not set | 617 | # CONFIG_FDDI is not set |
674 | # CONFIG_HIPPI is not set | 618 | # CONFIG_HIPPI is not set |
@@ -678,18 +622,9 @@ CONFIG_TIGON3=y | |||
678 | # CONFIG_SHAPER is not set | 622 | # CONFIG_SHAPER is not set |
679 | CONFIG_NETCONSOLE=y | 623 | CONFIG_NETCONSOLE=y |
680 | CONFIG_NETPOLL=y | 624 | CONFIG_NETPOLL=y |
681 | # CONFIG_NETPOLL_RX is not set | ||
682 | # CONFIG_NETPOLL_TRAP is not set | 625 | # CONFIG_NETPOLL_TRAP is not set |
683 | CONFIG_NET_POLL_CONTROLLER=y | 626 | CONFIG_NET_POLL_CONTROLLER=y |
684 | |||
685 | # | ||
686 | # ISDN subsystem | ||
687 | # | ||
688 | # CONFIG_ISDN is not set | 627 | # CONFIG_ISDN is not set |
689 | |||
690 | # | ||
691 | # Telephony Support | ||
692 | # | ||
693 | # CONFIG_PHONE is not set | 628 | # CONFIG_PHONE is not set |
694 | 629 | ||
695 | # | 630 | # |
@@ -697,6 +632,7 @@ CONFIG_NET_POLL_CONTROLLER=y | |||
697 | # | 632 | # |
698 | CONFIG_INPUT=y | 633 | CONFIG_INPUT=y |
699 | # CONFIG_INPUT_FF_MEMLESS is not set | 634 | # CONFIG_INPUT_FF_MEMLESS is not set |
635 | # CONFIG_INPUT_POLLDEV is not set | ||
700 | 636 | ||
701 | # | 637 | # |
702 | # Userland interfaces | 638 | # Userland interfaces |
@@ -722,9 +658,17 @@ CONFIG_KEYBOARD_ATKBD=y | |||
722 | # CONFIG_KEYBOARD_STOWAWAY is not set | 658 | # CONFIG_KEYBOARD_STOWAWAY is not set |
723 | CONFIG_INPUT_MOUSE=y | 659 | CONFIG_INPUT_MOUSE=y |
724 | CONFIG_MOUSE_PS2=y | 660 | CONFIG_MOUSE_PS2=y |
661 | CONFIG_MOUSE_PS2_ALPS=y | ||
662 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
663 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
664 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
665 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
666 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
725 | # CONFIG_MOUSE_SERIAL is not set | 667 | # CONFIG_MOUSE_SERIAL is not set |
668 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
726 | # CONFIG_MOUSE_VSXXXAA is not set | 669 | # CONFIG_MOUSE_VSXXXAA is not set |
727 | # CONFIG_INPUT_JOYSTICK is not set | 670 | # CONFIG_INPUT_JOYSTICK is not set |
671 | # CONFIG_INPUT_TABLET is not set | ||
728 | # CONFIG_INPUT_TOUCHSCREEN is not set | 672 | # CONFIG_INPUT_TOUCHSCREEN is not set |
729 | # CONFIG_INPUT_MISC is not set | 673 | # CONFIG_INPUT_MISC is not set |
730 | 674 | ||
@@ -790,19 +734,10 @@ CONFIG_SERIAL_CORE_CONSOLE=y | |||
790 | CONFIG_UNIX98_PTYS=y | 734 | CONFIG_UNIX98_PTYS=y |
791 | CONFIG_LEGACY_PTYS=y | 735 | CONFIG_LEGACY_PTYS=y |
792 | CONFIG_LEGACY_PTY_COUNT=256 | 736 | CONFIG_LEGACY_PTY_COUNT=256 |
793 | |||
794 | # | ||
795 | # IPMI | ||
796 | # | ||
797 | # CONFIG_IPMI_HANDLER is not set | 737 | # CONFIG_IPMI_HANDLER is not set |
798 | |||
799 | # | ||
800 | # Watchdog Cards | ||
801 | # | ||
802 | # CONFIG_WATCHDOG is not set | 738 | # CONFIG_WATCHDOG is not set |
803 | # CONFIG_HW_RANDOM is not set | 739 | # CONFIG_HW_RANDOM is not set |
804 | CONFIG_EFI_RTC=y | 740 | CONFIG_EFI_RTC=y |
805 | # CONFIG_DTLK is not set | ||
806 | # CONFIG_R3964 is not set | 741 | # CONFIG_R3964 is not set |
807 | # CONFIG_APPLICOM is not set | 742 | # CONFIG_APPLICOM is not set |
808 | CONFIG_AGP=m | 743 | CONFIG_AGP=m |
@@ -821,15 +756,8 @@ CONFIG_HPET=y | |||
821 | # CONFIG_HPET_RTC_IRQ is not set | 756 | # CONFIG_HPET_RTC_IRQ is not set |
822 | CONFIG_HPET_MMAP=y | 757 | CONFIG_HPET_MMAP=y |
823 | # CONFIG_HANGCHECK_TIMER is not set | 758 | # CONFIG_HANGCHECK_TIMER is not set |
824 | |||
825 | # | ||
826 | # TPM devices | ||
827 | # | ||
828 | # CONFIG_TCG_TPM is not set | 759 | # CONFIG_TCG_TPM is not set |
829 | 760 | CONFIG_DEVPORT=y | |
830 | # | ||
831 | # I2C support | ||
832 | # | ||
833 | # CONFIG_I2C is not set | 761 | # CONFIG_I2C is not set |
834 | 762 | ||
835 | # | 763 | # |
@@ -837,21 +765,17 @@ CONFIG_HPET_MMAP=y | |||
837 | # | 765 | # |
838 | # CONFIG_SPI is not set | 766 | # CONFIG_SPI is not set |
839 | # CONFIG_SPI_MASTER is not set | 767 | # CONFIG_SPI_MASTER is not set |
840 | |||
841 | # | ||
842 | # Dallas's 1-wire bus | ||
843 | # | ||
844 | # CONFIG_W1 is not set | 768 | # CONFIG_W1 is not set |
845 | 769 | # CONFIG_POWER_SUPPLY is not set | |
846 | # | ||
847 | # Hardware Monitoring support | ||
848 | # | ||
849 | CONFIG_HWMON=y | 770 | CONFIG_HWMON=y |
850 | # CONFIG_HWMON_VID is not set | 771 | # CONFIG_HWMON_VID is not set |
851 | # CONFIG_SENSORS_ABITUGURU is not set | 772 | # CONFIG_SENSORS_ABITUGURU is not set |
852 | # CONFIG_SENSORS_F71805F is not set | 773 | # CONFIG_SENSORS_F71805F is not set |
853 | # CONFIG_SENSORS_PC87427 is not set | 774 | # CONFIG_SENSORS_PC87427 is not set |
775 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
776 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
854 | # CONFIG_SENSORS_VT1211 is not set | 777 | # CONFIG_SENSORS_VT1211 is not set |
778 | # CONFIG_SENSORS_W83627HF is not set | ||
855 | # CONFIG_HWMON_DEBUG_CHIP is not set | 779 | # CONFIG_HWMON_DEBUG_CHIP is not set |
856 | 780 | ||
857 | # | 781 | # |
@@ -863,17 +787,20 @@ CONFIG_HWMON=y | |||
863 | # Multimedia devices | 787 | # Multimedia devices |
864 | # | 788 | # |
865 | # CONFIG_VIDEO_DEV is not set | 789 | # CONFIG_VIDEO_DEV is not set |
866 | 790 | # CONFIG_DVB_CORE is not set | |
867 | # | 791 | CONFIG_DAB=y |
868 | # Digital Video Broadcasting Devices | ||
869 | # | ||
870 | # CONFIG_DVB is not set | ||
871 | # CONFIG_USB_DABUSB is not set | 792 | # CONFIG_USB_DABUSB is not set |
872 | 793 | ||
873 | # | 794 | # |
874 | # Graphics support | 795 | # Graphics support |
875 | # | 796 | # |
876 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 797 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
798 | |||
799 | # | ||
800 | # Display device support | ||
801 | # | ||
802 | # CONFIG_DISPLAY_SUPPORT is not set | ||
803 | # CONFIG_VGASTATE is not set | ||
877 | # CONFIG_FB is not set | 804 | # CONFIG_FB is not set |
878 | 805 | ||
879 | # | 806 | # |
@@ -887,16 +814,18 @@ CONFIG_DUMMY_CONSOLE=y | |||
887 | # Sound | 814 | # Sound |
888 | # | 815 | # |
889 | # CONFIG_SOUND is not set | 816 | # CONFIG_SOUND is not set |
890 | 817 | CONFIG_HID_SUPPORT=y | |
891 | # | ||
892 | # HID Devices | ||
893 | # | ||
894 | CONFIG_HID=y | 818 | CONFIG_HID=y |
895 | # CONFIG_HID_DEBUG is not set | 819 | # CONFIG_HID_DEBUG is not set |
896 | 820 | ||
897 | # | 821 | # |
898 | # USB support | 822 | # USB Input Devices |
899 | # | 823 | # |
824 | CONFIG_USB_HID=y | ||
825 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
826 | # CONFIG_HID_FF is not set | ||
827 | # CONFIG_USB_HIDDEV is not set | ||
828 | CONFIG_USB_SUPPORT=y | ||
900 | CONFIG_USB_ARCH_HAS_HCD=y | 829 | CONFIG_USB_ARCH_HAS_HCD=y |
901 | CONFIG_USB_ARCH_HAS_OHCI=y | 830 | CONFIG_USB_ARCH_HAS_OHCI=y |
902 | CONFIG_USB_ARCH_HAS_EHCI=y | 831 | CONFIG_USB_ARCH_HAS_EHCI=y |
@@ -907,8 +836,10 @@ CONFIG_USB=y | |||
907 | # Miscellaneous USB options | 836 | # Miscellaneous USB options |
908 | # | 837 | # |
909 | CONFIG_USB_DEVICEFS=y | 838 | CONFIG_USB_DEVICEFS=y |
839 | CONFIG_USB_DEVICE_CLASS=y | ||
910 | # CONFIG_USB_DYNAMIC_MINORS is not set | 840 | # CONFIG_USB_DYNAMIC_MINORS is not set |
911 | # CONFIG_USB_SUSPEND is not set | 841 | # CONFIG_USB_SUSPEND is not set |
842 | # CONFIG_USB_PERSIST is not set | ||
912 | # CONFIG_USB_OTG is not set | 843 | # CONFIG_USB_OTG is not set |
913 | 844 | ||
914 | # | 845 | # |
@@ -918,7 +849,6 @@ CONFIG_USB_EHCI_HCD=m | |||
918 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 849 | # CONFIG_USB_EHCI_SPLIT_ISO is not set |
919 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 850 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
920 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 851 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
921 | # CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set | ||
922 | # CONFIG_USB_ISP116X_HCD is not set | 852 | # CONFIG_USB_ISP116X_HCD is not set |
923 | CONFIG_USB_OHCI_HCD=m | 853 | CONFIG_USB_OHCI_HCD=m |
924 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | 854 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set |
@@ -926,6 +856,7 @@ CONFIG_USB_OHCI_HCD=m | |||
926 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | 856 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y |
927 | CONFIG_USB_UHCI_HCD=y | 857 | CONFIG_USB_UHCI_HCD=y |
928 | # CONFIG_USB_SL811_HCD is not set | 858 | # CONFIG_USB_SL811_HCD is not set |
859 | # CONFIG_USB_R8A66597_HCD is not set | ||
929 | 860 | ||
930 | # | 861 | # |
931 | # USB Device Class drivers | 862 | # USB Device Class drivers |
@@ -955,41 +886,10 @@ CONFIG_USB_STORAGE=m | |||
955 | # CONFIG_USB_LIBUSUAL is not set | 886 | # CONFIG_USB_LIBUSUAL is not set |
956 | 887 | ||
957 | # | 888 | # |
958 | # USB Input Devices | ||
959 | # | ||
960 | CONFIG_USB_HID=y | ||
961 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
962 | # CONFIG_HID_FF is not set | ||
963 | # CONFIG_USB_HIDDEV is not set | ||
964 | # CONFIG_USB_AIPTEK is not set | ||
965 | # CONFIG_USB_WACOM is not set | ||
966 | # CONFIG_USB_ACECAD is not set | ||
967 | # CONFIG_USB_KBTAB is not set | ||
968 | # CONFIG_USB_POWERMATE is not set | ||
969 | # CONFIG_USB_TOUCHSCREEN is not set | ||
970 | # CONFIG_USB_YEALINK is not set | ||
971 | # CONFIG_USB_XPAD is not set | ||
972 | # CONFIG_USB_ATI_REMOTE is not set | ||
973 | # CONFIG_USB_ATI_REMOTE2 is not set | ||
974 | # CONFIG_USB_KEYSPAN_REMOTE is not set | ||
975 | # CONFIG_USB_APPLETOUCH is not set | ||
976 | # CONFIG_USB_GTCO is not set | ||
977 | |||
978 | # | ||
979 | # USB Imaging devices | 889 | # USB Imaging devices |
980 | # | 890 | # |
981 | # CONFIG_USB_MDC800 is not set | 891 | # CONFIG_USB_MDC800 is not set |
982 | # CONFIG_USB_MICROTEK is not set | 892 | # CONFIG_USB_MICROTEK is not set |
983 | |||
984 | # | ||
985 | # USB Network Adapters | ||
986 | # | ||
987 | # CONFIG_USB_CATC is not set | ||
988 | # CONFIG_USB_KAWETH is not set | ||
989 | # CONFIG_USB_PEGASUS is not set | ||
990 | # CONFIG_USB_RTL8150 is not set | ||
991 | # CONFIG_USB_USBNET_MII is not set | ||
992 | # CONFIG_USB_USBNET is not set | ||
993 | # CONFIG_USB_MON is not set | 893 | # CONFIG_USB_MON is not set |
994 | 894 | ||
995 | # | 895 | # |
@@ -1033,10 +933,6 @@ CONFIG_USB_HID=y | |||
1033 | # USB Gadget Support | 933 | # USB Gadget Support |
1034 | # | 934 | # |
1035 | # CONFIG_USB_GADGET is not set | 935 | # CONFIG_USB_GADGET is not set |
1036 | |||
1037 | # | ||
1038 | # MMC/SD Card support | ||
1039 | # | ||
1040 | # CONFIG_MMC is not set | 936 | # CONFIG_MMC is not set |
1041 | 937 | ||
1042 | # | 938 | # |
@@ -1051,17 +947,9 @@ CONFIG_USB_HID=y | |||
1051 | # | 947 | # |
1052 | # LED Triggers | 948 | # LED Triggers |
1053 | # | 949 | # |
1054 | |||
1055 | # | ||
1056 | # InfiniBand support | ||
1057 | # | ||
1058 | # CONFIG_INFINIBAND is not set | 950 | # CONFIG_INFINIBAND is not set |
1059 | 951 | ||
1060 | # | 952 | # |
1061 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
1062 | # | ||
1063 | |||
1064 | # | ||
1065 | # Real Time Clock | 953 | # Real Time Clock |
1066 | # | 954 | # |
1067 | # CONFIG_RTC_CLASS is not set | 955 | # CONFIG_RTC_CLASS is not set |
@@ -1080,12 +968,9 @@ CONFIG_USB_HID=y | |||
1080 | # | 968 | # |
1081 | 969 | ||
1082 | # | 970 | # |
1083 | # Auxiliary Display support | 971 | # Userspace I/O |
1084 | # | ||
1085 | |||
1086 | # | ||
1087 | # Virtualization | ||
1088 | # | 972 | # |
973 | # CONFIG_UIO is not set | ||
1089 | # CONFIG_MSPEC is not set | 974 | # CONFIG_MSPEC is not set |
1090 | 975 | ||
1091 | # | 976 | # |
@@ -1200,7 +1085,8 @@ CONFIG_EXPORTFS=m | |||
1200 | CONFIG_NFS_COMMON=y | 1085 | CONFIG_NFS_COMMON=y |
1201 | CONFIG_SUNRPC=m | 1086 | CONFIG_SUNRPC=m |
1202 | CONFIG_SUNRPC_GSS=m | 1087 | CONFIG_SUNRPC_GSS=m |
1203 | CONFIG_RPCSEC_GSS_KRB5=m | 1088 | # CONFIG_SUNRPC_BIND34 is not set |
1089 | CONFIG_RPCSEC_GSS_KRB5=y | ||
1204 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1090 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1205 | CONFIG_SMB_FS=m | 1091 | CONFIG_SMB_FS=m |
1206 | CONFIG_SMB_NLS_DEFAULT=y | 1092 | CONFIG_SMB_NLS_DEFAULT=y |
@@ -1214,7 +1100,6 @@ CONFIG_CIFS=m | |||
1214 | # CONFIG_NCP_FS is not set | 1100 | # CONFIG_NCP_FS is not set |
1215 | # CONFIG_CODA_FS is not set | 1101 | # CONFIG_CODA_FS is not set |
1216 | # CONFIG_AFS_FS is not set | 1102 | # CONFIG_AFS_FS is not set |
1217 | # CONFIG_9P_FS is not set | ||
1218 | 1103 | ||
1219 | # | 1104 | # |
1220 | # Partition Types | 1105 | # Partition Types |
@@ -1236,6 +1121,7 @@ CONFIG_SGI_PARTITION=y | |||
1236 | # CONFIG_SUN_PARTITION is not set | 1121 | # CONFIG_SUN_PARTITION is not set |
1237 | # CONFIG_KARMA_PARTITION is not set | 1122 | # CONFIG_KARMA_PARTITION is not set |
1238 | CONFIG_EFI_PARTITION=y | 1123 | CONFIG_EFI_PARTITION=y |
1124 | # CONFIG_SYSV68_PARTITION is not set | ||
1239 | 1125 | ||
1240 | # | 1126 | # |
1241 | # Native Language Support | 1127 | # Native Language Support |
@@ -1292,11 +1178,14 @@ CONFIG_NLS_UTF8=m | |||
1292 | CONFIG_BITREVERSE=y | 1178 | CONFIG_BITREVERSE=y |
1293 | # CONFIG_CRC_CCITT is not set | 1179 | # CONFIG_CRC_CCITT is not set |
1294 | # CONFIG_CRC16 is not set | 1180 | # CONFIG_CRC16 is not set |
1181 | # CONFIG_CRC_ITU_T is not set | ||
1295 | CONFIG_CRC32=y | 1182 | CONFIG_CRC32=y |
1183 | # CONFIG_CRC7 is not set | ||
1296 | # CONFIG_LIBCRC32C is not set | 1184 | # CONFIG_LIBCRC32C is not set |
1297 | CONFIG_PLIST=y | 1185 | CONFIG_PLIST=y |
1298 | CONFIG_HAS_IOMEM=y | 1186 | CONFIG_HAS_IOMEM=y |
1299 | CONFIG_HAS_IOPORT=y | 1187 | CONFIG_HAS_IOPORT=y |
1188 | CONFIG_HAS_DMA=y | ||
1300 | CONFIG_GENERIC_HARDIRQS=y | 1189 | CONFIG_GENERIC_HARDIRQS=y |
1301 | CONFIG_GENERIC_IRQ_PROBE=y | 1190 | CONFIG_GENERIC_IRQ_PROBE=y |
1302 | CONFIG_GENERIC_PENDING_IRQ=y | 1191 | CONFIG_GENERIC_PENDING_IRQ=y |
@@ -1319,8 +1208,8 @@ CONFIG_MAGIC_SYSRQ=y | |||
1319 | # CONFIG_HEADERS_CHECK is not set | 1208 | # CONFIG_HEADERS_CHECK is not set |
1320 | CONFIG_DEBUG_KERNEL=y | 1209 | CONFIG_DEBUG_KERNEL=y |
1321 | # CONFIG_DEBUG_SHIRQ is not set | 1210 | # CONFIG_DEBUG_SHIRQ is not set |
1322 | CONFIG_LOG_BUF_SHIFT=20 | ||
1323 | CONFIG_DETECT_SOFTLOCKUP=y | 1211 | CONFIG_DETECT_SOFTLOCKUP=y |
1212 | CONFIG_SCHED_DEBUG=y | ||
1324 | # CONFIG_SCHEDSTATS is not set | 1213 | # CONFIG_SCHEDSTATS is not set |
1325 | # CONFIG_TIMER_STATS is not set | 1214 | # CONFIG_TIMER_STATS is not set |
1326 | # CONFIG_DEBUG_SLAB is not set | 1215 | # CONFIG_DEBUG_SLAB is not set |
@@ -1343,17 +1232,12 @@ CONFIG_IA64_GRANULE_16MB=y | |||
1343 | # CONFIG_DISABLE_VHPT is not set | 1232 | # CONFIG_DISABLE_VHPT is not set |
1344 | # CONFIG_IA64_DEBUG_CMPXCHG is not set | 1233 | # CONFIG_IA64_DEBUG_CMPXCHG is not set |
1345 | # CONFIG_IA64_DEBUG_IRQ is not set | 1234 | # CONFIG_IA64_DEBUG_IRQ is not set |
1346 | CONFIG_SYSVIPC_COMPAT=y | ||
1347 | 1235 | ||
1348 | # | 1236 | # |
1349 | # Security options | 1237 | # Security options |
1350 | # | 1238 | # |
1351 | # CONFIG_KEYS is not set | 1239 | # CONFIG_KEYS is not set |
1352 | # CONFIG_SECURITY is not set | 1240 | # CONFIG_SECURITY is not set |
1353 | |||
1354 | # | ||
1355 | # Cryptographic options | ||
1356 | # | ||
1357 | CONFIG_CRYPTO=y | 1241 | CONFIG_CRYPTO=y |
1358 | CONFIG_CRYPTO_ALGAPI=y | 1242 | CONFIG_CRYPTO_ALGAPI=y |
1359 | CONFIG_CRYPTO_BLKCIPHER=m | 1243 | CONFIG_CRYPTO_BLKCIPHER=m |
@@ -1373,6 +1257,7 @@ CONFIG_CRYPTO_ECB=m | |||
1373 | CONFIG_CRYPTO_CBC=m | 1257 | CONFIG_CRYPTO_CBC=m |
1374 | CONFIG_CRYPTO_PCBC=m | 1258 | CONFIG_CRYPTO_PCBC=m |
1375 | # CONFIG_CRYPTO_LRW is not set | 1259 | # CONFIG_CRYPTO_LRW is not set |
1260 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1376 | CONFIG_CRYPTO_DES=m | 1261 | CONFIG_CRYPTO_DES=m |
1377 | # CONFIG_CRYPTO_FCRYPT is not set | 1262 | # CONFIG_CRYPTO_FCRYPT is not set |
1378 | # CONFIG_CRYPTO_BLOWFISH is not set | 1263 | # CONFIG_CRYPTO_BLOWFISH is not set |
@@ -1390,7 +1275,4 @@ CONFIG_CRYPTO_DES=m | |||
1390 | # CONFIG_CRYPTO_CRC32C is not set | 1275 | # CONFIG_CRYPTO_CRC32C is not set |
1391 | # CONFIG_CRYPTO_CAMELLIA is not set | 1276 | # CONFIG_CRYPTO_CAMELLIA is not set |
1392 | # CONFIG_CRYPTO_TEST is not set | 1277 | # CONFIG_CRYPTO_TEST is not set |
1393 | 1278 | CONFIG_CRYPTO_HW=y | |
1394 | # | ||
1395 | # Hardware crypto devices | ||
1396 | # | ||
diff --git a/arch/ia64/configs/zx1_defconfig b/arch/ia64/configs/zx1_defconfig index 1c7955c16358..4a060fc39934 100644 --- a/arch/ia64/configs/zx1_defconfig +++ b/arch/ia64/configs/zx1_defconfig | |||
@@ -96,7 +96,7 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y | |||
96 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 96 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
97 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 97 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
98 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 98 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
99 | CONFIG_TIME_INTERPOLATION=y | 99 | CONFIG_GENERIC_TIME=y |
100 | CONFIG_DMI=y | 100 | CONFIG_DMI=y |
101 | CONFIG_EFI=y | 101 | CONFIG_EFI=y |
102 | CONFIG_GENERIC_IOMAP=y | 102 | CONFIG_GENERIC_IOMAP=y |
diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig index 90bd9601cdde..03172dc8c403 100644 --- a/arch/ia64/defconfig +++ b/arch/ia64/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.21-rc3 | 3 | # Linux kernel version: 2.6.22 |
4 | # Thu Mar 8 11:01:03 2007 | 4 | # Thu Jul 19 13:55:32 2007 |
5 | # | 5 | # |
6 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 6 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
7 | 7 | ||
@@ -19,15 +19,15 @@ CONFIG_LOCALVERSION="" | |||
19 | CONFIG_LOCALVERSION_AUTO=y | 19 | CONFIG_LOCALVERSION_AUTO=y |
20 | CONFIG_SWAP=y | 20 | CONFIG_SWAP=y |
21 | CONFIG_SYSVIPC=y | 21 | CONFIG_SYSVIPC=y |
22 | # CONFIG_IPC_NS is not set | ||
23 | CONFIG_SYSVIPC_SYSCTL=y | 22 | CONFIG_SYSVIPC_SYSCTL=y |
24 | CONFIG_POSIX_MQUEUE=y | 23 | CONFIG_POSIX_MQUEUE=y |
25 | # CONFIG_BSD_PROCESS_ACCT is not set | 24 | # CONFIG_BSD_PROCESS_ACCT is not set |
26 | # CONFIG_TASKSTATS is not set | 25 | # CONFIG_TASKSTATS is not set |
27 | # CONFIG_UTS_NS is not set | 26 | # CONFIG_USER_NS is not set |
28 | # CONFIG_AUDIT is not set | 27 | # CONFIG_AUDIT is not set |
29 | CONFIG_IKCONFIG=y | 28 | CONFIG_IKCONFIG=y |
30 | CONFIG_IKCONFIG_PROC=y | 29 | CONFIG_IKCONFIG_PROC=y |
30 | CONFIG_LOG_BUF_SHIFT=20 | ||
31 | # CONFIG_CPUSETS is not set | 31 | # CONFIG_CPUSETS is not set |
32 | CONFIG_SYSFS_DEPRECATED=y | 32 | CONFIG_SYSFS_DEPRECATED=y |
33 | # CONFIG_RELAY is not set | 33 | # CONFIG_RELAY is not set |
@@ -46,18 +46,19 @@ CONFIG_BUG=y | |||
46 | CONFIG_ELF_CORE=y | 46 | CONFIG_ELF_CORE=y |
47 | CONFIG_BASE_FULL=y | 47 | CONFIG_BASE_FULL=y |
48 | CONFIG_FUTEX=y | 48 | CONFIG_FUTEX=y |
49 | CONFIG_ANON_INODES=y | ||
49 | CONFIG_EPOLL=y | 50 | CONFIG_EPOLL=y |
51 | CONFIG_SIGNALFD=y | ||
52 | CONFIG_TIMERFD=y | ||
53 | CONFIG_EVENTFD=y | ||
50 | CONFIG_SHMEM=y | 54 | CONFIG_SHMEM=y |
51 | CONFIG_SLAB=y | ||
52 | CONFIG_VM_EVENT_COUNTERS=y | 55 | CONFIG_VM_EVENT_COUNTERS=y |
56 | CONFIG_SLAB=y | ||
57 | # CONFIG_SLUB is not set | ||
58 | # CONFIG_SLOB is not set | ||
53 | CONFIG_RT_MUTEXES=y | 59 | CONFIG_RT_MUTEXES=y |
54 | # CONFIG_TINY_SHMEM is not set | 60 | # CONFIG_TINY_SHMEM is not set |
55 | CONFIG_BASE_SMALL=0 | 61 | CONFIG_BASE_SMALL=0 |
56 | # CONFIG_SLOB is not set | ||
57 | |||
58 | # | ||
59 | # Loadable module support | ||
60 | # | ||
61 | CONFIG_MODULES=y | 62 | CONFIG_MODULES=y |
62 | CONFIG_MODULE_UNLOAD=y | 63 | CONFIG_MODULE_UNLOAD=y |
63 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 64 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
@@ -65,12 +66,9 @@ CONFIG_MODVERSIONS=y | |||
65 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 66 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
66 | CONFIG_KMOD=y | 67 | CONFIG_KMOD=y |
67 | CONFIG_STOP_MACHINE=y | 68 | CONFIG_STOP_MACHINE=y |
68 | |||
69 | # | ||
70 | # Block layer | ||
71 | # | ||
72 | CONFIG_BLOCK=y | 69 | CONFIG_BLOCK=y |
73 | # CONFIG_BLK_DEV_IO_TRACE is not set | 70 | # CONFIG_BLK_DEV_IO_TRACE is not set |
71 | # CONFIG_BLK_DEV_BSG is not set | ||
74 | 72 | ||
75 | # | 73 | # |
76 | # IO Schedulers | 74 | # IO Schedulers |
@@ -91,6 +89,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
91 | CONFIG_IA64=y | 89 | CONFIG_IA64=y |
92 | CONFIG_64BIT=y | 90 | CONFIG_64BIT=y |
93 | CONFIG_ZONE_DMA=y | 91 | CONFIG_ZONE_DMA=y |
92 | CONFIG_QUICKLIST=y | ||
94 | CONFIG_MMU=y | 93 | CONFIG_MMU=y |
95 | CONFIG_SWIOTLB=y | 94 | CONFIG_SWIOTLB=y |
96 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 95 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
@@ -98,7 +97,7 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y | |||
98 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 97 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
99 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 98 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
100 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 99 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
101 | CONFIG_TIME_INTERPOLATION=y | 100 | CONFIG_GENERIC_TIME=y |
102 | CONFIG_DMI=y | 101 | CONFIG_DMI=y |
103 | CONFIG_EFI=y | 102 | CONFIG_EFI=y |
104 | CONFIG_GENERIC_IOMAP=y | 103 | CONFIG_GENERIC_IOMAP=y |
@@ -114,8 +113,8 @@ CONFIG_IA64_GENERIC=y | |||
114 | CONFIG_MCKINLEY=y | 113 | CONFIG_MCKINLEY=y |
115 | # CONFIG_IA64_PAGE_SIZE_4KB is not set | 114 | # CONFIG_IA64_PAGE_SIZE_4KB is not set |
116 | # CONFIG_IA64_PAGE_SIZE_8KB is not set | 115 | # CONFIG_IA64_PAGE_SIZE_8KB is not set |
117 | CONFIG_IA64_PAGE_SIZE_16KB=y | 116 | # CONFIG_IA64_PAGE_SIZE_16KB is not set |
118 | # CONFIG_IA64_PAGE_SIZE_64KB is not set | 117 | CONFIG_IA64_PAGE_SIZE_64KB=y |
119 | CONFIG_PGTABLE_3=y | 118 | CONFIG_PGTABLE_3=y |
120 | # CONFIG_PGTABLE_4 is not set | 119 | # CONFIG_PGTABLE_4 is not set |
121 | # CONFIG_HZ_100 is not set | 120 | # CONFIG_HZ_100 is not set |
@@ -147,6 +146,9 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 | |||
147 | CONFIG_MIGRATION=y | 146 | CONFIG_MIGRATION=y |
148 | CONFIG_RESOURCES_64BIT=y | 147 | CONFIG_RESOURCES_64BIT=y |
149 | CONFIG_ZONE_DMA_FLAG=1 | 148 | CONFIG_ZONE_DMA_FLAG=1 |
149 | CONFIG_BOUNCE=y | ||
150 | CONFIG_NR_QUICK=1 | ||
151 | CONFIG_VIRT_TO_BUS=y | ||
150 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | 152 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y |
151 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y | 153 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y |
152 | CONFIG_ARCH_FLATMEM_ENABLE=y | 154 | CONFIG_ARCH_FLATMEM_ENABLE=y |
@@ -164,7 +166,7 @@ CONFIG_COMPAT=y | |||
164 | CONFIG_IA64_MCA_RECOVERY=y | 166 | CONFIG_IA64_MCA_RECOVERY=y |
165 | CONFIG_PERFMON=y | 167 | CONFIG_PERFMON=y |
166 | CONFIG_IA64_PALINFO=y | 168 | CONFIG_IA64_PALINFO=y |
167 | # CONFIG_MC_ERR_INJECT is not set | 169 | # CONFIG_IA64_MC_ERR_INJECT is not set |
168 | CONFIG_SGI_SN=y | 170 | CONFIG_SGI_SN=y |
169 | # CONFIG_IA64_ESI is not set | 171 | # CONFIG_IA64_ESI is not set |
170 | 172 | ||
@@ -180,6 +182,7 @@ CONFIG_CRASH_DUMP=y | |||
180 | # | 182 | # |
181 | CONFIG_EFI_VARS=y | 183 | CONFIG_EFI_VARS=y |
182 | CONFIG_EFI_PCDP=y | 184 | CONFIG_EFI_PCDP=y |
185 | CONFIG_DMIID=y | ||
183 | CONFIG_BINFMT_ELF=y | 186 | CONFIG_BINFMT_ELF=y |
184 | CONFIG_BINFMT_MISC=m | 187 | CONFIG_BINFMT_MISC=m |
185 | 188 | ||
@@ -189,7 +192,6 @@ CONFIG_BINFMT_MISC=m | |||
189 | CONFIG_PM=y | 192 | CONFIG_PM=y |
190 | CONFIG_PM_LEGACY=y | 193 | CONFIG_PM_LEGACY=y |
191 | # CONFIG_PM_DEBUG is not set | 194 | # CONFIG_PM_DEBUG is not set |
192 | # CONFIG_PM_SYSFS_DEPRECATED is not set | ||
193 | 195 | ||
194 | # | 196 | # |
195 | # ACPI (Advanced Configuration and Power Interface) Support | 197 | # ACPI (Advanced Configuration and Power Interface) Support |
@@ -220,13 +222,11 @@ CONFIG_ACPI_CONTAINER=m | |||
220 | # | 222 | # |
221 | CONFIG_PCI=y | 223 | CONFIG_PCI=y |
222 | CONFIG_PCI_DOMAINS=y | 224 | CONFIG_PCI_DOMAINS=y |
225 | CONFIG_PCI_SYSCALL=y | ||
223 | # CONFIG_PCIEPORTBUS is not set | 226 | # CONFIG_PCIEPORTBUS is not set |
227 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
224 | # CONFIG_PCI_MSI is not set | 228 | # CONFIG_PCI_MSI is not set |
225 | # CONFIG_PCI_DEBUG is not set | 229 | # CONFIG_PCI_DEBUG is not set |
226 | |||
227 | # | ||
228 | # PCI Hotplug Support | ||
229 | # | ||
230 | CONFIG_HOTPLUG_PCI=m | 230 | CONFIG_HOTPLUG_PCI=m |
231 | # CONFIG_HOTPLUG_PCI_FAKE is not set | 231 | # CONFIG_HOTPLUG_PCI_FAKE is not set |
232 | CONFIG_HOTPLUG_PCI_ACPI=m | 232 | CONFIG_HOTPLUG_PCI_ACPI=m |
@@ -248,7 +248,6 @@ CONFIG_NET=y | |||
248 | # | 248 | # |
249 | # Networking options | 249 | # Networking options |
250 | # | 250 | # |
251 | # CONFIG_NETDEBUG is not set | ||
252 | CONFIG_PACKET=y | 251 | CONFIG_PACKET=y |
253 | # CONFIG_PACKET_MMAP is not set | 252 | # CONFIG_PACKET_MMAP is not set |
254 | CONFIG_UNIX=y | 253 | CONFIG_UNIX=y |
@@ -286,20 +285,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
286 | # CONFIG_INET6_TUNNEL is not set | 285 | # CONFIG_INET6_TUNNEL is not set |
287 | # CONFIG_NETWORK_SECMARK is not set | 286 | # CONFIG_NETWORK_SECMARK is not set |
288 | # CONFIG_NETFILTER is not set | 287 | # CONFIG_NETFILTER is not set |
289 | |||
290 | # | ||
291 | # DCCP Configuration (EXPERIMENTAL) | ||
292 | # | ||
293 | # CONFIG_IP_DCCP is not set | 288 | # CONFIG_IP_DCCP is not set |
294 | |||
295 | # | ||
296 | # SCTP Configuration (EXPERIMENTAL) | ||
297 | # | ||
298 | # CONFIG_IP_SCTP is not set | 289 | # CONFIG_IP_SCTP is not set |
299 | |||
300 | # | ||
301 | # TIPC Configuration (EXPERIMENTAL) | ||
302 | # | ||
303 | # CONFIG_TIPC is not set | 290 | # CONFIG_TIPC is not set |
304 | # CONFIG_ATM is not set | 291 | # CONFIG_ATM is not set |
305 | # CONFIG_BRIDGE is not set | 292 | # CONFIG_BRIDGE is not set |
@@ -325,7 +312,17 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
325 | # CONFIG_HAMRADIO is not set | 312 | # CONFIG_HAMRADIO is not set |
326 | # CONFIG_IRDA is not set | 313 | # CONFIG_IRDA is not set |
327 | # CONFIG_BT is not set | 314 | # CONFIG_BT is not set |
315 | # CONFIG_AF_RXRPC is not set | ||
316 | |||
317 | # | ||
318 | # Wireless | ||
319 | # | ||
320 | # CONFIG_CFG80211 is not set | ||
321 | # CONFIG_WIRELESS_EXT is not set | ||
322 | # CONFIG_MAC80211 is not set | ||
328 | # CONFIG_IEEE80211 is not set | 323 | # CONFIG_IEEE80211 is not set |
324 | # CONFIG_RFKILL is not set | ||
325 | # CONFIG_NET_9P is not set | ||
329 | 326 | ||
330 | # | 327 | # |
331 | # Device Drivers | 328 | # Device Drivers |
@@ -340,25 +337,9 @@ CONFIG_FW_LOADER=m | |||
340 | # CONFIG_DEBUG_DRIVER is not set | 337 | # CONFIG_DEBUG_DRIVER is not set |
341 | # CONFIG_DEBUG_DEVRES is not set | 338 | # CONFIG_DEBUG_DEVRES is not set |
342 | # CONFIG_SYS_HYPERVISOR is not set | 339 | # CONFIG_SYS_HYPERVISOR is not set |
343 | |||
344 | # | ||
345 | # Connector - unified userspace <-> kernelspace linker | ||
346 | # | ||
347 | # CONFIG_CONNECTOR is not set | 340 | # CONFIG_CONNECTOR is not set |
348 | |||
349 | # | ||
350 | # Memory Technology Devices (MTD) | ||
351 | # | ||
352 | # CONFIG_MTD is not set | 341 | # CONFIG_MTD is not set |
353 | |||
354 | # | ||
355 | # Parallel port support | ||
356 | # | ||
357 | # CONFIG_PARPORT is not set | 342 | # CONFIG_PARPORT is not set |
358 | |||
359 | # | ||
360 | # Plug and Play support | ||
361 | # | ||
362 | CONFIG_PNP=y | 343 | CONFIG_PNP=y |
363 | # CONFIG_PNP_DEBUG is not set | 344 | # CONFIG_PNP_DEBUG is not set |
364 | 345 | ||
@@ -366,10 +347,7 @@ CONFIG_PNP=y | |||
366 | # Protocols | 347 | # Protocols |
367 | # | 348 | # |
368 | CONFIG_PNPACPI=y | 349 | CONFIG_PNPACPI=y |
369 | 350 | CONFIG_BLK_DEV=y | |
370 | # | ||
371 | # Block devices | ||
372 | # | ||
373 | # CONFIG_BLK_CPQ_DA is not set | 351 | # CONFIG_BLK_CPQ_DA is not set |
374 | # CONFIG_BLK_CPQ_CISS_DA is not set | 352 | # CONFIG_BLK_CPQ_CISS_DA is not set |
375 | # CONFIG_BLK_DEV_DAC960 is not set | 353 | # CONFIG_BLK_DEV_DAC960 is not set |
@@ -386,16 +364,11 @@ CONFIG_BLK_DEV_RAM_SIZE=4096 | |||
386 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 364 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 |
387 | # CONFIG_CDROM_PKTCDVD is not set | 365 | # CONFIG_CDROM_PKTCDVD is not set |
388 | # CONFIG_ATA_OVER_ETH is not set | 366 | # CONFIG_ATA_OVER_ETH is not set |
389 | 367 | CONFIG_MISC_DEVICES=y | |
390 | # | 368 | # CONFIG_PHANTOM is not set |
391 | # Misc devices | 369 | # CONFIG_EEPROM_93CX6 is not set |
392 | # | ||
393 | CONFIG_SGI_IOC4=y | 370 | CONFIG_SGI_IOC4=y |
394 | # CONFIG_TIFM_CORE is not set | 371 | # CONFIG_TIFM_CORE is not set |
395 | |||
396 | # | ||
397 | # ATA/ATAPI/MFM/RLL support | ||
398 | # | ||
399 | CONFIG_IDE=y | 372 | CONFIG_IDE=y |
400 | CONFIG_IDE_MAX_HWIFS=4 | 373 | CONFIG_IDE_MAX_HWIFS=4 |
401 | CONFIG_BLK_DEV_IDE=y | 374 | CONFIG_BLK_DEV_IDE=y |
@@ -412,6 +385,7 @@ CONFIG_BLK_DEV_IDEFLOPPY=y | |||
412 | CONFIG_BLK_DEV_IDESCSI=m | 385 | CONFIG_BLK_DEV_IDESCSI=m |
413 | # CONFIG_BLK_DEV_IDEACPI is not set | 386 | # CONFIG_BLK_DEV_IDEACPI is not set |
414 | # CONFIG_IDE_TASK_IOCTL is not set | 387 | # CONFIG_IDE_TASK_IOCTL is not set |
388 | CONFIG_IDE_PROC_FS=y | ||
415 | 389 | ||
416 | # | 390 | # |
417 | # IDE chipset support/bugfixes | 391 | # IDE chipset support/bugfixes |
@@ -420,12 +394,12 @@ CONFIG_BLK_DEV_IDESCSI=m | |||
420 | # CONFIG_BLK_DEV_IDEPNP is not set | 394 | # CONFIG_BLK_DEV_IDEPNP is not set |
421 | CONFIG_BLK_DEV_IDEPCI=y | 395 | CONFIG_BLK_DEV_IDEPCI=y |
422 | CONFIG_IDEPCI_SHARE_IRQ=y | 396 | CONFIG_IDEPCI_SHARE_IRQ=y |
397 | CONFIG_IDEPCI_PCIBUS_ORDER=y | ||
423 | # CONFIG_BLK_DEV_OFFBOARD is not set | 398 | # CONFIG_BLK_DEV_OFFBOARD is not set |
424 | CONFIG_BLK_DEV_GENERIC=y | 399 | CONFIG_BLK_DEV_GENERIC=y |
425 | # CONFIG_BLK_DEV_OPTI621 is not set | 400 | # CONFIG_BLK_DEV_OPTI621 is not set |
426 | CONFIG_BLK_DEV_IDEDMA_PCI=y | 401 | CONFIG_BLK_DEV_IDEDMA_PCI=y |
427 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | 402 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set |
428 | CONFIG_IDEDMA_PCI_AUTO=y | ||
429 | # CONFIG_IDEDMA_ONLYDISK is not set | 403 | # CONFIG_IDEDMA_ONLYDISK is not set |
430 | # CONFIG_BLK_DEV_AEC62XX is not set | 404 | # CONFIG_BLK_DEV_AEC62XX is not set |
431 | # CONFIG_BLK_DEV_ALI15X3 is not set | 405 | # CONFIG_BLK_DEV_ALI15X3 is not set |
@@ -455,7 +429,6 @@ CONFIG_BLK_DEV_SGIIOC4=y | |||
455 | # CONFIG_IDE_ARM is not set | 429 | # CONFIG_IDE_ARM is not set |
456 | CONFIG_BLK_DEV_IDEDMA=y | 430 | CONFIG_BLK_DEV_IDEDMA=y |
457 | # CONFIG_IDEDMA_IVB is not set | 431 | # CONFIG_IDEDMA_IVB is not set |
458 | CONFIG_IDEDMA_AUTO=y | ||
459 | # CONFIG_BLK_DEV_HD is not set | 432 | # CONFIG_BLK_DEV_HD is not set |
460 | 433 | ||
461 | # | 434 | # |
@@ -463,6 +436,7 @@ CONFIG_IDEDMA_AUTO=y | |||
463 | # | 436 | # |
464 | # CONFIG_RAID_ATTRS is not set | 437 | # CONFIG_RAID_ATTRS is not set |
465 | CONFIG_SCSI=y | 438 | CONFIG_SCSI=y |
439 | CONFIG_SCSI_DMA=y | ||
466 | # CONFIG_SCSI_TGT is not set | 440 | # CONFIG_SCSI_TGT is not set |
467 | CONFIG_SCSI_NETLINK=y | 441 | CONFIG_SCSI_NETLINK=y |
468 | CONFIG_SCSI_PROC_FS=y | 442 | CONFIG_SCSI_PROC_FS=y |
@@ -485,6 +459,7 @@ CONFIG_CHR_DEV_SG=m | |||
485 | # CONFIG_SCSI_CONSTANTS is not set | 459 | # CONFIG_SCSI_CONSTANTS is not set |
486 | # CONFIG_SCSI_LOGGING is not set | 460 | # CONFIG_SCSI_LOGGING is not set |
487 | # CONFIG_SCSI_SCAN_ASYNC is not set | 461 | # CONFIG_SCSI_SCAN_ASYNC is not set |
462 | CONFIG_SCSI_WAIT_SCAN=m | ||
488 | 463 | ||
489 | # | 464 | # |
490 | # SCSI Transports | 465 | # SCSI Transports |
@@ -492,7 +467,7 @@ CONFIG_CHR_DEV_SG=m | |||
492 | CONFIG_SCSI_SPI_ATTRS=y | 467 | CONFIG_SCSI_SPI_ATTRS=y |
493 | CONFIG_SCSI_FC_ATTRS=y | 468 | CONFIG_SCSI_FC_ATTRS=y |
494 | # CONFIG_SCSI_ISCSI_ATTRS is not set | 469 | # CONFIG_SCSI_ISCSI_ATTRS is not set |
495 | # CONFIG_SCSI_SAS_ATTRS is not set | 470 | CONFIG_SCSI_SAS_ATTRS=y |
496 | # CONFIG_SCSI_SAS_LIBSAS is not set | 471 | # CONFIG_SCSI_SAS_LIBSAS is not set |
497 | 472 | ||
498 | # | 473 | # |
@@ -531,15 +506,7 @@ CONFIG_SCSI_QLOGIC_1280=y | |||
531 | # CONFIG_SCSI_DC390T is not set | 506 | # CONFIG_SCSI_DC390T is not set |
532 | # CONFIG_SCSI_DEBUG is not set | 507 | # CONFIG_SCSI_DEBUG is not set |
533 | # CONFIG_SCSI_SRP is not set | 508 | # CONFIG_SCSI_SRP is not set |
534 | |||
535 | # | ||
536 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
537 | # | ||
538 | # CONFIG_ATA is not set | 509 | # CONFIG_ATA is not set |
539 | |||
540 | # | ||
541 | # Multi-device support (RAID and LVM) | ||
542 | # | ||
543 | CONFIG_MD=y | 510 | CONFIG_MD=y |
544 | CONFIG_BLK_DEV_MD=m | 511 | CONFIG_BLK_DEV_MD=m |
545 | CONFIG_MD_LINEAR=m | 512 | CONFIG_MD_LINEAR=m |
@@ -557,6 +524,8 @@ CONFIG_DM_MIRROR=m | |||
557 | CONFIG_DM_ZERO=m | 524 | CONFIG_DM_ZERO=m |
558 | CONFIG_DM_MULTIPATH=m | 525 | CONFIG_DM_MULTIPATH=m |
559 | # CONFIG_DM_MULTIPATH_EMC is not set | 526 | # CONFIG_DM_MULTIPATH_EMC is not set |
527 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
528 | # CONFIG_DM_DELAY is not set | ||
560 | 529 | ||
561 | # | 530 | # |
562 | # Fusion MPT device support | 531 | # Fusion MPT device support |
@@ -564,53 +533,32 @@ CONFIG_DM_MULTIPATH=m | |||
564 | CONFIG_FUSION=y | 533 | CONFIG_FUSION=y |
565 | CONFIG_FUSION_SPI=y | 534 | CONFIG_FUSION_SPI=y |
566 | CONFIG_FUSION_FC=m | 535 | CONFIG_FUSION_FC=m |
567 | # CONFIG_FUSION_SAS is not set | 536 | CONFIG_FUSION_SAS=y |
568 | CONFIG_FUSION_MAX_SGE=128 | 537 | CONFIG_FUSION_MAX_SGE=128 |
569 | # CONFIG_FUSION_CTL is not set | 538 | # CONFIG_FUSION_CTL is not set |
570 | 539 | ||
571 | # | 540 | # |
572 | # IEEE 1394 (FireWire) support | 541 | # IEEE 1394 (FireWire) support |
573 | # | 542 | # |
543 | # CONFIG_FIREWIRE is not set | ||
574 | # CONFIG_IEEE1394 is not set | 544 | # CONFIG_IEEE1394 is not set |
575 | |||
576 | # | ||
577 | # I2O device support | ||
578 | # | ||
579 | # CONFIG_I2O is not set | 545 | # CONFIG_I2O is not set |
580 | |||
581 | # | ||
582 | # Network device support | ||
583 | # | ||
584 | CONFIG_NETDEVICES=y | 546 | CONFIG_NETDEVICES=y |
547 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
585 | CONFIG_DUMMY=m | 548 | CONFIG_DUMMY=m |
586 | # CONFIG_BONDING is not set | 549 | # CONFIG_BONDING is not set |
550 | # CONFIG_MACVLAN is not set | ||
587 | # CONFIG_EQUALIZER is not set | 551 | # CONFIG_EQUALIZER is not set |
588 | # CONFIG_TUN is not set | 552 | # CONFIG_TUN is not set |
589 | # CONFIG_NET_SB1000 is not set | 553 | # CONFIG_NET_SB1000 is not set |
590 | |||
591 | # | ||
592 | # ARCnet devices | ||
593 | # | ||
594 | # CONFIG_ARCNET is not set | 554 | # CONFIG_ARCNET is not set |
595 | |||
596 | # | ||
597 | # PHY device support | ||
598 | # | ||
599 | # CONFIG_PHYLIB is not set | 555 | # CONFIG_PHYLIB is not set |
600 | |||
601 | # | ||
602 | # Ethernet (10 or 100Mbit) | ||
603 | # | ||
604 | CONFIG_NET_ETHERNET=y | 556 | CONFIG_NET_ETHERNET=y |
605 | CONFIG_MII=m | 557 | CONFIG_MII=m |
606 | # CONFIG_HAPPYMEAL is not set | 558 | # CONFIG_HAPPYMEAL is not set |
607 | # CONFIG_SUNGEM is not set | 559 | # CONFIG_SUNGEM is not set |
608 | # CONFIG_CASSINI is not set | 560 | # CONFIG_CASSINI is not set |
609 | # CONFIG_NET_VENDOR_3COM is not set | 561 | # CONFIG_NET_VENDOR_3COM is not set |
610 | |||
611 | # | ||
612 | # Tulip family network device support | ||
613 | # | ||
614 | CONFIG_NET_TULIP=y | 562 | CONFIG_NET_TULIP=y |
615 | # CONFIG_DE2104X is not set | 563 | # CONFIG_DE2104X is not set |
616 | CONFIG_TULIP=m | 564 | CONFIG_TULIP=m |
@@ -641,10 +589,7 @@ CONFIG_E100=m | |||
641 | # CONFIG_SUNDANCE is not set | 589 | # CONFIG_SUNDANCE is not set |
642 | # CONFIG_VIA_RHINE is not set | 590 | # CONFIG_VIA_RHINE is not set |
643 | # CONFIG_SC92031 is not set | 591 | # CONFIG_SC92031 is not set |
644 | 592 | CONFIG_NETDEV_1000=y | |
645 | # | ||
646 | # Ethernet (1000 Mbit) | ||
647 | # | ||
648 | # CONFIG_ACENIC is not set | 593 | # CONFIG_ACENIC is not set |
649 | # CONFIG_DL2K is not set | 594 | # CONFIG_DL2K is not set |
650 | CONFIG_E1000=y | 595 | CONFIG_E1000=y |
@@ -657,36 +602,36 @@ CONFIG_E1000=y | |||
657 | # CONFIG_SIS190 is not set | 602 | # CONFIG_SIS190 is not set |
658 | # CONFIG_SKGE is not set | 603 | # CONFIG_SKGE is not set |
659 | # CONFIG_SKY2 is not set | 604 | # CONFIG_SKY2 is not set |
660 | # CONFIG_SK98LIN is not set | ||
661 | # CONFIG_VIA_VELOCITY is not set | 605 | # CONFIG_VIA_VELOCITY is not set |
662 | CONFIG_TIGON3=y | 606 | CONFIG_TIGON3=y |
663 | # CONFIG_BNX2 is not set | 607 | # CONFIG_BNX2 is not set |
664 | # CONFIG_QLA3XXX is not set | 608 | # CONFIG_QLA3XXX is not set |
665 | # CONFIG_ATL1 is not set | 609 | # CONFIG_ATL1 is not set |
666 | 610 | CONFIG_NETDEV_10000=y | |
667 | # | ||
668 | # Ethernet (10000 Mbit) | ||
669 | # | ||
670 | # CONFIG_CHELSIO_T1 is not set | 611 | # CONFIG_CHELSIO_T1 is not set |
671 | # CONFIG_CHELSIO_T3 is not set | 612 | # CONFIG_CHELSIO_T3 is not set |
672 | # CONFIG_IXGB is not set | 613 | # CONFIG_IXGB is not set |
673 | # CONFIG_S2IO is not set | 614 | # CONFIG_S2IO is not set |
674 | # CONFIG_MYRI10GE is not set | 615 | # CONFIG_MYRI10GE is not set |
675 | # CONFIG_NETXEN_NIC is not set | 616 | # CONFIG_NETXEN_NIC is not set |
676 | 617 | # CONFIG_MLX4_CORE is not set | |
677 | # | ||
678 | # Token Ring devices | ||
679 | # | ||
680 | # CONFIG_TR is not set | 618 | # CONFIG_TR is not set |
681 | 619 | ||
682 | # | 620 | # |
683 | # Wireless LAN (non-hamradio) | 621 | # Wireless LAN |
684 | # | 622 | # |
685 | # CONFIG_NET_RADIO is not set | 623 | # CONFIG_WLAN_PRE80211 is not set |
624 | # CONFIG_WLAN_80211 is not set | ||
686 | 625 | ||
687 | # | 626 | # |
688 | # Wan interfaces | 627 | # USB Network Adapters |
689 | # | 628 | # |
629 | # CONFIG_USB_CATC is not set | ||
630 | # CONFIG_USB_KAWETH is not set | ||
631 | # CONFIG_USB_PEGASUS is not set | ||
632 | # CONFIG_USB_RTL8150 is not set | ||
633 | # CONFIG_USB_USBNET_MII is not set | ||
634 | # CONFIG_USB_USBNET is not set | ||
690 | # CONFIG_WAN is not set | 635 | # CONFIG_WAN is not set |
691 | # CONFIG_FDDI is not set | 636 | # CONFIG_FDDI is not set |
692 | # CONFIG_HIPPI is not set | 637 | # CONFIG_HIPPI is not set |
@@ -696,18 +641,9 @@ CONFIG_TIGON3=y | |||
696 | # CONFIG_SHAPER is not set | 641 | # CONFIG_SHAPER is not set |
697 | CONFIG_NETCONSOLE=y | 642 | CONFIG_NETCONSOLE=y |
698 | CONFIG_NETPOLL=y | 643 | CONFIG_NETPOLL=y |
699 | # CONFIG_NETPOLL_RX is not set | ||
700 | # CONFIG_NETPOLL_TRAP is not set | 644 | # CONFIG_NETPOLL_TRAP is not set |
701 | CONFIG_NET_POLL_CONTROLLER=y | 645 | CONFIG_NET_POLL_CONTROLLER=y |
702 | |||
703 | # | ||
704 | # ISDN subsystem | ||
705 | # | ||
706 | # CONFIG_ISDN is not set | 646 | # CONFIG_ISDN is not set |
707 | |||
708 | # | ||
709 | # Telephony Support | ||
710 | # | ||
711 | # CONFIG_PHONE is not set | 647 | # CONFIG_PHONE is not set |
712 | 648 | ||
713 | # | 649 | # |
@@ -715,6 +651,7 @@ CONFIG_NET_POLL_CONTROLLER=y | |||
715 | # | 651 | # |
716 | CONFIG_INPUT=y | 652 | CONFIG_INPUT=y |
717 | # CONFIG_INPUT_FF_MEMLESS is not set | 653 | # CONFIG_INPUT_FF_MEMLESS is not set |
654 | # CONFIG_INPUT_POLLDEV is not set | ||
718 | 655 | ||
719 | # | 656 | # |
720 | # Userland interfaces | 657 | # Userland interfaces |
@@ -740,9 +677,17 @@ CONFIG_KEYBOARD_ATKBD=y | |||
740 | # CONFIG_KEYBOARD_STOWAWAY is not set | 677 | # CONFIG_KEYBOARD_STOWAWAY is not set |
741 | CONFIG_INPUT_MOUSE=y | 678 | CONFIG_INPUT_MOUSE=y |
742 | CONFIG_MOUSE_PS2=y | 679 | CONFIG_MOUSE_PS2=y |
680 | CONFIG_MOUSE_PS2_ALPS=y | ||
681 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
682 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
683 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
684 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
685 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
743 | # CONFIG_MOUSE_SERIAL is not set | 686 | # CONFIG_MOUSE_SERIAL is not set |
687 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
744 | # CONFIG_MOUSE_VSXXXAA is not set | 688 | # CONFIG_MOUSE_VSXXXAA is not set |
745 | # CONFIG_INPUT_JOYSTICK is not set | 689 | # CONFIG_INPUT_JOYSTICK is not set |
690 | # CONFIG_INPUT_TABLET is not set | ||
746 | # CONFIG_INPUT_TOUCHSCREEN is not set | 691 | # CONFIG_INPUT_TOUCHSCREEN is not set |
747 | # CONFIG_INPUT_MISC is not set | 692 | # CONFIG_INPUT_MISC is not set |
748 | 693 | ||
@@ -814,19 +759,10 @@ CONFIG_SERIAL_SGI_IOC4=y | |||
814 | CONFIG_UNIX98_PTYS=y | 759 | CONFIG_UNIX98_PTYS=y |
815 | CONFIG_LEGACY_PTYS=y | 760 | CONFIG_LEGACY_PTYS=y |
816 | CONFIG_LEGACY_PTY_COUNT=256 | 761 | CONFIG_LEGACY_PTY_COUNT=256 |
817 | |||
818 | # | ||
819 | # IPMI | ||
820 | # | ||
821 | # CONFIG_IPMI_HANDLER is not set | 762 | # CONFIG_IPMI_HANDLER is not set |
822 | |||
823 | # | ||
824 | # Watchdog Cards | ||
825 | # | ||
826 | # CONFIG_WATCHDOG is not set | 763 | # CONFIG_WATCHDOG is not set |
827 | # CONFIG_HW_RANDOM is not set | 764 | # CONFIG_HW_RANDOM is not set |
828 | CONFIG_EFI_RTC=y | 765 | CONFIG_EFI_RTC=y |
829 | # CONFIG_DTLK is not set | ||
830 | # CONFIG_R3964 is not set | 766 | # CONFIG_R3964 is not set |
831 | # CONFIG_APPLICOM is not set | 767 | # CONFIG_APPLICOM is not set |
832 | CONFIG_AGP=m | 768 | CONFIG_AGP=m |
@@ -848,15 +784,8 @@ CONFIG_HPET=y | |||
848 | CONFIG_HPET_MMAP=y | 784 | CONFIG_HPET_MMAP=y |
849 | # CONFIG_HANGCHECK_TIMER is not set | 785 | # CONFIG_HANGCHECK_TIMER is not set |
850 | CONFIG_MMTIMER=y | 786 | CONFIG_MMTIMER=y |
851 | |||
852 | # | ||
853 | # TPM devices | ||
854 | # | ||
855 | # CONFIG_TCG_TPM is not set | 787 | # CONFIG_TCG_TPM is not set |
856 | 788 | CONFIG_DEVPORT=y | |
857 | # | ||
858 | # I2C support | ||
859 | # | ||
860 | # CONFIG_I2C is not set | 789 | # CONFIG_I2C is not set |
861 | 790 | ||
862 | # | 791 | # |
@@ -864,21 +793,17 @@ CONFIG_MMTIMER=y | |||
864 | # | 793 | # |
865 | # CONFIG_SPI is not set | 794 | # CONFIG_SPI is not set |
866 | # CONFIG_SPI_MASTER is not set | 795 | # CONFIG_SPI_MASTER is not set |
867 | |||
868 | # | ||
869 | # Dallas's 1-wire bus | ||
870 | # | ||
871 | # CONFIG_W1 is not set | 796 | # CONFIG_W1 is not set |
872 | 797 | # CONFIG_POWER_SUPPLY is not set | |
873 | # | ||
874 | # Hardware Monitoring support | ||
875 | # | ||
876 | CONFIG_HWMON=y | 798 | CONFIG_HWMON=y |
877 | # CONFIG_HWMON_VID is not set | 799 | # CONFIG_HWMON_VID is not set |
878 | # CONFIG_SENSORS_ABITUGURU is not set | 800 | # CONFIG_SENSORS_ABITUGURU is not set |
879 | # CONFIG_SENSORS_F71805F is not set | 801 | # CONFIG_SENSORS_F71805F is not set |
880 | # CONFIG_SENSORS_PC87427 is not set | 802 | # CONFIG_SENSORS_PC87427 is not set |
803 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
804 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
881 | # CONFIG_SENSORS_VT1211 is not set | 805 | # CONFIG_SENSORS_VT1211 is not set |
806 | # CONFIG_SENSORS_W83627HF is not set | ||
882 | # CONFIG_HWMON_DEBUG_CHIP is not set | 807 | # CONFIG_HWMON_DEBUG_CHIP is not set |
883 | 808 | ||
884 | # | 809 | # |
@@ -890,17 +815,20 @@ CONFIG_HWMON=y | |||
890 | # Multimedia devices | 815 | # Multimedia devices |
891 | # | 816 | # |
892 | # CONFIG_VIDEO_DEV is not set | 817 | # CONFIG_VIDEO_DEV is not set |
893 | 818 | # CONFIG_DVB_CORE is not set | |
894 | # | 819 | CONFIG_DAB=y |
895 | # Digital Video Broadcasting Devices | ||
896 | # | ||
897 | # CONFIG_DVB is not set | ||
898 | # CONFIG_USB_DABUSB is not set | 820 | # CONFIG_USB_DABUSB is not set |
899 | 821 | ||
900 | # | 822 | # |
901 | # Graphics support | 823 | # Graphics support |
902 | # | 824 | # |
903 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 825 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
826 | |||
827 | # | ||
828 | # Display device support | ||
829 | # | ||
830 | # CONFIG_DISPLAY_SUPPORT is not set | ||
831 | # CONFIG_VGASTATE is not set | ||
904 | # CONFIG_FB is not set | 832 | # CONFIG_FB is not set |
905 | 833 | ||
906 | # | 834 | # |
@@ -1014,9 +942,10 @@ CONFIG_SND_FM801=m | |||
1014 | # USB devices | 942 | # USB devices |
1015 | # | 943 | # |
1016 | # CONFIG_SND_USB_AUDIO is not set | 944 | # CONFIG_SND_USB_AUDIO is not set |
945 | # CONFIG_SND_USB_CAIAQ is not set | ||
1017 | 946 | ||
1018 | # | 947 | # |
1019 | # SoC audio support | 948 | # System on Chip audio support |
1020 | # | 949 | # |
1021 | # CONFIG_SND_SOC is not set | 950 | # CONFIG_SND_SOC is not set |
1022 | 951 | ||
@@ -1025,16 +954,24 @@ CONFIG_SND_FM801=m | |||
1025 | # | 954 | # |
1026 | # CONFIG_SOUND_PRIME is not set | 955 | # CONFIG_SOUND_PRIME is not set |
1027 | CONFIG_AC97_BUS=m | 956 | CONFIG_AC97_BUS=m |
957 | CONFIG_HID_SUPPORT=y | ||
958 | CONFIG_HID=y | ||
959 | # CONFIG_HID_DEBUG is not set | ||
1028 | 960 | ||
1029 | # | 961 | # |
1030 | # HID Devices | 962 | # USB Input Devices |
1031 | # | 963 | # |
1032 | CONFIG_HID=y | 964 | CONFIG_USB_HID=m |
1033 | # CONFIG_HID_DEBUG is not set | 965 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set |
966 | # CONFIG_HID_FF is not set | ||
967 | # CONFIG_USB_HIDDEV is not set | ||
1034 | 968 | ||
1035 | # | 969 | # |
1036 | # USB support | 970 | # USB HID Boot Protocol drivers |
1037 | # | 971 | # |
972 | # CONFIG_USB_KBD is not set | ||
973 | # CONFIG_USB_MOUSE is not set | ||
974 | CONFIG_USB_SUPPORT=y | ||
1038 | CONFIG_USB_ARCH_HAS_HCD=y | 975 | CONFIG_USB_ARCH_HAS_HCD=y |
1039 | CONFIG_USB_ARCH_HAS_OHCI=y | 976 | CONFIG_USB_ARCH_HAS_OHCI=y |
1040 | CONFIG_USB_ARCH_HAS_EHCI=y | 977 | CONFIG_USB_ARCH_HAS_EHCI=y |
@@ -1045,8 +982,10 @@ CONFIG_USB=m | |||
1045 | # Miscellaneous USB options | 982 | # Miscellaneous USB options |
1046 | # | 983 | # |
1047 | CONFIG_USB_DEVICEFS=y | 984 | CONFIG_USB_DEVICEFS=y |
985 | CONFIG_USB_DEVICE_CLASS=y | ||
1048 | # CONFIG_USB_DYNAMIC_MINORS is not set | 986 | # CONFIG_USB_DYNAMIC_MINORS is not set |
1049 | # CONFIG_USB_SUSPEND is not set | 987 | # CONFIG_USB_SUSPEND is not set |
988 | # CONFIG_USB_PERSIST is not set | ||
1050 | # CONFIG_USB_OTG is not set | 989 | # CONFIG_USB_OTG is not set |
1051 | 990 | ||
1052 | # | 991 | # |
@@ -1056,7 +995,6 @@ CONFIG_USB_EHCI_HCD=m | |||
1056 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 995 | # CONFIG_USB_EHCI_SPLIT_ISO is not set |
1057 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 996 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
1058 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 997 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
1059 | # CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set | ||
1060 | # CONFIG_USB_ISP116X_HCD is not set | 998 | # CONFIG_USB_ISP116X_HCD is not set |
1061 | CONFIG_USB_OHCI_HCD=m | 999 | CONFIG_USB_OHCI_HCD=m |
1062 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | 1000 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set |
@@ -1064,6 +1002,7 @@ CONFIG_USB_OHCI_HCD=m | |||
1064 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | 1002 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y |
1065 | CONFIG_USB_UHCI_HCD=m | 1003 | CONFIG_USB_UHCI_HCD=m |
1066 | # CONFIG_USB_SL811_HCD is not set | 1004 | # CONFIG_USB_SL811_HCD is not set |
1005 | # CONFIG_USB_R8A66597_HCD is not set | ||
1067 | 1006 | ||
1068 | # | 1007 | # |
1069 | # USB Device Class drivers | 1008 | # USB Device Class drivers |
@@ -1093,47 +1032,10 @@ CONFIG_USB_STORAGE=m | |||
1093 | # CONFIG_USB_LIBUSUAL is not set | 1032 | # CONFIG_USB_LIBUSUAL is not set |
1094 | 1033 | ||
1095 | # | 1034 | # |
1096 | # USB Input Devices | ||
1097 | # | ||
1098 | CONFIG_USB_HID=m | ||
1099 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
1100 | # CONFIG_HID_FF is not set | ||
1101 | # CONFIG_USB_HIDDEV is not set | ||
1102 | |||
1103 | # | ||
1104 | # USB HID Boot Protocol drivers | ||
1105 | # | ||
1106 | # CONFIG_USB_KBD is not set | ||
1107 | # CONFIG_USB_MOUSE is not set | ||
1108 | # CONFIG_USB_AIPTEK is not set | ||
1109 | # CONFIG_USB_WACOM is not set | ||
1110 | # CONFIG_USB_ACECAD is not set | ||
1111 | # CONFIG_USB_KBTAB is not set | ||
1112 | # CONFIG_USB_POWERMATE is not set | ||
1113 | # CONFIG_USB_TOUCHSCREEN is not set | ||
1114 | # CONFIG_USB_YEALINK is not set | ||
1115 | # CONFIG_USB_XPAD is not set | ||
1116 | # CONFIG_USB_ATI_REMOTE is not set | ||
1117 | # CONFIG_USB_ATI_REMOTE2 is not set | ||
1118 | # CONFIG_USB_KEYSPAN_REMOTE is not set | ||
1119 | # CONFIG_USB_APPLETOUCH is not set | ||
1120 | # CONFIG_USB_GTCO is not set | ||
1121 | |||
1122 | # | ||
1123 | # USB Imaging devices | 1035 | # USB Imaging devices |
1124 | # | 1036 | # |
1125 | # CONFIG_USB_MDC800 is not set | 1037 | # CONFIG_USB_MDC800 is not set |
1126 | # CONFIG_USB_MICROTEK is not set | 1038 | # CONFIG_USB_MICROTEK is not set |
1127 | |||
1128 | # | ||
1129 | # USB Network Adapters | ||
1130 | # | ||
1131 | # CONFIG_USB_CATC is not set | ||
1132 | # CONFIG_USB_KAWETH is not set | ||
1133 | # CONFIG_USB_PEGASUS is not set | ||
1134 | # CONFIG_USB_RTL8150 is not set | ||
1135 | # CONFIG_USB_USBNET_MII is not set | ||
1136 | # CONFIG_USB_USBNET is not set | ||
1137 | CONFIG_USB_MON=y | 1039 | CONFIG_USB_MON=y |
1138 | 1040 | ||
1139 | # | 1041 | # |
@@ -1177,10 +1079,6 @@ CONFIG_USB_MON=y | |||
1177 | # USB Gadget Support | 1079 | # USB Gadget Support |
1178 | # | 1080 | # |
1179 | # CONFIG_USB_GADGET is not set | 1081 | # CONFIG_USB_GADGET is not set |
1180 | |||
1181 | # | ||
1182 | # MMC/SD Card support | ||
1183 | # | ||
1184 | # CONFIG_MMC is not set | 1082 | # CONFIG_MMC is not set |
1185 | 1083 | ||
1186 | # | 1084 | # |
@@ -1195,10 +1093,6 @@ CONFIG_USB_MON=y | |||
1195 | # | 1093 | # |
1196 | # LED Triggers | 1094 | # LED Triggers |
1197 | # | 1095 | # |
1198 | |||
1199 | # | ||
1200 | # InfiniBand support | ||
1201 | # | ||
1202 | CONFIG_INFINIBAND=m | 1096 | CONFIG_INFINIBAND=m |
1203 | # CONFIG_INFINIBAND_USER_MAD is not set | 1097 | # CONFIG_INFINIBAND_USER_MAD is not set |
1204 | # CONFIG_INFINIBAND_USER_ACCESS is not set | 1098 | # CONFIG_INFINIBAND_USER_ACCESS is not set |
@@ -1206,6 +1100,7 @@ CONFIG_INFINIBAND_ADDR_TRANS=y | |||
1206 | CONFIG_INFINIBAND_MTHCA=m | 1100 | CONFIG_INFINIBAND_MTHCA=m |
1207 | CONFIG_INFINIBAND_MTHCA_DEBUG=y | 1101 | CONFIG_INFINIBAND_MTHCA_DEBUG=y |
1208 | # CONFIG_INFINIBAND_AMSO1100 is not set | 1102 | # CONFIG_INFINIBAND_AMSO1100 is not set |
1103 | # CONFIG_MLX4_INFINIBAND is not set | ||
1209 | CONFIG_INFINIBAND_IPOIB=m | 1104 | CONFIG_INFINIBAND_IPOIB=m |
1210 | # CONFIG_INFINIBAND_IPOIB_CM is not set | 1105 | # CONFIG_INFINIBAND_IPOIB_CM is not set |
1211 | CONFIG_INFINIBAND_IPOIB_DEBUG=y | 1106 | CONFIG_INFINIBAND_IPOIB_DEBUG=y |
@@ -1214,10 +1109,6 @@ CONFIG_INFINIBAND_IPOIB_DEBUG=y | |||
1214 | # CONFIG_INFINIBAND_ISER is not set | 1109 | # CONFIG_INFINIBAND_ISER is not set |
1215 | 1110 | ||
1216 | # | 1111 | # |
1217 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
1218 | # | ||
1219 | |||
1220 | # | ||
1221 | # Real Time Clock | 1112 | # Real Time Clock |
1222 | # | 1113 | # |
1223 | # CONFIG_RTC_CLASS is not set | 1114 | # CONFIG_RTC_CLASS is not set |
@@ -1236,12 +1127,9 @@ CONFIG_INFINIBAND_IPOIB_DEBUG=y | |||
1236 | # | 1127 | # |
1237 | 1128 | ||
1238 | # | 1129 | # |
1239 | # Auxiliary Display support | 1130 | # Userspace I/O |
1240 | # | ||
1241 | |||
1242 | # | ||
1243 | # Virtualization | ||
1244 | # | 1131 | # |
1132 | # CONFIG_UIO is not set | ||
1245 | # CONFIG_MSPEC is not set | 1133 | # CONFIG_MSPEC is not set |
1246 | 1134 | ||
1247 | # | 1135 | # |
@@ -1357,7 +1245,8 @@ CONFIG_EXPORTFS=m | |||
1357 | CONFIG_NFS_COMMON=y | 1245 | CONFIG_NFS_COMMON=y |
1358 | CONFIG_SUNRPC=m | 1246 | CONFIG_SUNRPC=m |
1359 | CONFIG_SUNRPC_GSS=m | 1247 | CONFIG_SUNRPC_GSS=m |
1360 | CONFIG_RPCSEC_GSS_KRB5=m | 1248 | # CONFIG_SUNRPC_BIND34 is not set |
1249 | CONFIG_RPCSEC_GSS_KRB5=y | ||
1361 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1250 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1362 | CONFIG_SMB_FS=m | 1251 | CONFIG_SMB_FS=m |
1363 | CONFIG_SMB_NLS_DEFAULT=y | 1252 | CONFIG_SMB_NLS_DEFAULT=y |
@@ -1371,7 +1260,6 @@ CONFIG_CIFS=m | |||
1371 | # CONFIG_NCP_FS is not set | 1260 | # CONFIG_NCP_FS is not set |
1372 | # CONFIG_CODA_FS is not set | 1261 | # CONFIG_CODA_FS is not set |
1373 | # CONFIG_AFS_FS is not set | 1262 | # CONFIG_AFS_FS is not set |
1374 | # CONFIG_9P_FS is not set | ||
1375 | 1263 | ||
1376 | # | 1264 | # |
1377 | # Partition Types | 1265 | # Partition Types |
@@ -1393,6 +1281,7 @@ CONFIG_SGI_PARTITION=y | |||
1393 | # CONFIG_SUN_PARTITION is not set | 1281 | # CONFIG_SUN_PARTITION is not set |
1394 | # CONFIG_KARMA_PARTITION is not set | 1282 | # CONFIG_KARMA_PARTITION is not set |
1395 | CONFIG_EFI_PARTITION=y | 1283 | CONFIG_EFI_PARTITION=y |
1284 | # CONFIG_SYSV68_PARTITION is not set | ||
1396 | 1285 | ||
1397 | # | 1286 | # |
1398 | # Native Language Support | 1287 | # Native Language Support |
@@ -1449,11 +1338,14 @@ CONFIG_NLS_UTF8=m | |||
1449 | CONFIG_BITREVERSE=y | 1338 | CONFIG_BITREVERSE=y |
1450 | # CONFIG_CRC_CCITT is not set | 1339 | # CONFIG_CRC_CCITT is not set |
1451 | # CONFIG_CRC16 is not set | 1340 | # CONFIG_CRC16 is not set |
1341 | # CONFIG_CRC_ITU_T is not set | ||
1452 | CONFIG_CRC32=y | 1342 | CONFIG_CRC32=y |
1343 | # CONFIG_CRC7 is not set | ||
1453 | # CONFIG_LIBCRC32C is not set | 1344 | # CONFIG_LIBCRC32C is not set |
1454 | CONFIG_PLIST=y | 1345 | CONFIG_PLIST=y |
1455 | CONFIG_HAS_IOMEM=y | 1346 | CONFIG_HAS_IOMEM=y |
1456 | CONFIG_HAS_IOPORT=y | 1347 | CONFIG_HAS_IOPORT=y |
1348 | CONFIG_HAS_DMA=y | ||
1457 | CONFIG_GENERIC_HARDIRQS=y | 1349 | CONFIG_GENERIC_HARDIRQS=y |
1458 | CONFIG_GENERIC_IRQ_PROBE=y | 1350 | CONFIG_GENERIC_IRQ_PROBE=y |
1459 | CONFIG_GENERIC_PENDING_IRQ=y | 1351 | CONFIG_GENERIC_PENDING_IRQ=y |
@@ -1483,8 +1375,8 @@ CONFIG_MAGIC_SYSRQ=y | |||
1483 | # CONFIG_HEADERS_CHECK is not set | 1375 | # CONFIG_HEADERS_CHECK is not set |
1484 | CONFIG_DEBUG_KERNEL=y | 1376 | CONFIG_DEBUG_KERNEL=y |
1485 | # CONFIG_DEBUG_SHIRQ is not set | 1377 | # CONFIG_DEBUG_SHIRQ is not set |
1486 | CONFIG_LOG_BUF_SHIFT=20 | ||
1487 | CONFIG_DETECT_SOFTLOCKUP=y | 1378 | CONFIG_DETECT_SOFTLOCKUP=y |
1379 | CONFIG_SCHED_DEBUG=y | ||
1488 | # CONFIG_SCHEDSTATS is not set | 1380 | # CONFIG_SCHEDSTATS is not set |
1489 | # CONFIG_TIMER_STATS is not set | 1381 | # CONFIG_TIMER_STATS is not set |
1490 | # CONFIG_DEBUG_SLAB is not set | 1382 | # CONFIG_DEBUG_SLAB is not set |
@@ -1514,10 +1406,6 @@ CONFIG_SYSVIPC_COMPAT=y | |||
1514 | # | 1406 | # |
1515 | # CONFIG_KEYS is not set | 1407 | # CONFIG_KEYS is not set |
1516 | # CONFIG_SECURITY is not set | 1408 | # CONFIG_SECURITY is not set |
1517 | |||
1518 | # | ||
1519 | # Cryptographic options | ||
1520 | # | ||
1521 | CONFIG_CRYPTO=y | 1409 | CONFIG_CRYPTO=y |
1522 | CONFIG_CRYPTO_ALGAPI=y | 1410 | CONFIG_CRYPTO_ALGAPI=y |
1523 | CONFIG_CRYPTO_BLKCIPHER=m | 1411 | CONFIG_CRYPTO_BLKCIPHER=m |
@@ -1537,6 +1425,7 @@ CONFIG_CRYPTO_ECB=m | |||
1537 | CONFIG_CRYPTO_CBC=m | 1425 | CONFIG_CRYPTO_CBC=m |
1538 | CONFIG_CRYPTO_PCBC=m | 1426 | CONFIG_CRYPTO_PCBC=m |
1539 | # CONFIG_CRYPTO_LRW is not set | 1427 | # CONFIG_CRYPTO_LRW is not set |
1428 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1540 | CONFIG_CRYPTO_DES=m | 1429 | CONFIG_CRYPTO_DES=m |
1541 | # CONFIG_CRYPTO_FCRYPT is not set | 1430 | # CONFIG_CRYPTO_FCRYPT is not set |
1542 | # CONFIG_CRYPTO_BLOWFISH is not set | 1431 | # CONFIG_CRYPTO_BLOWFISH is not set |
@@ -1554,7 +1443,4 @@ CONFIG_CRYPTO_DES=m | |||
1554 | # CONFIG_CRYPTO_CRC32C is not set | 1443 | # CONFIG_CRYPTO_CRC32C is not set |
1555 | # CONFIG_CRYPTO_CAMELLIA is not set | 1444 | # CONFIG_CRYPTO_CAMELLIA is not set |
1556 | # CONFIG_CRYPTO_TEST is not set | 1445 | # CONFIG_CRYPTO_TEST is not set |
1557 | 1446 | CONFIG_CRYPTO_HW=y | |
1558 | # | ||
1559 | # Hardware crypto devices | ||
1560 | # | ||
diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c index 2236fabbb3c6..0aebc6f79e95 100644 --- a/arch/ia64/kernel/asm-offsets.c +++ b/arch/ia64/kernel/asm-offsets.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #define ASM_OFFSETS_C 1 | 7 | #define ASM_OFFSETS_C 1 |
8 | 8 | ||
9 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
10 | #include <linux/clocksource.h> | ||
10 | 11 | ||
11 | #include <asm-ia64/processor.h> | 12 | #include <asm-ia64/processor.h> |
12 | #include <asm-ia64/ptrace.h> | 13 | #include <asm-ia64/ptrace.h> |
@@ -15,6 +16,7 @@ | |||
15 | #include <asm-ia64/mca.h> | 16 | #include <asm-ia64/mca.h> |
16 | 17 | ||
17 | #include "../kernel/sigframe.h" | 18 | #include "../kernel/sigframe.h" |
19 | #include "../kernel/fsyscall_gtod_data.h" | ||
18 | 20 | ||
19 | #define DEFINE(sym, val) \ | 21 | #define DEFINE(sym, val) \ |
20 | asm volatile("\n->" #sym " %0 " #val : : "i" (val)) | 22 | asm volatile("\n->" #sym " %0 " #val : : "i" (val)) |
@@ -256,17 +258,24 @@ void foo(void) | |||
256 | BLANK(); | 258 | BLANK(); |
257 | 259 | ||
258 | /* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */ | 260 | /* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */ |
259 | DEFINE(IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET, offsetof (struct time_interpolator, addr)); | 261 | DEFINE(IA64_GTOD_LOCK_OFFSET, |
260 | DEFINE(IA64_TIME_INTERPOLATOR_SOURCE_OFFSET, offsetof (struct time_interpolator, source)); | 262 | offsetof (struct fsyscall_gtod_data_t, lock)); |
261 | DEFINE(IA64_TIME_INTERPOLATOR_SHIFT_OFFSET, offsetof (struct time_interpolator, shift)); | 263 | DEFINE(IA64_GTOD_WALL_TIME_OFFSET, |
262 | DEFINE(IA64_TIME_INTERPOLATOR_NSEC_OFFSET, offsetof (struct time_interpolator, nsec_per_cyc)); | 264 | offsetof (struct fsyscall_gtod_data_t, wall_time)); |
263 | DEFINE(IA64_TIME_INTERPOLATOR_OFFSET_OFFSET, offsetof (struct time_interpolator, offset)); | 265 | DEFINE(IA64_GTOD_MONO_TIME_OFFSET, |
264 | DEFINE(IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET, offsetof (struct time_interpolator, last_cycle)); | 266 | offsetof (struct fsyscall_gtod_data_t, monotonic_time)); |
265 | DEFINE(IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET, offsetof (struct time_interpolator, last_counter)); | 267 | DEFINE(IA64_CLKSRC_MASK_OFFSET, |
266 | DEFINE(IA64_TIME_INTERPOLATOR_JITTER_OFFSET, offsetof (struct time_interpolator, jitter)); | 268 | offsetof (struct fsyscall_gtod_data_t, clk_mask)); |
267 | DEFINE(IA64_TIME_INTERPOLATOR_MASK_OFFSET, offsetof (struct time_interpolator, mask)); | 269 | DEFINE(IA64_CLKSRC_MULT_OFFSET, |
268 | DEFINE(IA64_TIME_SOURCE_CPU, TIME_SOURCE_CPU); | 270 | offsetof (struct fsyscall_gtod_data_t, clk_mult)); |
269 | DEFINE(IA64_TIME_SOURCE_MMIO64, TIME_SOURCE_MMIO64); | 271 | DEFINE(IA64_CLKSRC_SHIFT_OFFSET, |
270 | DEFINE(IA64_TIME_SOURCE_MMIO32, TIME_SOURCE_MMIO32); | 272 | offsetof (struct fsyscall_gtod_data_t, clk_shift)); |
271 | DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET, offsetof (struct timespec, tv_nsec)); | 273 | DEFINE(IA64_CLKSRC_MMIO_OFFSET, |
274 | offsetof (struct fsyscall_gtod_data_t, clk_fsys_mmio)); | ||
275 | DEFINE(IA64_CLKSRC_CYCLE_LAST_OFFSET, | ||
276 | offsetof (struct fsyscall_gtod_data_t, clk_cycle_last)); | ||
277 | DEFINE(IA64_ITC_JITTER_OFFSET, | ||
278 | offsetof (struct itc_jitter_data_t, itc_jitter)); | ||
279 | DEFINE(IA64_ITC_LASTCYCLE_OFFSET, | ||
280 | offsetof (struct itc_jitter_data_t, itc_lastcycle)); | ||
272 | } | 281 | } |
diff --git a/arch/ia64/kernel/cyclone.c b/arch/ia64/kernel/cyclone.c index e00b21514f7c..2fd96d9062a1 100644 --- a/arch/ia64/kernel/cyclone.c +++ b/arch/ia64/kernel/cyclone.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <linux/time.h> | 3 | #include <linux/time.h> |
4 | #include <linux/errno.h> | 4 | #include <linux/errno.h> |
5 | #include <linux/timex.h> | 5 | #include <linux/timex.h> |
6 | #include <linux/clocksource.h> | ||
6 | #include <asm/io.h> | 7 | #include <asm/io.h> |
7 | 8 | ||
8 | /* IBM Summit (EXA) Cyclone counter code*/ | 9 | /* IBM Summit (EXA) Cyclone counter code*/ |
@@ -18,13 +19,21 @@ void __init cyclone_setup(void) | |||
18 | use_cyclone = 1; | 19 | use_cyclone = 1; |
19 | } | 20 | } |
20 | 21 | ||
22 | static void __iomem *cyclone_mc; | ||
21 | 23 | ||
22 | struct time_interpolator cyclone_interpolator = { | 24 | static cycle_t read_cyclone(void) |
23 | .source = TIME_SOURCE_MMIO64, | 25 | { |
24 | .shift = 16, | 26 | return (cycle_t)readq((void __iomem *)cyclone_mc); |
25 | .frequency = CYCLONE_TIMER_FREQ, | 27 | } |
26 | .drift = -100, | 28 | |
27 | .mask = (1LL << 40) - 1 | 29 | static struct clocksource clocksource_cyclone = { |
30 | .name = "cyclone", | ||
31 | .rating = 300, | ||
32 | .read = read_cyclone, | ||
33 | .mask = (1LL << 40) - 1, | ||
34 | .mult = 0, /*to be caluclated*/ | ||
35 | .shift = 16, | ||
36 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
28 | }; | 37 | }; |
29 | 38 | ||
30 | int __init init_cyclone_clock(void) | 39 | int __init init_cyclone_clock(void) |
@@ -44,13 +53,15 @@ int __init init_cyclone_clock(void) | |||
44 | offset = (CYCLONE_CBAR_ADDR); | 53 | offset = (CYCLONE_CBAR_ADDR); |
45 | reg = (u64*)ioremap_nocache(offset, sizeof(u64)); | 54 | reg = (u64*)ioremap_nocache(offset, sizeof(u64)); |
46 | if(!reg){ | 55 | if(!reg){ |
47 | printk(KERN_ERR "Summit chipset: Could not find valid CBAR register.\n"); | 56 | printk(KERN_ERR "Summit chipset: Could not find valid CBAR" |
57 | " register.\n"); | ||
48 | use_cyclone = 0; | 58 | use_cyclone = 0; |
49 | return -ENODEV; | 59 | return -ENODEV; |
50 | } | 60 | } |
51 | base = readq(reg); | 61 | base = readq(reg); |
52 | if(!base){ | 62 | if(!base){ |
53 | printk(KERN_ERR "Summit chipset: Could not find valid CBAR value.\n"); | 63 | printk(KERN_ERR "Summit chipset: Could not find valid CBAR" |
64 | " value.\n"); | ||
54 | use_cyclone = 0; | 65 | use_cyclone = 0; |
55 | return -ENODEV; | 66 | return -ENODEV; |
56 | } | 67 | } |
@@ -60,7 +71,8 @@ int __init init_cyclone_clock(void) | |||
60 | offset = (base + CYCLONE_PMCC_OFFSET); | 71 | offset = (base + CYCLONE_PMCC_OFFSET); |
61 | reg = (u64*)ioremap_nocache(offset, sizeof(u64)); | 72 | reg = (u64*)ioremap_nocache(offset, sizeof(u64)); |
62 | if(!reg){ | 73 | if(!reg){ |
63 | printk(KERN_ERR "Summit chipset: Could not find valid PMCC register.\n"); | 74 | printk(KERN_ERR "Summit chipset: Could not find valid PMCC" |
75 | " register.\n"); | ||
64 | use_cyclone = 0; | 76 | use_cyclone = 0; |
65 | return -ENODEV; | 77 | return -ENODEV; |
66 | } | 78 | } |
@@ -71,7 +83,8 @@ int __init init_cyclone_clock(void) | |||
71 | offset = (base + CYCLONE_MPCS_OFFSET); | 83 | offset = (base + CYCLONE_MPCS_OFFSET); |
72 | reg = (u64*)ioremap_nocache(offset, sizeof(u64)); | 84 | reg = (u64*)ioremap_nocache(offset, sizeof(u64)); |
73 | if(!reg){ | 85 | if(!reg){ |
74 | printk(KERN_ERR "Summit chipset: Could not find valid MPCS register.\n"); | 86 | printk(KERN_ERR "Summit chipset: Could not find valid MPCS" |
87 | " register.\n"); | ||
75 | use_cyclone = 0; | 88 | use_cyclone = 0; |
76 | return -ENODEV; | 89 | return -ENODEV; |
77 | } | 90 | } |
@@ -82,7 +95,8 @@ int __init init_cyclone_clock(void) | |||
82 | offset = (base + CYCLONE_MPMC_OFFSET); | 95 | offset = (base + CYCLONE_MPMC_OFFSET); |
83 | cyclone_timer = (u32*)ioremap_nocache(offset, sizeof(u32)); | 96 | cyclone_timer = (u32*)ioremap_nocache(offset, sizeof(u32)); |
84 | if(!cyclone_timer){ | 97 | if(!cyclone_timer){ |
85 | printk(KERN_ERR "Summit chipset: Could not find valid MPMC register.\n"); | 98 | printk(KERN_ERR "Summit chipset: Could not find valid MPMC" |
99 | " register.\n"); | ||
86 | use_cyclone = 0; | 100 | use_cyclone = 0; |
87 | return -ENODEV; | 101 | return -ENODEV; |
88 | } | 102 | } |
@@ -93,7 +107,8 @@ int __init init_cyclone_clock(void) | |||
93 | int stall = 100; | 107 | int stall = 100; |
94 | while(stall--) barrier(); | 108 | while(stall--) barrier(); |
95 | if(readl(cyclone_timer) == old){ | 109 | if(readl(cyclone_timer) == old){ |
96 | printk(KERN_ERR "Summit chipset: Counter not counting! DISABLED\n"); | 110 | printk(KERN_ERR "Summit chipset: Counter not counting!" |
111 | " DISABLED\n"); | ||
97 | iounmap(cyclone_timer); | 112 | iounmap(cyclone_timer); |
98 | cyclone_timer = 0; | 113 | cyclone_timer = 0; |
99 | use_cyclone = 0; | 114 | use_cyclone = 0; |
@@ -101,8 +116,11 @@ int __init init_cyclone_clock(void) | |||
101 | } | 116 | } |
102 | } | 117 | } |
103 | /* initialize last tick */ | 118 | /* initialize last tick */ |
104 | cyclone_interpolator.addr = cyclone_timer; | 119 | cyclone_mc = cyclone_timer; |
105 | register_time_interpolator(&cyclone_interpolator); | 120 | clocksource_cyclone.fsys_mmio = cyclone_timer; |
121 | clocksource_cyclone.mult = clocksource_hz2mult(CYCLONE_TIMER_FREQ, | ||
122 | clocksource_cyclone.shift); | ||
123 | clocksource_register(&clocksource_cyclone); | ||
106 | 124 | ||
107 | return 0; | 125 | return 0; |
108 | } | 126 | } |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 95f517515235..c36f43c94600 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1581,7 +1581,7 @@ sys_call_table: | |||
1581 | data8 sys_sync_file_range // 1300 | 1581 | data8 sys_sync_file_range // 1300 |
1582 | data8 sys_tee | 1582 | data8 sys_tee |
1583 | data8 sys_vmsplice | 1583 | data8 sys_vmsplice |
1584 | data8 sys_ni_syscall // reserved for move_pages | 1584 | data8 sys_fallocate |
1585 | data8 sys_getcpu | 1585 | data8 sys_getcpu |
1586 | data8 sys_epoll_pwait // 1305 | 1586 | data8 sys_epoll_pwait // 1305 |
1587 | data8 sys_utimensat | 1587 | data8 sys_utimensat |
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index 3f926c2dc708..44841971f077 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S | |||
@@ -147,12 +147,11 @@ ENTRY(fsys_set_tid_address) | |||
147 | FSYS_RETURN | 147 | FSYS_RETURN |
148 | END(fsys_set_tid_address) | 148 | END(fsys_set_tid_address) |
149 | 149 | ||
150 | /* | 150 | #if IA64_GTOD_LOCK_OFFSET !=0 |
151 | * Ensure that the time interpolator structure is compatible with the asm code | 151 | #error fsys_gettimeofday incompatible with changes to struct fsyscall_gtod_data_t |
152 | */ | 152 | #endif |
153 | #if IA64_TIME_INTERPOLATOR_SOURCE_OFFSET !=0 || IA64_TIME_INTERPOLATOR_SHIFT_OFFSET != 2 \ | 153 | #if IA64_ITC_JITTER_OFFSET !=0 |
154 | || IA64_TIME_INTERPOLATOR_JITTER_OFFSET != 3 || IA64_TIME_INTERPOLATOR_NSEC_OFFSET != 4 | 154 | #error fsys_gettimeofday incompatible with changes to struct itc_jitter_data_t |
155 | #error fsys_gettimeofday incompatible with changes to struct time_interpolator | ||
156 | #endif | 155 | #endif |
157 | #define CLOCK_REALTIME 0 | 156 | #define CLOCK_REALTIME 0 |
158 | #define CLOCK_MONOTONIC 1 | 157 | #define CLOCK_MONOTONIC 1 |
@@ -179,126 +178,124 @@ ENTRY(fsys_gettimeofday) | |||
179 | // r11 = preserved: saved ar.pfs | 178 | // r11 = preserved: saved ar.pfs |
180 | // r12 = preserved: memory stack | 179 | // r12 = preserved: memory stack |
181 | // r13 = preserved: thread pointer | 180 | // r13 = preserved: thread pointer |
182 | // r14 = address of mask / mask | 181 | // r14 = address of mask / mask value |
183 | // r15 = preserved: system call number | 182 | // r15 = preserved: system call number |
184 | // r16 = preserved: current task pointer | 183 | // r16 = preserved: current task pointer |
185 | // r17 = wall to monotonic use | 184 | // r17 = (not used) |
186 | // r18 = time_interpolator->offset | 185 | // r18 = (not used) |
187 | // r19 = address of wall_to_monotonic | 186 | // r19 = address of itc_lastcycle |
188 | // r20 = pointer to struct time_interpolator / pointer to time_interpolator->address | 187 | // r20 = struct fsyscall_gtod_data (= address of gtod_lock.sequence) |
189 | // r21 = shift factor | 188 | // r21 = address of mmio_ptr |
190 | // r22 = address of time interpolator->last_counter | 189 | // r22 = address of wall_time or monotonic_time |
191 | // r23 = address of time_interpolator->last_cycle | 190 | // r23 = address of shift / value |
192 | // r24 = adress of time_interpolator->offset | 191 | // r24 = address mult factor / cycle_last value |
193 | // r25 = last_cycle value | 192 | // r25 = itc_lastcycle value |
194 | // r26 = last_counter value | 193 | // r26 = address clocksource cycle_last |
195 | // r27 = pointer to xtime | 194 | // r27 = (not used) |
196 | // r28 = sequence number at the beginning of critcal section | 195 | // r28 = sequence number at the beginning of critcal section |
197 | // r29 = address of seqlock | 196 | // r29 = address of itc_jitter |
198 | // r30 = time processing flags / memory address | 197 | // r30 = time processing flags / memory address |
199 | // r31 = pointer to result | 198 | // r31 = pointer to result |
200 | // Predicates | 199 | // Predicates |
201 | // p6,p7 short term use | 200 | // p6,p7 short term use |
202 | // p8 = timesource ar.itc | 201 | // p8 = timesource ar.itc |
203 | // p9 = timesource mmio64 | 202 | // p9 = timesource mmio64 |
204 | // p10 = timesource mmio32 | 203 | // p10 = timesource mmio32 - not used |
205 | // p11 = timesource not to be handled by asm code | 204 | // p11 = timesource not to be handled by asm code |
206 | // p12 = memory time source ( = p9 | p10) | 205 | // p12 = memory time source ( = p9 | p10) - not used |
207 | // p13 = do cmpxchg with time_interpolator_last_cycle | 206 | // p13 = do cmpxchg with itc_lastcycle |
208 | // p14 = Divide by 1000 | 207 | // p14 = Divide by 1000 |
209 | // p15 = Add monotonic | 208 | // p15 = Add monotonic |
210 | // | 209 | // |
211 | // Note that instructions are optimized for McKinley. McKinley can process two | 210 | // Note that instructions are optimized for McKinley. McKinley can |
212 | // bundles simultaneously and therefore we continuously try to feed the CPU | 211 | // process two bundles simultaneously and therefore we continuously |
213 | // two bundles and then a stop. | 212 | // try to feed the CPU two bundles and then a stop. |
214 | tnat.nz p6,p0 = r31 // branch deferred since it does not fit into bundle structure | 213 | // |
214 | // Additional note that code has changed a lot. Optimization is TBD. | ||
215 | // Comments begin with "?" are maybe outdated. | ||
216 | tnat.nz p6,p0 = r31 // ? branch deferred to fit later bundle | ||
215 | mov pr = r30,0xc000 // Set predicates according to function | 217 | mov pr = r30,0xc000 // Set predicates according to function |
216 | add r2 = TI_FLAGS+IA64_TASK_SIZE,r16 | 218 | add r2 = TI_FLAGS+IA64_TASK_SIZE,r16 |
217 | movl r20 = time_interpolator | 219 | movl r20 = fsyscall_gtod_data // load fsyscall gettimeofday data address |
218 | ;; | 220 | ;; |
219 | ld8 r20 = [r20] // get pointer to time_interpolator structure | 221 | movl r29 = itc_jitter_data // itc_jitter |
220 | movl r29 = xtime_lock | 222 | add r22 = IA64_GTOD_WALL_TIME_OFFSET,r20 // wall_time |
221 | ld4 r2 = [r2] // process work pending flags | 223 | ld4 r2 = [r2] // process work pending flags |
222 | movl r27 = xtime | 224 | ;; |
223 | ;; // only one bundle here | 225 | (p15) add r22 = IA64_GTOD_MONO_TIME_OFFSET,r20 // monotonic_time |
224 | ld8 r21 = [r20] // first quad with control information | 226 | add r21 = IA64_CLKSRC_MMIO_OFFSET,r20 |
227 | add r19 = IA64_ITC_LASTCYCLE_OFFSET,r29 | ||
225 | and r2 = TIF_ALLWORK_MASK,r2 | 228 | and r2 = TIF_ALLWORK_MASK,r2 |
226 | (p6) br.cond.spnt.few .fail_einval // deferred branch | 229 | (p6) br.cond.spnt.few .fail_einval // ? deferred branch |
227 | ;; | 230 | ;; |
228 | add r10 = IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET,r20 | 231 | add r26 = IA64_CLKSRC_CYCLE_LAST_OFFSET,r20 // clksrc_cycle_last |
229 | extr r3 = r21,32,32 // time_interpolator->nsec_per_cyc | ||
230 | extr r8 = r21,0,16 // time_interpolator->source | ||
231 | cmp.ne p6, p0 = 0, r2 // Fallback if work is scheduled | 232 | cmp.ne p6, p0 = 0, r2 // Fallback if work is scheduled |
232 | (p6) br.cond.spnt.many fsys_fallback_syscall | 233 | (p6) br.cond.spnt.many fsys_fallback_syscall |
233 | ;; | 234 | ;; |
234 | cmp.eq p8,p12 = 0,r8 // Check for cpu timer | 235 | // Begin critical section |
235 | cmp.eq p9,p0 = 1,r8 // MMIO64 ? | 236 | .time_redo: |
236 | extr r2 = r21,24,8 // time_interpolator->jitter | 237 | ld4.acq r28 = [r20] // gtod_lock.sequence, Must take first |
237 | cmp.eq p10,p0 = 2,r8 // MMIO32 ? | 238 | ;; |
238 | cmp.ltu p11,p0 = 2,r8 // function or other clock | 239 | and r28 = ~1,r28 // And make sequence even to force retry if odd |
239 | (p11) br.cond.spnt.many fsys_fallback_syscall | ||
240 | ;; | 240 | ;; |
241 | setf.sig f7 = r3 // Setup for scaling of counter | 241 | ld8 r30 = [r21] // clocksource->mmio_ptr |
242 | (p15) movl r19 = wall_to_monotonic | 242 | add r24 = IA64_CLKSRC_MULT_OFFSET,r20 |
243 | (p12) ld8 r30 = [r10] | 243 | ld4 r2 = [r29] // itc_jitter value |
244 | cmp.ne p13,p0 = r2,r0 // need jitter compensation? | 244 | add r23 = IA64_CLKSRC_SHIFT_OFFSET,r20 |
245 | extr r21 = r21,16,8 // shift factor | 245 | add r14 = IA64_CLKSRC_MASK_OFFSET,r20 |
246 | ;; | 246 | ;; |
247 | .time_redo: | 247 | ld4 r3 = [r24] // clocksource mult value |
248 | .pred.rel.mutex p8,p9,p10 | 248 | ld8 r14 = [r14] // clocksource mask value |
249 | ld4.acq r28 = [r29] // xtime_lock.sequence. Must come first for locking purposes | 249 | cmp.eq p8,p9 = 0,r30 // use cpu timer if no mmio_ptr |
250 | ;; | 250 | ;; |
251 | and r28 = ~1,r28 // Make sequence even to force retry if odd | 251 | setf.sig f7 = r3 // Setup for mult scaling of counter |
252 | (p8) cmp.ne p13,p0 = r2,r0 // need itc_jitter compensation, set p13 | ||
253 | ld4 r23 = [r23] // clocksource shift value | ||
254 | ld8 r24 = [r26] // get clksrc_cycle_last value | ||
255 | (p9) cmp.eq p13,p0 = 0,r30 // if mmio_ptr, clear p13 jitter control | ||
252 | ;; | 256 | ;; |
257 | .pred.rel.mutex p8,p9 | ||
253 | (p8) mov r2 = ar.itc // CPU_TIMER. 36 clocks latency!!! | 258 | (p8) mov r2 = ar.itc // CPU_TIMER. 36 clocks latency!!! |
254 | add r22 = IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET,r20 | 259 | (p9) ld8 r2 = [r30] // MMIO_TIMER. Could also have latency issues.. |
255 | (p9) ld8 r2 = [r30] // readq(ti->address). Could also have latency issues.. | 260 | (p13) ld8 r25 = [r19] // get itc_lastcycle value |
256 | (p10) ld4 r2 = [r30] // readw(ti->address) | 261 | ;; // ? could be removed by moving the last add upward |
257 | (p13) add r23 = IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET,r20 | 262 | ld8 r9 = [r22],IA64_TIMESPEC_TV_NSEC_OFFSET // tv_sec |
258 | ;; // could be removed by moving the last add upward | 263 | ;; |
259 | ld8 r26 = [r22] // time_interpolator->last_counter | 264 | ld8 r8 = [r22],-IA64_TIMESPEC_TV_NSEC_OFFSET // tv_nsec |
260 | (p13) ld8 r25 = [r23] // time interpolator->last_cycle | 265 | (p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm) |
261 | add r24 = IA64_TIME_INTERPOLATOR_OFFSET_OFFSET,r20 | 266 | ;; |
262 | (p15) ld8 r17 = [r19],IA64_TIMESPEC_TV_NSEC_OFFSET | 267 | (p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared |
263 | ld8 r9 = [r27],IA64_TIMESPEC_TV_NSEC_OFFSET | 268 | sub r10 = r2,r24 // current_cycle - last_cycle |
264 | add r14 = IA64_TIME_INTERPOLATOR_MASK_OFFSET, r20 | 269 | ;; |
265 | ;; | 270 | (p6) sub r10 = r25,r24 // time we got was less than last_cycle |
266 | ld8 r18 = [r24] // time_interpolator->offset | ||
267 | ld8 r8 = [r27],-IA64_TIMESPEC_TV_NSEC_OFFSET // xtime.tv_nsec | ||
268 | (p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm) | ||
269 | ;; | ||
270 | ld8 r14 = [r14] // time_interpolator->mask | ||
271 | (p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared | ||
272 | sub r10 = r2,r26 // current_counter - last_counter | ||
273 | ;; | ||
274 | (p6) sub r10 = r25,r26 // time we got was less than last_cycle | ||
275 | (p7) mov ar.ccv = r25 // more than last_cycle. Prep for cmpxchg | 271 | (p7) mov ar.ccv = r25 // more than last_cycle. Prep for cmpxchg |
276 | ;; | 272 | ;; |
273 | (p7) cmpxchg8.rel r3 = [r19],r2,ar.ccv | ||
274 | ;; | ||
275 | (p7) cmp.ne p7,p0 = r25,r3 // if cmpxchg not successful | ||
276 | ;; | ||
277 | (p7) sub r10 = r3,r24 // then use new last_cycle instead | ||
278 | ;; | ||
277 | and r10 = r10,r14 // Apply mask | 279 | and r10 = r10,r14 // Apply mask |
278 | ;; | 280 | ;; |
279 | setf.sig f8 = r10 | 281 | setf.sig f8 = r10 |
280 | nop.i 123 | 282 | nop.i 123 |
281 | ;; | 283 | ;; |
282 | (p7) cmpxchg8.rel r3 = [r23],r2,ar.ccv | 284 | // fault check takes 5 cycles and we have spare time |
283 | EX(.fail_efault, probe.w.fault r31, 3) // This takes 5 cycles and we have spare time | 285 | EX(.fail_efault, probe.w.fault r31, 3) |
284 | xmpy.l f8 = f8,f7 // nsec_per_cyc*(counter-last_counter) | 286 | xmpy.l f8 = f8,f7 // nsec_per_cyc*(counter-last_counter) |
285 | (p15) add r9 = r9,r17 // Add wall to monotonic.secs to result secs | ||
286 | ;; | 287 | ;; |
287 | (p15) ld8 r17 = [r19],-IA64_TIMESPEC_TV_NSEC_OFFSET | 288 | // ? simulate tbit.nz.or p7,p0 = r28,0 |
288 | (p7) cmp.ne p7,p0 = r25,r3 // if cmpxchg not successful redo | ||
289 | // simulate tbit.nz.or p7,p0 = r28,0 | ||
290 | getf.sig r2 = f8 | 289 | getf.sig r2 = f8 |
291 | mf | 290 | mf |
292 | add r8 = r8,r18 // Add time interpolator offset | ||
293 | ;; | 291 | ;; |
294 | ld4 r10 = [r29] // xtime_lock.sequence | 292 | ld4 r10 = [r20] // gtod_lock.sequence |
295 | (p15) add r8 = r8, r17 // Add monotonic.nsecs to nsecs | 293 | shr.u r2 = r2,r23 // shift by factor |
296 | shr.u r2 = r2,r21 | 294 | ;; // ? overloaded 3 bundles! |
297 | ;; // overloaded 3 bundles! | ||
298 | // End critical section. | ||
299 | add r8 = r8,r2 // Add xtime.nsecs | 295 | add r8 = r8,r2 // Add xtime.nsecs |
300 | cmp4.ne.or p7,p0 = r28,r10 | 296 | cmp4.ne p7,p0 = r28,r10 |
301 | (p7) br.cond.dpnt.few .time_redo // sequence number changed ? | 297 | (p7) br.cond.dpnt.few .time_redo // sequence number changed, redo |
298 | // End critical section. | ||
302 | // Now r8=tv->tv_nsec and r9=tv->tv_sec | 299 | // Now r8=tv->tv_nsec and r9=tv->tv_sec |
303 | mov r10 = r0 | 300 | mov r10 = r0 |
304 | movl r2 = 1000000000 | 301 | movl r2 = 1000000000 |
@@ -308,19 +305,19 @@ EX(.fail_efault, probe.w.fault r31, 3) // This takes 5 cycles and we have spare | |||
308 | .time_normalize: | 305 | .time_normalize: |
309 | mov r21 = r8 | 306 | mov r21 = r8 |
310 | cmp.ge p6,p0 = r8,r2 | 307 | cmp.ge p6,p0 = r8,r2 |
311 | (p14) shr.u r20 = r8, 3 // We can repeat this if necessary just wasting some time | 308 | (p14) shr.u r20 = r8, 3 // We can repeat this if necessary just wasting time |
312 | ;; | 309 | ;; |
313 | (p14) setf.sig f8 = r20 | 310 | (p14) setf.sig f8 = r20 |
314 | (p6) sub r8 = r8,r2 | 311 | (p6) sub r8 = r8,r2 |
315 | (p6) add r9 = 1,r9 // two nops before the branch. | 312 | (p6) add r9 = 1,r9 // two nops before the branch. |
316 | (p14) setf.sig f7 = r3 // Chances for repeats are 1 in 10000 for gettod | 313 | (p14) setf.sig f7 = r3 // Chances for repeats are 1 in 10000 for gettod |
317 | (p6) br.cond.dpnt.few .time_normalize | 314 | (p6) br.cond.dpnt.few .time_normalize |
318 | ;; | 315 | ;; |
319 | // Divided by 8 though shift. Now divide by 125 | 316 | // Divided by 8 though shift. Now divide by 125 |
320 | // The compiler was able to do that with a multiply | 317 | // The compiler was able to do that with a multiply |
321 | // and a shift and we do the same | 318 | // and a shift and we do the same |
322 | EX(.fail_efault, probe.w.fault r23, 3) // This also costs 5 cycles | 319 | EX(.fail_efault, probe.w.fault r23, 3) // This also costs 5 cycles |
323 | (p14) xmpy.hu f8 = f8, f7 // xmpy has 5 cycles latency so use it... | 320 | (p14) xmpy.hu f8 = f8, f7 // xmpy has 5 cycles latency so use it |
324 | ;; | 321 | ;; |
325 | mov r8 = r0 | 322 | mov r8 = r0 |
326 | (p14) getf.sig r2 = f8 | 323 | (p14) getf.sig r2 = f8 |
diff --git a/arch/ia64/kernel/fsyscall_gtod_data.h b/arch/ia64/kernel/fsyscall_gtod_data.h new file mode 100644 index 000000000000..490dab55fba3 --- /dev/null +++ b/arch/ia64/kernel/fsyscall_gtod_data.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * (c) Copyright 2007 Hewlett-Packard Development Company, L.P. | ||
3 | * Contributed by Peter Keilty <peter.keilty@hp.com> | ||
4 | * | ||
5 | * fsyscall gettimeofday data | ||
6 | */ | ||
7 | |||
8 | struct fsyscall_gtod_data_t { | ||
9 | seqlock_t lock; | ||
10 | struct timespec wall_time; | ||
11 | struct timespec monotonic_time; | ||
12 | cycle_t clk_mask; | ||
13 | u32 clk_mult; | ||
14 | u32 clk_shift; | ||
15 | void *clk_fsys_mmio; | ||
16 | cycle_t clk_cycle_last; | ||
17 | } __attribute__ ((aligned (L1_CACHE_BYTES))); | ||
18 | |||
19 | struct itc_jitter_data_t { | ||
20 | int itc_jitter; | ||
21 | cycle_t itc_lastcycle; | ||
22 | } __attribute__ ((aligned (L1_CACHE_BYTES))); | ||
23 | |||
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 37f46527d233..91e6dc1e7baf 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -118,15 +118,25 @@ static DEFINE_SPINLOCK(iosapic_lock); | |||
118 | * vector. | 118 | * vector. |
119 | */ | 119 | */ |
120 | 120 | ||
121 | struct iosapic_rte_info { | 121 | #define NO_REF_RTE 0 |
122 | struct list_head rte_list; /* node in list of RTEs sharing the | 122 | |
123 | * same vector */ | 123 | static struct iosapic { |
124 | char __iomem *addr; /* base address of IOSAPIC */ | 124 | char __iomem *addr; /* base address of IOSAPIC */ |
125 | unsigned int gsi_base; /* first GSI assigned to this | 125 | unsigned int gsi_base; /* GSI base */ |
126 | * IOSAPIC */ | 126 | unsigned short num_rte; /* # of RTEs on this IOSAPIC */ |
127 | int rtes_inuse; /* # of RTEs in use on this IOSAPIC */ | ||
128 | #ifdef CONFIG_NUMA | ||
129 | unsigned short node; /* numa node association via pxm */ | ||
130 | #endif | ||
131 | spinlock_t lock; /* lock for indirect reg access */ | ||
132 | } iosapic_lists[NR_IOSAPICS]; | ||
133 | |||
134 | struct iosapic_rte_info { | ||
135 | struct list_head rte_list; /* RTEs sharing the same vector */ | ||
127 | char rte_index; /* IOSAPIC RTE index */ | 136 | char rte_index; /* IOSAPIC RTE index */ |
128 | int refcnt; /* reference counter */ | 137 | int refcnt; /* reference counter */ |
129 | unsigned int flags; /* flags */ | 138 | unsigned int flags; /* flags */ |
139 | struct iosapic *iosapic; | ||
130 | } ____cacheline_aligned; | 140 | } ____cacheline_aligned; |
131 | 141 | ||
132 | static struct iosapic_intr_info { | 142 | static struct iosapic_intr_info { |
@@ -140,24 +150,23 @@ static struct iosapic_intr_info { | |||
140 | unsigned char polarity: 1; /* interrupt polarity | 150 | unsigned char polarity: 1; /* interrupt polarity |
141 | * (see iosapic.h) */ | 151 | * (see iosapic.h) */ |
142 | unsigned char trigger : 1; /* trigger mode (see iosapic.h) */ | 152 | unsigned char trigger : 1; /* trigger mode (see iosapic.h) */ |
143 | } iosapic_intr_info[IA64_NUM_VECTORS]; | 153 | } iosapic_intr_info[NR_IRQS]; |
144 | |||
145 | static struct iosapic { | ||
146 | char __iomem *addr; /* base address of IOSAPIC */ | ||
147 | unsigned int gsi_base; /* first GSI assigned to this | ||
148 | * IOSAPIC */ | ||
149 | unsigned short num_rte; /* # of RTEs on this IOSAPIC */ | ||
150 | int rtes_inuse; /* # of RTEs in use on this IOSAPIC */ | ||
151 | #ifdef CONFIG_NUMA | ||
152 | unsigned short node; /* numa node association via pxm */ | ||
153 | #endif | ||
154 | } iosapic_lists[NR_IOSAPICS]; | ||
155 | 154 | ||
156 | static unsigned char pcat_compat __devinitdata; /* 8259 compatibility flag */ | 155 | static unsigned char pcat_compat __devinitdata; /* 8259 compatibility flag */ |
157 | 156 | ||
158 | static int iosapic_kmalloc_ok; | 157 | static int iosapic_kmalloc_ok; |
159 | static LIST_HEAD(free_rte_list); | 158 | static LIST_HEAD(free_rte_list); |
160 | 159 | ||
160 | static inline void | ||
161 | iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) | ||
162 | { | ||
163 | unsigned long flags; | ||
164 | |||
165 | spin_lock_irqsave(&iosapic->lock, flags); | ||
166 | __iosapic_write(iosapic->addr, reg, val); | ||
167 | spin_unlock_irqrestore(&iosapic->lock, flags); | ||
168 | } | ||
169 | |||
161 | /* | 170 | /* |
162 | * Find an IOSAPIC associated with a GSI | 171 | * Find an IOSAPIC associated with a GSI |
163 | */ | 172 | */ |
@@ -175,17 +184,18 @@ find_iosapic (unsigned int gsi) | |||
175 | return -1; | 184 | return -1; |
176 | } | 185 | } |
177 | 186 | ||
178 | static inline int | 187 | static inline int __gsi_to_irq(unsigned int gsi) |
179 | _gsi_to_vector (unsigned int gsi) | ||
180 | { | 188 | { |
189 | int irq; | ||
181 | struct iosapic_intr_info *info; | 190 | struct iosapic_intr_info *info; |
182 | struct iosapic_rte_info *rte; | 191 | struct iosapic_rte_info *rte; |
183 | 192 | ||
184 | for (info = iosapic_intr_info; info < | 193 | for (irq = 0; irq < NR_IRQS; irq++) { |
185 | iosapic_intr_info + IA64_NUM_VECTORS; ++info) | 194 | info = &iosapic_intr_info[irq]; |
186 | list_for_each_entry(rte, &info->rtes, rte_list) | 195 | list_for_each_entry(rte, &info->rtes, rte_list) |
187 | if (rte->gsi_base + rte->rte_index == gsi) | 196 | if (rte->iosapic->gsi_base + rte->rte_index == gsi) |
188 | return info - iosapic_intr_info; | 197 | return irq; |
198 | } | ||
189 | return -1; | 199 | return -1; |
190 | } | 200 | } |
191 | 201 | ||
@@ -196,7 +206,10 @@ _gsi_to_vector (unsigned int gsi) | |||
196 | inline int | 206 | inline int |
197 | gsi_to_vector (unsigned int gsi) | 207 | gsi_to_vector (unsigned int gsi) |
198 | { | 208 | { |
199 | return _gsi_to_vector(gsi); | 209 | int irq = __gsi_to_irq(gsi); |
210 | if (check_irq_used(irq) < 0) | ||
211 | return -1; | ||
212 | return irq_to_vector(irq); | ||
200 | } | 213 | } |
201 | 214 | ||
202 | int | 215 | int |
@@ -204,66 +217,48 @@ gsi_to_irq (unsigned int gsi) | |||
204 | { | 217 | { |
205 | unsigned long flags; | 218 | unsigned long flags; |
206 | int irq; | 219 | int irq; |
207 | /* | 220 | |
208 | * XXX fix me: this assumes an identity mapping between IA-64 vector | ||
209 | * and Linux irq numbers... | ||
210 | */ | ||
211 | spin_lock_irqsave(&iosapic_lock, flags); | 221 | spin_lock_irqsave(&iosapic_lock, flags); |
212 | { | 222 | irq = __gsi_to_irq(gsi); |
213 | irq = _gsi_to_vector(gsi); | ||
214 | } | ||
215 | spin_unlock_irqrestore(&iosapic_lock, flags); | 223 | spin_unlock_irqrestore(&iosapic_lock, flags); |
216 | |||
217 | return irq; | 224 | return irq; |
218 | } | 225 | } |
219 | 226 | ||
220 | static struct iosapic_rte_info *gsi_vector_to_rte(unsigned int gsi, | 227 | static struct iosapic_rte_info *find_rte(unsigned int irq, unsigned int gsi) |
221 | unsigned int vec) | ||
222 | { | 228 | { |
223 | struct iosapic_rte_info *rte; | 229 | struct iosapic_rte_info *rte; |
224 | 230 | ||
225 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) | 231 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) |
226 | if (rte->gsi_base + rte->rte_index == gsi) | 232 | if (rte->iosapic->gsi_base + rte->rte_index == gsi) |
227 | return rte; | 233 | return rte; |
228 | return NULL; | 234 | return NULL; |
229 | } | 235 | } |
230 | 236 | ||
231 | static void | 237 | static void |
232 | set_rte (unsigned int gsi, unsigned int vector, unsigned int dest, int mask) | 238 | set_rte (unsigned int gsi, unsigned int irq, unsigned int dest, int mask) |
233 | { | 239 | { |
234 | unsigned long pol, trigger, dmode; | 240 | unsigned long pol, trigger, dmode; |
235 | u32 low32, high32; | 241 | u32 low32, high32; |
236 | char __iomem *addr; | ||
237 | int rte_index; | 242 | int rte_index; |
238 | char redir; | 243 | char redir; |
239 | struct iosapic_rte_info *rte; | 244 | struct iosapic_rte_info *rte; |
245 | ia64_vector vector = irq_to_vector(irq); | ||
240 | 246 | ||
241 | DBG(KERN_DEBUG"IOSAPIC: routing vector %d to 0x%x\n", vector, dest); | 247 | DBG(KERN_DEBUG"IOSAPIC: routing vector %d to 0x%x\n", vector, dest); |
242 | 248 | ||
243 | rte = gsi_vector_to_rte(gsi, vector); | 249 | rte = find_rte(irq, gsi); |
244 | if (!rte) | 250 | if (!rte) |
245 | return; /* not an IOSAPIC interrupt */ | 251 | return; /* not an IOSAPIC interrupt */ |
246 | 252 | ||
247 | rte_index = rte->rte_index; | 253 | rte_index = rte->rte_index; |
248 | addr = rte->addr; | 254 | pol = iosapic_intr_info[irq].polarity; |
249 | pol = iosapic_intr_info[vector].polarity; | 255 | trigger = iosapic_intr_info[irq].trigger; |
250 | trigger = iosapic_intr_info[vector].trigger; | 256 | dmode = iosapic_intr_info[irq].dmode; |
251 | dmode = iosapic_intr_info[vector].dmode; | ||
252 | 257 | ||
253 | redir = (dmode == IOSAPIC_LOWEST_PRIORITY) ? 1 : 0; | 258 | redir = (dmode == IOSAPIC_LOWEST_PRIORITY) ? 1 : 0; |
254 | 259 | ||
255 | #ifdef CONFIG_SMP | 260 | #ifdef CONFIG_SMP |
256 | { | 261 | set_irq_affinity_info(irq, (int)(dest & 0xffff), redir); |
257 | unsigned int irq; | ||
258 | |||
259 | for (irq = 0; irq < NR_IRQS; ++irq) | ||
260 | if (irq_to_vector(irq) == vector) { | ||
261 | set_irq_affinity_info(irq, | ||
262 | (int)(dest & 0xffff), | ||
263 | redir); | ||
264 | break; | ||
265 | } | ||
266 | } | ||
267 | #endif | 262 | #endif |
268 | 263 | ||
269 | low32 = ((pol << IOSAPIC_POLARITY_SHIFT) | | 264 | low32 = ((pol << IOSAPIC_POLARITY_SHIFT) | |
@@ -275,10 +270,10 @@ set_rte (unsigned int gsi, unsigned int vector, unsigned int dest, int mask) | |||
275 | /* dest contains both id and eid */ | 270 | /* dest contains both id and eid */ |
276 | high32 = (dest << IOSAPIC_DEST_SHIFT); | 271 | high32 = (dest << IOSAPIC_DEST_SHIFT); |
277 | 272 | ||
278 | iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32); | 273 | iosapic_write(rte->iosapic, IOSAPIC_RTE_HIGH(rte_index), high32); |
279 | iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32); | 274 | iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte_index), low32); |
280 | iosapic_intr_info[vector].low32 = low32; | 275 | iosapic_intr_info[irq].low32 = low32; |
281 | iosapic_intr_info[vector].dest = dest; | 276 | iosapic_intr_info[irq].dest = dest; |
282 | } | 277 | } |
283 | 278 | ||
284 | static void | 279 | static void |
@@ -294,15 +289,18 @@ kexec_disable_iosapic(void) | |||
294 | { | 289 | { |
295 | struct iosapic_intr_info *info; | 290 | struct iosapic_intr_info *info; |
296 | struct iosapic_rte_info *rte; | 291 | struct iosapic_rte_info *rte; |
297 | u8 vec = 0; | 292 | ia64_vector vec; |
298 | for (info = iosapic_intr_info; info < | 293 | int irq; |
299 | iosapic_intr_info + IA64_NUM_VECTORS; ++info, ++vec) { | 294 | |
295 | for (irq = 0; irq < NR_IRQS; irq++) { | ||
296 | info = &iosapic_intr_info[irq]; | ||
297 | vec = irq_to_vector(irq); | ||
300 | list_for_each_entry(rte, &info->rtes, | 298 | list_for_each_entry(rte, &info->rtes, |
301 | rte_list) { | 299 | rte_list) { |
302 | iosapic_write(rte->addr, | 300 | iosapic_write(rte->iosapic, |
303 | IOSAPIC_RTE_LOW(rte->rte_index), | 301 | IOSAPIC_RTE_LOW(rte->rte_index), |
304 | IOSAPIC_MASK|vec); | 302 | IOSAPIC_MASK|vec); |
305 | iosapic_eoi(rte->addr, vec); | 303 | iosapic_eoi(rte->iosapic->addr, vec); |
306 | } | 304 | } |
307 | } | 305 | } |
308 | } | 306 | } |
@@ -311,54 +309,36 @@ kexec_disable_iosapic(void) | |||
311 | static void | 309 | static void |
312 | mask_irq (unsigned int irq) | 310 | mask_irq (unsigned int irq) |
313 | { | 311 | { |
314 | unsigned long flags; | ||
315 | char __iomem *addr; | ||
316 | u32 low32; | 312 | u32 low32; |
317 | int rte_index; | 313 | int rte_index; |
318 | ia64_vector vec = irq_to_vector(irq); | ||
319 | struct iosapic_rte_info *rte; | 314 | struct iosapic_rte_info *rte; |
320 | 315 | ||
321 | if (list_empty(&iosapic_intr_info[vec].rtes)) | 316 | if (list_empty(&iosapic_intr_info[irq].rtes)) |
322 | return; /* not an IOSAPIC interrupt! */ | 317 | return; /* not an IOSAPIC interrupt! */ |
323 | 318 | ||
324 | spin_lock_irqsave(&iosapic_lock, flags); | 319 | /* set only the mask bit */ |
325 | { | 320 | low32 = iosapic_intr_info[irq].low32 |= IOSAPIC_MASK; |
326 | /* set only the mask bit */ | 321 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) { |
327 | low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK; | 322 | rte_index = rte->rte_index; |
328 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, | 323 | iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte_index), low32); |
329 | rte_list) { | ||
330 | addr = rte->addr; | ||
331 | rte_index = rte->rte_index; | ||
332 | iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32); | ||
333 | } | ||
334 | } | 324 | } |
335 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
336 | } | 325 | } |
337 | 326 | ||
338 | static void | 327 | static void |
339 | unmask_irq (unsigned int irq) | 328 | unmask_irq (unsigned int irq) |
340 | { | 329 | { |
341 | unsigned long flags; | ||
342 | char __iomem *addr; | ||
343 | u32 low32; | 330 | u32 low32; |
344 | int rte_index; | 331 | int rte_index; |
345 | ia64_vector vec = irq_to_vector(irq); | ||
346 | struct iosapic_rte_info *rte; | 332 | struct iosapic_rte_info *rte; |
347 | 333 | ||
348 | if (list_empty(&iosapic_intr_info[vec].rtes)) | 334 | if (list_empty(&iosapic_intr_info[irq].rtes)) |
349 | return; /* not an IOSAPIC interrupt! */ | 335 | return; /* not an IOSAPIC interrupt! */ |
350 | 336 | ||
351 | spin_lock_irqsave(&iosapic_lock, flags); | 337 | low32 = iosapic_intr_info[irq].low32 &= ~IOSAPIC_MASK; |
352 | { | 338 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) { |
353 | low32 = iosapic_intr_info[vec].low32 &= ~IOSAPIC_MASK; | 339 | rte_index = rte->rte_index; |
354 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, | 340 | iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte_index), low32); |
355 | rte_list) { | ||
356 | addr = rte->addr; | ||
357 | rte_index = rte->rte_index; | ||
358 | iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32); | ||
359 | } | ||
360 | } | 341 | } |
361 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
362 | } | 342 | } |
363 | 343 | ||
364 | 344 | ||
@@ -366,23 +346,24 @@ static void | |||
366 | iosapic_set_affinity (unsigned int irq, cpumask_t mask) | 346 | iosapic_set_affinity (unsigned int irq, cpumask_t mask) |
367 | { | 347 | { |
368 | #ifdef CONFIG_SMP | 348 | #ifdef CONFIG_SMP |
369 | unsigned long flags; | ||
370 | u32 high32, low32; | 349 | u32 high32, low32; |
371 | int dest, rte_index; | 350 | int dest, rte_index; |
372 | char __iomem *addr; | ||
373 | int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0; | 351 | int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0; |
374 | ia64_vector vec; | ||
375 | struct iosapic_rte_info *rte; | 352 | struct iosapic_rte_info *rte; |
353 | struct iosapic *iosapic; | ||
376 | 354 | ||
377 | irq &= (~IA64_IRQ_REDIRECTED); | 355 | irq &= (~IA64_IRQ_REDIRECTED); |
378 | vec = irq_to_vector(irq); | ||
379 | 356 | ||
357 | cpus_and(mask, mask, cpu_online_map); | ||
380 | if (cpus_empty(mask)) | 358 | if (cpus_empty(mask)) |
381 | return; | 359 | return; |
382 | 360 | ||
361 | if (reassign_irq_vector(irq, first_cpu(mask))) | ||
362 | return; | ||
363 | |||
383 | dest = cpu_physical_id(first_cpu(mask)); | 364 | dest = cpu_physical_id(first_cpu(mask)); |
384 | 365 | ||
385 | if (list_empty(&iosapic_intr_info[vec].rtes)) | 366 | if (list_empty(&iosapic_intr_info[irq].rtes)) |
386 | return; /* not an IOSAPIC interrupt */ | 367 | return; /* not an IOSAPIC interrupt */ |
387 | 368 | ||
388 | set_irq_affinity_info(irq, dest, redir); | 369 | set_irq_affinity_info(irq, dest, redir); |
@@ -390,31 +371,24 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask) | |||
390 | /* dest contains both id and eid */ | 371 | /* dest contains both id and eid */ |
391 | high32 = dest << IOSAPIC_DEST_SHIFT; | 372 | high32 = dest << IOSAPIC_DEST_SHIFT; |
392 | 373 | ||
393 | spin_lock_irqsave(&iosapic_lock, flags); | 374 | low32 = iosapic_intr_info[irq].low32 & ~(7 << IOSAPIC_DELIVERY_SHIFT); |
394 | { | 375 | if (redir) |
395 | low32 = iosapic_intr_info[vec].low32 & | 376 | /* change delivery mode to lowest priority */ |
396 | ~(7 << IOSAPIC_DELIVERY_SHIFT); | 377 | low32 |= (IOSAPIC_LOWEST_PRIORITY << IOSAPIC_DELIVERY_SHIFT); |
397 | 378 | else | |
398 | if (redir) | 379 | /* change delivery mode to fixed */ |
399 | /* change delivery mode to lowest priority */ | 380 | low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT); |
400 | low32 |= (IOSAPIC_LOWEST_PRIORITY << | 381 | low32 &= IOSAPIC_VECTOR_MASK; |
401 | IOSAPIC_DELIVERY_SHIFT); | 382 | low32 |= irq_to_vector(irq); |
402 | else | 383 | |
403 | /* change delivery mode to fixed */ | 384 | iosapic_intr_info[irq].low32 = low32; |
404 | low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT); | 385 | iosapic_intr_info[irq].dest = dest; |
405 | 386 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) { | |
406 | iosapic_intr_info[vec].low32 = low32; | 387 | iosapic = rte->iosapic; |
407 | iosapic_intr_info[vec].dest = dest; | 388 | rte_index = rte->rte_index; |
408 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, | 389 | iosapic_write(iosapic, IOSAPIC_RTE_HIGH(rte_index), high32); |
409 | rte_list) { | 390 | iosapic_write(iosapic, IOSAPIC_RTE_LOW(rte_index), low32); |
410 | addr = rte->addr; | ||
411 | rte_index = rte->rte_index; | ||
412 | iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), | ||
413 | high32); | ||
414 | iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32); | ||
415 | } | ||
416 | } | 391 | } |
417 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
418 | #endif | 392 | #endif |
419 | } | 393 | } |
420 | 394 | ||
@@ -434,10 +408,20 @@ iosapic_end_level_irq (unsigned int irq) | |||
434 | { | 408 | { |
435 | ia64_vector vec = irq_to_vector(irq); | 409 | ia64_vector vec = irq_to_vector(irq); |
436 | struct iosapic_rte_info *rte; | 410 | struct iosapic_rte_info *rte; |
411 | int do_unmask_irq = 0; | ||
437 | 412 | ||
438 | move_native_irq(irq); | 413 | if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { |
439 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) | 414 | do_unmask_irq = 1; |
440 | iosapic_eoi(rte->addr, vec); | 415 | mask_irq(irq); |
416 | } | ||
417 | |||
418 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) | ||
419 | iosapic_eoi(rte->iosapic->addr, vec); | ||
420 | |||
421 | if (unlikely(do_unmask_irq)) { | ||
422 | move_masked_irq(irq); | ||
423 | unmask_irq(irq); | ||
424 | } | ||
441 | } | 425 | } |
442 | 426 | ||
443 | #define iosapic_shutdown_level_irq mask_irq | 427 | #define iosapic_shutdown_level_irq mask_irq |
@@ -519,13 +503,12 @@ iosapic_version (char __iomem *addr) | |||
519 | * unsigned int reserved2 : 8; | 503 | * unsigned int reserved2 : 8; |
520 | * } | 504 | * } |
521 | */ | 505 | */ |
522 | return iosapic_read(addr, IOSAPIC_VERSION); | 506 | return __iosapic_read(addr, IOSAPIC_VERSION); |
523 | } | 507 | } |
524 | 508 | ||
525 | static int iosapic_find_sharable_vector (unsigned long trigger, | 509 | static int iosapic_find_sharable_irq(unsigned long trigger, unsigned long pol) |
526 | unsigned long pol) | ||
527 | { | 510 | { |
528 | int i, vector = -1, min_count = -1; | 511 | int i, irq = -ENOSPC, min_count = -1; |
529 | struct iosapic_intr_info *info; | 512 | struct iosapic_intr_info *info; |
530 | 513 | ||
531 | /* | 514 | /* |
@@ -533,21 +516,21 @@ static int iosapic_find_sharable_vector (unsigned long trigger, | |||
533 | * supported yet | 516 | * supported yet |
534 | */ | 517 | */ |
535 | if (trigger == IOSAPIC_EDGE) | 518 | if (trigger == IOSAPIC_EDGE) |
536 | return -1; | 519 | return -EINVAL; |
537 | 520 | ||
538 | for (i = IA64_FIRST_DEVICE_VECTOR; i <= IA64_LAST_DEVICE_VECTOR; i++) { | 521 | for (i = 0; i <= NR_IRQS; i++) { |
539 | info = &iosapic_intr_info[i]; | 522 | info = &iosapic_intr_info[i]; |
540 | if (info->trigger == trigger && info->polarity == pol && | 523 | if (info->trigger == trigger && info->polarity == pol && |
541 | (info->dmode == IOSAPIC_FIXED || info->dmode == | 524 | (info->dmode == IOSAPIC_FIXED || |
542 | IOSAPIC_LOWEST_PRIORITY)) { | 525 | info->dmode == IOSAPIC_LOWEST_PRIORITY) && |
526 | can_request_irq(i, IRQF_SHARED)) { | ||
543 | if (min_count == -1 || info->count < min_count) { | 527 | if (min_count == -1 || info->count < min_count) { |
544 | vector = i; | 528 | irq = i; |
545 | min_count = info->count; | 529 | min_count = info->count; |
546 | } | 530 | } |
547 | } | 531 | } |
548 | } | 532 | } |
549 | 533 | return irq; | |
550 | return vector; | ||
551 | } | 534 | } |
552 | 535 | ||
553 | /* | 536 | /* |
@@ -555,25 +538,25 @@ static int iosapic_find_sharable_vector (unsigned long trigger, | |||
555 | * assign a new vector for the other and make the vector available | 538 | * assign a new vector for the other and make the vector available |
556 | */ | 539 | */ |
557 | static void __init | 540 | static void __init |
558 | iosapic_reassign_vector (int vector) | 541 | iosapic_reassign_vector (int irq) |
559 | { | 542 | { |
560 | int new_vector; | 543 | int new_irq; |
561 | 544 | ||
562 | if (!list_empty(&iosapic_intr_info[vector].rtes)) { | 545 | if (!list_empty(&iosapic_intr_info[irq].rtes)) { |
563 | new_vector = assign_irq_vector(AUTO_ASSIGN); | 546 | new_irq = create_irq(); |
564 | if (new_vector < 0) | 547 | if (new_irq < 0) |
565 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); | 548 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); |
566 | printk(KERN_INFO "Reassigning vector %d to %d\n", | 549 | printk(KERN_INFO "Reassigning vector %d to %d\n", |
567 | vector, new_vector); | 550 | irq_to_vector(irq), irq_to_vector(new_irq)); |
568 | memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector], | 551 | memcpy(&iosapic_intr_info[new_irq], &iosapic_intr_info[irq], |
569 | sizeof(struct iosapic_intr_info)); | 552 | sizeof(struct iosapic_intr_info)); |
570 | INIT_LIST_HEAD(&iosapic_intr_info[new_vector].rtes); | 553 | INIT_LIST_HEAD(&iosapic_intr_info[new_irq].rtes); |
571 | list_move(iosapic_intr_info[vector].rtes.next, | 554 | list_move(iosapic_intr_info[irq].rtes.next, |
572 | &iosapic_intr_info[new_vector].rtes); | 555 | &iosapic_intr_info[new_irq].rtes); |
573 | memset(&iosapic_intr_info[vector], 0, | 556 | memset(&iosapic_intr_info[irq], 0, |
574 | sizeof(struct iosapic_intr_info)); | 557 | sizeof(struct iosapic_intr_info)); |
575 | iosapic_intr_info[vector].low32 = IOSAPIC_MASK; | 558 | iosapic_intr_info[irq].low32 = IOSAPIC_MASK; |
576 | INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes); | 559 | INIT_LIST_HEAD(&iosapic_intr_info[irq].rtes); |
577 | } | 560 | } |
578 | } | 561 | } |
579 | 562 | ||
@@ -610,29 +593,18 @@ static struct iosapic_rte_info *iosapic_alloc_rte (void) | |||
610 | return rte; | 593 | return rte; |
611 | } | 594 | } |
612 | 595 | ||
613 | static void iosapic_free_rte (struct iosapic_rte_info *rte) | 596 | static inline int irq_is_shared (int irq) |
614 | { | 597 | { |
615 | if (rte->flags & RTE_PREALLOCATED) | 598 | return (iosapic_intr_info[irq].count > 1); |
616 | list_add_tail(&rte->rte_list, &free_rte_list); | ||
617 | else | ||
618 | kfree(rte); | ||
619 | } | ||
620 | |||
621 | static inline int vector_is_shared (int vector) | ||
622 | { | ||
623 | return (iosapic_intr_info[vector].count > 1); | ||
624 | } | 599 | } |
625 | 600 | ||
626 | static int | 601 | static int |
627 | register_intr (unsigned int gsi, int vector, unsigned char delivery, | 602 | register_intr (unsigned int gsi, int irq, unsigned char delivery, |
628 | unsigned long polarity, unsigned long trigger) | 603 | unsigned long polarity, unsigned long trigger) |
629 | { | 604 | { |
630 | irq_desc_t *idesc; | 605 | irq_desc_t *idesc; |
631 | struct hw_interrupt_type *irq_type; | 606 | struct hw_interrupt_type *irq_type; |
632 | int rte_index; | ||
633 | int index; | 607 | int index; |
634 | unsigned long gsi_base; | ||
635 | void __iomem *iosapic_address; | ||
636 | struct iosapic_rte_info *rte; | 608 | struct iosapic_rte_info *rte; |
637 | 609 | ||
638 | index = find_iosapic(gsi); | 610 | index = find_iosapic(gsi); |
@@ -642,10 +614,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, | |||
642 | return -ENODEV; | 614 | return -ENODEV; |
643 | } | 615 | } |
644 | 616 | ||
645 | iosapic_address = iosapic_lists[index].addr; | 617 | rte = find_rte(irq, gsi); |
646 | gsi_base = iosapic_lists[index].gsi_base; | ||
647 | |||
648 | rte = gsi_vector_to_rte(gsi, vector); | ||
649 | if (!rte) { | 618 | if (!rte) { |
650 | rte = iosapic_alloc_rte(); | 619 | rte = iosapic_alloc_rte(); |
651 | if (!rte) { | 620 | if (!rte) { |
@@ -654,40 +623,42 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, | |||
654 | return -ENOMEM; | 623 | return -ENOMEM; |
655 | } | 624 | } |
656 | 625 | ||
657 | rte_index = gsi - gsi_base; | 626 | rte->iosapic = &iosapic_lists[index]; |
658 | rte->rte_index = rte_index; | 627 | rte->rte_index = gsi - rte->iosapic->gsi_base; |
659 | rte->addr = iosapic_address; | ||
660 | rte->gsi_base = gsi_base; | ||
661 | rte->refcnt++; | 628 | rte->refcnt++; |
662 | list_add_tail(&rte->rte_list, &iosapic_intr_info[vector].rtes); | 629 | list_add_tail(&rte->rte_list, &iosapic_intr_info[irq].rtes); |
663 | iosapic_intr_info[vector].count++; | 630 | iosapic_intr_info[irq].count++; |
664 | iosapic_lists[index].rtes_inuse++; | 631 | iosapic_lists[index].rtes_inuse++; |
665 | } | 632 | } |
666 | else if (vector_is_shared(vector)) { | 633 | else if (rte->refcnt == NO_REF_RTE) { |
667 | struct iosapic_intr_info *info = &iosapic_intr_info[vector]; | 634 | struct iosapic_intr_info *info = &iosapic_intr_info[irq]; |
668 | if (info->trigger != trigger || info->polarity != polarity) { | 635 | if (info->count > 0 && |
636 | (info->trigger != trigger || info->polarity != polarity)){ | ||
669 | printk (KERN_WARNING | 637 | printk (KERN_WARNING |
670 | "%s: cannot override the interrupt\n", | 638 | "%s: cannot override the interrupt\n", |
671 | __FUNCTION__); | 639 | __FUNCTION__); |
672 | return -EINVAL; | 640 | return -EINVAL; |
673 | } | 641 | } |
642 | rte->refcnt++; | ||
643 | iosapic_intr_info[irq].count++; | ||
644 | iosapic_lists[index].rtes_inuse++; | ||
674 | } | 645 | } |
675 | 646 | ||
676 | iosapic_intr_info[vector].polarity = polarity; | 647 | iosapic_intr_info[irq].polarity = polarity; |
677 | iosapic_intr_info[vector].dmode = delivery; | 648 | iosapic_intr_info[irq].dmode = delivery; |
678 | iosapic_intr_info[vector].trigger = trigger; | 649 | iosapic_intr_info[irq].trigger = trigger; |
679 | 650 | ||
680 | if (trigger == IOSAPIC_EDGE) | 651 | if (trigger == IOSAPIC_EDGE) |
681 | irq_type = &irq_type_iosapic_edge; | 652 | irq_type = &irq_type_iosapic_edge; |
682 | else | 653 | else |
683 | irq_type = &irq_type_iosapic_level; | 654 | irq_type = &irq_type_iosapic_level; |
684 | 655 | ||
685 | idesc = irq_desc + vector; | 656 | idesc = irq_desc + irq; |
686 | if (idesc->chip != irq_type) { | 657 | if (idesc->chip != irq_type) { |
687 | if (idesc->chip != &no_irq_type) | 658 | if (idesc->chip != &no_irq_type) |
688 | printk(KERN_WARNING | 659 | printk(KERN_WARNING |
689 | "%s: changing vector %d from %s to %s\n", | 660 | "%s: changing vector %d from %s to %s\n", |
690 | __FUNCTION__, vector, | 661 | __FUNCTION__, irq_to_vector(irq), |
691 | idesc->chip->name, irq_type->name); | 662 | idesc->chip->name, irq_type->name); |
692 | idesc->chip = irq_type; | 663 | idesc->chip = irq_type; |
693 | } | 664 | } |
@@ -695,18 +666,19 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, | |||
695 | } | 666 | } |
696 | 667 | ||
697 | static unsigned int | 668 | static unsigned int |
698 | get_target_cpu (unsigned int gsi, int vector) | 669 | get_target_cpu (unsigned int gsi, int irq) |
699 | { | 670 | { |
700 | #ifdef CONFIG_SMP | 671 | #ifdef CONFIG_SMP |
701 | static int cpu = -1; | 672 | static int cpu = -1; |
702 | extern int cpe_vector; | 673 | extern int cpe_vector; |
674 | cpumask_t domain = irq_to_domain(irq); | ||
703 | 675 | ||
704 | /* | 676 | /* |
705 | * In case of vector shared by multiple RTEs, all RTEs that | 677 | * In case of vector shared by multiple RTEs, all RTEs that |
706 | * share the vector need to use the same destination CPU. | 678 | * share the vector need to use the same destination CPU. |
707 | */ | 679 | */ |
708 | if (!list_empty(&iosapic_intr_info[vector].rtes)) | 680 | if (!list_empty(&iosapic_intr_info[irq].rtes)) |
709 | return iosapic_intr_info[vector].dest; | 681 | return iosapic_intr_info[irq].dest; |
710 | 682 | ||
711 | /* | 683 | /* |
712 | * If the platform supports redirection via XTP, let it | 684 | * If the platform supports redirection via XTP, let it |
@@ -723,7 +695,7 @@ get_target_cpu (unsigned int gsi, int vector) | |||
723 | return cpu_physical_id(smp_processor_id()); | 695 | return cpu_physical_id(smp_processor_id()); |
724 | 696 | ||
725 | #ifdef CONFIG_ACPI | 697 | #ifdef CONFIG_ACPI |
726 | if (cpe_vector > 0 && vector == IA64_CPEP_VECTOR) | 698 | if (cpe_vector > 0 && irq_to_vector(irq) == IA64_CPEP_VECTOR) |
727 | return get_cpei_target_cpu(); | 699 | return get_cpei_target_cpu(); |
728 | #endif | 700 | #endif |
729 | 701 | ||
@@ -738,7 +710,7 @@ get_target_cpu (unsigned int gsi, int vector) | |||
738 | goto skip_numa_setup; | 710 | goto skip_numa_setup; |
739 | 711 | ||
740 | cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node); | 712 | cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node); |
741 | 713 | cpus_and(cpu_mask, cpu_mask, domain); | |
742 | for_each_cpu_mask(numa_cpu, cpu_mask) { | 714 | for_each_cpu_mask(numa_cpu, cpu_mask) { |
743 | if (!cpu_online(numa_cpu)) | 715 | if (!cpu_online(numa_cpu)) |
744 | cpu_clear(numa_cpu, cpu_mask); | 716 | cpu_clear(numa_cpu, cpu_mask); |
@@ -749,8 +721,8 @@ get_target_cpu (unsigned int gsi, int vector) | |||
749 | if (!num_cpus) | 721 | if (!num_cpus) |
750 | goto skip_numa_setup; | 722 | goto skip_numa_setup; |
751 | 723 | ||
752 | /* Use vector assignment to distribute across cpus in node */ | 724 | /* Use irq assignment to distribute across cpus in node */ |
753 | cpu_index = vector % num_cpus; | 725 | cpu_index = irq % num_cpus; |
754 | 726 | ||
755 | for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++) | 727 | for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++) |
756 | numa_cpu = next_cpu(numa_cpu, cpu_mask); | 728 | numa_cpu = next_cpu(numa_cpu, cpu_mask); |
@@ -768,7 +740,7 @@ skip_numa_setup: | |||
768 | do { | 740 | do { |
769 | if (++cpu >= NR_CPUS) | 741 | if (++cpu >= NR_CPUS) |
770 | cpu = 0; | 742 | cpu = 0; |
771 | } while (!cpu_online(cpu)); | 743 | } while (!cpu_online(cpu) || !cpu_isset(cpu, domain)); |
772 | 744 | ||
773 | return cpu_physical_id(cpu); | 745 | return cpu_physical_id(cpu); |
774 | #else /* CONFIG_SMP */ | 746 | #else /* CONFIG_SMP */ |
@@ -785,84 +757,72 @@ int | |||
785 | iosapic_register_intr (unsigned int gsi, | 757 | iosapic_register_intr (unsigned int gsi, |
786 | unsigned long polarity, unsigned long trigger) | 758 | unsigned long polarity, unsigned long trigger) |
787 | { | 759 | { |
788 | int vector, mask = 1, err; | 760 | int irq, mask = 1, err; |
789 | unsigned int dest; | 761 | unsigned int dest; |
790 | unsigned long flags; | 762 | unsigned long flags; |
791 | struct iosapic_rte_info *rte; | 763 | struct iosapic_rte_info *rte; |
792 | u32 low32; | 764 | u32 low32; |
793 | again: | 765 | |
794 | /* | 766 | /* |
795 | * If this GSI has already been registered (i.e., it's a | 767 | * If this GSI has already been registered (i.e., it's a |
796 | * shared interrupt, or we lost a race to register it), | 768 | * shared interrupt, or we lost a race to register it), |
797 | * don't touch the RTE. | 769 | * don't touch the RTE. |
798 | */ | 770 | */ |
799 | spin_lock_irqsave(&iosapic_lock, flags); | 771 | spin_lock_irqsave(&iosapic_lock, flags); |
800 | { | 772 | irq = __gsi_to_irq(gsi); |
801 | vector = gsi_to_vector(gsi); | 773 | if (irq > 0) { |
802 | if (vector > 0) { | 774 | rte = find_rte(irq, gsi); |
803 | rte = gsi_vector_to_rte(gsi, vector); | 775 | if(iosapic_intr_info[irq].count == 0) { |
776 | assign_irq_vector(irq); | ||
777 | dynamic_irq_init(irq); | ||
778 | } else if (rte->refcnt != NO_REF_RTE) { | ||
804 | rte->refcnt++; | 779 | rte->refcnt++; |
805 | spin_unlock_irqrestore(&iosapic_lock, flags); | 780 | goto unlock_iosapic_lock; |
806 | return vector; | ||
807 | } | 781 | } |
808 | } | 782 | } else |
809 | spin_unlock_irqrestore(&iosapic_lock, flags); | 783 | irq = create_irq(); |
810 | 784 | ||
811 | /* If vector is running out, we try to find a sharable vector */ | 785 | /* If vector is running out, we try to find a sharable vector */ |
812 | vector = assign_irq_vector(AUTO_ASSIGN); | 786 | if (irq < 0) { |
813 | if (vector < 0) { | 787 | irq = iosapic_find_sharable_irq(trigger, polarity); |
814 | vector = iosapic_find_sharable_vector(trigger, polarity); | 788 | if (irq < 0) |
815 | if (vector < 0) | 789 | goto unlock_iosapic_lock; |
816 | return -ENOSPC; | ||
817 | } | 790 | } |
818 | 791 | ||
819 | spin_lock_irqsave(&irq_desc[vector].lock, flags); | 792 | spin_lock(&irq_desc[irq].lock); |
820 | spin_lock(&iosapic_lock); | 793 | dest = get_target_cpu(gsi, irq); |
821 | { | 794 | err = register_intr(gsi, irq, IOSAPIC_LOWEST_PRIORITY, |
822 | if (gsi_to_vector(gsi) > 0) { | 795 | polarity, trigger); |
823 | if (list_empty(&iosapic_intr_info[vector].rtes)) | 796 | if (err < 0) { |
824 | free_irq_vector(vector); | 797 | irq = err; |
825 | spin_unlock(&iosapic_lock); | 798 | goto unlock_all; |
826 | spin_unlock_irqrestore(&irq_desc[vector].lock, | ||
827 | flags); | ||
828 | goto again; | ||
829 | } | ||
830 | |||
831 | dest = get_target_cpu(gsi, vector); | ||
832 | err = register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, | ||
833 | polarity, trigger); | ||
834 | if (err < 0) { | ||
835 | spin_unlock(&iosapic_lock); | ||
836 | spin_unlock_irqrestore(&irq_desc[vector].lock, | ||
837 | flags); | ||
838 | return err; | ||
839 | } | ||
840 | |||
841 | /* | ||
842 | * If the vector is shared and already unmasked for | ||
843 | * other interrupt sources, don't mask it. | ||
844 | */ | ||
845 | low32 = iosapic_intr_info[vector].low32; | ||
846 | if (vector_is_shared(vector) && !(low32 & IOSAPIC_MASK)) | ||
847 | mask = 0; | ||
848 | set_rte(gsi, vector, dest, mask); | ||
849 | } | 799 | } |
850 | spin_unlock(&iosapic_lock); | 800 | |
851 | spin_unlock_irqrestore(&irq_desc[vector].lock, flags); | 801 | /* |
802 | * If the vector is shared and already unmasked for other | ||
803 | * interrupt sources, don't mask it. | ||
804 | */ | ||
805 | low32 = iosapic_intr_info[irq].low32; | ||
806 | if (irq_is_shared(irq) && !(low32 & IOSAPIC_MASK)) | ||
807 | mask = 0; | ||
808 | set_rte(gsi, irq, dest, mask); | ||
852 | 809 | ||
853 | printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n", | 810 | printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n", |
854 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), | 811 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), |
855 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), | 812 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), |
856 | cpu_logical_id(dest), dest, vector); | 813 | cpu_logical_id(dest), dest, irq_to_vector(irq)); |
857 | 814 | unlock_all: | |
858 | return vector; | 815 | spin_unlock(&irq_desc[irq].lock); |
816 | unlock_iosapic_lock: | ||
817 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
818 | return irq; | ||
859 | } | 819 | } |
860 | 820 | ||
861 | void | 821 | void |
862 | iosapic_unregister_intr (unsigned int gsi) | 822 | iosapic_unregister_intr (unsigned int gsi) |
863 | { | 823 | { |
864 | unsigned long flags; | 824 | unsigned long flags; |
865 | int irq, vector, index; | 825 | int irq, index; |
866 | irq_desc_t *idesc; | 826 | irq_desc_t *idesc; |
867 | u32 low32; | 827 | u32 low32; |
868 | unsigned long trigger, polarity; | 828 | unsigned long trigger, polarity; |
@@ -881,78 +841,56 @@ iosapic_unregister_intr (unsigned int gsi) | |||
881 | WARN_ON(1); | 841 | WARN_ON(1); |
882 | return; | 842 | return; |
883 | } | 843 | } |
884 | vector = irq_to_vector(irq); | ||
885 | 844 | ||
886 | idesc = irq_desc + irq; | 845 | spin_lock_irqsave(&iosapic_lock, flags); |
887 | spin_lock_irqsave(&idesc->lock, flags); | 846 | if ((rte = find_rte(irq, gsi)) == NULL) { |
888 | spin_lock(&iosapic_lock); | 847 | printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n", |
889 | { | 848 | gsi); |
890 | if ((rte = gsi_vector_to_rte(gsi, vector)) == NULL) { | 849 | WARN_ON(1); |
891 | printk(KERN_ERR | 850 | goto out; |
892 | "iosapic_unregister_intr(%u) unbalanced\n", | 851 | } |
893 | gsi); | ||
894 | WARN_ON(1); | ||
895 | goto out; | ||
896 | } | ||
897 | 852 | ||
898 | if (--rte->refcnt > 0) | 853 | if (--rte->refcnt > 0) |
899 | goto out; | 854 | goto out; |
900 | 855 | ||
901 | /* Mask the interrupt */ | 856 | idesc = irq_desc + irq; |
902 | low32 = iosapic_intr_info[vector].low32 | IOSAPIC_MASK; | 857 | rte->refcnt = NO_REF_RTE; |
903 | iosapic_write(rte->addr, IOSAPIC_RTE_LOW(rte->rte_index), | ||
904 | low32); | ||
905 | 858 | ||
906 | /* Remove the rte entry from the list */ | 859 | /* Mask the interrupt */ |
907 | list_del(&rte->rte_list); | 860 | low32 = iosapic_intr_info[irq].low32 | IOSAPIC_MASK; |
908 | iosapic_intr_info[vector].count--; | 861 | iosapic_write(rte->iosapic, IOSAPIC_RTE_LOW(rte->rte_index), low32); |
909 | iosapic_free_rte(rte); | ||
910 | index = find_iosapic(gsi); | ||
911 | iosapic_lists[index].rtes_inuse--; | ||
912 | WARN_ON(iosapic_lists[index].rtes_inuse < 0); | ||
913 | |||
914 | trigger = iosapic_intr_info[vector].trigger; | ||
915 | polarity = iosapic_intr_info[vector].polarity; | ||
916 | dest = iosapic_intr_info[vector].dest; | ||
917 | printk(KERN_INFO | ||
918 | "GSI %u (%s, %s) -> CPU %d (0x%04x)" | ||
919 | " vector %d unregistered\n", | ||
920 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), | ||
921 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), | ||
922 | cpu_logical_id(dest), dest, vector); | ||
923 | 862 | ||
924 | if (list_empty(&iosapic_intr_info[vector].rtes)) { | 863 | iosapic_intr_info[irq].count--; |
925 | /* Sanity check */ | 864 | index = find_iosapic(gsi); |
926 | BUG_ON(iosapic_intr_info[vector].count); | 865 | iosapic_lists[index].rtes_inuse--; |
866 | WARN_ON(iosapic_lists[index].rtes_inuse < 0); | ||
927 | 867 | ||
928 | /* Clear the interrupt controller descriptor */ | 868 | trigger = iosapic_intr_info[irq].trigger; |
929 | idesc->chip = &no_irq_type; | 869 | polarity = iosapic_intr_info[irq].polarity; |
870 | dest = iosapic_intr_info[irq].dest; | ||
871 | printk(KERN_INFO | ||
872 | "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d unregistered\n", | ||
873 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), | ||
874 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), | ||
875 | cpu_logical_id(dest), dest, irq_to_vector(irq)); | ||
930 | 876 | ||
877 | if (iosapic_intr_info[irq].count == 0) { | ||
931 | #ifdef CONFIG_SMP | 878 | #ifdef CONFIG_SMP |
932 | /* Clear affinity */ | 879 | /* Clear affinity */ |
933 | cpus_setall(idesc->affinity); | 880 | cpus_setall(idesc->affinity); |
934 | #endif | 881 | #endif |
935 | 882 | /* Clear the interrupt information */ | |
936 | /* Clear the interrupt information */ | 883 | iosapic_intr_info[irq].dest = 0; |
937 | memset(&iosapic_intr_info[vector], 0, | 884 | iosapic_intr_info[irq].dmode = 0; |
938 | sizeof(struct iosapic_intr_info)); | 885 | iosapic_intr_info[irq].polarity = 0; |
939 | iosapic_intr_info[vector].low32 |= IOSAPIC_MASK; | 886 | iosapic_intr_info[irq].trigger = 0; |
940 | INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes); | 887 | iosapic_intr_info[irq].low32 |= IOSAPIC_MASK; |
941 | 888 | ||
942 | if (idesc->action) { | 889 | /* Destroy and reserve IRQ */ |
943 | printk(KERN_ERR | 890 | destroy_and_reserve_irq(irq); |
944 | "interrupt handlers still exist on" | ||
945 | "IRQ %u\n", irq); | ||
946 | WARN_ON(1); | ||
947 | } | ||
948 | |||
949 | /* Free the interrupt vector */ | ||
950 | free_irq_vector(vector); | ||
951 | } | ||
952 | } | 891 | } |
953 | out: | 892 | out: |
954 | spin_unlock(&iosapic_lock); | 893 | spin_unlock_irqrestore(&iosapic_lock, flags); |
955 | spin_unlock_irqrestore(&idesc->lock, flags); | ||
956 | } | 894 | } |
957 | 895 | ||
958 | /* | 896 | /* |
@@ -965,27 +903,30 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, | |||
965 | { | 903 | { |
966 | static const char * const name[] = {"unknown", "PMI", "INIT", "CPEI"}; | 904 | static const char * const name[] = {"unknown", "PMI", "INIT", "CPEI"}; |
967 | unsigned char delivery; | 905 | unsigned char delivery; |
968 | int vector, mask = 0; | 906 | int irq, vector, mask = 0; |
969 | unsigned int dest = ((id << 8) | eid) & 0xffff; | 907 | unsigned int dest = ((id << 8) | eid) & 0xffff; |
970 | 908 | ||
971 | switch (int_type) { | 909 | switch (int_type) { |
972 | case ACPI_INTERRUPT_PMI: | 910 | case ACPI_INTERRUPT_PMI: |
973 | vector = iosapic_vector; | 911 | irq = vector = iosapic_vector; |
912 | bind_irq_vector(irq, vector, CPU_MASK_ALL); | ||
974 | /* | 913 | /* |
975 | * since PMI vector is alloc'd by FW(ACPI) not by kernel, | 914 | * since PMI vector is alloc'd by FW(ACPI) not by kernel, |
976 | * we need to make sure the vector is available | 915 | * we need to make sure the vector is available |
977 | */ | 916 | */ |
978 | iosapic_reassign_vector(vector); | 917 | iosapic_reassign_vector(irq); |
979 | delivery = IOSAPIC_PMI; | 918 | delivery = IOSAPIC_PMI; |
980 | break; | 919 | break; |
981 | case ACPI_INTERRUPT_INIT: | 920 | case ACPI_INTERRUPT_INIT: |
982 | vector = assign_irq_vector(AUTO_ASSIGN); | 921 | irq = create_irq(); |
983 | if (vector < 0) | 922 | if (irq < 0) |
984 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); | 923 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); |
924 | vector = irq_to_vector(irq); | ||
985 | delivery = IOSAPIC_INIT; | 925 | delivery = IOSAPIC_INIT; |
986 | break; | 926 | break; |
987 | case ACPI_INTERRUPT_CPEI: | 927 | case ACPI_INTERRUPT_CPEI: |
988 | vector = IA64_CPE_VECTOR; | 928 | irq = vector = IA64_CPE_VECTOR; |
929 | BUG_ON(bind_irq_vector(irq, vector, CPU_MASK_ALL)); | ||
989 | delivery = IOSAPIC_LOWEST_PRIORITY; | 930 | delivery = IOSAPIC_LOWEST_PRIORITY; |
990 | mask = 1; | 931 | mask = 1; |
991 | break; | 932 | break; |
@@ -995,7 +936,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, | |||
995 | return -1; | 936 | return -1; |
996 | } | 937 | } |
997 | 938 | ||
998 | register_intr(gsi, vector, delivery, polarity, trigger); | 939 | register_intr(gsi, irq, delivery, polarity, trigger); |
999 | 940 | ||
1000 | printk(KERN_INFO | 941 | printk(KERN_INFO |
1001 | "PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x)" | 942 | "PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x)" |
@@ -1005,7 +946,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, | |||
1005 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), | 946 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), |
1006 | cpu_logical_id(dest), dest, vector); | 947 | cpu_logical_id(dest), dest, vector); |
1007 | 948 | ||
1008 | set_rte(gsi, vector, dest, mask); | 949 | set_rte(gsi, irq, dest, mask); |
1009 | return vector; | 950 | return vector; |
1010 | } | 951 | } |
1011 | 952 | ||
@@ -1017,30 +958,32 @@ iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, | |||
1017 | unsigned long polarity, | 958 | unsigned long polarity, |
1018 | unsigned long trigger) | 959 | unsigned long trigger) |
1019 | { | 960 | { |
1020 | int vector; | 961 | int vector, irq; |
1021 | unsigned int dest = cpu_physical_id(smp_processor_id()); | 962 | unsigned int dest = cpu_physical_id(smp_processor_id()); |
1022 | 963 | ||
1023 | vector = isa_irq_to_vector(isa_irq); | 964 | irq = vector = isa_irq_to_vector(isa_irq); |
1024 | 965 | BUG_ON(bind_irq_vector(irq, vector, CPU_MASK_ALL)); | |
1025 | register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, polarity, trigger); | 966 | register_intr(gsi, irq, IOSAPIC_LOWEST_PRIORITY, polarity, trigger); |
1026 | 967 | ||
1027 | DBG("ISA: IRQ %u -> GSI %u (%s,%s) -> CPU %d (0x%04x) vector %d\n", | 968 | DBG("ISA: IRQ %u -> GSI %u (%s,%s) -> CPU %d (0x%04x) vector %d\n", |
1028 | isa_irq, gsi, trigger == IOSAPIC_EDGE ? "edge" : "level", | 969 | isa_irq, gsi, trigger == IOSAPIC_EDGE ? "edge" : "level", |
1029 | polarity == IOSAPIC_POL_HIGH ? "high" : "low", | 970 | polarity == IOSAPIC_POL_HIGH ? "high" : "low", |
1030 | cpu_logical_id(dest), dest, vector); | 971 | cpu_logical_id(dest), dest, vector); |
1031 | 972 | ||
1032 | set_rte(gsi, vector, dest, 1); | 973 | set_rte(gsi, irq, dest, 1); |
1033 | } | 974 | } |
1034 | 975 | ||
1035 | void __init | 976 | void __init |
1036 | iosapic_system_init (int system_pcat_compat) | 977 | iosapic_system_init (int system_pcat_compat) |
1037 | { | 978 | { |
1038 | int vector; | 979 | int irq; |
1039 | 980 | ||
1040 | for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) { | 981 | for (irq = 0; irq < NR_IRQS; ++irq) { |
1041 | iosapic_intr_info[vector].low32 = IOSAPIC_MASK; | 982 | iosapic_intr_info[irq].low32 = IOSAPIC_MASK; |
1042 | /* mark as unused */ | 983 | /* mark as unused */ |
1043 | INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes); | 984 | INIT_LIST_HEAD(&iosapic_intr_info[irq].rtes); |
985 | |||
986 | iosapic_intr_info[irq].count = 0; | ||
1044 | } | 987 | } |
1045 | 988 | ||
1046 | pcat_compat = system_pcat_compat; | 989 | pcat_compat = system_pcat_compat; |
@@ -1108,31 +1051,35 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base) | |||
1108 | unsigned long flags; | 1051 | unsigned long flags; |
1109 | 1052 | ||
1110 | spin_lock_irqsave(&iosapic_lock, flags); | 1053 | spin_lock_irqsave(&iosapic_lock, flags); |
1111 | { | 1054 | index = find_iosapic(gsi_base); |
1112 | addr = ioremap(phys_addr, 0); | 1055 | if (index >= 0) { |
1113 | ver = iosapic_version(addr); | 1056 | spin_unlock_irqrestore(&iosapic_lock, flags); |
1057 | return -EBUSY; | ||
1058 | } | ||
1114 | 1059 | ||
1115 | if ((err = iosapic_check_gsi_range(gsi_base, ver))) { | 1060 | addr = ioremap(phys_addr, 0); |
1116 | iounmap(addr); | 1061 | ver = iosapic_version(addr); |
1117 | spin_unlock_irqrestore(&iosapic_lock, flags); | 1062 | if ((err = iosapic_check_gsi_range(gsi_base, ver))) { |
1118 | return err; | 1063 | iounmap(addr); |
1119 | } | 1064 | spin_unlock_irqrestore(&iosapic_lock, flags); |
1065 | return err; | ||
1066 | } | ||
1120 | 1067 | ||
1121 | /* | 1068 | /* |
1122 | * The MAX_REDIR register holds the highest input pin | 1069 | * The MAX_REDIR register holds the highest input pin number |
1123 | * number (starting from 0). | 1070 | * (starting from 0). We add 1 so that we can use it for |
1124 | * We add 1 so that we can use it for number of pins (= RTEs) | 1071 | * number of pins (= RTEs) |
1125 | */ | 1072 | */ |
1126 | num_rte = ((ver >> 16) & 0xff) + 1; | 1073 | num_rte = ((ver >> 16) & 0xff) + 1; |
1127 | 1074 | ||
1128 | index = iosapic_alloc(); | 1075 | index = iosapic_alloc(); |
1129 | iosapic_lists[index].addr = addr; | 1076 | iosapic_lists[index].addr = addr; |
1130 | iosapic_lists[index].gsi_base = gsi_base; | 1077 | iosapic_lists[index].gsi_base = gsi_base; |
1131 | iosapic_lists[index].num_rte = num_rte; | 1078 | iosapic_lists[index].num_rte = num_rte; |
1132 | #ifdef CONFIG_NUMA | 1079 | #ifdef CONFIG_NUMA |
1133 | iosapic_lists[index].node = MAX_NUMNODES; | 1080 | iosapic_lists[index].node = MAX_NUMNODES; |
1134 | #endif | 1081 | #endif |
1135 | } | 1082 | spin_lock_init(&iosapic_lists[index].lock); |
1136 | spin_unlock_irqrestore(&iosapic_lock, flags); | 1083 | spin_unlock_irqrestore(&iosapic_lock, flags); |
1137 | 1084 | ||
1138 | if ((gsi_base == 0) && pcat_compat) { | 1085 | if ((gsi_base == 0) && pcat_compat) { |
@@ -1157,25 +1104,22 @@ iosapic_remove (unsigned int gsi_base) | |||
1157 | unsigned long flags; | 1104 | unsigned long flags; |
1158 | 1105 | ||
1159 | spin_lock_irqsave(&iosapic_lock, flags); | 1106 | spin_lock_irqsave(&iosapic_lock, flags); |
1160 | { | 1107 | index = find_iosapic(gsi_base); |
1161 | index = find_iosapic(gsi_base); | 1108 | if (index < 0) { |
1162 | if (index < 0) { | 1109 | printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n", |
1163 | printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n", | 1110 | __FUNCTION__, gsi_base); |
1164 | __FUNCTION__, gsi_base); | 1111 | goto out; |
1165 | goto out; | 1112 | } |
1166 | } | ||
1167 | |||
1168 | if (iosapic_lists[index].rtes_inuse) { | ||
1169 | err = -EBUSY; | ||
1170 | printk(KERN_WARNING | ||
1171 | "%s: IOSAPIC for GSI base %u is busy\n", | ||
1172 | __FUNCTION__, gsi_base); | ||
1173 | goto out; | ||
1174 | } | ||
1175 | 1113 | ||
1176 | iounmap(iosapic_lists[index].addr); | 1114 | if (iosapic_lists[index].rtes_inuse) { |
1177 | iosapic_free(index); | 1115 | err = -EBUSY; |
1116 | printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n", | ||
1117 | __FUNCTION__, gsi_base); | ||
1118 | goto out; | ||
1178 | } | 1119 | } |
1120 | |||
1121 | iounmap(iosapic_lists[index].addr); | ||
1122 | iosapic_free(index); | ||
1179 | out: | 1123 | out: |
1180 | spin_unlock_irqrestore(&iosapic_lock, flags); | 1124 | spin_unlock_irqrestore(&iosapic_lock, flags); |
1181 | return err; | 1125 | return err; |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 407b45870489..cc3ee4ef37af 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -35,7 +35,7 @@ void ack_bad_irq(unsigned int irq) | |||
35 | #ifdef CONFIG_IA64_GENERIC | 35 | #ifdef CONFIG_IA64_GENERIC |
36 | unsigned int __ia64_local_vector_to_irq (ia64_vector vec) | 36 | unsigned int __ia64_local_vector_to_irq (ia64_vector vec) |
37 | { | 37 | { |
38 | return (unsigned int) vec; | 38 | return __get_cpu_var(vector_irq)[vec]; |
39 | } | 39 | } |
40 | #endif | 40 | #endif |
41 | 41 | ||
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index bc47049f060f..91797c111162 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -46,6 +46,12 @@ | |||
46 | 46 | ||
47 | #define IRQ_DEBUG 0 | 47 | #define IRQ_DEBUG 0 |
48 | 48 | ||
49 | #define IRQ_VECTOR_UNASSIGNED (0) | ||
50 | |||
51 | #define IRQ_UNUSED (0) | ||
52 | #define IRQ_USED (1) | ||
53 | #define IRQ_RSVD (2) | ||
54 | |||
49 | /* These can be overridden in platform_irq_init */ | 55 | /* These can be overridden in platform_irq_init */ |
50 | int ia64_first_device_vector = IA64_DEF_FIRST_DEVICE_VECTOR; | 56 | int ia64_first_device_vector = IA64_DEF_FIRST_DEVICE_VECTOR; |
51 | int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR; | 57 | int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR; |
@@ -54,6 +60,8 @@ int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR; | |||
54 | void __iomem *ipi_base_addr = ((void __iomem *) | 60 | void __iomem *ipi_base_addr = ((void __iomem *) |
55 | (__IA64_UNCACHED_OFFSET | IA64_IPI_DEFAULT_BASE_ADDR)); | 61 | (__IA64_UNCACHED_OFFSET | IA64_IPI_DEFAULT_BASE_ADDR)); |
56 | 62 | ||
63 | static cpumask_t vector_allocation_domain(int cpu); | ||
64 | |||
57 | /* | 65 | /* |
58 | * Legacy IRQ to IA-64 vector translation table. | 66 | * Legacy IRQ to IA-64 vector translation table. |
59 | */ | 67 | */ |
@@ -64,46 +72,269 @@ __u8 isa_irq_to_vector_map[16] = { | |||
64 | }; | 72 | }; |
65 | EXPORT_SYMBOL(isa_irq_to_vector_map); | 73 | EXPORT_SYMBOL(isa_irq_to_vector_map); |
66 | 74 | ||
67 | static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_MAX_DEVICE_VECTORS)]; | 75 | DEFINE_SPINLOCK(vector_lock); |
76 | |||
77 | struct irq_cfg irq_cfg[NR_IRQS] __read_mostly = { | ||
78 | [0 ... NR_IRQS - 1] = { | ||
79 | .vector = IRQ_VECTOR_UNASSIGNED, | ||
80 | .domain = CPU_MASK_NONE | ||
81 | } | ||
82 | }; | ||
83 | |||
84 | DEFINE_PER_CPU(int[IA64_NUM_VECTORS], vector_irq) = { | ||
85 | [0 ... IA64_NUM_VECTORS - 1] = IA64_SPURIOUS_INT_VECTOR | ||
86 | }; | ||
87 | |||
88 | static cpumask_t vector_table[IA64_MAX_DEVICE_VECTORS] = { | ||
89 | [0 ... IA64_MAX_DEVICE_VECTORS - 1] = CPU_MASK_NONE | ||
90 | }; | ||
91 | |||
92 | static int irq_status[NR_IRQS] = { | ||
93 | [0 ... NR_IRQS -1] = IRQ_UNUSED | ||
94 | }; | ||
95 | |||
96 | int check_irq_used(int irq) | ||
97 | { | ||
98 | if (irq_status[irq] == IRQ_USED) | ||
99 | return 1; | ||
100 | |||
101 | return -1; | ||
102 | } | ||
103 | |||
104 | static void reserve_irq(unsigned int irq) | ||
105 | { | ||
106 | unsigned long flags; | ||
107 | |||
108 | spin_lock_irqsave(&vector_lock, flags); | ||
109 | irq_status[irq] = IRQ_RSVD; | ||
110 | spin_unlock_irqrestore(&vector_lock, flags); | ||
111 | } | ||
112 | |||
113 | static inline int find_unassigned_irq(void) | ||
114 | { | ||
115 | int irq; | ||
116 | |||
117 | for (irq = IA64_FIRST_DEVICE_VECTOR; irq < NR_IRQS; irq++) | ||
118 | if (irq_status[irq] == IRQ_UNUSED) | ||
119 | return irq; | ||
120 | return -ENOSPC; | ||
121 | } | ||
122 | |||
123 | static inline int find_unassigned_vector(cpumask_t domain) | ||
124 | { | ||
125 | cpumask_t mask; | ||
126 | int pos; | ||
127 | |||
128 | cpus_and(mask, domain, cpu_online_map); | ||
129 | if (cpus_empty(mask)) | ||
130 | return -EINVAL; | ||
131 | |||
132 | for (pos = 0; pos < IA64_NUM_DEVICE_VECTORS; pos++) { | ||
133 | cpus_and(mask, domain, vector_table[pos]); | ||
134 | if (!cpus_empty(mask)) | ||
135 | continue; | ||
136 | return IA64_FIRST_DEVICE_VECTOR + pos; | ||
137 | } | ||
138 | return -ENOSPC; | ||
139 | } | ||
140 | |||
141 | static int __bind_irq_vector(int irq, int vector, cpumask_t domain) | ||
142 | { | ||
143 | cpumask_t mask; | ||
144 | int cpu, pos; | ||
145 | struct irq_cfg *cfg = &irq_cfg[irq]; | ||
146 | |||
147 | cpus_and(mask, domain, cpu_online_map); | ||
148 | if (cpus_empty(mask)) | ||
149 | return -EINVAL; | ||
150 | if ((cfg->vector == vector) && cpus_equal(cfg->domain, domain)) | ||
151 | return 0; | ||
152 | if (cfg->vector != IRQ_VECTOR_UNASSIGNED) | ||
153 | return -EBUSY; | ||
154 | for_each_cpu_mask(cpu, mask) | ||
155 | per_cpu(vector_irq, cpu)[vector] = irq; | ||
156 | cfg->vector = vector; | ||
157 | cfg->domain = domain; | ||
158 | irq_status[irq] = IRQ_USED; | ||
159 | pos = vector - IA64_FIRST_DEVICE_VECTOR; | ||
160 | cpus_or(vector_table[pos], vector_table[pos], domain); | ||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | int bind_irq_vector(int irq, int vector, cpumask_t domain) | ||
165 | { | ||
166 | unsigned long flags; | ||
167 | int ret; | ||
168 | |||
169 | spin_lock_irqsave(&vector_lock, flags); | ||
170 | ret = __bind_irq_vector(irq, vector, domain); | ||
171 | spin_unlock_irqrestore(&vector_lock, flags); | ||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | static void __clear_irq_vector(int irq) | ||
176 | { | ||
177 | int vector, cpu, pos; | ||
178 | cpumask_t mask; | ||
179 | cpumask_t domain; | ||
180 | struct irq_cfg *cfg = &irq_cfg[irq]; | ||
181 | |||
182 | BUG_ON((unsigned)irq >= NR_IRQS); | ||
183 | BUG_ON(cfg->vector == IRQ_VECTOR_UNASSIGNED); | ||
184 | vector = cfg->vector; | ||
185 | domain = cfg->domain; | ||
186 | cpus_and(mask, cfg->domain, cpu_online_map); | ||
187 | for_each_cpu_mask(cpu, mask) | ||
188 | per_cpu(vector_irq, cpu)[vector] = IA64_SPURIOUS_INT_VECTOR; | ||
189 | cfg->vector = IRQ_VECTOR_UNASSIGNED; | ||
190 | cfg->domain = CPU_MASK_NONE; | ||
191 | irq_status[irq] = IRQ_UNUSED; | ||
192 | pos = vector - IA64_FIRST_DEVICE_VECTOR; | ||
193 | cpus_andnot(vector_table[pos], vector_table[pos], domain); | ||
194 | } | ||
195 | |||
196 | static void clear_irq_vector(int irq) | ||
197 | { | ||
198 | unsigned long flags; | ||
199 | |||
200 | spin_lock_irqsave(&vector_lock, flags); | ||
201 | __clear_irq_vector(irq); | ||
202 | spin_unlock_irqrestore(&vector_lock, flags); | ||
203 | } | ||
68 | 204 | ||
69 | int | 205 | int |
70 | assign_irq_vector (int irq) | 206 | assign_irq_vector (int irq) |
71 | { | 207 | { |
72 | int pos, vector; | 208 | unsigned long flags; |
73 | again: | 209 | int vector, cpu; |
74 | pos = find_first_zero_bit(ia64_vector_mask, IA64_NUM_DEVICE_VECTORS); | 210 | cpumask_t domain; |
75 | vector = IA64_FIRST_DEVICE_VECTOR + pos; | 211 | |
76 | if (vector > IA64_LAST_DEVICE_VECTOR) | 212 | vector = -ENOSPC; |
77 | return -ENOSPC; | 213 | |
78 | if (test_and_set_bit(pos, ia64_vector_mask)) | 214 | spin_lock_irqsave(&vector_lock, flags); |
79 | goto again; | 215 | if (irq < 0) { |
216 | goto out; | ||
217 | } | ||
218 | for_each_online_cpu(cpu) { | ||
219 | domain = vector_allocation_domain(cpu); | ||
220 | vector = find_unassigned_vector(domain); | ||
221 | if (vector >= 0) | ||
222 | break; | ||
223 | } | ||
224 | if (vector < 0) | ||
225 | goto out; | ||
226 | BUG_ON(__bind_irq_vector(irq, vector, domain)); | ||
227 | out: | ||
228 | spin_unlock_irqrestore(&vector_lock, flags); | ||
80 | return vector; | 229 | return vector; |
81 | } | 230 | } |
82 | 231 | ||
83 | void | 232 | void |
84 | free_irq_vector (int vector) | 233 | free_irq_vector (int vector) |
85 | { | 234 | { |
86 | int pos; | 235 | if (vector < IA64_FIRST_DEVICE_VECTOR || |
87 | 236 | vector > IA64_LAST_DEVICE_VECTOR) | |
88 | if (vector < IA64_FIRST_DEVICE_VECTOR || vector > IA64_LAST_DEVICE_VECTOR) | ||
89 | return; | 237 | return; |
90 | 238 | clear_irq_vector(vector); | |
91 | pos = vector - IA64_FIRST_DEVICE_VECTOR; | ||
92 | if (!test_and_clear_bit(pos, ia64_vector_mask)) | ||
93 | printk(KERN_WARNING "%s: double free!\n", __FUNCTION__); | ||
94 | } | 239 | } |
95 | 240 | ||
96 | int | 241 | int |
97 | reserve_irq_vector (int vector) | 242 | reserve_irq_vector (int vector) |
98 | { | 243 | { |
99 | int pos; | ||
100 | |||
101 | if (vector < IA64_FIRST_DEVICE_VECTOR || | 244 | if (vector < IA64_FIRST_DEVICE_VECTOR || |
102 | vector > IA64_LAST_DEVICE_VECTOR) | 245 | vector > IA64_LAST_DEVICE_VECTOR) |
103 | return -EINVAL; | 246 | return -EINVAL; |
247 | return !!bind_irq_vector(vector, vector, CPU_MASK_ALL); | ||
248 | } | ||
104 | 249 | ||
105 | pos = vector - IA64_FIRST_DEVICE_VECTOR; | 250 | /* |
106 | return test_and_set_bit(pos, ia64_vector_mask); | 251 | * Initialize vector_irq on a new cpu. This function must be called |
252 | * with vector_lock held. | ||
253 | */ | ||
254 | void __setup_vector_irq(int cpu) | ||
255 | { | ||
256 | int irq, vector; | ||
257 | |||
258 | /* Clear vector_irq */ | ||
259 | for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) | ||
260 | per_cpu(vector_irq, cpu)[vector] = IA64_SPURIOUS_INT_VECTOR; | ||
261 | /* Mark the inuse vectors */ | ||
262 | for (irq = 0; irq < NR_IRQS; ++irq) { | ||
263 | if (!cpu_isset(cpu, irq_cfg[irq].domain)) | ||
264 | continue; | ||
265 | vector = irq_to_vector(irq); | ||
266 | per_cpu(vector_irq, cpu)[vector] = irq; | ||
267 | } | ||
268 | } | ||
269 | |||
270 | #if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)) | ||
271 | static enum vector_domain_type { | ||
272 | VECTOR_DOMAIN_NONE, | ||
273 | VECTOR_DOMAIN_PERCPU | ||
274 | } vector_domain_type = VECTOR_DOMAIN_NONE; | ||
275 | |||
276 | static cpumask_t vector_allocation_domain(int cpu) | ||
277 | { | ||
278 | if (vector_domain_type == VECTOR_DOMAIN_PERCPU) | ||
279 | return cpumask_of_cpu(cpu); | ||
280 | return CPU_MASK_ALL; | ||
281 | } | ||
282 | |||
283 | static int __init parse_vector_domain(char *arg) | ||
284 | { | ||
285 | if (!arg) | ||
286 | return -EINVAL; | ||
287 | if (!strcmp(arg, "percpu")) { | ||
288 | vector_domain_type = VECTOR_DOMAIN_PERCPU; | ||
289 | no_int_routing = 1; | ||
290 | } | ||
291 | return 1; | ||
292 | } | ||
293 | early_param("vector", parse_vector_domain); | ||
294 | #else | ||
295 | static cpumask_t vector_allocation_domain(int cpu) | ||
296 | { | ||
297 | return CPU_MASK_ALL; | ||
298 | } | ||
299 | #endif | ||
300 | |||
301 | |||
302 | void destroy_and_reserve_irq(unsigned int irq) | ||
303 | { | ||
304 | dynamic_irq_cleanup(irq); | ||
305 | |||
306 | clear_irq_vector(irq); | ||
307 | reserve_irq(irq); | ||
308 | } | ||
309 | |||
310 | static int __reassign_irq_vector(int irq, int cpu) | ||
311 | { | ||
312 | struct irq_cfg *cfg = &irq_cfg[irq]; | ||
313 | int vector; | ||
314 | cpumask_t domain; | ||
315 | |||
316 | if (cfg->vector == IRQ_VECTOR_UNASSIGNED || !cpu_online(cpu)) | ||
317 | return -EINVAL; | ||
318 | if (cpu_isset(cpu, cfg->domain)) | ||
319 | return 0; | ||
320 | domain = vector_allocation_domain(cpu); | ||
321 | vector = find_unassigned_vector(domain); | ||
322 | if (vector < 0) | ||
323 | return -ENOSPC; | ||
324 | __clear_irq_vector(irq); | ||
325 | BUG_ON(__bind_irq_vector(irq, vector, domain)); | ||
326 | return 0; | ||
327 | } | ||
328 | |||
329 | int reassign_irq_vector(int irq, int cpu) | ||
330 | { | ||
331 | unsigned long flags; | ||
332 | int ret; | ||
333 | |||
334 | spin_lock_irqsave(&vector_lock, flags); | ||
335 | ret = __reassign_irq_vector(irq, cpu); | ||
336 | spin_unlock_irqrestore(&vector_lock, flags); | ||
337 | return ret; | ||
107 | } | 338 | } |
108 | 339 | ||
109 | /* | 340 | /* |
@@ -111,18 +342,35 @@ reserve_irq_vector (int vector) | |||
111 | */ | 342 | */ |
112 | int create_irq(void) | 343 | int create_irq(void) |
113 | { | 344 | { |
114 | int vector = assign_irq_vector(AUTO_ASSIGN); | 345 | unsigned long flags; |
115 | 346 | int irq, vector, cpu; | |
116 | if (vector >= 0) | 347 | cpumask_t domain; |
117 | dynamic_irq_init(vector); | 348 | |
118 | 349 | irq = vector = -ENOSPC; | |
119 | return vector; | 350 | spin_lock_irqsave(&vector_lock, flags); |
351 | for_each_online_cpu(cpu) { | ||
352 | domain = vector_allocation_domain(cpu); | ||
353 | vector = find_unassigned_vector(domain); | ||
354 | if (vector >= 0) | ||
355 | break; | ||
356 | } | ||
357 | if (vector < 0) | ||
358 | goto out; | ||
359 | irq = find_unassigned_irq(); | ||
360 | if (irq < 0) | ||
361 | goto out; | ||
362 | BUG_ON(__bind_irq_vector(irq, vector, domain)); | ||
363 | out: | ||
364 | spin_unlock_irqrestore(&vector_lock, flags); | ||
365 | if (irq >= 0) | ||
366 | dynamic_irq_init(irq); | ||
367 | return irq; | ||
120 | } | 368 | } |
121 | 369 | ||
122 | void destroy_irq(unsigned int irq) | 370 | void destroy_irq(unsigned int irq) |
123 | { | 371 | { |
124 | dynamic_irq_cleanup(irq); | 372 | dynamic_irq_cleanup(irq); |
125 | free_irq_vector(irq); | 373 | clear_irq_vector(irq); |
126 | } | 374 | } |
127 | 375 | ||
128 | #ifdef CONFIG_SMP | 376 | #ifdef CONFIG_SMP |
@@ -301,14 +549,13 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action) | |||
301 | irq_desc_t *desc; | 549 | irq_desc_t *desc; |
302 | unsigned int irq; | 550 | unsigned int irq; |
303 | 551 | ||
304 | for (irq = 0; irq < NR_IRQS; ++irq) | 552 | irq = vec; |
305 | if (irq_to_vector(irq) == vec) { | 553 | BUG_ON(bind_irq_vector(irq, vec, CPU_MASK_ALL)); |
306 | desc = irq_desc + irq; | 554 | desc = irq_desc + irq; |
307 | desc->status |= IRQ_PER_CPU; | 555 | desc->status |= IRQ_PER_CPU; |
308 | desc->chip = &irq_type_ia64_lsapic; | 556 | desc->chip = &irq_type_ia64_lsapic; |
309 | if (action) | 557 | if (action) |
310 | setup_irq(irq, action); | 558 | setup_irq(irq, action); |
311 | } | ||
312 | } | 559 | } |
313 | 560 | ||
314 | void __init | 561 | void __init |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index c81080df70df..2fdbd5c3f213 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #define MSI_DATA_VECTOR_SHIFT 0 | 14 | #define MSI_DATA_VECTOR_SHIFT 0 |
15 | #define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) | 15 | #define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) |
16 | #define MSI_DATA_VECTOR_MASK 0xffffff00 | ||
16 | 17 | ||
17 | #define MSI_DATA_DELIVERY_SHIFT 8 | 18 | #define MSI_DATA_DELIVERY_SHIFT 8 |
18 | #define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT) | 19 | #define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT) |
@@ -50,17 +51,29 @@ static struct irq_chip ia64_msi_chip; | |||
50 | static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask) | 51 | static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask) |
51 | { | 52 | { |
52 | struct msi_msg msg; | 53 | struct msi_msg msg; |
53 | u32 addr; | 54 | u32 addr, data; |
55 | int cpu = first_cpu(cpu_mask); | ||
56 | |||
57 | if (!cpu_online(cpu)) | ||
58 | return; | ||
59 | |||
60 | if (reassign_irq_vector(irq, cpu)) | ||
61 | return; | ||
54 | 62 | ||
55 | read_msi_msg(irq, &msg); | 63 | read_msi_msg(irq, &msg); |
56 | 64 | ||
57 | addr = msg.address_lo; | 65 | addr = msg.address_lo; |
58 | addr &= MSI_ADDR_DESTID_MASK; | 66 | addr &= MSI_ADDR_DESTID_MASK; |
59 | addr |= MSI_ADDR_DESTID_CPU(cpu_physical_id(first_cpu(cpu_mask))); | 67 | addr |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); |
60 | msg.address_lo = addr; | 68 | msg.address_lo = addr; |
61 | 69 | ||
70 | data = msg.data; | ||
71 | data &= MSI_DATA_VECTOR_MASK; | ||
72 | data |= MSI_DATA_VECTOR(irq_to_vector(irq)); | ||
73 | msg.data = data; | ||
74 | |||
62 | write_msi_msg(irq, &msg); | 75 | write_msi_msg(irq, &msg); |
63 | irq_desc[irq].affinity = cpu_mask; | 76 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); |
64 | } | 77 | } |
65 | #endif /* CONFIG_SMP */ | 78 | #endif /* CONFIG_SMP */ |
66 | 79 | ||
@@ -69,13 +82,15 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc) | |||
69 | struct msi_msg msg; | 82 | struct msi_msg msg; |
70 | unsigned long dest_phys_id; | 83 | unsigned long dest_phys_id; |
71 | int irq, vector; | 84 | int irq, vector; |
85 | cpumask_t mask; | ||
72 | 86 | ||
73 | irq = create_irq(); | 87 | irq = create_irq(); |
74 | if (irq < 0) | 88 | if (irq < 0) |
75 | return irq; | 89 | return irq; |
76 | 90 | ||
77 | set_irq_msi(irq, desc); | 91 | set_irq_msi(irq, desc); |
78 | dest_phys_id = cpu_physical_id(first_cpu(cpu_online_map)); | 92 | cpus_and(mask, irq_to_domain(irq), cpu_online_map); |
93 | dest_phys_id = cpu_physical_id(first_cpu(mask)); | ||
79 | vector = irq_to_vector(irq); | 94 | vector = irq_to_vector(irq); |
80 | 95 | ||
81 | msg.address_hi = 0; | 96 | msg.address_hi = 0; |
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index 3c9d8e6089cf..9f5c90b594b9 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
@@ -395,9 +395,13 @@ smp_callin (void) | |||
395 | fix_b0_for_bsp(); | 395 | fix_b0_for_bsp(); |
396 | 396 | ||
397 | lock_ipi_calllock(); | 397 | lock_ipi_calllock(); |
398 | spin_lock(&vector_lock); | ||
399 | /* Setup the per cpu irq handling data structures */ | ||
400 | __setup_vector_irq(cpuid); | ||
398 | cpu_set(cpuid, cpu_online_map); | 401 | cpu_set(cpuid, cpu_online_map); |
399 | unlock_ipi_calllock(); | 402 | unlock_ipi_calllock(); |
400 | per_cpu(cpu_state, cpuid) = CPU_ONLINE; | 403 | per_cpu(cpu_state, cpuid) = CPU_ONLINE; |
404 | spin_unlock(&vector_lock); | ||
401 | 405 | ||
402 | smp_setup_percpu_timer(); | 406 | smp_setup_percpu_timer(); |
403 | 407 | ||
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index 3486fe7d6e65..627785c48ea9 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
20 | #include <linux/efi.h> | 20 | #include <linux/efi.h> |
21 | #include <linux/timex.h> | 21 | #include <linux/timex.h> |
22 | #include <linux/clocksource.h> | ||
22 | 23 | ||
23 | #include <asm/machvec.h> | 24 | #include <asm/machvec.h> |
24 | #include <asm/delay.h> | 25 | #include <asm/delay.h> |
@@ -28,6 +29,16 @@ | |||
28 | #include <asm/sections.h> | 29 | #include <asm/sections.h> |
29 | #include <asm/system.h> | 30 | #include <asm/system.h> |
30 | 31 | ||
32 | #include "fsyscall_gtod_data.h" | ||
33 | |||
34 | static cycle_t itc_get_cycles(void); | ||
35 | |||
36 | struct fsyscall_gtod_data_t fsyscall_gtod_data = { | ||
37 | .lock = SEQLOCK_UNLOCKED, | ||
38 | }; | ||
39 | |||
40 | struct itc_jitter_data_t itc_jitter_data; | ||
41 | |||
31 | volatile int time_keeper_id = 0; /* smp_processor_id() of time-keeper */ | 42 | volatile int time_keeper_id = 0; /* smp_processor_id() of time-keeper */ |
32 | 43 | ||
33 | #ifdef CONFIG_IA64_DEBUG_IRQ | 44 | #ifdef CONFIG_IA64_DEBUG_IRQ |
@@ -37,11 +48,16 @@ EXPORT_SYMBOL(last_cli_ip); | |||
37 | 48 | ||
38 | #endif | 49 | #endif |
39 | 50 | ||
40 | static struct time_interpolator itc_interpolator = { | 51 | static struct clocksource clocksource_itc = { |
41 | .shift = 16, | 52 | .name = "itc", |
42 | .mask = 0xffffffffffffffffLL, | 53 | .rating = 350, |
43 | .source = TIME_SOURCE_CPU | 54 | .read = itc_get_cycles, |
55 | .mask = 0xffffffffffffffff, | ||
56 | .mult = 0, /*to be caluclated*/ | ||
57 | .shift = 16, | ||
58 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
44 | }; | 59 | }; |
60 | static struct clocksource *itc_clocksource; | ||
45 | 61 | ||
46 | static irqreturn_t | 62 | static irqreturn_t |
47 | timer_interrupt (int irq, void *dev_id) | 63 | timer_interrupt (int irq, void *dev_id) |
@@ -210,8 +226,6 @@ ia64_init_itm (void) | |||
210 | + itc_freq/2)/itc_freq; | 226 | + itc_freq/2)/itc_freq; |
211 | 227 | ||
212 | if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) { | 228 | if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) { |
213 | itc_interpolator.frequency = local_cpu_data->itc_freq; | ||
214 | itc_interpolator.drift = itc_drift; | ||
215 | #ifdef CONFIG_SMP | 229 | #ifdef CONFIG_SMP |
216 | /* On IA64 in an SMP configuration ITCs are never accurately synchronized. | 230 | /* On IA64 in an SMP configuration ITCs are never accurately synchronized. |
217 | * Jitter compensation requires a cmpxchg which may limit | 231 | * Jitter compensation requires a cmpxchg which may limit |
@@ -223,15 +237,50 @@ ia64_init_itm (void) | |||
223 | * even going backward) if the ITC offsets between the individual CPUs | 237 | * even going backward) if the ITC offsets between the individual CPUs |
224 | * are too large. | 238 | * are too large. |
225 | */ | 239 | */ |
226 | if (!nojitter) itc_interpolator.jitter = 1; | 240 | if (!nojitter) |
241 | itc_jitter_data.itc_jitter = 1; | ||
227 | #endif | 242 | #endif |
228 | register_time_interpolator(&itc_interpolator); | ||
229 | } | 243 | } |
230 | 244 | ||
231 | /* Setup the CPU local timer tick */ | 245 | /* Setup the CPU local timer tick */ |
232 | ia64_cpu_local_tick(); | 246 | ia64_cpu_local_tick(); |
247 | |||
248 | if (!itc_clocksource) { | ||
249 | /* Sort out mult/shift values: */ | ||
250 | clocksource_itc.mult = | ||
251 | clocksource_hz2mult(local_cpu_data->itc_freq, | ||
252 | clocksource_itc.shift); | ||
253 | clocksource_register(&clocksource_itc); | ||
254 | itc_clocksource = &clocksource_itc; | ||
255 | } | ||
233 | } | 256 | } |
234 | 257 | ||
258 | static cycle_t itc_get_cycles() | ||
259 | { | ||
260 | u64 lcycle, now, ret; | ||
261 | |||
262 | if (!itc_jitter_data.itc_jitter) | ||
263 | return get_cycles(); | ||
264 | |||
265 | lcycle = itc_jitter_data.itc_lastcycle; | ||
266 | now = get_cycles(); | ||
267 | if (lcycle && time_after(lcycle, now)) | ||
268 | return lcycle; | ||
269 | |||
270 | /* | ||
271 | * Keep track of the last timer value returned. | ||
272 | * In an SMP environment, you could lose out in contention of | ||
273 | * cmpxchg. If so, your cmpxchg returns new value which the | ||
274 | * winner of contention updated to. Use the new value instead. | ||
275 | */ | ||
276 | ret = cmpxchg(&itc_jitter_data.itc_lastcycle, lcycle, now); | ||
277 | if (unlikely(ret != lcycle)) | ||
278 | return ret; | ||
279 | |||
280 | return now; | ||
281 | } | ||
282 | |||
283 | |||
235 | static struct irqaction timer_irqaction = { | 284 | static struct irqaction timer_irqaction = { |
236 | .handler = timer_interrupt, | 285 | .handler = timer_interrupt, |
237 | .flags = IRQF_DISABLED | IRQF_IRQPOLL, | 286 | .flags = IRQF_DISABLED | IRQF_IRQPOLL, |
@@ -307,3 +356,34 @@ ia64_setup_printk_clock(void) | |||
307 | if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) | 356 | if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) |
308 | ia64_printk_clock = ia64_itc_printk_clock; | 357 | ia64_printk_clock = ia64_itc_printk_clock; |
309 | } | 358 | } |
359 | |||
360 | void update_vsyscall(struct timespec *wall, struct clocksource *c) | ||
361 | { | ||
362 | unsigned long flags; | ||
363 | |||
364 | write_seqlock_irqsave(&fsyscall_gtod_data.lock, flags); | ||
365 | |||
366 | /* copy fsyscall clock data */ | ||
367 | fsyscall_gtod_data.clk_mask = c->mask; | ||
368 | fsyscall_gtod_data.clk_mult = c->mult; | ||
369 | fsyscall_gtod_data.clk_shift = c->shift; | ||
370 | fsyscall_gtod_data.clk_fsys_mmio = c->fsys_mmio; | ||
371 | fsyscall_gtod_data.clk_cycle_last = c->cycle_last; | ||
372 | |||
373 | /* copy kernel time structures */ | ||
374 | fsyscall_gtod_data.wall_time.tv_sec = wall->tv_sec; | ||
375 | fsyscall_gtod_data.wall_time.tv_nsec = wall->tv_nsec; | ||
376 | fsyscall_gtod_data.monotonic_time.tv_sec = wall_to_monotonic.tv_sec | ||
377 | + wall->tv_sec; | ||
378 | fsyscall_gtod_data.monotonic_time.tv_nsec = wall_to_monotonic.tv_nsec | ||
379 | + wall->tv_nsec; | ||
380 | |||
381 | /* normalize */ | ||
382 | while (fsyscall_gtod_data.monotonic_time.tv_nsec >= NSEC_PER_SEC) { | ||
383 | fsyscall_gtod_data.monotonic_time.tv_nsec -= NSEC_PER_SEC; | ||
384 | fsyscall_gtod_data.monotonic_time.tv_sec++; | ||
385 | } | ||
386 | |||
387 | write_sequnlock_irqrestore(&fsyscall_gtod_data.lock, flags); | ||
388 | } | ||
389 | |||
diff --git a/arch/ia64/sn/kernel/sn2/timer.c b/arch/ia64/sn/kernel/sn2/timer.c index 56a88b6df4b4..19e25d2b64fc 100644 --- a/arch/ia64/sn/kernel/sn2/timer.c +++ b/arch/ia64/sn/kernel/sn2/timer.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
12 | #include <linux/time.h> | 12 | #include <linux/time.h> |
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | #include <linux/clocksource.h> | ||
14 | 15 | ||
15 | #include <asm/hw_irq.h> | 16 | #include <asm/hw_irq.h> |
16 | #include <asm/system.h> | 17 | #include <asm/system.h> |
@@ -22,11 +23,21 @@ | |||
22 | 23 | ||
23 | extern unsigned long sn_rtc_cycles_per_second; | 24 | extern unsigned long sn_rtc_cycles_per_second; |
24 | 25 | ||
25 | static struct time_interpolator sn2_interpolator = { | 26 | static void __iomem *sn2_mc; |
26 | .drift = -1, | 27 | |
27 | .shift = 10, | 28 | static cycle_t read_sn2(void) |
28 | .mask = (1LL << 55) - 1, | 29 | { |
29 | .source = TIME_SOURCE_MMIO64 | 30 | return (cycle_t)readq(sn2_mc); |
31 | } | ||
32 | |||
33 | static struct clocksource clocksource_sn2 = { | ||
34 | .name = "sn2_rtc", | ||
35 | .rating = 300, | ||
36 | .read = read_sn2, | ||
37 | .mask = (1LL << 55) - 1, | ||
38 | .mult = 0, | ||
39 | .shift = 10, | ||
40 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
30 | }; | 41 | }; |
31 | 42 | ||
32 | /* | 43 | /* |
@@ -47,9 +58,11 @@ ia64_sn_udelay (unsigned long usecs) | |||
47 | 58 | ||
48 | void __init sn_timer_init(void) | 59 | void __init sn_timer_init(void) |
49 | { | 60 | { |
50 | sn2_interpolator.frequency = sn_rtc_cycles_per_second; | 61 | sn2_mc = RTC_COUNTER_ADDR; |
51 | sn2_interpolator.addr = RTC_COUNTER_ADDR; | 62 | clocksource_sn2.fsys_mmio = RTC_COUNTER_ADDR; |
52 | register_time_interpolator(&sn2_interpolator); | 63 | clocksource_sn2.mult = clocksource_hz2mult(sn_rtc_cycles_per_second, |
64 | clocksource_sn2.shift); | ||
65 | clocksource_register(&clocksource_sn2); | ||
53 | 66 | ||
54 | ia64_udelay = &ia64_sn_udelay; | 67 | ia64_udelay = &ia64_sn_udelay; |
55 | } | 68 | } |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 80ffc7829916..bb5d23be4260 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -475,7 +475,7 @@ static void acpi_processor_idle(void) | |||
475 | /* Get end time (ticks) */ | 475 | /* Get end time (ticks) */ |
476 | t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); | 476 | t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
477 | 477 | ||
478 | #ifdef CONFIG_GENERIC_TIME | 478 | #if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86_TSC) |
479 | /* TSC halts in C2, so notify users */ | 479 | /* TSC halts in C2, so notify users */ |
480 | mark_tsc_unstable("possible TSC halt in C2"); | 480 | mark_tsc_unstable("possible TSC halt in C2"); |
481 | #endif | 481 | #endif |
@@ -517,7 +517,7 @@ static void acpi_processor_idle(void) | |||
517 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); | 517 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); |
518 | } | 518 | } |
519 | 519 | ||
520 | #ifdef CONFIG_GENERIC_TIME | 520 | #if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86_TSC) |
521 | /* TSC halts in C3, so notify users */ | 521 | /* TSC halts in C3, so notify users */ |
522 | mark_tsc_unstable("TSC halts in C3"); | 522 | mark_tsc_unstable("TSC halts in C3"); |
523 | #endif | 523 | #endif |
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 0be700f4e8fd..ba0e74ad74bb 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/bcd.h> | 29 | #include <linux/bcd.h> |
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/bitops.h> | 31 | #include <linux/bitops.h> |
32 | #include <linux/clocksource.h> | ||
32 | 33 | ||
33 | #include <asm/current.h> | 34 | #include <asm/current.h> |
34 | #include <asm/uaccess.h> | 35 | #include <asm/uaccess.h> |
@@ -51,8 +52,34 @@ | |||
51 | 52 | ||
52 | #define HPET_RANGE_SIZE 1024 /* from HPET spec */ | 53 | #define HPET_RANGE_SIZE 1024 /* from HPET spec */ |
53 | 54 | ||
55 | #if BITS_PER_LONG == 64 | ||
56 | #define write_counter(V, MC) writeq(V, MC) | ||
57 | #define read_counter(MC) readq(MC) | ||
58 | #else | ||
59 | #define write_counter(V, MC) writel(V, MC) | ||
60 | #define read_counter(MC) readl(MC) | ||
61 | #endif | ||
62 | |||
54 | static u32 hpet_nhpet, hpet_max_freq = HPET_USER_FREQ; | 63 | static u32 hpet_nhpet, hpet_max_freq = HPET_USER_FREQ; |
55 | 64 | ||
65 | static void __iomem *hpet_mctr; | ||
66 | |||
67 | static cycle_t read_hpet(void) | ||
68 | { | ||
69 | return (cycle_t)read_counter((void __iomem *)hpet_mctr); | ||
70 | } | ||
71 | |||
72 | static struct clocksource clocksource_hpet = { | ||
73 | .name = "hpet", | ||
74 | .rating = 250, | ||
75 | .read = read_hpet, | ||
76 | .mask = 0xffffffffffffffff, | ||
77 | .mult = 0, /*to be caluclated*/ | ||
78 | .shift = 10, | ||
79 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
80 | }; | ||
81 | static struct clocksource *hpet_clocksource; | ||
82 | |||
56 | /* A lock for concurrent access by app and isr hpet activity. */ | 83 | /* A lock for concurrent access by app and isr hpet activity. */ |
57 | static DEFINE_SPINLOCK(hpet_lock); | 84 | static DEFINE_SPINLOCK(hpet_lock); |
58 | /* A lock for concurrent intermodule access to hpet and isr hpet activity. */ | 85 | /* A lock for concurrent intermodule access to hpet and isr hpet activity. */ |
@@ -79,7 +106,7 @@ struct hpets { | |||
79 | struct hpets *hp_next; | 106 | struct hpets *hp_next; |
80 | struct hpet __iomem *hp_hpet; | 107 | struct hpet __iomem *hp_hpet; |
81 | unsigned long hp_hpet_phys; | 108 | unsigned long hp_hpet_phys; |
82 | struct time_interpolator *hp_interpolator; | 109 | struct clocksource *hp_clocksource; |
83 | unsigned long long hp_tick_freq; | 110 | unsigned long long hp_tick_freq; |
84 | unsigned long hp_delta; | 111 | unsigned long hp_delta; |
85 | unsigned int hp_ntimer; | 112 | unsigned int hp_ntimer; |
@@ -94,13 +121,6 @@ static struct hpets *hpets; | |||
94 | #define HPET_PERIODIC 0x0004 | 121 | #define HPET_PERIODIC 0x0004 |
95 | #define HPET_SHARED_IRQ 0x0008 | 122 | #define HPET_SHARED_IRQ 0x0008 |
96 | 123 | ||
97 | #if BITS_PER_LONG == 64 | ||
98 | #define write_counter(V, MC) writeq(V, MC) | ||
99 | #define read_counter(MC) readq(MC) | ||
100 | #else | ||
101 | #define write_counter(V, MC) writel(V, MC) | ||
102 | #define read_counter(MC) readl(MC) | ||
103 | #endif | ||
104 | 124 | ||
105 | #ifndef readq | 125 | #ifndef readq |
106 | static inline unsigned long long readq(void __iomem *addr) | 126 | static inline unsigned long long readq(void __iomem *addr) |
@@ -737,27 +757,6 @@ static ctl_table dev_root[] = { | |||
737 | 757 | ||
738 | static struct ctl_table_header *sysctl_header; | 758 | static struct ctl_table_header *sysctl_header; |
739 | 759 | ||
740 | static void hpet_register_interpolator(struct hpets *hpetp) | ||
741 | { | ||
742 | #ifdef CONFIG_TIME_INTERPOLATION | ||
743 | struct time_interpolator *ti; | ||
744 | |||
745 | ti = kzalloc(sizeof(*ti), GFP_KERNEL); | ||
746 | if (!ti) | ||
747 | return; | ||
748 | |||
749 | ti->source = TIME_SOURCE_MMIO64; | ||
750 | ti->shift = 10; | ||
751 | ti->addr = &hpetp->hp_hpet->hpet_mc; | ||
752 | ti->frequency = hpetp->hp_tick_freq; | ||
753 | ti->drift = HPET_DRIFT; | ||
754 | ti->mask = -1; | ||
755 | |||
756 | hpetp->hp_interpolator = ti; | ||
757 | register_time_interpolator(ti); | ||
758 | #endif | ||
759 | } | ||
760 | |||
761 | /* | 760 | /* |
762 | * Adjustment for when arming the timer with | 761 | * Adjustment for when arming the timer with |
763 | * initial conditions. That is, main counter | 762 | * initial conditions. That is, main counter |
@@ -909,7 +908,16 @@ int hpet_alloc(struct hpet_data *hdp) | |||
909 | } | 908 | } |
910 | 909 | ||
911 | hpetp->hp_delta = hpet_calibrate(hpetp); | 910 | hpetp->hp_delta = hpet_calibrate(hpetp); |
912 | hpet_register_interpolator(hpetp); | 911 | |
912 | if (!hpet_clocksource) { | ||
913 | hpet_mctr = (void __iomem *)&hpetp->hp_hpet->hpet_mc; | ||
914 | CLKSRC_FSYS_MMIO_SET(clocksource_hpet.fsys_mmio, hpet_mctr); | ||
915 | clocksource_hpet.mult = clocksource_hz2mult(hpetp->hp_tick_freq, | ||
916 | clocksource_hpet.shift); | ||
917 | clocksource_register(&clocksource_hpet); | ||
918 | hpetp->hp_clocksource = &clocksource_hpet; | ||
919 | hpet_clocksource = &clocksource_hpet; | ||
920 | } | ||
913 | 921 | ||
914 | return 0; | 922 | return 0; |
915 | } | 923 | } |
@@ -995,7 +1003,7 @@ static int hpet_acpi_add(struct acpi_device *device) | |||
995 | 1003 | ||
996 | static int hpet_acpi_remove(struct acpi_device *device, int type) | 1004 | static int hpet_acpi_remove(struct acpi_device *device, int type) |
997 | { | 1005 | { |
998 | /* XXX need to unregister interpolator, dealloc mem, etc */ | 1006 | /* XXX need to unregister clocksource, dealloc mem, etc */ |
999 | return -EINVAL; | 1007 | return -EINVAL; |
1000 | } | 1008 | } |
1001 | 1009 | ||
diff --git a/include/asm-ia64/hw_irq.h b/include/asm-ia64/hw_irq.h index c054d7a9aaa7..efa1b8f7251d 100644 --- a/include/asm-ia64/hw_irq.h +++ b/include/asm-ia64/hw_irq.h | |||
@@ -90,13 +90,27 @@ enum { | |||
90 | extern __u8 isa_irq_to_vector_map[16]; | 90 | extern __u8 isa_irq_to_vector_map[16]; |
91 | #define isa_irq_to_vector(x) isa_irq_to_vector_map[(x)] | 91 | #define isa_irq_to_vector(x) isa_irq_to_vector_map[(x)] |
92 | 92 | ||
93 | struct irq_cfg { | ||
94 | ia64_vector vector; | ||
95 | cpumask_t domain; | ||
96 | }; | ||
97 | extern spinlock_t vector_lock; | ||
98 | extern struct irq_cfg irq_cfg[NR_IRQS]; | ||
99 | #define irq_to_domain(x) irq_cfg[(x)].domain | ||
100 | DECLARE_PER_CPU(int[IA64_NUM_VECTORS], vector_irq); | ||
101 | |||
93 | extern struct hw_interrupt_type irq_type_ia64_lsapic; /* CPU-internal interrupt controller */ | 102 | extern struct hw_interrupt_type irq_type_ia64_lsapic; /* CPU-internal interrupt controller */ |
94 | 103 | ||
104 | extern int bind_irq_vector(int irq, int vector, cpumask_t domain); | ||
95 | extern int assign_irq_vector (int irq); /* allocate a free vector */ | 105 | extern int assign_irq_vector (int irq); /* allocate a free vector */ |
96 | extern void free_irq_vector (int vector); | 106 | extern void free_irq_vector (int vector); |
97 | extern int reserve_irq_vector (int vector); | 107 | extern int reserve_irq_vector (int vector); |
108 | extern void __setup_vector_irq(int cpu); | ||
109 | extern int reassign_irq_vector(int irq, int cpu); | ||
98 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); | 110 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); |
99 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); | 111 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); |
112 | extern int check_irq_used (int irq); | ||
113 | extern void destroy_and_reserve_irq (unsigned int irq); | ||
100 | 114 | ||
101 | static inline void ia64_resend_irq(unsigned int vector) | 115 | static inline void ia64_resend_irq(unsigned int vector) |
102 | { | 116 | { |
@@ -113,7 +127,7 @@ extern irq_desc_t irq_desc[NR_IRQS]; | |||
113 | static inline unsigned int | 127 | static inline unsigned int |
114 | __ia64_local_vector_to_irq (ia64_vector vec) | 128 | __ia64_local_vector_to_irq (ia64_vector vec) |
115 | { | 129 | { |
116 | return (unsigned int) vec; | 130 | return __get_cpu_var(vector_irq)[vec]; |
117 | } | 131 | } |
118 | #endif | 132 | #endif |
119 | 133 | ||
@@ -131,7 +145,7 @@ __ia64_local_vector_to_irq (ia64_vector vec) | |||
131 | static inline ia64_vector | 145 | static inline ia64_vector |
132 | irq_to_vector (int irq) | 146 | irq_to_vector (int irq) |
133 | { | 147 | { |
134 | return (ia64_vector) irq; | 148 | return irq_cfg[irq].vector; |
135 | } | 149 | } |
136 | 150 | ||
137 | /* | 151 | /* |
diff --git a/include/asm-ia64/iosapic.h b/include/asm-ia64/iosapic.h index 421cb6b62a7c..b8f712859140 100644 --- a/include/asm-ia64/iosapic.h +++ b/include/asm-ia64/iosapic.h | |||
@@ -47,19 +47,21 @@ | |||
47 | #define IOSAPIC_MASK_SHIFT 16 | 47 | #define IOSAPIC_MASK_SHIFT 16 |
48 | #define IOSAPIC_MASK (1<<IOSAPIC_MASK_SHIFT) | 48 | #define IOSAPIC_MASK (1<<IOSAPIC_MASK_SHIFT) |
49 | 49 | ||
50 | #define IOSAPIC_VECTOR_MASK 0xffffff00 | ||
51 | |||
50 | #ifndef __ASSEMBLY__ | 52 | #ifndef __ASSEMBLY__ |
51 | 53 | ||
52 | #ifdef CONFIG_IOSAPIC | 54 | #ifdef CONFIG_IOSAPIC |
53 | 55 | ||
54 | #define NR_IOSAPICS 256 | 56 | #define NR_IOSAPICS 256 |
55 | 57 | ||
56 | static inline unsigned int iosapic_read(char __iomem *iosapic, unsigned int reg) | 58 | static inline unsigned int __iosapic_read(char __iomem *iosapic, unsigned int reg) |
57 | { | 59 | { |
58 | writel(reg, iosapic + IOSAPIC_REG_SELECT); | 60 | writel(reg, iosapic + IOSAPIC_REG_SELECT); |
59 | return readl(iosapic + IOSAPIC_WINDOW); | 61 | return readl(iosapic + IOSAPIC_WINDOW); |
60 | } | 62 | } |
61 | 63 | ||
62 | static inline void iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val) | 64 | static inline void __iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val) |
63 | { | 65 | { |
64 | writel(reg, iosapic + IOSAPIC_REG_SELECT); | 66 | writel(reg, iosapic + IOSAPIC_REG_SELECT); |
65 | writel(val, iosapic + IOSAPIC_WINDOW); | 67 | writel(val, iosapic + IOSAPIC_WINDOW); |
diff --git a/include/asm-ia64/irq.h b/include/asm-ia64/irq.h index 67221615e317..35b360b82e43 100644 --- a/include/asm-ia64/irq.h +++ b/include/asm-ia64/irq.h | |||
@@ -14,8 +14,13 @@ | |||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/cpumask.h> | 15 | #include <linux/cpumask.h> |
16 | 16 | ||
17 | #define NR_IRQS 256 | 17 | #define NR_VECTORS 256 |
18 | #define NR_IRQ_VECTORS NR_IRQS | 18 | |
19 | #if (NR_VECTORS + 32 * NR_CPUS) < 1024 | ||
20 | #define NR_IRQS (NR_VECTORS + 32 * NR_CPUS) | ||
21 | #else | ||
22 | #define NR_IRQS 1024 | ||
23 | #endif | ||
19 | 24 | ||
20 | static __inline__ int | 25 | static __inline__ int |
21 | irq_canonicalize (int irq) | 26 | irq_canonicalize (int irq) |
diff --git a/include/asm-ia64/rwsem.h b/include/asm-ia64/rwsem.h index 2d1640cc240a..8aba06a7b038 100644 --- a/include/asm-ia64/rwsem.h +++ b/include/asm-ia64/rwsem.h | |||
@@ -21,6 +21,10 @@ | |||
21 | #ifndef _ASM_IA64_RWSEM_H | 21 | #ifndef _ASM_IA64_RWSEM_H |
22 | #define _ASM_IA64_RWSEM_H | 22 | #define _ASM_IA64_RWSEM_H |
23 | 23 | ||
24 | #ifndef _LINUX_RWSEM_H | ||
25 | #error "Please don't include <asm/rwsem.h> directly, use <linux/rwsem.h> instead." | ||
26 | #endif | ||
27 | |||
24 | #include <linux/list.h> | 28 | #include <linux/list.h> |
25 | #include <linux/spinlock.h> | 29 | #include <linux/spinlock.h> |
26 | 30 | ||
diff --git a/include/asm-ia64/unistd.h b/include/asm-ia64/unistd.h index 441c9e001776..315f8de950a2 100644 --- a/include/asm-ia64/unistd.h +++ b/include/asm-ia64/unistd.h | |||
@@ -292,7 +292,7 @@ | |||
292 | #define __NR_sync_file_range 1300 | 292 | #define __NR_sync_file_range 1300 |
293 | #define __NR_tee 1301 | 293 | #define __NR_tee 1301 |
294 | #define __NR_vmsplice 1302 | 294 | #define __NR_vmsplice 1302 |
295 | /* 1303 reserved for move_pages */ | 295 | #define __NR_fallocate 1303 |
296 | #define __NR_getcpu 1304 | 296 | #define __NR_getcpu 1304 |
297 | #define __NR_epoll_pwait 1305 | 297 | #define __NR_epoll_pwait 1305 |
298 | #define __NR_utimensat 1306 | 298 | #define __NR_utimensat 1306 |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index bf297b03a4e4..16ea3374dddf 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
@@ -67,6 +67,12 @@ struct clocksource { | |||
67 | unsigned long flags; | 67 | unsigned long flags; |
68 | cycle_t (*vread)(void); | 68 | cycle_t (*vread)(void); |
69 | void (*resume)(void); | 69 | void (*resume)(void); |
70 | #ifdef CONFIG_IA64 | ||
71 | void *fsys_mmio; /* used by fsyscall asm code */ | ||
72 | #define CLKSRC_FSYS_MMIO_SET(mmio, addr) ((mmio) = (addr)) | ||
73 | #else | ||
74 | #define CLKSRC_FSYS_MMIO_SET(mmio, addr) do { } while (0) | ||
75 | #endif | ||
70 | 76 | ||
71 | /* timekeeping specific data, ignore */ | 77 | /* timekeeping specific data, ignore */ |
72 | cycle_t cycle_interval; | 78 | cycle_t cycle_interval; |
diff --git a/include/linux/timex.h b/include/linux/timex.h index da929dbbea2a..37ac3ff90faf 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
@@ -224,66 +224,6 @@ static inline int ntp_synced(void) | |||
224 | __x < 0 ? -(-__x >> __s) : __x >> __s; \ | 224 | __x < 0 ? -(-__x >> __s) : __x >> __s; \ |
225 | }) | 225 | }) |
226 | 226 | ||
227 | |||
228 | #ifdef CONFIG_TIME_INTERPOLATION | ||
229 | |||
230 | #define TIME_SOURCE_CPU 0 | ||
231 | #define TIME_SOURCE_MMIO64 1 | ||
232 | #define TIME_SOURCE_MMIO32 2 | ||
233 | #define TIME_SOURCE_FUNCTION 3 | ||
234 | |||
235 | /* For proper operations time_interpolator clocks must run slightly slower | ||
236 | * than the standard clock since the interpolator may only correct by having | ||
237 | * time jump forward during a tick. A slower clock is usually a side effect | ||
238 | * of the integer divide of the nanoseconds in a second by the frequency. | ||
239 | * The accuracy of the division can be increased by specifying a shift. | ||
240 | * However, this may cause the clock not to be slow enough. | ||
241 | * The interpolator will self-tune the clock by slowing down if no | ||
242 | * resets occur or speeding up if the time jumps per analysis cycle | ||
243 | * become too high. | ||
244 | * | ||
245 | * Setting jitter compensates for a fluctuating timesource by comparing | ||
246 | * to the last value read from the timesource to insure that an earlier value | ||
247 | * is not returned by a later call. The price to pay | ||
248 | * for the compensation is that the timer routines are not as scalable anymore. | ||
249 | */ | ||
250 | |||
251 | struct time_interpolator { | ||
252 | u16 source; /* time source flags */ | ||
253 | u8 shift; /* increases accuracy of multiply by shifting. */ | ||
254 | /* Note that bits may be lost if shift is set too high */ | ||
255 | u8 jitter; /* if set compensate for fluctuations */ | ||
256 | u32 nsec_per_cyc; /* set by register_time_interpolator() */ | ||
257 | void *addr; /* address of counter or function */ | ||
258 | cycles_t mask; /* mask the valid bits of the counter */ | ||
259 | unsigned long offset; /* nsec offset at last update of interpolator */ | ||
260 | u64 last_counter; /* counter value in units of the counter at last update */ | ||
261 | cycles_t last_cycle; /* Last timer value if TIME_SOURCE_JITTER is set */ | ||
262 | u64 frequency; /* frequency in counts/second */ | ||
263 | long drift; /* drift in parts-per-million (or -1) */ | ||
264 | unsigned long skips; /* skips forward */ | ||
265 | unsigned long ns_skipped; /* nanoseconds skipped */ | ||
266 | struct time_interpolator *next; | ||
267 | }; | ||
268 | |||
269 | extern void register_time_interpolator(struct time_interpolator *); | ||
270 | extern void unregister_time_interpolator(struct time_interpolator *); | ||
271 | extern void time_interpolator_reset(void); | ||
272 | extern unsigned long time_interpolator_get_offset(void); | ||
273 | extern void time_interpolator_update(long delta_nsec); | ||
274 | |||
275 | #else /* !CONFIG_TIME_INTERPOLATION */ | ||
276 | |||
277 | static inline void time_interpolator_reset(void) | ||
278 | { | ||
279 | } | ||
280 | |||
281 | static inline void time_interpolator_update(long delta_nsec) | ||
282 | { | ||
283 | } | ||
284 | |||
285 | #endif /* !CONFIG_TIME_INTERPOLATION */ | ||
286 | |||
287 | #define TICK_LENGTH_SHIFT 32 | 227 | #define TICK_LENGTH_SHIFT 32 |
288 | 228 | ||
289 | #ifdef CONFIG_NO_HZ | 229 | #ifdef CONFIG_NO_HZ |
diff --git a/kernel/time.c b/kernel/time.c index ffe19149d770..e325597f5bf5 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
@@ -136,7 +136,6 @@ static inline void warp_clock(void) | |||
136 | write_seqlock_irq(&xtime_lock); | 136 | write_seqlock_irq(&xtime_lock); |
137 | wall_to_monotonic.tv_sec -= sys_tz.tz_minuteswest * 60; | 137 | wall_to_monotonic.tv_sec -= sys_tz.tz_minuteswest * 60; |
138 | xtime.tv_sec += sys_tz.tz_minuteswest * 60; | 138 | xtime.tv_sec += sys_tz.tz_minuteswest * 60; |
139 | time_interpolator_reset(); | ||
140 | write_sequnlock_irq(&xtime_lock); | 139 | write_sequnlock_irq(&xtime_lock); |
141 | clock_was_set(); | 140 | clock_was_set(); |
142 | } | 141 | } |
@@ -309,92 +308,6 @@ struct timespec timespec_trunc(struct timespec t, unsigned gran) | |||
309 | } | 308 | } |
310 | EXPORT_SYMBOL(timespec_trunc); | 309 | EXPORT_SYMBOL(timespec_trunc); |
311 | 310 | ||
312 | #ifdef CONFIG_TIME_INTERPOLATION | ||
313 | void getnstimeofday (struct timespec *tv) | ||
314 | { | ||
315 | unsigned long seq,sec,nsec; | ||
316 | |||
317 | do { | ||
318 | seq = read_seqbegin(&xtime_lock); | ||
319 | sec = xtime.tv_sec; | ||
320 | nsec = xtime.tv_nsec+time_interpolator_get_offset(); | ||
321 | } while (unlikely(read_seqretry(&xtime_lock, seq))); | ||
322 | |||
323 | while (unlikely(nsec >= NSEC_PER_SEC)) { | ||
324 | nsec -= NSEC_PER_SEC; | ||
325 | ++sec; | ||
326 | } | ||
327 | tv->tv_sec = sec; | ||
328 | tv->tv_nsec = nsec; | ||
329 | } | ||
330 | EXPORT_SYMBOL_GPL(getnstimeofday); | ||
331 | |||
332 | int do_settimeofday (struct timespec *tv) | ||
333 | { | ||
334 | time_t wtm_sec, sec = tv->tv_sec; | ||
335 | long wtm_nsec, nsec = tv->tv_nsec; | ||
336 | |||
337 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | ||
338 | return -EINVAL; | ||
339 | |||
340 | write_seqlock_irq(&xtime_lock); | ||
341 | { | ||
342 | wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); | ||
343 | wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); | ||
344 | |||
345 | set_normalized_timespec(&xtime, sec, nsec); | ||
346 | set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); | ||
347 | |||
348 | time_adjust = 0; /* stop active adjtime() */ | ||
349 | time_status |= STA_UNSYNC; | ||
350 | time_maxerror = NTP_PHASE_LIMIT; | ||
351 | time_esterror = NTP_PHASE_LIMIT; | ||
352 | time_interpolator_reset(); | ||
353 | } | ||
354 | write_sequnlock_irq(&xtime_lock); | ||
355 | clock_was_set(); | ||
356 | return 0; | ||
357 | } | ||
358 | EXPORT_SYMBOL(do_settimeofday); | ||
359 | |||
360 | void do_gettimeofday (struct timeval *tv) | ||
361 | { | ||
362 | unsigned long seq, nsec, usec, sec, offset; | ||
363 | do { | ||
364 | seq = read_seqbegin(&xtime_lock); | ||
365 | offset = time_interpolator_get_offset(); | ||
366 | sec = xtime.tv_sec; | ||
367 | nsec = xtime.tv_nsec; | ||
368 | } while (unlikely(read_seqretry(&xtime_lock, seq))); | ||
369 | |||
370 | usec = (nsec + offset) / 1000; | ||
371 | |||
372 | while (unlikely(usec >= USEC_PER_SEC)) { | ||
373 | usec -= USEC_PER_SEC; | ||
374 | ++sec; | ||
375 | } | ||
376 | |||
377 | tv->tv_sec = sec; | ||
378 | tv->tv_usec = usec; | ||
379 | |||
380 | /* | ||
381 | * Make sure xtime.tv_sec [returned by sys_time()] always | ||
382 | * follows the gettimeofday() result precisely. This | ||
383 | * condition is extremely unlikely, it can hit at most | ||
384 | * once per second: | ||
385 | */ | ||
386 | if (unlikely(xtime.tv_sec != tv->tv_sec)) { | ||
387 | unsigned long flags; | ||
388 | |||
389 | write_seqlock_irqsave(&xtime_lock, flags); | ||
390 | update_wall_time(); | ||
391 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
392 | } | ||
393 | } | ||
394 | EXPORT_SYMBOL(do_gettimeofday); | ||
395 | |||
396 | #else /* CONFIG_TIME_INTERPOLATION */ | ||
397 | |||
398 | #ifndef CONFIG_GENERIC_TIME | 311 | #ifndef CONFIG_GENERIC_TIME |
399 | /* | 312 | /* |
400 | * Simulate gettimeofday using do_gettimeofday which only allows a timeval | 313 | * Simulate gettimeofday using do_gettimeofday which only allows a timeval |
@@ -410,7 +323,6 @@ void getnstimeofday(struct timespec *tv) | |||
410 | } | 323 | } |
411 | EXPORT_SYMBOL_GPL(getnstimeofday); | 324 | EXPORT_SYMBOL_GPL(getnstimeofday); |
412 | #endif | 325 | #endif |
413 | #endif /* CONFIG_TIME_INTERPOLATION */ | ||
414 | 326 | ||
415 | /* Converts Gregorian date to seconds since 1970-01-01 00:00:00. | 327 | /* Converts Gregorian date to seconds since 1970-01-01 00:00:00. |
416 | * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 | 328 | * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 438c6b723ee2..b5e352597cbb 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -116,11 +116,6 @@ void second_overflow(void) | |||
116 | if (xtime.tv_sec % 86400 == 0) { | 116 | if (xtime.tv_sec % 86400 == 0) { |
117 | xtime.tv_sec--; | 117 | xtime.tv_sec--; |
118 | wall_to_monotonic.tv_sec++; | 118 | wall_to_monotonic.tv_sec++; |
119 | /* | ||
120 | * The timer interpolator will make time change | ||
121 | * gradually instead of an immediate jump by one second | ||
122 | */ | ||
123 | time_interpolator_update(-NSEC_PER_SEC); | ||
124 | time_state = TIME_OOP; | 119 | time_state = TIME_OOP; |
125 | printk(KERN_NOTICE "Clock: inserting leap second " | 120 | printk(KERN_NOTICE "Clock: inserting leap second " |
126 | "23:59:60 UTC\n"); | 121 | "23:59:60 UTC\n"); |
@@ -130,11 +125,6 @@ void second_overflow(void) | |||
130 | if ((xtime.tv_sec + 1) % 86400 == 0) { | 125 | if ((xtime.tv_sec + 1) % 86400 == 0) { |
131 | xtime.tv_sec++; | 126 | xtime.tv_sec++; |
132 | wall_to_monotonic.tv_sec--; | 127 | wall_to_monotonic.tv_sec--; |
133 | /* | ||
134 | * Use of time interpolator for a gradual change of | ||
135 | * time | ||
136 | */ | ||
137 | time_interpolator_update(NSEC_PER_SEC); | ||
138 | time_state = TIME_WAIT; | 128 | time_state = TIME_WAIT; |
139 | printk(KERN_NOTICE "Clock: deleting leap second " | 129 | printk(KERN_NOTICE "Clock: deleting leap second " |
140 | "23:59:59 UTC\n"); | 130 | "23:59:59 UTC\n"); |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 89698776613e..88c81026e003 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -466,10 +466,6 @@ void update_wall_time(void) | |||
466 | second_overflow(); | 466 | second_overflow(); |
467 | } | 467 | } |
468 | 468 | ||
469 | /* interpolator bits */ | ||
470 | time_interpolator_update(clock->xtime_interval | ||
471 | >> clock->shift); | ||
472 | |||
473 | /* accumulate error between NTP and clock interval */ | 469 | /* accumulate error between NTP and clock interval */ |
474 | clock->error += current_tick_length(); | 470 | clock->error += current_tick_length(); |
475 | clock->error -= clock->xtime_interval << (TICK_LENGTH_SHIFT - clock->shift); | 471 | clock->error -= clock->xtime_interval << (TICK_LENGTH_SHIFT - clock->shift); |
diff --git a/kernel/timer.c b/kernel/timer.c index d1e8b975c7ae..6ce1952eea7d 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -1349,194 +1349,6 @@ void __init init_timers(void) | |||
1349 | open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL); | 1349 | open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL); |
1350 | } | 1350 | } |
1351 | 1351 | ||
1352 | #ifdef CONFIG_TIME_INTERPOLATION | ||
1353 | |||
1354 | struct time_interpolator *time_interpolator __read_mostly; | ||
1355 | static struct time_interpolator *time_interpolator_list __read_mostly; | ||
1356 | static DEFINE_SPINLOCK(time_interpolator_lock); | ||
1357 | |||
1358 | static inline cycles_t time_interpolator_get_cycles(unsigned int src) | ||
1359 | { | ||
1360 | unsigned long (*x)(void); | ||
1361 | |||
1362 | switch (src) | ||
1363 | { | ||
1364 | case TIME_SOURCE_FUNCTION: | ||
1365 | x = time_interpolator->addr; | ||
1366 | return x(); | ||
1367 | |||
1368 | case TIME_SOURCE_MMIO64 : | ||
1369 | return readq_relaxed((void __iomem *)time_interpolator->addr); | ||
1370 | |||
1371 | case TIME_SOURCE_MMIO32 : | ||
1372 | return readl_relaxed((void __iomem *)time_interpolator->addr); | ||
1373 | |||
1374 | default: return get_cycles(); | ||
1375 | } | ||
1376 | } | ||
1377 | |||
1378 | static inline u64 time_interpolator_get_counter(int writelock) | ||
1379 | { | ||
1380 | unsigned int src = time_interpolator->source; | ||
1381 | |||
1382 | if (time_interpolator->jitter) | ||
1383 | { | ||
1384 | cycles_t lcycle; | ||
1385 | cycles_t now; | ||
1386 | |||
1387 | do { | ||
1388 | lcycle = time_interpolator->last_cycle; | ||
1389 | now = time_interpolator_get_cycles(src); | ||
1390 | if (lcycle && time_after(lcycle, now)) | ||
1391 | return lcycle; | ||
1392 | |||
1393 | /* When holding the xtime write lock, there's no need | ||
1394 | * to add the overhead of the cmpxchg. Readers are | ||
1395 | * force to retry until the write lock is released. | ||
1396 | */ | ||
1397 | if (writelock) { | ||
1398 | time_interpolator->last_cycle = now; | ||
1399 | return now; | ||
1400 | } | ||
1401 | /* Keep track of the last timer value returned. The use of cmpxchg here | ||
1402 | * will cause contention in an SMP environment. | ||
1403 | */ | ||
1404 | } while (unlikely(cmpxchg(&time_interpolator->last_cycle, lcycle, now) != lcycle)); | ||
1405 | return now; | ||
1406 | } | ||
1407 | else | ||
1408 | return time_interpolator_get_cycles(src); | ||
1409 | } | ||
1410 | |||
1411 | void time_interpolator_reset(void) | ||
1412 | { | ||
1413 | time_interpolator->offset = 0; | ||
1414 | time_interpolator->last_counter = time_interpolator_get_counter(1); | ||
1415 | } | ||
1416 | |||
1417 | #define GET_TI_NSECS(count,i) (((((count) - i->last_counter) & (i)->mask) * (i)->nsec_per_cyc) >> (i)->shift) | ||
1418 | |||
1419 | unsigned long time_interpolator_get_offset(void) | ||
1420 | { | ||
1421 | /* If we do not have a time interpolator set up then just return zero */ | ||
1422 | if (!time_interpolator) | ||
1423 | return 0; | ||
1424 | |||
1425 | return time_interpolator->offset + | ||
1426 | GET_TI_NSECS(time_interpolator_get_counter(0), time_interpolator); | ||
1427 | } | ||
1428 | |||
1429 | #define INTERPOLATOR_ADJUST 65536 | ||
1430 | #define INTERPOLATOR_MAX_SKIP 10*INTERPOLATOR_ADJUST | ||
1431 | |||
1432 | void time_interpolator_update(long delta_nsec) | ||
1433 | { | ||
1434 | u64 counter; | ||
1435 | unsigned long offset; | ||
1436 | |||
1437 | /* If there is no time interpolator set up then do nothing */ | ||
1438 | if (!time_interpolator) | ||
1439 | return; | ||
1440 | |||
1441 | /* | ||
1442 | * The interpolator compensates for late ticks by accumulating the late | ||
1443 | * time in time_interpolator->offset. A tick earlier than expected will | ||
1444 | * lead to a reset of the offset and a corresponding jump of the clock | ||
1445 | * forward. Again this only works if the interpolator clock is running | ||
1446 | * slightly slower than the regular clock and the tuning logic insures | ||
1447 | * that. | ||
1448 | */ | ||
1449 | |||
1450 | counter = time_interpolator_get_counter(1); | ||
1451 | offset = time_interpolator->offset + | ||
1452 | GET_TI_NSECS(counter, time_interpolator); | ||
1453 | |||
1454 | if (delta_nsec < 0 || (unsigned long) delta_nsec < offset) | ||
1455 | time_interpolator->offset = offset - delta_nsec; | ||
1456 | else { | ||
1457 | time_interpolator->skips++; | ||
1458 | time_interpolator->ns_skipped += delta_nsec - offset; | ||
1459 | time_interpolator->offset = 0; | ||
1460 | } | ||
1461 | time_interpolator->last_counter = counter; | ||
1462 | |||
1463 | /* Tuning logic for time interpolator invoked every minute or so. | ||
1464 | * Decrease interpolator clock speed if no skips occurred and an offset is carried. | ||
1465 | * Increase interpolator clock speed if we skip too much time. | ||
1466 | */ | ||
1467 | if (jiffies % INTERPOLATOR_ADJUST == 0) | ||
1468 | { | ||
1469 | if (time_interpolator->skips == 0 && time_interpolator->offset > tick_nsec) | ||
1470 | time_interpolator->nsec_per_cyc--; | ||
1471 | if (time_interpolator->ns_skipped > INTERPOLATOR_MAX_SKIP && time_interpolator->offset == 0) | ||
1472 | time_interpolator->nsec_per_cyc++; | ||
1473 | time_interpolator->skips = 0; | ||
1474 | time_interpolator->ns_skipped = 0; | ||
1475 | } | ||
1476 | } | ||
1477 | |||
1478 | static inline int | ||
1479 | is_better_time_interpolator(struct time_interpolator *new) | ||
1480 | { | ||
1481 | if (!time_interpolator) | ||
1482 | return 1; | ||
1483 | return new->frequency > 2*time_interpolator->frequency || | ||
1484 | (unsigned long)new->drift < (unsigned long)time_interpolator->drift; | ||
1485 | } | ||
1486 | |||
1487 | void | ||
1488 | register_time_interpolator(struct time_interpolator *ti) | ||
1489 | { | ||
1490 | unsigned long flags; | ||
1491 | |||
1492 | /* Sanity check */ | ||
1493 | BUG_ON(ti->frequency == 0 || ti->mask == 0); | ||
1494 | |||
1495 | ti->nsec_per_cyc = ((u64)NSEC_PER_SEC << ti->shift) / ti->frequency; | ||
1496 | spin_lock(&time_interpolator_lock); | ||
1497 | write_seqlock_irqsave(&xtime_lock, flags); | ||
1498 | if (is_better_time_interpolator(ti)) { | ||
1499 | time_interpolator = ti; | ||
1500 | time_interpolator_reset(); | ||
1501 | } | ||
1502 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
1503 | |||
1504 | ti->next = time_interpolator_list; | ||
1505 | time_interpolator_list = ti; | ||
1506 | spin_unlock(&time_interpolator_lock); | ||
1507 | } | ||
1508 | |||
1509 | void | ||
1510 | unregister_time_interpolator(struct time_interpolator *ti) | ||
1511 | { | ||
1512 | struct time_interpolator *curr, **prev; | ||
1513 | unsigned long flags; | ||
1514 | |||
1515 | spin_lock(&time_interpolator_lock); | ||
1516 | prev = &time_interpolator_list; | ||
1517 | for (curr = *prev; curr; curr = curr->next) { | ||
1518 | if (curr == ti) { | ||
1519 | *prev = curr->next; | ||
1520 | break; | ||
1521 | } | ||
1522 | prev = &curr->next; | ||
1523 | } | ||
1524 | |||
1525 | write_seqlock_irqsave(&xtime_lock, flags); | ||
1526 | if (ti == time_interpolator) { | ||
1527 | /* we lost the best time-interpolator: */ | ||
1528 | time_interpolator = NULL; | ||
1529 | /* find the next-best interpolator */ | ||
1530 | for (curr = time_interpolator_list; curr; curr = curr->next) | ||
1531 | if (is_better_time_interpolator(curr)) | ||
1532 | time_interpolator = curr; | ||
1533 | time_interpolator_reset(); | ||
1534 | } | ||
1535 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
1536 | spin_unlock(&time_interpolator_lock); | ||
1537 | } | ||
1538 | #endif /* CONFIG_TIME_INTERPOLATION */ | ||
1539 | |||
1540 | /** | 1352 | /** |
1541 | * msleep - sleep safely even with waitqueue interruptions | 1353 | * msleep - sleep safely even with waitqueue interruptions |
1542 | * @msecs: Time in milliseconds to sleep for | 1354 | * @msecs: Time in milliseconds to sleep for |