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 |
