diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-10 21:41:39 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-10 21:41:39 -0500 |
commit | abede81c4fb2e3b85d8760f25e3da39d2c69a134 (patch) | |
tree | 26c893ec108d837eb9171d678c55a1cea7b22af4 /arch | |
parent | c9d557c19f94df42db78d4a5de4d25feee694bad (diff) | |
parent | c59765042f53a79a7a65585042ff463b69cb248c (diff) |
Merge commit 'v2.6.29-rc1' into core/urgent
Diffstat (limited to 'arch')
293 files changed, 4107 insertions, 2877 deletions
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index ff8cb638472e..a3b938811400 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -320,24 +320,6 @@ pcibios_update_irq(struct pci_dev *dev, int irq) | |||
320 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 320 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
321 | } | 321 | } |
322 | 322 | ||
323 | /* Most Alphas have straight-forward swizzling needs. */ | ||
324 | |||
325 | u8 __init | ||
326 | common_swizzle(struct pci_dev *dev, u8 *pinp) | ||
327 | { | ||
328 | u8 pin = *pinp; | ||
329 | |||
330 | while (dev->bus->parent) { | ||
331 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | ||
332 | /* Move up the chain of bridges. */ | ||
333 | dev = dev->bus->self; | ||
334 | } | ||
335 | *pinp = pin; | ||
336 | |||
337 | /* The slot is the slot of the last bridge. */ | ||
338 | return PCI_SLOT(dev->devfn); | ||
339 | } | ||
340 | |||
341 | void | 323 | void |
342 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | 324 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, |
343 | struct resource *res) | 325 | struct resource *res) |
diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index f8b74995a002..00edd04b585e 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h | |||
@@ -106,16 +106,11 @@ struct pci_iommu_arena; | |||
106 | * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A. | 106 | * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A. |
107 | * Thus, each swizzle is ((pin-1) + (device#-4)) % 4 | 107 | * Thus, each swizzle is ((pin-1) + (device#-4)) % 4 |
108 | * | 108 | * |
109 | * The following code swizzles for exactly one bridge. The routine | 109 | * pci_swizzle_interrupt_pin() swizzles for exactly one bridge. The routine |
110 | * common_swizzle below handles multiple bridges. But there are a | 110 | * pci_common_swizzle() handles multiple bridges. But there are a |
111 | * couple boards that do strange things, so we define this here. | 111 | * couple boards that do strange things. |
112 | */ | 112 | */ |
113 | 113 | ||
114 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
115 | { | ||
116 | return (((pin-1) + slot) % 4) + 1; | ||
117 | } | ||
118 | |||
119 | 114 | ||
120 | /* The following macro is used to implement the table-based irq mapping | 115 | /* The following macro is used to implement the table-based irq mapping |
121 | function for all single-bus Alphas. */ | 116 | function for all single-bus Alphas. */ |
@@ -184,7 +179,7 @@ extern int pci_probe_only; | |||
184 | extern unsigned long alpha_agpgart_size; | 179 | extern unsigned long alpha_agpgart_size; |
185 | 180 | ||
186 | extern void common_init_pci(void); | 181 | extern void common_init_pci(void); |
187 | extern u8 common_swizzle(struct pci_dev *, u8 *); | 182 | #define common_swizzle pci_common_swizzle |
188 | extern struct pci_controller *alloc_pci_controller(void); | 183 | extern struct pci_controller *alloc_pci_controller(void); |
189 | extern struct resource *alloc_resource(void); | 184 | extern struct resource *alloc_resource(void); |
190 | 185 | ||
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index ab44c164d9d4..9c9d1fd4155f 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -481,7 +481,7 @@ monet_swizzle(struct pci_dev *dev, u8 *pinp) | |||
481 | slot = PCI_SLOT(dev->devfn); | 481 | slot = PCI_SLOT(dev->devfn); |
482 | break; | 482 | break; |
483 | } | 483 | } |
484 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; | 484 | pin = pci_swizzle_interrupt_pin(dev, pin); |
485 | 485 | ||
486 | /* Move up the chain of bridges. */ | 486 | /* Move up the chain of bridges. */ |
487 | dev = dev->bus->self; | 487 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 7ef3b6fb3700..baf60f36cbd7 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
@@ -204,7 +204,7 @@ eiger_swizzle(struct pci_dev *dev, u8 *pinp) | |||
204 | break; | 204 | break; |
205 | } | 205 | } |
206 | /* Must be a card-based bridge. */ | 206 | /* Must be a card-based bridge. */ |
207 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 207 | pin = pci_swizzle_interrupt_pin(dev, pin); |
208 | 208 | ||
209 | /* Move up the chain of bridges. */ | 209 | /* Move up the chain of bridges. */ |
210 | dev = dev->bus->self; | 210 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index 910b43cd63e8..61ccd95579ec 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c | |||
@@ -219,7 +219,7 @@ miata_swizzle(struct pci_dev *dev, u8 *pinp) | |||
219 | slot = PCI_SLOT(dev->devfn) + 9; | 219 | slot = PCI_SLOT(dev->devfn) + 9; |
220 | break; | 220 | break; |
221 | } | 221 | } |
222 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 222 | pin = pci_swizzle_interrupt_pin(dev, pin); |
223 | 223 | ||
224 | /* Move up the chain of bridges. */ | 224 | /* Move up the chain of bridges. */ |
225 | dev = dev->bus->self; | 225 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index eb2a1d63f484..538876b62449 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
@@ -257,7 +257,7 @@ noritake_swizzle(struct pci_dev *dev, u8 *pinp) | |||
257 | slot = PCI_SLOT(dev->devfn) + 15; | 257 | slot = PCI_SLOT(dev->devfn) + 15; |
258 | break; | 258 | break; |
259 | } | 259 | } |
260 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; | 260 | pin = pci_swizzle_interrupt_pin(dev, pin); |
261 | 261 | ||
262 | /* Move up the chain of bridges. */ | 262 | /* Move up the chain of bridges. */ |
263 | dev = dev->bus->self; | 263 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 5b99cf3cd69c..f15a329b6011 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c | |||
@@ -160,7 +160,7 @@ ruffian_swizzle(struct pci_dev *dev, u8 *pinp) | |||
160 | slot = PCI_SLOT(dev->devfn) + 10; | 160 | slot = PCI_SLOT(dev->devfn) + 10; |
161 | break; | 161 | break; |
162 | } | 162 | } |
163 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 163 | pin = pci_swizzle_interrupt_pin(dev, pin); |
164 | 164 | ||
165 | /* Move up the chain of bridges. */ | 165 | /* Move up the chain of bridges. */ |
166 | dev = dev->bus->self; | 166 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index a4555f497639..d232e42be018 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
@@ -425,7 +425,7 @@ lynx_swizzle(struct pci_dev *dev, u8 *pinp) | |||
425 | slot = PCI_SLOT(dev->devfn) + 11; | 425 | slot = PCI_SLOT(dev->devfn) + 11; |
426 | break; | 426 | break; |
427 | } | 427 | } |
428 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; | 428 | pin = pci_swizzle_interrupt_pin(dev, pin); |
429 | 429 | ||
430 | /* Move up the chain of bridges. */ | 430 | /* Move up the chain of bridges. */ |
431 | dev = dev->bus->self; | 431 | dev = dev->bus->self; |
diff --git a/arch/arm/configs/clps7500_defconfig b/arch/arm/configs/clps7500_defconfig deleted file mode 100644 index 49e9f9d8b3d1..000000000000 --- a/arch/arm/configs/clps7500_defconfig +++ /dev/null | |||
@@ -1,801 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.12-rc1-bk2 | ||
4 | # Sun Mar 27 17:20:48 2005 | ||
5 | # | ||
6 | CONFIG_ARM=y | ||
7 | CONFIG_MMU=y | ||
8 | CONFIG_UID16=y | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
10 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
11 | CONFIG_GENERIC_IOMAP=y | ||
12 | |||
13 | # | ||
14 | # Code maturity level options | ||
15 | # | ||
16 | CONFIG_EXPERIMENTAL=y | ||
17 | CONFIG_CLEAN_COMPILE=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | CONFIG_SWAP=y | ||
25 | CONFIG_SYSVIPC=y | ||
26 | # CONFIG_POSIX_MQUEUE is not set | ||
27 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
28 | # CONFIG_SYSCTL is not set | ||
29 | # CONFIG_AUDIT is not set | ||
30 | # CONFIG_HOTPLUG is not set | ||
31 | CONFIG_KOBJECT_UEVENT=y | ||
32 | # CONFIG_IKCONFIG is not set | ||
33 | CONFIG_EMBEDDED=y | ||
34 | CONFIG_KALLSYMS=y | ||
35 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
36 | CONFIG_BASE_FULL=y | ||
37 | CONFIG_FUTEX=y | ||
38 | CONFIG_EPOLL=y | ||
39 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
40 | CONFIG_SHMEM=y | ||
41 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
42 | CONFIG_CC_ALIGN_LABELS=0 | ||
43 | CONFIG_CC_ALIGN_LOOPS=0 | ||
44 | CONFIG_CC_ALIGN_JUMPS=0 | ||
45 | # CONFIG_TINY_SHMEM is not set | ||
46 | CONFIG_BASE_SMALL=0 | ||
47 | |||
48 | # | ||
49 | # Loadable module support | ||
50 | # | ||
51 | # CONFIG_MODULES is not set | ||
52 | |||
53 | # | ||
54 | # System Type | ||
55 | # | ||
56 | CONFIG_ARCH_CLPS7500=y | ||
57 | # CONFIG_ARCH_CLPS711X is not set | ||
58 | # CONFIG_ARCH_CO285 is not set | ||
59 | # CONFIG_ARCH_EBSA110 is not set | ||
60 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
61 | # CONFIG_ARCH_INTEGRATOR is not set | ||
62 | # CONFIG_ARCH_IOP3XX is not set | ||
63 | # CONFIG_ARCH_IXP4XX is not set | ||
64 | # CONFIG_ARCH_IXP2000 is not set | ||
65 | # CONFIG_ARCH_L7200 is not set | ||
66 | # CONFIG_ARCH_PXA is not set | ||
67 | # CONFIG_ARCH_RPC is not set | ||
68 | # CONFIG_ARCH_SA1100 is not set | ||
69 | # CONFIG_ARCH_S3C2410 is not set | ||
70 | # CONFIG_ARCH_SHARK is not set | ||
71 | # CONFIG_ARCH_LH7A40X is not set | ||
72 | # CONFIG_ARCH_OMAP is not set | ||
73 | # CONFIG_ARCH_VERSATILE is not set | ||
74 | # CONFIG_ARCH_IMX is not set | ||
75 | # CONFIG_ARCH_H720X is not set | ||
76 | |||
77 | # | ||
78 | # Processor Type | ||
79 | # | ||
80 | CONFIG_CPU_32=y | ||
81 | CONFIG_CPU_ARM710=y | ||
82 | CONFIG_CPU_32v3=y | ||
83 | CONFIG_CPU_CACHE_V3=y | ||
84 | CONFIG_CPU_CACHE_VIVT=y | ||
85 | CONFIG_CPU_COPY_V3=y | ||
86 | CONFIG_CPU_TLB_V3=y | ||
87 | |||
88 | # | ||
89 | # Processor Features | ||
90 | # | ||
91 | CONFIG_TIMER_ACORN=y | ||
92 | |||
93 | # | ||
94 | # Bus support | ||
95 | # | ||
96 | CONFIG_ISA=y | ||
97 | |||
98 | # | ||
99 | # PCCARD (PCMCIA/CardBus) support | ||
100 | # | ||
101 | # CONFIG_PCCARD is not set | ||
102 | |||
103 | # | ||
104 | # Kernel Features | ||
105 | # | ||
106 | # CONFIG_PREEMPT is not set | ||
107 | CONFIG_ALIGNMENT_TRAP=y | ||
108 | |||
109 | # | ||
110 | # Boot options | ||
111 | # | ||
112 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
113 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
114 | CONFIG_CMDLINE="mem=16M root=nfs" | ||
115 | # CONFIG_XIP_KERNEL is not set | ||
116 | |||
117 | # | ||
118 | # Floating point emulation | ||
119 | # | ||
120 | |||
121 | # | ||
122 | # At least one emulation must be selected | ||
123 | # | ||
124 | # CONFIG_FPE_NWFPE is not set | ||
125 | |||
126 | # | ||
127 | # Userspace binary formats | ||
128 | # | ||
129 | CONFIG_BINFMT_ELF=y | ||
130 | # CONFIG_BINFMT_AOUT is not set | ||
131 | # CONFIG_BINFMT_MISC is not set | ||
132 | # CONFIG_ARTHUR is not set | ||
133 | |||
134 | # | ||
135 | # Power management options | ||
136 | # | ||
137 | # CONFIG_PM is not set | ||
138 | |||
139 | # | ||
140 | # Device Drivers | ||
141 | # | ||
142 | |||
143 | # | ||
144 | # Generic Driver Options | ||
145 | # | ||
146 | CONFIG_STANDALONE=y | ||
147 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
148 | # CONFIG_FW_LOADER is not set | ||
149 | |||
150 | # | ||
151 | # Memory Technology Devices (MTD) | ||
152 | # | ||
153 | CONFIG_MTD=y | ||
154 | # CONFIG_MTD_DEBUG is not set | ||
155 | # CONFIG_MTD_CONCAT is not set | ||
156 | # CONFIG_MTD_PARTITIONS is not set | ||
157 | |||
158 | # | ||
159 | # User Modules And Translation Layers | ||
160 | # | ||
161 | # CONFIG_MTD_CHAR is not set | ||
162 | # CONFIG_MTD_BLOCK is not set | ||
163 | # CONFIG_MTD_BLOCK_RO is not set | ||
164 | # CONFIG_FTL is not set | ||
165 | # CONFIG_NFTL is not set | ||
166 | # CONFIG_INFTL is not set | ||
167 | |||
168 | # | ||
169 | # RAM/ROM/Flash chip drivers | ||
170 | # | ||
171 | # CONFIG_MTD_CFI is not set | ||
172 | # CONFIG_MTD_JEDECPROBE is not set | ||
173 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
174 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
175 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
176 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
177 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
178 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
179 | CONFIG_MTD_CFI_I1=y | ||
180 | CONFIG_MTD_CFI_I2=y | ||
181 | # CONFIG_MTD_CFI_I4 is not set | ||
182 | # CONFIG_MTD_CFI_I8 is not set | ||
183 | # CONFIG_MTD_RAM is not set | ||
184 | # CONFIG_MTD_ROM is not set | ||
185 | # CONFIG_MTD_ABSENT is not set | ||
186 | |||
187 | # | ||
188 | # Mapping drivers for chip access | ||
189 | # | ||
190 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
191 | |||
192 | # | ||
193 | # Self-contained MTD device drivers | ||
194 | # | ||
195 | # CONFIG_MTD_SLRAM is not set | ||
196 | # CONFIG_MTD_PHRAM is not set | ||
197 | # CONFIG_MTD_MTDRAM is not set | ||
198 | # CONFIG_MTD_BLKMTD is not set | ||
199 | # CONFIG_MTD_BLOCK2MTD is not set | ||
200 | |||
201 | # | ||
202 | # Disk-On-Chip Device Drivers | ||
203 | # | ||
204 | # CONFIG_MTD_DOC2000 is not set | ||
205 | # CONFIG_MTD_DOC2001 is not set | ||
206 | # CONFIG_MTD_DOC2001PLUS is not set | ||
207 | |||
208 | # | ||
209 | # NAND Flash Device Drivers | ||
210 | # | ||
211 | # CONFIG_MTD_NAND is not set | ||
212 | |||
213 | # | ||
214 | # Parallel port support | ||
215 | # | ||
216 | CONFIG_PARPORT=y | ||
217 | CONFIG_PARPORT_PC=y | ||
218 | CONFIG_PARPORT_PC_FIFO=y | ||
219 | # CONFIG_PARPORT_PC_SUPERIO is not set | ||
220 | # CONFIG_PARPORT_ARC is not set | ||
221 | # CONFIG_PARPORT_GSC is not set | ||
222 | CONFIG_PARPORT_1284=y | ||
223 | |||
224 | # | ||
225 | # Plug and Play support | ||
226 | # | ||
227 | # CONFIG_PNP is not set | ||
228 | |||
229 | # | ||
230 | # Block devices | ||
231 | # | ||
232 | # CONFIG_BLK_DEV_FD is not set | ||
233 | # CONFIG_BLK_DEV_XD is not set | ||
234 | # CONFIG_PARIDE is not set | ||
235 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
236 | # CONFIG_BLK_DEV_LOOP is not set | ||
237 | CONFIG_BLK_DEV_NBD=y | ||
238 | CONFIG_BLK_DEV_RAM=y | ||
239 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
240 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
241 | # CONFIG_BLK_DEV_INITRD is not set | ||
242 | CONFIG_INITRAMFS_SOURCE="" | ||
243 | # CONFIG_CDROM_PKTCDVD is not set | ||
244 | |||
245 | # | ||
246 | # IO Schedulers | ||
247 | # | ||
248 | CONFIG_IOSCHED_NOOP=y | ||
249 | CONFIG_IOSCHED_AS=y | ||
250 | CONFIG_IOSCHED_DEADLINE=y | ||
251 | CONFIG_IOSCHED_CFQ=y | ||
252 | # CONFIG_ATA_OVER_ETH is not set | ||
253 | |||
254 | # | ||
255 | # ATA/ATAPI/MFM/RLL support | ||
256 | # | ||
257 | # CONFIG_IDE is not set | ||
258 | |||
259 | # | ||
260 | # SCSI device support | ||
261 | # | ||
262 | # CONFIG_SCSI is not set | ||
263 | |||
264 | # | ||
265 | # Multi-device support (RAID and LVM) | ||
266 | # | ||
267 | # CONFIG_MD is not set | ||
268 | |||
269 | # | ||
270 | # Fusion MPT device support | ||
271 | # | ||
272 | |||
273 | # | ||
274 | # IEEE 1394 (FireWire) support | ||
275 | # | ||
276 | |||
277 | # | ||
278 | # I2O device support | ||
279 | # | ||
280 | |||
281 | # | ||
282 | # Networking support | ||
283 | # | ||
284 | CONFIG_NET=y | ||
285 | |||
286 | # | ||
287 | # Networking options | ||
288 | # | ||
289 | # CONFIG_PACKET is not set | ||
290 | # CONFIG_NETLINK_DEV is not set | ||
291 | CONFIG_UNIX=y | ||
292 | # CONFIG_NET_KEY is not set | ||
293 | CONFIG_INET=y | ||
294 | # CONFIG_IP_MULTICAST is not set | ||
295 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
296 | CONFIG_IP_PNP=y | ||
297 | # CONFIG_IP_PNP_DHCP is not set | ||
298 | CONFIG_IP_PNP_BOOTP=y | ||
299 | # CONFIG_IP_PNP_RARP is not set | ||
300 | # CONFIG_NET_IPIP is not set | ||
301 | # CONFIG_NET_IPGRE is not set | ||
302 | # CONFIG_ARPD is not set | ||
303 | # CONFIG_SYN_COOKIES is not set | ||
304 | # CONFIG_INET_AH is not set | ||
305 | # CONFIG_INET_ESP is not set | ||
306 | # CONFIG_INET_IPCOMP is not set | ||
307 | # CONFIG_INET_TUNNEL is not set | ||
308 | CONFIG_IP_TCPDIAG=y | ||
309 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
310 | # CONFIG_IPV6 is not set | ||
311 | # CONFIG_NETFILTER is not set | ||
312 | |||
313 | # | ||
314 | # SCTP Configuration (EXPERIMENTAL) | ||
315 | # | ||
316 | # CONFIG_IP_SCTP is not set | ||
317 | # CONFIG_ATM is not set | ||
318 | # CONFIG_BRIDGE is not set | ||
319 | # CONFIG_VLAN_8021Q is not set | ||
320 | # CONFIG_DECNET is not set | ||
321 | # CONFIG_LLC2 is not set | ||
322 | # CONFIG_IPX is not set | ||
323 | # CONFIG_ATALK is not set | ||
324 | # CONFIG_X25 is not set | ||
325 | # CONFIG_LAPB is not set | ||
326 | # CONFIG_NET_DIVERT is not set | ||
327 | # CONFIG_ECONET is not set | ||
328 | # CONFIG_WAN_ROUTER is not set | ||
329 | |||
330 | # | ||
331 | # QoS and/or fair queueing | ||
332 | # | ||
333 | # CONFIG_NET_SCHED is not set | ||
334 | # CONFIG_NET_CLS_ROUTE is not set | ||
335 | |||
336 | # | ||
337 | # Network testing | ||
338 | # | ||
339 | # CONFIG_NET_PKTGEN is not set | ||
340 | # CONFIG_NETPOLL is not set | ||
341 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
342 | # CONFIG_HAMRADIO is not set | ||
343 | # CONFIG_IRDA is not set | ||
344 | # CONFIG_BT is not set | ||
345 | CONFIG_NETDEVICES=y | ||
346 | CONFIG_DUMMY=y | ||
347 | # CONFIG_BONDING is not set | ||
348 | # CONFIG_EQUALIZER is not set | ||
349 | # CONFIG_TUN is not set | ||
350 | |||
351 | # | ||
352 | # ARCnet devices | ||
353 | # | ||
354 | # CONFIG_ARCNET is not set | ||
355 | |||
356 | # | ||
357 | # Ethernet (10 or 100Mbit) | ||
358 | # | ||
359 | CONFIG_NET_ETHERNET=y | ||
360 | # CONFIG_MII is not set | ||
361 | # CONFIG_NET_VENDOR_3COM is not set | ||
362 | # CONFIG_LANCE is not set | ||
363 | # CONFIG_NET_VENDOR_SMC is not set | ||
364 | # CONFIG_SMC91X is not set | ||
365 | # CONFIG_NET_VENDOR_RACAL is not set | ||
366 | # CONFIG_AT1700 is not set | ||
367 | # CONFIG_DEPCA is not set | ||
368 | # CONFIG_HP100 is not set | ||
369 | # CONFIG_NET_ISA is not set | ||
370 | CONFIG_NET_PCI=y | ||
371 | # CONFIG_AC3200 is not set | ||
372 | # CONFIG_APRICOT is not set | ||
373 | CONFIG_CS89x0=y | ||
374 | # CONFIG_NET_POCKET is not set | ||
375 | |||
376 | # | ||
377 | # Ethernet (1000 Mbit) | ||
378 | # | ||
379 | |||
380 | # | ||
381 | # Ethernet (10000 Mbit) | ||
382 | # | ||
383 | |||
384 | # | ||
385 | # Token Ring devices | ||
386 | # | ||
387 | # CONFIG_TR is not set | ||
388 | |||
389 | # | ||
390 | # Wireless LAN (non-hamradio) | ||
391 | # | ||
392 | # CONFIG_NET_RADIO is not set | ||
393 | |||
394 | # | ||
395 | # Wan interfaces | ||
396 | # | ||
397 | # CONFIG_WAN is not set | ||
398 | # CONFIG_PLIP is not set | ||
399 | CONFIG_PPP=y | ||
400 | # CONFIG_PPP_MULTILINK is not set | ||
401 | # CONFIG_PPP_FILTER is not set | ||
402 | # CONFIG_PPP_ASYNC is not set | ||
403 | # CONFIG_PPP_SYNC_TTY is not set | ||
404 | # CONFIG_PPP_DEFLATE is not set | ||
405 | # CONFIG_PPP_BSDCOMP is not set | ||
406 | # CONFIG_PPPOE is not set | ||
407 | CONFIG_SLIP=y | ||
408 | CONFIG_SLIP_COMPRESSED=y | ||
409 | # CONFIG_SLIP_SMART is not set | ||
410 | # CONFIG_SLIP_MODE_SLIP6 is not set | ||
411 | # CONFIG_SHAPER is not set | ||
412 | # CONFIG_NETCONSOLE is not set | ||
413 | |||
414 | # | ||
415 | # ISDN subsystem | ||
416 | # | ||
417 | # CONFIG_ISDN is not set | ||
418 | |||
419 | # | ||
420 | # Input device support | ||
421 | # | ||
422 | CONFIG_INPUT=y | ||
423 | |||
424 | # | ||
425 | # Userland interfaces | ||
426 | # | ||
427 | CONFIG_INPUT_MOUSEDEV=y | ||
428 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
429 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
430 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
431 | # CONFIG_INPUT_JOYDEV is not set | ||
432 | # CONFIG_INPUT_TSDEV is not set | ||
433 | # CONFIG_INPUT_EVDEV is not set | ||
434 | # CONFIG_INPUT_EVBUG is not set | ||
435 | |||
436 | # | ||
437 | # Input Device Drivers | ||
438 | # | ||
439 | CONFIG_INPUT_KEYBOARD=y | ||
440 | CONFIG_KEYBOARD_ATKBD=y | ||
441 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
442 | # CONFIG_KEYBOARD_LKKBD is not set | ||
443 | # CONFIG_KEYBOARD_XTKBD is not set | ||
444 | # CONFIG_KEYBOARD_NEWTON is not set | ||
445 | CONFIG_INPUT_MOUSE=y | ||
446 | CONFIG_MOUSE_PS2=y | ||
447 | # CONFIG_MOUSE_SERIAL is not set | ||
448 | # CONFIG_MOUSE_INPORT is not set | ||
449 | # CONFIG_MOUSE_LOGIBM is not set | ||
450 | # CONFIG_MOUSE_PC110PAD is not set | ||
451 | # CONFIG_MOUSE_VSXXXAA is not set | ||
452 | # CONFIG_INPUT_JOYSTICK is not set | ||
453 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
454 | # CONFIG_INPUT_MISC is not set | ||
455 | |||
456 | # | ||
457 | # Hardware I/O ports | ||
458 | # | ||
459 | CONFIG_SERIO=y | ||
460 | # CONFIG_SERIO_SERPORT is not set | ||
461 | # CONFIG_SERIO_PARKBD is not set | ||
462 | CONFIG_SERIO_RPCKBD=y | ||
463 | CONFIG_SERIO_LIBPS2=y | ||
464 | # CONFIG_SERIO_RAW is not set | ||
465 | # CONFIG_GAMEPORT is not set | ||
466 | CONFIG_SOUND_GAMEPORT=y | ||
467 | |||
468 | # | ||
469 | # Character devices | ||
470 | # | ||
471 | CONFIG_VT=y | ||
472 | CONFIG_VT_CONSOLE=y | ||
473 | CONFIG_HW_CONSOLE=y | ||
474 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
475 | |||
476 | # | ||
477 | # Serial drivers | ||
478 | # | ||
479 | CONFIG_SERIAL_8250=y | ||
480 | CONFIG_SERIAL_8250_CONSOLE=y | ||
481 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
482 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
483 | |||
484 | # | ||
485 | # Non-8250 serial port support | ||
486 | # | ||
487 | CONFIG_SERIAL_CORE=y | ||
488 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
489 | CONFIG_UNIX98_PTYS=y | ||
490 | CONFIG_LEGACY_PTYS=y | ||
491 | CONFIG_LEGACY_PTY_COUNT=256 | ||
492 | CONFIG_PRINTER=y | ||
493 | # CONFIG_LP_CONSOLE is not set | ||
494 | # CONFIG_PPDEV is not set | ||
495 | # CONFIG_TIPAR is not set | ||
496 | |||
497 | # | ||
498 | # IPMI | ||
499 | # | ||
500 | # CONFIG_IPMI_HANDLER is not set | ||
501 | |||
502 | # | ||
503 | # Watchdog Cards | ||
504 | # | ||
505 | # CONFIG_WATCHDOG is not set | ||
506 | # CONFIG_NVRAM is not set | ||
507 | # CONFIG_RTC is not set | ||
508 | # CONFIG_DTLK is not set | ||
509 | # CONFIG_R3964 is not set | ||
510 | |||
511 | # | ||
512 | # Ftape, the floppy tape device driver | ||
513 | # | ||
514 | # CONFIG_DRM is not set | ||
515 | # CONFIG_RAW_DRIVER is not set | ||
516 | |||
517 | # | ||
518 | # TPM devices | ||
519 | # | ||
520 | # CONFIG_TCG_TPM is not set | ||
521 | |||
522 | # | ||
523 | # I2C support | ||
524 | # | ||
525 | CONFIG_I2C=y | ||
526 | # CONFIG_I2C_CHARDEV is not set | ||
527 | |||
528 | # | ||
529 | # I2C Algorithms | ||
530 | # | ||
531 | CONFIG_I2C_ALGOBIT=y | ||
532 | # CONFIG_I2C_ALGOPCF is not set | ||
533 | # CONFIG_I2C_ALGOPCA is not set | ||
534 | |||
535 | # | ||
536 | # I2C Hardware Bus support | ||
537 | # | ||
538 | # CONFIG_I2C_ELEKTOR is not set | ||
539 | # CONFIG_I2C_PARPORT is not set | ||
540 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
541 | # CONFIG_I2C_PCA_ISA is not set | ||
542 | |||
543 | # | ||
544 | # Hardware Sensors Chip support | ||
545 | # | ||
546 | # CONFIG_I2C_SENSOR is not set | ||
547 | # CONFIG_SENSORS_ADM1021 is not set | ||
548 | # CONFIG_SENSORS_ADM1025 is not set | ||
549 | # CONFIG_SENSORS_ADM1026 is not set | ||
550 | # CONFIG_SENSORS_ADM1031 is not set | ||
551 | # CONFIG_SENSORS_ASB100 is not set | ||
552 | # CONFIG_SENSORS_DS1621 is not set | ||
553 | # CONFIG_SENSORS_FSCHER is not set | ||
554 | # CONFIG_SENSORS_FSCPOS is not set | ||
555 | # CONFIG_SENSORS_GL518SM is not set | ||
556 | # CONFIG_SENSORS_GL520SM is not set | ||
557 | # CONFIG_SENSORS_IT87 is not set | ||
558 | # CONFIG_SENSORS_LM63 is not set | ||
559 | # CONFIG_SENSORS_LM75 is not set | ||
560 | # CONFIG_SENSORS_LM77 is not set | ||
561 | # CONFIG_SENSORS_LM78 is not set | ||
562 | # CONFIG_SENSORS_LM80 is not set | ||
563 | # CONFIG_SENSORS_LM83 is not set | ||
564 | # CONFIG_SENSORS_LM85 is not set | ||
565 | # CONFIG_SENSORS_LM87 is not set | ||
566 | # CONFIG_SENSORS_LM90 is not set | ||
567 | # CONFIG_SENSORS_MAX1619 is not set | ||
568 | # CONFIG_SENSORS_PC87360 is not set | ||
569 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
570 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
571 | # CONFIG_SENSORS_W83781D is not set | ||
572 | # CONFIG_SENSORS_W83L785TS is not set | ||
573 | # CONFIG_SENSORS_W83627HF is not set | ||
574 | |||
575 | # | ||
576 | # Other I2C Chip support | ||
577 | # | ||
578 | # CONFIG_SENSORS_EEPROM is not set | ||
579 | # CONFIG_SENSORS_PCF8574 is not set | ||
580 | # CONFIG_SENSORS_PCF8591 is not set | ||
581 | # CONFIG_SENSORS_RTC8564 is not set | ||
582 | # CONFIG_I2C_DEBUG_CORE is not set | ||
583 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
584 | # CONFIG_I2C_DEBUG_BUS is not set | ||
585 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
586 | |||
587 | # | ||
588 | # Misc devices | ||
589 | # | ||
590 | |||
591 | # | ||
592 | # Multimedia devices | ||
593 | # | ||
594 | # CONFIG_VIDEO_DEV is not set | ||
595 | |||
596 | # | ||
597 | # Digital Video Broadcasting Devices | ||
598 | # | ||
599 | # CONFIG_DVB is not set | ||
600 | |||
601 | # | ||
602 | # Graphics support | ||
603 | # | ||
604 | CONFIG_FB=y | ||
605 | CONFIG_FB_CFB_FILLRECT=y | ||
606 | CONFIG_FB_CFB_COPYAREA=y | ||
607 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
608 | CONFIG_FB_SOFT_CURSOR=y | ||
609 | # CONFIG_FB_MODE_HELPERS is not set | ||
610 | # CONFIG_FB_TILEBLITTING is not set | ||
611 | CONFIG_FB_ACORN=y | ||
612 | # CONFIG_FB_VIRTUAL is not set | ||
613 | |||
614 | # | ||
615 | # Console display driver support | ||
616 | # | ||
617 | # CONFIG_VGA_CONSOLE is not set | ||
618 | # CONFIG_MDA_CONSOLE is not set | ||
619 | CONFIG_DUMMY_CONSOLE=y | ||
620 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
621 | CONFIG_FONTS=y | ||
622 | CONFIG_FONT_8x8=y | ||
623 | CONFIG_FONT_8x16=y | ||
624 | # CONFIG_FONT_6x11 is not set | ||
625 | # CONFIG_FONT_PEARL_8x8 is not set | ||
626 | # CONFIG_FONT_ACORN_8x8 is not set | ||
627 | # CONFIG_FONT_MINI_4x6 is not set | ||
628 | # CONFIG_FONT_SUN8x16 is not set | ||
629 | # CONFIG_FONT_SUN12x22 is not set | ||
630 | |||
631 | # | ||
632 | # Logo configuration | ||
633 | # | ||
634 | CONFIG_LOGO=y | ||
635 | CONFIG_LOGO_LINUX_MONO=y | ||
636 | CONFIG_LOGO_LINUX_VGA16=y | ||
637 | CONFIG_LOGO_LINUX_CLUT224=y | ||
638 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
639 | |||
640 | # | ||
641 | # Sound | ||
642 | # | ||
643 | # CONFIG_SOUND is not set | ||
644 | |||
645 | # | ||
646 | # USB support | ||
647 | # | ||
648 | CONFIG_USB_ARCH_HAS_HCD=y | ||
649 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
650 | # CONFIG_USB is not set | ||
651 | |||
652 | # | ||
653 | # USB Gadget Support | ||
654 | # | ||
655 | # CONFIG_USB_GADGET is not set | ||
656 | |||
657 | # | ||
658 | # MMC/SD Card support | ||
659 | # | ||
660 | # CONFIG_MMC is not set | ||
661 | |||
662 | # | ||
663 | # File systems | ||
664 | # | ||
665 | CONFIG_EXT2_FS=y | ||
666 | # CONFIG_EXT2_FS_XATTR is not set | ||
667 | # CONFIG_EXT3_FS is not set | ||
668 | # CONFIG_JBD is not set | ||
669 | # CONFIG_REISERFS_FS is not set | ||
670 | # CONFIG_JFS_FS is not set | ||
671 | |||
672 | # | ||
673 | # XFS support | ||
674 | # | ||
675 | # CONFIG_XFS_FS is not set | ||
676 | CONFIG_MINIX_FS=y | ||
677 | # CONFIG_ROMFS_FS is not set | ||
678 | # CONFIG_QUOTA is not set | ||
679 | CONFIG_DNOTIFY=y | ||
680 | # CONFIG_AUTOFS_FS is not set | ||
681 | # CONFIG_AUTOFS4_FS is not set | ||
682 | |||
683 | # | ||
684 | # CD-ROM/DVD Filesystems | ||
685 | # | ||
686 | # CONFIG_ISO9660_FS is not set | ||
687 | # CONFIG_UDF_FS is not set | ||
688 | |||
689 | # | ||
690 | # DOS/FAT/NT Filesystems | ||
691 | # | ||
692 | # CONFIG_MSDOS_FS is not set | ||
693 | # CONFIG_VFAT_FS is not set | ||
694 | # CONFIG_NTFS_FS is not set | ||
695 | |||
696 | # | ||
697 | # Pseudo filesystems | ||
698 | # | ||
699 | CONFIG_PROC_FS=y | ||
700 | CONFIG_SYSFS=y | ||
701 | # CONFIG_DEVFS_FS is not set | ||
702 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
703 | # CONFIG_TMPFS is not set | ||
704 | # CONFIG_HUGETLB_PAGE is not set | ||
705 | CONFIG_RAMFS=y | ||
706 | |||
707 | # | ||
708 | # Miscellaneous filesystems | ||
709 | # | ||
710 | # CONFIG_ADFS_FS is not set | ||
711 | # CONFIG_AFFS_FS is not set | ||
712 | # CONFIG_HFS_FS is not set | ||
713 | # CONFIG_HFSPLUS_FS is not set | ||
714 | # CONFIG_BEFS_FS is not set | ||
715 | # CONFIG_BFS_FS is not set | ||
716 | # CONFIG_EFS_FS is not set | ||
717 | # CONFIG_JFFS_FS is not set | ||
718 | # CONFIG_JFFS2_FS is not set | ||
719 | # CONFIG_CRAMFS is not set | ||
720 | # CONFIG_VXFS_FS is not set | ||
721 | # CONFIG_HPFS_FS is not set | ||
722 | # CONFIG_QNX4FS_FS is not set | ||
723 | # CONFIG_SYSV_FS is not set | ||
724 | # CONFIG_UFS_FS is not set | ||
725 | |||
726 | # | ||
727 | # Network File Systems | ||
728 | # | ||
729 | CONFIG_NFS_FS=y | ||
730 | # CONFIG_NFS_V3 is not set | ||
731 | # CONFIG_NFS_V4 is not set | ||
732 | # CONFIG_NFS_DIRECTIO is not set | ||
733 | # CONFIG_NFSD is not set | ||
734 | CONFIG_ROOT_NFS=y | ||
735 | CONFIG_LOCKD=y | ||
736 | CONFIG_SUNRPC=y | ||
737 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
738 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
739 | # CONFIG_SMB_FS is not set | ||
740 | # CONFIG_CIFS is not set | ||
741 | # CONFIG_NCP_FS is not set | ||
742 | # CONFIG_CODA_FS is not set | ||
743 | # CONFIG_AFS_FS is not set | ||
744 | |||
745 | # | ||
746 | # Partition Types | ||
747 | # | ||
748 | CONFIG_PARTITION_ADVANCED=y | ||
749 | # CONFIG_ACORN_PARTITION is not set | ||
750 | # CONFIG_OSF_PARTITION is not set | ||
751 | # CONFIG_AMIGA_PARTITION is not set | ||
752 | # CONFIG_ATARI_PARTITION is not set | ||
753 | # CONFIG_MAC_PARTITION is not set | ||
754 | # CONFIG_MSDOS_PARTITION is not set | ||
755 | # CONFIG_LDM_PARTITION is not set | ||
756 | # CONFIG_SGI_PARTITION is not set | ||
757 | # CONFIG_ULTRIX_PARTITION is not set | ||
758 | # CONFIG_SUN_PARTITION is not set | ||
759 | # CONFIG_EFI_PARTITION is not set | ||
760 | |||
761 | # | ||
762 | # Native Language Support | ||
763 | # | ||
764 | # CONFIG_NLS is not set | ||
765 | |||
766 | # | ||
767 | # Profiling support | ||
768 | # | ||
769 | # CONFIG_PROFILING is not set | ||
770 | |||
771 | # | ||
772 | # Kernel hacking | ||
773 | # | ||
774 | # CONFIG_PRINTK_TIME is not set | ||
775 | # CONFIG_DEBUG_KERNEL is not set | ||
776 | CONFIG_LOG_BUF_SHIFT=14 | ||
777 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
778 | CONFIG_FRAME_POINTER=y | ||
779 | # CONFIG_DEBUG_USER is not set | ||
780 | |||
781 | # | ||
782 | # Security options | ||
783 | # | ||
784 | # CONFIG_KEYS is not set | ||
785 | # CONFIG_SECURITY is not set | ||
786 | |||
787 | # | ||
788 | # Cryptographic options | ||
789 | # | ||
790 | # CONFIG_CRYPTO is not set | ||
791 | |||
792 | # | ||
793 | # Hardware crypto devices | ||
794 | # | ||
795 | |||
796 | # | ||
797 | # Library routines | ||
798 | # | ||
799 | # CONFIG_CRC_CCITT is not set | ||
800 | CONFIG_CRC32=y | ||
801 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h index 32da1ae17e06..a38bdc7afa34 100644 --- a/arch/arm/include/asm/mach/pci.h +++ b/arch/arm/include/asm/mach/pci.h | |||
@@ -42,7 +42,7 @@ struct pci_sys_data { | |||
42 | /* | 42 | /* |
43 | * This is the standard PCI-PCI bridge swizzling algorithm. | 43 | * This is the standard PCI-PCI bridge swizzling algorithm. |
44 | */ | 44 | */ |
45 | u8 pci_std_swizzle(struct pci_dev *dev, u8 *pinp); | 45 | #define pci_std_swizzle pci_common_swizzle |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * Call this with your hw_pci struct to initialise the PCI system. | 48 | * Call this with your hw_pci struct to initialise the PCI system. |
diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h index 53099d4ee421..b561584d04a1 100644 --- a/arch/arm/include/asm/mmu.h +++ b/arch/arm/include/asm/mmu.h | |||
@@ -24,7 +24,6 @@ typedef struct { | |||
24 | * modified for 2.6 by Hyok S. Choi <hyok.choi@samsung.com> | 24 | * modified for 2.6 by Hyok S. Choi <hyok.choi@samsung.com> |
25 | */ | 25 | */ |
26 | typedef struct { | 26 | typedef struct { |
27 | struct vm_list_struct *vmlist; | ||
28 | unsigned long end_brk; | 27 | unsigned long end_brk; |
29 | } mm_context_t; | 28 | } mm_context_t; |
30 | 29 | ||
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 17a59b6e521f..809681900ec8 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c | |||
@@ -480,33 +480,6 @@ EXPORT_SYMBOL(pcibios_bus_to_resource); | |||
480 | #endif | 480 | #endif |
481 | 481 | ||
482 | /* | 482 | /* |
483 | * This is the standard PCI-PCI bridge swizzling algorithm: | ||
484 | * | ||
485 | * Dev: 0 1 2 3 | ||
486 | * A A B C D | ||
487 | * B B C D A | ||
488 | * C C D A B | ||
489 | * D D A B C | ||
490 | * ^^^^^^^^^^ irq pin on bridge | ||
491 | */ | ||
492 | u8 __devinit pci_std_swizzle(struct pci_dev *dev, u8 *pinp) | ||
493 | { | ||
494 | int pin = *pinp - 1; | ||
495 | |||
496 | while (dev->bus->self) { | ||
497 | pin = (pin + PCI_SLOT(dev->devfn)) & 3; | ||
498 | /* | ||
499 | * move up the chain of bridges, | ||
500 | * swizzling as we go. | ||
501 | */ | ||
502 | dev = dev->bus->self; | ||
503 | } | ||
504 | *pinp = pin + 1; | ||
505 | |||
506 | return PCI_SLOT(dev->devfn); | ||
507 | } | ||
508 | |||
509 | /* | ||
510 | * Swizzle the device pin each time we cross a bridge. | 483 | * Swizzle the device pin each time we cross a bridge. |
511 | * This might update pin and returns the slot number. | 484 | * This might update pin and returns the slot number. |
512 | */ | 485 | */ |
diff --git a/arch/arm/kernel/isa.c b/arch/arm/kernel/isa.c index 50a30bc91872..8ac9b8424007 100644 --- a/arch/arm/kernel/isa.c +++ b/arch/arm/kernel/isa.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/fs.h> | 16 | #include <linux/fs.h> |
17 | #include <linux/sysctl.h> | 17 | #include <linux/sysctl.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/io.h> | ||
19 | 20 | ||
20 | static unsigned int isa_membase, isa_portbase, isa_portshift; | 21 | static unsigned int isa_membase, isa_portbase, isa_portshift; |
21 | 22 | ||
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index 0a38c69fdbc4..73376170fb91 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/pm.h> | 16 | #include <linux/pm.h> |
17 | 17 | ||
18 | #include <asm/irq.h> | ||
18 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/map.h> | 20 | #include <asm/mach/map.h> |
20 | 21 | ||
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 28594fcc88e3..2e9ecad97f3d 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | 14 | ||
15 | #include <asm/irq.h> | ||
15 | #include <asm/mach/arch.h> | 16 | #include <asm/mach/arch.h> |
16 | #include <asm/mach/map.h> | 17 | #include <asm/mach/map.h> |
17 | #include <mach/at91rm9200.h> | 18 | #include <mach/at91rm9200.h> |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index accb69ec478e..0894f1077be7 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/pm.h> | 14 | #include <linux/pm.h> |
15 | 15 | ||
16 | #include <asm/irq.h> | ||
16 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
18 | #include <mach/cpu.h> | 19 | #include <mach/cpu.h> |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index 7b51a59ae8b3..3acd7d7e6a42 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/pm.h> | 14 | #include <linux/pm.h> |
15 | 15 | ||
16 | #include <asm/irq.h> | ||
16 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
18 | #include <mach/at91sam9261.h> | 19 | #include <mach/at91sam9261.h> |
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index ada4b6769107..942792d630d8 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/pm.h> | 14 | #include <linux/pm.h> |
15 | 15 | ||
16 | #include <asm/irq.h> | ||
16 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
18 | #include <mach/at91sam9263.h> | 19 | #include <mach/at91sam9263.h> |
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 252e954b49fd..211c5c14a1e6 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/pm.h> | 13 | #include <linux/pm.h> |
14 | 14 | ||
15 | #include <asm/irq.h> | ||
15 | #include <asm/mach/arch.h> | 16 | #include <asm/mach/arch.h> |
16 | #include <asm/mach/map.h> | 17 | #include <asm/mach/map.h> |
17 | #include <mach/cpu.h> | 18 | #include <mach/cpu.h> |
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index 9b937ee4815a..35e12a49d1a6 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/board.h> | 30 | #include <mach/board.h> |
31 | #include <mach/gpio.h> | 31 | #include <mach/gpio.h> |
32 | #include <mach/at91sam9_smc.h> | ||
32 | #include <mach/at91_shdwc.h> | 33 | #include <mach/at91_shdwc.h> |
33 | 34 | ||
34 | #include "sam9_smc.h" | 35 | #include "sam9_smc.h" |
diff --git a/arch/arm/mach-clps711x/edb7211-mm.c b/arch/arm/mach-clps711x/edb7211-mm.c index c58e32ec4c5d..0bea1454ae03 100644 --- a/arch/arm/mach-clps711x/edb7211-mm.c +++ b/arch/arm/mach-clps711x/edb7211-mm.c | |||
@@ -24,7 +24,6 @@ | |||
24 | 24 | ||
25 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
26 | #include <asm/page.h> | 26 | #include <asm/page.h> |
27 | #include <asm/pgtable.h> | ||
28 | #include <asm/sizes.h> | 27 | #include <asm/sizes.h> |
29 | 28 | ||
30 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c index 7122b3d21043..7430e4049d87 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/fortunet.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/initrd.h> | 24 | #include <linux/initrd.h> |
25 | 25 | ||
26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <asm/irq.h> | ||
28 | #include <asm/setup.h> | 27 | #include <asm/setup.h> |
29 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
30 | 29 | ||
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c index 3d4b1de8f898..808633f9f03c 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
22 | #include <mach/i2c.h> | 22 | #include <mach/i2c.h> |
23 | #include <mach/irqs.h> | ||
23 | 24 | ||
24 | static struct resource i2c_resources[] = { | 25 | static struct resource i2c_resources[] = { |
25 | { | 26 | { |
diff --git a/arch/arm/mach-davinci/include/mach/gpio.h b/arch/arm/mach-davinci/include/mach/gpio.h index b3a2961f0f46..b456f079f43f 100644 --- a/arch/arm/mach-davinci/include/mach/gpio.h +++ b/arch/arm/mach-davinci/include/mach/gpio.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <asm-generic/gpio.h> | 17 | #include <asm-generic/gpio.h> |
18 | #include <mach/hardware.h> | 18 | #include <mach/hardware.h> |
19 | #include <mach/irqs.h> | ||
19 | 20 | ||
20 | /* | 21 | /* |
21 | * basic gpio routines | 22 | * basic gpio routines |
diff --git a/arch/arm/mach-footbridge/common.c b/arch/arm/mach-footbridge/common.c index 36ff06d4df15..b97f529e58e8 100644 --- a/arch/arm/mach-footbridge/common.c +++ b/arch/arm/mach-footbridge/common.c | |||
@@ -28,12 +28,17 @@ | |||
28 | 28 | ||
29 | #include "common.h" | 29 | #include "common.h" |
30 | 30 | ||
31 | extern void __init isa_init_irq(unsigned int irq); | ||
32 | |||
33 | unsigned int mem_fclk_21285 = 50000000; | 31 | unsigned int mem_fclk_21285 = 50000000; |
34 | 32 | ||
35 | EXPORT_SYMBOL(mem_fclk_21285); | 33 | EXPORT_SYMBOL(mem_fclk_21285); |
36 | 34 | ||
35 | static void __init early_fclk(char **arg) | ||
36 | { | ||
37 | mem_fclk_21285 = simple_strtoul(*arg, arg, 0); | ||
38 | } | ||
39 | |||
40 | __early_param("mem_fclk_21285=", early_fclk); | ||
41 | |||
37 | static int __init parse_tag_memclk(const struct tag *tag) | 42 | static int __init parse_tag_memclk(const struct tag *tag) |
38 | { | 43 | { |
39 | mem_fclk_21285 = tag->u.memclk.fmemclk; | 44 | mem_fclk_21285 = tag->u.memclk.fmemclk; |
diff --git a/arch/arm/mach-footbridge/common.h b/arch/arm/mach-footbridge/common.h index 580e31bbc711..b05e662d21ad 100644 --- a/arch/arm/mach-footbridge/common.h +++ b/arch/arm/mach-footbridge/common.h | |||
@@ -7,3 +7,4 @@ extern void isa_rtc_init(void); | |||
7 | extern void footbridge_map_io(void); | 7 | extern void footbridge_map_io(void); |
8 | extern void footbridge_init_irq(void); | 8 | extern void footbridge_init_irq(void); |
9 | 9 | ||
10 | extern void isa_init_irq(unsigned int irq); | ||
diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index 133086019e3e..3ffa54841ec5 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c | |||
@@ -287,6 +287,9 @@ struct pci_bus * __init dc21285_scan_bus(int nr, struct pci_sys_data *sys) | |||
287 | return pci_scan_bus(0, &dc21285_ops, sys); | 287 | return pci_scan_bus(0, &dc21285_ops, sys); |
288 | } | 288 | } |
289 | 289 | ||
290 | #define dc21285_request_irq(_a, _b, _c, _d, _e) \ | ||
291 | WARN_ON(request_irq(_a, _b, _c, _d, _e) < 0) | ||
292 | |||
290 | void __init dc21285_preinit(void) | 293 | void __init dc21285_preinit(void) |
291 | { | 294 | { |
292 | unsigned int mem_size, mem_mask; | 295 | unsigned int mem_size, mem_mask; |
@@ -335,16 +338,16 @@ void __init dc21285_preinit(void) | |||
335 | /* | 338 | /* |
336 | * We don't care if these fail. | 339 | * We don't care if these fail. |
337 | */ | 340 | */ |
338 | request_irq(IRQ_PCI_SERR, dc21285_serr_irq, IRQF_DISABLED, | 341 | dc21285_request_irq(IRQ_PCI_SERR, dc21285_serr_irq, IRQF_DISABLED, |
339 | "PCI system error", &serr_timer); | 342 | "PCI system error", &serr_timer); |
340 | request_irq(IRQ_PCI_PERR, dc21285_parity_irq, IRQF_DISABLED, | 343 | dc21285_request_irq(IRQ_PCI_PERR, dc21285_parity_irq, IRQF_DISABLED, |
341 | "PCI parity error", &perr_timer); | 344 | "PCI parity error", &perr_timer); |
342 | request_irq(IRQ_PCI_ABORT, dc21285_abort_irq, IRQF_DISABLED, | 345 | dc21285_request_irq(IRQ_PCI_ABORT, dc21285_abort_irq, IRQF_DISABLED, |
343 | "PCI abort", NULL); | 346 | "PCI abort", NULL); |
344 | request_irq(IRQ_DISCARD_TIMER, dc21285_discard_irq, IRQF_DISABLED, | 347 | dc21285_request_irq(IRQ_DISCARD_TIMER, dc21285_discard_irq, IRQF_DISABLED, |
345 | "Discard timer", NULL); | 348 | "Discard timer", NULL); |
346 | request_irq(IRQ_PCI_DPERR, dc21285_dparity_irq, IRQF_DISABLED, | 349 | dc21285_request_irq(IRQ_PCI_DPERR, dc21285_dparity_irq, IRQF_DISABLED, |
347 | "PCI data parity", NULL); | 350 | "PCI data parity", NULL); |
348 | 351 | ||
349 | if (cfn_mode) { | 352 | if (cfn_mode) { |
350 | static struct resource csrio; | 353 | static struct resource csrio; |
diff --git a/arch/arm/mach-footbridge/isa-irq.c b/arch/arm/mach-footbridge/isa-irq.c index 9ee80a211d3c..8bfd06aeb64d 100644 --- a/arch/arm/mach-footbridge/isa-irq.c +++ b/arch/arm/mach-footbridge/isa-irq.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | 30 | ||
31 | #include "common.h" | ||
32 | |||
31 | static void isa_mask_pic_lo_irq(unsigned int irq) | 33 | static void isa_mask_pic_lo_irq(unsigned int irq) |
32 | { | 34 | { |
33 | unsigned int mask = 1 << (irq & 7); | 35 | unsigned int mask = 1 << (irq & 7); |
diff --git a/arch/arm/mach-h720x/h7202-eval.c b/arch/arm/mach-h720x/h7202-eval.c index 56161d55cf47..8c0ba99d683f 100644 --- a/arch/arm/mach-h720x/h7202-eval.c +++ b/arch/arm/mach-h720x/h7202-eval.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/page.h> | 25 | #include <asm/page.h> |
26 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
27 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
28 | #include <mach/irqs.h> | ||
28 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
29 | #include "common.h" | 30 | #include "common.h" |
30 | 31 | ||
diff --git a/arch/arm/mach-integrator/pci.c b/arch/arm/mach-integrator/pci.c index af7d3ff013ec..2fdb95433f0a 100644 --- a/arch/arm/mach-integrator/pci.c +++ b/arch/arm/mach-integrator/pci.c | |||
@@ -63,13 +63,7 @@ | |||
63 | * | 63 | * |
64 | * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A. | 64 | * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A. |
65 | * Thus, each swizzle is ((pin-1) + (device#-4)) % 4 | 65 | * Thus, each swizzle is ((pin-1) + (device#-4)) % 4 |
66 | * | ||
67 | * The following code swizzles for exactly one bridge. | ||
68 | */ | 66 | */ |
69 | static inline int bridge_swizzle(int pin, unsigned int slot) | ||
70 | { | ||
71 | return (pin + slot) & 3; | ||
72 | } | ||
73 | 67 | ||
74 | /* | 68 | /* |
75 | * This routine handles multiple bridges. | 69 | * This routine handles multiple bridges. |
@@ -81,15 +75,14 @@ static u8 __init integrator_swizzle(struct pci_dev *dev, u8 *pinp) | |||
81 | if (pin == 0) | 75 | if (pin == 0) |
82 | pin = 1; | 76 | pin = 1; |
83 | 77 | ||
84 | pin -= 1; | ||
85 | while (dev->bus->self) { | 78 | while (dev->bus->self) { |
86 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 79 | pin = pci_swizzle_interrupt_pin(dev, pin); |
87 | /* | 80 | /* |
88 | * move up the chain of bridges, swizzling as we go. | 81 | * move up the chain of bridges, swizzling as we go. |
89 | */ | 82 | */ |
90 | dev = dev->bus->self; | 83 | dev = dev->bus->self; |
91 | } | 84 | } |
92 | *pinp = pin + 1; | 85 | *pinp = pin; |
93 | 86 | ||
94 | return PCI_SLOT(dev->devfn); | 87 | return PCI_SLOT(dev->devfn); |
95 | } | 88 | } |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 7b8ef97fb501..b3404b7775b3 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -698,6 +698,7 @@ void __init kirkwood_init(void) | |||
698 | printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n", | 698 | printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n", |
699 | kirkwood_id(), kirkwood_tclk); | 699 | kirkwood_id(), kirkwood_tclk); |
700 | kirkwood_ge00_shared_data.t_clk = kirkwood_tclk; | 700 | kirkwood_ge00_shared_data.t_clk = kirkwood_tclk; |
701 | kirkwood_ge01_shared_data.t_clk = kirkwood_tclk; | ||
701 | kirkwood_spi_plat_data.tclk = kirkwood_tclk; | 702 | kirkwood_spi_plat_data.tclk = kirkwood_tclk; |
702 | kirkwood_uart0_data[0].uartclk = kirkwood_tclk; | 703 | kirkwood_uart0_data[0].uartclk = kirkwood_tclk; |
703 | kirkwood_uart1_data[0].uartclk = kirkwood_tclk; | 704 | kirkwood_uart1_data[0].uartclk = kirkwood_tclk; |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index f6b08f207c89..73fccacd1a73 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <asm/irq.h> | ||
14 | #include <asm/mach/pci.h> | 15 | #include <asm/mach/pci.h> |
15 | #include <plat/pcie.h> | 16 | #include <plat/pcie.h> |
16 | #include "common.h" | 17 | #include "common.h" |
diff --git a/arch/arm/mach-ks8695/devices.c b/arch/arm/mach-ks8695/devices.c index 36ab0fd3d9b6..b89fb6d46ccc 100644 --- a/arch/arm/mach-ks8695/devices.c +++ b/arch/arm/mach-ks8695/devices.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
24 | 24 | ||
25 | #include <mach/irqs.h> | ||
25 | #include <mach/regs-wan.h> | 26 | #include <mach/regs-wan.h> |
26 | #include <mach/regs-lan.h> | 27 | #include <mach/regs-lan.h> |
27 | #include <mach/regs-hpna.h> | 28 | #include <mach/regs-hpna.h> |
diff --git a/arch/arm/mach-msm/devices.c b/arch/arm/mach-msm/devices.c index f2a74b92a97f..31b6b30e98bf 100644 --- a/arch/arm/mach-msm/devices.c +++ b/arch/arm/mach-msm/devices.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | 18 | ||
19 | #include <mach/irqs.h> | ||
19 | #include <mach/msm_iomap.h> | 20 | #include <mach/msm_iomap.h> |
20 | #include "devices.h" | 21 | #include "devices.h" |
21 | 22 | ||
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index 430ea84d587d..aad3a7a2f830 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <asm/irq.h> | ||
14 | #include <asm/mach/pci.h> | 15 | #include <asm/mach/pci.h> |
15 | #include <plat/pcie.h> | 16 | #include <plat/pcie.h> |
16 | #include "common.h" | 17 | #include "common.h" |
diff --git a/arch/arm/mach-mx2/devices.c b/arch/arm/mach-mx2/devices.c index af121f5ab710..2f9240be1c76 100644 --- a/arch/arm/mach-mx2/devices.c +++ b/arch/arm/mach-mx2/devices.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
33 | #include <linux/gpio.h> | 33 | #include <linux/gpio.h> |
34 | 34 | ||
35 | #include <mach/irqs.h> | ||
35 | #include <mach/hardware.h> | 36 | #include <mach/hardware.h> |
36 | 37 | ||
37 | /* | 38 | /* |
diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c index 1d46cb4adf96..f8428800f286 100644 --- a/arch/arm/mach-mx3/devices.c +++ b/arch/arm/mach-mx3/devices.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/serial.h> | 22 | #include <linux/serial.h> |
23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
24 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
25 | #include <mach/irqs.h> | ||
25 | #include <mach/imx-uart.h> | 26 | #include <mach/imx-uart.h> |
26 | 27 | ||
27 | static struct resource uart0[] = { | 28 | static struct resource uart0[] = { |
diff --git a/arch/arm/mach-netx/fb.c b/arch/arm/mach-netx/fb.c index ea8fa8898fe8..1d844e228ea9 100644 --- a/arch/arm/mach-netx/fb.c +++ b/arch/arm/mach-netx/fb.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/amba/clcd.h> | 24 | #include <linux/amba/clcd.h> |
25 | #include <linux/err.h> | 25 | #include <linux/err.h> |
26 | 26 | ||
27 | #include <asm/irq.h> | ||
28 | |||
27 | #include <mach/netx-regs.h> | 29 | #include <mach/netx-regs.h> |
28 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
29 | 31 | ||
diff --git a/arch/arm/mach-netx/time.c b/arch/arm/mach-netx/time.c index d51d627ce7cf..f201fddb594f 100644 --- a/arch/arm/mach-netx/time.c +++ b/arch/arm/mach-netx/time.c | |||
@@ -163,7 +163,7 @@ static void __init netx_timer_init(void) | |||
163 | * Adding some safety ... */ | 163 | * Adding some safety ... */ |
164 | netx_clockevent.min_delta_ns = | 164 | netx_clockevent.min_delta_ns = |
165 | clockevent_delta2ns(0xa00, &netx_clockevent); | 165 | clockevent_delta2ns(0xa00, &netx_clockevent); |
166 | netx_clockevent.cpumask = cpumask_of_cpu(0); | 166 | netx_clockevent.cpumask = cpumask_of(0); |
167 | clockevents_register_device(&netx_clockevent); | 167 | clockevents_register_device(&netx_clockevent); |
168 | } | 168 | } |
169 | 169 | ||
diff --git a/arch/arm/mach-netx/xc.c b/arch/arm/mach-netx/xc.c index 8fc6205dc3a5..181a78ba8165 100644 --- a/arch/arm/mach-netx/xc.c +++ b/arch/arm/mach-netx/xc.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | 25 | ||
26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <mach/irqs.h> | ||
27 | #include <mach/netx-regs.h> | 28 | #include <mach/netx-regs.h> |
28 | 29 | ||
29 | #include <mach/xc.h> | 30 | #include <mach/xc.h> |
diff --git a/arch/arm/mach-omap1/mcbsp.c b/arch/arm/mach-omap1/mcbsp.c index 7de7c6915584..4474da7bc88a 100644 --- a/arch/arm/mach-omap1/mcbsp.c +++ b/arch/arm/mach-omap1/mcbsp.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <mach/dma.h> | 20 | #include <mach/dma.h> |
21 | #include <mach/irqs.h> | ||
21 | #include <mach/mux.h> | 22 | #include <mach/mux.h> |
22 | #include <mach/cpu.h> | 23 | #include <mach/cpu.h> |
23 | #include <mach/mcbsp.h> | 24 | #include <mach/mcbsp.h> |
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index cae3ebe249b3..acdc709901cd 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <mach/dma.h> | 20 | #include <mach/dma.h> |
21 | #include <mach/irqs.h> | ||
21 | #include <mach/mux.h> | 22 | #include <mach/mux.h> |
22 | #include <mach/cpu.h> | 23 | #include <mach/cpu.h> |
23 | #include <mach/mcbsp.h> | 24 | #include <mach/mcbsp.h> |
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index a7b7d77b1b09..d0a785a3b880 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
16 | #include <asm/irq.h> | ||
16 | #include <asm/mach/pci.h> | 17 | #include <asm/mach/pci.h> |
17 | #include <plat/pcie.h> | 18 | #include <plat/pcie.h> |
18 | #include "common.h" | 19 | #include "common.h" |
diff --git a/arch/arm/mach-pnx4008/gpio.c b/arch/arm/mach-pnx4008/gpio.c index 015cc21d5f55..f219914f5b29 100644 --- a/arch/arm/mach-pnx4008/gpio.c +++ b/arch/arm/mach-pnx4008/gpio.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <mach/hardware.h> | ||
21 | #include <mach/platform.h> | 22 | #include <mach/platform.h> |
22 | #include <mach/gpio.h> | 23 | #include <mach/gpio.h> |
23 | 24 | ||
diff --git a/arch/arm/mach-pnx4008/i2c.c b/arch/arm/mach-pnx4008/i2c.c index 87c093286ff9..f3fea29c00d3 100644 --- a/arch/arm/mach-pnx4008/i2c.c +++ b/arch/arm/mach-pnx4008/i2c.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <mach/platform.h> | 17 | #include <mach/platform.h> |
18 | #include <mach/irqs.h> | ||
18 | #include <mach/i2c.h> | 19 | #include <mach/i2c.h> |
19 | 20 | ||
20 | static int set_clock_run(struct platform_device *pdev) | 21 | static int set_clock_run(struct platform_device *pdev) |
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index c5e28a46b292..a8d91b6c136b 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/spi/spi.h> | 27 | #include <linux/spi/spi.h> |
28 | #include <linux/spi/ads7846.h> | 28 | #include <linux/spi/ads7846.h> |
29 | #include <linux/spi/corgi_lcd.h> | 29 | #include <linux/spi/corgi_lcd.h> |
30 | #include <linux/mtd/sharpsl.h> | ||
30 | #include <video/w100fb.h> | 31 | #include <video/w100fb.h> |
31 | 32 | ||
32 | #include <asm/setup.h> | 33 | #include <asm/setup.h> |
@@ -542,6 +543,55 @@ err_free_1: | |||
542 | static inline void corgi_init_spi(void) {} | 543 | static inline void corgi_init_spi(void) {} |
543 | #endif | 544 | #endif |
544 | 545 | ||
546 | static struct mtd_partition sharpsl_nand_partitions[] = { | ||
547 | { | ||
548 | .name = "System Area", | ||
549 | .offset = 0, | ||
550 | .size = 7 * 1024 * 1024, | ||
551 | }, | ||
552 | { | ||
553 | .name = "Root Filesystem", | ||
554 | .offset = 7 * 1024 * 1024, | ||
555 | .size = 25 * 1024 * 1024, | ||
556 | }, | ||
557 | { | ||
558 | .name = "Home Filesystem", | ||
559 | .offset = MTDPART_OFS_APPEND, | ||
560 | .size = MTDPART_SIZ_FULL, | ||
561 | }, | ||
562 | }; | ||
563 | |||
564 | static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; | ||
565 | |||
566 | static struct nand_bbt_descr sharpsl_bbt = { | ||
567 | .options = 0, | ||
568 | .offs = 4, | ||
569 | .len = 2, | ||
570 | .pattern = scan_ff_pattern | ||
571 | }; | ||
572 | |||
573 | static struct sharpsl_nand_platform_data sharpsl_nand_platform_data = { | ||
574 | .badblock_pattern = &sharpsl_bbt, | ||
575 | .partitions = sharpsl_nand_partitions, | ||
576 | .nr_partitions = ARRAY_SIZE(sharpsl_nand_partitions), | ||
577 | }; | ||
578 | |||
579 | static struct resource sharpsl_nand_resources[] = { | ||
580 | { | ||
581 | .start = 0x0C000000, | ||
582 | .end = 0x0C000FFF, | ||
583 | .flags = IORESOURCE_MEM, | ||
584 | }, | ||
585 | }; | ||
586 | |||
587 | static struct platform_device sharpsl_nand_device = { | ||
588 | .name = "sharpsl-nand", | ||
589 | .id = -1, | ||
590 | .resource = sharpsl_nand_resources, | ||
591 | .num_resources = ARRAY_SIZE(sharpsl_nand_resources), | ||
592 | .dev.platform_data = &sharpsl_nand_platform_data, | ||
593 | }; | ||
594 | |||
545 | static struct mtd_partition sharpsl_rom_parts[] = { | 595 | static struct mtd_partition sharpsl_rom_parts[] = { |
546 | { | 596 | { |
547 | .name ="Boot PROM Filesystem", | 597 | .name ="Boot PROM Filesystem", |
@@ -577,6 +627,7 @@ static struct platform_device *devices[] __initdata = { | |||
577 | &corgifb_device, | 627 | &corgifb_device, |
578 | &corgikbd_device, | 628 | &corgikbd_device, |
579 | &corgiled_device, | 629 | &corgiled_device, |
630 | &sharpsl_nand_device, | ||
580 | &sharpsl_rom_device, | 631 | &sharpsl_rom_device, |
581 | }; | 632 | }; |
582 | 633 | ||
@@ -617,6 +668,9 @@ static void __init corgi_init(void) | |||
617 | 668 | ||
618 | platform_scoop_config = &corgi_pcmcia_config; | 669 | platform_scoop_config = &corgi_pcmcia_config; |
619 | 670 | ||
671 | if (machine_is_husky()) | ||
672 | sharpsl_nand_partitions[1].size = 53 * 1024 * 1024; | ||
673 | |||
620 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 674 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
621 | } | 675 | } |
622 | 676 | ||
diff --git a/arch/arm/mach-pxa/e350.c b/arch/arm/mach-pxa/e350.c index 251129391d7d..edcd9d5ce545 100644 --- a/arch/arm/mach-pxa/e350.c +++ b/arch/arm/mach-pxa/e350.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
21 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
22 | 22 | ||
23 | #include <mach/irqs.h> | ||
23 | #include <mach/mfp-pxa25x.h> | 24 | #include <mach/mfp-pxa25x.h> |
24 | #include <mach/pxa-regs.h> | 25 | #include <mach/pxa-regs.h> |
25 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
diff --git a/arch/arm/mach-pxa/e400.c b/arch/arm/mach-pxa/e400.c index bed0336aca3d..77bb8e2c48c0 100644 --- a/arch/arm/mach-pxa/e400.c +++ b/arch/arm/mach-pxa/e400.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/eseries-gpio.h> | 28 | #include <mach/eseries-gpio.h> |
29 | #include <mach/pxafb.h> | 29 | #include <mach/pxafb.h> |
30 | #include <mach/udc.h> | 30 | #include <mach/udc.h> |
31 | #include <mach/irqs.h> | ||
31 | 32 | ||
32 | #include "generic.h" | 33 | #include "generic.h" |
33 | #include "eseries.h" | 34 | #include "eseries.h" |
diff --git a/arch/arm/mach-pxa/e740.c b/arch/arm/mach-pxa/e740.c index b00d670b2ea6..6d48e00f4f0b 100644 --- a/arch/arm/mach-pxa/e740.c +++ b/arch/arm/mach-pxa/e740.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <mach/eseries-gpio.h> | 30 | #include <mach/eseries-gpio.h> |
31 | #include <mach/udc.h> | 31 | #include <mach/udc.h> |
32 | #include <mach/irda.h> | 32 | #include <mach/irda.h> |
33 | #include <mach/irqs.h> | ||
33 | 34 | ||
34 | #include "generic.h" | 35 | #include "generic.h" |
35 | #include "eseries.h" | 36 | #include "eseries.h" |
diff --git a/arch/arm/mach-pxa/e750.c b/arch/arm/mach-pxa/e750.c index 84d7c1aac58d..be1ab8edb973 100644 --- a/arch/arm/mach-pxa/e750.c +++ b/arch/arm/mach-pxa/e750.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <mach/eseries-gpio.h> | 29 | #include <mach/eseries-gpio.h> |
30 | #include <mach/udc.h> | 30 | #include <mach/udc.h> |
31 | #include <mach/irda.h> | 31 | #include <mach/irda.h> |
32 | #include <mach/irqs.h> | ||
32 | 33 | ||
33 | #include "generic.h" | 34 | #include "generic.h" |
34 | #include "eseries.h" | 35 | #include "eseries.h" |
@@ -105,6 +106,57 @@ static struct platform_device e750_fb_device = { | |||
105 | .resource = e750_fb_resources, | 106 | .resource = e750_fb_resources, |
106 | }; | 107 | }; |
107 | 108 | ||
109 | /* -------------------- e750 MFP parameters -------------------- */ | ||
110 | |||
111 | static unsigned long e750_pin_config[] __initdata = { | ||
112 | /* Chip selects */ | ||
113 | GPIO15_nCS_1, /* CS1 - Flash */ | ||
114 | GPIO79_nCS_3, /* CS3 - IMAGEON */ | ||
115 | GPIO80_nCS_4, /* CS4 - TMIO */ | ||
116 | |||
117 | /* Clocks */ | ||
118 | GPIO11_3_6MHz, | ||
119 | |||
120 | /* BTUART */ | ||
121 | GPIO42_BTUART_RXD, | ||
122 | GPIO43_BTUART_TXD, | ||
123 | GPIO44_BTUART_CTS, | ||
124 | |||
125 | /* TMIO controller */ | ||
126 | GPIO19_GPIO, /* t7l66xb #PCLR */ | ||
127 | GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */ | ||
128 | |||
129 | /* UDC */ | ||
130 | GPIO13_GPIO, | ||
131 | GPIO3_GPIO, | ||
132 | |||
133 | /* IrDA */ | ||
134 | GPIO38_GPIO | MFP_LPM_DRIVE_HIGH, | ||
135 | |||
136 | /* PC Card */ | ||
137 | GPIO8_GPIO, /* CD0 */ | ||
138 | GPIO44_GPIO, /* CD1 */ | ||
139 | GPIO11_GPIO, /* IRQ0 */ | ||
140 | GPIO6_GPIO, /* IRQ1 */ | ||
141 | GPIO27_GPIO, /* RST0 */ | ||
142 | GPIO24_GPIO, /* RST1 */ | ||
143 | GPIO20_GPIO, /* PWR0 */ | ||
144 | GPIO23_GPIO, /* PWR1 */ | ||
145 | GPIO48_nPOE, | ||
146 | GPIO49_nPWE, | ||
147 | GPIO50_nPIOR, | ||
148 | GPIO51_nPIOW, | ||
149 | GPIO52_nPCE_1, | ||
150 | GPIO53_nPCE_2, | ||
151 | GPIO54_nPSKTSEL, | ||
152 | GPIO55_nPREG, | ||
153 | GPIO56_nPWAIT, | ||
154 | GPIO57_nIOIS16, | ||
155 | |||
156 | /* wakeup */ | ||
157 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | ||
158 | }; | ||
159 | |||
108 | /* ----------------- e750 tc6393xb parameters ------------------ */ | 160 | /* ----------------- e750 tc6393xb parameters ------------------ */ |
109 | 161 | ||
110 | static struct tc6393xb_platform_data e750_tc6393xb_info = { | 162 | static struct tc6393xb_platform_data e750_tc6393xb_info = { |
@@ -137,6 +189,7 @@ static struct platform_device *devices[] __initdata = { | |||
137 | 189 | ||
138 | static void __init e750_init(void) | 190 | static void __init e750_init(void) |
139 | { | 191 | { |
192 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config)); | ||
140 | clk_add_alias("CLK_CK3P6MI", &e750_tc6393xb_device.dev, | 193 | clk_add_alias("CLK_CK3P6MI", &e750_tc6393xb_device.dev, |
141 | "GPIO11_CLK", NULL), | 194 | "GPIO11_CLK", NULL), |
142 | eseries_get_tmio_gpios(); | 195 | eseries_get_tmio_gpios(); |
diff --git a/arch/arm/mach-pxa/e800.c b/arch/arm/mach-pxa/e800.c index 9a86a426f924..cc9b1293e866 100644 --- a/arch/arm/mach-pxa/e800.c +++ b/arch/arm/mach-pxa/e800.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <mach/eseries-gpio.h> | 29 | #include <mach/eseries-gpio.h> |
30 | #include <mach/udc.h> | 30 | #include <mach/udc.h> |
31 | #include <mach/irqs.h> | ||
31 | 32 | ||
32 | #include "generic.h" | 33 | #include "generic.h" |
33 | #include "eseries.h" | 34 | #include "eseries.h" |
diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h b/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h index b1fcd10ab6c6..bcf3fb2c4b3a 100644 --- a/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h +++ b/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h | |||
@@ -193,10 +193,8 @@ | |||
193 | #define CKEN_MINI_IM 48 /* < Mini-IM */ | 193 | #define CKEN_MINI_IM 48 /* < Mini-IM */ |
194 | #define CKEN_MINI_LCD 49 /* < Mini LCD */ | 194 | #define CKEN_MINI_LCD 49 /* < Mini LCD */ |
195 | 195 | ||
196 | #if defined(CONFIG_CPU_PXA310) | ||
197 | #define CKEN_MMC3 5 /* < MMC3 Clock Enable */ | 196 | #define CKEN_MMC3 5 /* < MMC3 Clock Enable */ |
198 | #define CKEN_MVED 43 /* < MVED clock enable */ | 197 | #define CKEN_MVED 43 /* < MVED clock enable */ |
199 | #endif | ||
200 | 198 | ||
201 | /* Note: GCU clock enable bit differs on PXA300/PXA310 and PXA320 */ | 199 | /* Note: GCU clock enable bit differs on PXA300/PXA310 and PXA320 */ |
202 | #define PXA300_CKEN_GRAPHICS 42 /* Graphics controller clock enable */ | 200 | #define PXA300_CKEN_GRAPHICS 42 /* Graphics controller clock enable */ |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index ae88855bf974..f9093beba752 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
25 | #include <linux/spi/spi.h> | 25 | #include <linux/spi/spi.h> |
26 | #include <linux/spi/ads7846.h> | 26 | #include <linux/spi/ads7846.h> |
27 | #include <linux/mtd/sharpsl.h> | ||
27 | 28 | ||
28 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
@@ -414,6 +415,55 @@ static struct pxafb_mach_info poodle_fb_info = { | |||
414 | .lcd_conn = LCD_COLOR_TFT_16BPP, | 415 | .lcd_conn = LCD_COLOR_TFT_16BPP, |
415 | }; | 416 | }; |
416 | 417 | ||
418 | static struct mtd_partition sharpsl_nand_partitions[] = { | ||
419 | { | ||
420 | .name = "System Area", | ||
421 | .offset = 0, | ||
422 | .size = 7 * 1024 * 1024, | ||
423 | }, | ||
424 | { | ||
425 | .name = "Root Filesystem", | ||
426 | .offset = 7 * 1024 * 1024, | ||
427 | .size = 22 * 1024 * 1024, | ||
428 | }, | ||
429 | { | ||
430 | .name = "Home Filesystem", | ||
431 | .offset = MTDPART_OFS_APPEND, | ||
432 | .size = MTDPART_SIZ_FULL, | ||
433 | }, | ||
434 | }; | ||
435 | |||
436 | static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; | ||
437 | |||
438 | static struct nand_bbt_descr sharpsl_bbt = { | ||
439 | .options = 0, | ||
440 | .offs = 4, | ||
441 | .len = 2, | ||
442 | .pattern = scan_ff_pattern | ||
443 | }; | ||
444 | |||
445 | static struct sharpsl_nand_platform_data sharpsl_nand_platform_data = { | ||
446 | .badblock_pattern = &sharpsl_bbt, | ||
447 | .partitions = sharpsl_nand_partitions, | ||
448 | .nr_partitions = ARRAY_SIZE(sharpsl_nand_partitions), | ||
449 | }; | ||
450 | |||
451 | static struct resource sharpsl_nand_resources[] = { | ||
452 | { | ||
453 | .start = 0x0C000000, | ||
454 | .end = 0x0C000FFF, | ||
455 | .flags = IORESOURCE_MEM, | ||
456 | }, | ||
457 | }; | ||
458 | |||
459 | static struct platform_device sharpsl_nand_device = { | ||
460 | .name = "sharpsl-nand", | ||
461 | .id = -1, | ||
462 | .resource = sharpsl_nand_resources, | ||
463 | .num_resources = ARRAY_SIZE(sharpsl_nand_resources), | ||
464 | .dev.platform_data = &sharpsl_nand_platform_data, | ||
465 | }; | ||
466 | |||
417 | static struct mtd_partition sharpsl_rom_parts[] = { | 467 | static struct mtd_partition sharpsl_rom_parts[] = { |
418 | { | 468 | { |
419 | .name ="Boot PROM Filesystem", | 469 | .name ="Boot PROM Filesystem", |
@@ -447,6 +497,7 @@ static struct platform_device sharpsl_rom_device = { | |||
447 | static struct platform_device *devices[] __initdata = { | 497 | static struct platform_device *devices[] __initdata = { |
448 | &poodle_locomo_device, | 498 | &poodle_locomo_device, |
449 | &poodle_scoop_device, | 499 | &poodle_scoop_device, |
500 | &sharpsl_nand_device, | ||
450 | &sharpsl_rom_device, | 501 | &sharpsl_rom_device, |
451 | }; | 502 | }; |
452 | 503 | ||
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 7299d87a1cb3..6d447c9ce8ab 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/spi/spi.h> | 31 | #include <linux/spi/spi.h> |
32 | #include <linux/spi/ads7846.h> | 32 | #include <linux/spi/ads7846.h> |
33 | #include <linux/spi/corgi_lcd.h> | 33 | #include <linux/spi/corgi_lcd.h> |
34 | #include <linux/mtd/sharpsl.h> | ||
34 | 35 | ||
35 | #include <asm/setup.h> | 36 | #include <asm/setup.h> |
36 | #include <asm/memory.h> | 37 | #include <asm/memory.h> |
@@ -613,6 +614,54 @@ static struct pxafb_mach_info spitz_pxafb_info = { | |||
613 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING, | 614 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING, |
614 | }; | 615 | }; |
615 | 616 | ||
617 | static struct mtd_partition sharpsl_nand_partitions[] = { | ||
618 | { | ||
619 | .name = "System Area", | ||
620 | .offset = 0, | ||
621 | .size = 7 * 1024 * 1024, | ||
622 | }, | ||
623 | { | ||
624 | .name = "Root Filesystem", | ||
625 | .offset = 7 * 1024 * 1024, | ||
626 | }, | ||
627 | { | ||
628 | .name = "Home Filesystem", | ||
629 | .offset = MTDPART_OFS_APPEND, | ||
630 | .size = MTDPART_SIZ_FULL, | ||
631 | }, | ||
632 | }; | ||
633 | |||
634 | static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; | ||
635 | |||
636 | static struct nand_bbt_descr sharpsl_bbt = { | ||
637 | .options = 0, | ||
638 | .offs = 4, | ||
639 | .len = 2, | ||
640 | .pattern = scan_ff_pattern | ||
641 | }; | ||
642 | |||
643 | static struct sharpsl_nand_platform_data sharpsl_nand_platform_data = { | ||
644 | .badblock_pattern = &sharpsl_bbt, | ||
645 | .partitions = sharpsl_nand_partitions, | ||
646 | .nr_partitions = ARRAY_SIZE(sharpsl_nand_partitions), | ||
647 | }; | ||
648 | |||
649 | static struct resource sharpsl_nand_resources[] = { | ||
650 | { | ||
651 | .start = 0x0C000000, | ||
652 | .end = 0x0C000FFF, | ||
653 | .flags = IORESOURCE_MEM, | ||
654 | }, | ||
655 | }; | ||
656 | |||
657 | static struct platform_device sharpsl_nand_device = { | ||
658 | .name = "sharpsl-nand", | ||
659 | .id = -1, | ||
660 | .resource = sharpsl_nand_resources, | ||
661 | .num_resources = ARRAY_SIZE(sharpsl_nand_resources), | ||
662 | .dev.platform_data = &sharpsl_nand_platform_data, | ||
663 | }; | ||
664 | |||
616 | 665 | ||
617 | static struct mtd_partition sharpsl_rom_parts[] = { | 666 | static struct mtd_partition sharpsl_rom_parts[] = { |
618 | { | 667 | { |
@@ -648,6 +697,7 @@ static struct platform_device *devices[] __initdata = { | |||
648 | &spitzscoop_device, | 697 | &spitzscoop_device, |
649 | &spitzkbd_device, | 698 | &spitzkbd_device, |
650 | &spitzled_device, | 699 | &spitzled_device, |
700 | &sharpsl_nand_device, | ||
651 | &sharpsl_rom_device, | 701 | &sharpsl_rom_device, |
652 | }; | 702 | }; |
653 | 703 | ||
@@ -671,6 +721,14 @@ static void __init common_init(void) | |||
671 | pm_power_off = spitz_poweroff; | 721 | pm_power_off = spitz_poweroff; |
672 | arm_pm_restart = spitz_restart; | 722 | arm_pm_restart = spitz_restart; |
673 | 723 | ||
724 | if (machine_is_spitz()) { | ||
725 | sharpsl_nand_partitions[1].size = 5 * 1024 * 1024; | ||
726 | } else if (machine_is_akita()) { | ||
727 | sharpsl_nand_partitions[1].size = 58 * 1024 * 1024; | ||
728 | } else if (machine_is_borzoi()) { | ||
729 | sharpsl_nand_partitions[1].size = 32 * 1024 * 1024; | ||
730 | } | ||
731 | |||
674 | PMCR = 0x00; | 732 | PMCR = 0x00; |
675 | 733 | ||
676 | /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ | 734 | /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ |
@@ -715,10 +773,29 @@ static struct i2c_board_info akita_i2c_board_info[] = { | |||
715 | }, | 773 | }, |
716 | }; | 774 | }; |
717 | 775 | ||
776 | static struct nand_bbt_descr sharpsl_akita_bbt = { | ||
777 | .options = 0, | ||
778 | .offs = 4, | ||
779 | .len = 1, | ||
780 | .pattern = scan_ff_pattern | ||
781 | }; | ||
782 | |||
783 | static struct nand_ecclayout akita_oobinfo = { | ||
784 | .eccbytes = 24, | ||
785 | .eccpos = { | ||
786 | 0x5, 0x1, 0x2, 0x3, 0x6, 0x7, 0x15, 0x11, | ||
787 | 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23, | ||
788 | 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37}, | ||
789 | .oobfree = {{0x08, 0x09}} | ||
790 | }; | ||
791 | |||
718 | static void __init akita_init(void) | 792 | static void __init akita_init(void) |
719 | { | 793 | { |
720 | spitz_ficp_platform_data.transceiver_mode = akita_irda_transceiver_mode; | 794 | spitz_ficp_platform_data.transceiver_mode = akita_irda_transceiver_mode; |
721 | 795 | ||
796 | sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt; | ||
797 | sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo; | ||
798 | |||
722 | /* We just pretend the second element of the array doesn't exist */ | 799 | /* We just pretend the second element of the array doesn't exist */ |
723 | spitz_pcmcia_config.num_devs = 1; | 800 | spitz_pcmcia_config.num_devs = 1; |
724 | platform_scoop_config = &spitz_pcmcia_config; | 801 | platform_scoop_config = &spitz_pcmcia_config; |
diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c index 8fce85f33033..ea3c75595fa9 100644 --- a/arch/arm/mach-realview/platsmp.c +++ b/arch/arm/mach-realview/platsmp.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
14 | #include <linux/device.h> | 14 | #include <linux/device.h> |
15 | #include <linux/jiffies.h> | ||
15 | #include <linux/smp.h> | 16 | #include <linux/smp.h> |
16 | #include <linux/io.h> | 17 | #include <linux/io.h> |
17 | 18 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/gpio.h b/arch/arm/mach-s3c2410/include/mach/gpio.h index e0349af8a483..00476a573bbe 100644 --- a/arch/arm/mach-s3c2410/include/mach/gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/gpio.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #define gpio_get_value __gpio_get_value | 14 | #define gpio_get_value __gpio_get_value |
15 | #define gpio_set_value __gpio_set_value | 15 | #define gpio_set_value __gpio_set_value |
16 | #define gpio_cansleep __gpio_cansleep | 16 | #define gpio_cansleep __gpio_cansleep |
17 | #define gpio_to_irq __gpio_to_irq | ||
17 | 18 | ||
18 | /* some boards require extra gpio capacity to support external | 19 | /* some boards require extra gpio capacity to support external |
19 | * devices that need GPIO. | 20 | * devices that need GPIO. |
diff --git a/arch/arm/mach-s3c2410/include/mach/irqs.h b/arch/arm/mach-s3c2410/include/mach/irqs.h index 9565903d490b..49efce8cd4a7 100644 --- a/arch/arm/mach-s3c2410/include/mach/irqs.h +++ b/arch/arm/mach-s3c2410/include/mach/irqs.h | |||
@@ -12,10 +12,6 @@ | |||
12 | #ifndef __ASM_ARCH_IRQS_H | 12 | #ifndef __ASM_ARCH_IRQS_H |
13 | #define __ASM_ARCH_IRQS_H __FILE__ | 13 | #define __ASM_ARCH_IRQS_H __FILE__ |
14 | 14 | ||
15 | #ifndef __ASM_ARM_IRQ_H | ||
16 | #error "Do not include this directly, instead #include <asm/irq.h>" | ||
17 | #endif | ||
18 | |||
19 | /* we keep the first set of CPU IRQs out of the range of | 15 | /* we keep the first set of CPU IRQs out of the range of |
20 | * the ISA space, so that the PC104 has them to itself | 16 | * the ISA space, so that the PC104 has them to itself |
21 | * and we don't end up having to do horrible things to the | 17 | * and we don't end up having to do horrible things to the |
diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index 0a6d0a5d961b..315c42e31278 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #include <plat/clock.h> | 47 | #include <plat/clock.h> |
48 | #include <plat/devs.h> | 48 | #include <plat/devs.h> |
49 | #include <plat/cpu.h> | 49 | #include <plat/cpu.h> |
50 | #include <asm/plat-s3c24xx/mci.h> | 50 | #include <plat/mci.h> |
51 | 51 | ||
52 | static struct map_desc at2440evb_iodesc[] __initdata = { | 52 | static struct map_desc at2440evb_iodesc[] __initdata = { |
53 | /* Nothing here */ | 53 | /* Nothing here */ |
diff --git a/arch/arm/mach-s3c6400/include/mach/irqs.h b/arch/arm/mach-s3c6400/include/mach/irqs.h index b38c47cffc28..4c97f9a4370b 100644 --- a/arch/arm/mach-s3c6400/include/mach/irqs.h +++ b/arch/arm/mach-s3c6400/include/mach/irqs.h | |||
@@ -11,10 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_IRQS_H | 11 | #ifndef __ASM_ARCH_IRQS_H |
12 | #define __ASM_ARCH_IRQS_H __FILE__ | 12 | #define __ASM_ARCH_IRQS_H __FILE__ |
13 | 13 | ||
14 | #ifndef __ASM_ARM_IRQ_H | ||
15 | #error "Do not include this directly, instead #include <asm/irq.h>" | ||
16 | #endif | ||
17 | |||
18 | #include <plat/irqs.h> | 14 | #include <plat/irqs.h> |
19 | 15 | ||
20 | #endif /* __ASM_ARCH_IRQ_H */ | 16 | #endif /* __ASM_ARCH_IRQ_H */ |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 67960017dc8f..310e479309ef 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -71,7 +71,7 @@ static DEFINE_SPINLOCK(consistent_lock); | |||
71 | * the amount of RAM found at boot time.) I would imagine that get_vm_area() | 71 | * the amount of RAM found at boot time.) I would imagine that get_vm_area() |
72 | * would have to initialise this each time prior to calling vm_region_alloc(). | 72 | * would have to initialise this each time prior to calling vm_region_alloc(). |
73 | */ | 73 | */ |
74 | struct vm_region { | 74 | struct arm_vm_region { |
75 | struct list_head vm_list; | 75 | struct list_head vm_list; |
76 | unsigned long vm_start; | 76 | unsigned long vm_start; |
77 | unsigned long vm_end; | 77 | unsigned long vm_end; |
@@ -79,20 +79,20 @@ struct vm_region { | |||
79 | int vm_active; | 79 | int vm_active; |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static struct vm_region consistent_head = { | 82 | static struct arm_vm_region consistent_head = { |
83 | .vm_list = LIST_HEAD_INIT(consistent_head.vm_list), | 83 | .vm_list = LIST_HEAD_INIT(consistent_head.vm_list), |
84 | .vm_start = CONSISTENT_BASE, | 84 | .vm_start = CONSISTENT_BASE, |
85 | .vm_end = CONSISTENT_END, | 85 | .vm_end = CONSISTENT_END, |
86 | }; | 86 | }; |
87 | 87 | ||
88 | static struct vm_region * | 88 | static struct arm_vm_region * |
89 | vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp) | 89 | arm_vm_region_alloc(struct arm_vm_region *head, size_t size, gfp_t gfp) |
90 | { | 90 | { |
91 | unsigned long addr = head->vm_start, end = head->vm_end - size; | 91 | unsigned long addr = head->vm_start, end = head->vm_end - size; |
92 | unsigned long flags; | 92 | unsigned long flags; |
93 | struct vm_region *c, *new; | 93 | struct arm_vm_region *c, *new; |
94 | 94 | ||
95 | new = kmalloc(sizeof(struct vm_region), gfp); | 95 | new = kmalloc(sizeof(struct arm_vm_region), gfp); |
96 | if (!new) | 96 | if (!new) |
97 | goto out; | 97 | goto out; |
98 | 98 | ||
@@ -127,9 +127,9 @@ vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp) | |||
127 | return NULL; | 127 | return NULL; |
128 | } | 128 | } |
129 | 129 | ||
130 | static struct vm_region *vm_region_find(struct vm_region *head, unsigned long addr) | 130 | static struct arm_vm_region *arm_vm_region_find(struct arm_vm_region *head, unsigned long addr) |
131 | { | 131 | { |
132 | struct vm_region *c; | 132 | struct arm_vm_region *c; |
133 | 133 | ||
134 | list_for_each_entry(c, &head->vm_list, vm_list) { | 134 | list_for_each_entry(c, &head->vm_list, vm_list) { |
135 | if (c->vm_active && c->vm_start == addr) | 135 | if (c->vm_active && c->vm_start == addr) |
@@ -149,7 +149,7 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
149 | pgprot_t prot) | 149 | pgprot_t prot) |
150 | { | 150 | { |
151 | struct page *page; | 151 | struct page *page; |
152 | struct vm_region *c; | 152 | struct arm_vm_region *c; |
153 | unsigned long order; | 153 | unsigned long order; |
154 | u64 mask = ISA_DMA_THRESHOLD, limit; | 154 | u64 mask = ISA_DMA_THRESHOLD, limit; |
155 | 155 | ||
@@ -214,7 +214,7 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
214 | /* | 214 | /* |
215 | * Allocate a virtual address in the consistent mapping region. | 215 | * Allocate a virtual address in the consistent mapping region. |
216 | */ | 216 | */ |
217 | c = vm_region_alloc(&consistent_head, size, | 217 | c = arm_vm_region_alloc(&consistent_head, size, |
218 | gfp & ~(__GFP_DMA | __GFP_HIGHMEM)); | 218 | gfp & ~(__GFP_DMA | __GFP_HIGHMEM)); |
219 | if (c) { | 219 | if (c) { |
220 | pte_t *pte; | 220 | pte_t *pte; |
@@ -311,13 +311,13 @@ static int dma_mmap(struct device *dev, struct vm_area_struct *vma, | |||
311 | void *cpu_addr, dma_addr_t dma_addr, size_t size) | 311 | void *cpu_addr, dma_addr_t dma_addr, size_t size) |
312 | { | 312 | { |
313 | unsigned long flags, user_size, kern_size; | 313 | unsigned long flags, user_size, kern_size; |
314 | struct vm_region *c; | 314 | struct arm_vm_region *c; |
315 | int ret = -ENXIO; | 315 | int ret = -ENXIO; |
316 | 316 | ||
317 | user_size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 317 | user_size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
318 | 318 | ||
319 | spin_lock_irqsave(&consistent_lock, flags); | 319 | spin_lock_irqsave(&consistent_lock, flags); |
320 | c = vm_region_find(&consistent_head, (unsigned long)cpu_addr); | 320 | c = arm_vm_region_find(&consistent_head, (unsigned long)cpu_addr); |
321 | spin_unlock_irqrestore(&consistent_lock, flags); | 321 | spin_unlock_irqrestore(&consistent_lock, flags); |
322 | 322 | ||
323 | if (c) { | 323 | if (c) { |
@@ -359,7 +359,7 @@ EXPORT_SYMBOL(dma_mmap_writecombine); | |||
359 | */ | 359 | */ |
360 | void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle) | 360 | void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle) |
361 | { | 361 | { |
362 | struct vm_region *c; | 362 | struct arm_vm_region *c; |
363 | unsigned long flags, addr; | 363 | unsigned long flags, addr; |
364 | pte_t *ptep; | 364 | pte_t *ptep; |
365 | int idx; | 365 | int idx; |
@@ -378,7 +378,7 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr | |||
378 | size = PAGE_ALIGN(size); | 378 | size = PAGE_ALIGN(size); |
379 | 379 | ||
380 | spin_lock_irqsave(&consistent_lock, flags); | 380 | spin_lock_irqsave(&consistent_lock, flags); |
381 | c = vm_region_find(&consistent_head, (unsigned long)cpu_addr); | 381 | c = arm_vm_region_find(&consistent_head, (unsigned long)cpu_addr); |
382 | if (!c) | 382 | if (!c) |
383 | goto no_area; | 383 | goto no_area; |
384 | 384 | ||
diff --git a/arch/arm/plat-mxc/include/mach/usb.h b/arch/arm/plat-mxc/include/mach/usb.h new file mode 100644 index 000000000000..2dacb3086f1c --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/usb.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Darius Augulis <augulis.darius@gmail.com> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_MXC_USB | ||
16 | #define __ASM_ARCH_MXC_USB | ||
17 | |||
18 | struct imxusb_platform_data { | ||
19 | int (*init)(struct device *); | ||
20 | int (*exit)(struct device *); | ||
21 | }; | ||
22 | |||
23 | #endif /* __ASM_ARCH_MXC_USB */ | ||
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index 89a6ab0b7db8..467531edefd3 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
29 | #include <mach/irqs.h> | ||
29 | #include <mach/mux.h> | 30 | #include <mach/mux.h> |
30 | 31 | ||
31 | #define OMAP_I2C_SIZE 0x3f | 32 | #define OMAP_I2C_SIZE 0x3f |
diff --git a/arch/arm/plat-omap/usb.c b/arch/arm/plat-omap/usb.c index 67ca1e216df7..add0485703b5 100644 --- a/arch/arm/plat-omap/usb.c +++ b/arch/arm/plat-omap/usb.c | |||
@@ -77,38 +77,6 @@ | |||
77 | 77 | ||
78 | /*-------------------------------------------------------------------------*/ | 78 | /*-------------------------------------------------------------------------*/ |
79 | 79 | ||
80 | #if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_USB_MUSB_OTG) | ||
81 | |||
82 | static struct otg_transceiver *xceiv; | ||
83 | |||
84 | /** | ||
85 | * otg_get_transceiver - find the (single) OTG transceiver driver | ||
86 | * | ||
87 | * Returns the transceiver driver, after getting a refcount to it; or | ||
88 | * null if there is no such transceiver. The caller is responsible for | ||
89 | * releasing that count. | ||
90 | */ | ||
91 | struct otg_transceiver *otg_get_transceiver(void) | ||
92 | { | ||
93 | if (xceiv) | ||
94 | get_device(xceiv->dev); | ||
95 | return xceiv; | ||
96 | } | ||
97 | EXPORT_SYMBOL(otg_get_transceiver); | ||
98 | |||
99 | int otg_set_transceiver(struct otg_transceiver *x) | ||
100 | { | ||
101 | if (xceiv && x) | ||
102 | return -EBUSY; | ||
103 | xceiv = x; | ||
104 | return 0; | ||
105 | } | ||
106 | EXPORT_SYMBOL(otg_set_transceiver); | ||
107 | |||
108 | #endif | ||
109 | |||
110 | /*-------------------------------------------------------------------------*/ | ||
111 | |||
112 | #if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_ARCH_OMAP15XX) | 80 | #if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_ARCH_OMAP15XX) |
113 | 81 | ||
114 | static void omap2_usb_devconf_clear(u8 port, u32 mask) | 82 | static void omap2_usb_devconf_clear(u8 port, u32 mask) |
diff --git a/arch/arm/plat-s3c/dev-fb.c b/arch/arm/plat-s3c/dev-fb.c index 0454b8ec02e2..a90198fc4b0f 100644 --- a/arch/arm/plat-s3c/dev-fb.c +++ b/arch/arm/plat-s3c/dev-fb.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | 18 | ||
19 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | 20 | #include <mach/map.h> |
20 | #include <mach/regs-fb.h> | 21 | #include <mach/regs-fb.h> |
21 | 22 | ||
diff --git a/arch/arm/plat-s3c/dev-i2c0.c b/arch/arm/plat-s3c/dev-i2c0.c index 2c0128c77c6e..fe327074037e 100644 --- a/arch/arm/plat-s3c/dev-i2c0.c +++ b/arch/arm/plat-s3c/dev-i2c0.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/string.h> | 15 | #include <linux/string.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | 17 | ||
18 | #include <mach/irqs.h> | ||
18 | #include <mach/map.h> | 19 | #include <mach/map.h> |
19 | 20 | ||
20 | #include <plat/regs-iic.h> | 21 | #include <plat/regs-iic.h> |
diff --git a/arch/arm/plat-s3c/dev-i2c1.c b/arch/arm/plat-s3c/dev-i2c1.c index 9658fb0aec95..2387fbf57af6 100644 --- a/arch/arm/plat-s3c/dev-i2c1.c +++ b/arch/arm/plat-s3c/dev-i2c1.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/string.h> | 15 | #include <linux/string.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | 17 | ||
18 | #include <mach/irqs.h> | ||
18 | #include <mach/map.h> | 19 | #include <mach/map.h> |
19 | 20 | ||
20 | #include <plat/regs-iic.h> | 21 | #include <plat/regs-iic.h> |
diff --git a/arch/arm/plat-s3c24xx/gpiolib.c b/arch/arm/plat-s3c24xx/gpiolib.c index f95c6c9d9f1a..94a341aaa4e4 100644 --- a/arch/arm/plat-s3c24xx/gpiolib.c +++ b/arch/arm/plat-s3c24xx/gpiolib.c | |||
@@ -59,6 +59,22 @@ static int s3c24xx_gpiolib_banka_output(struct gpio_chip *chip, | |||
59 | return 0; | 59 | return 0; |
60 | } | 60 | } |
61 | 61 | ||
62 | static int s3c24xx_gpiolib_bankf_toirq(struct gpio_chip *chip, unsigned offset) | ||
63 | { | ||
64 | if (offset < 4) | ||
65 | return IRQ_EINT0 + offset; | ||
66 | |||
67 | if (offset < 8) | ||
68 | return IRQ_EINT4 + offset - 4; | ||
69 | |||
70 | return -EINVAL; | ||
71 | } | ||
72 | |||
73 | static int s3c24xx_gpiolib_bankg_toirq(struct gpio_chip *chip, unsigned offset) | ||
74 | { | ||
75 | return IRQ_EINT8 + offset; | ||
76 | } | ||
77 | |||
62 | struct s3c_gpio_chip s3c24xx_gpios[] = { | 78 | struct s3c_gpio_chip s3c24xx_gpios[] = { |
63 | [0] = { | 79 | [0] = { |
64 | .base = S3C24XX_GPIO_BASE(S3C2410_GPA0), | 80 | .base = S3C24XX_GPIO_BASE(S3C2410_GPA0), |
@@ -114,6 +130,7 @@ struct s3c_gpio_chip s3c24xx_gpios[] = { | |||
114 | .owner = THIS_MODULE, | 130 | .owner = THIS_MODULE, |
115 | .label = "GPIOF", | 131 | .label = "GPIOF", |
116 | .ngpio = 8, | 132 | .ngpio = 8, |
133 | .to_irq = s3c24xx_gpiolib_bankf_toirq, | ||
117 | }, | 134 | }, |
118 | }, | 135 | }, |
119 | [6] = { | 136 | [6] = { |
@@ -123,6 +140,7 @@ struct s3c_gpio_chip s3c24xx_gpios[] = { | |||
123 | .owner = THIS_MODULE, | 140 | .owner = THIS_MODULE, |
124 | .label = "GPIOG", | 141 | .label = "GPIOG", |
125 | .ngpio = 10, | 142 | .ngpio = 10, |
143 | .to_irq = s3c24xx_gpiolib_bankg_toirq, | ||
126 | }, | 144 | }, |
127 | }, | 145 | }, |
128 | }; | 146 | }; |
diff --git a/arch/arm/plat-s3c24xx/pwm.c b/arch/arm/plat-s3c24xx/pwm.c index ec56b88866c4..0120b760315b 100644 --- a/arch/arm/plat-s3c24xx/pwm.c +++ b/arch/arm/plat-s3c24xx/pwm.c | |||
@@ -19,6 +19,8 @@ | |||
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/pwm.h> | 20 | #include <linux/pwm.h> |
21 | 21 | ||
22 | #include <mach/irqs.h> | ||
23 | |||
22 | #include <plat/devs.h> | 24 | #include <plat/devs.h> |
23 | #include <plat/regs-timer.h> | 25 | #include <plat/regs-timer.h> |
24 | 26 | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/irqs.h b/arch/arm/plat-s3c64xx/include/plat/irqs.h index 02e8dd4c97d5..2846f550b727 100644 --- a/arch/arm/plat-s3c64xx/include/plat/irqs.h +++ b/arch/arm/plat-s3c64xx/include/plat/irqs.h | |||
@@ -191,7 +191,7 @@ | |||
191 | #define IRQ_EINT_GROUP8_BASE (IRQ_EINT_GROUP7_BASE + IRQ_EINT_GROUP7_NR) | 191 | #define IRQ_EINT_GROUP8_BASE (IRQ_EINT_GROUP7_BASE + IRQ_EINT_GROUP7_NR) |
192 | #define IRQ_EINT_GROUP9_BASE (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR) | 192 | #define IRQ_EINT_GROUP9_BASE (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR) |
193 | 193 | ||
194 | #define IRQ_EINT_GROUP(group, no) (IRQ_EINT_GROUP##group##__BASE + (x)) | 194 | #define IRQ_EINT_GROUP(group, no) (IRQ_EINT_GROUP##group##_BASE + (no)) |
195 | 195 | ||
196 | /* Set the default NR_IRQS */ | 196 | /* Set the default NR_IRQS */ |
197 | 197 | ||
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index ea7bc1e8562b..3fbfd1e32a9e 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c | |||
@@ -1305,7 +1305,7 @@ struct platform_device *__init | |||
1305 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | 1305 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data) |
1306 | { | 1306 | { |
1307 | struct platform_device *pdev; | 1307 | struct platform_device *pdev; |
1308 | struct dw_dma_slave *dws; | 1308 | struct dw_dma_slave *dws = &data->dma_slave; |
1309 | u32 pioa_mask; | 1309 | u32 pioa_mask; |
1310 | u32 piob_mask; | 1310 | u32 piob_mask; |
1311 | 1311 | ||
@@ -1324,22 +1324,13 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | |||
1324 | ARRAY_SIZE(atmel_mci0_resource))) | 1324 | ARRAY_SIZE(atmel_mci0_resource))) |
1325 | goto fail; | 1325 | goto fail; |
1326 | 1326 | ||
1327 | if (data->dma_slave) | 1327 | dws->dma_dev = &dw_dmac0_device.dev; |
1328 | dws = kmemdup(to_dw_dma_slave(data->dma_slave), | 1328 | dws->reg_width = DW_DMA_SLAVE_WIDTH_32BIT; |
1329 | sizeof(struct dw_dma_slave), GFP_KERNEL); | ||
1330 | else | ||
1331 | dws = kzalloc(sizeof(struct dw_dma_slave), GFP_KERNEL); | ||
1332 | |||
1333 | dws->slave.dev = &pdev->dev; | ||
1334 | dws->slave.dma_dev = &dw_dmac0_device.dev; | ||
1335 | dws->slave.reg_width = DMA_SLAVE_WIDTH_32BIT; | ||
1336 | dws->cfg_hi = (DWC_CFGH_SRC_PER(0) | 1329 | dws->cfg_hi = (DWC_CFGH_SRC_PER(0) |
1337 | | DWC_CFGH_DST_PER(1)); | 1330 | | DWC_CFGH_DST_PER(1)); |
1338 | dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | 1331 | dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL |
1339 | | DWC_CFGL_HS_SRC_POL); | 1332 | | DWC_CFGL_HS_SRC_POL); |
1340 | 1333 | ||
1341 | data->dma_slave = &dws->slave; | ||
1342 | |||
1343 | if (platform_device_add_data(pdev, data, | 1334 | if (platform_device_add_data(pdev, data, |
1344 | sizeof(struct mci_platform_data))) | 1335 | sizeof(struct mci_platform_data))) |
1345 | goto fail; | 1336 | goto fail; |
diff --git a/arch/blackfin/include/asm/mmu.h b/arch/blackfin/include/asm/mmu.h index 757e43906ed4..dbfd686360e6 100644 --- a/arch/blackfin/include/asm/mmu.h +++ b/arch/blackfin/include/asm/mmu.h | |||
@@ -10,7 +10,6 @@ struct sram_list_struct { | |||
10 | }; | 10 | }; |
11 | 11 | ||
12 | typedef struct { | 12 | typedef struct { |
13 | struct vm_list_struct *vmlist; | ||
14 | unsigned long end_brk; | 13 | unsigned long end_brk; |
15 | unsigned long stack_start; | 14 | unsigned long stack_start; |
16 | 15 | ||
diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c index d2d388536630..594e325b40e4 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c | |||
@@ -160,15 +160,15 @@ put_reg(struct task_struct *task, int regno, unsigned long data) | |||
160 | static inline int is_user_addr_valid(struct task_struct *child, | 160 | static inline int is_user_addr_valid(struct task_struct *child, |
161 | unsigned long start, unsigned long len) | 161 | unsigned long start, unsigned long len) |
162 | { | 162 | { |
163 | struct vm_list_struct *vml; | 163 | struct vm_area_struct *vma; |
164 | struct sram_list_struct *sraml; | 164 | struct sram_list_struct *sraml; |
165 | 165 | ||
166 | /* overflow */ | 166 | /* overflow */ |
167 | if (start + len < start) | 167 | if (start + len < start) |
168 | return -EIO; | 168 | return -EIO; |
169 | 169 | ||
170 | for (vml = child->mm->context.vmlist; vml; vml = vml->next) | 170 | vma = find_vma(child->mm, start); |
171 | if (start >= vml->vma->vm_start && start + len < vml->vma->vm_end) | 171 | if (vma && start >= vma->vm_start && start + len <= vma->vm_end) |
172 | return 0; | 172 | return 0; |
173 | 173 | ||
174 | for (sraml = child->mm->context.sram_list; sraml; sraml = sraml->next) | 174 | for (sraml = child->mm->context.sram_list; sraml; sraml = sraml->next) |
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 17d8e4172896..5b0667da8d05 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/kallsyms.h> | 33 | #include <linux/kallsyms.h> |
34 | #include <linux/fs.h> | 34 | #include <linux/fs.h> |
35 | #include <linux/rbtree.h> | ||
35 | #include <asm/traps.h> | 36 | #include <asm/traps.h> |
36 | #include <asm/cacheflush.h> | 37 | #include <asm/cacheflush.h> |
37 | #include <asm/cplb.h> | 38 | #include <asm/cplb.h> |
@@ -83,6 +84,7 @@ static void decode_address(char *buf, unsigned long address) | |||
83 | struct mm_struct *mm; | 84 | struct mm_struct *mm; |
84 | unsigned long flags, offset; | 85 | unsigned long flags, offset; |
85 | unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); | 86 | unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); |
87 | struct rb_node *n; | ||
86 | 88 | ||
87 | #ifdef CONFIG_KALLSYMS | 89 | #ifdef CONFIG_KALLSYMS |
88 | unsigned long symsize; | 90 | unsigned long symsize; |
@@ -128,9 +130,10 @@ static void decode_address(char *buf, unsigned long address) | |||
128 | if (!mm) | 130 | if (!mm) |
129 | continue; | 131 | continue; |
130 | 132 | ||
131 | vml = mm->context.vmlist; | 133 | for (n = rb_first(&mm->mm_rb); n; n = rb_next(n)) { |
132 | while (vml) { | 134 | struct vm_area_struct *vma; |
133 | struct vm_area_struct *vma = vml->vma; | 135 | |
136 | vma = rb_entry(n, struct vm_area_struct, vm_rb); | ||
134 | 137 | ||
135 | if (address >= vma->vm_start && address < vma->vm_end) { | 138 | if (address >= vma->vm_start && address < vma->vm_end) { |
136 | char _tmpbuf[256]; | 139 | char _tmpbuf[256]; |
@@ -176,8 +179,6 @@ static void decode_address(char *buf, unsigned long address) | |||
176 | 179 | ||
177 | goto done; | 180 | goto done; |
178 | } | 181 | } |
179 | |||
180 | vml = vml->next; | ||
181 | } | 182 | } |
182 | if (!in_atomic) | 183 | if (!in_atomic) |
183 | mmput(mm); | 184 | mmput(mm); |
diff --git a/arch/frv/kernel/ptrace.c b/arch/frv/kernel/ptrace.c index 709e9bdc6126..5e7d401d21e7 100644 --- a/arch/frv/kernel/ptrace.c +++ b/arch/frv/kernel/ptrace.c | |||
@@ -69,7 +69,8 @@ static inline int put_reg(struct task_struct *task, int regno, | |||
69 | } | 69 | } |
70 | 70 | ||
71 | /* | 71 | /* |
72 | * check that an address falls within the bounds of the target process's memory mappings | 72 | * check that an address falls within the bounds of the target process's memory |
73 | * mappings | ||
73 | */ | 74 | */ |
74 | static inline int is_user_addr_valid(struct task_struct *child, | 75 | static inline int is_user_addr_valid(struct task_struct *child, |
75 | unsigned long start, unsigned long len) | 76 | unsigned long start, unsigned long len) |
@@ -79,11 +80,11 @@ static inline int is_user_addr_valid(struct task_struct *child, | |||
79 | return -EIO; | 80 | return -EIO; |
80 | return 0; | 81 | return 0; |
81 | #else | 82 | #else |
82 | struct vm_list_struct *vml; | 83 | struct vm_area_struct *vma; |
83 | 84 | ||
84 | for (vml = child->mm->context.vmlist; vml; vml = vml->next) | 85 | vma = find_vma(child->mm, start); |
85 | if (start >= vml->vma->vm_start && start + len <= vml->vma->vm_end) | 86 | if (vma && start >= vma->vm_start && start + len <= vma->vm_end) |
86 | return 0; | 87 | return 0; |
87 | 88 | ||
88 | return -EIO; | 89 | return -EIO; |
89 | #endif | 90 | #endif |
diff --git a/arch/h8300/include/asm/mmu.h b/arch/h8300/include/asm/mmu.h index 2ce06ea46104..31309969df70 100644 --- a/arch/h8300/include/asm/mmu.h +++ b/arch/h8300/include/asm/mmu.h | |||
@@ -4,7 +4,6 @@ | |||
4 | /* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */ | 4 | /* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */ |
5 | 5 | ||
6 | typedef struct { | 6 | typedef struct { |
7 | struct vm_list_struct *vmlist; | ||
8 | unsigned long end_brk; | 7 | unsigned long end_brk; |
9 | } mm_context_t; | 8 | } mm_context_t; |
10 | 9 | ||
diff --git a/arch/ia64/include/asm/acpi-ext.h b/arch/ia64/include/asm/acpi-ext.h index 734d137dda6e..7f8362b379eb 100644 --- a/arch/ia64/include/asm/acpi-ext.h +++ b/arch/ia64/include/asm/acpi-ext.h | |||
@@ -14,7 +14,6 @@ | |||
14 | #define _ASM_IA64_ACPI_EXT_H | 14 | #define _ASM_IA64_ACPI_EXT_H |
15 | 15 | ||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <acpi/actypes.h> | ||
18 | 17 | ||
19 | extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length); | 18 | extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length); |
20 | 19 | ||
diff --git a/arch/ia64/include/asm/irq.h b/arch/ia64/include/asm/irq.h index 36429a532630..5282546cdf82 100644 --- a/arch/ia64/include/asm/irq.h +++ b/arch/ia64/include/asm/irq.h | |||
@@ -27,7 +27,7 @@ irq_canonicalize (int irq) | |||
27 | } | 27 | } |
28 | 28 | ||
29 | extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); | 29 | extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); |
30 | bool is_affinity_mask_valid(cpumask_var_t cpumask); | 30 | bool is_affinity_mask_valid(const struct cpumask *cpumask); |
31 | 31 | ||
32 | #define is_affinity_mask_valid is_affinity_mask_valid | 32 | #define is_affinity_mask_valid is_affinity_mask_valid |
33 | 33 | ||
diff --git a/arch/ia64/include/asm/sn/acpi.h b/arch/ia64/include/asm/sn/acpi.h index 9ce2801cbd57..fd480db25565 100644 --- a/arch/ia64/include/asm/sn/acpi.h +++ b/arch/ia64/include/asm/sn/acpi.h | |||
@@ -9,8 +9,6 @@ | |||
9 | #ifndef _ASM_IA64_SN_ACPI_H | 9 | #ifndef _ASM_IA64_SN_ACPI_H |
10 | #define _ASM_IA64_SN_ACPI_H | 10 | #define _ASM_IA64_SN_ACPI_H |
11 | 11 | ||
12 | #include "acpi/acglobal.h" | ||
13 | |||
14 | extern int sn_acpi_rev; | 12 | extern int sn_acpi_rev; |
15 | #define SN_ACPI_BASE_SUPPORT() (sn_acpi_rev >= 0x20101) | 13 | #define SN_ACPI_BASE_SUPPORT() (sn_acpi_rev >= 0x20101) |
16 | 14 | ||
diff --git a/arch/ia64/include/asm/topology.h b/arch/ia64/include/asm/topology.h index 76a33a91ca69..32f3af1641c5 100644 --- a/arch/ia64/include/asm/topology.h +++ b/arch/ia64/include/asm/topology.h | |||
@@ -124,7 +124,7 @@ extern void arch_fix_phys_package_id(int num, u32 slot); | |||
124 | 124 | ||
125 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ | 125 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ |
126 | cpu_all_mask : \ | 126 | cpu_all_mask : \ |
127 | cpumask_from_node(pcibus_to_node(bus))) | 127 | cpumask_of_node(pcibus_to_node(bus))) |
128 | 128 | ||
129 | #include <asm-generic/topology.h> | 129 | #include <asm-generic/topology.h> |
130 | 130 | ||
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 0553648b7595..d541671caf4a 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -65,6 +65,7 @@ EXPORT_SYMBOL(pm_idle); | |||
65 | void (*pm_power_off) (void); | 65 | void (*pm_power_off) (void); |
66 | EXPORT_SYMBOL(pm_power_off); | 66 | EXPORT_SYMBOL(pm_power_off); |
67 | 67 | ||
68 | u32 acpi_rsdt_forced; | ||
68 | unsigned int acpi_cpei_override; | 69 | unsigned int acpi_cpei_override; |
69 | unsigned int acpi_cpei_phys_cpuid; | 70 | unsigned int acpi_cpei_phys_cpuid; |
70 | 71 | ||
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 95ff16cb05d8..a58f64ca9f0e 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -102,17 +102,14 @@ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 }; | |||
102 | 102 | ||
103 | void set_irq_affinity_info (unsigned int irq, int hwid, int redir) | 103 | void set_irq_affinity_info (unsigned int irq, int hwid, int redir) |
104 | { | 104 | { |
105 | cpumask_t mask = CPU_MASK_NONE; | ||
106 | |||
107 | cpu_set(cpu_logical_id(hwid), mask); | ||
108 | |||
109 | if (irq < NR_IRQS) { | 105 | if (irq < NR_IRQS) { |
110 | irq_desc[irq].affinity = mask; | 106 | cpumask_copy(&irq_desc[irq].affinity, |
107 | cpumask_of(cpu_logical_id(hwid))); | ||
111 | irq_redir[irq] = (char) (redir & 0xff); | 108 | irq_redir[irq] = (char) (redir & 0xff); |
112 | } | 109 | } |
113 | } | 110 | } |
114 | 111 | ||
115 | bool is_affinity_mask_valid(cpumask_var_t cpumask) | 112 | bool is_affinity_mask_valid(const struct cpumask *cpumask) |
116 | { | 113 | { |
117 | if (ia64_platform_is("sn2")) { | 114 | if (ia64_platform_is("sn2")) { |
118 | /* Only allow one CPU to be specified in the smp_affinity mask */ | 115 | /* Only allow one CPU to be specified in the smp_affinity mask */ |
@@ -128,7 +125,7 @@ bool is_affinity_mask_valid(cpumask_var_t cpumask) | |||
128 | unsigned int vectors_in_migration[NR_IRQS]; | 125 | unsigned int vectors_in_migration[NR_IRQS]; |
129 | 126 | ||
130 | /* | 127 | /* |
131 | * Since cpu_online_map is already updated, we just need to check for | 128 | * Since cpu_online_mask is already updated, we just need to check for |
132 | * affinity that has zeros | 129 | * affinity that has zeros |
133 | */ | 130 | */ |
134 | static void migrate_irqs(void) | 131 | static void migrate_irqs(void) |
@@ -158,7 +155,7 @@ static void migrate_irqs(void) | |||
158 | */ | 155 | */ |
159 | vectors_in_migration[irq] = irq; | 156 | vectors_in_migration[irq] = irq; |
160 | 157 | ||
161 | new_cpu = any_online_cpu(cpu_online_map); | 158 | new_cpu = cpumask_any(cpu_online_mask); |
162 | 159 | ||
163 | /* | 160 | /* |
164 | * Al three are essential, currently WARN_ON.. maybe panic? | 161 | * Al three are essential, currently WARN_ON.. maybe panic? |
@@ -191,7 +188,7 @@ void fixup_irqs(void) | |||
191 | * Find a new timesync master | 188 | * Find a new timesync master |
192 | */ | 189 | */ |
193 | if (smp_processor_id() == time_keeper_id) { | 190 | if (smp_processor_id() == time_keeper_id) { |
194 | time_keeper_id = first_cpu(cpu_online_map); | 191 | time_keeper_id = cpumask_first(cpu_online_mask); |
195 | printk ("CPU %d is now promoted to time-keeper master\n", time_keeper_id); | 192 | printk ("CPU %d is now promoted to time-keeper master\n", time_keeper_id); |
196 | } | 193 | } |
197 | 194 | ||
diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c index bc610a6c7851..c5a214026a77 100644 --- a/arch/ia64/sn/kernel/io_acpi_init.c +++ b/arch/ia64/sn/kernel/io_acpi_init.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <asm/sn/sn_sal.h> | 13 | #include <asm/sn/sn_sal.h> |
14 | #include "xtalk/hubdev.h" | 14 | #include "xtalk/hubdev.h" |
15 | #include <linux/acpi.h> | 15 | #include <linux/acpi.h> |
16 | #include <acpi/acnamesp.h> | ||
17 | 16 | ||
18 | 17 | ||
19 | /* | 18 | /* |
@@ -64,6 +63,7 @@ static acpi_status __init | |||
64 | sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret) | 63 | sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret) |
65 | { | 64 | { |
66 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 65 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
66 | struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
67 | u64 addr; | 67 | u64 addr; |
68 | struct hubdev_info *hubdev; | 68 | struct hubdev_info *hubdev; |
69 | struct hubdev_info *hubdev_ptr; | 69 | struct hubdev_info *hubdev_ptr; |
@@ -77,11 +77,12 @@ sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret) | |||
77 | status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS, | 77 | status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS, |
78 | &sn_uuid, &buffer); | 78 | &sn_uuid, &buffer); |
79 | if (ACPI_FAILURE(status)) { | 79 | if (ACPI_FAILURE(status)) { |
80 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
80 | printk(KERN_ERR | 81 | printk(KERN_ERR |
81 | "sn_acpi_hubdev_init: acpi_get_vendor_resource() " | 82 | "sn_acpi_hubdev_init: acpi_get_vendor_resource() " |
82 | "(0x%x) failed for: ", status); | 83 | "(0x%x) failed for: %s\n", status, |
83 | acpi_ns_print_node_pathname(handle, NULL); | 84 | (char *)name_buffer.pointer); |
84 | printk("\n"); | 85 | kfree(name_buffer.pointer); |
85 | return AE_OK; /* Continue walking namespace */ | 86 | return AE_OK; /* Continue walking namespace */ |
86 | } | 87 | } |
87 | 88 | ||
@@ -89,11 +90,12 @@ sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret) | |||
89 | vendor = &resource->data.vendor_typed; | 90 | vendor = &resource->data.vendor_typed; |
90 | if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) != | 91 | if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) != |
91 | sizeof(struct hubdev_info *)) { | 92 | sizeof(struct hubdev_info *)) { |
93 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
92 | printk(KERN_ERR | 94 | printk(KERN_ERR |
93 | "sn_acpi_hubdev_init: Invalid vendor data length: %d for: ", | 95 | "sn_acpi_hubdev_init: Invalid vendor data length: " |
94 | vendor->byte_length); | 96 | "%d for: %s\n", |
95 | acpi_ns_print_node_pathname(handle, NULL); | 97 | vendor->byte_length, (char *)name_buffer.pointer); |
96 | printk("\n"); | 98 | kfree(name_buffer.pointer); |
97 | goto exit; | 99 | goto exit; |
98 | } | 100 | } |
99 | 101 | ||
@@ -120,6 +122,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus) | |||
120 | { | 122 | { |
121 | u64 addr; | 123 | u64 addr; |
122 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 124 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
125 | struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
123 | acpi_handle handle; | 126 | acpi_handle handle; |
124 | struct pcibus_bussoft *prom_bussoft_ptr; | 127 | struct pcibus_bussoft *prom_bussoft_ptr; |
125 | struct acpi_resource *resource; | 128 | struct acpi_resource *resource; |
@@ -131,11 +134,11 @@ sn_get_bussoft_ptr(struct pci_bus *bus) | |||
131 | status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS, | 134 | status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS, |
132 | &sn_uuid, &buffer); | 135 | &sn_uuid, &buffer); |
133 | if (ACPI_FAILURE(status)) { | 136 | if (ACPI_FAILURE(status)) { |
137 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
134 | printk(KERN_ERR "%s: " | 138 | printk(KERN_ERR "%s: " |
135 | "acpi_get_vendor_resource() failed (0x%x) for: ", | 139 | "acpi_get_vendor_resource() failed (0x%x) for: %s\n", |
136 | __func__, status); | 140 | __func__, status, (char *)name_buffer.pointer); |
137 | acpi_ns_print_node_pathname(handle, NULL); | 141 | kfree(name_buffer.pointer); |
138 | printk("\n"); | ||
139 | return NULL; | 142 | return NULL; |
140 | } | 143 | } |
141 | resource = buffer.pointer; | 144 | resource = buffer.pointer; |
@@ -168,6 +171,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
168 | { | 171 | { |
169 | u64 addr; | 172 | u64 addr; |
170 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 173 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
174 | struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
171 | struct sn_irq_info *irq_info, *irq_info_prom; | 175 | struct sn_irq_info *irq_info, *irq_info_prom; |
172 | struct pcidev_info *pcidev_ptr, *pcidev_prom_ptr; | 176 | struct pcidev_info *pcidev_ptr, *pcidev_prom_ptr; |
173 | struct acpi_resource *resource; | 177 | struct acpi_resource *resource; |
@@ -182,11 +186,11 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
182 | status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS, | 186 | status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS, |
183 | &sn_uuid, &buffer); | 187 | &sn_uuid, &buffer); |
184 | if (ACPI_FAILURE(status)) { | 188 | if (ACPI_FAILURE(status)) { |
189 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
185 | printk(KERN_ERR | 190 | printk(KERN_ERR |
186 | "%s: acpi_get_vendor_resource() failed (0x%x) for: ", | 191 | "%s: acpi_get_vendor_resource() failed (0x%x) for: %s\n", |
187 | __func__, status); | 192 | __func__, status, (char *)name_buffer.pointer); |
188 | acpi_ns_print_node_pathname(handle, NULL); | 193 | kfree(name_buffer.pointer); |
189 | printk("\n"); | ||
190 | return 1; | 194 | return 1; |
191 | } | 195 | } |
192 | 196 | ||
@@ -194,11 +198,12 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
194 | vendor = &resource->data.vendor_typed; | 198 | vendor = &resource->data.vendor_typed; |
195 | if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) != | 199 | if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) != |
196 | sizeof(struct pci_devdev_info *)) { | 200 | sizeof(struct pci_devdev_info *)) { |
201 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
197 | printk(KERN_ERR | 202 | printk(KERN_ERR |
198 | "%s: Invalid vendor data length: %d for: ", | 203 | "%s: Invalid vendor data length: %d for: %s\n", |
199 | __func__, vendor->byte_length); | 204 | __func__, vendor->byte_length, |
200 | acpi_ns_print_node_pathname(handle, NULL); | 205 | (char *)name_buffer.pointer); |
201 | printk("\n"); | 206 | kfree(name_buffer.pointer); |
202 | ret = 1; | 207 | ret = 1; |
203 | goto exit; | 208 | goto exit; |
204 | } | 209 | } |
@@ -239,6 +244,9 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) | |||
239 | acpi_handle parent; | 244 | acpi_handle parent; |
240 | int slot; | 245 | int slot; |
241 | acpi_status status; | 246 | acpi_status status; |
247 | struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
248 | |||
249 | acpi_get_name(device_handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
242 | 250 | ||
243 | /* | 251 | /* |
244 | * Do an upward search to find the root bus device, and | 252 | * Do an upward search to find the root bus device, and |
@@ -249,9 +257,8 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) | |||
249 | status = acpi_get_parent(child, &parent); | 257 | status = acpi_get_parent(child, &parent); |
250 | if (ACPI_FAILURE(status)) { | 258 | if (ACPI_FAILURE(status)) { |
251 | printk(KERN_ERR "%s: acpi_get_parent() failed " | 259 | printk(KERN_ERR "%s: acpi_get_parent() failed " |
252 | "(0x%x) for: ", __func__, status); | 260 | "(0x%x) for: %s\n", __func__, status, |
253 | acpi_ns_print_node_pathname(child, NULL); | 261 | (char *)name_buffer.pointer); |
254 | printk("\n"); | ||
255 | panic("%s: Unable to find host devfn\n", __func__); | 262 | panic("%s: Unable to find host devfn\n", __func__); |
256 | } | 263 | } |
257 | if (parent == rootbus_handle) | 264 | if (parent == rootbus_handle) |
@@ -259,22 +266,20 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) | |||
259 | child = parent; | 266 | child = parent; |
260 | } | 267 | } |
261 | if (!child) { | 268 | if (!child) { |
262 | printk(KERN_ERR "%s: Unable to find root bus for: ", | 269 | printk(KERN_ERR "%s: Unable to find root bus for: %s\n", |
263 | __func__); | 270 | __func__, (char *)name_buffer.pointer); |
264 | acpi_ns_print_node_pathname(device_handle, NULL); | ||
265 | printk("\n"); | ||
266 | BUG(); | 271 | BUG(); |
267 | } | 272 | } |
268 | 273 | ||
269 | status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr); | 274 | status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr); |
270 | if (ACPI_FAILURE(status)) { | 275 | if (ACPI_FAILURE(status)) { |
271 | printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: ", | 276 | printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: %s\n", |
272 | __func__, status); | 277 | __func__, status, (char *)name_buffer.pointer); |
273 | acpi_ns_print_node_pathname(child, NULL); | ||
274 | printk("\n"); | ||
275 | panic("%s: Unable to find host devfn\n", __func__); | 278 | panic("%s: Unable to find host devfn\n", __func__); |
276 | } | 279 | } |
277 | 280 | ||
281 | kfree(name_buffer.pointer); | ||
282 | |||
278 | slot = (adr >> 16) & 0xffff; | 283 | slot = (adr >> 16) & 0xffff; |
279 | function = adr & 0xffff; | 284 | function = adr & 0xffff; |
280 | devfn = PCI_DEVFN(slot, function); | 285 | devfn = PCI_DEVFN(slot, function); |
@@ -300,27 +305,28 @@ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
300 | int function; | 305 | int function; |
301 | int slot; | 306 | int slot; |
302 | struct sn_pcidev_match *info = context; | 307 | struct sn_pcidev_match *info = context; |
308 | struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
303 | 309 | ||
304 | status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, | 310 | status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, |
305 | &adr); | 311 | &adr); |
306 | if (ACPI_SUCCESS(status)) { | 312 | if (ACPI_SUCCESS(status)) { |
307 | status = acpi_get_parent(handle, &parent); | 313 | status = acpi_get_parent(handle, &parent); |
308 | if (ACPI_FAILURE(status)) { | 314 | if (ACPI_FAILURE(status)) { |
315 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
309 | printk(KERN_ERR | 316 | printk(KERN_ERR |
310 | "%s: acpi_get_parent() failed (0x%x) for: ", | 317 | "%s: acpi_get_parent() failed (0x%x) for: %s\n", |
311 | __func__, status); | 318 | __func__, status, (char *)name_buffer.pointer); |
312 | acpi_ns_print_node_pathname(handle, NULL); | 319 | kfree(name_buffer.pointer); |
313 | printk("\n"); | ||
314 | return AE_OK; | 320 | return AE_OK; |
315 | } | 321 | } |
316 | status = acpi_evaluate_integer(parent, METHOD_NAME__BBN, | 322 | status = acpi_evaluate_integer(parent, METHOD_NAME__BBN, |
317 | NULL, &bbn); | 323 | NULL, &bbn); |
318 | if (ACPI_FAILURE(status)) { | 324 | if (ACPI_FAILURE(status)) { |
325 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer); | ||
319 | printk(KERN_ERR | 326 | printk(KERN_ERR |
320 | "%s: Failed to find _BBN in parent of: ", | 327 | "%s: Failed to find _BBN in parent of: %s\n", |
321 | __func__); | 328 | __func__, (char *)name_buffer.pointer); |
322 | acpi_ns_print_node_pathname(handle, NULL); | 329 | kfree(name_buffer.pointer); |
323 | printk("\n"); | ||
324 | return AE_OK; | 330 | return AE_OK; |
325 | } | 331 | } |
326 | 332 | ||
@@ -350,24 +356,27 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info, | |||
350 | acpi_handle rootbus_handle; | 356 | acpi_handle rootbus_handle; |
351 | unsigned long long segment; | 357 | unsigned long long segment; |
352 | acpi_status status; | 358 | acpi_status status; |
359 | struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
353 | 360 | ||
354 | rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle; | 361 | rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle; |
355 | status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL, | 362 | status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL, |
356 | &segment); | 363 | &segment); |
357 | if (ACPI_SUCCESS(status)) { | 364 | if (ACPI_SUCCESS(status)) { |
358 | if (segment != pci_domain_nr(dev)) { | 365 | if (segment != pci_domain_nr(dev)) { |
366 | acpi_get_name(rootbus_handle, ACPI_FULL_PATHNAME, | ||
367 | &name_buffer); | ||
359 | printk(KERN_ERR | 368 | printk(KERN_ERR |
360 | "%s: Segment number mismatch, 0x%llx vs 0x%x for: ", | 369 | "%s: Segment number mismatch, 0x%llx vs 0x%x for: %s\n", |
361 | __func__, segment, pci_domain_nr(dev)); | 370 | __func__, segment, pci_domain_nr(dev), |
362 | acpi_ns_print_node_pathname(rootbus_handle, NULL); | 371 | (char *)name_buffer.pointer); |
363 | printk("\n"); | 372 | kfree(name_buffer.pointer); |
364 | return 1; | 373 | return 1; |
365 | } | 374 | } |
366 | } else { | 375 | } else { |
367 | printk(KERN_ERR "%s: Unable to get __SEG from: ", | 376 | acpi_get_name(rootbus_handle, ACPI_FULL_PATHNAME, &name_buffer); |
368 | __func__); | 377 | printk(KERN_ERR "%s: Unable to get __SEG from: %s\n", |
369 | acpi_ns_print_node_pathname(rootbus_handle, NULL); | 378 | __func__, (char *)name_buffer.pointer); |
370 | printk("\n"); | 379 | kfree(name_buffer.pointer); |
371 | return 1; | 380 | return 1; |
372 | } | 381 | } |
373 | 382 | ||
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index 8a924a5661dd..0d4ffa4da1da 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/acpi.h> | 26 | #include <linux/acpi.h> |
27 | #include <asm/sn/sn2/sn_hwperf.h> | 27 | #include <asm/sn/sn2/sn_hwperf.h> |
28 | #include <asm/sn/acpi.h> | 28 | #include <asm/sn/acpi.h> |
29 | #include "acpi/acglobal.h" | ||
30 | 29 | ||
31 | extern void sn_init_cpei_timer(void); | 30 | extern void sn_init_cpei_timer(void); |
32 | extern void register_sn_procfs(void); | 31 | extern void register_sn_procfs(void); |
@@ -473,7 +472,7 @@ sn_io_early_init(void) | |||
473 | { | 472 | { |
474 | struct acpi_table_header *header = NULL; | 473 | struct acpi_table_header *header = NULL; |
475 | 474 | ||
476 | acpi_get_table_by_index(ACPI_TABLE_INDEX_DSDT, &header); | 475 | acpi_get_table(ACPI_SIG_DSDT, 1, &header); |
477 | BUG_ON(header == NULL); | 476 | BUG_ON(header == NULL); |
478 | sn_acpi_rev = header->oem_revision; | 477 | sn_acpi_rev = header->oem_revision; |
479 | } | 478 | } |
@@ -505,7 +504,7 @@ sn_io_early_init(void) | |||
505 | 504 | ||
506 | { | 505 | { |
507 | struct acpi_table_header *header; | 506 | struct acpi_table_header *header; |
508 | (void)acpi_get_table_by_index(ACPI_TABLE_INDEX_DSDT, &header); | 507 | (void)acpi_get_table(ACPI_SIG_DSDT, 1, &header); |
509 | printk(KERN_INFO "ACPI DSDT OEM Rev 0x%x\n", | 508 | printk(KERN_INFO "ACPI DSDT OEM Rev 0x%x\n", |
510 | header->oem_revision); | 509 | header->oem_revision); |
511 | } | 510 | } |
diff --git a/arch/m68knommu/include/asm/mmu.h b/arch/m68knommu/include/asm/mmu.h index 5fa6b68353ba..e2da1e6f09fe 100644 --- a/arch/m68knommu/include/asm/mmu.h +++ b/arch/m68knommu/include/asm/mmu.h | |||
@@ -4,7 +4,6 @@ | |||
4 | /* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */ | 4 | /* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */ |
5 | 5 | ||
6 | typedef struct { | 6 | typedef struct { |
7 | struct vm_list_struct *vmlist; | ||
8 | unsigned long end_brk; | 7 | unsigned long end_brk; |
9 | } mm_context_t; | 8 | } mm_context_t; |
10 | 9 | ||
diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c index f97ab1461012..dda6f2058665 100644 --- a/arch/mips/pci/pci-ip27.c +++ b/arch/mips/pci/pci-ip27.c | |||
@@ -146,12 +146,6 @@ int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | |||
146 | return 0; | 146 | return 0; |
147 | } | 147 | } |
148 | 148 | ||
149 | /* Most MIPS systems have straight-forward swizzling needs. */ | ||
150 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
151 | { | ||
152 | return (((pin - 1) + slot) % 4) + 1; | ||
153 | } | ||
154 | |||
155 | static inline struct pci_dev *bridge_root_dev(struct pci_dev *dev) | 149 | static inline struct pci_dev *bridge_root_dev(struct pci_dev *dev) |
156 | { | 150 | { |
157 | while (dev->bus->parent) { | 151 | while (dev->bus->parent) { |
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 62cae740e250..b0eb9e75c682 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c | |||
@@ -149,28 +149,6 @@ out: | |||
149 | "Skipping PCI bus scan due to resource conflict\n"); | 149 | "Skipping PCI bus scan due to resource conflict\n"); |
150 | } | 150 | } |
151 | 151 | ||
152 | /* Most MIPS systems have straight-forward swizzling needs. */ | ||
153 | |||
154 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
155 | { | ||
156 | return (((pin - 1) + slot) % 4) + 1; | ||
157 | } | ||
158 | |||
159 | static u8 __init common_swizzle(struct pci_dev *dev, u8 *pinp) | ||
160 | { | ||
161 | u8 pin = *pinp; | ||
162 | |||
163 | while (dev->bus->parent) { | ||
164 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | ||
165 | /* Move up the chain of bridges. */ | ||
166 | dev = dev->bus->self; | ||
167 | } | ||
168 | *pinp = pin; | ||
169 | |||
170 | /* The slot is the slot of the last bridge. */ | ||
171 | return PCI_SLOT(dev->devfn); | ||
172 | } | ||
173 | |||
174 | static int __init pcibios_init(void) | 152 | static int __init pcibios_init(void) |
175 | { | 153 | { |
176 | struct pci_controller *hose; | 154 | struct pci_controller *hose; |
@@ -179,7 +157,7 @@ static int __init pcibios_init(void) | |||
179 | for (hose = hose_head; hose; hose = hose->next) | 157 | for (hose = hose_head; hose; hose = hose->next) |
180 | pcibios_scanbus(hose); | 158 | pcibios_scanbus(hose); |
181 | 159 | ||
182 | pci_fixup_irqs(common_swizzle, pcibios_map_irq); | 160 | pci_fixup_irqs(pci_common_swizzle, pcibios_map_irq); |
183 | 161 | ||
184 | pci_initialized = 1; | 162 | pci_initialized = 1; |
185 | 163 | ||
diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index 5ddad7bd60ac..0d428278356d 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile | |||
@@ -77,7 +77,7 @@ libs-y += arch/parisc/lib/ `$(CC) -print-libgcc-file-name` | |||
77 | 77 | ||
78 | drivers-$(CONFIG_OPROFILE) += arch/parisc/oprofile/ | 78 | drivers-$(CONFIG_OPROFILE) += arch/parisc/oprofile/ |
79 | 79 | ||
80 | PALO := $(shell if which palo; then : ; \ | 80 | PALO := $(shell if (which palo 2>&1); then : ; \ |
81 | elif [ -x /sbin/palo ]; then echo /sbin/palo; \ | 81 | elif [ -x /sbin/palo ]; then echo /sbin/palo; \ |
82 | fi) | 82 | fi) |
83 | 83 | ||
diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild index f88b252e419c..2121d99f8364 100644 --- a/arch/parisc/include/asm/Kbuild +++ b/arch/parisc/include/asm/Kbuild | |||
@@ -1,3 +1,4 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | unifdef-y += pdc.h | 3 | unifdef-y += pdc.h |
4 | unifdef-y += swab.h | ||
diff --git a/arch/parisc/include/asm/byteorder.h b/arch/parisc/include/asm/byteorder.h index db148313de5d..da66029c4cb2 100644 --- a/arch/parisc/include/asm/byteorder.h +++ b/arch/parisc/include/asm/byteorder.h | |||
@@ -1,82 +1,7 @@ | |||
1 | #ifndef _PARISC_BYTEORDER_H | 1 | #ifndef _PARISC_BYTEORDER_H |
2 | #define _PARISC_BYTEORDER_H | 2 | #define _PARISC_BYTEORDER_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm/swab.h> |
5 | #include <linux/compiler.h> | ||
6 | |||
7 | #ifdef __GNUC__ | ||
8 | |||
9 | static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x) | ||
10 | { | ||
11 | __asm__("dep %0, 15, 8, %0\n\t" /* deposit 00ab -> 0bab */ | ||
12 | "shd %%r0, %0, 8, %0" /* shift 000000ab -> 00ba */ | ||
13 | : "=r" (x) | ||
14 | : "0" (x)); | ||
15 | return x; | ||
16 | } | ||
17 | |||
18 | static __inline__ __attribute_const__ __u32 ___arch__swab24(__u32 x) | ||
19 | { | ||
20 | __asm__("shd %0, %0, 8, %0\n\t" /* shift xabcxabc -> cxab */ | ||
21 | "dep %0, 15, 8, %0\n\t" /* deposit cxab -> cbab */ | ||
22 | "shd %%r0, %0, 8, %0" /* shift 0000cbab -> 0cba */ | ||
23 | : "=r" (x) | ||
24 | : "0" (x)); | ||
25 | return x; | ||
26 | } | ||
27 | |||
28 | static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x) | ||
29 | { | ||
30 | unsigned int temp; | ||
31 | __asm__("shd %0, %0, 16, %1\n\t" /* shift abcdabcd -> cdab */ | ||
32 | "dep %1, 15, 8, %1\n\t" /* deposit cdab -> cbab */ | ||
33 | "shd %0, %1, 8, %0" /* shift abcdcbab -> dcba */ | ||
34 | : "=r" (x), "=&r" (temp) | ||
35 | : "0" (x)); | ||
36 | return x; | ||
37 | } | ||
38 | |||
39 | |||
40 | #if BITS_PER_LONG > 32 | ||
41 | /* | ||
42 | ** From "PA-RISC 2.0 Architecture", HP Professional Books. | ||
43 | ** See Appendix I page 8 , "Endian Byte Swapping". | ||
44 | ** | ||
45 | ** Pretty cool algorithm: (* == zero'd bits) | ||
46 | ** PERMH 01234567 -> 67452301 into %0 | ||
47 | ** HSHL 67452301 -> 7*5*3*1* into %1 | ||
48 | ** HSHR 67452301 -> *6*4*2*0 into %0 | ||
49 | ** OR %0 | %1 -> 76543210 into %0 (all done!) | ||
50 | */ | ||
51 | static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) { | ||
52 | __u64 temp; | ||
53 | __asm__("permh,3210 %0, %0\n\t" | ||
54 | "hshl %0, 8, %1\n\t" | ||
55 | "hshr,u %0, 8, %0\n\t" | ||
56 | "or %1, %0, %0" | ||
57 | : "=r" (x), "=&r" (temp) | ||
58 | : "0" (x)); | ||
59 | return x; | ||
60 | } | ||
61 | #define __arch__swab64(x) ___arch__swab64(x) | ||
62 | #define __BYTEORDER_HAS_U64__ | ||
63 | #elif !defined(__STRICT_ANSI__) | ||
64 | static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) | ||
65 | { | ||
66 | __u32 t1 = ___arch__swab32((__u32) x); | ||
67 | __u32 t2 = ___arch__swab32((__u32) (x >> 32)); | ||
68 | return (((__u64) t1 << 32) | t2); | ||
69 | } | ||
70 | #define __arch__swab64(x) ___arch__swab64(x) | ||
71 | #define __BYTEORDER_HAS_U64__ | ||
72 | #endif | ||
73 | |||
74 | #define __arch__swab16(x) ___arch__swab16(x) | ||
75 | #define __arch__swab24(x) ___arch__swab24(x) | ||
76 | #define __arch__swab32(x) ___arch__swab32(x) | ||
77 | |||
78 | #endif /* __GNUC__ */ | ||
79 | |||
80 | #include <linux/byteorder/big_endian.h> | 5 | #include <linux/byteorder/big_endian.h> |
81 | 6 | ||
82 | #endif /* _PARISC_BYTEORDER_H */ | 7 | #endif /* _PARISC_BYTEORDER_H */ |
diff --git a/arch/parisc/include/asm/checksum.h b/arch/parisc/include/asm/checksum.h index e9639ccc3fce..c84b2fcb18a9 100644 --- a/arch/parisc/include/asm/checksum.h +++ b/arch/parisc/include/asm/checksum.h | |||
@@ -182,7 +182,7 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, | |||
182 | #endif | 182 | #endif |
183 | : "=r" (sum), "=r" (saddr), "=r" (daddr), "=r" (len) | 183 | : "=r" (sum), "=r" (saddr), "=r" (daddr), "=r" (len) |
184 | : "0" (sum), "1" (saddr), "2" (daddr), "3" (len), "r" (proto) | 184 | : "0" (sum), "1" (saddr), "2" (daddr), "3" (len), "r" (proto) |
185 | : "r19", "r20", "r21", "r22"); | 185 | : "r19", "r20", "r21", "r22", "memory"); |
186 | return csum_fold(sum); | 186 | return csum_fold(sum); |
187 | } | 187 | } |
188 | 188 | ||
diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h index 55ddb1842107..d3031d1f9d03 100644 --- a/arch/parisc/include/asm/io.h +++ b/arch/parisc/include/asm/io.h | |||
@@ -4,12 +4,6 @@ | |||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <asm/pgtable.h> | 5 | #include <asm/pgtable.h> |
6 | 6 | ||
7 | extern unsigned long parisc_vmerge_boundary; | ||
8 | extern unsigned long parisc_vmerge_max_size; | ||
9 | |||
10 | #define BIO_VMERGE_BOUNDARY parisc_vmerge_boundary | ||
11 | #define BIO_VMERGE_MAX_SIZE parisc_vmerge_max_size | ||
12 | |||
13 | #define virt_to_phys(a) ((unsigned long)__pa(a)) | 7 | #define virt_to_phys(a) ((unsigned long)__pa(a)) |
14 | #define phys_to_virt(a) __va(a) | 8 | #define phys_to_virt(a) __va(a) |
15 | #define virt_to_bus virt_to_phys | 9 | #define virt_to_bus virt_to_phys |
@@ -182,9 +176,9 @@ static inline void __raw_writeq(unsigned long long b, volatile void __iomem *add | |||
182 | 176 | ||
183 | /* readb can never be const, so use __fswab instead of le*_to_cpu */ | 177 | /* readb can never be const, so use __fswab instead of le*_to_cpu */ |
184 | #define readb(addr) __raw_readb(addr) | 178 | #define readb(addr) __raw_readb(addr) |
185 | #define readw(addr) __fswab16(__raw_readw(addr)) | 179 | #define readw(addr) le16_to_cpu(__raw_readw(addr)) |
186 | #define readl(addr) __fswab32(__raw_readl(addr)) | 180 | #define readl(addr) le32_to_cpu(__raw_readl(addr)) |
187 | #define readq(addr) __fswab64(__raw_readq(addr)) | 181 | #define readq(addr) le64_to_cpu(__raw_readq(addr)) |
188 | #define writeb(b, addr) __raw_writeb(b, addr) | 182 | #define writeb(b, addr) __raw_writeb(b, addr) |
189 | #define writew(b, addr) __raw_writew(cpu_to_le16(b), addr) | 183 | #define writew(b, addr) __raw_writew(cpu_to_le16(b), addr) |
190 | #define writel(b, addr) __raw_writel(cpu_to_le32(b), addr) | 184 | #define writel(b, addr) __raw_writel(cpu_to_le32(b), addr) |
diff --git a/arch/parisc/include/asm/mmu_context.h b/arch/parisc/include/asm/mmu_context.h index 85856c74ad1d..354b2aca990e 100644 --- a/arch/parisc/include/asm/mmu_context.h +++ b/arch/parisc/include/asm/mmu_context.h | |||
@@ -34,16 +34,21 @@ destroy_context(struct mm_struct *mm) | |||
34 | mm->context = 0; | 34 | mm->context = 0; |
35 | } | 35 | } |
36 | 36 | ||
37 | static inline void load_context(mm_context_t context) | 37 | static inline unsigned long __space_to_prot(mm_context_t context) |
38 | { | 38 | { |
39 | mtsp(context, 3); | ||
40 | #if SPACEID_SHIFT == 0 | 39 | #if SPACEID_SHIFT == 0 |
41 | mtctl(context << 1,8); | 40 | return context << 1; |
42 | #else | 41 | #else |
43 | mtctl(context >> (SPACEID_SHIFT - 1),8); | 42 | return context >> (SPACEID_SHIFT - 1); |
44 | #endif | 43 | #endif |
45 | } | 44 | } |
46 | 45 | ||
46 | static inline void load_context(mm_context_t context) | ||
47 | { | ||
48 | mtsp(context, 3); | ||
49 | mtctl(__space_to_prot(context), 8); | ||
50 | } | ||
51 | |||
47 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) | 52 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) |
48 | { | 53 | { |
49 | 54 | ||
diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index 3c9d34844c83..9d64df8754ba 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
20 | #include <asm/percpu.h> | ||
20 | #endif /* __ASSEMBLY__ */ | 21 | #endif /* __ASSEMBLY__ */ |
21 | 22 | ||
22 | #define KERNEL_STACK_SIZE (4*PAGE_SIZE) | 23 | #define KERNEL_STACK_SIZE (4*PAGE_SIZE) |
@@ -109,8 +110,7 @@ struct cpuinfo_parisc { | |||
109 | }; | 110 | }; |
110 | 111 | ||
111 | extern struct system_cpuinfo_parisc boot_cpu_data; | 112 | extern struct system_cpuinfo_parisc boot_cpu_data; |
112 | extern struct cpuinfo_parisc cpu_data[NR_CPUS]; | 113 | DECLARE_PER_CPU(struct cpuinfo_parisc, cpu_data); |
113 | #define current_cpu_data cpu_data[smp_processor_id()] | ||
114 | 114 | ||
115 | #define CPU_HVERSION ((boot_cpu_data.hversion >> 4) & 0x0FFF) | 115 | #define CPU_HVERSION ((boot_cpu_data.hversion >> 4) & 0x0FFF) |
116 | 116 | ||
diff --git a/arch/parisc/include/asm/swab.h b/arch/parisc/include/asm/swab.h new file mode 100644 index 000000000000..3ff16c5a3358 --- /dev/null +++ b/arch/parisc/include/asm/swab.h | |||
@@ -0,0 +1,66 @@ | |||
1 | #ifndef _PARISC_SWAB_H | ||
2 | #define _PARISC_SWAB_H | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | #include <linux/compiler.h> | ||
6 | |||
7 | #define __SWAB_64_THRU_32__ | ||
8 | |||
9 | static inline __attribute_const__ __u16 __arch_swab16(__u16 x) | ||
10 | { | ||
11 | __asm__("dep %0, 15, 8, %0\n\t" /* deposit 00ab -> 0bab */ | ||
12 | "shd %%r0, %0, 8, %0" /* shift 000000ab -> 00ba */ | ||
13 | : "=r" (x) | ||
14 | : "0" (x)); | ||
15 | return x; | ||
16 | } | ||
17 | #define __arch_swab16 __arch_swab16 | ||
18 | |||
19 | static inline __attribute_const__ __u32 __arch_swab24(__u32 x) | ||
20 | { | ||
21 | __asm__("shd %0, %0, 8, %0\n\t" /* shift xabcxabc -> cxab */ | ||
22 | "dep %0, 15, 8, %0\n\t" /* deposit cxab -> cbab */ | ||
23 | "shd %%r0, %0, 8, %0" /* shift 0000cbab -> 0cba */ | ||
24 | : "=r" (x) | ||
25 | : "0" (x)); | ||
26 | return x; | ||
27 | } | ||
28 | |||
29 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | ||
30 | { | ||
31 | unsigned int temp; | ||
32 | __asm__("shd %0, %0, 16, %1\n\t" /* shift abcdabcd -> cdab */ | ||
33 | "dep %1, 15, 8, %1\n\t" /* deposit cdab -> cbab */ | ||
34 | "shd %0, %1, 8, %0" /* shift abcdcbab -> dcba */ | ||
35 | : "=r" (x), "=&r" (temp) | ||
36 | : "0" (x)); | ||
37 | return x; | ||
38 | } | ||
39 | #define __arch_swab32 __arch_swab32 | ||
40 | |||
41 | #if BITS_PER_LONG > 32 | ||
42 | /* | ||
43 | ** From "PA-RISC 2.0 Architecture", HP Professional Books. | ||
44 | ** See Appendix I page 8 , "Endian Byte Swapping". | ||
45 | ** | ||
46 | ** Pretty cool algorithm: (* == zero'd bits) | ||
47 | ** PERMH 01234567 -> 67452301 into %0 | ||
48 | ** HSHL 67452301 -> 7*5*3*1* into %1 | ||
49 | ** HSHR 67452301 -> *6*4*2*0 into %0 | ||
50 | ** OR %0 | %1 -> 76543210 into %0 (all done!) | ||
51 | */ | ||
52 | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) | ||
53 | { | ||
54 | __u64 temp; | ||
55 | __asm__("permh,3210 %0, %0\n\t" | ||
56 | "hshl %0, 8, %1\n\t" | ||
57 | "hshr,u %0, 8, %0\n\t" | ||
58 | "or %1, %0, %0" | ||
59 | : "=r" (x), "=&r" (temp) | ||
60 | : "0" (x)); | ||
61 | return x; | ||
62 | } | ||
63 | #define __arch_swab64 __arch_swab64 | ||
64 | #endif /* BITS_PER_LONG > 32 */ | ||
65 | |||
66 | #endif /* _PARISC_SWAB_H */ | ||
diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h index 4878b9501f24..1c6dbb6f6e56 100644 --- a/arch/parisc/include/asm/uaccess.h +++ b/arch/parisc/include/asm/uaccess.h | |||
@@ -241,4 +241,6 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo | |||
241 | #define __copy_to_user_inatomic __copy_to_user | 241 | #define __copy_to_user_inatomic __copy_to_user |
242 | #define __copy_from_user_inatomic __copy_from_user | 242 | #define __copy_from_user_inatomic __copy_from_user |
243 | 243 | ||
244 | int fixup_exception(struct pt_regs *regs); | ||
245 | |||
244 | #endif /* __PARISC_UACCESS_H */ | 246 | #endif /* __PARISC_UACCESS_H */ |
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index 884b7ce16a3b..994bcd980909 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c | |||
@@ -549,6 +549,38 @@ static int parisc_generic_match(struct device *dev, struct device_driver *drv) | |||
549 | return match_device(to_parisc_driver(drv), to_parisc_device(dev)); | 549 | return match_device(to_parisc_driver(drv), to_parisc_device(dev)); |
550 | } | 550 | } |
551 | 551 | ||
552 | static ssize_t make_modalias(struct device *dev, char *buf) | ||
553 | { | ||
554 | const struct parisc_device *padev = to_parisc_device(dev); | ||
555 | const struct parisc_device_id *id = &padev->id; | ||
556 | |||
557 | return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n", | ||
558 | (u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev, | ||
559 | (u32)id->sversion); | ||
560 | } | ||
561 | |||
562 | static int parisc_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
563 | { | ||
564 | const struct parisc_device *padev; | ||
565 | char modalias[40]; | ||
566 | |||
567 | if (!dev) | ||
568 | return -ENODEV; | ||
569 | |||
570 | padev = to_parisc_device(dev); | ||
571 | if (!padev) | ||
572 | return -ENODEV; | ||
573 | |||
574 | if (add_uevent_var(env, "PARISC_NAME=%s", padev->name)) | ||
575 | return -ENOMEM; | ||
576 | |||
577 | make_modalias(dev, modalias); | ||
578 | if (add_uevent_var(env, "MODALIAS=%s", modalias)) | ||
579 | return -ENOMEM; | ||
580 | |||
581 | return 0; | ||
582 | } | ||
583 | |||
552 | #define pa_dev_attr(name, field, format_string) \ | 584 | #define pa_dev_attr(name, field, format_string) \ |
553 | static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ | 585 | static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ |
554 | { \ | 586 | { \ |
@@ -566,12 +598,7 @@ pa_dev_attr_id(sversion, "0x%05x\n"); | |||
566 | 598 | ||
567 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) | 599 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) |
568 | { | 600 | { |
569 | struct parisc_device *padev = to_parisc_device(dev); | 601 | return make_modalias(dev, buf); |
570 | struct parisc_device_id *id = &padev->id; | ||
571 | |||
572 | return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n", | ||
573 | (u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev, | ||
574 | (u32)id->sversion); | ||
575 | } | 602 | } |
576 | 603 | ||
577 | static struct device_attribute parisc_device_attrs[] = { | 604 | static struct device_attribute parisc_device_attrs[] = { |
@@ -587,6 +614,7 @@ static struct device_attribute parisc_device_attrs[] = { | |||
587 | struct bus_type parisc_bus_type = { | 614 | struct bus_type parisc_bus_type = { |
588 | .name = "parisc", | 615 | .name = "parisc", |
589 | .match = parisc_generic_match, | 616 | .match = parisc_generic_match, |
617 | .uevent = parisc_uevent, | ||
590 | .dev_attrs = parisc_device_attrs, | 618 | .dev_attrs = parisc_device_attrs, |
591 | .probe = parisc_driver_probe, | 619 | .probe = parisc_driver_probe, |
592 | .remove = parisc_driver_remove, | 620 | .remove = parisc_driver_remove, |
diff --git a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S index 2cbf13b3ef11..5595a2f31181 100644 --- a/arch/parisc/kernel/hpmc.S +++ b/arch/parisc/kernel/hpmc.S | |||
@@ -80,6 +80,7 @@ END(hpmc_pim_data) | |||
80 | 80 | ||
81 | .import intr_save, code | 81 | .import intr_save, code |
82 | ENTRY(os_hpmc) | 82 | ENTRY(os_hpmc) |
83 | .os_hpmc: | ||
83 | 84 | ||
84 | /* | 85 | /* |
85 | * registers modified: | 86 | * registers modified: |
@@ -295,5 +296,10 @@ os_hpmc_6: | |||
295 | b . | 296 | b . |
296 | nop | 297 | nop |
297 | ENDPROC(os_hpmc) | 298 | ENDPROC(os_hpmc) |
298 | ENTRY(os_hpmc_end) /* this label used to compute os_hpmc checksum */ | 299 | .os_hpmc_end: |
299 | nop | 300 | nop |
301 | .data | ||
302 | .align 4 | ||
303 | .export os_hpmc_size | ||
304 | os_hpmc_size: | ||
305 | .word .os_hpmc_end-.os_hpmc | ||
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 4cea935e2f99..ac2c822928c7 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -298,7 +298,7 @@ unsigned long txn_affinity_addr(unsigned int irq, int cpu) | |||
298 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 298 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); |
299 | #endif | 299 | #endif |
300 | 300 | ||
301 | return cpu_data[cpu].txn_addr; | 301 | return per_cpu(cpu_data, cpu).txn_addr; |
302 | } | 302 | } |
303 | 303 | ||
304 | 304 | ||
@@ -309,8 +309,9 @@ unsigned long txn_alloc_addr(unsigned int virt_irq) | |||
309 | next_cpu++; /* assign to "next" CPU we want this bugger on */ | 309 | next_cpu++; /* assign to "next" CPU we want this bugger on */ |
310 | 310 | ||
311 | /* validate entry */ | 311 | /* validate entry */ |
312 | while ((next_cpu < NR_CPUS) && (!cpu_data[next_cpu].txn_addr || | 312 | while ((next_cpu < NR_CPUS) && |
313 | !cpu_online(next_cpu))) | 313 | (!per_cpu(cpu_data, next_cpu).txn_addr || |
314 | !cpu_online(next_cpu))) | ||
314 | next_cpu++; | 315 | next_cpu++; |
315 | 316 | ||
316 | if (next_cpu >= NR_CPUS) | 317 | if (next_cpu >= NR_CPUS) |
@@ -359,7 +360,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
359 | printk(KERN_DEBUG "redirecting irq %d from CPU %d to %d\n", | 360 | printk(KERN_DEBUG "redirecting irq %d from CPU %d to %d\n", |
360 | irq, smp_processor_id(), cpu); | 361 | irq, smp_processor_id(), cpu); |
361 | gsc_writel(irq + CPU_IRQ_BASE, | 362 | gsc_writel(irq + CPU_IRQ_BASE, |
362 | cpu_data[cpu].hpa); | 363 | per_cpu(cpu_data, cpu).hpa); |
363 | goto set_out; | 364 | goto set_out; |
364 | } | 365 | } |
365 | #endif | 366 | #endif |
@@ -421,5 +422,5 @@ void __init init_IRQ(void) | |||
421 | 422 | ||
422 | void ack_bad_irq(unsigned int irq) | 423 | void ack_bad_irq(unsigned int irq) |
423 | { | 424 | { |
424 | printk("unexpected IRQ %d\n", irq); | 425 | printk(KERN_WARNING "unexpected IRQ %d\n", irq); |
425 | } | 426 | } |
diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c index ccb68090781e..1ff366cb9685 100644 --- a/arch/parisc/kernel/pdc_cons.c +++ b/arch/parisc/kernel/pdc_cons.c | |||
@@ -52,7 +52,7 @@ | |||
52 | #include <linux/tty.h> | 52 | #include <linux/tty.h> |
53 | #include <asm/pdc.h> /* for iodc_call() proto and friends */ | 53 | #include <asm/pdc.h> /* for iodc_call() proto and friends */ |
54 | 54 | ||
55 | static spinlock_t pdc_console_lock = SPIN_LOCK_UNLOCKED; | 55 | static DEFINE_SPINLOCK(pdc_console_lock); |
56 | 56 | ||
57 | static void pdc_console_write(struct console *co, const char *s, unsigned count) | 57 | static void pdc_console_write(struct console *co, const char *s, unsigned count) |
58 | { | 58 | { |
diff --git a/arch/parisc/kernel/perf.c b/arch/parisc/kernel/perf.c index f696f57faa15..75099efb3bf3 100644 --- a/arch/parisc/kernel/perf.c +++ b/arch/parisc/kernel/perf.c | |||
@@ -541,9 +541,9 @@ static int __init perf_init(void) | |||
541 | spin_lock_init(&perf_lock); | 541 | spin_lock_init(&perf_lock); |
542 | 542 | ||
543 | /* TODO: this only lets us access the first cpu.. what to do for SMP? */ | 543 | /* TODO: this only lets us access the first cpu.. what to do for SMP? */ |
544 | cpu_device = cpu_data[0].dev; | 544 | cpu_device = per_cpu(cpu_data, 0).dev; |
545 | printk("Performance monitoring counters enabled for %s\n", | 545 | printk("Performance monitoring counters enabled for %s\n", |
546 | cpu_data[0].dev->name); | 546 | per_cpu(cpu_data, 0).dev->name); |
547 | 547 | ||
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index 370086fb8333..ecb609342feb 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * Initial setup-routines for HP 9000 based hardware. | 3 | * Initial setup-routines for HP 9000 based hardware. |
4 | * | 4 | * |
5 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | 5 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds |
6 | * Modifications for PA-RISC (C) 1999 Helge Deller <deller@gmx.de> | 6 | * Modifications for PA-RISC (C) 1999-2008 Helge Deller <deller@gmx.de> |
7 | * Modifications copyright 1999 SuSE GmbH (Philipp Rumpf) | 7 | * Modifications copyright 1999 SuSE GmbH (Philipp Rumpf) |
8 | * Modifications copyright 2000 Martin K. Petersen <mkp@mkp.net> | 8 | * Modifications copyright 2000 Martin K. Petersen <mkp@mkp.net> |
9 | * Modifications copyright 2000 Philipp Rumpf <prumpf@tux.org> | 9 | * Modifications copyright 2000 Philipp Rumpf <prumpf@tux.org> |
@@ -46,7 +46,7 @@ | |||
46 | struct system_cpuinfo_parisc boot_cpu_data __read_mostly; | 46 | struct system_cpuinfo_parisc boot_cpu_data __read_mostly; |
47 | EXPORT_SYMBOL(boot_cpu_data); | 47 | EXPORT_SYMBOL(boot_cpu_data); |
48 | 48 | ||
49 | struct cpuinfo_parisc cpu_data[NR_CPUS] __read_mostly; | 49 | DEFINE_PER_CPU(struct cpuinfo_parisc, cpu_data); |
50 | 50 | ||
51 | extern int update_cr16_clocksource(void); /* from time.c */ | 51 | extern int update_cr16_clocksource(void); /* from time.c */ |
52 | 52 | ||
@@ -69,6 +69,23 @@ extern int update_cr16_clocksource(void); /* from time.c */ | |||
69 | */ | 69 | */ |
70 | 70 | ||
71 | /** | 71 | /** |
72 | * init_cpu_profiler - enable/setup per cpu profiling hooks. | ||
73 | * @cpunum: The processor instance. | ||
74 | * | ||
75 | * FIXME: doesn't do much yet... | ||
76 | */ | ||
77 | static void __cpuinit | ||
78 | init_percpu_prof(unsigned long cpunum) | ||
79 | { | ||
80 | struct cpuinfo_parisc *p; | ||
81 | |||
82 | p = &per_cpu(cpu_data, cpunum); | ||
83 | p->prof_counter = 1; | ||
84 | p->prof_multiplier = 1; | ||
85 | } | ||
86 | |||
87 | |||
88 | /** | ||
72 | * processor_probe - Determine if processor driver should claim this device. | 89 | * processor_probe - Determine if processor driver should claim this device. |
73 | * @dev: The device which has been found. | 90 | * @dev: The device which has been found. |
74 | * | 91 | * |
@@ -147,7 +164,7 @@ static int __cpuinit processor_probe(struct parisc_device *dev) | |||
147 | } | 164 | } |
148 | #endif | 165 | #endif |
149 | 166 | ||
150 | p = &cpu_data[cpuid]; | 167 | p = &per_cpu(cpu_data, cpuid); |
151 | boot_cpu_data.cpu_count++; | 168 | boot_cpu_data.cpu_count++; |
152 | 169 | ||
153 | /* initialize counters - CPU 0 gets it_value set in time_init() */ | 170 | /* initialize counters - CPU 0 gets it_value set in time_init() */ |
@@ -162,12 +179,9 @@ static int __cpuinit processor_probe(struct parisc_device *dev) | |||
162 | #ifdef CONFIG_SMP | 179 | #ifdef CONFIG_SMP |
163 | /* | 180 | /* |
164 | ** FIXME: review if any other initialization is clobbered | 181 | ** FIXME: review if any other initialization is clobbered |
165 | ** for boot_cpu by the above memset(). | 182 | ** for boot_cpu by the above memset(). |
166 | */ | 183 | */ |
167 | 184 | init_percpu_prof(cpuid); | |
168 | /* stolen from init_percpu_prof() */ | ||
169 | cpu_data[cpuid].prof_counter = 1; | ||
170 | cpu_data[cpuid].prof_multiplier = 1; | ||
171 | #endif | 185 | #endif |
172 | 186 | ||
173 | /* | 187 | /* |
@@ -261,19 +275,6 @@ void __init collect_boot_cpu_data(void) | |||
261 | } | 275 | } |
262 | 276 | ||
263 | 277 | ||
264 | /** | ||
265 | * init_cpu_profiler - enable/setup per cpu profiling hooks. | ||
266 | * @cpunum: The processor instance. | ||
267 | * | ||
268 | * FIXME: doesn't do much yet... | ||
269 | */ | ||
270 | static inline void __init | ||
271 | init_percpu_prof(int cpunum) | ||
272 | { | ||
273 | cpu_data[cpunum].prof_counter = 1; | ||
274 | cpu_data[cpunum].prof_multiplier = 1; | ||
275 | } | ||
276 | |||
277 | 278 | ||
278 | /** | 279 | /** |
279 | * init_per_cpu - Handle individual processor initializations. | 280 | * init_per_cpu - Handle individual processor initializations. |
@@ -293,7 +294,7 @@ init_percpu_prof(int cpunum) | |||
293 | * | 294 | * |
294 | * o Enable CPU profiling hooks. | 295 | * o Enable CPU profiling hooks. |
295 | */ | 296 | */ |
296 | int __init init_per_cpu(int cpunum) | 297 | int __cpuinit init_per_cpu(int cpunum) |
297 | { | 298 | { |
298 | int ret; | 299 | int ret; |
299 | struct pdc_coproc_cfg coproc_cfg; | 300 | struct pdc_coproc_cfg coproc_cfg; |
@@ -307,8 +308,8 @@ int __init init_per_cpu(int cpunum) | |||
307 | /* FWIW, FP rev/model is a more accurate way to determine | 308 | /* FWIW, FP rev/model is a more accurate way to determine |
308 | ** CPU type. CPU rev/model has some ambiguous cases. | 309 | ** CPU type. CPU rev/model has some ambiguous cases. |
309 | */ | 310 | */ |
310 | cpu_data[cpunum].fp_rev = coproc_cfg.revision; | 311 | per_cpu(cpu_data, cpunum).fp_rev = coproc_cfg.revision; |
311 | cpu_data[cpunum].fp_model = coproc_cfg.model; | 312 | per_cpu(cpu_data, cpunum).fp_model = coproc_cfg.model; |
312 | 313 | ||
313 | printk(KERN_INFO "FP[%d] enabled: Rev %ld Model %ld\n", | 314 | printk(KERN_INFO "FP[%d] enabled: Rev %ld Model %ld\n", |
314 | cpunum, coproc_cfg.revision, coproc_cfg.model); | 315 | cpunum, coproc_cfg.revision, coproc_cfg.model); |
@@ -344,16 +345,17 @@ int __init init_per_cpu(int cpunum) | |||
344 | int | 345 | int |
345 | show_cpuinfo (struct seq_file *m, void *v) | 346 | show_cpuinfo (struct seq_file *m, void *v) |
346 | { | 347 | { |
347 | int n; | 348 | unsigned long cpu; |
348 | 349 | ||
349 | for(n=0; n<boot_cpu_data.cpu_count; n++) { | 350 | for_each_online_cpu(cpu) { |
351 | const struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); | ||
350 | #ifdef CONFIG_SMP | 352 | #ifdef CONFIG_SMP |
351 | if (0 == cpu_data[n].hpa) | 353 | if (0 == cpuinfo->hpa) |
352 | continue; | 354 | continue; |
353 | #endif | 355 | #endif |
354 | seq_printf(m, "processor\t: %d\n" | 356 | seq_printf(m, "processor\t: %lu\n" |
355 | "cpu family\t: PA-RISC %s\n", | 357 | "cpu family\t: PA-RISC %s\n", |
356 | n, boot_cpu_data.family_name); | 358 | cpu, boot_cpu_data.family_name); |
357 | 359 | ||
358 | seq_printf(m, "cpu\t\t: %s\n", boot_cpu_data.cpu_name ); | 360 | seq_printf(m, "cpu\t\t: %s\n", boot_cpu_data.cpu_name ); |
359 | 361 | ||
@@ -365,8 +367,8 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
365 | seq_printf(m, "model\t\t: %s\n" | 367 | seq_printf(m, "model\t\t: %s\n" |
366 | "model name\t: %s\n", | 368 | "model name\t: %s\n", |
367 | boot_cpu_data.pdc.sys_model_name, | 369 | boot_cpu_data.pdc.sys_model_name, |
368 | cpu_data[n].dev ? | 370 | cpuinfo->dev ? |
369 | cpu_data[n].dev->name : "Unknown" ); | 371 | cpuinfo->dev->name : "Unknown"); |
370 | 372 | ||
371 | seq_printf(m, "hversion\t: 0x%08x\n" | 373 | seq_printf(m, "hversion\t: 0x%08x\n" |
372 | "sversion\t: 0x%08x\n", | 374 | "sversion\t: 0x%08x\n", |
@@ -377,8 +379,8 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
377 | show_cache_info(m); | 379 | show_cache_info(m); |
378 | 380 | ||
379 | seq_printf(m, "bogomips\t: %lu.%02lu\n", | 381 | seq_printf(m, "bogomips\t: %lu.%02lu\n", |
380 | cpu_data[n].loops_per_jiffy / (500000 / HZ), | 382 | cpuinfo->loops_per_jiffy / (500000 / HZ), |
381 | (cpu_data[n].loops_per_jiffy / (5000 / HZ)) % 100); | 383 | (cpuinfo->loops_per_jiffy / (5000 / HZ)) % 100); |
382 | 384 | ||
383 | seq_printf(m, "software id\t: %ld\n\n", | 385 | seq_printf(m, "software id\t: %ld\n\n", |
384 | boot_cpu_data.pdc.model.sw_id); | 386 | boot_cpu_data.pdc.model.sw_id); |
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 7d27853ff8c8..82131ca8e05c 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
@@ -58,11 +58,6 @@ int parisc_bus_is_phys __read_mostly = 1; /* Assume no IOMMU is present */ | |||
58 | EXPORT_SYMBOL(parisc_bus_is_phys); | 58 | EXPORT_SYMBOL(parisc_bus_is_phys); |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | /* This sets the vmerge boundary and size, it's here because it has to | ||
62 | * be available on all platforms (zero means no-virtual merging) */ | ||
63 | unsigned long parisc_vmerge_boundary = 0; | ||
64 | unsigned long parisc_vmerge_max_size = 0; | ||
65 | |||
66 | void __init setup_cmdline(char **cmdline_p) | 61 | void __init setup_cmdline(char **cmdline_p) |
67 | { | 62 | { |
68 | extern unsigned int boot_args[]; | 63 | extern unsigned int boot_args[]; |
@@ -321,7 +316,7 @@ static int __init parisc_init(void) | |||
321 | 316 | ||
322 | processor_init(); | 317 | processor_init(); |
323 | printk(KERN_INFO "CPU(s): %d x %s at %d.%06d MHz\n", | 318 | printk(KERN_INFO "CPU(s): %d x %s at %d.%06d MHz\n", |
324 | boot_cpu_data.cpu_count, | 319 | num_present_cpus(), |
325 | boot_cpu_data.cpu_name, | 320 | boot_cpu_data.cpu_name, |
326 | boot_cpu_data.cpu_hz / 1000000, | 321 | boot_cpu_data.cpu_hz / 1000000, |
327 | boot_cpu_data.cpu_hz % 1000000 ); | 322 | boot_cpu_data.cpu_hz % 1000000 ); |
@@ -387,8 +382,8 @@ void start_parisc(void) | |||
387 | if (ret >= 0 && coproc_cfg.ccr_functional) { | 382 | if (ret >= 0 && coproc_cfg.ccr_functional) { |
388 | mtctl(coproc_cfg.ccr_functional, 10); | 383 | mtctl(coproc_cfg.ccr_functional, 10); |
389 | 384 | ||
390 | cpu_data[cpunum].fp_rev = coproc_cfg.revision; | 385 | per_cpu(cpu_data, cpunum).fp_rev = coproc_cfg.revision; |
391 | cpu_data[cpunum].fp_model = coproc_cfg.model; | 386 | per_cpu(cpu_data, cpunum).fp_model = coproc_cfg.model; |
392 | 387 | ||
393 | asm volatile ("fstd %fr0,8(%sp)"); | 388 | asm volatile ("fstd %fr0,8(%sp)"); |
394 | } else { | 389 | } else { |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 80bc000523fa..9995d7ed5819 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -56,16 +56,17 @@ static int smp_debug_lvl = 0; | |||
56 | if (lvl >= smp_debug_lvl) \ | 56 | if (lvl >= smp_debug_lvl) \ |
57 | printk(printargs); | 57 | printk(printargs); |
58 | #else | 58 | #else |
59 | #define smp_debug(lvl, ...) | 59 | #define smp_debug(lvl, ...) do { } while(0) |
60 | #endif /* DEBUG_SMP */ | 60 | #endif /* DEBUG_SMP */ |
61 | 61 | ||
62 | DEFINE_SPINLOCK(smp_lock); | 62 | DEFINE_SPINLOCK(smp_lock); |
63 | 63 | ||
64 | volatile struct task_struct *smp_init_current_idle_task; | 64 | volatile struct task_struct *smp_init_current_idle_task; |
65 | 65 | ||
66 | static volatile int cpu_now_booting __read_mostly = 0; /* track which CPU is booting */ | 66 | /* track which CPU is booting */ |
67 | static volatile int cpu_now_booting __cpuinitdata; | ||
67 | 68 | ||
68 | static int parisc_max_cpus __read_mostly = 1; | 69 | static int parisc_max_cpus __cpuinitdata = 1; |
69 | 70 | ||
70 | DEFINE_PER_CPU(spinlock_t, ipi_lock) = SPIN_LOCK_UNLOCKED; | 71 | DEFINE_PER_CPU(spinlock_t, ipi_lock) = SPIN_LOCK_UNLOCKED; |
71 | 72 | ||
@@ -123,7 +124,7 @@ irqreturn_t | |||
123 | ipi_interrupt(int irq, void *dev_id) | 124 | ipi_interrupt(int irq, void *dev_id) |
124 | { | 125 | { |
125 | int this_cpu = smp_processor_id(); | 126 | int this_cpu = smp_processor_id(); |
126 | struct cpuinfo_parisc *p = &cpu_data[this_cpu]; | 127 | struct cpuinfo_parisc *p = &per_cpu(cpu_data, this_cpu); |
127 | unsigned long ops; | 128 | unsigned long ops; |
128 | unsigned long flags; | 129 | unsigned long flags; |
129 | 130 | ||
@@ -202,13 +203,13 @@ ipi_interrupt(int irq, void *dev_id) | |||
202 | static inline void | 203 | static inline void |
203 | ipi_send(int cpu, enum ipi_message_type op) | 204 | ipi_send(int cpu, enum ipi_message_type op) |
204 | { | 205 | { |
205 | struct cpuinfo_parisc *p = &cpu_data[cpu]; | 206 | struct cpuinfo_parisc *p = &per_cpu(cpu_data, cpu); |
206 | spinlock_t *lock = &per_cpu(ipi_lock, cpu); | 207 | spinlock_t *lock = &per_cpu(ipi_lock, cpu); |
207 | unsigned long flags; | 208 | unsigned long flags; |
208 | 209 | ||
209 | spin_lock_irqsave(lock, flags); | 210 | spin_lock_irqsave(lock, flags); |
210 | p->pending_ipi |= 1 << op; | 211 | p->pending_ipi |= 1 << op; |
211 | gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa); | 212 | gsc_writel(IPI_IRQ - CPU_IRQ_BASE, p->hpa); |
212 | spin_unlock_irqrestore(lock, flags); | 213 | spin_unlock_irqrestore(lock, flags); |
213 | } | 214 | } |
214 | 215 | ||
@@ -224,10 +225,7 @@ send_IPI_mask(cpumask_t mask, enum ipi_message_type op) | |||
224 | static inline void | 225 | static inline void |
225 | send_IPI_single(int dest_cpu, enum ipi_message_type op) | 226 | send_IPI_single(int dest_cpu, enum ipi_message_type op) |
226 | { | 227 | { |
227 | if (dest_cpu == NO_PROC_ID) { | 228 | BUG_ON(dest_cpu == NO_PROC_ID); |
228 | BUG(); | ||
229 | return; | ||
230 | } | ||
231 | 229 | ||
232 | ipi_send(dest_cpu, op); | 230 | ipi_send(dest_cpu, op); |
233 | } | 231 | } |
@@ -309,8 +307,7 @@ smp_cpu_init(int cpunum) | |||
309 | /* Initialise the idle task for this CPU */ | 307 | /* Initialise the idle task for this CPU */ |
310 | atomic_inc(&init_mm.mm_count); | 308 | atomic_inc(&init_mm.mm_count); |
311 | current->active_mm = &init_mm; | 309 | current->active_mm = &init_mm; |
312 | if(current->mm) | 310 | BUG_ON(current->mm); |
313 | BUG(); | ||
314 | enter_lazy_tlb(&init_mm, current); | 311 | enter_lazy_tlb(&init_mm, current); |
315 | 312 | ||
316 | init_IRQ(); /* make sure no IRQs are enabled or pending */ | 313 | init_IRQ(); /* make sure no IRQs are enabled or pending */ |
@@ -345,6 +342,7 @@ void __init smp_callin(void) | |||
345 | */ | 342 | */ |
346 | int __cpuinit smp_boot_one_cpu(int cpuid) | 343 | int __cpuinit smp_boot_one_cpu(int cpuid) |
347 | { | 344 | { |
345 | const struct cpuinfo_parisc *p = &per_cpu(cpu_data, cpuid); | ||
348 | struct task_struct *idle; | 346 | struct task_struct *idle; |
349 | long timeout; | 347 | long timeout; |
350 | 348 | ||
@@ -376,7 +374,7 @@ int __cpuinit smp_boot_one_cpu(int cpuid) | |||
376 | smp_init_current_idle_task = idle ; | 374 | smp_init_current_idle_task = idle ; |
377 | mb(); | 375 | mb(); |
378 | 376 | ||
379 | printk("Releasing cpu %d now, hpa=%lx\n", cpuid, cpu_data[cpuid].hpa); | 377 | printk(KERN_INFO "Releasing cpu %d now, hpa=%lx\n", cpuid, p->hpa); |
380 | 378 | ||
381 | /* | 379 | /* |
382 | ** This gets PDC to release the CPU from a very tight loop. | 380 | ** This gets PDC to release the CPU from a very tight loop. |
@@ -387,7 +385,7 @@ int __cpuinit smp_boot_one_cpu(int cpuid) | |||
387 | ** EIR{0}). MEM_RENDEZ is valid only when it is nonzero and the | 385 | ** EIR{0}). MEM_RENDEZ is valid only when it is nonzero and the |
388 | ** contents of memory are valid." | 386 | ** contents of memory are valid." |
389 | */ | 387 | */ |
390 | gsc_writel(TIMER_IRQ - CPU_IRQ_BASE, cpu_data[cpuid].hpa); | 388 | gsc_writel(TIMER_IRQ - CPU_IRQ_BASE, p->hpa); |
391 | mb(); | 389 | mb(); |
392 | 390 | ||
393 | /* | 391 | /* |
@@ -419,12 +417,12 @@ alive: | |||
419 | return 0; | 417 | return 0; |
420 | } | 418 | } |
421 | 419 | ||
422 | void __devinit smp_prepare_boot_cpu(void) | 420 | void __init smp_prepare_boot_cpu(void) |
423 | { | 421 | { |
424 | int bootstrap_processor=cpu_data[0].cpuid; /* CPU ID of BSP */ | 422 | int bootstrap_processor = per_cpu(cpu_data, 0).cpuid; |
425 | 423 | ||
426 | /* Setup BSP mappings */ | 424 | /* Setup BSP mappings */ |
427 | printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor); | 425 | printk(KERN_INFO "SMP: bootstrap CPU ID is %d\n", bootstrap_processor); |
428 | 426 | ||
429 | cpu_set(bootstrap_processor, cpu_online_map); | 427 | cpu_set(bootstrap_processor, cpu_online_map); |
430 | cpu_set(bootstrap_processor, cpu_present_map); | 428 | cpu_set(bootstrap_processor, cpu_present_map); |
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 4d09203bc693..9d46c43a4152 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -60,7 +60,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
60 | unsigned long cycles_elapsed, ticks_elapsed; | 60 | unsigned long cycles_elapsed, ticks_elapsed; |
61 | unsigned long cycles_remainder; | 61 | unsigned long cycles_remainder; |
62 | unsigned int cpu = smp_processor_id(); | 62 | unsigned int cpu = smp_processor_id(); |
63 | struct cpuinfo_parisc *cpuinfo = &cpu_data[cpu]; | 63 | struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); |
64 | 64 | ||
65 | /* gcc can optimize for "read-only" case with a local clocktick */ | 65 | /* gcc can optimize for "read-only" case with a local clocktick */ |
66 | unsigned long cpt = clocktick; | 66 | unsigned long cpt = clocktick; |
@@ -213,7 +213,7 @@ void __init start_cpu_itimer(void) | |||
213 | 213 | ||
214 | mtctl(next_tick, 16); /* kick off Interval Timer (CR16) */ | 214 | mtctl(next_tick, 16); /* kick off Interval Timer (CR16) */ |
215 | 215 | ||
216 | cpu_data[cpu].it_value = next_tick; | 216 | per_cpu(cpu_data, cpu).it_value = next_tick; |
217 | } | 217 | } |
218 | 218 | ||
219 | struct platform_device rtc_parisc_dev = { | 219 | struct platform_device rtc_parisc_dev = { |
diff --git a/arch/parisc/kernel/topology.c b/arch/parisc/kernel/topology.c index d71cb018a21e..f5159381fdd6 100644 --- a/arch/parisc/kernel/topology.c +++ b/arch/parisc/kernel/topology.c | |||
@@ -22,14 +22,14 @@ | |||
22 | #include <linux/cpu.h> | 22 | #include <linux/cpu.h> |
23 | #include <linux/cache.h> | 23 | #include <linux/cache.h> |
24 | 24 | ||
25 | static struct cpu cpu_devices[NR_CPUS] __read_mostly; | 25 | static DEFINE_PER_CPU(struct cpu, cpu_devices); |
26 | 26 | ||
27 | static int __init topology_init(void) | 27 | static int __init topology_init(void) |
28 | { | 28 | { |
29 | int num; | 29 | int num; |
30 | 30 | ||
31 | for_each_present_cpu(num) { | 31 | for_each_present_cpu(num) { |
32 | register_cpu(&cpu_devices[num], num); | 32 | register_cpu(&per_cpu(cpu_devices, num), num); |
33 | } | 33 | } |
34 | return 0; | 34 | return 0; |
35 | } | 35 | } |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 4c771cd580ec..ba658d2086f7 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -745,6 +745,10 @@ void handle_interruption(int code, struct pt_regs *regs) | |||
745 | /* Fall Through */ | 745 | /* Fall Through */ |
746 | case 27: | 746 | case 27: |
747 | /* Data memory protection ID trap */ | 747 | /* Data memory protection ID trap */ |
748 | if (code == 27 && !user_mode(regs) && | ||
749 | fixup_exception(regs)) | ||
750 | return; | ||
751 | |||
748 | die_if_kernel("Protection id trap", regs, code); | 752 | die_if_kernel("Protection id trap", regs, code); |
749 | si.si_code = SEGV_MAPERR; | 753 | si.si_code = SEGV_MAPERR; |
750 | si.si_signo = SIGSEGV; | 754 | si.si_signo = SIGSEGV; |
@@ -821,8 +825,8 @@ void handle_interruption(int code, struct pt_regs *regs) | |||
821 | 825 | ||
822 | int __init check_ivt(void *iva) | 826 | int __init check_ivt(void *iva) |
823 | { | 827 | { |
828 | extern u32 os_hpmc_size; | ||
824 | extern const u32 os_hpmc[]; | 829 | extern const u32 os_hpmc[]; |
825 | extern const u32 os_hpmc_end[]; | ||
826 | 830 | ||
827 | int i; | 831 | int i; |
828 | u32 check = 0; | 832 | u32 check = 0; |
@@ -839,8 +843,7 @@ int __init check_ivt(void *iva) | |||
839 | *ivap++ = 0; | 843 | *ivap++ = 0; |
840 | 844 | ||
841 | /* Compute Checksum for HPMC handler */ | 845 | /* Compute Checksum for HPMC handler */ |
842 | 846 | length = os_hpmc_size; | |
843 | length = os_hpmc_end - os_hpmc; | ||
844 | ivap[7] = length; | 847 | ivap[7] = length; |
845 | 848 | ||
846 | hpmcp = (u32 *)os_hpmc; | 849 | hpmcp = (u32 *)os_hpmc; |
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index 6773c582e457..69dad5a850a8 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c | |||
@@ -372,7 +372,7 @@ void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct | |||
372 | struct pt_regs *r = &t->thread.regs; | 372 | struct pt_regs *r = &t->thread.regs; |
373 | struct pt_regs *r2; | 373 | struct pt_regs *r2; |
374 | 374 | ||
375 | r2 = kmalloc(sizeof(struct pt_regs), GFP_KERNEL); | 375 | r2 = kmalloc(sizeof(struct pt_regs), GFP_ATOMIC); |
376 | if (!r2) | 376 | if (!r2) |
377 | return; | 377 | return; |
378 | *r2 = *r; | 378 | *r2 = *r; |
diff --git a/arch/parisc/lib/iomap.c b/arch/parisc/lib/iomap.c index 9abed07db7fc..5069e8b2ca71 100644 --- a/arch/parisc/lib/iomap.c +++ b/arch/parisc/lib/iomap.c | |||
@@ -261,7 +261,7 @@ static const struct iomap_ops iomem_ops = { | |||
261 | iomem_write32r, | 261 | iomem_write32r, |
262 | }; | 262 | }; |
263 | 263 | ||
264 | const struct iomap_ops *iomap_ops[8] = { | 264 | static const struct iomap_ops *iomap_ops[8] = { |
265 | [0] = &ioport_ops, | 265 | [0] = &ioport_ops, |
266 | [7] = &iomem_ops | 266 | [7] = &iomem_ops |
267 | }; | 267 | }; |
diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c index 2d68431fc22e..bbda909c866e 100644 --- a/arch/parisc/lib/memcpy.c +++ b/arch/parisc/lib/memcpy.c | |||
@@ -275,7 +275,7 @@ handle_store_error: | |||
275 | 275 | ||
276 | 276 | ||
277 | /* Returns 0 for success, otherwise, returns number of bytes not transferred. */ | 277 | /* Returns 0 for success, otherwise, returns number of bytes not transferred. */ |
278 | unsigned long pa_memcpy(void *dstp, const void *srcp, unsigned long len) | 278 | static unsigned long pa_memcpy(void *dstp, const void *srcp, unsigned long len) |
279 | { | 279 | { |
280 | register unsigned long src, dst, t1, t2, t3; | 280 | register unsigned long src, dst, t1, t2, t3; |
281 | register unsigned char *pcs, *pcd; | 281 | register unsigned char *pcs, *pcd; |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index b2e3e9a8cece..92c7fa4ecc3f 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
@@ -139,13 +139,41 @@ parisc_acctyp(unsigned long code, unsigned int inst) | |||
139 | } | 139 | } |
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | int fixup_exception(struct pt_regs *regs) | ||
143 | { | ||
144 | const struct exception_table_entry *fix; | ||
145 | |||
146 | fix = search_exception_tables(regs->iaoq[0]); | ||
147 | if (fix) { | ||
148 | struct exception_data *d; | ||
149 | d = &__get_cpu_var(exception_data); | ||
150 | d->fault_ip = regs->iaoq[0]; | ||
151 | d->fault_space = regs->isr; | ||
152 | d->fault_addr = regs->ior; | ||
153 | |||
154 | regs->iaoq[0] = ((fix->fixup) & ~3); | ||
155 | /* | ||
156 | * NOTE: In some cases the faulting instruction | ||
157 | * may be in the delay slot of a branch. We | ||
158 | * don't want to take the branch, so we don't | ||
159 | * increment iaoq[1], instead we set it to be | ||
160 | * iaoq[0]+4, and clear the B bit in the PSW | ||
161 | */ | ||
162 | regs->iaoq[1] = regs->iaoq[0] + 4; | ||
163 | regs->gr[0] &= ~PSW_B; /* IPSW in gr[0] */ | ||
164 | |||
165 | return 1; | ||
166 | } | ||
167 | |||
168 | return 0; | ||
169 | } | ||
170 | |||
142 | void do_page_fault(struct pt_regs *regs, unsigned long code, | 171 | void do_page_fault(struct pt_regs *regs, unsigned long code, |
143 | unsigned long address) | 172 | unsigned long address) |
144 | { | 173 | { |
145 | struct vm_area_struct *vma, *prev_vma; | 174 | struct vm_area_struct *vma, *prev_vma; |
146 | struct task_struct *tsk = current; | 175 | struct task_struct *tsk = current; |
147 | struct mm_struct *mm = tsk->mm; | 176 | struct mm_struct *mm = tsk->mm; |
148 | const struct exception_table_entry *fix; | ||
149 | unsigned long acc_type; | 177 | unsigned long acc_type; |
150 | int fault; | 178 | int fault; |
151 | 179 | ||
@@ -229,32 +257,8 @@ bad_area: | |||
229 | 257 | ||
230 | no_context: | 258 | no_context: |
231 | 259 | ||
232 | if (!user_mode(regs)) { | 260 | if (!user_mode(regs) && fixup_exception(regs)) { |
233 | fix = search_exception_tables(regs->iaoq[0]); | 261 | return; |
234 | |||
235 | if (fix) { | ||
236 | struct exception_data *d; | ||
237 | |||
238 | d = &__get_cpu_var(exception_data); | ||
239 | d->fault_ip = regs->iaoq[0]; | ||
240 | d->fault_space = regs->isr; | ||
241 | d->fault_addr = regs->ior; | ||
242 | |||
243 | regs->iaoq[0] = ((fix->fixup) & ~3); | ||
244 | |||
245 | /* | ||
246 | * NOTE: In some cases the faulting instruction | ||
247 | * may be in the delay slot of a branch. We | ||
248 | * don't want to take the branch, so we don't | ||
249 | * increment iaoq[1], instead we set it to be | ||
250 | * iaoq[0]+4, and clear the B bit in the PSW | ||
251 | */ | ||
252 | |||
253 | regs->iaoq[1] = regs->iaoq[0] + 4; | ||
254 | regs->gr[0] &= ~PSW_B; /* IPSW in gr[0] */ | ||
255 | |||
256 | return; | ||
257 | } | ||
258 | } | 262 | } |
259 | 263 | ||
260 | parisc_terminate("Bad Address (null pointer deref?)", regs, code, address); | 264 | parisc_terminate("Bad Address (null pointer deref?)", regs, code, address); |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 79f25cef32df..84b861316ce7 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -108,6 +108,8 @@ config ARCH_NO_VIRT_TO_BUS | |||
108 | config PPC | 108 | config PPC |
109 | bool | 109 | bool |
110 | default y | 110 | default y |
111 | select HAVE_FTRACE_MCOUNT_RECORD | ||
112 | select HAVE_DYNAMIC_FTRACE | ||
111 | select HAVE_FUNCTION_TRACER | 113 | select HAVE_FUNCTION_TRACER |
112 | select ARCH_WANT_OPTIONAL_GPIOLIB | 114 | select ARCH_WANT_OPTIONAL_GPIOLIB |
113 | select HAVE_IDE | 115 | select HAVE_IDE |
@@ -326,7 +328,8 @@ config KEXEC | |||
326 | 328 | ||
327 | config CRASH_DUMP | 329 | config CRASH_DUMP |
328 | bool "Build a kdump crash kernel" | 330 | bool "Build a kdump crash kernel" |
329 | depends on (PPC64 && RELOCATABLE) || 6xx | 331 | depends on PPC64 || 6xx |
332 | select RELOCATABLE if PPC64 | ||
330 | help | 333 | help |
331 | Build a kernel suitable for use as a kdump capture kernel. | 334 | Build a kernel suitable for use as a kdump capture kernel. |
332 | The same kernel binary can be used as production kernel and dump | 335 | The same kernel binary can be used as production kernel and dump |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index ab6dda372438..e84df338ea29 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -356,7 +356,7 @@ $(obj)/zImage.initrd: $(addprefix $(obj)/, $(initrd-y)) | |||
356 | @rm -f $@; ln $< $@ | 356 | @rm -f $@; ln $< $@ |
357 | 357 | ||
358 | install: $(CONFIGURE) $(addprefix $(obj)/, $(image-y)) | 358 | install: $(CONFIGURE) $(addprefix $(obj)/, $(image-y)) |
359 | sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" $< | 359 | sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" $^ |
360 | 360 | ||
361 | # anything not in $(targets) | 361 | # anything not in $(targets) |
362 | clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \ | 362 | clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \ |
diff --git a/arch/powerpc/boot/dts/mpc836x_mds.dts b/arch/powerpc/boot/dts/mpc836x_mds.dts index 14534d04e4db..6e34f170fa62 100644 --- a/arch/powerpc/boot/dts/mpc836x_mds.dts +++ b/arch/powerpc/boot/dts/mpc836x_mds.dts | |||
@@ -69,8 +69,18 @@ | |||
69 | }; | 69 | }; |
70 | 70 | ||
71 | bcsr@1,0 { | 71 | bcsr@1,0 { |
72 | #address-cells = <1>; | ||
73 | #size-cells = <1>; | ||
72 | compatible = "fsl,mpc8360mds-bcsr"; | 74 | compatible = "fsl,mpc8360mds-bcsr"; |
73 | reg = <1 0 0x8000>; | 75 | reg = <1 0 0x8000>; |
76 | ranges = <0 1 0 0x8000>; | ||
77 | |||
78 | bcsr13: gpio-controller@d { | ||
79 | #gpio-cells = <2>; | ||
80 | compatible = "fsl,mpc8360mds-bcsr-gpio"; | ||
81 | reg = <0xd 1>; | ||
82 | gpio-controller; | ||
83 | }; | ||
74 | }; | 84 | }; |
75 | }; | 85 | }; |
76 | 86 | ||
@@ -195,10 +205,21 @@ | |||
195 | }; | 205 | }; |
196 | 206 | ||
197 | par_io@1400 { | 207 | par_io@1400 { |
208 | #address-cells = <1>; | ||
209 | #size-cells = <1>; | ||
198 | reg = <0x1400 0x100>; | 210 | reg = <0x1400 0x100>; |
211 | ranges = <0 0x1400 0x100>; | ||
199 | device_type = "par_io"; | 212 | device_type = "par_io"; |
200 | num-ports = <7>; | 213 | num-ports = <7>; |
201 | 214 | ||
215 | qe_pio_b: gpio-controller@18 { | ||
216 | #gpio-cells = <2>; | ||
217 | compatible = "fsl,mpc8360-qe-pario-bank", | ||
218 | "fsl,mpc8323-qe-pario-bank"; | ||
219 | reg = <0x18 0x18>; | ||
220 | gpio-controller; | ||
221 | }; | ||
222 | |||
202 | pio1: ucc_pin@01 { | 223 | pio1: ucc_pin@01 { |
203 | pio-map = < | 224 | pio-map = < |
204 | /* port pin dir open_drain assignment has_irq */ | 225 | /* port pin dir open_drain assignment has_irq */ |
@@ -282,6 +303,15 @@ | |||
282 | }; | 303 | }; |
283 | }; | 304 | }; |
284 | 305 | ||
306 | timer@440 { | ||
307 | compatible = "fsl,mpc8360-qe-gtm", | ||
308 | "fsl,qe-gtm", "fsl,gtm"; | ||
309 | reg = <0x440 0x40>; | ||
310 | clock-frequency = <132000000>; | ||
311 | interrupts = <12 13 14 15>; | ||
312 | interrupt-parent = <&qeic>; | ||
313 | }; | ||
314 | |||
285 | spi@4c0 { | 315 | spi@4c0 { |
286 | cell-index = <0>; | 316 | cell-index = <0>; |
287 | compatible = "fsl,spi"; | 317 | compatible = "fsl,spi"; |
@@ -301,11 +331,20 @@ | |||
301 | }; | 331 | }; |
302 | 332 | ||
303 | usb@6c0 { | 333 | usb@6c0 { |
304 | compatible = "qe_udc"; | 334 | compatible = "fsl,mpc8360-qe-usb", |
335 | "fsl,mpc8323-qe-usb"; | ||
305 | reg = <0x6c0 0x40 0x8b00 0x100>; | 336 | reg = <0x6c0 0x40 0x8b00 0x100>; |
306 | interrupts = <11>; | 337 | interrupts = <11>; |
307 | interrupt-parent = <&qeic>; | 338 | interrupt-parent = <&qeic>; |
308 | mode = "slave"; | 339 | fsl,fullspeed-clock = "clk21"; |
340 | fsl,lowspeed-clock = "brg9"; | ||
341 | gpios = <&qe_pio_b 2 0 /* USBOE */ | ||
342 | &qe_pio_b 3 0 /* USBTP */ | ||
343 | &qe_pio_b 8 0 /* USBTN */ | ||
344 | &qe_pio_b 9 0 /* USBRP */ | ||
345 | &qe_pio_b 11 0 /* USBRN */ | ||
346 | &bcsr13 5 0 /* SPEED */ | ||
347 | &bcsr13 4 1>; /* POWER */ | ||
309 | }; | 348 | }; |
310 | 349 | ||
311 | enet0: ucc@2000 { | 350 | enet0: ucc@2000 { |
diff --git a/arch/powerpc/boot/dts/mpc836x_rdk.dts b/arch/powerpc/boot/dts/mpc836x_rdk.dts index decadf3d9e98..37b789510d68 100644 --- a/arch/powerpc/boot/dts/mpc836x_rdk.dts +++ b/arch/powerpc/boot/dts/mpc836x_rdk.dts | |||
@@ -218,8 +218,23 @@ | |||
218 | reg = <0x440 0x40>; | 218 | reg = <0x440 0x40>; |
219 | interrupts = <12 13 14 15>; | 219 | interrupts = <12 13 14 15>; |
220 | interrupt-parent = <&qeic>; | 220 | interrupt-parent = <&qeic>; |
221 | /* filled by u-boot */ | 221 | clock-frequency = <166666666>; |
222 | clock-frequency = <0>; | 222 | }; |
223 | |||
224 | usb@6c0 { | ||
225 | compatible = "fsl,mpc8360-qe-usb", | ||
226 | "fsl,mpc8323-qe-usb"; | ||
227 | reg = <0x6c0 0x40 0x8b00 0x100>; | ||
228 | interrupts = <11>; | ||
229 | interrupt-parent = <&qeic>; | ||
230 | fsl,fullspeed-clock = "clk21"; | ||
231 | gpios = <&qe_pio_b 2 0 /* USBOE */ | ||
232 | &qe_pio_b 3 0 /* USBTP */ | ||
233 | &qe_pio_b 8 0 /* USBTN */ | ||
234 | &qe_pio_b 9 0 /* USBRP */ | ||
235 | &qe_pio_b 11 0 /* USBRN */ | ||
236 | &qe_pio_e 20 0 /* SPEED */ | ||
237 | &qe_pio_e 21 1 /* POWER */>; | ||
223 | }; | 238 | }; |
224 | 239 | ||
225 | spi@4c0 { | 240 | spi@4c0 { |
diff --git a/arch/powerpc/boot/dts/mpc8641_hpcn.dts b/arch/powerpc/boot/dts/mpc8641_hpcn.dts index 35d5e248ccd7..4481532cbe77 100644 --- a/arch/powerpc/boot/dts/mpc8641_hpcn.dts +++ b/arch/powerpc/boot/dts/mpc8641_hpcn.dts | |||
@@ -26,7 +26,13 @@ | |||
26 | serial1 = &serial1; | 26 | serial1 = &serial1; |
27 | pci0 = &pci0; | 27 | pci0 = &pci0; |
28 | pci1 = &pci1; | 28 | pci1 = &pci1; |
29 | rapidio0 = &rapidio0; | 29 | /* |
30 | * Only one of Rapid IO or PCI can be present due to HW limitations and | ||
31 | * due to the fact that the 2 now share address space in the new memory | ||
32 | * map. The most likely case is that we have PCI, so comment out the | ||
33 | * rapidio node. Leave it here for reference. | ||
34 | */ | ||
35 | /* rapidio0 = &rapidio0; */ | ||
30 | }; | 36 | }; |
31 | 37 | ||
32 | cpus { | 38 | cpus { |
@@ -62,18 +68,17 @@ | |||
62 | reg = <0x00000000 0x40000000>; // 1G at 0x0 | 68 | reg = <0x00000000 0x40000000>; // 1G at 0x0 |
63 | }; | 69 | }; |
64 | 70 | ||
65 | localbus@f8005000 { | 71 | localbus@ffe05000 { |
66 | #address-cells = <2>; | 72 | #address-cells = <2>; |
67 | #size-cells = <1>; | 73 | #size-cells = <1>; |
68 | compatible = "fsl,mpc8641-localbus", "simple-bus"; | 74 | compatible = "fsl,mpc8641-localbus", "simple-bus"; |
69 | reg = <0xf8005000 0x1000>; | 75 | reg = <0xffe05000 0x1000>; |
70 | interrupts = <19 2>; | 76 | interrupts = <19 2>; |
71 | interrupt-parent = <&mpic>; | 77 | interrupt-parent = <&mpic>; |
72 | 78 | ||
73 | ranges = <0 0 0xff800000 0x00800000 | 79 | ranges = <0 0 0xef800000 0x00800000 |
74 | 1 0 0xfe000000 0x01000000 | 80 | 2 0 0xffdf8000 0x00008000 |
75 | 2 0 0xf8200000 0x00100000 | 81 | 3 0 0xffdf0000 0x00008000>; |
76 | 3 0 0xf8100000 0x00100000>; | ||
77 | 82 | ||
78 | flash@0,0 { | 83 | flash@0,0 { |
79 | compatible = "cfi-flash"; | 84 | compatible = "cfi-flash"; |
@@ -103,13 +108,13 @@ | |||
103 | }; | 108 | }; |
104 | }; | 109 | }; |
105 | 110 | ||
106 | soc8641@f8000000 { | 111 | soc8641@ffe00000 { |
107 | #address-cells = <1>; | 112 | #address-cells = <1>; |
108 | #size-cells = <1>; | 113 | #size-cells = <1>; |
109 | device_type = "soc"; | 114 | device_type = "soc"; |
110 | compatible = "simple-bus"; | 115 | compatible = "simple-bus"; |
111 | ranges = <0x00000000 0xf8000000 0x00100000>; | 116 | ranges = <0x00000000 0xffe00000 0x00100000>; |
112 | reg = <0xf8000000 0x00001000>; // CCSRBAR | 117 | reg = <0xffe00000 0x00001000>; // CCSRBAR |
113 | bus-frequency = <0>; | 118 | bus-frequency = <0>; |
114 | 119 | ||
115 | i2c@3000 { | 120 | i2c@3000 { |
@@ -340,17 +345,17 @@ | |||
340 | }; | 345 | }; |
341 | }; | 346 | }; |
342 | 347 | ||
343 | pci0: pcie@f8008000 { | 348 | pci0: pcie@ffe08000 { |
344 | cell-index = <0>; | 349 | cell-index = <0>; |
345 | compatible = "fsl,mpc8641-pcie"; | 350 | compatible = "fsl,mpc8641-pcie"; |
346 | device_type = "pci"; | 351 | device_type = "pci"; |
347 | #interrupt-cells = <1>; | 352 | #interrupt-cells = <1>; |
348 | #size-cells = <2>; | 353 | #size-cells = <2>; |
349 | #address-cells = <3>; | 354 | #address-cells = <3>; |
350 | reg = <0xf8008000 0x1000>; | 355 | reg = <0xffe08000 0x1000>; |
351 | bus-range = <0x0 0xff>; | 356 | bus-range = <0x0 0xff>; |
352 | ranges = <0x02000000 0x0 0x80000000 0x80000000 0x0 0x20000000 | 357 | ranges = <0x02000000 0x0 0x80000000 0x80000000 0x0 0x20000000 |
353 | 0x01000000 0x0 0x00000000 0xe2000000 0x0 0x00100000>; | 358 | 0x01000000 0x0 0x00000000 0xffc00000 0x0 0x00010000>; |
354 | clock-frequency = <33333333>; | 359 | clock-frequency = <33333333>; |
355 | interrupt-parent = <&mpic>; | 360 | interrupt-parent = <&mpic>; |
356 | interrupts = <24 2>; | 361 | interrupts = <24 2>; |
@@ -481,7 +486,7 @@ | |||
481 | 486 | ||
482 | 0x01000000 0x0 0x00000000 | 487 | 0x01000000 0x0 0x00000000 |
483 | 0x01000000 0x0 0x00000000 | 488 | 0x01000000 0x0 0x00000000 |
484 | 0x0 0x00100000>; | 489 | 0x0 0x00010000>; |
485 | uli1575@0 { | 490 | uli1575@0 { |
486 | reg = <0 0 0 0 0>; | 491 | reg = <0 0 0 0 0>; |
487 | #size-cells = <2>; | 492 | #size-cells = <2>; |
@@ -491,7 +496,7 @@ | |||
491 | 0x0 0x20000000 | 496 | 0x0 0x20000000 |
492 | 0x01000000 0x0 0x00000000 | 497 | 0x01000000 0x0 0x00000000 |
493 | 0x01000000 0x0 0x00000000 | 498 | 0x01000000 0x0 0x00000000 |
494 | 0x0 0x00100000>; | 499 | 0x0 0x00010000>; |
495 | isa@1e { | 500 | isa@1e { |
496 | device_type = "isa"; | 501 | device_type = "isa"; |
497 | #interrupt-cells = <2>; | 502 | #interrupt-cells = <2>; |
@@ -549,17 +554,17 @@ | |||
549 | 554 | ||
550 | }; | 555 | }; |
551 | 556 | ||
552 | pci1: pcie@f8009000 { | 557 | pci1: pcie@ffe09000 { |
553 | cell-index = <1>; | 558 | cell-index = <1>; |
554 | compatible = "fsl,mpc8641-pcie"; | 559 | compatible = "fsl,mpc8641-pcie"; |
555 | device_type = "pci"; | 560 | device_type = "pci"; |
556 | #interrupt-cells = <1>; | 561 | #interrupt-cells = <1>; |
557 | #size-cells = <2>; | 562 | #size-cells = <2>; |
558 | #address-cells = <3>; | 563 | #address-cells = <3>; |
559 | reg = <0xf8009000 0x1000>; | 564 | reg = <0xffe09000 0x1000>; |
560 | bus-range = <0 0xff>; | 565 | bus-range = <0 0xff>; |
561 | ranges = <0x02000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000 | 566 | ranges = <0x02000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000 |
562 | 0x01000000 0x0 0x00000000 0xe3000000 0x0 0x00100000>; | 567 | 0x01000000 0x0 0x00000000 0xffc10000 0x0 0x00010000>; |
563 | clock-frequency = <33333333>; | 568 | clock-frequency = <33333333>; |
564 | interrupt-parent = <&mpic>; | 569 | interrupt-parent = <&mpic>; |
565 | interrupts = <25 2>; | 570 | interrupts = <25 2>; |
@@ -582,18 +587,21 @@ | |||
582 | 587 | ||
583 | 0x01000000 0x0 0x00000000 | 588 | 0x01000000 0x0 0x00000000 |
584 | 0x01000000 0x0 0x00000000 | 589 | 0x01000000 0x0 0x00000000 |
585 | 0x0 0x00100000>; | 590 | 0x0 0x00010000>; |
586 | }; | 591 | }; |
587 | }; | 592 | }; |
588 | rapidio0: rapidio@f80c0000 { | 593 | /* |
594 | rapidio0: rapidio@ffec0000 { | ||
589 | #address-cells = <2>; | 595 | #address-cells = <2>; |
590 | #size-cells = <2>; | 596 | #size-cells = <2>; |
591 | compatible = "fsl,rapidio-delta"; | 597 | compatible = "fsl,rapidio-delta"; |
592 | reg = <0xf80c0000 0x20000>; | 598 | reg = <0xffec0000 0x20000>; |
593 | ranges = <0 0 0xc0000000 0 0x20000000>; | 599 | ranges = <0 0 0x80000000 0 0x20000000>; |
594 | interrupt-parent = <&mpic>; | 600 | interrupt-parent = <&mpic>; |
595 | /* err_irq bell_outb_irq bell_inb_irq | 601 | // err_irq bell_outb_irq bell_inb_irq |
596 | msg1_tx_irq msg1_rx_irq msg2_tx_irq msg2_rx_irq */ | 602 | // msg1_tx_irq msg1_rx_irq msg2_tx_irq msg2_rx_irq |
597 | interrupts = <48 2 49 2 50 2 53 2 54 2 55 2 56 2>; | 603 | interrupts = <48 2 49 2 50 2 53 2 54 2 55 2 56 2>; |
598 | }; | 604 | }; |
605 | */ | ||
606 | |||
599 | }; | 607 | }; |
diff --git a/arch/powerpc/boot/dts/sequoia.dts b/arch/powerpc/boot/dts/sequoia.dts index 3b295e8df53f..43cc68bd3192 100644 --- a/arch/powerpc/boot/dts/sequoia.dts +++ b/arch/powerpc/boot/dts/sequoia.dts | |||
@@ -134,7 +134,7 @@ | |||
134 | }; | 134 | }; |
135 | 135 | ||
136 | USB1: usb@e0000400 { | 136 | USB1: usb@e0000400 { |
137 | compatible = "ohci-be"; | 137 | compatible = "ibm,usb-ohci-440epx", "ohci-be"; |
138 | reg = <0x00000000 0xe0000400 0x00000060>; | 138 | reg = <0x00000000 0xe0000400 0x00000060>; |
139 | interrupt-parent = <&UIC0>; | 139 | interrupt-parent = <&UIC0>; |
140 | interrupts = <0x15 0x8>; | 140 | interrupts = <0x15 0x8>; |
diff --git a/arch/powerpc/boot/install.sh b/arch/powerpc/boot/install.sh index b002bfd56786..51b2387bdba0 100644 --- a/arch/powerpc/boot/install.sh +++ b/arch/powerpc/boot/install.sh | |||
@@ -15,7 +15,7 @@ | |||
15 | # $2 - kernel image file | 15 | # $2 - kernel image file |
16 | # $3 - kernel map file | 16 | # $3 - kernel map file |
17 | # $4 - default install path (blank if root directory) | 17 | # $4 - default install path (blank if root directory) |
18 | # $5 - kernel boot file, the zImage | 18 | # $5 and more - kernel boot files; zImage*, uImage, cuImage.*, etc. |
19 | # | 19 | # |
20 | 20 | ||
21 | # User may have a custom install script | 21 | # User may have a custom install script |
@@ -38,3 +38,15 @@ fi | |||
38 | 38 | ||
39 | cat $2 > $4/$image_name | 39 | cat $2 > $4/$image_name |
40 | cp $3 $4/System.map | 40 | cp $3 $4/System.map |
41 | |||
42 | # Copy all the bootable image files | ||
43 | path=$4 | ||
44 | shift 4 | ||
45 | while [ $# -ne 0 ]; do | ||
46 | image_name=`basename $1` | ||
47 | if [ -f $path/$image_name ]; then | ||
48 | mv $path/$image_name $path/$image_name.old | ||
49 | fi | ||
50 | cat $1 > $path/$image_name | ||
51 | shift | ||
52 | done; | ||
diff --git a/arch/powerpc/configs/85xx/mpc8572_ds_defconfig b/arch/powerpc/configs/85xx/mpc8572_ds_defconfig index 635588319e0d..32aeb79216f7 100644 --- a/arch/powerpc/configs/85xx/mpc8572_ds_defconfig +++ b/arch/powerpc/configs/85xx/mpc8572_ds_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.28-rc3 | 3 | # Linux kernel version: 2.6.28-rc8 |
4 | # Sat Nov 8 12:40:13 2008 | 4 | # Tue Dec 30 11:17:46 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -21,7 +21,10 @@ CONFIG_FSL_BOOKE=y | |||
21 | CONFIG_FSL_EMB_PERFMON=y | 21 | CONFIG_FSL_EMB_PERFMON=y |
22 | # CONFIG_PHYS_64BIT is not set | 22 | # CONFIG_PHYS_64BIT is not set |
23 | CONFIG_SPE=y | 23 | CONFIG_SPE=y |
24 | CONFIG_PPC_MMU_NOHASH=y | ||
24 | # CONFIG_PPC_MM_SLICES is not set | 25 | # CONFIG_PPC_MM_SLICES is not set |
26 | CONFIG_SMP=y | ||
27 | CONFIG_NR_CPUS=2 | ||
25 | CONFIG_PPC32=y | 28 | CONFIG_PPC32=y |
26 | CONFIG_WORD_SIZE=32 | 29 | CONFIG_WORD_SIZE=32 |
27 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set | 30 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
@@ -50,7 +53,7 @@ CONFIG_ARCH_MAY_HAVE_PC_FDC=y | |||
50 | CONFIG_PPC_OF=y | 53 | CONFIG_PPC_OF=y |
51 | CONFIG_OF=y | 54 | CONFIG_OF=y |
52 | CONFIG_PPC_UDBG_16550=y | 55 | CONFIG_PPC_UDBG_16550=y |
53 | # CONFIG_GENERIC_TBSYNC is not set | 56 | CONFIG_GENERIC_TBSYNC=y |
54 | CONFIG_AUDIT_ARCH=y | 57 | CONFIG_AUDIT_ARCH=y |
55 | CONFIG_GENERIC_BUG=y | 58 | CONFIG_GENERIC_BUG=y |
56 | CONFIG_DEFAULT_UIMAGE=y | 59 | CONFIG_DEFAULT_UIMAGE=y |
@@ -62,7 +65,7 @@ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | |||
62 | # General setup | 65 | # General setup |
63 | # | 66 | # |
64 | CONFIG_EXPERIMENTAL=y | 67 | CONFIG_EXPERIMENTAL=y |
65 | CONFIG_BROKEN_ON_SMP=y | 68 | CONFIG_LOCK_KERNEL=y |
66 | CONFIG_INIT_ENV_ARG_LIMIT=32 | 69 | CONFIG_INIT_ENV_ARG_LIMIT=32 |
67 | CONFIG_LOCALVERSION="" | 70 | CONFIG_LOCALVERSION="" |
68 | CONFIG_LOCALVERSION_AUTO=y | 71 | CONFIG_LOCALVERSION_AUTO=y |
@@ -126,6 +129,7 @@ CONFIG_HAVE_IOREMAP_PROT=y | |||
126 | CONFIG_HAVE_KPROBES=y | 129 | CONFIG_HAVE_KPROBES=y |
127 | CONFIG_HAVE_KRETPROBES=y | 130 | CONFIG_HAVE_KRETPROBES=y |
128 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 131 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
132 | CONFIG_USE_GENERIC_SMP_HELPERS=y | ||
129 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 133 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
130 | CONFIG_SLABINFO=y | 134 | CONFIG_SLABINFO=y |
131 | CONFIG_RT_MUTEXES=y | 135 | CONFIG_RT_MUTEXES=y |
@@ -138,6 +142,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y | |||
138 | CONFIG_MODVERSIONS=y | 142 | CONFIG_MODVERSIONS=y |
139 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 143 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
140 | CONFIG_KMOD=y | 144 | CONFIG_KMOD=y |
145 | CONFIG_STOP_MACHINE=y | ||
141 | CONFIG_BLOCK=y | 146 | CONFIG_BLOCK=y |
142 | CONFIG_LBD=y | 147 | CONFIG_LBD=y |
143 | # CONFIG_BLK_DEV_IO_TRACE is not set | 148 | # CONFIG_BLK_DEV_IO_TRACE is not set |
@@ -197,6 +202,7 @@ CONFIG_PPC_I8259=y | |||
197 | # CONFIG_CPM2 is not set | 202 | # CONFIG_CPM2 is not set |
198 | CONFIG_FSL_ULI1575=y | 203 | CONFIG_FSL_ULI1575=y |
199 | # CONFIG_MPC8xxx_GPIO is not set | 204 | # CONFIG_MPC8xxx_GPIO is not set |
205 | # CONFIG_SIMPLE_GPIO is not set | ||
200 | 206 | ||
201 | # | 207 | # |
202 | # Kernel options | 208 | # Kernel options |
@@ -224,6 +230,7 @@ CONFIG_MATH_EMULATION=y | |||
224 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 230 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
225 | CONFIG_ARCH_HAS_WALK_MEMORY=y | 231 | CONFIG_ARCH_HAS_WALK_MEMORY=y |
226 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | 232 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y |
233 | # CONFIG_IRQ_ALL_CPUS is not set | ||
227 | CONFIG_ARCH_FLATMEM_ENABLE=y | 234 | CONFIG_ARCH_FLATMEM_ENABLE=y |
228 | CONFIG_ARCH_POPULATES_NODE_MAP=y | 235 | CONFIG_ARCH_POPULATES_NODE_MAP=y |
229 | CONFIG_SELECT_MEMORY_MODEL=y | 236 | CONFIG_SELECT_MEMORY_MODEL=y |
@@ -241,6 +248,9 @@ CONFIG_ZONE_DMA_FLAG=1 | |||
241 | CONFIG_BOUNCE=y | 248 | CONFIG_BOUNCE=y |
242 | CONFIG_VIRT_TO_BUS=y | 249 | CONFIG_VIRT_TO_BUS=y |
243 | CONFIG_UNEVICTABLE_LRU=y | 250 | CONFIG_UNEVICTABLE_LRU=y |
251 | CONFIG_PPC_4K_PAGES=y | ||
252 | # CONFIG_PPC_16K_PAGES is not set | ||
253 | # CONFIG_PPC_64K_PAGES is not set | ||
244 | CONFIG_FORCE_MAX_ZONEORDER=11 | 254 | CONFIG_FORCE_MAX_ZONEORDER=11 |
245 | CONFIG_PROC_DEVICETREE=y | 255 | CONFIG_PROC_DEVICETREE=y |
246 | # CONFIG_CMDLINE_BOOL is not set | 256 | # CONFIG_CMDLINE_BOOL is not set |
@@ -443,8 +453,10 @@ CONFIG_MISC_DEVICES=y | |||
443 | # CONFIG_EEPROM_93CX6 is not set | 453 | # CONFIG_EEPROM_93CX6 is not set |
444 | # CONFIG_SGI_IOC4 is not set | 454 | # CONFIG_SGI_IOC4 is not set |
445 | # CONFIG_TIFM_CORE is not set | 455 | # CONFIG_TIFM_CORE is not set |
456 | # CONFIG_ICS932S401 is not set | ||
446 | # CONFIG_ENCLOSURE_SERVICES is not set | 457 | # CONFIG_ENCLOSURE_SERVICES is not set |
447 | # CONFIG_HP_ILO is not set | 458 | # CONFIG_HP_ILO is not set |
459 | # CONFIG_C2PORT is not set | ||
448 | CONFIG_HAVE_IDE=y | 460 | CONFIG_HAVE_IDE=y |
449 | # CONFIG_IDE is not set | 461 | # CONFIG_IDE is not set |
450 | 462 | ||
@@ -784,6 +796,7 @@ CONFIG_SERIAL_CORE_CONSOLE=y | |||
784 | CONFIG_UNIX98_PTYS=y | 796 | CONFIG_UNIX98_PTYS=y |
785 | CONFIG_LEGACY_PTYS=y | 797 | CONFIG_LEGACY_PTYS=y |
786 | CONFIG_LEGACY_PTY_COUNT=256 | 798 | CONFIG_LEGACY_PTY_COUNT=256 |
799 | # CONFIG_HVC_UDBG is not set | ||
787 | # CONFIG_IPMI_HANDLER is not set | 800 | # CONFIG_IPMI_HANDLER is not set |
788 | CONFIG_HW_RANDOM=y | 801 | CONFIG_HW_RANDOM=y |
789 | CONFIG_NVRAM=y | 802 | CONFIG_NVRAM=y |
@@ -869,11 +882,11 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | |||
869 | # CONFIG_THERMAL is not set | 882 | # CONFIG_THERMAL is not set |
870 | # CONFIG_THERMAL_HWMON is not set | 883 | # CONFIG_THERMAL_HWMON is not set |
871 | # CONFIG_WATCHDOG is not set | 884 | # CONFIG_WATCHDOG is not set |
885 | CONFIG_SSB_POSSIBLE=y | ||
872 | 886 | ||
873 | # | 887 | # |
874 | # Sonics Silicon Backplane | 888 | # Sonics Silicon Backplane |
875 | # | 889 | # |
876 | CONFIG_SSB_POSSIBLE=y | ||
877 | # CONFIG_SSB is not set | 890 | # CONFIG_SSB is not set |
878 | 891 | ||
879 | # | 892 | # |
@@ -886,14 +899,7 @@ CONFIG_SSB_POSSIBLE=y | |||
886 | # CONFIG_PMIC_DA903X is not set | 899 | # CONFIG_PMIC_DA903X is not set |
887 | # CONFIG_MFD_WM8400 is not set | 900 | # CONFIG_MFD_WM8400 is not set |
888 | # CONFIG_MFD_WM8350_I2C is not set | 901 | # CONFIG_MFD_WM8350_I2C is not set |
889 | |||
890 | # | ||
891 | # Voltage and Current regulators | ||
892 | # | ||
893 | # CONFIG_REGULATOR is not set | 902 | # CONFIG_REGULATOR is not set |
894 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set | ||
895 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set | ||
896 | # CONFIG_REGULATOR_BQ24022 is not set | ||
897 | 903 | ||
898 | # | 904 | # |
899 | # Multimedia devices | 905 | # Multimedia devices |
@@ -1252,11 +1258,11 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
1252 | # CONFIG_USB_TMC is not set | 1258 | # CONFIG_USB_TMC is not set |
1253 | 1259 | ||
1254 | # | 1260 | # |
1255 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 1261 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; |
1256 | # | 1262 | # |
1257 | 1263 | ||
1258 | # | 1264 | # |
1259 | # may also be needed; see USB_STORAGE Help for more information | 1265 | # see USB_STORAGE Help for more information |
1260 | # | 1266 | # |
1261 | CONFIG_USB_STORAGE=y | 1267 | CONFIG_USB_STORAGE=y |
1262 | # CONFIG_USB_STORAGE_DEBUG is not set | 1268 | # CONFIG_USB_STORAGE_DEBUG is not set |
@@ -1348,6 +1354,7 @@ CONFIG_RTC_INTF_DEV=y | |||
1348 | # CONFIG_RTC_DRV_M41T80 is not set | 1354 | # CONFIG_RTC_DRV_M41T80 is not set |
1349 | # CONFIG_RTC_DRV_S35390A is not set | 1355 | # CONFIG_RTC_DRV_S35390A is not set |
1350 | # CONFIG_RTC_DRV_FM3130 is not set | 1356 | # CONFIG_RTC_DRV_FM3130 is not set |
1357 | # CONFIG_RTC_DRV_RX8581 is not set | ||
1351 | 1358 | ||
1352 | # | 1359 | # |
1353 | # SPI RTC drivers | 1360 | # SPI RTC drivers |
@@ -1624,6 +1631,7 @@ CONFIG_HAVE_FUNCTION_TRACER=y | |||
1624 | # CONFIG_SAMPLES is not set | 1631 | # CONFIG_SAMPLES is not set |
1625 | CONFIG_HAVE_ARCH_KGDB=y | 1632 | CONFIG_HAVE_ARCH_KGDB=y |
1626 | # CONFIG_KGDB is not set | 1633 | # CONFIG_KGDB is not set |
1634 | CONFIG_PRINT_STACK_DEPTH=64 | ||
1627 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1635 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1628 | # CONFIG_DEBUG_STACK_USAGE is not set | 1636 | # CONFIG_DEBUG_STACK_USAGE is not set |
1629 | # CONFIG_DEBUG_PAGEALLOC is not set | 1637 | # CONFIG_DEBUG_PAGEALLOC is not set |
@@ -1649,11 +1657,16 @@ CONFIG_CRYPTO=y | |||
1649 | # | 1657 | # |
1650 | # CONFIG_CRYPTO_FIPS is not set | 1658 | # CONFIG_CRYPTO_FIPS is not set |
1651 | CONFIG_CRYPTO_ALGAPI=y | 1659 | CONFIG_CRYPTO_ALGAPI=y |
1660 | CONFIG_CRYPTO_ALGAPI2=y | ||
1652 | CONFIG_CRYPTO_AEAD=y | 1661 | CONFIG_CRYPTO_AEAD=y |
1662 | CONFIG_CRYPTO_AEAD2=y | ||
1653 | CONFIG_CRYPTO_BLKCIPHER=y | 1663 | CONFIG_CRYPTO_BLKCIPHER=y |
1664 | CONFIG_CRYPTO_BLKCIPHER2=y | ||
1654 | CONFIG_CRYPTO_HASH=y | 1665 | CONFIG_CRYPTO_HASH=y |
1655 | CONFIG_CRYPTO_RNG=y | 1666 | CONFIG_CRYPTO_HASH2=y |
1667 | CONFIG_CRYPTO_RNG2=y | ||
1656 | CONFIG_CRYPTO_MANAGER=y | 1668 | CONFIG_CRYPTO_MANAGER=y |
1669 | CONFIG_CRYPTO_MANAGER2=y | ||
1657 | # CONFIG_CRYPTO_GF128MUL is not set | 1670 | # CONFIG_CRYPTO_GF128MUL is not set |
1658 | # CONFIG_CRYPTO_NULL is not set | 1671 | # CONFIG_CRYPTO_NULL is not set |
1659 | # CONFIG_CRYPTO_CRYPTD is not set | 1672 | # CONFIG_CRYPTO_CRYPTD is not set |
diff --git a/arch/powerpc/include/asm/cell-pmu.h b/arch/powerpc/include/asm/cell-pmu.h index 8066eede3a0c..b4b7338ad79e 100644 --- a/arch/powerpc/include/asm/cell-pmu.h +++ b/arch/powerpc/include/asm/cell-pmu.h | |||
@@ -37,9 +37,11 @@ | |||
37 | #define CBE_PM_STOP_AT_MAX 0x40000000 | 37 | #define CBE_PM_STOP_AT_MAX 0x40000000 |
38 | #define CBE_PM_TRACE_MODE_GET(pm_control) (((pm_control) >> 28) & 0x3) | 38 | #define CBE_PM_TRACE_MODE_GET(pm_control) (((pm_control) >> 28) & 0x3) |
39 | #define CBE_PM_TRACE_MODE_SET(mode) (((mode) & 0x3) << 28) | 39 | #define CBE_PM_TRACE_MODE_SET(mode) (((mode) & 0x3) << 28) |
40 | #define CBE_PM_TRACE_BUF_OVFLW(bit) (((bit) & 0x1) << 17) | ||
40 | #define CBE_PM_COUNT_MODE_SET(count) (((count) & 0x3) << 18) | 41 | #define CBE_PM_COUNT_MODE_SET(count) (((count) & 0x3) << 18) |
41 | #define CBE_PM_FREEZE_ALL_CTRS 0x00100000 | 42 | #define CBE_PM_FREEZE_ALL_CTRS 0x00100000 |
42 | #define CBE_PM_ENABLE_EXT_TRACE 0x00008000 | 43 | #define CBE_PM_ENABLE_EXT_TRACE 0x00008000 |
44 | #define CBE_PM_SPU_ADDR_TRACE_SET(msk) (((msk) & 0x3) << 9) | ||
43 | 45 | ||
44 | /* Macros for the trace_address register. */ | 46 | /* Macros for the trace_address register. */ |
45 | #define CBE_PM_TRACE_BUF_FULL 0x00000800 | 47 | #define CBE_PM_TRACE_BUF_FULL 0x00000800 |
diff --git a/arch/powerpc/include/asm/ioctls.h b/arch/powerpc/include/asm/ioctls.h index 279a6229584b..1842186d872c 100644 --- a/arch/powerpc/include/asm/ioctls.h +++ b/arch/powerpc/include/asm/ioctls.h | |||
@@ -89,6 +89,8 @@ | |||
89 | #define TIOCSBRK 0x5427 /* BSD compatibility */ | 89 | #define TIOCSBRK 0x5427 /* BSD compatibility */ |
90 | #define TIOCCBRK 0x5428 /* BSD compatibility */ | 90 | #define TIOCCBRK 0x5428 /* BSD compatibility */ |
91 | #define TIOCGSID 0x5429 /* Return the session ID of FD */ | 91 | #define TIOCGSID 0x5429 /* Return the session ID of FD */ |
92 | #define TIOCGRS485 0x542e | ||
93 | #define TIOCSRS485 0x542f | ||
92 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | 94 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ |
93 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ | 95 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ |
94 | 96 | ||
diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h index 6dbffc981702..7e06b43720d3 100644 --- a/arch/powerpc/include/asm/kexec.h +++ b/arch/powerpc/include/asm/kexec.h | |||
@@ -48,63 +48,8 @@ static inline void crash_setup_regs(struct pt_regs *newregs, | |||
48 | { | 48 | { |
49 | if (oldregs) | 49 | if (oldregs) |
50 | memcpy(newregs, oldregs, sizeof(*newregs)); | 50 | memcpy(newregs, oldregs, sizeof(*newregs)); |
51 | #ifdef __powerpc64__ | ||
52 | else { | ||
53 | /* FIXME Merge this with xmon_save_regs ?? */ | ||
54 | unsigned long tmp1, tmp2; | ||
55 | __asm__ __volatile__ ( | ||
56 | "std 0,0(%2)\n" | ||
57 | "std 1,8(%2)\n" | ||
58 | "std 2,16(%2)\n" | ||
59 | "std 3,24(%2)\n" | ||
60 | "std 4,32(%2)\n" | ||
61 | "std 5,40(%2)\n" | ||
62 | "std 6,48(%2)\n" | ||
63 | "std 7,56(%2)\n" | ||
64 | "std 8,64(%2)\n" | ||
65 | "std 9,72(%2)\n" | ||
66 | "std 10,80(%2)\n" | ||
67 | "std 11,88(%2)\n" | ||
68 | "std 12,96(%2)\n" | ||
69 | "std 13,104(%2)\n" | ||
70 | "std 14,112(%2)\n" | ||
71 | "std 15,120(%2)\n" | ||
72 | "std 16,128(%2)\n" | ||
73 | "std 17,136(%2)\n" | ||
74 | "std 18,144(%2)\n" | ||
75 | "std 19,152(%2)\n" | ||
76 | "std 20,160(%2)\n" | ||
77 | "std 21,168(%2)\n" | ||
78 | "std 22,176(%2)\n" | ||
79 | "std 23,184(%2)\n" | ||
80 | "std 24,192(%2)\n" | ||
81 | "std 25,200(%2)\n" | ||
82 | "std 26,208(%2)\n" | ||
83 | "std 27,216(%2)\n" | ||
84 | "std 28,224(%2)\n" | ||
85 | "std 29,232(%2)\n" | ||
86 | "std 30,240(%2)\n" | ||
87 | "std 31,248(%2)\n" | ||
88 | "mfmsr %0\n" | ||
89 | "std %0, 264(%2)\n" | ||
90 | "mfctr %0\n" | ||
91 | "std %0, 280(%2)\n" | ||
92 | "mflr %0\n" | ||
93 | "std %0, 288(%2)\n" | ||
94 | "bl 1f\n" | ||
95 | "1: mflr %1\n" | ||
96 | "std %1, 256(%2)\n" | ||
97 | "mtlr %0\n" | ||
98 | "mfxer %0\n" | ||
99 | "std %0, 296(%2)\n" | ||
100 | : "=&r" (tmp1), "=&r" (tmp2) | ||
101 | : "b" (newregs) | ||
102 | : "memory"); | ||
103 | } | ||
104 | #else | ||
105 | else | 51 | else |
106 | ppc_save_regs(newregs); | 52 | ppc_save_regs(newregs); |
107 | #endif /* __powerpc64__ */ | ||
108 | } | 53 | } |
109 | 54 | ||
110 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for | 55 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for |
diff --git a/arch/powerpc/include/asm/oprofile_impl.h b/arch/powerpc/include/asm/oprofile_impl.h index 95035c602ba6..639dc96077ab 100644 --- a/arch/powerpc/include/asm/oprofile_impl.h +++ b/arch/powerpc/include/asm/oprofile_impl.h | |||
@@ -32,6 +32,12 @@ struct op_system_config { | |||
32 | unsigned long mmcr0; | 32 | unsigned long mmcr0; |
33 | unsigned long mmcr1; | 33 | unsigned long mmcr1; |
34 | unsigned long mmcra; | 34 | unsigned long mmcra; |
35 | #ifdef CONFIG_OPROFILE_CELL | ||
36 | /* Register for oprofile user tool to check cell kernel profiling | ||
37 | * suport. | ||
38 | */ | ||
39 | unsigned long cell_support; | ||
40 | #endif | ||
35 | #endif | 41 | #endif |
36 | unsigned long enable_kernel; | 42 | unsigned long enable_kernel; |
37 | unsigned long enable_user; | 43 | unsigned long enable_user; |
diff --git a/arch/powerpc/include/asm/ps3.h b/arch/powerpc/include/asm/ps3.h index cff30c0ef1ff..eead5c67197a 100644 --- a/arch/powerpc/include/asm/ps3.h +++ b/arch/powerpc/include/asm/ps3.h | |||
@@ -320,6 +320,7 @@ enum ps3_match_id { | |||
320 | 320 | ||
321 | enum ps3_match_sub_id { | 321 | enum ps3_match_sub_id { |
322 | PS3_MATCH_SUB_ID_GPU_FB = 1, | 322 | PS3_MATCH_SUB_ID_GPU_FB = 1, |
323 | PS3_MATCH_SUB_ID_GPU_RAMDISK = 2, | ||
323 | }; | 324 | }; |
324 | 325 | ||
325 | #define PS3_MODULE_ALIAS_EHCI "ps3:1:0" | 326 | #define PS3_MODULE_ALIAS_EHCI "ps3:1:0" |
@@ -332,6 +333,7 @@ enum ps3_match_sub_id { | |||
332 | #define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8:0" | 333 | #define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8:0" |
333 | #define PS3_MODULE_ALIAS_SOUND "ps3:9:0" | 334 | #define PS3_MODULE_ALIAS_SOUND "ps3:9:0" |
334 | #define PS3_MODULE_ALIAS_GPU_FB "ps3:10:1" | 335 | #define PS3_MODULE_ALIAS_GPU_FB "ps3:10:1" |
336 | #define PS3_MODULE_ALIAS_GPU_RAMDISK "ps3:10:2" | ||
335 | #define PS3_MODULE_ALIAS_LPM "ps3:11:0" | 337 | #define PS3_MODULE_ALIAS_LPM "ps3:11:0" |
336 | 338 | ||
337 | enum ps3_system_bus_device_type { | 339 | enum ps3_system_bus_device_type { |
diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h index edee15d269ea..a0a15311d0d8 100644 --- a/arch/powerpc/include/asm/qe.h +++ b/arch/powerpc/include/asm/qe.h | |||
@@ -17,6 +17,8 @@ | |||
17 | #ifdef __KERNEL__ | 17 | #ifdef __KERNEL__ |
18 | 18 | ||
19 | #include <linux/spinlock.h> | 19 | #include <linux/spinlock.h> |
20 | #include <linux/errno.h> | ||
21 | #include <linux/err.h> | ||
20 | #include <asm/cpm.h> | 22 | #include <asm/cpm.h> |
21 | #include <asm/immap_qe.h> | 23 | #include <asm/immap_qe.h> |
22 | 24 | ||
@@ -84,7 +86,11 @@ static inline bool qe_clock_is_brg(enum qe_clock clk) | |||
84 | extern spinlock_t cmxgcr_lock; | 86 | extern spinlock_t cmxgcr_lock; |
85 | 87 | ||
86 | /* Export QE common operations */ | 88 | /* Export QE common operations */ |
89 | #ifdef CONFIG_QUICC_ENGINE | ||
87 | extern void __init qe_reset(void); | 90 | extern void __init qe_reset(void); |
91 | #else | ||
92 | static inline void qe_reset(void) {} | ||
93 | #endif | ||
88 | 94 | ||
89 | /* QE PIO */ | 95 | /* QE PIO */ |
90 | #define QE_PIO_PINS 32 | 96 | #define QE_PIO_PINS 32 |
@@ -101,16 +107,43 @@ struct qe_pio_regs { | |||
101 | #endif | 107 | #endif |
102 | }; | 108 | }; |
103 | 109 | ||
104 | extern int par_io_init(struct device_node *np); | ||
105 | extern int par_io_of_config(struct device_node *np); | ||
106 | #define QE_PIO_DIR_IN 2 | 110 | #define QE_PIO_DIR_IN 2 |
107 | #define QE_PIO_DIR_OUT 1 | 111 | #define QE_PIO_DIR_OUT 1 |
108 | extern void __par_io_config_pin(struct qe_pio_regs __iomem *par_io, u8 pin, | 112 | extern void __par_io_config_pin(struct qe_pio_regs __iomem *par_io, u8 pin, |
109 | int dir, int open_drain, int assignment, | 113 | int dir, int open_drain, int assignment, |
110 | int has_irq); | 114 | int has_irq); |
115 | #ifdef CONFIG_QUICC_ENGINE | ||
116 | extern int par_io_init(struct device_node *np); | ||
117 | extern int par_io_of_config(struct device_node *np); | ||
111 | extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain, | 118 | extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain, |
112 | int assignment, int has_irq); | 119 | int assignment, int has_irq); |
113 | extern int par_io_data_set(u8 port, u8 pin, u8 val); | 120 | extern int par_io_data_set(u8 port, u8 pin, u8 val); |
121 | #else | ||
122 | static inline int par_io_init(struct device_node *np) { return -ENOSYS; } | ||
123 | static inline int par_io_of_config(struct device_node *np) { return -ENOSYS; } | ||
124 | static inline int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain, | ||
125 | int assignment, int has_irq) { return -ENOSYS; } | ||
126 | static inline int par_io_data_set(u8 port, u8 pin, u8 val) { return -ENOSYS; } | ||
127 | #endif /* CONFIG_QUICC_ENGINE */ | ||
128 | |||
129 | /* | ||
130 | * Pin multiplexing functions. | ||
131 | */ | ||
132 | struct qe_pin; | ||
133 | #ifdef CONFIG_QE_GPIO | ||
134 | extern struct qe_pin *qe_pin_request(struct device_node *np, int index); | ||
135 | extern void qe_pin_free(struct qe_pin *qe_pin); | ||
136 | extern void qe_pin_set_gpio(struct qe_pin *qe_pin); | ||
137 | extern void qe_pin_set_dedicated(struct qe_pin *pin); | ||
138 | #else | ||
139 | static inline struct qe_pin *qe_pin_request(struct device_node *np, int index) | ||
140 | { | ||
141 | return ERR_PTR(-ENOSYS); | ||
142 | } | ||
143 | static inline void qe_pin_free(struct qe_pin *qe_pin) {} | ||
144 | static inline void qe_pin_set_gpio(struct qe_pin *qe_pin) {} | ||
145 | static inline void qe_pin_set_dedicated(struct qe_pin *pin) {} | ||
146 | #endif /* CONFIG_QE_GPIO */ | ||
114 | 147 | ||
115 | /* QE internal API */ | 148 | /* QE internal API */ |
116 | int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input); | 149 | int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input); |
diff --git a/arch/powerpc/include/asm/qe_ic.h b/arch/powerpc/include/asm/qe_ic.h index 56a7745ca343..cf519663a791 100644 --- a/arch/powerpc/include/asm/qe_ic.h +++ b/arch/powerpc/include/asm/qe_ic.h | |||
@@ -17,6 +17,9 @@ | |||
17 | 17 | ||
18 | #include <linux/irq.h> | 18 | #include <linux/irq.h> |
19 | 19 | ||
20 | struct device_node; | ||
21 | struct qe_ic; | ||
22 | |||
20 | #define NUM_OF_QE_IC_GROUPS 6 | 23 | #define NUM_OF_QE_IC_GROUPS 6 |
21 | 24 | ||
22 | /* Flags when we init the QE IC */ | 25 | /* Flags when we init the QE IC */ |
@@ -54,17 +57,27 @@ enum qe_ic_grp_id { | |||
54 | QE_IC_GRP_RISCB /* QE interrupt controller RISC group B */ | 57 | QE_IC_GRP_RISCB /* QE interrupt controller RISC group B */ |
55 | }; | 58 | }; |
56 | 59 | ||
60 | #ifdef CONFIG_QUICC_ENGINE | ||
57 | void qe_ic_init(struct device_node *node, unsigned int flags, | 61 | void qe_ic_init(struct device_node *node, unsigned int flags, |
58 | void (*low_handler)(unsigned int irq, struct irq_desc *desc), | 62 | void (*low_handler)(unsigned int irq, struct irq_desc *desc), |
59 | void (*high_handler)(unsigned int irq, struct irq_desc *desc)); | 63 | void (*high_handler)(unsigned int irq, struct irq_desc *desc)); |
64 | unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic); | ||
65 | unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic); | ||
66 | #else | ||
67 | static inline void qe_ic_init(struct device_node *node, unsigned int flags, | ||
68 | void (*low_handler)(unsigned int irq, struct irq_desc *desc), | ||
69 | void (*high_handler)(unsigned int irq, struct irq_desc *desc)) | ||
70 | {} | ||
71 | static inline unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic) | ||
72 | { return 0; } | ||
73 | static inline unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic) | ||
74 | { return 0; } | ||
75 | #endif /* CONFIG_QUICC_ENGINE */ | ||
76 | |||
60 | void qe_ic_set_highest_priority(unsigned int virq, int high); | 77 | void qe_ic_set_highest_priority(unsigned int virq, int high); |
61 | int qe_ic_set_priority(unsigned int virq, unsigned int priority); | 78 | int qe_ic_set_priority(unsigned int virq, unsigned int priority); |
62 | int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high); | 79 | int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high); |
63 | 80 | ||
64 | struct qe_ic; | ||
65 | unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic); | ||
66 | unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic); | ||
67 | |||
68 | static inline void qe_ic_cascade_low_ipic(unsigned int irq, | 81 | static inline void qe_ic_cascade_low_ipic(unsigned int irq, |
69 | struct irq_desc *desc) | 82 | struct irq_desc *desc) |
70 | { | 83 | { |
diff --git a/arch/powerpc/include/asm/spu.h b/arch/powerpc/include/asm/spu.h index 8b2eb044270a..0ab8d869e3d6 100644 --- a/arch/powerpc/include/asm/spu.h +++ b/arch/powerpc/include/asm/spu.h | |||
@@ -128,7 +128,7 @@ struct spu { | |||
128 | int number; | 128 | int number; |
129 | unsigned int irqs[3]; | 129 | unsigned int irqs[3]; |
130 | u32 node; | 130 | u32 node; |
131 | u64 flags; | 131 | unsigned long flags; |
132 | u64 class_0_pending; | 132 | u64 class_0_pending; |
133 | u64 class_0_dar; | 133 | u64 class_0_dar; |
134 | u64 class_1_dar; | 134 | u64 class_1_dar; |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 1308a86e9070..8d1a419df35d 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -29,7 +29,7 @@ endif | |||
29 | obj-y := cputable.o ptrace.o syscalls.o \ | 29 | obj-y := cputable.o ptrace.o syscalls.o \ |
30 | irq.o align.o signal_32.o pmc.o vdso.o \ | 30 | irq.o align.o signal_32.o pmc.o vdso.o \ |
31 | init_task.o process.o systbl.o idle.o \ | 31 | init_task.o process.o systbl.o idle.o \ |
32 | signal.o sysfs.o | 32 | signal.o sysfs.o cacheinfo.o |
33 | obj-y += vdso32/ | 33 | obj-y += vdso32/ |
34 | obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ | 34 | obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ |
35 | signal_64.o ptrace32.o \ | 35 | signal_64.o ptrace32.o \ |
diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c new file mode 100644 index 000000000000..b33f0417a4bf --- /dev/null +++ b/arch/powerpc/kernel/cacheinfo.c | |||
@@ -0,0 +1,837 @@ | |||
1 | /* | ||
2 | * Processor cache information made available to userspace via sysfs; | ||
3 | * intended to be compatible with x86 intel_cacheinfo implementation. | ||
4 | * | ||
5 | * Copyright 2008 IBM Corporation | ||
6 | * Author: Nathan Lynch | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License version | ||
10 | * 2 as published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/cpu.h> | ||
14 | #include <linux/cpumask.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/kobject.h> | ||
18 | #include <linux/list.h> | ||
19 | #include <linux/notifier.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <linux/percpu.h> | ||
22 | #include <asm/prom.h> | ||
23 | |||
24 | #include "cacheinfo.h" | ||
25 | |||
26 | /* per-cpu object for tracking: | ||
27 | * - a "cache" kobject for the top-level directory | ||
28 | * - a list of "index" objects representing the cpu's local cache hierarchy | ||
29 | */ | ||
30 | struct cache_dir { | ||
31 | struct kobject *kobj; /* bare (not embedded) kobject for cache | ||
32 | * directory */ | ||
33 | struct cache_index_dir *index; /* list of index objects */ | ||
34 | }; | ||
35 | |||
36 | /* "index" object: each cpu's cache directory has an index | ||
37 | * subdirectory corresponding to a cache object associated with the | ||
38 | * cpu. This object's lifetime is managed via the embedded kobject. | ||
39 | */ | ||
40 | struct cache_index_dir { | ||
41 | struct kobject kobj; | ||
42 | struct cache_index_dir *next; /* next index in parent directory */ | ||
43 | struct cache *cache; | ||
44 | }; | ||
45 | |||
46 | /* Template for determining which OF properties to query for a given | ||
47 | * cache type */ | ||
48 | struct cache_type_info { | ||
49 | const char *name; | ||
50 | const char *size_prop; | ||
51 | |||
52 | /* Allow for both [di]-cache-line-size and | ||
53 | * [di]-cache-block-size properties. According to the PowerPC | ||
54 | * Processor binding, -line-size should be provided if it | ||
55 | * differs from the cache block size (that which is operated | ||
56 | * on by cache instructions), so we look for -line-size first. | ||
57 | * See cache_get_line_size(). */ | ||
58 | |||
59 | const char *line_size_props[2]; | ||
60 | const char *nr_sets_prop; | ||
61 | }; | ||
62 | |||
63 | /* These are used to index the cache_type_info array. */ | ||
64 | #define CACHE_TYPE_UNIFIED 0 | ||
65 | #define CACHE_TYPE_INSTRUCTION 1 | ||
66 | #define CACHE_TYPE_DATA 2 | ||
67 | |||
68 | static const struct cache_type_info cache_type_info[] = { | ||
69 | { | ||
70 | /* PowerPC Processor binding says the [di]-cache-* | ||
71 | * must be equal on unified caches, so just use | ||
72 | * d-cache properties. */ | ||
73 | .name = "Unified", | ||
74 | .size_prop = "d-cache-size", | ||
75 | .line_size_props = { "d-cache-line-size", | ||
76 | "d-cache-block-size", }, | ||
77 | .nr_sets_prop = "d-cache-sets", | ||
78 | }, | ||
79 | { | ||
80 | .name = "Instruction", | ||
81 | .size_prop = "i-cache-size", | ||
82 | .line_size_props = { "i-cache-line-size", | ||
83 | "i-cache-block-size", }, | ||
84 | .nr_sets_prop = "i-cache-sets", | ||
85 | }, | ||
86 | { | ||
87 | .name = "Data", | ||
88 | .size_prop = "d-cache-size", | ||
89 | .line_size_props = { "d-cache-line-size", | ||
90 | "d-cache-block-size", }, | ||
91 | .nr_sets_prop = "d-cache-sets", | ||
92 | }, | ||
93 | }; | ||
94 | |||
95 | /* Cache object: each instance of this corresponds to a distinct cache | ||
96 | * in the system. There are separate objects for Harvard caches: one | ||
97 | * each for instruction and data, and each refers to the same OF node. | ||
98 | * The refcount of the OF node is elevated for the lifetime of the | ||
99 | * cache object. A cache object is released when its shared_cpu_map | ||
100 | * is cleared (see cache_cpu_clear). | ||
101 | * | ||
102 | * A cache object is on two lists: an unsorted global list | ||
103 | * (cache_list) of cache objects; and a singly-linked list | ||
104 | * representing the local cache hierarchy, which is ordered by level | ||
105 | * (e.g. L1d -> L1i -> L2 -> L3). | ||
106 | */ | ||
107 | struct cache { | ||
108 | struct device_node *ofnode; /* OF node for this cache, may be cpu */ | ||
109 | struct cpumask shared_cpu_map; /* online CPUs using this cache */ | ||
110 | int type; /* split cache disambiguation */ | ||
111 | int level; /* level not explicit in device tree */ | ||
112 | struct list_head list; /* global list of cache objects */ | ||
113 | struct cache *next_local; /* next cache of >= level */ | ||
114 | }; | ||
115 | |||
116 | static DEFINE_PER_CPU(struct cache_dir *, cache_dir); | ||
117 | |||
118 | /* traversal/modification of this list occurs only at cpu hotplug time; | ||
119 | * access is serialized by cpu hotplug locking | ||
120 | */ | ||
121 | static LIST_HEAD(cache_list); | ||
122 | |||
123 | static struct cache_index_dir *kobj_to_cache_index_dir(struct kobject *k) | ||
124 | { | ||
125 | return container_of(k, struct cache_index_dir, kobj); | ||
126 | } | ||
127 | |||
128 | static const char *cache_type_string(const struct cache *cache) | ||
129 | { | ||
130 | return cache_type_info[cache->type].name; | ||
131 | } | ||
132 | |||
133 | static void __cpuinit cache_init(struct cache *cache, int type, int level, struct device_node *ofnode) | ||
134 | { | ||
135 | cache->type = type; | ||
136 | cache->level = level; | ||
137 | cache->ofnode = of_node_get(ofnode); | ||
138 | INIT_LIST_HEAD(&cache->list); | ||
139 | list_add(&cache->list, &cache_list); | ||
140 | } | ||
141 | |||
142 | static struct cache *__cpuinit new_cache(int type, int level, struct device_node *ofnode) | ||
143 | { | ||
144 | struct cache *cache; | ||
145 | |||
146 | cache = kzalloc(sizeof(*cache), GFP_KERNEL); | ||
147 | if (cache) | ||
148 | cache_init(cache, type, level, ofnode); | ||
149 | |||
150 | return cache; | ||
151 | } | ||
152 | |||
153 | static void release_cache_debugcheck(struct cache *cache) | ||
154 | { | ||
155 | struct cache *iter; | ||
156 | |||
157 | list_for_each_entry(iter, &cache_list, list) | ||
158 | WARN_ONCE(iter->next_local == cache, | ||
159 | "cache for %s(%s) refers to cache for %s(%s)\n", | ||
160 | iter->ofnode->full_name, | ||
161 | cache_type_string(iter), | ||
162 | cache->ofnode->full_name, | ||
163 | cache_type_string(cache)); | ||
164 | } | ||
165 | |||
166 | static void release_cache(struct cache *cache) | ||
167 | { | ||
168 | if (!cache) | ||
169 | return; | ||
170 | |||
171 | pr_debug("freeing L%d %s cache for %s\n", cache->level, | ||
172 | cache_type_string(cache), cache->ofnode->full_name); | ||
173 | |||
174 | release_cache_debugcheck(cache); | ||
175 | list_del(&cache->list); | ||
176 | of_node_put(cache->ofnode); | ||
177 | kfree(cache); | ||
178 | } | ||
179 | |||
180 | static void cache_cpu_set(struct cache *cache, int cpu) | ||
181 | { | ||
182 | struct cache *next = cache; | ||
183 | |||
184 | while (next) { | ||
185 | WARN_ONCE(cpumask_test_cpu(cpu, &next->shared_cpu_map), | ||
186 | "CPU %i already accounted in %s(%s)\n", | ||
187 | cpu, next->ofnode->full_name, | ||
188 | cache_type_string(next)); | ||
189 | cpumask_set_cpu(cpu, &next->shared_cpu_map); | ||
190 | next = next->next_local; | ||
191 | } | ||
192 | } | ||
193 | |||
194 | static int cache_size(const struct cache *cache, unsigned int *ret) | ||
195 | { | ||
196 | const char *propname; | ||
197 | const u32 *cache_size; | ||
198 | |||
199 | propname = cache_type_info[cache->type].size_prop; | ||
200 | |||
201 | cache_size = of_get_property(cache->ofnode, propname, NULL); | ||
202 | if (!cache_size) | ||
203 | return -ENODEV; | ||
204 | |||
205 | *ret = *cache_size; | ||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | static int cache_size_kb(const struct cache *cache, unsigned int *ret) | ||
210 | { | ||
211 | unsigned int size; | ||
212 | |||
213 | if (cache_size(cache, &size)) | ||
214 | return -ENODEV; | ||
215 | |||
216 | *ret = size / 1024; | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | /* not cache_line_size() because that's a macro in include/linux/cache.h */ | ||
221 | static int cache_get_line_size(const struct cache *cache, unsigned int *ret) | ||
222 | { | ||
223 | const u32 *line_size; | ||
224 | int i, lim; | ||
225 | |||
226 | lim = ARRAY_SIZE(cache_type_info[cache->type].line_size_props); | ||
227 | |||
228 | for (i = 0; i < lim; i++) { | ||
229 | const char *propname; | ||
230 | |||
231 | propname = cache_type_info[cache->type].line_size_props[i]; | ||
232 | line_size = of_get_property(cache->ofnode, propname, NULL); | ||
233 | if (line_size) | ||
234 | break; | ||
235 | } | ||
236 | |||
237 | if (!line_size) | ||
238 | return -ENODEV; | ||
239 | |||
240 | *ret = *line_size; | ||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static int cache_nr_sets(const struct cache *cache, unsigned int *ret) | ||
245 | { | ||
246 | const char *propname; | ||
247 | const u32 *nr_sets; | ||
248 | |||
249 | propname = cache_type_info[cache->type].nr_sets_prop; | ||
250 | |||
251 | nr_sets = of_get_property(cache->ofnode, propname, NULL); | ||
252 | if (!nr_sets) | ||
253 | return -ENODEV; | ||
254 | |||
255 | *ret = *nr_sets; | ||
256 | return 0; | ||
257 | } | ||
258 | |||
259 | static int cache_associativity(const struct cache *cache, unsigned int *ret) | ||
260 | { | ||
261 | unsigned int line_size; | ||
262 | unsigned int nr_sets; | ||
263 | unsigned int size; | ||
264 | |||
265 | if (cache_nr_sets(cache, &nr_sets)) | ||
266 | goto err; | ||
267 | |||
268 | /* If the cache is fully associative, there is no need to | ||
269 | * check the other properties. | ||
270 | */ | ||
271 | if (nr_sets == 1) { | ||
272 | *ret = 0; | ||
273 | return 0; | ||
274 | } | ||
275 | |||
276 | if (cache_get_line_size(cache, &line_size)) | ||
277 | goto err; | ||
278 | if (cache_size(cache, &size)) | ||
279 | goto err; | ||
280 | |||
281 | if (!(nr_sets > 0 && size > 0 && line_size > 0)) | ||
282 | goto err; | ||
283 | |||
284 | *ret = (size / nr_sets) / line_size; | ||
285 | return 0; | ||
286 | err: | ||
287 | return -ENODEV; | ||
288 | } | ||
289 | |||
290 | /* helper for dealing with split caches */ | ||
291 | static struct cache *cache_find_first_sibling(struct cache *cache) | ||
292 | { | ||
293 | struct cache *iter; | ||
294 | |||
295 | if (cache->type == CACHE_TYPE_UNIFIED) | ||
296 | return cache; | ||
297 | |||
298 | list_for_each_entry(iter, &cache_list, list) | ||
299 | if (iter->ofnode == cache->ofnode && iter->next_local == cache) | ||
300 | return iter; | ||
301 | |||
302 | return cache; | ||
303 | } | ||
304 | |||
305 | /* return the first cache on a local list matching node */ | ||
306 | static struct cache *cache_lookup_by_node(const struct device_node *node) | ||
307 | { | ||
308 | struct cache *cache = NULL; | ||
309 | struct cache *iter; | ||
310 | |||
311 | list_for_each_entry(iter, &cache_list, list) { | ||
312 | if (iter->ofnode != node) | ||
313 | continue; | ||
314 | cache = cache_find_first_sibling(iter); | ||
315 | break; | ||
316 | } | ||
317 | |||
318 | return cache; | ||
319 | } | ||
320 | |||
321 | static bool cache_node_is_unified(const struct device_node *np) | ||
322 | { | ||
323 | return of_get_property(np, "cache-unified", NULL); | ||
324 | } | ||
325 | |||
326 | static struct cache *__cpuinit cache_do_one_devnode_unified(struct device_node *node, int level) | ||
327 | { | ||
328 | struct cache *cache; | ||
329 | |||
330 | pr_debug("creating L%d ucache for %s\n", level, node->full_name); | ||
331 | |||
332 | cache = new_cache(CACHE_TYPE_UNIFIED, level, node); | ||
333 | |||
334 | return cache; | ||
335 | } | ||
336 | |||
337 | static struct cache *__cpuinit cache_do_one_devnode_split(struct device_node *node, int level) | ||
338 | { | ||
339 | struct cache *dcache, *icache; | ||
340 | |||
341 | pr_debug("creating L%d dcache and icache for %s\n", level, | ||
342 | node->full_name); | ||
343 | |||
344 | dcache = new_cache(CACHE_TYPE_DATA, level, node); | ||
345 | icache = new_cache(CACHE_TYPE_INSTRUCTION, level, node); | ||
346 | |||
347 | if (!dcache || !icache) | ||
348 | goto err; | ||
349 | |||
350 | dcache->next_local = icache; | ||
351 | |||
352 | return dcache; | ||
353 | err: | ||
354 | release_cache(dcache); | ||
355 | release_cache(icache); | ||
356 | return NULL; | ||
357 | } | ||
358 | |||
359 | static struct cache *__cpuinit cache_do_one_devnode(struct device_node *node, int level) | ||
360 | { | ||
361 | struct cache *cache; | ||
362 | |||
363 | if (cache_node_is_unified(node)) | ||
364 | cache = cache_do_one_devnode_unified(node, level); | ||
365 | else | ||
366 | cache = cache_do_one_devnode_split(node, level); | ||
367 | |||
368 | return cache; | ||
369 | } | ||
370 | |||
371 | static struct cache *__cpuinit cache_lookup_or_instantiate(struct device_node *node, int level) | ||
372 | { | ||
373 | struct cache *cache; | ||
374 | |||
375 | cache = cache_lookup_by_node(node); | ||
376 | |||
377 | WARN_ONCE(cache && cache->level != level, | ||
378 | "cache level mismatch on lookup (got %d, expected %d)\n", | ||
379 | cache->level, level); | ||
380 | |||
381 | if (!cache) | ||
382 | cache = cache_do_one_devnode(node, level); | ||
383 | |||
384 | return cache; | ||
385 | } | ||
386 | |||
387 | static void __cpuinit link_cache_lists(struct cache *smaller, struct cache *bigger) | ||
388 | { | ||
389 | while (smaller->next_local) { | ||
390 | if (smaller->next_local == bigger) | ||
391 | return; /* already linked */ | ||
392 | smaller = smaller->next_local; | ||
393 | } | ||
394 | |||
395 | smaller->next_local = bigger; | ||
396 | } | ||
397 | |||
398 | static void __cpuinit do_subsidiary_caches_debugcheck(struct cache *cache) | ||
399 | { | ||
400 | WARN_ON_ONCE(cache->level != 1); | ||
401 | WARN_ON_ONCE(strcmp(cache->ofnode->type, "cpu")); | ||
402 | } | ||
403 | |||
404 | static void __cpuinit do_subsidiary_caches(struct cache *cache) | ||
405 | { | ||
406 | struct device_node *subcache_node; | ||
407 | int level = cache->level; | ||
408 | |||
409 | do_subsidiary_caches_debugcheck(cache); | ||
410 | |||
411 | while ((subcache_node = of_find_next_cache_node(cache->ofnode))) { | ||
412 | struct cache *subcache; | ||
413 | |||
414 | level++; | ||
415 | subcache = cache_lookup_or_instantiate(subcache_node, level); | ||
416 | of_node_put(subcache_node); | ||
417 | if (!subcache) | ||
418 | break; | ||
419 | |||
420 | link_cache_lists(cache, subcache); | ||
421 | cache = subcache; | ||
422 | } | ||
423 | } | ||
424 | |||
425 | static struct cache *__cpuinit cache_chain_instantiate(unsigned int cpu_id) | ||
426 | { | ||
427 | struct device_node *cpu_node; | ||
428 | struct cache *cpu_cache = NULL; | ||
429 | |||
430 | pr_debug("creating cache object(s) for CPU %i\n", cpu_id); | ||
431 | |||
432 | cpu_node = of_get_cpu_node(cpu_id, NULL); | ||
433 | WARN_ONCE(!cpu_node, "no OF node found for CPU %i\n", cpu_id); | ||
434 | if (!cpu_node) | ||
435 | goto out; | ||
436 | |||
437 | cpu_cache = cache_lookup_or_instantiate(cpu_node, 1); | ||
438 | if (!cpu_cache) | ||
439 | goto out; | ||
440 | |||
441 | do_subsidiary_caches(cpu_cache); | ||
442 | |||
443 | cache_cpu_set(cpu_cache, cpu_id); | ||
444 | out: | ||
445 | of_node_put(cpu_node); | ||
446 | |||
447 | return cpu_cache; | ||
448 | } | ||
449 | |||
450 | static struct cache_dir *__cpuinit cacheinfo_create_cache_dir(unsigned int cpu_id) | ||
451 | { | ||
452 | struct cache_dir *cache_dir; | ||
453 | struct sys_device *sysdev; | ||
454 | struct kobject *kobj = NULL; | ||
455 | |||
456 | sysdev = get_cpu_sysdev(cpu_id); | ||
457 | WARN_ONCE(!sysdev, "no sysdev for CPU %i\n", cpu_id); | ||
458 | if (!sysdev) | ||
459 | goto err; | ||
460 | |||
461 | kobj = kobject_create_and_add("cache", &sysdev->kobj); | ||
462 | if (!kobj) | ||
463 | goto err; | ||
464 | |||
465 | cache_dir = kzalloc(sizeof(*cache_dir), GFP_KERNEL); | ||
466 | if (!cache_dir) | ||
467 | goto err; | ||
468 | |||
469 | cache_dir->kobj = kobj; | ||
470 | |||
471 | WARN_ON_ONCE(per_cpu(cache_dir, cpu_id) != NULL); | ||
472 | |||
473 | per_cpu(cache_dir, cpu_id) = cache_dir; | ||
474 | |||
475 | return cache_dir; | ||
476 | err: | ||
477 | kobject_put(kobj); | ||
478 | return NULL; | ||
479 | } | ||
480 | |||
481 | static void cache_index_release(struct kobject *kobj) | ||
482 | { | ||
483 | struct cache_index_dir *index; | ||
484 | |||
485 | index = kobj_to_cache_index_dir(kobj); | ||
486 | |||
487 | pr_debug("freeing index directory for L%d %s cache\n", | ||
488 | index->cache->level, cache_type_string(index->cache)); | ||
489 | |||
490 | kfree(index); | ||
491 | } | ||
492 | |||
493 | static ssize_t cache_index_show(struct kobject *k, struct attribute *attr, char *buf) | ||
494 | { | ||
495 | struct kobj_attribute *kobj_attr; | ||
496 | |||
497 | kobj_attr = container_of(attr, struct kobj_attribute, attr); | ||
498 | |||
499 | return kobj_attr->show(k, kobj_attr, buf); | ||
500 | } | ||
501 | |||
502 | static struct cache *index_kobj_to_cache(struct kobject *k) | ||
503 | { | ||
504 | struct cache_index_dir *index; | ||
505 | |||
506 | index = kobj_to_cache_index_dir(k); | ||
507 | |||
508 | return index->cache; | ||
509 | } | ||
510 | |||
511 | static ssize_t size_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
512 | { | ||
513 | unsigned int size_kb; | ||
514 | struct cache *cache; | ||
515 | |||
516 | cache = index_kobj_to_cache(k); | ||
517 | |||
518 | if (cache_size_kb(cache, &size_kb)) | ||
519 | return -ENODEV; | ||
520 | |||
521 | return sprintf(buf, "%uK\n", size_kb); | ||
522 | } | ||
523 | |||
524 | static struct kobj_attribute cache_size_attr = | ||
525 | __ATTR(size, 0444, size_show, NULL); | ||
526 | |||
527 | |||
528 | static ssize_t line_size_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
529 | { | ||
530 | unsigned int line_size; | ||
531 | struct cache *cache; | ||
532 | |||
533 | cache = index_kobj_to_cache(k); | ||
534 | |||
535 | if (cache_get_line_size(cache, &line_size)) | ||
536 | return -ENODEV; | ||
537 | |||
538 | return sprintf(buf, "%u\n", line_size); | ||
539 | } | ||
540 | |||
541 | static struct kobj_attribute cache_line_size_attr = | ||
542 | __ATTR(coherency_line_size, 0444, line_size_show, NULL); | ||
543 | |||
544 | static ssize_t nr_sets_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
545 | { | ||
546 | unsigned int nr_sets; | ||
547 | struct cache *cache; | ||
548 | |||
549 | cache = index_kobj_to_cache(k); | ||
550 | |||
551 | if (cache_nr_sets(cache, &nr_sets)) | ||
552 | return -ENODEV; | ||
553 | |||
554 | return sprintf(buf, "%u\n", nr_sets); | ||
555 | } | ||
556 | |||
557 | static struct kobj_attribute cache_nr_sets_attr = | ||
558 | __ATTR(number_of_sets, 0444, nr_sets_show, NULL); | ||
559 | |||
560 | static ssize_t associativity_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
561 | { | ||
562 | unsigned int associativity; | ||
563 | struct cache *cache; | ||
564 | |||
565 | cache = index_kobj_to_cache(k); | ||
566 | |||
567 | if (cache_associativity(cache, &associativity)) | ||
568 | return -ENODEV; | ||
569 | |||
570 | return sprintf(buf, "%u\n", associativity); | ||
571 | } | ||
572 | |||
573 | static struct kobj_attribute cache_assoc_attr = | ||
574 | __ATTR(ways_of_associativity, 0444, associativity_show, NULL); | ||
575 | |||
576 | static ssize_t type_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
577 | { | ||
578 | struct cache *cache; | ||
579 | |||
580 | cache = index_kobj_to_cache(k); | ||
581 | |||
582 | return sprintf(buf, "%s\n", cache_type_string(cache)); | ||
583 | } | ||
584 | |||
585 | static struct kobj_attribute cache_type_attr = | ||
586 | __ATTR(type, 0444, type_show, NULL); | ||
587 | |||
588 | static ssize_t level_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
589 | { | ||
590 | struct cache_index_dir *index; | ||
591 | struct cache *cache; | ||
592 | |||
593 | index = kobj_to_cache_index_dir(k); | ||
594 | cache = index->cache; | ||
595 | |||
596 | return sprintf(buf, "%d\n", cache->level); | ||
597 | } | ||
598 | |||
599 | static struct kobj_attribute cache_level_attr = | ||
600 | __ATTR(level, 0444, level_show, NULL); | ||
601 | |||
602 | static ssize_t shared_cpu_map_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
603 | { | ||
604 | struct cache_index_dir *index; | ||
605 | struct cache *cache; | ||
606 | int len; | ||
607 | int n = 0; | ||
608 | |||
609 | index = kobj_to_cache_index_dir(k); | ||
610 | cache = index->cache; | ||
611 | len = PAGE_SIZE - 2; | ||
612 | |||
613 | if (len > 1) { | ||
614 | n = cpumask_scnprintf(buf, len, &cache->shared_cpu_map); | ||
615 | buf[n++] = '\n'; | ||
616 | buf[n] = '\0'; | ||
617 | } | ||
618 | return n; | ||
619 | } | ||
620 | |||
621 | static struct kobj_attribute cache_shared_cpu_map_attr = | ||
622 | __ATTR(shared_cpu_map, 0444, shared_cpu_map_show, NULL); | ||
623 | |||
624 | /* Attributes which should always be created -- the kobject/sysfs core | ||
625 | * does this automatically via kobj_type->default_attrs. This is the | ||
626 | * minimum data required to uniquely identify a cache. | ||
627 | */ | ||
628 | static struct attribute *cache_index_default_attrs[] = { | ||
629 | &cache_type_attr.attr, | ||
630 | &cache_level_attr.attr, | ||
631 | &cache_shared_cpu_map_attr.attr, | ||
632 | NULL, | ||
633 | }; | ||
634 | |||
635 | /* Attributes which should be created if the cache device node has the | ||
636 | * right properties -- see cacheinfo_create_index_opt_attrs | ||
637 | */ | ||
638 | static struct kobj_attribute *cache_index_opt_attrs[] = { | ||
639 | &cache_size_attr, | ||
640 | &cache_line_size_attr, | ||
641 | &cache_nr_sets_attr, | ||
642 | &cache_assoc_attr, | ||
643 | }; | ||
644 | |||
645 | static struct sysfs_ops cache_index_ops = { | ||
646 | .show = cache_index_show, | ||
647 | }; | ||
648 | |||
649 | static struct kobj_type cache_index_type = { | ||
650 | .release = cache_index_release, | ||
651 | .sysfs_ops = &cache_index_ops, | ||
652 | .default_attrs = cache_index_default_attrs, | ||
653 | }; | ||
654 | |||
655 | static void __cpuinit cacheinfo_create_index_opt_attrs(struct cache_index_dir *dir) | ||
656 | { | ||
657 | const char *cache_name; | ||
658 | const char *cache_type; | ||
659 | struct cache *cache; | ||
660 | char *buf; | ||
661 | int i; | ||
662 | |||
663 | buf = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
664 | if (!buf) | ||
665 | return; | ||
666 | |||
667 | cache = dir->cache; | ||
668 | cache_name = cache->ofnode->full_name; | ||
669 | cache_type = cache_type_string(cache); | ||
670 | |||
671 | /* We don't want to create an attribute that can't provide a | ||
672 | * meaningful value. Check the return value of each optional | ||
673 | * attribute's ->show method before registering the | ||
674 | * attribute. | ||
675 | */ | ||
676 | for (i = 0; i < ARRAY_SIZE(cache_index_opt_attrs); i++) { | ||
677 | struct kobj_attribute *attr; | ||
678 | ssize_t rc; | ||
679 | |||
680 | attr = cache_index_opt_attrs[i]; | ||
681 | |||
682 | rc = attr->show(&dir->kobj, attr, buf); | ||
683 | if (rc <= 0) { | ||
684 | pr_debug("not creating %s attribute for " | ||
685 | "%s(%s) (rc = %zd)\n", | ||
686 | attr->attr.name, cache_name, | ||
687 | cache_type, rc); | ||
688 | continue; | ||
689 | } | ||
690 | if (sysfs_create_file(&dir->kobj, &attr->attr)) | ||
691 | pr_debug("could not create %s attribute for %s(%s)\n", | ||
692 | attr->attr.name, cache_name, cache_type); | ||
693 | } | ||
694 | |||
695 | kfree(buf); | ||
696 | } | ||
697 | |||
698 | static void __cpuinit cacheinfo_create_index_dir(struct cache *cache, int index, struct cache_dir *cache_dir) | ||
699 | { | ||
700 | struct cache_index_dir *index_dir; | ||
701 | int rc; | ||
702 | |||
703 | index_dir = kzalloc(sizeof(*index_dir), GFP_KERNEL); | ||
704 | if (!index_dir) | ||
705 | goto err; | ||
706 | |||
707 | index_dir->cache = cache; | ||
708 | |||
709 | rc = kobject_init_and_add(&index_dir->kobj, &cache_index_type, | ||
710 | cache_dir->kobj, "index%d", index); | ||
711 | if (rc) | ||
712 | goto err; | ||
713 | |||
714 | index_dir->next = cache_dir->index; | ||
715 | cache_dir->index = index_dir; | ||
716 | |||
717 | cacheinfo_create_index_opt_attrs(index_dir); | ||
718 | |||
719 | return; | ||
720 | err: | ||
721 | kfree(index_dir); | ||
722 | } | ||
723 | |||
724 | static void __cpuinit cacheinfo_sysfs_populate(unsigned int cpu_id, struct cache *cache_list) | ||
725 | { | ||
726 | struct cache_dir *cache_dir; | ||
727 | struct cache *cache; | ||
728 | int index = 0; | ||
729 | |||
730 | cache_dir = cacheinfo_create_cache_dir(cpu_id); | ||
731 | if (!cache_dir) | ||
732 | return; | ||
733 | |||
734 | cache = cache_list; | ||
735 | while (cache) { | ||
736 | cacheinfo_create_index_dir(cache, index, cache_dir); | ||
737 | index++; | ||
738 | cache = cache->next_local; | ||
739 | } | ||
740 | } | ||
741 | |||
742 | void __cpuinit cacheinfo_cpu_online(unsigned int cpu_id) | ||
743 | { | ||
744 | struct cache *cache; | ||
745 | |||
746 | cache = cache_chain_instantiate(cpu_id); | ||
747 | if (!cache) | ||
748 | return; | ||
749 | |||
750 | cacheinfo_sysfs_populate(cpu_id, cache); | ||
751 | } | ||
752 | |||
753 | #ifdef CONFIG_HOTPLUG_CPU /* functions needed for cpu offline */ | ||
754 | |||
755 | static struct cache *cache_lookup_by_cpu(unsigned int cpu_id) | ||
756 | { | ||
757 | struct device_node *cpu_node; | ||
758 | struct cache *cache; | ||
759 | |||
760 | cpu_node = of_get_cpu_node(cpu_id, NULL); | ||
761 | WARN_ONCE(!cpu_node, "no OF node found for CPU %i\n", cpu_id); | ||
762 | if (!cpu_node) | ||
763 | return NULL; | ||
764 | |||
765 | cache = cache_lookup_by_node(cpu_node); | ||
766 | of_node_put(cpu_node); | ||
767 | |||
768 | return cache; | ||
769 | } | ||
770 | |||
771 | static void remove_index_dirs(struct cache_dir *cache_dir) | ||
772 | { | ||
773 | struct cache_index_dir *index; | ||
774 | |||
775 | index = cache_dir->index; | ||
776 | |||
777 | while (index) { | ||
778 | struct cache_index_dir *next; | ||
779 | |||
780 | next = index->next; | ||
781 | kobject_put(&index->kobj); | ||
782 | index = next; | ||
783 | } | ||
784 | } | ||
785 | |||
786 | static void remove_cache_dir(struct cache_dir *cache_dir) | ||
787 | { | ||
788 | remove_index_dirs(cache_dir); | ||
789 | |||
790 | kobject_put(cache_dir->kobj); | ||
791 | |||
792 | kfree(cache_dir); | ||
793 | } | ||
794 | |||
795 | static void cache_cpu_clear(struct cache *cache, int cpu) | ||
796 | { | ||
797 | while (cache) { | ||
798 | struct cache *next = cache->next_local; | ||
799 | |||
800 | WARN_ONCE(!cpumask_test_cpu(cpu, &cache->shared_cpu_map), | ||
801 | "CPU %i not accounted in %s(%s)\n", | ||
802 | cpu, cache->ofnode->full_name, | ||
803 | cache_type_string(cache)); | ||
804 | |||
805 | cpumask_clear_cpu(cpu, &cache->shared_cpu_map); | ||
806 | |||
807 | /* Release the cache object if all the cpus using it | ||
808 | * are offline */ | ||
809 | if (cpumask_empty(&cache->shared_cpu_map)) | ||
810 | release_cache(cache); | ||
811 | |||
812 | cache = next; | ||
813 | } | ||
814 | } | ||
815 | |||
816 | void cacheinfo_cpu_offline(unsigned int cpu_id) | ||
817 | { | ||
818 | struct cache_dir *cache_dir; | ||
819 | struct cache *cache; | ||
820 | |||
821 | /* Prevent userspace from seeing inconsistent state - remove | ||
822 | * the sysfs hierarchy first */ | ||
823 | cache_dir = per_cpu(cache_dir, cpu_id); | ||
824 | |||
825 | /* careful, sysfs population may have failed */ | ||
826 | if (cache_dir) | ||
827 | remove_cache_dir(cache_dir); | ||
828 | |||
829 | per_cpu(cache_dir, cpu_id) = NULL; | ||
830 | |||
831 | /* clear the CPU's bit in its cache chain, possibly freeing | ||
832 | * cache objects */ | ||
833 | cache = cache_lookup_by_cpu(cpu_id); | ||
834 | if (cache) | ||
835 | cache_cpu_clear(cache, cpu_id); | ||
836 | } | ||
837 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
diff --git a/arch/powerpc/kernel/cacheinfo.h b/arch/powerpc/kernel/cacheinfo.h new file mode 100644 index 000000000000..a7b74d36acd7 --- /dev/null +++ b/arch/powerpc/kernel/cacheinfo.h | |||
@@ -0,0 +1,8 @@ | |||
1 | #ifndef _PPC_CACHEINFO_H | ||
2 | #define _PPC_CACHEINFO_H | ||
3 | |||
4 | /* These are just hooks for sysfs.c to use. */ | ||
5 | extern void cacheinfo_cpu_online(unsigned int cpu_id); | ||
6 | extern void cacheinfo_cpu_offline(unsigned int cpu_id); | ||
7 | |||
8 | #endif /* _PPC_CACHEINFO_H */ | ||
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 2538030954d8..da5a3855a0c4 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -16,7 +16,7 @@ | |||
16 | * 2 of the License, or (at your option) any later version. | 16 | * 2 of the License, or (at your option) any later version. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #undef DEBUG | 19 | #define DEBUG |
20 | 20 | ||
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/pci.h> | 22 | #include <linux/pci.h> |
@@ -1356,6 +1356,63 @@ static void __init pcibios_allocate_resources(int pass) | |||
1356 | } | 1356 | } |
1357 | } | 1357 | } |
1358 | 1358 | ||
1359 | static void __init pcibios_reserve_legacy_regions(struct pci_bus *bus) | ||
1360 | { | ||
1361 | struct pci_controller *hose = pci_bus_to_host(bus); | ||
1362 | resource_size_t offset; | ||
1363 | struct resource *res, *pres; | ||
1364 | int i; | ||
1365 | |||
1366 | pr_debug("Reserving legacy ranges for domain %04x\n", pci_domain_nr(bus)); | ||
1367 | |||
1368 | /* Check for IO */ | ||
1369 | if (!(hose->io_resource.flags & IORESOURCE_IO)) | ||
1370 | goto no_io; | ||
1371 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
1372 | res = kzalloc(sizeof(struct resource), GFP_KERNEL); | ||
1373 | BUG_ON(res == NULL); | ||
1374 | res->name = "Legacy IO"; | ||
1375 | res->flags = IORESOURCE_IO; | ||
1376 | res->start = offset; | ||
1377 | res->end = (offset + 0xfff) & 0xfffffffful; | ||
1378 | pr_debug("Candidate legacy IO: %pR\n", res); | ||
1379 | if (request_resource(&hose->io_resource, res)) { | ||
1380 | printk(KERN_DEBUG | ||
1381 | "PCI %04x:%02x Cannot reserve Legacy IO %pR\n", | ||
1382 | pci_domain_nr(bus), bus->number, res); | ||
1383 | kfree(res); | ||
1384 | } | ||
1385 | |||
1386 | no_io: | ||
1387 | /* Check for memory */ | ||
1388 | offset = hose->pci_mem_offset; | ||
1389 | pr_debug("hose mem offset: %016llx\n", (unsigned long long)offset); | ||
1390 | for (i = 0; i < 3; i++) { | ||
1391 | pres = &hose->mem_resources[i]; | ||
1392 | if (!(pres->flags & IORESOURCE_MEM)) | ||
1393 | continue; | ||
1394 | pr_debug("hose mem res: %pR\n", pres); | ||
1395 | if ((pres->start - offset) <= 0xa0000 && | ||
1396 | (pres->end - offset) >= 0xbffff) | ||
1397 | break; | ||
1398 | } | ||
1399 | if (i >= 3) | ||
1400 | return; | ||
1401 | res = kzalloc(sizeof(struct resource), GFP_KERNEL); | ||
1402 | BUG_ON(res == NULL); | ||
1403 | res->name = "Legacy VGA memory"; | ||
1404 | res->flags = IORESOURCE_MEM; | ||
1405 | res->start = 0xa0000 + offset; | ||
1406 | res->end = 0xbffff + offset; | ||
1407 | pr_debug("Candidate VGA memory: %pR\n", res); | ||
1408 | if (request_resource(pres, res)) { | ||
1409 | printk(KERN_DEBUG | ||
1410 | "PCI %04x:%02x Cannot reserve VGA memory %pR\n", | ||
1411 | pci_domain_nr(bus), bus->number, res); | ||
1412 | kfree(res); | ||
1413 | } | ||
1414 | } | ||
1415 | |||
1359 | void __init pcibios_resource_survey(void) | 1416 | void __init pcibios_resource_survey(void) |
1360 | { | 1417 | { |
1361 | struct pci_bus *b; | 1418 | struct pci_bus *b; |
@@ -1371,6 +1428,18 @@ void __init pcibios_resource_survey(void) | |||
1371 | pcibios_allocate_resources(1); | 1428 | pcibios_allocate_resources(1); |
1372 | } | 1429 | } |
1373 | 1430 | ||
1431 | /* Before we start assigning unassigned resource, we try to reserve | ||
1432 | * the low IO area and the VGA memory area if they intersect the | ||
1433 | * bus available resources to avoid allocating things on top of them | ||
1434 | */ | ||
1435 | if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) { | ||
1436 | list_for_each_entry(b, &pci_root_buses, node) | ||
1437 | pcibios_reserve_legacy_regions(b); | ||
1438 | } | ||
1439 | |||
1440 | /* Now, if the platform didn't decide to blindly trust the firmware, | ||
1441 | * we proceed to assigning things that were left unassigned | ||
1442 | */ | ||
1374 | if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) { | 1443 | if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) { |
1375 | pr_debug("PCI: Assigning unassigned resouces...\n"); | 1444 | pr_debug("PCI: Assigning unassigned resouces...\n"); |
1376 | pci_assign_unassigned_resources(); | 1445 | pci_assign_unassigned_resources(); |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 39fadc6e1492..586962f65c2a 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -560,9 +560,14 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus, | |||
560 | * G5 machines... So when something asks for bus 0 io base | 560 | * G5 machines... So when something asks for bus 0 io base |
561 | * (bus 0 is HT root), we return the AGP one instead. | 561 | * (bus 0 is HT root), we return the AGP one instead. |
562 | */ | 562 | */ |
563 | if (machine_is_compatible("MacRISC4")) | 563 | if (in_bus == 0 && machine_is_compatible("MacRISC4")) { |
564 | if (in_bus == 0) | 564 | struct device_node *agp; |
565 | |||
566 | agp = of_find_compatible_node(NULL, NULL, "u3-agp"); | ||
567 | if (agp) | ||
565 | in_bus = 0xf0; | 568 | in_bus = 0xf0; |
569 | of_node_put(agp); | ||
570 | } | ||
566 | 571 | ||
567 | /* That syscall isn't quite compatible with PCI domains, but it's | 572 | /* That syscall isn't quite compatible with PCI domains, but it's |
568 | * used on pre-domains setup. We return the first match | 573 | * used on pre-domains setup. We return the first match |
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index dcec1325d340..c8b27bb4dbde 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -165,6 +165,7 @@ EXPORT_SYMBOL(timer_interrupt); | |||
165 | EXPORT_SYMBOL(irq_desc); | 165 | EXPORT_SYMBOL(irq_desc); |
166 | EXPORT_SYMBOL(tb_ticks_per_jiffy); | 166 | EXPORT_SYMBOL(tb_ticks_per_jiffy); |
167 | EXPORT_SYMBOL(cacheable_memcpy); | 167 | EXPORT_SYMBOL(cacheable_memcpy); |
168 | EXPORT_SYMBOL(cacheable_memzero); | ||
168 | #endif | 169 | #endif |
169 | 170 | ||
170 | #ifdef CONFIG_PPC32 | 171 | #ifdef CONFIG_PPC32 |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 6f73c739f1e2..c09cffafb6ee 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -824,11 +824,11 @@ static int __init early_init_dt_scan_chosen(unsigned long node, | |||
824 | #endif | 824 | #endif |
825 | 825 | ||
826 | #ifdef CONFIG_KEXEC | 826 | #ifdef CONFIG_KEXEC |
827 | lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL); | 827 | lprop = of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL); |
828 | if (lprop) | 828 | if (lprop) |
829 | crashk_res.start = *lprop; | 829 | crashk_res.start = *lprop; |
830 | 830 | ||
831 | lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL); | 831 | lprop = of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL); |
832 | if (lprop) | 832 | if (lprop) |
833 | crashk_res.end = crashk_res.start + *lprop - 1; | 833 | crashk_res.end = crashk_res.start + *lprop - 1; |
834 | #endif | 834 | #endif |
@@ -893,12 +893,12 @@ static int __init early_init_dt_scan_drconf_memory(unsigned long node) | |||
893 | u64 base, size, lmb_size; | 893 | u64 base, size, lmb_size; |
894 | unsigned int is_kexec_kdump = 0, rngs; | 894 | unsigned int is_kexec_kdump = 0, rngs; |
895 | 895 | ||
896 | ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l); | 896 | ls = of_get_flat_dt_prop(node, "ibm,lmb-size", &l); |
897 | if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t)) | 897 | if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t)) |
898 | return 0; | 898 | return 0; |
899 | lmb_size = dt_mem_next_cell(dt_root_size_cells, &ls); | 899 | lmb_size = dt_mem_next_cell(dt_root_size_cells, &ls); |
900 | 900 | ||
901 | dm = (cell_t *)of_get_flat_dt_prop(node, "ibm,dynamic-memory", &l); | 901 | dm = of_get_flat_dt_prop(node, "ibm,dynamic-memory", &l); |
902 | if (dm == NULL || l < sizeof(cell_t)) | 902 | if (dm == NULL || l < sizeof(cell_t)) |
903 | return 0; | 903 | return 0; |
904 | 904 | ||
@@ -907,7 +907,7 @@ static int __init early_init_dt_scan_drconf_memory(unsigned long node) | |||
907 | return 0; | 907 | return 0; |
908 | 908 | ||
909 | /* check if this is a kexec/kdump kernel. */ | 909 | /* check if this is a kexec/kdump kernel. */ |
910 | usm = (cell_t *)of_get_flat_dt_prop(node, "linux,drconf-usable-memory", | 910 | usm = of_get_flat_dt_prop(node, "linux,drconf-usable-memory", |
911 | &l); | 911 | &l); |
912 | if (usm != NULL) | 912 | if (usm != NULL) |
913 | is_kexec_kdump = 1; | 913 | is_kexec_kdump = 1; |
@@ -981,9 +981,9 @@ static int __init early_init_dt_scan_memory(unsigned long node, | |||
981 | } else if (strcmp(type, "memory") != 0) | 981 | } else if (strcmp(type, "memory") != 0) |
982 | return 0; | 982 | return 0; |
983 | 983 | ||
984 | reg = (cell_t *)of_get_flat_dt_prop(node, "linux,usable-memory", &l); | 984 | reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l); |
985 | if (reg == NULL) | 985 | if (reg == NULL) |
986 | reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l); | 986 | reg = of_get_flat_dt_prop(node, "reg", &l); |
987 | if (reg == NULL) | 987 | if (reg == NULL) |
988 | return 0; | 988 | return 0; |
989 | 989 | ||
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 2445945d3761..7f1b33d5e30d 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -1210,7 +1210,7 @@ static void __init prom_initialize_tce_table(void) | |||
1210 | /* Initialize the table to have a one-to-one mapping | 1210 | /* Initialize the table to have a one-to-one mapping |
1211 | * over the allocated size. | 1211 | * over the allocated size. |
1212 | */ | 1212 | */ |
1213 | tce_entryp = (unsigned long *)base; | 1213 | tce_entryp = (u64 *)base; |
1214 | for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) { | 1214 | for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) { |
1215 | tce_entry = (i << PAGE_SHIFT); | 1215 | tce_entry = (i << PAGE_SHIFT); |
1216 | tce_entry |= 0x3; | 1216 | tce_entry |= 0x3; |
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 8c1335566089..8f0856f312da 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c | |||
@@ -232,11 +232,6 @@ int of_pci_address_to_resource(struct device_node *dev, int bar, | |||
232 | } | 232 | } |
233 | EXPORT_SYMBOL_GPL(of_pci_address_to_resource); | 233 | EXPORT_SYMBOL_GPL(of_pci_address_to_resource); |
234 | 234 | ||
235 | static u8 of_irq_pci_swizzle(u8 slot, u8 pin) | ||
236 | { | ||
237 | return (((pin - 1) + slot) % 4) + 1; | ||
238 | } | ||
239 | |||
240 | int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq) | 235 | int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq) |
241 | { | 236 | { |
242 | struct device_node *dn, *ppnode; | 237 | struct device_node *dn, *ppnode; |
@@ -306,7 +301,7 @@ int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq) | |||
306 | /* We can only get here if we hit a P2P bridge with no node, | 301 | /* We can only get here if we hit a P2P bridge with no node, |
307 | * let's do standard swizzling and try again | 302 | * let's do standard swizzling and try again |
308 | */ | 303 | */ |
309 | lspec = of_irq_pci_swizzle(PCI_SLOT(pdev->devfn), lspec); | 304 | lspec = pci_swizzle_interrupt_pin(pdev, lspec); |
310 | pdev = ppdev; | 305 | pdev = ppdev; |
311 | } | 306 | } |
312 | 307 | ||
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 0c64f10087b9..4a2ee08af6a7 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <asm/machdep.h> | 18 | #include <asm/machdep.h> |
19 | #include <asm/smp.h> | 19 | #include <asm/smp.h> |
20 | 20 | ||
21 | #include "cacheinfo.h" | ||
22 | |||
21 | #ifdef CONFIG_PPC64 | 23 | #ifdef CONFIG_PPC64 |
22 | #include <asm/paca.h> | 24 | #include <asm/paca.h> |
23 | #include <asm/lppaca.h> | 25 | #include <asm/lppaca.h> |
@@ -25,8 +27,6 @@ | |||
25 | 27 | ||
26 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | 28 | static DEFINE_PER_CPU(struct cpu, cpu_devices); |
27 | 29 | ||
28 | static DEFINE_PER_CPU(struct kobject *, cache_toplevel); | ||
29 | |||
30 | /* | 30 | /* |
31 | * SMT snooze delay stuff, 64-bit only for now | 31 | * SMT snooze delay stuff, 64-bit only for now |
32 | */ | 32 | */ |
@@ -343,283 +343,6 @@ static struct sysdev_attribute pa6t_attrs[] = { | |||
343 | #endif /* HAS_PPC_PMC_PA6T */ | 343 | #endif /* HAS_PPC_PMC_PA6T */ |
344 | #endif /* HAS_PPC_PMC_CLASSIC */ | 344 | #endif /* HAS_PPC_PMC_CLASSIC */ |
345 | 345 | ||
346 | struct cache_desc { | ||
347 | struct kobject kobj; | ||
348 | struct cache_desc *next; | ||
349 | const char *type; /* Instruction, Data, or Unified */ | ||
350 | u32 size; /* total cache size in KB */ | ||
351 | u32 line_size; /* in bytes */ | ||
352 | u32 nr_sets; /* number of sets */ | ||
353 | u32 level; /* e.g. 1, 2, 3... */ | ||
354 | u32 associativity; /* e.g. 8-way... 0 is fully associative */ | ||
355 | }; | ||
356 | |||
357 | DEFINE_PER_CPU(struct cache_desc *, cache_desc); | ||
358 | |||
359 | static struct cache_desc *kobj_to_cache_desc(struct kobject *k) | ||
360 | { | ||
361 | return container_of(k, struct cache_desc, kobj); | ||
362 | } | ||
363 | |||
364 | static void cache_desc_release(struct kobject *k) | ||
365 | { | ||
366 | struct cache_desc *desc = kobj_to_cache_desc(k); | ||
367 | |||
368 | pr_debug("%s: releasing %s\n", __func__, kobject_name(k)); | ||
369 | |||
370 | if (desc->next) | ||
371 | kobject_put(&desc->next->kobj); | ||
372 | |||
373 | kfree(kobj_to_cache_desc(k)); | ||
374 | } | ||
375 | |||
376 | static ssize_t cache_desc_show(struct kobject *k, struct attribute *attr, char *buf) | ||
377 | { | ||
378 | struct kobj_attribute *kobj_attr; | ||
379 | |||
380 | kobj_attr = container_of(attr, struct kobj_attribute, attr); | ||
381 | |||
382 | return kobj_attr->show(k, kobj_attr, buf); | ||
383 | } | ||
384 | |||
385 | static struct sysfs_ops cache_desc_sysfs_ops = { | ||
386 | .show = cache_desc_show, | ||
387 | }; | ||
388 | |||
389 | static struct kobj_type cache_desc_type = { | ||
390 | .release = cache_desc_release, | ||
391 | .sysfs_ops = &cache_desc_sysfs_ops, | ||
392 | }; | ||
393 | |||
394 | static ssize_t cache_size_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
395 | { | ||
396 | struct cache_desc *cache = kobj_to_cache_desc(k); | ||
397 | |||
398 | return sprintf(buf, "%uK\n", cache->size); | ||
399 | } | ||
400 | |||
401 | static struct kobj_attribute cache_size_attr = | ||
402 | __ATTR(size, 0444, cache_size_show, NULL); | ||
403 | |||
404 | static ssize_t cache_line_size_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
405 | { | ||
406 | struct cache_desc *cache = kobj_to_cache_desc(k); | ||
407 | |||
408 | return sprintf(buf, "%u\n", cache->line_size); | ||
409 | } | ||
410 | |||
411 | static struct kobj_attribute cache_line_size_attr = | ||
412 | __ATTR(coherency_line_size, 0444, cache_line_size_show, NULL); | ||
413 | |||
414 | static ssize_t cache_nr_sets_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
415 | { | ||
416 | struct cache_desc *cache = kobj_to_cache_desc(k); | ||
417 | |||
418 | return sprintf(buf, "%u\n", cache->nr_sets); | ||
419 | } | ||
420 | |||
421 | static struct kobj_attribute cache_nr_sets_attr = | ||
422 | __ATTR(number_of_sets, 0444, cache_nr_sets_show, NULL); | ||
423 | |||
424 | static ssize_t cache_type_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
425 | { | ||
426 | struct cache_desc *cache = kobj_to_cache_desc(k); | ||
427 | |||
428 | return sprintf(buf, "%s\n", cache->type); | ||
429 | } | ||
430 | |||
431 | static struct kobj_attribute cache_type_attr = | ||
432 | __ATTR(type, 0444, cache_type_show, NULL); | ||
433 | |||
434 | static ssize_t cache_level_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
435 | { | ||
436 | struct cache_desc *cache = kobj_to_cache_desc(k); | ||
437 | |||
438 | return sprintf(buf, "%u\n", cache->level); | ||
439 | } | ||
440 | |||
441 | static struct kobj_attribute cache_level_attr = | ||
442 | __ATTR(level, 0444, cache_level_show, NULL); | ||
443 | |||
444 | static ssize_t cache_assoc_show(struct kobject *k, struct kobj_attribute *attr, char *buf) | ||
445 | { | ||
446 | struct cache_desc *cache = kobj_to_cache_desc(k); | ||
447 | |||
448 | return sprintf(buf, "%u\n", cache->associativity); | ||
449 | } | ||
450 | |||
451 | static struct kobj_attribute cache_assoc_attr = | ||
452 | __ATTR(ways_of_associativity, 0444, cache_assoc_show, NULL); | ||
453 | |||
454 | struct cache_desc_info { | ||
455 | const char *type; | ||
456 | const char *size_prop; | ||
457 | const char *line_size_prop; | ||
458 | const char *nr_sets_prop; | ||
459 | }; | ||
460 | |||
461 | /* PowerPC Processor binding says the [di]-cache-* must be equal on | ||
462 | * unified caches, so just use d-cache properties. */ | ||
463 | static struct cache_desc_info ucache_info = { | ||
464 | .type = "Unified", | ||
465 | .size_prop = "d-cache-size", | ||
466 | .line_size_prop = "d-cache-line-size", | ||
467 | .nr_sets_prop = "d-cache-sets", | ||
468 | }; | ||
469 | |||
470 | static struct cache_desc_info dcache_info = { | ||
471 | .type = "Data", | ||
472 | .size_prop = "d-cache-size", | ||
473 | .line_size_prop = "d-cache-line-size", | ||
474 | .nr_sets_prop = "d-cache-sets", | ||
475 | }; | ||
476 | |||
477 | static struct cache_desc_info icache_info = { | ||
478 | .type = "Instruction", | ||
479 | .size_prop = "i-cache-size", | ||
480 | .line_size_prop = "i-cache-line-size", | ||
481 | .nr_sets_prop = "i-cache-sets", | ||
482 | }; | ||
483 | |||
484 | static struct cache_desc * __cpuinit create_cache_desc(struct device_node *np, struct kobject *parent, int index, int level, struct cache_desc_info *info) | ||
485 | { | ||
486 | const u32 *cache_line_size; | ||
487 | struct cache_desc *new; | ||
488 | const u32 *cache_size; | ||
489 | const u32 *nr_sets; | ||
490 | int rc; | ||
491 | |||
492 | new = kzalloc(sizeof(*new), GFP_KERNEL); | ||
493 | if (!new) | ||
494 | return NULL; | ||
495 | |||
496 | rc = kobject_init_and_add(&new->kobj, &cache_desc_type, parent, | ||
497 | "index%d", index); | ||
498 | if (rc) | ||
499 | goto err; | ||
500 | |||
501 | /* type */ | ||
502 | new->type = info->type; | ||
503 | rc = sysfs_create_file(&new->kobj, &cache_type_attr.attr); | ||
504 | WARN_ON(rc); | ||
505 | |||
506 | /* level */ | ||
507 | new->level = level; | ||
508 | rc = sysfs_create_file(&new->kobj, &cache_level_attr.attr); | ||
509 | WARN_ON(rc); | ||
510 | |||
511 | /* size */ | ||
512 | cache_size = of_get_property(np, info->size_prop, NULL); | ||
513 | if (cache_size) { | ||
514 | new->size = *cache_size / 1024; | ||
515 | rc = sysfs_create_file(&new->kobj, | ||
516 | &cache_size_attr.attr); | ||
517 | WARN_ON(rc); | ||
518 | } | ||
519 | |||
520 | /* coherency_line_size */ | ||
521 | cache_line_size = of_get_property(np, info->line_size_prop, NULL); | ||
522 | if (cache_line_size) { | ||
523 | new->line_size = *cache_line_size; | ||
524 | rc = sysfs_create_file(&new->kobj, | ||
525 | &cache_line_size_attr.attr); | ||
526 | WARN_ON(rc); | ||
527 | } | ||
528 | |||
529 | /* number_of_sets */ | ||
530 | nr_sets = of_get_property(np, info->nr_sets_prop, NULL); | ||
531 | if (nr_sets) { | ||
532 | new->nr_sets = *nr_sets; | ||
533 | rc = sysfs_create_file(&new->kobj, | ||
534 | &cache_nr_sets_attr.attr); | ||
535 | WARN_ON(rc); | ||
536 | } | ||
537 | |||
538 | /* ways_of_associativity */ | ||
539 | if (new->nr_sets == 1) { | ||
540 | /* fully associative */ | ||
541 | new->associativity = 0; | ||
542 | goto create_assoc; | ||
543 | } | ||
544 | |||
545 | if (new->nr_sets && new->size && new->line_size) { | ||
546 | /* If we have values for all of these we can derive | ||
547 | * the associativity. */ | ||
548 | new->associativity = | ||
549 | ((new->size * 1024) / new->nr_sets) / new->line_size; | ||
550 | create_assoc: | ||
551 | rc = sysfs_create_file(&new->kobj, | ||
552 | &cache_assoc_attr.attr); | ||
553 | WARN_ON(rc); | ||
554 | } | ||
555 | |||
556 | return new; | ||
557 | err: | ||
558 | kfree(new); | ||
559 | return NULL; | ||
560 | } | ||
561 | |||
562 | static bool cache_is_unified(struct device_node *np) | ||
563 | { | ||
564 | return of_get_property(np, "cache-unified", NULL); | ||
565 | } | ||
566 | |||
567 | static struct cache_desc * __cpuinit create_cache_index_info(struct device_node *np, struct kobject *parent, int index, int level) | ||
568 | { | ||
569 | struct device_node *next_cache; | ||
570 | struct cache_desc *new, **end; | ||
571 | |||
572 | pr_debug("%s(node = %s, index = %d)\n", __func__, np->full_name, index); | ||
573 | |||
574 | if (cache_is_unified(np)) { | ||
575 | new = create_cache_desc(np, parent, index, level, | ||
576 | &ucache_info); | ||
577 | } else { | ||
578 | new = create_cache_desc(np, parent, index, level, | ||
579 | &dcache_info); | ||
580 | if (new) { | ||
581 | index++; | ||
582 | new->next = create_cache_desc(np, parent, index, level, | ||
583 | &icache_info); | ||
584 | } | ||
585 | } | ||
586 | if (!new) | ||
587 | return NULL; | ||
588 | |||
589 | end = &new->next; | ||
590 | while (*end) | ||
591 | end = &(*end)->next; | ||
592 | |||
593 | next_cache = of_find_next_cache_node(np); | ||
594 | if (!next_cache) | ||
595 | goto out; | ||
596 | |||
597 | *end = create_cache_index_info(next_cache, parent, ++index, ++level); | ||
598 | |||
599 | of_node_put(next_cache); | ||
600 | out: | ||
601 | return new; | ||
602 | } | ||
603 | |||
604 | static void __cpuinit create_cache_info(struct sys_device *sysdev) | ||
605 | { | ||
606 | struct kobject *cache_toplevel; | ||
607 | struct device_node *np = NULL; | ||
608 | int cpu = sysdev->id; | ||
609 | |||
610 | cache_toplevel = kobject_create_and_add("cache", &sysdev->kobj); | ||
611 | if (!cache_toplevel) | ||
612 | return; | ||
613 | per_cpu(cache_toplevel, cpu) = cache_toplevel; | ||
614 | np = of_get_cpu_node(cpu, NULL); | ||
615 | if (np != NULL) { | ||
616 | per_cpu(cache_desc, cpu) = | ||
617 | create_cache_index_info(np, cache_toplevel, 0, 1); | ||
618 | of_node_put(np); | ||
619 | } | ||
620 | return; | ||
621 | } | ||
622 | |||
623 | static void __cpuinit register_cpu_online(unsigned int cpu) | 346 | static void __cpuinit register_cpu_online(unsigned int cpu) |
624 | { | 347 | { |
625 | struct cpu *c = &per_cpu(cpu_devices, cpu); | 348 | struct cpu *c = &per_cpu(cpu_devices, cpu); |
@@ -684,25 +407,10 @@ static void __cpuinit register_cpu_online(unsigned int cpu) | |||
684 | sysdev_create_file(s, &attr_dscr); | 407 | sysdev_create_file(s, &attr_dscr); |
685 | #endif /* CONFIG_PPC64 */ | 408 | #endif /* CONFIG_PPC64 */ |
686 | 409 | ||
687 | create_cache_info(s); | 410 | cacheinfo_cpu_online(cpu); |
688 | } | 411 | } |
689 | 412 | ||
690 | #ifdef CONFIG_HOTPLUG_CPU | 413 | #ifdef CONFIG_HOTPLUG_CPU |
691 | static void remove_cache_info(struct sys_device *sysdev) | ||
692 | { | ||
693 | struct kobject *cache_toplevel; | ||
694 | struct cache_desc *cache_desc; | ||
695 | int cpu = sysdev->id; | ||
696 | |||
697 | cache_desc = per_cpu(cache_desc, cpu); | ||
698 | if (cache_desc != NULL) | ||
699 | kobject_put(&cache_desc->kobj); | ||
700 | |||
701 | cache_toplevel = per_cpu(cache_toplevel, cpu); | ||
702 | if (cache_toplevel != NULL) | ||
703 | kobject_put(cache_toplevel); | ||
704 | } | ||
705 | |||
706 | static void unregister_cpu_online(unsigned int cpu) | 414 | static void unregister_cpu_online(unsigned int cpu) |
707 | { | 415 | { |
708 | struct cpu *c = &per_cpu(cpu_devices, cpu); | 416 | struct cpu *c = &per_cpu(cpu_devices, cpu); |
@@ -769,7 +477,7 @@ static void unregister_cpu_online(unsigned int cpu) | |||
769 | sysdev_remove_file(s, &attr_dscr); | 477 | sysdev_remove_file(s, &attr_dscr); |
770 | #endif /* CONFIG_PPC64 */ | 478 | #endif /* CONFIG_PPC64 */ |
771 | 479 | ||
772 | remove_cache_info(s); | 480 | cacheinfo_cpu_offline(cpu); |
773 | } | 481 | } |
774 | #endif /* CONFIG_HOTPLUG_CPU */ | 482 | #endif /* CONFIG_HOTPLUG_CPU */ |
775 | 483 | ||
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h index 4314b39b6faf..ad123bced404 100644 --- a/arch/powerpc/mm/mmu_decl.h +++ b/arch/powerpc/mm/mmu_decl.h | |||
@@ -30,11 +30,11 @@ | |||
30 | #if defined(CONFIG_40x) || defined(CONFIG_8xx) | 30 | #if defined(CONFIG_40x) || defined(CONFIG_8xx) |
31 | static inline void _tlbil_all(void) | 31 | static inline void _tlbil_all(void) |
32 | { | 32 | { |
33 | asm volatile ("sync; tlbia; isync" : : : "memory") | 33 | asm volatile ("sync; tlbia; isync" : : : "memory"); |
34 | } | 34 | } |
35 | static inline void _tlbil_pid(unsigned int pid) | 35 | static inline void _tlbil_pid(unsigned int pid) |
36 | { | 36 | { |
37 | asm volatile ("sync; tlbia; isync" : : : "memory") | 37 | asm volatile ("sync; tlbia; isync" : : : "memory"); |
38 | } | 38 | } |
39 | #else /* CONFIG_40x || CONFIG_8xx */ | 39 | #else /* CONFIG_40x || CONFIG_8xx */ |
40 | extern void _tlbil_all(void); | 40 | extern void _tlbil_all(void); |
@@ -47,7 +47,7 @@ extern void _tlbil_pid(unsigned int pid); | |||
47 | #ifdef CONFIG_8xx | 47 | #ifdef CONFIG_8xx |
48 | static inline void _tlbil_va(unsigned long address, unsigned int pid) | 48 | static inline void _tlbil_va(unsigned long address, unsigned int pid) |
49 | { | 49 | { |
50 | asm volatile ("tlbie %0; sync" : : "r" (address) : "memory") | 50 | asm volatile ("tlbie %0; sync" : : "r" (address) : "memory"); |
51 | } | 51 | } |
52 | #else /* CONFIG_8xx */ | 52 | #else /* CONFIG_8xx */ |
53 | extern void _tlbil_va(unsigned long address, unsigned int pid); | 53 | extern void _tlbil_va(unsigned long address, unsigned int pid); |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index cf81049e1e51..7393bd76d698 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -822,42 +822,50 @@ static void __init dump_numa_memory_topology(void) | |||
822 | * required. nid is the preferred node and end is the physical address of | 822 | * required. nid is the preferred node and end is the physical address of |
823 | * the highest address in the node. | 823 | * the highest address in the node. |
824 | * | 824 | * |
825 | * Returns the physical address of the memory. | 825 | * Returns the virtual address of the memory. |
826 | */ | 826 | */ |
827 | static void __init *careful_allocation(int nid, unsigned long size, | 827 | static void __init *careful_zallocation(int nid, unsigned long size, |
828 | unsigned long align, | 828 | unsigned long align, |
829 | unsigned long end_pfn) | 829 | unsigned long end_pfn) |
830 | { | 830 | { |
831 | void *ret; | ||
831 | int new_nid; | 832 | int new_nid; |
832 | unsigned long ret = __lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT); | 833 | unsigned long ret_paddr; |
834 | |||
835 | ret_paddr = __lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT); | ||
833 | 836 | ||
834 | /* retry over all memory */ | 837 | /* retry over all memory */ |
835 | if (!ret) | 838 | if (!ret_paddr) |
836 | ret = __lmb_alloc_base(size, align, lmb_end_of_DRAM()); | 839 | ret_paddr = __lmb_alloc_base(size, align, lmb_end_of_DRAM()); |
837 | 840 | ||
838 | if (!ret) | 841 | if (!ret_paddr) |
839 | panic("numa.c: cannot allocate %lu bytes on node %d", | 842 | panic("numa.c: cannot allocate %lu bytes for node %d", |
840 | size, nid); | 843 | size, nid); |
841 | 844 | ||
845 | ret = __va(ret_paddr); | ||
846 | |||
842 | /* | 847 | /* |
843 | * If the memory came from a previously allocated node, we must | 848 | * We initialize the nodes in numeric order: 0, 1, 2... |
844 | * retry with the bootmem allocator. | 849 | * and hand over control from the LMB allocator to the |
850 | * bootmem allocator. If this function is called for | ||
851 | * node 5, then we know that all nodes <5 are using the | ||
852 | * bootmem allocator instead of the LMB allocator. | ||
853 | * | ||
854 | * So, check the nid from which this allocation came | ||
855 | * and double check to see if we need to use bootmem | ||
856 | * instead of the LMB. We don't free the LMB memory | ||
857 | * since it would be useless. | ||
845 | */ | 858 | */ |
846 | new_nid = early_pfn_to_nid(ret >> PAGE_SHIFT); | 859 | new_nid = early_pfn_to_nid(ret_paddr >> PAGE_SHIFT); |
847 | if (new_nid < nid) { | 860 | if (new_nid < nid) { |
848 | ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(new_nid), | 861 | ret = __alloc_bootmem_node(NODE_DATA(new_nid), |
849 | size, align, 0); | 862 | size, align, 0); |
850 | 863 | ||
851 | if (!ret) | 864 | dbg("alloc_bootmem %p %lx\n", ret, size); |
852 | panic("numa.c: cannot allocate %lu bytes on node %d", | ||
853 | size, new_nid); | ||
854 | |||
855 | ret = __pa(ret); | ||
856 | |||
857 | dbg("alloc_bootmem %lx %lx\n", ret, size); | ||
858 | } | 865 | } |
859 | 866 | ||
860 | return (void *)ret; | 867 | memset(ret, 0, size); |
868 | return ret; | ||
861 | } | 869 | } |
862 | 870 | ||
863 | static struct notifier_block __cpuinitdata ppc64_numa_nb = { | 871 | static struct notifier_block __cpuinitdata ppc64_numa_nb = { |
@@ -952,7 +960,7 @@ void __init do_init_bootmem(void) | |||
952 | 960 | ||
953 | for_each_online_node(nid) { | 961 | for_each_online_node(nid) { |
954 | unsigned long start_pfn, end_pfn; | 962 | unsigned long start_pfn, end_pfn; |
955 | unsigned long bootmem_paddr; | 963 | void *bootmem_vaddr; |
956 | unsigned long bootmap_pages; | 964 | unsigned long bootmap_pages; |
957 | 965 | ||
958 | get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); | 966 | get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); |
@@ -964,11 +972,9 @@ void __init do_init_bootmem(void) | |||
964 | * previous nodes' bootmem to be initialized and have | 972 | * previous nodes' bootmem to be initialized and have |
965 | * all reserved areas marked. | 973 | * all reserved areas marked. |
966 | */ | 974 | */ |
967 | NODE_DATA(nid) = careful_allocation(nid, | 975 | NODE_DATA(nid) = careful_zallocation(nid, |
968 | sizeof(struct pglist_data), | 976 | sizeof(struct pglist_data), |
969 | SMP_CACHE_BYTES, end_pfn); | 977 | SMP_CACHE_BYTES, end_pfn); |
970 | NODE_DATA(nid) = __va(NODE_DATA(nid)); | ||
971 | memset(NODE_DATA(nid), 0, sizeof(struct pglist_data)); | ||
972 | 978 | ||
973 | dbg("node %d\n", nid); | 979 | dbg("node %d\n", nid); |
974 | dbg("NODE_DATA() = %p\n", NODE_DATA(nid)); | 980 | dbg("NODE_DATA() = %p\n", NODE_DATA(nid)); |
@@ -984,20 +990,20 @@ void __init do_init_bootmem(void) | |||
984 | dbg("end_paddr = %lx\n", end_pfn << PAGE_SHIFT); | 990 | dbg("end_paddr = %lx\n", end_pfn << PAGE_SHIFT); |
985 | 991 | ||
986 | bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn); | 992 | bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn); |
987 | bootmem_paddr = (unsigned long)careful_allocation(nid, | 993 | bootmem_vaddr = careful_zallocation(nid, |
988 | bootmap_pages << PAGE_SHIFT, | 994 | bootmap_pages << PAGE_SHIFT, |
989 | PAGE_SIZE, end_pfn); | 995 | PAGE_SIZE, end_pfn); |
990 | memset(__va(bootmem_paddr), 0, bootmap_pages << PAGE_SHIFT); | ||
991 | 996 | ||
992 | dbg("bootmap_paddr = %lx\n", bootmem_paddr); | 997 | dbg("bootmap_vaddr = %p\n", bootmem_vaddr); |
993 | 998 | ||
994 | init_bootmem_node(NODE_DATA(nid), bootmem_paddr >> PAGE_SHIFT, | 999 | init_bootmem_node(NODE_DATA(nid), |
1000 | __pa(bootmem_vaddr) >> PAGE_SHIFT, | ||
995 | start_pfn, end_pfn); | 1001 | start_pfn, end_pfn); |
996 | 1002 | ||
997 | free_bootmem_with_active_regions(nid, end_pfn); | 1003 | free_bootmem_with_active_regions(nid, end_pfn); |
998 | /* | 1004 | /* |
999 | * Be very careful about moving this around. Future | 1005 | * Be very careful about moving this around. Future |
1000 | * calls to careful_allocation() depend on this getting | 1006 | * calls to careful_zallocation() depend on this getting |
1001 | * done correctly. | 1007 | * done correctly. |
1002 | */ | 1008 | */ |
1003 | mark_reserved_regions_for_nid(nid); | 1009 | mark_reserved_regions_for_nid(nid); |
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index 38ff35f2142a..22972cd83cc9 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c | |||
@@ -266,7 +266,8 @@ int map_page(unsigned long va, phys_addr_t pa, int flags) | |||
266 | /* The PTE should never be already set nor present in the | 266 | /* The PTE should never be already set nor present in the |
267 | * hash table | 267 | * hash table |
268 | */ | 268 | */ |
269 | BUG_ON(pte_val(*pg) & (_PAGE_PRESENT | _PAGE_HASHPTE)); | 269 | BUG_ON((pte_val(*pg) & (_PAGE_PRESENT | _PAGE_HASHPTE)) && |
270 | flags); | ||
270 | set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT, | 271 | set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT, |
271 | __pgprot(flags))); | 272 | __pgprot(flags))); |
272 | } | 273 | } |
diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c index 803a64c02b06..39ac22b13c73 100644 --- a/arch/powerpc/mm/tlb_nohash.c +++ b/arch/powerpc/mm/tlb_nohash.c | |||
@@ -189,8 +189,9 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end) | |||
189 | smp_call_function(do_flush_tlb_mm_ipi, NULL, 1); | 189 | smp_call_function(do_flush_tlb_mm_ipi, NULL, 1); |
190 | _tlbil_pid(0); | 190 | _tlbil_pid(0); |
191 | preempt_enable(); | 191 | preempt_enable(); |
192 | #endif | 192 | #else |
193 | _tlbil_pid(0); | 193 | _tlbil_pid(0); |
194 | #endif | ||
194 | } | 195 | } |
195 | EXPORT_SYMBOL(flush_tlb_kernel_range); | 196 | EXPORT_SYMBOL(flush_tlb_kernel_range); |
196 | 197 | ||
diff --git a/arch/powerpc/oprofile/cell/pr_util.h b/arch/powerpc/oprofile/cell/pr_util.h index 628009c01958..964b93974d89 100644 --- a/arch/powerpc/oprofile/cell/pr_util.h +++ b/arch/powerpc/oprofile/cell/pr_util.h | |||
@@ -30,6 +30,10 @@ | |||
30 | extern struct delayed_work spu_work; | 30 | extern struct delayed_work spu_work; |
31 | extern int spu_prof_running; | 31 | extern int spu_prof_running; |
32 | 32 | ||
33 | #define TRACE_ARRAY_SIZE 1024 | ||
34 | |||
35 | extern spinlock_t oprof_spu_smpl_arry_lck; | ||
36 | |||
33 | struct spu_overlay_info { /* map of sections within an SPU overlay */ | 37 | struct spu_overlay_info { /* map of sections within an SPU overlay */ |
34 | unsigned int vma; /* SPU virtual memory address from elf */ | 38 | unsigned int vma; /* SPU virtual memory address from elf */ |
35 | unsigned int size; /* size of section from elf */ | 39 | unsigned int size; /* size of section from elf */ |
@@ -79,7 +83,7 @@ struct spu_buffer { | |||
79 | * the vma-to-fileoffset map. | 83 | * the vma-to-fileoffset map. |
80 | */ | 84 | */ |
81 | struct vma_to_fileoffset_map *create_vma_map(const struct spu *spu, | 85 | struct vma_to_fileoffset_map *create_vma_map(const struct spu *spu, |
82 | u64 objectid); | 86 | unsigned long objectid); |
83 | unsigned int vma_map_lookup(struct vma_to_fileoffset_map *map, | 87 | unsigned int vma_map_lookup(struct vma_to_fileoffset_map *map, |
84 | unsigned int vma, const struct spu *aSpu, | 88 | unsigned int vma, const struct spu *aSpu, |
85 | int *grd_val); | 89 | int *grd_val); |
@@ -89,10 +93,11 @@ void vma_map_free(struct vma_to_fileoffset_map *map); | |||
89 | * Entry point for SPU profiling. | 93 | * Entry point for SPU profiling. |
90 | * cycles_reset is the SPU_CYCLES count value specified by the user. | 94 | * cycles_reset is the SPU_CYCLES count value specified by the user. |
91 | */ | 95 | */ |
92 | int start_spu_profiling(unsigned int cycles_reset); | 96 | int start_spu_profiling_cycles(unsigned int cycles_reset); |
93 | 97 | void start_spu_profiling_events(void); | |
94 | void stop_spu_profiling(void); | ||
95 | 98 | ||
99 | void stop_spu_profiling_cycles(void); | ||
100 | void stop_spu_profiling_events(void); | ||
96 | 101 | ||
97 | /* add the necessary profiling hooks */ | 102 | /* add the necessary profiling hooks */ |
98 | int spu_sync_start(void); | 103 | int spu_sync_start(void); |
diff --git a/arch/powerpc/oprofile/cell/spu_profiler.c b/arch/powerpc/oprofile/cell/spu_profiler.c index 83faa958b9d4..9305ddaac512 100644 --- a/arch/powerpc/oprofile/cell/spu_profiler.c +++ b/arch/powerpc/oprofile/cell/spu_profiler.c | |||
@@ -18,11 +18,21 @@ | |||
18 | #include <asm/cell-pmu.h> | 18 | #include <asm/cell-pmu.h> |
19 | #include "pr_util.h" | 19 | #include "pr_util.h" |
20 | 20 | ||
21 | #define TRACE_ARRAY_SIZE 1024 | ||
22 | #define SCALE_SHIFT 14 | 21 | #define SCALE_SHIFT 14 |
23 | 22 | ||
24 | static u32 *samples; | 23 | static u32 *samples; |
25 | 24 | ||
25 | /* spu_prof_running is a flag used to indicate if spu profiling is enabled | ||
26 | * or not. It is set by the routines start_spu_profiling_cycles() and | ||
27 | * start_spu_profiling_events(). The flag is cleared by the routines | ||
28 | * stop_spu_profiling_cycles() and stop_spu_profiling_events(). These | ||
29 | * routines are called via global_start() and global_stop() which are called in | ||
30 | * op_powerpc_start() and op_powerpc_stop(). These routines are called once | ||
31 | * per system as a result of the user starting/stopping oprofile. Hence, only | ||
32 | * one CPU per user at a time will be changing the value of spu_prof_running. | ||
33 | * In general, OProfile does not protect against multiple users trying to run | ||
34 | * OProfile at a time. | ||
35 | */ | ||
26 | int spu_prof_running; | 36 | int spu_prof_running; |
27 | static unsigned int profiling_interval; | 37 | static unsigned int profiling_interval; |
28 | 38 | ||
@@ -31,8 +41,8 @@ static unsigned int profiling_interval; | |||
31 | 41 | ||
32 | #define SPU_PC_MASK 0xFFFF | 42 | #define SPU_PC_MASK 0xFFFF |
33 | 43 | ||
34 | static DEFINE_SPINLOCK(sample_array_lock); | 44 | DEFINE_SPINLOCK(oprof_spu_smpl_arry_lck); |
35 | unsigned long sample_array_lock_flags; | 45 | unsigned long oprof_spu_smpl_arry_lck_flags; |
36 | 46 | ||
37 | void set_spu_profiling_frequency(unsigned int freq_khz, unsigned int cycles_reset) | 47 | void set_spu_profiling_frequency(unsigned int freq_khz, unsigned int cycles_reset) |
38 | { | 48 | { |
@@ -145,13 +155,13 @@ static enum hrtimer_restart profile_spus(struct hrtimer *timer) | |||
145 | * sample array must be loaded and then processed for a given | 155 | * sample array must be loaded and then processed for a given |
146 | * cpu. The sample array is not per cpu. | 156 | * cpu. The sample array is not per cpu. |
147 | */ | 157 | */ |
148 | spin_lock_irqsave(&sample_array_lock, | 158 | spin_lock_irqsave(&oprof_spu_smpl_arry_lck, |
149 | sample_array_lock_flags); | 159 | oprof_spu_smpl_arry_lck_flags); |
150 | num_samples = cell_spu_pc_collection(cpu); | 160 | num_samples = cell_spu_pc_collection(cpu); |
151 | 161 | ||
152 | if (num_samples == 0) { | 162 | if (num_samples == 0) { |
153 | spin_unlock_irqrestore(&sample_array_lock, | 163 | spin_unlock_irqrestore(&oprof_spu_smpl_arry_lck, |
154 | sample_array_lock_flags); | 164 | oprof_spu_smpl_arry_lck_flags); |
155 | continue; | 165 | continue; |
156 | } | 166 | } |
157 | 167 | ||
@@ -162,8 +172,8 @@ static enum hrtimer_restart profile_spus(struct hrtimer *timer) | |||
162 | num_samples); | 172 | num_samples); |
163 | } | 173 | } |
164 | 174 | ||
165 | spin_unlock_irqrestore(&sample_array_lock, | 175 | spin_unlock_irqrestore(&oprof_spu_smpl_arry_lck, |
166 | sample_array_lock_flags); | 176 | oprof_spu_smpl_arry_lck_flags); |
167 | 177 | ||
168 | } | 178 | } |
169 | smp_wmb(); /* insure spu event buffer updates are written */ | 179 | smp_wmb(); /* insure spu event buffer updates are written */ |
@@ -182,13 +192,13 @@ static enum hrtimer_restart profile_spus(struct hrtimer *timer) | |||
182 | 192 | ||
183 | static struct hrtimer timer; | 193 | static struct hrtimer timer; |
184 | /* | 194 | /* |
185 | * Entry point for SPU profiling. | 195 | * Entry point for SPU cycle profiling. |
186 | * NOTE: SPU profiling is done system-wide, not per-CPU. | 196 | * NOTE: SPU profiling is done system-wide, not per-CPU. |
187 | * | 197 | * |
188 | * cycles_reset is the count value specified by the user when | 198 | * cycles_reset is the count value specified by the user when |
189 | * setting up OProfile to count SPU_CYCLES. | 199 | * setting up OProfile to count SPU_CYCLES. |
190 | */ | 200 | */ |
191 | int start_spu_profiling(unsigned int cycles_reset) | 201 | int start_spu_profiling_cycles(unsigned int cycles_reset) |
192 | { | 202 | { |
193 | ktime_t kt; | 203 | ktime_t kt; |
194 | 204 | ||
@@ -212,10 +222,30 @@ int start_spu_profiling(unsigned int cycles_reset) | |||
212 | return 0; | 222 | return 0; |
213 | } | 223 | } |
214 | 224 | ||
215 | void stop_spu_profiling(void) | 225 | /* |
226 | * Entry point for SPU event profiling. | ||
227 | * NOTE: SPU profiling is done system-wide, not per-CPU. | ||
228 | * | ||
229 | * cycles_reset is the count value specified by the user when | ||
230 | * setting up OProfile to count SPU_CYCLES. | ||
231 | */ | ||
232 | void start_spu_profiling_events(void) | ||
233 | { | ||
234 | spu_prof_running = 1; | ||
235 | schedule_delayed_work(&spu_work, DEFAULT_TIMER_EXPIRE); | ||
236 | |||
237 | return; | ||
238 | } | ||
239 | |||
240 | void stop_spu_profiling_cycles(void) | ||
216 | { | 241 | { |
217 | spu_prof_running = 0; | 242 | spu_prof_running = 0; |
218 | hrtimer_cancel(&timer); | 243 | hrtimer_cancel(&timer); |
219 | kfree(samples); | 244 | kfree(samples); |
220 | pr_debug("SPU_PROF: stop_spu_profiling issued\n"); | 245 | pr_debug("SPU_PROF: stop_spu_profiling_cycles issued\n"); |
246 | } | ||
247 | |||
248 | void stop_spu_profiling_events(void) | ||
249 | { | ||
250 | spu_prof_running = 0; | ||
221 | } | 251 | } |
diff --git a/arch/powerpc/oprofile/common.c b/arch/powerpc/oprofile/common.c index 17807acb05d9..21f16edf6c8d 100644 --- a/arch/powerpc/oprofile/common.c +++ b/arch/powerpc/oprofile/common.c | |||
@@ -132,6 +132,28 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) | |||
132 | oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); | 132 | oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); |
133 | oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); | 133 | oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); |
134 | oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); | 134 | oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); |
135 | #ifdef CONFIG_OPROFILE_CELL | ||
136 | /* create a file the user tool can check to see what level of profiling | ||
137 | * support exits with this kernel. Initialize bit mask to indicate | ||
138 | * what support the kernel has: | ||
139 | * bit 0 - Supports SPU event profiling in addition to PPU | ||
140 | * event and cycles; and SPU cycle profiling | ||
141 | * bits 1-31 - Currently unused. | ||
142 | * | ||
143 | * If the file does not exist, then the kernel only supports SPU | ||
144 | * cycle profiling, PPU event and cycle profiling. | ||
145 | */ | ||
146 | oprofilefs_create_ulong(sb, root, "cell_support", &sys.cell_support); | ||
147 | sys.cell_support = 0x1; /* Note, the user OProfile tool must check | ||
148 | * that this bit is set before attempting to | ||
149 | * user SPU event profiling. Older kernels | ||
150 | * will not have this file, hence the user | ||
151 | * tool is not allowed to do SPU event | ||
152 | * profiling on older kernels. Older kernels | ||
153 | * will accept SPU events but collected data | ||
154 | * is garbage. | ||
155 | */ | ||
156 | #endif | ||
135 | #endif | 157 | #endif |
136 | 158 | ||
137 | for (i = 0; i < model->num_counters; ++i) { | 159 | for (i = 0; i < model->num_counters; ++i) { |
diff --git a/arch/powerpc/oprofile/op_model_cell.c b/arch/powerpc/oprofile/op_model_cell.c index 25a4ec2514a3..ae06c6236d9c 100644 --- a/arch/powerpc/oprofile/op_model_cell.c +++ b/arch/powerpc/oprofile/op_model_cell.c | |||
@@ -40,14 +40,15 @@ | |||
40 | #include "../platforms/cell/interrupt.h" | 40 | #include "../platforms/cell/interrupt.h" |
41 | #include "cell/pr_util.h" | 41 | #include "cell/pr_util.h" |
42 | 42 | ||
43 | static void cell_global_stop_spu(void); | 43 | #define PPU_PROFILING 0 |
44 | #define SPU_PROFILING_CYCLES 1 | ||
45 | #define SPU_PROFILING_EVENTS 2 | ||
44 | 46 | ||
45 | /* | 47 | #define SPU_EVENT_NUM_START 4100 |
46 | * spu_cycle_reset is the number of cycles between samples. | 48 | #define SPU_EVENT_NUM_STOP 4399 |
47 | * This variable is used for SPU profiling and should ONLY be set | 49 | #define SPU_PROFILE_EVENT_ADDR 4363 /* spu, address trace, decimal */ |
48 | * at the beginning of cell_reg_setup; otherwise, it's read-only. | 50 | #define SPU_PROFILE_EVENT_ADDR_MASK_A 0x146 /* sub unit set to zero */ |
49 | */ | 51 | #define SPU_PROFILE_EVENT_ADDR_MASK_B 0x186 /* sub unit set to zero */ |
50 | static unsigned int spu_cycle_reset; | ||
51 | 52 | ||
52 | #define NUM_SPUS_PER_NODE 8 | 53 | #define NUM_SPUS_PER_NODE 8 |
53 | #define SPU_CYCLES_EVENT_NUM 2 /* event number for SPU_CYCLES */ | 54 | #define SPU_CYCLES_EVENT_NUM 2 /* event number for SPU_CYCLES */ |
@@ -66,6 +67,21 @@ static unsigned int spu_cycle_reset; | |||
66 | 67 | ||
67 | #define MAX_SPU_COUNT 0xFFFFFF /* maximum 24 bit LFSR value */ | 68 | #define MAX_SPU_COUNT 0xFFFFFF /* maximum 24 bit LFSR value */ |
68 | 69 | ||
70 | /* Minumum HW interval timer setting to send value to trace buffer is 10 cycle. | ||
71 | * To configure counter to send value every N cycles set counter to | ||
72 | * 2^32 - 1 - N. | ||
73 | */ | ||
74 | #define NUM_INTERVAL_CYC 0xFFFFFFFF - 10 | ||
75 | |||
76 | /* | ||
77 | * spu_cycle_reset is the number of cycles between samples. | ||
78 | * This variable is used for SPU profiling and should ONLY be set | ||
79 | * at the beginning of cell_reg_setup; otherwise, it's read-only. | ||
80 | */ | ||
81 | static unsigned int spu_cycle_reset; | ||
82 | static unsigned int profiling_mode; | ||
83 | static int spu_evnt_phys_spu_indx; | ||
84 | |||
69 | struct pmc_cntrl_data { | 85 | struct pmc_cntrl_data { |
70 | unsigned long vcntr; | 86 | unsigned long vcntr; |
71 | unsigned long evnts; | 87 | unsigned long evnts; |
@@ -105,6 +121,8 @@ struct pm_cntrl { | |||
105 | u16 trace_mode; | 121 | u16 trace_mode; |
106 | u16 freeze; | 122 | u16 freeze; |
107 | u16 count_mode; | 123 | u16 count_mode; |
124 | u16 spu_addr_trace; | ||
125 | u8 trace_buf_ovflw; | ||
108 | }; | 126 | }; |
109 | 127 | ||
110 | static struct { | 128 | static struct { |
@@ -122,7 +140,7 @@ static struct { | |||
122 | #define GET_INPUT_CONTROL(x) ((x & 0x00000004) >> 2) | 140 | #define GET_INPUT_CONTROL(x) ((x & 0x00000004) >> 2) |
123 | 141 | ||
124 | static DEFINE_PER_CPU(unsigned long[NR_PHYS_CTRS], pmc_values); | 142 | static DEFINE_PER_CPU(unsigned long[NR_PHYS_CTRS], pmc_values); |
125 | 143 | static unsigned long spu_pm_cnt[MAX_NUMNODES * NUM_SPUS_PER_NODE]; | |
126 | static struct pmc_cntrl_data pmc_cntrl[NUM_THREADS][NR_PHYS_CTRS]; | 144 | static struct pmc_cntrl_data pmc_cntrl[NUM_THREADS][NR_PHYS_CTRS]; |
127 | 145 | ||
128 | /* | 146 | /* |
@@ -152,6 +170,7 @@ static u32 hdw_thread; | |||
152 | 170 | ||
153 | static u32 virt_cntr_inter_mask; | 171 | static u32 virt_cntr_inter_mask; |
154 | static struct timer_list timer_virt_cntr; | 172 | static struct timer_list timer_virt_cntr; |
173 | static struct timer_list timer_spu_event_swap; | ||
155 | 174 | ||
156 | /* | 175 | /* |
157 | * pm_signal needs to be global since it is initialized in | 176 | * pm_signal needs to be global since it is initialized in |
@@ -165,7 +184,7 @@ static int spu_rtas_token; /* token for SPU cycle profiling */ | |||
165 | static u32 reset_value[NR_PHYS_CTRS]; | 184 | static u32 reset_value[NR_PHYS_CTRS]; |
166 | static int num_counters; | 185 | static int num_counters; |
167 | static int oprofile_running; | 186 | static int oprofile_running; |
168 | static DEFINE_SPINLOCK(virt_cntr_lock); | 187 | static DEFINE_SPINLOCK(cntr_lock); |
169 | 188 | ||
170 | static u32 ctr_enabled; | 189 | static u32 ctr_enabled; |
171 | 190 | ||
@@ -336,13 +355,13 @@ static void set_pm_event(u32 ctr, int event, u32 unit_mask) | |||
336 | for (i = 0; i < NUM_DEBUG_BUS_WORDS; i++) { | 355 | for (i = 0; i < NUM_DEBUG_BUS_WORDS; i++) { |
337 | if (bus_word & (1 << i)) { | 356 | if (bus_word & (1 << i)) { |
338 | pm_regs.debug_bus_control |= | 357 | pm_regs.debug_bus_control |= |
339 | (bus_type << (30 - (2 * i))); | 358 | (bus_type << (30 - (2 * i))); |
340 | 359 | ||
341 | for (j = 0; j < NUM_INPUT_BUS_WORDS; j++) { | 360 | for (j = 0; j < NUM_INPUT_BUS_WORDS; j++) { |
342 | if (input_bus[j] == 0xff) { | 361 | if (input_bus[j] == 0xff) { |
343 | input_bus[j] = i; | 362 | input_bus[j] = i; |
344 | pm_regs.group_control |= | 363 | pm_regs.group_control |= |
345 | (i << (30 - (2 * j))); | 364 | (i << (30 - (2 * j))); |
346 | 365 | ||
347 | break; | 366 | break; |
348 | } | 367 | } |
@@ -367,12 +386,16 @@ static void write_pm_cntrl(int cpu) | |||
367 | if (pm_regs.pm_cntrl.stop_at_max == 1) | 386 | if (pm_regs.pm_cntrl.stop_at_max == 1) |
368 | val |= CBE_PM_STOP_AT_MAX; | 387 | val |= CBE_PM_STOP_AT_MAX; |
369 | 388 | ||
370 | if (pm_regs.pm_cntrl.trace_mode == 1) | 389 | if (pm_regs.pm_cntrl.trace_mode != 0) |
371 | val |= CBE_PM_TRACE_MODE_SET(pm_regs.pm_cntrl.trace_mode); | 390 | val |= CBE_PM_TRACE_MODE_SET(pm_regs.pm_cntrl.trace_mode); |
372 | 391 | ||
392 | if (pm_regs.pm_cntrl.trace_buf_ovflw == 1) | ||
393 | val |= CBE_PM_TRACE_BUF_OVFLW(pm_regs.pm_cntrl.trace_buf_ovflw); | ||
373 | if (pm_regs.pm_cntrl.freeze == 1) | 394 | if (pm_regs.pm_cntrl.freeze == 1) |
374 | val |= CBE_PM_FREEZE_ALL_CTRS; | 395 | val |= CBE_PM_FREEZE_ALL_CTRS; |
375 | 396 | ||
397 | val |= CBE_PM_SPU_ADDR_TRACE_SET(pm_regs.pm_cntrl.spu_addr_trace); | ||
398 | |||
376 | /* | 399 | /* |
377 | * Routine set_count_mode must be called previously to set | 400 | * Routine set_count_mode must be called previously to set |
378 | * the count mode based on the user selection of user and kernel. | 401 | * the count mode based on the user selection of user and kernel. |
@@ -441,7 +464,7 @@ static void cell_virtual_cntr(unsigned long data) | |||
441 | * not both playing with the counters on the same node. | 464 | * not both playing with the counters on the same node. |
442 | */ | 465 | */ |
443 | 466 | ||
444 | spin_lock_irqsave(&virt_cntr_lock, flags); | 467 | spin_lock_irqsave(&cntr_lock, flags); |
445 | 468 | ||
446 | prev_hdw_thread = hdw_thread; | 469 | prev_hdw_thread = hdw_thread; |
447 | 470 | ||
@@ -480,7 +503,7 @@ static void cell_virtual_cntr(unsigned long data) | |||
480 | cbe_disable_pm_interrupts(cpu); | 503 | cbe_disable_pm_interrupts(cpu); |
481 | for (i = 0; i < num_counters; i++) { | 504 | for (i = 0; i < num_counters; i++) { |
482 | per_cpu(pmc_values, cpu + prev_hdw_thread)[i] | 505 | per_cpu(pmc_values, cpu + prev_hdw_thread)[i] |
483 | = cbe_read_ctr(cpu, i); | 506 | = cbe_read_ctr(cpu, i); |
484 | 507 | ||
485 | if (per_cpu(pmc_values, cpu + next_hdw_thread)[i] | 508 | if (per_cpu(pmc_values, cpu + next_hdw_thread)[i] |
486 | == 0xFFFFFFFF) | 509 | == 0xFFFFFFFF) |
@@ -527,7 +550,7 @@ static void cell_virtual_cntr(unsigned long data) | |||
527 | cbe_enable_pm(cpu); | 550 | cbe_enable_pm(cpu); |
528 | } | 551 | } |
529 | 552 | ||
530 | spin_unlock_irqrestore(&virt_cntr_lock, flags); | 553 | spin_unlock_irqrestore(&cntr_lock, flags); |
531 | 554 | ||
532 | mod_timer(&timer_virt_cntr, jiffies + HZ / 10); | 555 | mod_timer(&timer_virt_cntr, jiffies + HZ / 10); |
533 | } | 556 | } |
@@ -541,38 +564,146 @@ static void start_virt_cntrs(void) | |||
541 | add_timer(&timer_virt_cntr); | 564 | add_timer(&timer_virt_cntr); |
542 | } | 565 | } |
543 | 566 | ||
544 | /* This function is called once for all cpus combined */ | 567 | static int cell_reg_setup_spu_cycles(struct op_counter_config *ctr, |
545 | static int cell_reg_setup(struct op_counter_config *ctr, | ||
546 | struct op_system_config *sys, int num_ctrs) | 568 | struct op_system_config *sys, int num_ctrs) |
547 | { | 569 | { |
548 | int i, j, cpu; | 570 | spu_cycle_reset = ctr[0].count; |
549 | spu_cycle_reset = 0; | ||
550 | 571 | ||
551 | if (ctr[0].event == SPU_CYCLES_EVENT_NUM) { | 572 | /* |
552 | spu_cycle_reset = ctr[0].count; | 573 | * Each node will need to make the rtas call to start |
574 | * and stop SPU profiling. Get the token once and store it. | ||
575 | */ | ||
576 | spu_rtas_token = rtas_token("ibm,cbe-spu-perftools"); | ||
577 | |||
578 | if (unlikely(spu_rtas_token == RTAS_UNKNOWN_SERVICE)) { | ||
579 | printk(KERN_ERR | ||
580 | "%s: rtas token ibm,cbe-spu-perftools unknown\n", | ||
581 | __func__); | ||
582 | return -EIO; | ||
583 | } | ||
584 | return 0; | ||
585 | } | ||
586 | |||
587 | /* Unfortunately, the hardware will only support event profiling | ||
588 | * on one SPU per node at a time. Therefore, we must time slice | ||
589 | * the profiling across all SPUs in the node. Note, we do this | ||
590 | * in parallel for each node. The following routine is called | ||
591 | * periodically based on kernel timer to switch which SPU is | ||
592 | * being monitored in a round robbin fashion. | ||
593 | */ | ||
594 | static void spu_evnt_swap(unsigned long data) | ||
595 | { | ||
596 | int node; | ||
597 | int cur_phys_spu, nxt_phys_spu, cur_spu_evnt_phys_spu_indx; | ||
598 | unsigned long flags; | ||
599 | int cpu; | ||
600 | int ret; | ||
601 | u32 interrupt_mask; | ||
602 | |||
603 | |||
604 | /* enable interrupts on cntr 0 */ | ||
605 | interrupt_mask = CBE_PM_CTR_OVERFLOW_INTR(0); | ||
606 | |||
607 | hdw_thread = 0; | ||
608 | |||
609 | /* Make sure spu event interrupt handler and spu event swap | ||
610 | * don't access the counters simultaneously. | ||
611 | */ | ||
612 | spin_lock_irqsave(&cntr_lock, flags); | ||
613 | |||
614 | cur_spu_evnt_phys_spu_indx = spu_evnt_phys_spu_indx; | ||
615 | |||
616 | if (++(spu_evnt_phys_spu_indx) == NUM_SPUS_PER_NODE) | ||
617 | spu_evnt_phys_spu_indx = 0; | ||
618 | |||
619 | pm_signal[0].sub_unit = spu_evnt_phys_spu_indx; | ||
620 | pm_signal[1].sub_unit = spu_evnt_phys_spu_indx; | ||
621 | pm_signal[2].sub_unit = spu_evnt_phys_spu_indx; | ||
622 | |||
623 | /* switch the SPU being profiled on each node */ | ||
624 | for_each_online_cpu(cpu) { | ||
625 | if (cbe_get_hw_thread_id(cpu)) | ||
626 | continue; | ||
627 | |||
628 | node = cbe_cpu_to_node(cpu); | ||
629 | cur_phys_spu = (node * NUM_SPUS_PER_NODE) | ||
630 | + cur_spu_evnt_phys_spu_indx; | ||
631 | nxt_phys_spu = (node * NUM_SPUS_PER_NODE) | ||
632 | + spu_evnt_phys_spu_indx; | ||
553 | 633 | ||
554 | /* | 634 | /* |
555 | * Each node will need to make the rtas call to start | 635 | * stop counters, save counter values, restore counts |
556 | * and stop SPU profiling. Get the token once and store it. | 636 | * for previous physical SPU |
557 | */ | 637 | */ |
558 | spu_rtas_token = rtas_token("ibm,cbe-spu-perftools"); | 638 | cbe_disable_pm(cpu); |
639 | cbe_disable_pm_interrupts(cpu); | ||
559 | 640 | ||
560 | if (unlikely(spu_rtas_token == RTAS_UNKNOWN_SERVICE)) { | 641 | spu_pm_cnt[cur_phys_spu] |
561 | printk(KERN_ERR | 642 | = cbe_read_ctr(cpu, 0); |
562 | "%s: rtas token ibm,cbe-spu-perftools unknown\n", | 643 | |
563 | __func__); | 644 | /* restore previous count for the next spu to sample */ |
564 | return -EIO; | 645 | /* NOTE, hardware issue, counter will not start if the |
565 | } | 646 | * counter value is at max (0xFFFFFFFF). |
647 | */ | ||
648 | if (spu_pm_cnt[nxt_phys_spu] >= 0xFFFFFFFF) | ||
649 | cbe_write_ctr(cpu, 0, 0xFFFFFFF0); | ||
650 | else | ||
651 | cbe_write_ctr(cpu, 0, spu_pm_cnt[nxt_phys_spu]); | ||
652 | |||
653 | pm_rtas_reset_signals(cbe_cpu_to_node(cpu)); | ||
654 | |||
655 | /* setup the debug bus measure the one event and | ||
656 | * the two events to route the next SPU's PC on | ||
657 | * the debug bus | ||
658 | */ | ||
659 | ret = pm_rtas_activate_signals(cbe_cpu_to_node(cpu), 3); | ||
660 | if (ret) | ||
661 | printk(KERN_ERR "%s: pm_rtas_activate_signals failed, " | ||
662 | "SPU event swap\n", __func__); | ||
663 | |||
664 | /* clear the trace buffer, don't want to take PC for | ||
665 | * previous SPU*/ | ||
666 | cbe_write_pm(cpu, trace_address, 0); | ||
667 | |||
668 | enable_ctr(cpu, 0, pm_regs.pm07_cntrl); | ||
669 | |||
670 | /* Enable interrupts on the CPU thread that is starting */ | ||
671 | cbe_enable_pm_interrupts(cpu, hdw_thread, | ||
672 | interrupt_mask); | ||
673 | cbe_enable_pm(cpu); | ||
566 | } | 674 | } |
567 | 675 | ||
568 | pm_rtas_token = rtas_token("ibm,cbe-perftools"); | 676 | spin_unlock_irqrestore(&cntr_lock, flags); |
569 | 677 | ||
678 | /* swap approximately every 0.1 seconds */ | ||
679 | mod_timer(&timer_spu_event_swap, jiffies + HZ / 25); | ||
680 | } | ||
681 | |||
682 | static void start_spu_event_swap(void) | ||
683 | { | ||
684 | init_timer(&timer_spu_event_swap); | ||
685 | timer_spu_event_swap.function = spu_evnt_swap; | ||
686 | timer_spu_event_swap.data = 0UL; | ||
687 | timer_spu_event_swap.expires = jiffies + HZ / 25; | ||
688 | add_timer(&timer_spu_event_swap); | ||
689 | } | ||
690 | |||
691 | static int cell_reg_setup_spu_events(struct op_counter_config *ctr, | ||
692 | struct op_system_config *sys, int num_ctrs) | ||
693 | { | ||
694 | int i; | ||
695 | |||
696 | /* routine is called once for all nodes */ | ||
697 | |||
698 | spu_evnt_phys_spu_indx = 0; | ||
570 | /* | 699 | /* |
571 | * For all events excetp PPU CYCLEs, each node will need to make | 700 | * For all events except PPU CYCLEs, each node will need to make |
572 | * the rtas cbe-perftools call to setup and reset the debug bus. | 701 | * the rtas cbe-perftools call to setup and reset the debug bus. |
573 | * Make the token lookup call once and store it in the global | 702 | * Make the token lookup call once and store it in the global |
574 | * variable pm_rtas_token. | 703 | * variable pm_rtas_token. |
575 | */ | 704 | */ |
705 | pm_rtas_token = rtas_token("ibm,cbe-perftools"); | ||
706 | |||
576 | if (unlikely(pm_rtas_token == RTAS_UNKNOWN_SERVICE)) { | 707 | if (unlikely(pm_rtas_token == RTAS_UNKNOWN_SERVICE)) { |
577 | printk(KERN_ERR | 708 | printk(KERN_ERR |
578 | "%s: rtas token ibm,cbe-perftools unknown\n", | 709 | "%s: rtas token ibm,cbe-perftools unknown\n", |
@@ -580,6 +711,58 @@ static int cell_reg_setup(struct op_counter_config *ctr, | |||
580 | return -EIO; | 711 | return -EIO; |
581 | } | 712 | } |
582 | 713 | ||
714 | /* setup the pm_control register settings, | ||
715 | * settings will be written per node by the | ||
716 | * cell_cpu_setup() function. | ||
717 | */ | ||
718 | pm_regs.pm_cntrl.trace_buf_ovflw = 1; | ||
719 | |||
720 | /* Use the occurrence trace mode to have SPU PC saved | ||
721 | * to the trace buffer. Occurrence data in trace buffer | ||
722 | * is not used. Bit 2 must be set to store SPU addresses. | ||
723 | */ | ||
724 | pm_regs.pm_cntrl.trace_mode = 2; | ||
725 | |||
726 | pm_regs.pm_cntrl.spu_addr_trace = 0x1; /* using debug bus | ||
727 | event 2 & 3 */ | ||
728 | |||
729 | /* setup the debug bus event array with the SPU PC routing events. | ||
730 | * Note, pm_signal[0] will be filled in by set_pm_event() call below. | ||
731 | */ | ||
732 | pm_signal[1].signal_group = SPU_PROFILE_EVENT_ADDR / 100; | ||
733 | pm_signal[1].bus_word = GET_BUS_WORD(SPU_PROFILE_EVENT_ADDR_MASK_A); | ||
734 | pm_signal[1].bit = SPU_PROFILE_EVENT_ADDR % 100; | ||
735 | pm_signal[1].sub_unit = spu_evnt_phys_spu_indx; | ||
736 | |||
737 | pm_signal[2].signal_group = SPU_PROFILE_EVENT_ADDR / 100; | ||
738 | pm_signal[2].bus_word = GET_BUS_WORD(SPU_PROFILE_EVENT_ADDR_MASK_B); | ||
739 | pm_signal[2].bit = SPU_PROFILE_EVENT_ADDR % 100; | ||
740 | pm_signal[2].sub_unit = spu_evnt_phys_spu_indx; | ||
741 | |||
742 | /* Set the user selected spu event to profile on, | ||
743 | * note, only one SPU profiling event is supported | ||
744 | */ | ||
745 | num_counters = 1; /* Only support one SPU event at a time */ | ||
746 | set_pm_event(0, ctr[0].event, ctr[0].unit_mask); | ||
747 | |||
748 | reset_value[0] = 0xFFFFFFFF - ctr[0].count; | ||
749 | |||
750 | /* global, used by cell_cpu_setup */ | ||
751 | ctr_enabled |= 1; | ||
752 | |||
753 | /* Initialize the count for each SPU to the reset value */ | ||
754 | for (i=0; i < MAX_NUMNODES * NUM_SPUS_PER_NODE; i++) | ||
755 | spu_pm_cnt[i] = reset_value[0]; | ||
756 | |||
757 | return 0; | ||
758 | } | ||
759 | |||
760 | static int cell_reg_setup_ppu(struct op_counter_config *ctr, | ||
761 | struct op_system_config *sys, int num_ctrs) | ||
762 | { | ||
763 | /* routine is called once for all nodes */ | ||
764 | int i, j, cpu; | ||
765 | |||
583 | num_counters = num_ctrs; | 766 | num_counters = num_ctrs; |
584 | 767 | ||
585 | if (unlikely(num_ctrs > NR_PHYS_CTRS)) { | 768 | if (unlikely(num_ctrs > NR_PHYS_CTRS)) { |
@@ -589,14 +772,6 @@ static int cell_reg_setup(struct op_counter_config *ctr, | |||
589 | __func__); | 772 | __func__); |
590 | return -EIO; | 773 | return -EIO; |
591 | } | 774 | } |
592 | pm_regs.group_control = 0; | ||
593 | pm_regs.debug_bus_control = 0; | ||
594 | |||
595 | /* setup the pm_control register */ | ||
596 | memset(&pm_regs.pm_cntrl, 0, sizeof(struct pm_cntrl)); | ||
597 | pm_regs.pm_cntrl.stop_at_max = 1; | ||
598 | pm_regs.pm_cntrl.trace_mode = 0; | ||
599 | pm_regs.pm_cntrl.freeze = 1; | ||
600 | 775 | ||
601 | set_count_mode(sys->enable_kernel, sys->enable_user); | 776 | set_count_mode(sys->enable_kernel, sys->enable_user); |
602 | 777 | ||
@@ -665,6 +840,63 @@ static int cell_reg_setup(struct op_counter_config *ctr, | |||
665 | } | 840 | } |
666 | 841 | ||
667 | 842 | ||
843 | /* This function is called once for all cpus combined */ | ||
844 | static int cell_reg_setup(struct op_counter_config *ctr, | ||
845 | struct op_system_config *sys, int num_ctrs) | ||
846 | { | ||
847 | int ret=0; | ||
848 | spu_cycle_reset = 0; | ||
849 | |||
850 | /* initialize the spu_arr_trace value, will be reset if | ||
851 | * doing spu event profiling. | ||
852 | */ | ||
853 | pm_regs.group_control = 0; | ||
854 | pm_regs.debug_bus_control = 0; | ||
855 | pm_regs.pm_cntrl.stop_at_max = 1; | ||
856 | pm_regs.pm_cntrl.trace_mode = 0; | ||
857 | pm_regs.pm_cntrl.freeze = 1; | ||
858 | pm_regs.pm_cntrl.trace_buf_ovflw = 0; | ||
859 | pm_regs.pm_cntrl.spu_addr_trace = 0; | ||
860 | |||
861 | /* | ||
862 | * For all events except PPU CYCLEs, each node will need to make | ||
863 | * the rtas cbe-perftools call to setup and reset the debug bus. | ||
864 | * Make the token lookup call once and store it in the global | ||
865 | * variable pm_rtas_token. | ||
866 | */ | ||
867 | pm_rtas_token = rtas_token("ibm,cbe-perftools"); | ||
868 | |||
869 | if (unlikely(pm_rtas_token == RTAS_UNKNOWN_SERVICE)) { | ||
870 | printk(KERN_ERR | ||
871 | "%s: rtas token ibm,cbe-perftools unknown\n", | ||
872 | __func__); | ||
873 | return -EIO; | ||
874 | } | ||
875 | |||
876 | if (ctr[0].event == SPU_CYCLES_EVENT_NUM) { | ||
877 | profiling_mode = SPU_PROFILING_CYCLES; | ||
878 | ret = cell_reg_setup_spu_cycles(ctr, sys, num_ctrs); | ||
879 | } else if ((ctr[0].event >= SPU_EVENT_NUM_START) && | ||
880 | (ctr[0].event <= SPU_EVENT_NUM_STOP)) { | ||
881 | profiling_mode = SPU_PROFILING_EVENTS; | ||
882 | spu_cycle_reset = ctr[0].count; | ||
883 | |||
884 | /* for SPU event profiling, need to setup the | ||
885 | * pm_signal array with the events to route the | ||
886 | * SPU PC before making the FW call. Note, only | ||
887 | * one SPU event for profiling can be specified | ||
888 | * at a time. | ||
889 | */ | ||
890 | cell_reg_setup_spu_events(ctr, sys, num_ctrs); | ||
891 | } else { | ||
892 | profiling_mode = PPU_PROFILING; | ||
893 | ret = cell_reg_setup_ppu(ctr, sys, num_ctrs); | ||
894 | } | ||
895 | |||
896 | return ret; | ||
897 | } | ||
898 | |||
899 | |||
668 | 900 | ||
669 | /* This function is called once for each cpu */ | 901 | /* This function is called once for each cpu */ |
670 | static int cell_cpu_setup(struct op_counter_config *cntr) | 902 | static int cell_cpu_setup(struct op_counter_config *cntr) |
@@ -672,8 +904,13 @@ static int cell_cpu_setup(struct op_counter_config *cntr) | |||
672 | u32 cpu = smp_processor_id(); | 904 | u32 cpu = smp_processor_id(); |
673 | u32 num_enabled = 0; | 905 | u32 num_enabled = 0; |
674 | int i; | 906 | int i; |
907 | int ret; | ||
675 | 908 | ||
676 | if (spu_cycle_reset) | 909 | /* Cycle based SPU profiling does not use the performance |
910 | * counters. The trace array is configured to collect | ||
911 | * the data. | ||
912 | */ | ||
913 | if (profiling_mode == SPU_PROFILING_CYCLES) | ||
677 | return 0; | 914 | return 0; |
678 | 915 | ||
679 | /* There is one performance monitor per processor chip (i.e. node), | 916 | /* There is one performance monitor per processor chip (i.e. node), |
@@ -686,7 +923,6 @@ static int cell_cpu_setup(struct op_counter_config *cntr) | |||
686 | cbe_disable_pm(cpu); | 923 | cbe_disable_pm(cpu); |
687 | cbe_disable_pm_interrupts(cpu); | 924 | cbe_disable_pm_interrupts(cpu); |
688 | 925 | ||
689 | cbe_write_pm(cpu, pm_interval, 0); | ||
690 | cbe_write_pm(cpu, pm_start_stop, 0); | 926 | cbe_write_pm(cpu, pm_start_stop, 0); |
691 | cbe_write_pm(cpu, group_control, pm_regs.group_control); | 927 | cbe_write_pm(cpu, group_control, pm_regs.group_control); |
692 | cbe_write_pm(cpu, debug_bus_control, pm_regs.debug_bus_control); | 928 | cbe_write_pm(cpu, debug_bus_control, pm_regs.debug_bus_control); |
@@ -703,7 +939,20 @@ static int cell_cpu_setup(struct op_counter_config *cntr) | |||
703 | * The pm_rtas_activate_signals will return -EIO if the FW | 939 | * The pm_rtas_activate_signals will return -EIO if the FW |
704 | * call failed. | 940 | * call failed. |
705 | */ | 941 | */ |
706 | return pm_rtas_activate_signals(cbe_cpu_to_node(cpu), num_enabled); | 942 | if (profiling_mode == SPU_PROFILING_EVENTS) { |
943 | /* For SPU event profiling also need to setup the | ||
944 | * pm interval timer | ||
945 | */ | ||
946 | ret = pm_rtas_activate_signals(cbe_cpu_to_node(cpu), | ||
947 | num_enabled+2); | ||
948 | /* store PC from debug bus to Trace buffer as often | ||
949 | * as possible (every 10 cycles) | ||
950 | */ | ||
951 | cbe_write_pm(cpu, pm_interval, NUM_INTERVAL_CYC); | ||
952 | return ret; | ||
953 | } else | ||
954 | return pm_rtas_activate_signals(cbe_cpu_to_node(cpu), | ||
955 | num_enabled); | ||
707 | } | 956 | } |
708 | 957 | ||
709 | #define ENTRIES 303 | 958 | #define ENTRIES 303 |
@@ -885,7 +1134,122 @@ static struct notifier_block cpu_freq_notifier_block = { | |||
885 | }; | 1134 | }; |
886 | #endif | 1135 | #endif |
887 | 1136 | ||
888 | static int cell_global_start_spu(struct op_counter_config *ctr) | 1137 | /* |
1138 | * Note the generic OProfile stop calls do not support returning | ||
1139 | * an error on stop. Hence, will not return an error if the FW | ||
1140 | * calls fail on stop. Failure to reset the debug bus is not an issue. | ||
1141 | * Failure to disable the SPU profiling is not an issue. The FW calls | ||
1142 | * to enable the performance counters and debug bus will work even if | ||
1143 | * the hardware was not cleanly reset. | ||
1144 | */ | ||
1145 | static void cell_global_stop_spu_cycles(void) | ||
1146 | { | ||
1147 | int subfunc, rtn_value; | ||
1148 | unsigned int lfsr_value; | ||
1149 | int cpu; | ||
1150 | |||
1151 | oprofile_running = 0; | ||
1152 | smp_wmb(); | ||
1153 | |||
1154 | #ifdef CONFIG_CPU_FREQ | ||
1155 | cpufreq_unregister_notifier(&cpu_freq_notifier_block, | ||
1156 | CPUFREQ_TRANSITION_NOTIFIER); | ||
1157 | #endif | ||
1158 | |||
1159 | for_each_online_cpu(cpu) { | ||
1160 | if (cbe_get_hw_thread_id(cpu)) | ||
1161 | continue; | ||
1162 | |||
1163 | subfunc = 3; /* | ||
1164 | * 2 - activate SPU tracing, | ||
1165 | * 3 - deactivate | ||
1166 | */ | ||
1167 | lfsr_value = 0x8f100000; | ||
1168 | |||
1169 | rtn_value = rtas_call(spu_rtas_token, 3, 1, NULL, | ||
1170 | subfunc, cbe_cpu_to_node(cpu), | ||
1171 | lfsr_value); | ||
1172 | |||
1173 | if (unlikely(rtn_value != 0)) { | ||
1174 | printk(KERN_ERR | ||
1175 | "%s: rtas call ibm,cbe-spu-perftools " \ | ||
1176 | "failed, return = %d\n", | ||
1177 | __func__, rtn_value); | ||
1178 | } | ||
1179 | |||
1180 | /* Deactivate the signals */ | ||
1181 | pm_rtas_reset_signals(cbe_cpu_to_node(cpu)); | ||
1182 | } | ||
1183 | |||
1184 | stop_spu_profiling_cycles(); | ||
1185 | } | ||
1186 | |||
1187 | static void cell_global_stop_spu_events(void) | ||
1188 | { | ||
1189 | int cpu; | ||
1190 | oprofile_running = 0; | ||
1191 | |||
1192 | stop_spu_profiling_events(); | ||
1193 | smp_wmb(); | ||
1194 | |||
1195 | for_each_online_cpu(cpu) { | ||
1196 | if (cbe_get_hw_thread_id(cpu)) | ||
1197 | continue; | ||
1198 | |||
1199 | cbe_sync_irq(cbe_cpu_to_node(cpu)); | ||
1200 | /* Stop the counters */ | ||
1201 | cbe_disable_pm(cpu); | ||
1202 | cbe_write_pm07_control(cpu, 0, 0); | ||
1203 | |||
1204 | /* Deactivate the signals */ | ||
1205 | pm_rtas_reset_signals(cbe_cpu_to_node(cpu)); | ||
1206 | |||
1207 | /* Deactivate interrupts */ | ||
1208 | cbe_disable_pm_interrupts(cpu); | ||
1209 | } | ||
1210 | del_timer_sync(&timer_spu_event_swap); | ||
1211 | } | ||
1212 | |||
1213 | static void cell_global_stop_ppu(void) | ||
1214 | { | ||
1215 | int cpu; | ||
1216 | |||
1217 | /* | ||
1218 | * This routine will be called once for the system. | ||
1219 | * There is one performance monitor per node, so we | ||
1220 | * only need to perform this function once per node. | ||
1221 | */ | ||
1222 | del_timer_sync(&timer_virt_cntr); | ||
1223 | oprofile_running = 0; | ||
1224 | smp_wmb(); | ||
1225 | |||
1226 | for_each_online_cpu(cpu) { | ||
1227 | if (cbe_get_hw_thread_id(cpu)) | ||
1228 | continue; | ||
1229 | |||
1230 | cbe_sync_irq(cbe_cpu_to_node(cpu)); | ||
1231 | /* Stop the counters */ | ||
1232 | cbe_disable_pm(cpu); | ||
1233 | |||
1234 | /* Deactivate the signals */ | ||
1235 | pm_rtas_reset_signals(cbe_cpu_to_node(cpu)); | ||
1236 | |||
1237 | /* Deactivate interrupts */ | ||
1238 | cbe_disable_pm_interrupts(cpu); | ||
1239 | } | ||
1240 | } | ||
1241 | |||
1242 | static void cell_global_stop(void) | ||
1243 | { | ||
1244 | if (profiling_mode == PPU_PROFILING) | ||
1245 | cell_global_stop_ppu(); | ||
1246 | else if (profiling_mode == SPU_PROFILING_EVENTS) | ||
1247 | cell_global_stop_spu_events(); | ||
1248 | else | ||
1249 | cell_global_stop_spu_cycles(); | ||
1250 | } | ||
1251 | |||
1252 | static int cell_global_start_spu_cycles(struct op_counter_config *ctr) | ||
889 | { | 1253 | { |
890 | int subfunc; | 1254 | int subfunc; |
891 | unsigned int lfsr_value; | 1255 | unsigned int lfsr_value; |
@@ -951,18 +1315,18 @@ static int cell_global_start_spu(struct op_counter_config *ctr) | |||
951 | 1315 | ||
952 | /* start profiling */ | 1316 | /* start profiling */ |
953 | ret = rtas_call(spu_rtas_token, 3, 1, NULL, subfunc, | 1317 | ret = rtas_call(spu_rtas_token, 3, 1, NULL, subfunc, |
954 | cbe_cpu_to_node(cpu), lfsr_value); | 1318 | cbe_cpu_to_node(cpu), lfsr_value); |
955 | 1319 | ||
956 | if (unlikely(ret != 0)) { | 1320 | if (unlikely(ret != 0)) { |
957 | printk(KERN_ERR | 1321 | printk(KERN_ERR |
958 | "%s: rtas call ibm,cbe-spu-perftools failed, return = %d\n", | 1322 | "%s: rtas call ibm,cbe-spu-perftools failed, " \ |
959 | __func__, ret); | 1323 | "return = %d\n", __func__, ret); |
960 | rtas_error = -EIO; | 1324 | rtas_error = -EIO; |
961 | goto out; | 1325 | goto out; |
962 | } | 1326 | } |
963 | } | 1327 | } |
964 | 1328 | ||
965 | rtas_error = start_spu_profiling(spu_cycle_reset); | 1329 | rtas_error = start_spu_profiling_cycles(spu_cycle_reset); |
966 | if (rtas_error) | 1330 | if (rtas_error) |
967 | goto out_stop; | 1331 | goto out_stop; |
968 | 1332 | ||
@@ -970,11 +1334,74 @@ static int cell_global_start_spu(struct op_counter_config *ctr) | |||
970 | return 0; | 1334 | return 0; |
971 | 1335 | ||
972 | out_stop: | 1336 | out_stop: |
973 | cell_global_stop_spu(); /* clean up the PMU/debug bus */ | 1337 | cell_global_stop_spu_cycles(); /* clean up the PMU/debug bus */ |
974 | out: | 1338 | out: |
975 | return rtas_error; | 1339 | return rtas_error; |
976 | } | 1340 | } |
977 | 1341 | ||
1342 | static int cell_global_start_spu_events(struct op_counter_config *ctr) | ||
1343 | { | ||
1344 | int cpu; | ||
1345 | u32 interrupt_mask = 0; | ||
1346 | int rtn = 0; | ||
1347 | |||
1348 | hdw_thread = 0; | ||
1349 | |||
1350 | /* spu event profiling, uses the performance counters to generate | ||
1351 | * an interrupt. The hardware is setup to store the SPU program | ||
1352 | * counter into the trace array. The occurrence mode is used to | ||
1353 | * enable storing data to the trace buffer. The bits are set | ||
1354 | * to send/store the SPU address in the trace buffer. The debug | ||
1355 | * bus must be setup to route the SPU program counter onto the | ||
1356 | * debug bus. The occurrence data in the trace buffer is not used. | ||
1357 | */ | ||
1358 | |||
1359 | /* This routine gets called once for the system. | ||
1360 | * There is one performance monitor per node, so we | ||
1361 | * only need to perform this function once per node. | ||
1362 | */ | ||
1363 | |||
1364 | for_each_online_cpu(cpu) { | ||
1365 | if (cbe_get_hw_thread_id(cpu)) | ||
1366 | continue; | ||
1367 | |||
1368 | /* | ||
1369 | * Setup SPU event-based profiling. | ||
1370 | * Set perf_mon_control bit 0 to a zero before | ||
1371 | * enabling spu collection hardware. | ||
1372 | * | ||
1373 | * Only support one SPU event on one SPU per node. | ||
1374 | */ | ||
1375 | if (ctr_enabled & 1) { | ||
1376 | cbe_write_ctr(cpu, 0, reset_value[0]); | ||
1377 | enable_ctr(cpu, 0, pm_regs.pm07_cntrl); | ||
1378 | interrupt_mask |= | ||
1379 | CBE_PM_CTR_OVERFLOW_INTR(0); | ||
1380 | } else { | ||
1381 | /* Disable counter */ | ||
1382 | cbe_write_pm07_control(cpu, 0, 0); | ||
1383 | } | ||
1384 | |||
1385 | cbe_get_and_clear_pm_interrupts(cpu); | ||
1386 | cbe_enable_pm_interrupts(cpu, hdw_thread, interrupt_mask); | ||
1387 | cbe_enable_pm(cpu); | ||
1388 | |||
1389 | /* clear the trace buffer */ | ||
1390 | cbe_write_pm(cpu, trace_address, 0); | ||
1391 | } | ||
1392 | |||
1393 | /* Start the timer to time slice collecting the event profile | ||
1394 | * on each of the SPUs. Note, can collect profile on one SPU | ||
1395 | * per node at a time. | ||
1396 | */ | ||
1397 | start_spu_event_swap(); | ||
1398 | start_spu_profiling_events(); | ||
1399 | oprofile_running = 1; | ||
1400 | smp_wmb(); | ||
1401 | |||
1402 | return rtn; | ||
1403 | } | ||
1404 | |||
978 | static int cell_global_start_ppu(struct op_counter_config *ctr) | 1405 | static int cell_global_start_ppu(struct op_counter_config *ctr) |
979 | { | 1406 | { |
980 | u32 cpu, i; | 1407 | u32 cpu, i; |
@@ -994,8 +1421,7 @@ static int cell_global_start_ppu(struct op_counter_config *ctr) | |||
994 | if (ctr_enabled & (1 << i)) { | 1421 | if (ctr_enabled & (1 << i)) { |
995 | cbe_write_ctr(cpu, i, reset_value[i]); | 1422 | cbe_write_ctr(cpu, i, reset_value[i]); |
996 | enable_ctr(cpu, i, pm_regs.pm07_cntrl); | 1423 | enable_ctr(cpu, i, pm_regs.pm07_cntrl); |
997 | interrupt_mask |= | 1424 | interrupt_mask |= CBE_PM_CTR_OVERFLOW_INTR(i); |
998 | CBE_PM_CTR_OVERFLOW_INTR(i); | ||
999 | } else { | 1425 | } else { |
1000 | /* Disable counter */ | 1426 | /* Disable counter */ |
1001 | cbe_write_pm07_control(cpu, i, 0); | 1427 | cbe_write_pm07_control(cpu, i, 0); |
@@ -1024,99 +1450,162 @@ static int cell_global_start_ppu(struct op_counter_config *ctr) | |||
1024 | 1450 | ||
1025 | static int cell_global_start(struct op_counter_config *ctr) | 1451 | static int cell_global_start(struct op_counter_config *ctr) |
1026 | { | 1452 | { |
1027 | if (spu_cycle_reset) | 1453 | if (profiling_mode == SPU_PROFILING_CYCLES) |
1028 | return cell_global_start_spu(ctr); | 1454 | return cell_global_start_spu_cycles(ctr); |
1455 | else if (profiling_mode == SPU_PROFILING_EVENTS) | ||
1456 | return cell_global_start_spu_events(ctr); | ||
1029 | else | 1457 | else |
1030 | return cell_global_start_ppu(ctr); | 1458 | return cell_global_start_ppu(ctr); |
1031 | } | 1459 | } |
1032 | 1460 | ||
1033 | /* | 1461 | |
1034 | * Note the generic OProfile stop calls do not support returning | 1462 | /* The SPU interrupt handler |
1035 | * an error on stop. Hence, will not return an error if the FW | 1463 | * |
1036 | * calls fail on stop. Failure to reset the debug bus is not an issue. | 1464 | * SPU event profiling works as follows: |
1037 | * Failure to disable the SPU profiling is not an issue. The FW calls | 1465 | * The pm_signal[0] holds the one SPU event to be measured. It is routed on |
1038 | * to enable the performance counters and debug bus will work even if | 1466 | * the debug bus using word 0 or 1. The value of pm_signal[1] and |
1039 | * the hardware was not cleanly reset. | 1467 | * pm_signal[2] contain the necessary events to route the SPU program |
1468 | * counter for the selected SPU onto the debug bus using words 2 and 3. | ||
1469 | * The pm_interval register is setup to write the SPU PC value into the | ||
1470 | * trace buffer at the maximum rate possible. The trace buffer is configured | ||
1471 | * to store the PCs, wrapping when it is full. The performance counter is | ||
1472 | * intialized to the max hardware count minus the number of events, N, between | ||
1473 | * samples. Once the N events have occured, a HW counter overflow occurs | ||
1474 | * causing the generation of a HW counter interrupt which also stops the | ||
1475 | * writing of the SPU PC values to the trace buffer. Hence the last PC | ||
1476 | * written to the trace buffer is the SPU PC that we want. Unfortunately, | ||
1477 | * we have to read from the beginning of the trace buffer to get to the | ||
1478 | * last value written. We just hope the PPU has nothing better to do then | ||
1479 | * service this interrupt. The PC for the specific SPU being profiled is | ||
1480 | * extracted from the trace buffer processed and stored. The trace buffer | ||
1481 | * is cleared, interrupts are cleared, the counter is reset to max - N. | ||
1482 | * A kernel timer is used to periodically call the routine spu_evnt_swap() | ||
1483 | * to switch to the next physical SPU in the node to profile in round robbin | ||
1484 | * order. This way data is collected for all SPUs on the node. It does mean | ||
1485 | * that we need to use a relatively small value of N to ensure enough samples | ||
1486 | * on each SPU are collected each SPU is being profiled 1/8 of the time. | ||
1487 | * It may also be necessary to use a longer sample collection period. | ||
1040 | */ | 1488 | */ |
1041 | static void cell_global_stop_spu(void) | 1489 | static void cell_handle_interrupt_spu(struct pt_regs *regs, |
1490 | struct op_counter_config *ctr) | ||
1042 | { | 1491 | { |
1043 | int subfunc, rtn_value; | 1492 | u32 cpu, cpu_tmp; |
1044 | unsigned int lfsr_value; | 1493 | u64 trace_entry; |
1045 | int cpu; | 1494 | u32 interrupt_mask; |
1495 | u64 trace_buffer[2]; | ||
1496 | u64 last_trace_buffer; | ||
1497 | u32 sample; | ||
1498 | u32 trace_addr; | ||
1499 | unsigned long sample_array_lock_flags; | ||
1500 | int spu_num; | ||
1501 | unsigned long flags; | ||
1046 | 1502 | ||
1047 | oprofile_running = 0; | 1503 | /* Make sure spu event interrupt handler and spu event swap |
1504 | * don't access the counters simultaneously. | ||
1505 | */ | ||
1506 | cpu = smp_processor_id(); | ||
1507 | spin_lock_irqsave(&cntr_lock, flags); | ||
1048 | 1508 | ||
1049 | #ifdef CONFIG_CPU_FREQ | 1509 | cpu_tmp = cpu; |
1050 | cpufreq_unregister_notifier(&cpu_freq_notifier_block, | 1510 | cbe_disable_pm(cpu); |
1051 | CPUFREQ_TRANSITION_NOTIFIER); | ||
1052 | #endif | ||
1053 | 1511 | ||
1054 | for_each_online_cpu(cpu) { | 1512 | interrupt_mask = cbe_get_and_clear_pm_interrupts(cpu); |
1055 | if (cbe_get_hw_thread_id(cpu)) | ||
1056 | continue; | ||
1057 | 1513 | ||
1058 | subfunc = 3; /* | 1514 | sample = 0xABCDEF; |
1059 | * 2 - activate SPU tracing, | 1515 | trace_entry = 0xfedcba; |
1060 | * 3 - deactivate | 1516 | last_trace_buffer = 0xdeadbeaf; |
1061 | */ | ||
1062 | lfsr_value = 0x8f100000; | ||
1063 | 1517 | ||
1064 | rtn_value = rtas_call(spu_rtas_token, 3, 1, NULL, | 1518 | if ((oprofile_running == 1) && (interrupt_mask != 0)) { |
1065 | subfunc, cbe_cpu_to_node(cpu), | 1519 | /* disable writes to trace buff */ |
1066 | lfsr_value); | 1520 | cbe_write_pm(cpu, pm_interval, 0); |
1067 | 1521 | ||
1068 | if (unlikely(rtn_value != 0)) { | 1522 | /* only have one perf cntr being used, cntr 0 */ |
1069 | printk(KERN_ERR | 1523 | if ((interrupt_mask & CBE_PM_CTR_OVERFLOW_INTR(0)) |
1070 | "%s: rtas call ibm,cbe-spu-perftools failed, return = %d\n", | 1524 | && ctr[0].enabled) |
1071 | __func__, rtn_value); | 1525 | /* The SPU PC values will be read |
1526 | * from the trace buffer, reset counter | ||
1527 | */ | ||
1528 | |||
1529 | cbe_write_ctr(cpu, 0, reset_value[0]); | ||
1530 | |||
1531 | trace_addr = cbe_read_pm(cpu, trace_address); | ||
1532 | |||
1533 | while (!(trace_addr & CBE_PM_TRACE_BUF_EMPTY)) { | ||
1534 | /* There is data in the trace buffer to process | ||
1535 | * Read the buffer until you get to the last | ||
1536 | * entry. This is the value we want. | ||
1537 | */ | ||
1538 | |||
1539 | cbe_read_trace_buffer(cpu, trace_buffer); | ||
1540 | trace_addr = cbe_read_pm(cpu, trace_address); | ||
1072 | } | 1541 | } |
1073 | 1542 | ||
1074 | /* Deactivate the signals */ | 1543 | /* SPU Address 16 bit count format for 128 bit |
1075 | pm_rtas_reset_signals(cbe_cpu_to_node(cpu)); | 1544 | * HW trace buffer is used for the SPU PC storage |
1076 | } | 1545 | * HDR bits 0:15 |
1546 | * SPU Addr 0 bits 16:31 | ||
1547 | * SPU Addr 1 bits 32:47 | ||
1548 | * unused bits 48:127 | ||
1549 | * | ||
1550 | * HDR: bit4 = 1 SPU Address 0 valid | ||
1551 | * HDR: bit5 = 1 SPU Address 1 valid | ||
1552 | * - unfortunately, the valid bits don't seem to work | ||
1553 | * | ||
1554 | * Note trace_buffer[0] holds bits 0:63 of the HW | ||
1555 | * trace buffer, trace_buffer[1] holds bits 64:127 | ||
1556 | */ | ||
1077 | 1557 | ||
1078 | stop_spu_profiling(); | 1558 | trace_entry = trace_buffer[0] |
1079 | } | 1559 | & 0x00000000FFFF0000; |
1080 | 1560 | ||
1081 | static void cell_global_stop_ppu(void) | 1561 | /* only top 16 of the 18 bit SPU PC address |
1082 | { | 1562 | * is stored in trace buffer, hence shift right |
1083 | int cpu; | 1563 | * by 16 -2 bits */ |
1564 | sample = trace_entry >> 14; | ||
1565 | last_trace_buffer = trace_buffer[0]; | ||
1084 | 1566 | ||
1085 | /* | 1567 | spu_num = spu_evnt_phys_spu_indx |
1086 | * This routine will be called once for the system. | 1568 | + (cbe_cpu_to_node(cpu) * NUM_SPUS_PER_NODE); |
1087 | * There is one performance monitor per node, so we | ||
1088 | * only need to perform this function once per node. | ||
1089 | */ | ||
1090 | del_timer_sync(&timer_virt_cntr); | ||
1091 | oprofile_running = 0; | ||
1092 | smp_wmb(); | ||
1093 | 1569 | ||
1094 | for_each_online_cpu(cpu) { | 1570 | /* make sure only one process at a time is calling |
1095 | if (cbe_get_hw_thread_id(cpu)) | 1571 | * spu_sync_buffer() |
1096 | continue; | 1572 | */ |
1573 | spin_lock_irqsave(&oprof_spu_smpl_arry_lck, | ||
1574 | sample_array_lock_flags); | ||
1575 | spu_sync_buffer(spu_num, &sample, 1); | ||
1576 | spin_unlock_irqrestore(&oprof_spu_smpl_arry_lck, | ||
1577 | sample_array_lock_flags); | ||
1097 | 1578 | ||
1098 | cbe_sync_irq(cbe_cpu_to_node(cpu)); | 1579 | smp_wmb(); /* insure spu event buffer updates are written |
1099 | /* Stop the counters */ | 1580 | * don't want events intermingled... */ |
1100 | cbe_disable_pm(cpu); | ||
1101 | 1581 | ||
1102 | /* Deactivate the signals */ | 1582 | /* The counters were frozen by the interrupt. |
1103 | pm_rtas_reset_signals(cbe_cpu_to_node(cpu)); | 1583 | * Reenable the interrupt and restart the counters. |
1584 | */ | ||
1585 | cbe_write_pm(cpu, pm_interval, NUM_INTERVAL_CYC); | ||
1586 | cbe_enable_pm_interrupts(cpu, hdw_thread, | ||
1587 | virt_cntr_inter_mask); | ||
1104 | 1588 | ||
1105 | /* Deactivate interrupts */ | 1589 | /* clear the trace buffer, re-enable writes to trace buff */ |
1106 | cbe_disable_pm_interrupts(cpu); | 1590 | cbe_write_pm(cpu, trace_address, 0); |
1107 | } | 1591 | cbe_write_pm(cpu, pm_interval, NUM_INTERVAL_CYC); |
1108 | } | ||
1109 | 1592 | ||
1110 | static void cell_global_stop(void) | 1593 | /* The writes to the various performance counters only writes |
1111 | { | 1594 | * to a latch. The new values (interrupt setting bits, reset |
1112 | if (spu_cycle_reset) | 1595 | * counter value etc.) are not copied to the actual registers |
1113 | cell_global_stop_spu(); | 1596 | * until the performance monitor is enabled. In order to get |
1114 | else | 1597 | * this to work as desired, the permormance monitor needs to |
1115 | cell_global_stop_ppu(); | 1598 | * be disabled while writing to the latches. This is a |
1599 | * HW design issue. | ||
1600 | */ | ||
1601 | write_pm_cntrl(cpu); | ||
1602 | cbe_enable_pm(cpu); | ||
1603 | } | ||
1604 | spin_unlock_irqrestore(&cntr_lock, flags); | ||
1116 | } | 1605 | } |
1117 | 1606 | ||
1118 | static void cell_handle_interrupt(struct pt_regs *regs, | 1607 | static void cell_handle_interrupt_ppu(struct pt_regs *regs, |
1119 | struct op_counter_config *ctr) | 1608 | struct op_counter_config *ctr) |
1120 | { | 1609 | { |
1121 | u32 cpu; | 1610 | u32 cpu; |
1122 | u64 pc; | 1611 | u64 pc; |
@@ -1132,7 +1621,7 @@ static void cell_handle_interrupt(struct pt_regs *regs, | |||
1132 | * routine are not running at the same time. See the | 1621 | * routine are not running at the same time. See the |
1133 | * cell_virtual_cntr() routine for additional comments. | 1622 | * cell_virtual_cntr() routine for additional comments. |
1134 | */ | 1623 | */ |
1135 | spin_lock_irqsave(&virt_cntr_lock, flags); | 1624 | spin_lock_irqsave(&cntr_lock, flags); |
1136 | 1625 | ||
1137 | /* | 1626 | /* |
1138 | * Need to disable and reenable the performance counters | 1627 | * Need to disable and reenable the performance counters |
@@ -1185,7 +1674,16 @@ static void cell_handle_interrupt(struct pt_regs *regs, | |||
1185 | */ | 1674 | */ |
1186 | cbe_enable_pm(cpu); | 1675 | cbe_enable_pm(cpu); |
1187 | } | 1676 | } |
1188 | spin_unlock_irqrestore(&virt_cntr_lock, flags); | 1677 | spin_unlock_irqrestore(&cntr_lock, flags); |
1678 | } | ||
1679 | |||
1680 | static void cell_handle_interrupt(struct pt_regs *regs, | ||
1681 | struct op_counter_config *ctr) | ||
1682 | { | ||
1683 | if (profiling_mode == PPU_PROFILING) | ||
1684 | cell_handle_interrupt_ppu(regs, ctr); | ||
1685 | else | ||
1686 | cell_handle_interrupt_spu(regs, ctr); | ||
1189 | } | 1687 | } |
1190 | 1688 | ||
1191 | /* | 1689 | /* |
@@ -1195,7 +1693,8 @@ static void cell_handle_interrupt(struct pt_regs *regs, | |||
1195 | */ | 1693 | */ |
1196 | static int cell_sync_start(void) | 1694 | static int cell_sync_start(void) |
1197 | { | 1695 | { |
1198 | if (spu_cycle_reset) | 1696 | if ((profiling_mode == SPU_PROFILING_CYCLES) || |
1697 | (profiling_mode == SPU_PROFILING_EVENTS)) | ||
1199 | return spu_sync_start(); | 1698 | return spu_sync_start(); |
1200 | else | 1699 | else |
1201 | return DO_GENERIC_SYNC; | 1700 | return DO_GENERIC_SYNC; |
@@ -1203,7 +1702,8 @@ static int cell_sync_start(void) | |||
1203 | 1702 | ||
1204 | static int cell_sync_stop(void) | 1703 | static int cell_sync_stop(void) |
1205 | { | 1704 | { |
1206 | if (spu_cycle_reset) | 1705 | if ((profiling_mode == SPU_PROFILING_CYCLES) || |
1706 | (profiling_mode == SPU_PROFILING_EVENTS)) | ||
1207 | return spu_sync_stop(); | 1707 | return spu_sync_stop(); |
1208 | else | 1708 | else |
1209 | return 1; | 1709 | return 1; |
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c b/arch/powerpc/platforms/52xx/mpc52xx_common.c index ae7c34f37e1c..98367a0255f3 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_common.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c | |||
@@ -42,7 +42,7 @@ static struct of_device_id mpc52xx_bus_ids[] __initdata = { | |||
42 | * from interrupt context while node mapping (which calls ioremap()) | 42 | * from interrupt context while node mapping (which calls ioremap()) |
43 | * cannot be used at such point. | 43 | * cannot be used at such point. |
44 | */ | 44 | */ |
45 | static spinlock_t mpc52xx_lock = SPIN_LOCK_UNLOCKED; | 45 | static DEFINE_SPINLOCK(mpc52xx_lock); |
46 | static struct mpc52xx_gpt __iomem *mpc52xx_wdt; | 46 | static struct mpc52xx_gpt __iomem *mpc52xx_wdt; |
47 | static struct mpc52xx_cdm __iomem *mpc52xx_cdm; | 47 | static struct mpc52xx_cdm __iomem *mpc52xx_cdm; |
48 | 48 | ||
diff --git a/arch/powerpc/platforms/83xx/mpc831x_rdb.c b/arch/powerpc/platforms/83xx/mpc831x_rdb.c index a428f8d1ac80..5177bdd2c62a 100644 --- a/arch/powerpc/platforms/83xx/mpc831x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc831x_rdb.c | |||
@@ -42,7 +42,7 @@ static void __init mpc831x_rdb_setup_arch(void) | |||
42 | mpc831x_usb_cfg(); | 42 | mpc831x_usb_cfg(); |
43 | } | 43 | } |
44 | 44 | ||
45 | void __init mpc831x_rdb_init_IRQ(void) | 45 | static void __init mpc831x_rdb_init_IRQ(void) |
46 | { | 46 | { |
47 | struct device_node *np; | 47 | struct device_node *np; |
48 | 48 | ||
diff --git a/arch/powerpc/platforms/83xx/mpc832x_mds.c b/arch/powerpc/platforms/83xx/mpc832x_mds.c index ec43477caa63..ec0b401bc9cf 100644 --- a/arch/powerpc/platforms/83xx/mpc832x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c | |||
@@ -49,8 +49,6 @@ | |||
49 | #define DBG(fmt...) | 49 | #define DBG(fmt...) |
50 | #endif | 50 | #endif |
51 | 51 | ||
52 | static u8 *bcsr_regs = NULL; | ||
53 | |||
54 | /* ************************************************************************ | 52 | /* ************************************************************************ |
55 | * | 53 | * |
56 | * Setup the architecture | 54 | * Setup the architecture |
@@ -59,13 +57,14 @@ static u8 *bcsr_regs = NULL; | |||
59 | static void __init mpc832x_sys_setup_arch(void) | 57 | static void __init mpc832x_sys_setup_arch(void) |
60 | { | 58 | { |
61 | struct device_node *np; | 59 | struct device_node *np; |
60 | u8 __iomem *bcsr_regs = NULL; | ||
62 | 61 | ||
63 | if (ppc_md.progress) | 62 | if (ppc_md.progress) |
64 | ppc_md.progress("mpc832x_sys_setup_arch()", 0); | 63 | ppc_md.progress("mpc832x_sys_setup_arch()", 0); |
65 | 64 | ||
66 | /* Map BCSR area */ | 65 | /* Map BCSR area */ |
67 | np = of_find_node_by_name(NULL, "bcsr"); | 66 | np = of_find_node_by_name(NULL, "bcsr"); |
68 | if (np != 0) { | 67 | if (np) { |
69 | struct resource res; | 68 | struct resource res; |
70 | 69 | ||
71 | of_address_to_resource(np, 0, &res); | 70 | of_address_to_resource(np, 0, &res); |
@@ -93,9 +92,9 @@ static void __init mpc832x_sys_setup_arch(void) | |||
93 | != NULL){ | 92 | != NULL){ |
94 | /* Reset the Ethernet PHYs */ | 93 | /* Reset the Ethernet PHYs */ |
95 | #define BCSR8_FETH_RST 0x50 | 94 | #define BCSR8_FETH_RST 0x50 |
96 | bcsr_regs[8] &= ~BCSR8_FETH_RST; | 95 | clrbits8(&bcsr_regs[8], BCSR8_FETH_RST); |
97 | udelay(1000); | 96 | udelay(1000); |
98 | bcsr_regs[8] |= BCSR8_FETH_RST; | 97 | setbits8(&bcsr_regs[8], BCSR8_FETH_RST); |
99 | iounmap(bcsr_regs); | 98 | iounmap(bcsr_regs); |
100 | of_node_put(np); | 99 | of_node_put(np); |
101 | } | 100 | } |
diff --git a/arch/powerpc/platforms/83xx/mpc832x_rdb.c b/arch/powerpc/platforms/83xx/mpc832x_rdb.c index 0300268ce5b8..2a1295f19832 100644 --- a/arch/powerpc/platforms/83xx/mpc832x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc832x_rdb.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #define DBG(fmt...) | 38 | #define DBG(fmt...) |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | #ifdef CONFIG_QUICC_ENGINE | ||
41 | static void mpc83xx_spi_activate_cs(u8 cs, u8 polarity) | 42 | static void mpc83xx_spi_activate_cs(u8 cs, u8 polarity) |
42 | { | 43 | { |
43 | pr_debug("%s %d %d\n", __func__, cs, polarity); | 44 | pr_debug("%s %d %d\n", __func__, cs, polarity); |
@@ -77,8 +78,8 @@ static int __init mpc832x_spi_init(void) | |||
77 | mpc83xx_spi_activate_cs, | 78 | mpc83xx_spi_activate_cs, |
78 | mpc83xx_spi_deactivate_cs); | 79 | mpc83xx_spi_deactivate_cs); |
79 | } | 80 | } |
80 | |||
81 | machine_device_initcall(mpc832x_rdb, mpc832x_spi_init); | 81 | machine_device_initcall(mpc832x_rdb, mpc832x_spi_init); |
82 | #endif /* CONFIG_QUICC_ENGINE */ | ||
82 | 83 | ||
83 | /* ************************************************************************ | 84 | /* ************************************************************************ |
84 | * | 85 | * |
@@ -130,7 +131,7 @@ static int __init mpc832x_declare_of_platform_devices(void) | |||
130 | } | 131 | } |
131 | machine_device_initcall(mpc832x_rdb, mpc832x_declare_of_platform_devices); | 132 | machine_device_initcall(mpc832x_rdb, mpc832x_declare_of_platform_devices); |
132 | 133 | ||
133 | void __init mpc832x_rdb_init_IRQ(void) | 134 | static void __init mpc832x_rdb_init_IRQ(void) |
134 | { | 135 | { |
135 | 136 | ||
136 | struct device_node *np; | 137 | struct device_node *np; |
diff --git a/arch/powerpc/platforms/83xx/mpc836x_mds.c b/arch/powerpc/platforms/83xx/mpc836x_mds.c index 9d46e5bdd101..09e9d6fb7411 100644 --- a/arch/powerpc/platforms/83xx/mpc836x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <linux/stddef.h> | 19 | #include <linux/stddef.h> |
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/compiler.h> | ||
21 | #include <linux/init.h> | 22 | #include <linux/init.h> |
22 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
23 | #include <linux/reboot.h> | 24 | #include <linux/reboot.h> |
@@ -43,6 +44,7 @@ | |||
43 | #include <asm/udbg.h> | 44 | #include <asm/udbg.h> |
44 | #include <sysdev/fsl_soc.h> | 45 | #include <sysdev/fsl_soc.h> |
45 | #include <sysdev/fsl_pci.h> | 46 | #include <sysdev/fsl_pci.h> |
47 | #include <sysdev/simple_gpio.h> | ||
46 | #include <asm/qe.h> | 48 | #include <asm/qe.h> |
47 | #include <asm/qe_ic.h> | 49 | #include <asm/qe_ic.h> |
48 | 50 | ||
@@ -55,8 +57,6 @@ | |||
55 | #define DBG(fmt...) | 57 | #define DBG(fmt...) |
56 | #endif | 58 | #endif |
57 | 59 | ||
58 | static u8 *bcsr_regs = NULL; | ||
59 | |||
60 | /* ************************************************************************ | 60 | /* ************************************************************************ |
61 | * | 61 | * |
62 | * Setup the architecture | 62 | * Setup the architecture |
@@ -65,13 +65,14 @@ static u8 *bcsr_regs = NULL; | |||
65 | static void __init mpc836x_mds_setup_arch(void) | 65 | static void __init mpc836x_mds_setup_arch(void) |
66 | { | 66 | { |
67 | struct device_node *np; | 67 | struct device_node *np; |
68 | u8 __iomem *bcsr_regs = NULL; | ||
68 | 69 | ||
69 | if (ppc_md.progress) | 70 | if (ppc_md.progress) |
70 | ppc_md.progress("mpc836x_mds_setup_arch()", 0); | 71 | ppc_md.progress("mpc836x_mds_setup_arch()", 0); |
71 | 72 | ||
72 | /* Map BCSR area */ | 73 | /* Map BCSR area */ |
73 | np = of_find_node_by_name(NULL, "bcsr"); | 74 | np = of_find_node_by_name(NULL, "bcsr"); |
74 | if (np != 0) { | 75 | if (np) { |
75 | struct resource res; | 76 | struct resource res; |
76 | 77 | ||
77 | of_address_to_resource(np, 0, &res); | 78 | of_address_to_resource(np, 0, &res); |
@@ -93,6 +94,16 @@ static void __init mpc836x_mds_setup_arch(void) | |||
93 | 94 | ||
94 | for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;) | 95 | for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;) |
95 | par_io_of_config(np); | 96 | par_io_of_config(np); |
97 | #ifdef CONFIG_QE_USB | ||
98 | /* Must fixup Par IO before QE GPIO chips are registered. */ | ||
99 | par_io_config_pin(1, 2, 1, 0, 3, 0); /* USBOE */ | ||
100 | par_io_config_pin(1, 3, 1, 0, 3, 0); /* USBTP */ | ||
101 | par_io_config_pin(1, 8, 1, 0, 1, 0); /* USBTN */ | ||
102 | par_io_config_pin(1, 10, 2, 0, 3, 0); /* USBRXD */ | ||
103 | par_io_config_pin(1, 9, 2, 1, 3, 0); /* USBRP */ | ||
104 | par_io_config_pin(1, 11, 2, 1, 3, 0); /* USBRN */ | ||
105 | par_io_config_pin(2, 20, 2, 0, 1, 0); /* CLK21 */ | ||
106 | #endif /* CONFIG_QE_USB */ | ||
96 | } | 107 | } |
97 | 108 | ||
98 | if ((np = of_find_compatible_node(NULL, "network", "ucc_geth")) | 109 | if ((np = of_find_compatible_node(NULL, "network", "ucc_geth")) |
@@ -151,6 +162,70 @@ static int __init mpc836x_declare_of_platform_devices(void) | |||
151 | } | 162 | } |
152 | machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices); | 163 | machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices); |
153 | 164 | ||
165 | #ifdef CONFIG_QE_USB | ||
166 | static int __init mpc836x_usb_cfg(void) | ||
167 | { | ||
168 | u8 __iomem *bcsr; | ||
169 | struct device_node *np; | ||
170 | const char *mode; | ||
171 | int ret = 0; | ||
172 | |||
173 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc8360mds-bcsr"); | ||
174 | if (!np) | ||
175 | return -ENODEV; | ||
176 | |||
177 | bcsr = of_iomap(np, 0); | ||
178 | of_node_put(np); | ||
179 | if (!bcsr) | ||
180 | return -ENOMEM; | ||
181 | |||
182 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc8323-qe-usb"); | ||
183 | if (!np) { | ||
184 | ret = -ENODEV; | ||
185 | goto err; | ||
186 | } | ||
187 | |||
188 | #define BCSR8_TSEC1M_MASK (0x3 << 6) | ||
189 | #define BCSR8_TSEC1M_RGMII (0x0 << 6) | ||
190 | #define BCSR8_TSEC2M_MASK (0x3 << 4) | ||
191 | #define BCSR8_TSEC2M_RGMII (0x0 << 4) | ||
192 | /* | ||
193 | * Default is GMII (2), but we should set it to RGMII (0) if we use | ||
194 | * USB (Eth PHY is in RGMII mode anyway). | ||
195 | */ | ||
196 | clrsetbits_8(&bcsr[8], BCSR8_TSEC1M_MASK | BCSR8_TSEC2M_MASK, | ||
197 | BCSR8_TSEC1M_RGMII | BCSR8_TSEC2M_RGMII); | ||
198 | |||
199 | #define BCSR13_USBMASK 0x0f | ||
200 | #define BCSR13_nUSBEN 0x08 /* 1 - Disable, 0 - Enable */ | ||
201 | #define BCSR13_USBSPEED 0x04 /* 1 - Full, 0 - Low */ | ||
202 | #define BCSR13_USBMODE 0x02 /* 1 - Host, 0 - Function */ | ||
203 | #define BCSR13_nUSBVCC 0x01 /* 1 - gets VBUS, 0 - supplies VBUS */ | ||
204 | |||
205 | clrsetbits_8(&bcsr[13], BCSR13_USBMASK, BCSR13_USBSPEED); | ||
206 | |||
207 | mode = of_get_property(np, "mode", NULL); | ||
208 | if (mode && !strcmp(mode, "peripheral")) { | ||
209 | setbits8(&bcsr[13], BCSR13_nUSBVCC); | ||
210 | qe_usb_clock_set(QE_CLK21, 48000000); | ||
211 | } else { | ||
212 | setbits8(&bcsr[13], BCSR13_USBMODE); | ||
213 | /* | ||
214 | * The BCSR GPIOs are used to control power and | ||
215 | * speed of the USB transceiver. This is needed for | ||
216 | * the USB Host only. | ||
217 | */ | ||
218 | simple_gpiochip_init("fsl,mpc8360mds-bcsr-gpio"); | ||
219 | } | ||
220 | |||
221 | of_node_put(np); | ||
222 | err: | ||
223 | iounmap(bcsr); | ||
224 | return ret; | ||
225 | } | ||
226 | machine_arch_initcall(mpc836x_mds, mpc836x_usb_cfg); | ||
227 | #endif /* CONFIG_QE_USB */ | ||
228 | |||
154 | static void __init mpc836x_mds_init_IRQ(void) | 229 | static void __init mpc836x_mds_init_IRQ(void) |
155 | { | 230 | { |
156 | struct device_node *np; | 231 | struct device_node *np; |
diff --git a/arch/powerpc/platforms/83xx/mpc836x_rdk.c b/arch/powerpc/platforms/83xx/mpc836x_rdk.c index a5273bb28e1b..b0090aac9642 100644 --- a/arch/powerpc/platforms/83xx/mpc836x_rdk.c +++ b/arch/powerpc/platforms/83xx/mpc836x_rdk.c | |||
@@ -51,8 +51,9 @@ static void __init mpc836x_rdk_setup_arch(void) | |||
51 | for_each_compatible_node(np, "pci", "fsl,mpc8349-pci") | 51 | for_each_compatible_node(np, "pci", "fsl,mpc8349-pci") |
52 | mpc83xx_add_bridge(np); | 52 | mpc83xx_add_bridge(np); |
53 | #endif | 53 | #endif |
54 | 54 | #ifdef CONFIG_QUICC_ENGINE | |
55 | qe_reset(); | 55 | qe_reset(); |
56 | #endif | ||
56 | } | 57 | } |
57 | 58 | ||
58 | static void __init mpc836x_rdk_init_IRQ(void) | 59 | static void __init mpc836x_rdk_init_IRQ(void) |
@@ -71,13 +72,14 @@ static void __init mpc836x_rdk_init_IRQ(void) | |||
71 | */ | 72 | */ |
72 | ipic_set_default_priority(); | 73 | ipic_set_default_priority(); |
73 | of_node_put(np); | 74 | of_node_put(np); |
74 | 75 | #ifdef CONFIG_QUICC_ENGINE | |
75 | np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic"); | 76 | np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic"); |
76 | if (!np) | 77 | if (!np) |
77 | return; | 78 | return; |
78 | 79 | ||
79 | qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic); | 80 | qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic); |
80 | of_node_put(np); | 81 | of_node_put(np); |
82 | #endif | ||
81 | } | 83 | } |
82 | 84 | ||
83 | /* | 85 | /* |
diff --git a/arch/powerpc/platforms/83xx/mpc837x_mds.c b/arch/powerpc/platforms/83xx/mpc837x_mds.c index 8bb13c807142..530ef990ca7c 100644 --- a/arch/powerpc/platforms/83xx/mpc837x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc837x_mds.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #define BCSR12_USB_SER_MASK 0x8a | 26 | #define BCSR12_USB_SER_MASK 0x8a |
27 | #define BCSR12_USB_SER_PIN 0x80 | 27 | #define BCSR12_USB_SER_PIN 0x80 |
28 | #define BCSR12_USB_SER_DEVICE 0x02 | 28 | #define BCSR12_USB_SER_DEVICE 0x02 |
29 | extern int mpc837x_usb_cfg(void); | ||
30 | 29 | ||
31 | static int mpc837xmds_usb_cfg(void) | 30 | static int mpc837xmds_usb_cfg(void) |
32 | { | 31 | { |
diff --git a/arch/powerpc/platforms/83xx/mpc837x_rdb.c b/arch/powerpc/platforms/83xx/mpc837x_rdb.c index da030afa2e2c..1d096545322b 100644 --- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c | |||
@@ -21,8 +21,6 @@ | |||
21 | 21 | ||
22 | #include "mpc83xx.h" | 22 | #include "mpc83xx.h" |
23 | 23 | ||
24 | extern int mpc837x_usb_cfg(void); | ||
25 | |||
26 | /* ************************************************************************ | 24 | /* ************************************************************************ |
27 | * | 25 | * |
28 | * Setup the architecture | 26 | * Setup the architecture |
diff --git a/arch/powerpc/platforms/83xx/mpc83xx.h b/arch/powerpc/platforms/83xx/mpc83xx.h index 2a7cbabb410a..83cfe51526ec 100644 --- a/arch/powerpc/platforms/83xx/mpc83xx.h +++ b/arch/powerpc/platforms/83xx/mpc83xx.h | |||
@@ -61,6 +61,7 @@ | |||
61 | 61 | ||
62 | extern void mpc83xx_restart(char *cmd); | 62 | extern void mpc83xx_restart(char *cmd); |
63 | extern long mpc83xx_time_init(void); | 63 | extern long mpc83xx_time_init(void); |
64 | extern int mpc837x_usb_cfg(void); | ||
64 | extern int mpc834x_usb_cfg(void); | 65 | extern int mpc834x_usb_cfg(void); |
65 | extern int mpc831x_usb_cfg(void); | 66 | extern int mpc831x_usb_cfg(void); |
66 | 67 | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c index a8301c8ad537..7326d904202c 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c | |||
@@ -148,6 +148,9 @@ static int mpc85xx_exclude_device(struct pci_controller *hose, | |||
148 | /* | 148 | /* |
149 | * Setup the architecture | 149 | * Setup the architecture |
150 | */ | 150 | */ |
151 | #ifdef CONFIG_SMP | ||
152 | extern void __init mpc85xx_smp_init(void); | ||
153 | #endif | ||
151 | static void __init mpc85xx_ds_setup_arch(void) | 154 | static void __init mpc85xx_ds_setup_arch(void) |
152 | { | 155 | { |
153 | #ifdef CONFIG_PCI | 156 | #ifdef CONFIG_PCI |
@@ -173,6 +176,10 @@ static void __init mpc85xx_ds_setup_arch(void) | |||
173 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; | 176 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; |
174 | #endif | 177 | #endif |
175 | 178 | ||
179 | #ifdef CONFIG_SMP | ||
180 | mpc85xx_smp_init(); | ||
181 | #endif | ||
182 | |||
176 | printk("MPC85xx DS board from Freescale Semiconductor\n"); | 183 | printk("MPC85xx DS board from Freescale Semiconductor\n"); |
177 | } | 184 | } |
178 | 185 | ||
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index d652c713f496..79a0df17078b 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c | |||
@@ -58,6 +58,7 @@ smp_85xx_kick_cpu(int nr) | |||
58 | 58 | ||
59 | if (cpu_rel_addr == NULL) { | 59 | if (cpu_rel_addr == NULL) { |
60 | printk(KERN_ERR "No cpu-release-addr for cpu %d\n", nr); | 60 | printk(KERN_ERR "No cpu-release-addr for cpu %d\n", nr); |
61 | local_irq_restore(flags); | ||
61 | return; | 62 | return; |
62 | } | 63 | } |
63 | 64 | ||
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 47e956c871fe..47fe2bea9865 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
@@ -312,4 +312,15 @@ config MPC8xxx_GPIO | |||
312 | Say Y here if you're going to use hardware that connects to the | 312 | Say Y here if you're going to use hardware that connects to the |
313 | MPC831x/834x/837x/8572/8610 GPIOs. | 313 | MPC831x/834x/837x/8572/8610 GPIOs. |
314 | 314 | ||
315 | config SIMPLE_GPIO | ||
316 | bool "Support for simple, memory-mapped GPIO controllers" | ||
317 | depends on PPC | ||
318 | select GENERIC_GPIO | ||
319 | select ARCH_REQUIRE_GPIOLIB | ||
320 | help | ||
321 | Say Y here to support simple, memory-mapped GPIO controllers. | ||
322 | These are usually BCSRs used to control board's switches, LEDs, | ||
323 | chip-selects, Ethernet/USB PHY's power and various other small | ||
324 | on-board peripherals. | ||
325 | |||
315 | endmenu | 326 | endmenu |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 3d0c776f888d..e868b5c50723 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -231,7 +231,7 @@ config VIRT_CPU_ACCOUNTING | |||
231 | If in doubt, say Y here. | 231 | If in doubt, say Y here. |
232 | 232 | ||
233 | config SMP | 233 | config SMP |
234 | depends on PPC_STD_MMU | 234 | depends on PPC_STD_MMU || FSL_BOOKE |
235 | bool "Symmetric multi-processing support" | 235 | bool "Symmetric multi-processing support" |
236 | ---help--- | 236 | ---help--- |
237 | This enables support for systems with more than one CPU. If you have | 237 | This enables support for systems with more than one CPU. If you have |
diff --git a/arch/powerpc/platforms/cell/beat_htab.c b/arch/powerpc/platforms/cell/beat_htab.c index 2e67bd840e01..35b1ec492715 100644 --- a/arch/powerpc/platforms/cell/beat_htab.c +++ b/arch/powerpc/platforms/cell/beat_htab.c | |||
@@ -44,8 +44,8 @@ static DEFINE_SPINLOCK(beat_htab_lock); | |||
44 | 44 | ||
45 | static inline unsigned int beat_read_mask(unsigned hpte_group) | 45 | static inline unsigned int beat_read_mask(unsigned hpte_group) |
46 | { | 46 | { |
47 | unsigned long hpte_v[5]; | ||
48 | unsigned long rmask = 0; | 47 | unsigned long rmask = 0; |
48 | u64 hpte_v[5]; | ||
49 | 49 | ||
50 | beat_read_htab_entries(0, hpte_group + 0, hpte_v); | 50 | beat_read_htab_entries(0, hpte_group + 0, hpte_v); |
51 | if (!(hpte_v[0] & HPTE_V_BOLTED)) | 51 | if (!(hpte_v[0] & HPTE_V_BOLTED)) |
@@ -93,8 +93,7 @@ static long beat_lpar_hpte_insert(unsigned long hpte_group, | |||
93 | int psize, int ssize) | 93 | int psize, int ssize) |
94 | { | 94 | { |
95 | unsigned long lpar_rc; | 95 | unsigned long lpar_rc; |
96 | unsigned long slot; | 96 | u64 hpte_v, hpte_r, slot; |
97 | unsigned long hpte_v, hpte_r; | ||
98 | 97 | ||
99 | /* same as iseries */ | 98 | /* same as iseries */ |
100 | if (vflags & HPTE_V_SECONDARY) | 99 | if (vflags & HPTE_V_SECONDARY) |
@@ -153,8 +152,9 @@ static long beat_lpar_hpte_remove(unsigned long hpte_group) | |||
153 | 152 | ||
154 | static unsigned long beat_lpar_hpte_getword0(unsigned long slot) | 153 | static unsigned long beat_lpar_hpte_getword0(unsigned long slot) |
155 | { | 154 | { |
156 | unsigned long dword0, dword[5]; | 155 | unsigned long dword0; |
157 | unsigned long lpar_rc; | 156 | unsigned long lpar_rc; |
157 | u64 dword[5]; | ||
158 | 158 | ||
159 | lpar_rc = beat_read_htab_entries(0, slot & ~3UL, dword); | 159 | lpar_rc = beat_read_htab_entries(0, slot & ~3UL, dword); |
160 | 160 | ||
@@ -170,7 +170,7 @@ static void beat_lpar_hptab_clear(void) | |||
170 | unsigned long size_bytes = 1UL << ppc64_pft_size; | 170 | unsigned long size_bytes = 1UL << ppc64_pft_size; |
171 | unsigned long hpte_count = size_bytes >> 4; | 171 | unsigned long hpte_count = size_bytes >> 4; |
172 | int i; | 172 | int i; |
173 | unsigned long dummy0, dummy1; | 173 | u64 dummy0, dummy1; |
174 | 174 | ||
175 | /* TODO: Use bulk call */ | 175 | /* TODO: Use bulk call */ |
176 | for (i = 0; i < hpte_count; i++) | 176 | for (i = 0; i < hpte_count; i++) |
@@ -189,7 +189,8 @@ static long beat_lpar_hpte_updatepp(unsigned long slot, | |||
189 | int psize, int ssize, int local) | 189 | int psize, int ssize, int local) |
190 | { | 190 | { |
191 | unsigned long lpar_rc; | 191 | unsigned long lpar_rc; |
192 | unsigned long dummy0, dummy1, want_v; | 192 | u64 dummy0, dummy1; |
193 | unsigned long want_v; | ||
193 | 194 | ||
194 | want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M); | 195 | want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M); |
195 | 196 | ||
@@ -255,7 +256,8 @@ static void beat_lpar_hpte_updateboltedpp(unsigned long newpp, | |||
255 | unsigned long ea, | 256 | unsigned long ea, |
256 | int psize, int ssize) | 257 | int psize, int ssize) |
257 | { | 258 | { |
258 | unsigned long lpar_rc, slot, vsid, va, dummy0, dummy1; | 259 | unsigned long lpar_rc, slot, vsid, va; |
260 | u64 dummy0, dummy1; | ||
259 | 261 | ||
260 | vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M); | 262 | vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M); |
261 | va = (vsid << 28) | (ea & 0x0fffffff); | 263 | va = (vsid << 28) | (ea & 0x0fffffff); |
@@ -276,7 +278,7 @@ static void beat_lpar_hpte_invalidate(unsigned long slot, unsigned long va, | |||
276 | { | 278 | { |
277 | unsigned long want_v; | 279 | unsigned long want_v; |
278 | unsigned long lpar_rc; | 280 | unsigned long lpar_rc; |
279 | unsigned long dummy1, dummy2; | 281 | u64 dummy1, dummy2; |
280 | unsigned long flags; | 282 | unsigned long flags; |
281 | 283 | ||
282 | DBG_LOW(" inval : slot=%lx, va=%016lx, psize: %d, local: %d\n", | 284 | DBG_LOW(" inval : slot=%lx, va=%016lx, psize: %d, local: %d\n", |
@@ -315,8 +317,7 @@ static long beat_lpar_hpte_insert_v3(unsigned long hpte_group, | |||
315 | int psize, int ssize) | 317 | int psize, int ssize) |
316 | { | 318 | { |
317 | unsigned long lpar_rc; | 319 | unsigned long lpar_rc; |
318 | unsigned long slot; | 320 | u64 hpte_v, hpte_r, slot; |
319 | unsigned long hpte_v, hpte_r; | ||
320 | 321 | ||
321 | /* same as iseries */ | 322 | /* same as iseries */ |
322 | if (vflags & HPTE_V_SECONDARY) | 323 | if (vflags & HPTE_V_SECONDARY) |
diff --git a/arch/powerpc/platforms/cell/beat_udbg.c b/arch/powerpc/platforms/cell/beat_udbg.c index 6b418f6b6175..350735bc8888 100644 --- a/arch/powerpc/platforms/cell/beat_udbg.c +++ b/arch/powerpc/platforms/cell/beat_udbg.c | |||
@@ -40,8 +40,8 @@ static void udbg_putc_beat(char c) | |||
40 | } | 40 | } |
41 | 41 | ||
42 | /* Buffered chars getc */ | 42 | /* Buffered chars getc */ |
43 | static long inbuflen; | 43 | static u64 inbuflen; |
44 | static long inbuf[2]; /* must be 2 longs */ | 44 | static u64 inbuf[2]; /* must be 2 u64s */ |
45 | 45 | ||
46 | static int udbg_getc_poll_beat(void) | 46 | static int udbg_getc_poll_beat(void) |
47 | { | 47 | { |
diff --git a/arch/powerpc/platforms/cell/cbe_cpufreq_pervasive.c b/arch/powerpc/platforms/cell/cbe_cpufreq_pervasive.c index 70fa7aef5edd..20472e487b6f 100644 --- a/arch/powerpc/platforms/cell/cbe_cpufreq_pervasive.c +++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pervasive.c | |||
@@ -54,7 +54,7 @@ int cbe_cpufreq_set_pmode(int cpu, unsigned int pmode) | |||
54 | { | 54 | { |
55 | struct cbe_pmd_regs __iomem *pmd_regs; | 55 | struct cbe_pmd_regs __iomem *pmd_regs; |
56 | struct cbe_mic_tm_regs __iomem *mic_tm_regs; | 56 | struct cbe_mic_tm_regs __iomem *mic_tm_regs; |
57 | u64 flags; | 57 | unsigned long flags; |
58 | u64 value; | 58 | u64 value; |
59 | #ifdef DEBUG | 59 | #ifdef DEBUG |
60 | long time; | 60 | long time; |
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 2d5bb22d6c09..28c04dab2633 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -148,7 +148,7 @@ static unsigned int iic_get_irq(void) | |||
148 | 148 | ||
149 | iic = &__get_cpu_var(iic); | 149 | iic = &__get_cpu_var(iic); |
150 | *(unsigned long *) &pending = | 150 | *(unsigned long *) &pending = |
151 | in_be64((unsigned long __iomem *) &iic->regs->pending_destr); | 151 | in_be64((u64 __iomem *) &iic->regs->pending_destr); |
152 | if (!(pending.flags & CBE_IIC_IRQ_VALID)) | 152 | if (!(pending.flags & CBE_IIC_IRQ_VALID)) |
153 | return NO_IRQ; | 153 | return NO_IRQ; |
154 | virq = irq_linear_revmap(iic_host, iic_pending_to_hwnum(pending)); | 154 | virq = irq_linear_revmap(iic_host, iic_pending_to_hwnum(pending)); |
diff --git a/arch/powerpc/platforms/cell/io-workarounds.c b/arch/powerpc/platforms/cell/io-workarounds.c index b5f84e8f0899..059cad6c3f69 100644 --- a/arch/powerpc/platforms/cell/io-workarounds.c +++ b/arch/powerpc/platforms/cell/io-workarounds.c | |||
@@ -130,14 +130,14 @@ static const struct ppc_pci_io __devinitconst iowa_pci_io = { | |||
130 | 130 | ||
131 | }; | 131 | }; |
132 | 132 | ||
133 | static void __iomem *iowa_ioremap(unsigned long addr, unsigned long size, | 133 | static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size, |
134 | unsigned long flags) | 134 | unsigned long flags) |
135 | { | 135 | { |
136 | struct iowa_bus *bus; | 136 | struct iowa_bus *bus; |
137 | void __iomem *res = __ioremap(addr, size, flags); | 137 | void __iomem *res = __ioremap(addr, size, flags); |
138 | int busno; | 138 | int busno; |
139 | 139 | ||
140 | bus = iowa_pci_find(0, addr); | 140 | bus = iowa_pci_find(0, (unsigned long)addr); |
141 | if (bus != NULL) { | 141 | if (bus != NULL) { |
142 | busno = bus - iowa_busses; | 142 | busno = bus - iowa_busses; |
143 | PCI_SET_ADDR_TOKEN(res, busno + 1); | 143 | PCI_SET_ADDR_TOKEN(res, busno + 1); |
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c index 86db4dd170a0..88d94b59a7cb 100644 --- a/arch/powerpc/platforms/cell/iommu.c +++ b/arch/powerpc/platforms/cell/iommu.c | |||
@@ -150,8 +150,8 @@ static int cbe_nr_iommus; | |||
150 | static void invalidate_tce_cache(struct cbe_iommu *iommu, unsigned long *pte, | 150 | static void invalidate_tce_cache(struct cbe_iommu *iommu, unsigned long *pte, |
151 | long n_ptes) | 151 | long n_ptes) |
152 | { | 152 | { |
153 | unsigned long __iomem *reg; | 153 | u64 __iomem *reg; |
154 | unsigned long val; | 154 | u64 val; |
155 | long n; | 155 | long n; |
156 | 156 | ||
157 | reg = iommu->xlate_regs + IOC_IOPT_CacheInvd; | 157 | reg = iommu->xlate_regs + IOC_IOPT_CacheInvd; |
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index 15c62d3ca129..3bf908e2873a 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
@@ -314,7 +314,7 @@ extern char *isolated_loader; | |||
314 | * we need to call spu_release(ctx) before sleeping, and | 314 | * we need to call spu_release(ctx) before sleeping, and |
315 | * then spu_acquire(ctx) when awoken. | 315 | * then spu_acquire(ctx) when awoken. |
316 | * | 316 | * |
317 | * Returns with state_mutex re-acquired when successfull or | 317 | * Returns with state_mutex re-acquired when successful or |
318 | * with -ERESTARTSYS and the state_mutex dropped when interrupted. | 318 | * with -ERESTARTSYS and the state_mutex dropped when interrupted. |
319 | */ | 319 | */ |
320 | 320 | ||
diff --git a/arch/powerpc/platforms/iseries/Kconfig b/arch/powerpc/platforms/iseries/Kconfig index ed3753d8c109..7ddd0a2c8027 100644 --- a/arch/powerpc/platforms/iseries/Kconfig +++ b/arch/powerpc/platforms/iseries/Kconfig | |||
@@ -10,18 +10,21 @@ menu "iSeries device drivers" | |||
10 | config VIODASD | 10 | config VIODASD |
11 | tristate "iSeries Virtual I/O disk support" | 11 | tristate "iSeries Virtual I/O disk support" |
12 | depends on BLOCK | 12 | depends on BLOCK |
13 | select VIOPATH | ||
13 | help | 14 | help |
14 | If you are running on an iSeries system and you want to use | 15 | If you are running on an iSeries system and you want to use |
15 | virtual disks created and managed by OS/400, say Y. | 16 | virtual disks created and managed by OS/400, say Y. |
16 | 17 | ||
17 | config VIOCD | 18 | config VIOCD |
18 | tristate "iSeries Virtual I/O CD support" | 19 | tristate "iSeries Virtual I/O CD support" |
20 | select VIOPATH | ||
19 | help | 21 | help |
20 | If you are running Linux on an IBM iSeries system and you want to | 22 | If you are running Linux on an IBM iSeries system and you want to |
21 | read a CD drive owned by OS/400, say Y here. | 23 | read a CD drive owned by OS/400, say Y here. |
22 | 24 | ||
23 | config VIOTAPE | 25 | config VIOTAPE |
24 | tristate "iSeries Virtual Tape Support" | 26 | tristate "iSeries Virtual Tape Support" |
27 | select VIOPATH | ||
25 | help | 28 | help |
26 | If you are running Linux on an iSeries system and you want Linux | 29 | If you are running Linux on an iSeries system and you want Linux |
27 | to read and/or write a tape drive owned by OS/400, say Y here. | 30 | to read and/or write a tape drive owned by OS/400, say Y here. |
@@ -30,5 +33,3 @@ endmenu | |||
30 | 33 | ||
31 | config VIOPATH | 34 | config VIOPATH |
32 | bool | 35 | bool |
33 | depends on VIODASD || VIOCD || VIOTAPE || ISERIES_VETH | ||
34 | default y | ||
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index 70b688c1aefb..24519b96d6ad 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/string.h> | 23 | #include <linux/string.h> |
24 | #include <linux/seq_file.h> | 24 | #include <linux/seq_file.h> |
25 | #include <linux/kdev_t.h> | 25 | #include <linux/kdev_t.h> |
26 | #include <linux/kexec.h> | ||
26 | #include <linux/major.h> | 27 | #include <linux/major.h> |
27 | #include <linux/root_dev.h> | 28 | #include <linux/root_dev.h> |
28 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
@@ -638,6 +639,13 @@ static int __init iseries_probe(void) | |||
638 | return 1; | 639 | return 1; |
639 | } | 640 | } |
640 | 641 | ||
642 | #ifdef CONFIG_KEXEC | ||
643 | static int iseries_kexec_prepare(struct kimage *image) | ||
644 | { | ||
645 | return -ENOSYS; | ||
646 | } | ||
647 | #endif | ||
648 | |||
641 | define_machine(iseries) { | 649 | define_machine(iseries) { |
642 | .name = "iSeries", | 650 | .name = "iSeries", |
643 | .setup_arch = iSeries_setup_arch, | 651 | .setup_arch = iSeries_setup_arch, |
@@ -658,6 +666,9 @@ define_machine(iseries) { | |||
658 | .probe = iseries_probe, | 666 | .probe = iseries_probe, |
659 | .ioremap = iseries_ioremap, | 667 | .ioremap = iseries_ioremap, |
660 | .iounmap = iseries_iounmap, | 668 | .iounmap = iseries_iounmap, |
669 | #ifdef CONFIG_KEXEC | ||
670 | .machine_kexec_prepare = iseries_kexec_prepare, | ||
671 | #endif | ||
661 | /* XXX Implement enable_pmcs for iSeries */ | 672 | /* XXX Implement enable_pmcs for iSeries */ |
662 | }; | 673 | }; |
663 | 674 | ||
diff --git a/arch/powerpc/platforms/pasemi/cpufreq.c b/arch/powerpc/platforms/pasemi/cpufreq.c index 58556b028a4c..86db47c1b665 100644 --- a/arch/powerpc/platforms/pasemi/cpufreq.c +++ b/arch/powerpc/platforms/pasemi/cpufreq.c | |||
@@ -112,7 +112,7 @@ static int get_gizmo_latency(void) | |||
112 | 112 | ||
113 | static void set_astate(int cpu, unsigned int astate) | 113 | static void set_astate(int cpu, unsigned int astate) |
114 | { | 114 | { |
115 | u64 flags; | 115 | unsigned long flags; |
116 | 116 | ||
117 | /* Return if called before init has run */ | 117 | /* Return if called before init has run */ |
118 | if (unlikely(!sdcasr_mapbase)) | 118 | if (unlikely(!sdcasr_mapbase)) |
diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c b/arch/powerpc/platforms/pasemi/dma_lib.c index 217af321b0ca..a6152d922243 100644 --- a/arch/powerpc/platforms/pasemi/dma_lib.c +++ b/arch/powerpc/platforms/pasemi/dma_lib.c | |||
@@ -509,7 +509,7 @@ fallback: | |||
509 | */ | 509 | */ |
510 | int pasemi_dma_init(void) | 510 | int pasemi_dma_init(void) |
511 | { | 511 | { |
512 | static spinlock_t init_lock = SPIN_LOCK_UNLOCKED; | 512 | static DEFINE_SPINLOCK(init_lock); |
513 | struct pci_dev *iob_pdev; | 513 | struct pci_dev *iob_pdev; |
514 | struct pci_dev *pdev; | 514 | struct pci_dev *pdev; |
515 | struct resource res; | 515 | struct resource res; |
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 54b7b76ed4f0..04cdd32624d4 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -661,6 +661,7 @@ static void __init init_second_ohare(void) | |||
661 | pci_find_hose_for_OF_device(np); | 661 | pci_find_hose_for_OF_device(np); |
662 | if (!hose) { | 662 | if (!hose) { |
663 | printk(KERN_ERR "Can't find PCI hose for OHare2 !\n"); | 663 | printk(KERN_ERR "Can't find PCI hose for OHare2 !\n"); |
664 | of_node_put(np); | ||
664 | return; | 665 | return; |
665 | } | 666 | } |
666 | early_read_config_word(hose, bus, devfn, PCI_COMMAND, &cmd); | 667 | early_read_config_word(hose, bus, devfn, PCI_COMMAND, &cmd); |
@@ -669,6 +670,7 @@ static void __init init_second_ohare(void) | |||
669 | early_write_config_word(hose, bus, devfn, PCI_COMMAND, cmd); | 670 | early_write_config_word(hose, bus, devfn, PCI_COMMAND, cmd); |
670 | } | 671 | } |
671 | has_second_ohare = 1; | 672 | has_second_ohare = 1; |
673 | of_node_put(np); | ||
672 | } | 674 | } |
673 | 675 | ||
674 | /* | 676 | /* |
diff --git a/arch/powerpc/platforms/powermac/time.c b/arch/powerpc/platforms/powermac/time.c index 59eb840d8ce2..1810e4226e56 100644 --- a/arch/powerpc/platforms/powermac/time.c +++ b/arch/powerpc/platforms/powermac/time.c | |||
@@ -265,12 +265,15 @@ int __init via_calibrate_decr(void) | |||
265 | struct resource rsrc; | 265 | struct resource rsrc; |
266 | 266 | ||
267 | vias = of_find_node_by_name(NULL, "via-cuda"); | 267 | vias = of_find_node_by_name(NULL, "via-cuda"); |
268 | if (vias == 0) | 268 | if (vias == NULL) |
269 | vias = of_find_node_by_name(NULL, "via-pmu"); | 269 | vias = of_find_node_by_name(NULL, "via-pmu"); |
270 | if (vias == 0) | 270 | if (vias == NULL) |
271 | vias = of_find_node_by_name(NULL, "via"); | 271 | vias = of_find_node_by_name(NULL, "via"); |
272 | if (vias == 0 || of_address_to_resource(vias, 0, &rsrc)) | 272 | if (vias == NULL || of_address_to_resource(vias, 0, &rsrc)) { |
273 | of_node_put(vias); | ||
273 | return 0; | 274 | return 0; |
275 | } | ||
276 | of_node_put(vias); | ||
274 | via = ioremap(rsrc.start, rsrc.end - rsrc.start + 1); | 277 | via = ioremap(rsrc.start, rsrc.end - rsrc.start + 1); |
275 | if (via == NULL) { | 278 | if (via == NULL) { |
276 | printk(KERN_ERR "Failed to map VIA for timer calibration !\n"); | 279 | printk(KERN_ERR "Failed to map VIA for timer calibration !\n"); |
@@ -297,7 +300,7 @@ int __init via_calibrate_decr(void) | |||
297 | ppc_tb_freq = (dstart - dend) * 100 / 6; | 300 | ppc_tb_freq = (dstart - dend) * 100 / 6; |
298 | 301 | ||
299 | iounmap(via); | 302 | iounmap(via); |
300 | 303 | ||
301 | return 1; | 304 | return 1; |
302 | } | 305 | } |
303 | #endif | 306 | #endif |
diff --git a/arch/powerpc/platforms/ps3/device-init.c b/arch/powerpc/platforms/ps3/device-init.c index dbc124e05646..ca71a12b764c 100644 --- a/arch/powerpc/platforms/ps3/device-init.c +++ b/arch/powerpc/platforms/ps3/device-init.c | |||
@@ -518,6 +518,41 @@ fail_device_register: | |||
518 | return result; | 518 | return result; |
519 | } | 519 | } |
520 | 520 | ||
521 | static int __init ps3_register_ramdisk_device(void) | ||
522 | { | ||
523 | int result; | ||
524 | struct layout { | ||
525 | struct ps3_system_bus_device dev; | ||
526 | } *p; | ||
527 | |||
528 | pr_debug(" -> %s:%d\n", __func__, __LINE__); | ||
529 | |||
530 | p = kzalloc(sizeof(struct layout), GFP_KERNEL); | ||
531 | |||
532 | if (!p) | ||
533 | return -ENOMEM; | ||
534 | |||
535 | p->dev.match_id = PS3_MATCH_ID_GPU; | ||
536 | p->dev.match_sub_id = PS3_MATCH_SUB_ID_GPU_RAMDISK; | ||
537 | p->dev.dev_type = PS3_DEVICE_TYPE_IOC0; | ||
538 | |||
539 | result = ps3_system_bus_device_register(&p->dev); | ||
540 | |||
541 | if (result) { | ||
542 | pr_debug("%s:%d ps3_system_bus_device_register failed\n", | ||
543 | __func__, __LINE__); | ||
544 | goto fail_device_register; | ||
545 | } | ||
546 | |||
547 | pr_debug(" <- %s:%d\n", __func__, __LINE__); | ||
548 | return 0; | ||
549 | |||
550 | fail_device_register: | ||
551 | kfree(p); | ||
552 | pr_debug(" <- %s:%d failed\n", __func__, __LINE__); | ||
553 | return result; | ||
554 | } | ||
555 | |||
521 | /** | 556 | /** |
522 | * ps3_setup_dynamic_device - Setup a dynamic device from the repository | 557 | * ps3_setup_dynamic_device - Setup a dynamic device from the repository |
523 | */ | 558 | */ |
@@ -946,6 +981,8 @@ static int __init ps3_register_devices(void) | |||
946 | 981 | ||
947 | ps3_register_lpm_devices(); | 982 | ps3_register_lpm_devices(); |
948 | 983 | ||
984 | ps3_register_ramdisk_device(); | ||
985 | |||
949 | pr_debug(" <- %s:%d\n", __func__, __LINE__); | 986 | pr_debug(" <- %s:%d\n", __func__, __LINE__); |
950 | return 0; | 987 | return 0; |
951 | } | 988 | } |
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 5afce115ab1f..b33b28a6fe12 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -17,6 +17,7 @@ obj-$(CONFIG_FSL_PCI) += fsl_pci.o $(fsl-msi-obj-y) | |||
17 | obj-$(CONFIG_FSL_LBC) += fsl_lbc.o | 17 | obj-$(CONFIG_FSL_LBC) += fsl_lbc.o |
18 | obj-$(CONFIG_FSL_GTM) += fsl_gtm.o | 18 | obj-$(CONFIG_FSL_GTM) += fsl_gtm.o |
19 | obj-$(CONFIG_MPC8xxx_GPIO) += mpc8xxx_gpio.o | 19 | obj-$(CONFIG_MPC8xxx_GPIO) += mpc8xxx_gpio.o |
20 | obj-$(CONFIG_SIMPLE_GPIO) += simple_gpio.o | ||
20 | obj-$(CONFIG_RAPIDIO) += fsl_rio.o | 21 | obj-$(CONFIG_RAPIDIO) += fsl_rio.o |
21 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | 22 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o |
22 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ | 23 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index d5f9ae0f1b75..f611d0369cc8 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
@@ -29,7 +29,8 @@ | |||
29 | 29 | ||
30 | #if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx) | 30 | #if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx) |
31 | /* atmu setup for fsl pci/pcie controller */ | 31 | /* atmu setup for fsl pci/pcie controller */ |
32 | void __init setup_pci_atmu(struct pci_controller *hose, struct resource *rsrc) | 32 | static void __init setup_pci_atmu(struct pci_controller *hose, |
33 | struct resource *rsrc) | ||
33 | { | 34 | { |
34 | struct ccsr_pci __iomem *pci; | 35 | struct ccsr_pci __iomem *pci; |
35 | int i; | 36 | int i; |
@@ -86,7 +87,7 @@ void __init setup_pci_atmu(struct pci_controller *hose, struct resource *rsrc) | |||
86 | out_be32(&pci->piw[2].piwar, PIWAR_2G); | 87 | out_be32(&pci->piw[2].piwar, PIWAR_2G); |
87 | } | 88 | } |
88 | 89 | ||
89 | void __init setup_pci_cmd(struct pci_controller *hose) | 90 | static void __init setup_pci_cmd(struct pci_controller *hose) |
90 | { | 91 | { |
91 | u16 cmd; | 92 | u16 cmd; |
92 | int cap_x; | 93 | int cap_x; |
@@ -130,7 +131,7 @@ static void __init quirk_fsl_pcie_header(struct pci_dev *dev) | |||
130 | return ; | 131 | return ; |
131 | } | 132 | } |
132 | 133 | ||
133 | int __init fsl_pcie_check_link(struct pci_controller *hose) | 134 | static int __init fsl_pcie_check_link(struct pci_controller *hose) |
134 | { | 135 | { |
135 | u32 val; | 136 | u32 val; |
136 | early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val); | 137 | early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val); |
diff --git a/arch/powerpc/sysdev/fsl_soc.h b/arch/powerpc/sysdev/fsl_soc.h index 60f7f227327c..9c744e4285a0 100644 --- a/arch/powerpc/sysdev/fsl_soc.h +++ b/arch/powerpc/sysdev/fsl_soc.h | |||
@@ -5,8 +5,13 @@ | |||
5 | #include <asm/mmu.h> | 5 | #include <asm/mmu.h> |
6 | 6 | ||
7 | extern phys_addr_t get_immrbase(void); | 7 | extern phys_addr_t get_immrbase(void); |
8 | #if defined(CONFIG_CPM2) || defined(CONFIG_QUICC_ENGINE) || defined(CONFIG_8xx) | ||
8 | extern u32 get_brgfreq(void); | 9 | extern u32 get_brgfreq(void); |
9 | extern u32 get_baudrate(void); | 10 | extern u32 get_baudrate(void); |
11 | #else | ||
12 | static inline u32 get_brgfreq(void) { return -1; } | ||
13 | static inline u32 get_baudrate(void) { return -1; } | ||
14 | #endif | ||
10 | extern u32 fsl_get_sys_freq(void); | 15 | extern u32 fsl_get_sys_freq(void); |
11 | 16 | ||
12 | struct spi_board_info; | 17 | struct spi_board_info; |
diff --git a/arch/powerpc/sysdev/qe_lib/Kconfig b/arch/powerpc/sysdev/qe_lib/Kconfig index 76ffbc48d4b9..41ac3dfac98e 100644 --- a/arch/powerpc/sysdev/qe_lib/Kconfig +++ b/arch/powerpc/sysdev/qe_lib/Kconfig | |||
@@ -22,5 +22,6 @@ config UCC | |||
22 | 22 | ||
23 | config QE_USB | 23 | config QE_USB |
24 | bool | 24 | bool |
25 | default y if USB_GADGET_FSL_QE | ||
25 | help | 26 | help |
26 | QE USB Host Controller support | 27 | QE USB Controller support |
diff --git a/arch/powerpc/sysdev/qe_lib/gpio.c b/arch/powerpc/sysdev/qe_lib/gpio.c index 8e5a0bc36d0b..3485288dce31 100644 --- a/arch/powerpc/sysdev/qe_lib/gpio.c +++ b/arch/powerpc/sysdev/qe_lib/gpio.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/err.h> | ||
17 | #include <linux/io.h> | 18 | #include <linux/io.h> |
18 | #include <linux/of.h> | 19 | #include <linux/of.h> |
19 | #include <linux/of_gpio.h> | 20 | #include <linux/of_gpio.h> |
@@ -24,8 +25,14 @@ struct qe_gpio_chip { | |||
24 | struct of_mm_gpio_chip mm_gc; | 25 | struct of_mm_gpio_chip mm_gc; |
25 | spinlock_t lock; | 26 | spinlock_t lock; |
26 | 27 | ||
28 | unsigned long pin_flags[QE_PIO_PINS]; | ||
29 | #define QE_PIN_REQUESTED 0 | ||
30 | |||
27 | /* shadowed data register to clear/set bits safely */ | 31 | /* shadowed data register to clear/set bits safely */ |
28 | u32 cpdata; | 32 | u32 cpdata; |
33 | |||
34 | /* saved_regs used to restore dedicated functions */ | ||
35 | struct qe_pio_regs saved_regs; | ||
29 | }; | 36 | }; |
30 | 37 | ||
31 | static inline struct qe_gpio_chip * | 38 | static inline struct qe_gpio_chip * |
@@ -40,6 +47,12 @@ static void qe_gpio_save_regs(struct of_mm_gpio_chip *mm_gc) | |||
40 | struct qe_pio_regs __iomem *regs = mm_gc->regs; | 47 | struct qe_pio_regs __iomem *regs = mm_gc->regs; |
41 | 48 | ||
42 | qe_gc->cpdata = in_be32(®s->cpdata); | 49 | qe_gc->cpdata = in_be32(®s->cpdata); |
50 | qe_gc->saved_regs.cpdata = qe_gc->cpdata; | ||
51 | qe_gc->saved_regs.cpdir1 = in_be32(®s->cpdir1); | ||
52 | qe_gc->saved_regs.cpdir2 = in_be32(®s->cpdir2); | ||
53 | qe_gc->saved_regs.cppar1 = in_be32(®s->cppar1); | ||
54 | qe_gc->saved_regs.cppar2 = in_be32(®s->cppar2); | ||
55 | qe_gc->saved_regs.cpodr = in_be32(®s->cpodr); | ||
43 | } | 56 | } |
44 | 57 | ||
45 | static int qe_gpio_get(struct gpio_chip *gc, unsigned int gpio) | 58 | static int qe_gpio_get(struct gpio_chip *gc, unsigned int gpio) |
@@ -103,6 +116,188 @@ static int qe_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | |||
103 | return 0; | 116 | return 0; |
104 | } | 117 | } |
105 | 118 | ||
119 | struct qe_pin { | ||
120 | /* | ||
121 | * The qe_gpio_chip name is unfortunate, we should change that to | ||
122 | * something like qe_pio_controller. Someday. | ||
123 | */ | ||
124 | struct qe_gpio_chip *controller; | ||
125 | int num; | ||
126 | }; | ||
127 | |||
128 | /** | ||
129 | * qe_pin_request - Request a QE pin | ||
130 | * @np: device node to get a pin from | ||
131 | * @index: index of a pin in the device tree | ||
132 | * Context: non-atomic | ||
133 | * | ||
134 | * This function return qe_pin so that you could use it with the rest of | ||
135 | * the QE Pin Multiplexing API. | ||
136 | */ | ||
137 | struct qe_pin *qe_pin_request(struct device_node *np, int index) | ||
138 | { | ||
139 | struct qe_pin *qe_pin; | ||
140 | struct device_node *gc; | ||
141 | struct of_gpio_chip *of_gc = NULL; | ||
142 | struct of_mm_gpio_chip *mm_gc; | ||
143 | struct qe_gpio_chip *qe_gc; | ||
144 | int err; | ||
145 | int size; | ||
146 | const void *gpio_spec; | ||
147 | const u32 *gpio_cells; | ||
148 | unsigned long flags; | ||
149 | |||
150 | qe_pin = kzalloc(sizeof(*qe_pin), GFP_KERNEL); | ||
151 | if (!qe_pin) { | ||
152 | pr_debug("%s: can't allocate memory\n", __func__); | ||
153 | return ERR_PTR(-ENOMEM); | ||
154 | } | ||
155 | |||
156 | err = of_parse_phandles_with_args(np, "gpios", "#gpio-cells", index, | ||
157 | &gc, &gpio_spec); | ||
158 | if (err) { | ||
159 | pr_debug("%s: can't parse gpios property\n", __func__); | ||
160 | goto err0; | ||
161 | } | ||
162 | |||
163 | if (!of_device_is_compatible(gc, "fsl,mpc8323-qe-pario-bank")) { | ||
164 | pr_debug("%s: tried to get a non-qe pin\n", __func__); | ||
165 | err = -EINVAL; | ||
166 | goto err1; | ||
167 | } | ||
168 | |||
169 | of_gc = gc->data; | ||
170 | if (!of_gc) { | ||
171 | pr_debug("%s: gpio controller %s isn't registered\n", | ||
172 | np->full_name, gc->full_name); | ||
173 | err = -ENODEV; | ||
174 | goto err1; | ||
175 | } | ||
176 | |||
177 | gpio_cells = of_get_property(gc, "#gpio-cells", &size); | ||
178 | if (!gpio_cells || size != sizeof(*gpio_cells) || | ||
179 | *gpio_cells != of_gc->gpio_cells) { | ||
180 | pr_debug("%s: wrong #gpio-cells for %s\n", | ||
181 | np->full_name, gc->full_name); | ||
182 | err = -EINVAL; | ||
183 | goto err1; | ||
184 | } | ||
185 | |||
186 | err = of_gc->xlate(of_gc, np, gpio_spec, NULL); | ||
187 | if (err < 0) | ||
188 | goto err1; | ||
189 | |||
190 | mm_gc = to_of_mm_gpio_chip(&of_gc->gc); | ||
191 | qe_gc = to_qe_gpio_chip(mm_gc); | ||
192 | |||
193 | spin_lock_irqsave(&qe_gc->lock, flags); | ||
194 | |||
195 | if (test_and_set_bit(QE_PIN_REQUESTED, &qe_gc->pin_flags[err]) == 0) { | ||
196 | qe_pin->controller = qe_gc; | ||
197 | qe_pin->num = err; | ||
198 | err = 0; | ||
199 | } else { | ||
200 | err = -EBUSY; | ||
201 | } | ||
202 | |||
203 | spin_unlock_irqrestore(&qe_gc->lock, flags); | ||
204 | |||
205 | if (!err) | ||
206 | return qe_pin; | ||
207 | err1: | ||
208 | of_node_put(gc); | ||
209 | err0: | ||
210 | kfree(qe_pin); | ||
211 | pr_debug("%s failed with status %d\n", __func__, err); | ||
212 | return ERR_PTR(err); | ||
213 | } | ||
214 | EXPORT_SYMBOL(qe_pin_request); | ||
215 | |||
216 | /** | ||
217 | * qe_pin_free - Free a pin | ||
218 | * @qe_pin: pointer to the qe_pin structure | ||
219 | * Context: any | ||
220 | * | ||
221 | * This function frees the qe_pin structure and makes a pin available | ||
222 | * for further qe_pin_request() calls. | ||
223 | */ | ||
224 | void qe_pin_free(struct qe_pin *qe_pin) | ||
225 | { | ||
226 | struct qe_gpio_chip *qe_gc = qe_pin->controller; | ||
227 | unsigned long flags; | ||
228 | const int pin = qe_pin->num; | ||
229 | |||
230 | spin_lock_irqsave(&qe_gc->lock, flags); | ||
231 | test_and_clear_bit(QE_PIN_REQUESTED, &qe_gc->pin_flags[pin]); | ||
232 | spin_unlock_irqrestore(&qe_gc->lock, flags); | ||
233 | |||
234 | kfree(qe_pin); | ||
235 | } | ||
236 | EXPORT_SYMBOL(qe_pin_free); | ||
237 | |||
238 | /** | ||
239 | * qe_pin_set_dedicated - Revert a pin to a dedicated peripheral function mode | ||
240 | * @qe_pin: pointer to the qe_pin structure | ||
241 | * Context: any | ||
242 | * | ||
243 | * This function resets a pin to a dedicated peripheral function that | ||
244 | * has been set up by the firmware. | ||
245 | */ | ||
246 | void qe_pin_set_dedicated(struct qe_pin *qe_pin) | ||
247 | { | ||
248 | struct qe_gpio_chip *qe_gc = qe_pin->controller; | ||
249 | struct qe_pio_regs __iomem *regs = qe_gc->mm_gc.regs; | ||
250 | struct qe_pio_regs *sregs = &qe_gc->saved_regs; | ||
251 | int pin = qe_pin->num; | ||
252 | u32 mask1 = 1 << (QE_PIO_PINS - (pin + 1)); | ||
253 | u32 mask2 = 0x3 << (QE_PIO_PINS - (pin % (QE_PIO_PINS / 2) + 1) * 2); | ||
254 | bool second_reg = pin > (QE_PIO_PINS / 2) - 1; | ||
255 | unsigned long flags; | ||
256 | |||
257 | spin_lock_irqsave(&qe_gc->lock, flags); | ||
258 | |||
259 | if (second_reg) { | ||
260 | clrsetbits_be32(®s->cpdir2, mask2, sregs->cpdir2 & mask2); | ||
261 | clrsetbits_be32(®s->cppar2, mask2, sregs->cppar2 & mask2); | ||
262 | } else { | ||
263 | clrsetbits_be32(®s->cpdir1, mask2, sregs->cpdir1 & mask2); | ||
264 | clrsetbits_be32(®s->cppar1, mask2, sregs->cppar1 & mask2); | ||
265 | } | ||
266 | |||
267 | if (sregs->cpdata & mask1) | ||
268 | qe_gc->cpdata |= mask1; | ||
269 | else | ||
270 | qe_gc->cpdata &= ~mask1; | ||
271 | |||
272 | out_be32(®s->cpdata, qe_gc->cpdata); | ||
273 | clrsetbits_be32(®s->cpodr, mask1, sregs->cpodr & mask1); | ||
274 | |||
275 | spin_unlock_irqrestore(&qe_gc->lock, flags); | ||
276 | } | ||
277 | EXPORT_SYMBOL(qe_pin_set_dedicated); | ||
278 | |||
279 | /** | ||
280 | * qe_pin_set_gpio - Set a pin to the GPIO mode | ||
281 | * @qe_pin: pointer to the qe_pin structure | ||
282 | * Context: any | ||
283 | * | ||
284 | * This function sets a pin to the GPIO mode. | ||
285 | */ | ||
286 | void qe_pin_set_gpio(struct qe_pin *qe_pin) | ||
287 | { | ||
288 | struct qe_gpio_chip *qe_gc = qe_pin->controller; | ||
289 | struct qe_pio_regs __iomem *regs = qe_gc->mm_gc.regs; | ||
290 | unsigned long flags; | ||
291 | |||
292 | spin_lock_irqsave(&qe_gc->lock, flags); | ||
293 | |||
294 | /* Let's make it input by default, GPIO API is able to change that. */ | ||
295 | __par_io_config_pin(regs, qe_pin->num, QE_PIO_DIR_IN, 0, 0, 0); | ||
296 | |||
297 | spin_unlock_irqrestore(&qe_gc->lock, flags); | ||
298 | } | ||
299 | EXPORT_SYMBOL(qe_pin_set_gpio); | ||
300 | |||
106 | static int __init qe_add_gpiochips(void) | 301 | static int __init qe_add_gpiochips(void) |
107 | { | 302 | { |
108 | struct device_node *np; | 303 | struct device_node *np; |
diff --git a/arch/powerpc/sysdev/simple_gpio.c b/arch/powerpc/sysdev/simple_gpio.c new file mode 100644 index 000000000000..43c4569e24b7 --- /dev/null +++ b/arch/powerpc/sysdev/simple_gpio.c | |||
@@ -0,0 +1,155 @@ | |||
1 | /* | ||
2 | * Simple Memory-Mapped GPIOs | ||
3 | * | ||
4 | * Copyright (c) MontaVista Software, Inc. 2008. | ||
5 | * | ||
6 | * Author: Anton Vorontsov <avorontsov@ru.mvista.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/init.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/spinlock.h> | ||
18 | #include <linux/types.h> | ||
19 | #include <linux/ioport.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/of.h> | ||
22 | #include <linux/of_gpio.h> | ||
23 | #include <linux/gpio.h> | ||
24 | #include <asm/prom.h> | ||
25 | #include "simple_gpio.h" | ||
26 | |||
27 | struct u8_gpio_chip { | ||
28 | struct of_mm_gpio_chip mm_gc; | ||
29 | spinlock_t lock; | ||
30 | |||
31 | /* shadowed data register to clear/set bits safely */ | ||
32 | u8 data; | ||
33 | }; | ||
34 | |||
35 | static struct u8_gpio_chip *to_u8_gpio_chip(struct of_mm_gpio_chip *mm_gc) | ||
36 | { | ||
37 | return container_of(mm_gc, struct u8_gpio_chip, mm_gc); | ||
38 | } | ||
39 | |||
40 | static u8 u8_pin2mask(unsigned int pin) | ||
41 | { | ||
42 | return 1 << (8 - 1 - pin); | ||
43 | } | ||
44 | |||
45 | static int u8_gpio_get(struct gpio_chip *gc, unsigned int gpio) | ||
46 | { | ||
47 | struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
48 | |||
49 | return in_8(mm_gc->regs) & u8_pin2mask(gpio); | ||
50 | } | ||
51 | |||
52 | static void u8_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val) | ||
53 | { | ||
54 | struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
55 | struct u8_gpio_chip *u8_gc = to_u8_gpio_chip(mm_gc); | ||
56 | unsigned long flags; | ||
57 | |||
58 | spin_lock_irqsave(&u8_gc->lock, flags); | ||
59 | |||
60 | if (val) | ||
61 | u8_gc->data |= u8_pin2mask(gpio); | ||
62 | else | ||
63 | u8_gc->data &= ~u8_pin2mask(gpio); | ||
64 | |||
65 | out_8(mm_gc->regs, u8_gc->data); | ||
66 | |||
67 | spin_unlock_irqrestore(&u8_gc->lock, flags); | ||
68 | } | ||
69 | |||
70 | static int u8_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio) | ||
71 | { | ||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | static int u8_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
76 | { | ||
77 | u8_gpio_set(gc, gpio, val); | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static void u8_gpio_save_regs(struct of_mm_gpio_chip *mm_gc) | ||
82 | { | ||
83 | struct u8_gpio_chip *u8_gc = to_u8_gpio_chip(mm_gc); | ||
84 | |||
85 | u8_gc->data = in_8(mm_gc->regs); | ||
86 | } | ||
87 | |||
88 | static int __init u8_simple_gpiochip_add(struct device_node *np) | ||
89 | { | ||
90 | int ret; | ||
91 | struct u8_gpio_chip *u8_gc; | ||
92 | struct of_mm_gpio_chip *mm_gc; | ||
93 | struct of_gpio_chip *of_gc; | ||
94 | struct gpio_chip *gc; | ||
95 | |||
96 | u8_gc = kzalloc(sizeof(*u8_gc), GFP_KERNEL); | ||
97 | if (!u8_gc) | ||
98 | return -ENOMEM; | ||
99 | |||
100 | spin_lock_init(&u8_gc->lock); | ||
101 | |||
102 | mm_gc = &u8_gc->mm_gc; | ||
103 | of_gc = &mm_gc->of_gc; | ||
104 | gc = &of_gc->gc; | ||
105 | |||
106 | mm_gc->save_regs = u8_gpio_save_regs; | ||
107 | of_gc->gpio_cells = 2; | ||
108 | gc->ngpio = 8; | ||
109 | gc->direction_input = u8_gpio_dir_in; | ||
110 | gc->direction_output = u8_gpio_dir_out; | ||
111 | gc->get = u8_gpio_get; | ||
112 | gc->set = u8_gpio_set; | ||
113 | |||
114 | ret = of_mm_gpiochip_add(np, mm_gc); | ||
115 | if (ret) | ||
116 | goto err; | ||
117 | return 0; | ||
118 | err: | ||
119 | kfree(u8_gc); | ||
120 | return ret; | ||
121 | } | ||
122 | |||
123 | void __init simple_gpiochip_init(const char *compatible) | ||
124 | { | ||
125 | struct device_node *np; | ||
126 | |||
127 | for_each_compatible_node(np, NULL, compatible) { | ||
128 | int ret; | ||
129 | struct resource r; | ||
130 | |||
131 | ret = of_address_to_resource(np, 0, &r); | ||
132 | if (ret) | ||
133 | goto err; | ||
134 | |||
135 | switch (resource_size(&r)) { | ||
136 | case 1: | ||
137 | ret = u8_simple_gpiochip_add(np); | ||
138 | if (ret) | ||
139 | goto err; | ||
140 | break; | ||
141 | default: | ||
142 | /* | ||
143 | * Whenever you need support for GPIO bank width > 1, | ||
144 | * please just turn u8_ code into huge macros, and | ||
145 | * construct needed uX_ code with it. | ||
146 | */ | ||
147 | ret = -ENOSYS; | ||
148 | goto err; | ||
149 | } | ||
150 | continue; | ||
151 | err: | ||
152 | pr_err("%s: registration failed, status %d\n", | ||
153 | np->full_name, ret); | ||
154 | } | ||
155 | } | ||
diff --git a/arch/powerpc/sysdev/simple_gpio.h b/arch/powerpc/sysdev/simple_gpio.h new file mode 100644 index 000000000000..3a7b0c513c76 --- /dev/null +++ b/arch/powerpc/sysdev/simple_gpio.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef __SYSDEV_SIMPLE_GPIO_H | ||
2 | #define __SYSDEV_SIMPLE_GPIO_H | ||
3 | |||
4 | #include <linux/errno.h> | ||
5 | |||
6 | #ifdef CONFIG_SIMPLE_GPIO | ||
7 | extern void simple_gpiochip_init(const char *compatible); | ||
8 | #else | ||
9 | static inline void simple_gpiochip_init(const char *compatible) {} | ||
10 | #endif /* CONFIG_SIMPLE_GPIO */ | ||
11 | |||
12 | #endif /* __SYSDEV_SIMPLE_GPIO_H */ | ||
diff --git a/arch/s390/include/asm/chpid.h b/arch/s390/include/asm/chpid.h index dfe3c7f3439a..fc71d8a6709b 100644 --- a/arch/s390/include/asm/chpid.h +++ b/arch/s390/include/asm/chpid.h | |||
@@ -9,7 +9,7 @@ | |||
9 | #define _ASM_S390_CHPID_H _ASM_S390_CHPID_H | 9 | #define _ASM_S390_CHPID_H _ASM_S390_CHPID_H |
10 | 10 | ||
11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
12 | #include <asm/types.h> | 12 | #include <linux/types.h> |
13 | 13 | ||
14 | #define __MAX_CHPID 255 | 14 | #define __MAX_CHPID 255 |
15 | 15 | ||
diff --git a/arch/s390/include/asm/chsc.h b/arch/s390/include/asm/chsc.h index d38d0cf62d4b..807997f7414b 100644 --- a/arch/s390/include/asm/chsc.h +++ b/arch/s390/include/asm/chsc.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #ifndef _ASM_CHSC_H | 8 | #ifndef _ASM_CHSC_H |
9 | #define _ASM_CHSC_H | 9 | #define _ASM_CHSC_H |
10 | 10 | ||
11 | #include <linux/types.h> | ||
11 | #include <asm/chpid.h> | 12 | #include <asm/chpid.h> |
12 | #include <asm/schid.h> | 13 | #include <asm/schid.h> |
13 | 14 | ||
diff --git a/arch/s390/include/asm/cmb.h b/arch/s390/include/asm/cmb.h index 50196857d27a..39ae03294794 100644 --- a/arch/s390/include/asm/cmb.h +++ b/arch/s390/include/asm/cmb.h | |||
@@ -1,5 +1,8 @@ | |||
1 | #ifndef S390_CMB_H | 1 | #ifndef S390_CMB_H |
2 | #define S390_CMB_H | 2 | #define S390_CMB_H |
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
3 | /** | 6 | /** |
4 | * struct cmbdata - channel measurement block data for user space | 7 | * struct cmbdata - channel measurement block data for user space |
5 | * @size: size of the stored data | 8 | * @size: size of the stored data |
diff --git a/arch/s390/include/asm/dasd.h b/arch/s390/include/asm/dasd.h index 55b2b80cdf6e..e2db6f16d9c8 100644 --- a/arch/s390/include/asm/dasd.h +++ b/arch/s390/include/asm/dasd.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #ifndef DASD_H | 15 | #ifndef DASD_H |
16 | #define DASD_H | 16 | #define DASD_H |
17 | #include <linux/types.h> | ||
17 | #include <linux/ioctl.h> | 18 | #include <linux/ioctl.h> |
18 | 19 | ||
19 | #define DASD_IOCTL_LETTER 'D' | 20 | #define DASD_IOCTL_LETTER 'D' |
@@ -78,6 +79,7 @@ typedef struct dasd_information2_t { | |||
78 | #define DASD_FEATURE_USEDIAG 0x02 | 79 | #define DASD_FEATURE_USEDIAG 0x02 |
79 | #define DASD_FEATURE_INITIAL_ONLINE 0x04 | 80 | #define DASD_FEATURE_INITIAL_ONLINE 0x04 |
80 | #define DASD_FEATURE_ERPLOG 0x08 | 81 | #define DASD_FEATURE_ERPLOG 0x08 |
82 | #define DASD_FEATURE_FAILFAST 0x10 | ||
81 | 83 | ||
82 | #define DASD_PARTN_BITS 2 | 84 | #define DASD_PARTN_BITS 2 |
83 | 85 | ||
diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h index d74002f95794..e1f54654e3ae 100644 --- a/arch/s390/include/asm/kvm.h +++ b/arch/s390/include/asm/kvm.h | |||
@@ -13,7 +13,7 @@ | |||
13 | * Author(s): Carsten Otte <cotte@de.ibm.com> | 13 | * Author(s): Carsten Otte <cotte@de.ibm.com> |
14 | * Christian Borntraeger <borntraeger@de.ibm.com> | 14 | * Christian Borntraeger <borntraeger@de.ibm.com> |
15 | */ | 15 | */ |
16 | #include <asm/types.h> | 16 | #include <linux/types.h> |
17 | 17 | ||
18 | /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */ | 18 | /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */ |
19 | struct kvm_pic_state { | 19 | struct kvm_pic_state { |
diff --git a/arch/s390/include/asm/posix_types.h b/arch/s390/include/asm/posix_types.h index 397d93fba3a7..8cc113f92523 100644 --- a/arch/s390/include/asm/posix_types.h +++ b/arch/s390/include/asm/posix_types.h | |||
@@ -68,11 +68,7 @@ typedef unsigned short __kernel_old_dev_t; | |||
68 | #endif /* __s390x__ */ | 68 | #endif /* __s390x__ */ |
69 | 69 | ||
70 | typedef struct { | 70 | typedef struct { |
71 | #if defined(__KERNEL__) || defined(__USE_ALL) | ||
72 | int val[2]; | 71 | int val[2]; |
73 | #else /* !defined(__KERNEL__) && !defined(__USE_ALL)*/ | ||
74 | int __val[2]; | ||
75 | #endif /* !defined(__KERNEL__) && !defined(__USE_ALL)*/ | ||
76 | } __kernel_fsid_t; | 72 | } __kernel_fsid_t; |
77 | 73 | ||
78 | 74 | ||
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index 5396f9f12263..8920025c3c02 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
@@ -272,12 +272,15 @@ typedef struct | |||
272 | #define PSW_ASC_SECONDARY 0x0000800000000000UL | 272 | #define PSW_ASC_SECONDARY 0x0000800000000000UL |
273 | #define PSW_ASC_HOME 0x0000C00000000000UL | 273 | #define PSW_ASC_HOME 0x0000C00000000000UL |
274 | 274 | ||
275 | extern long psw_user32_bits; | ||
276 | |||
277 | #endif /* __s390x__ */ | 275 | #endif /* __s390x__ */ |
278 | 276 | ||
277 | #ifdef __KERNEL__ | ||
279 | extern long psw_kernel_bits; | 278 | extern long psw_kernel_bits; |
280 | extern long psw_user_bits; | 279 | extern long psw_user_bits; |
280 | #ifdef CONFIG_64BIT | ||
281 | extern long psw_user32_bits; | ||
282 | #endif | ||
283 | #endif | ||
281 | 284 | ||
282 | /* This macro merges a NEW PSW mask specified by the user into | 285 | /* This macro merges a NEW PSW mask specified by the user into |
283 | the currently active PSW mask CURRENT, modifying only those | 286 | the currently active PSW mask CURRENT, modifying only those |
diff --git a/arch/s390/include/asm/qeth.h b/arch/s390/include/asm/qeth.h index 930d378ef75a..06cbd1e8c943 100644 --- a/arch/s390/include/asm/qeth.h +++ b/arch/s390/include/asm/qeth.h | |||
@@ -10,6 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | #ifndef __ASM_S390_QETH_IOCTL_H__ | 11 | #ifndef __ASM_S390_QETH_IOCTL_H__ |
12 | #define __ASM_S390_QETH_IOCTL_H__ | 12 | #define __ASM_S390_QETH_IOCTL_H__ |
13 | #include <linux/types.h> | ||
13 | #include <linux/ioctl.h> | 14 | #include <linux/ioctl.h> |
14 | 15 | ||
15 | #define SIOC_QETH_ARP_SET_NO_ENTRIES (SIOCDEVPRIVATE) | 16 | #define SIOC_QETH_ARP_SET_NO_ENTRIES (SIOCDEVPRIVATE) |
diff --git a/arch/s390/include/asm/schid.h b/arch/s390/include/asm/schid.h index 825503cf3dc2..3e4d401b4e45 100644 --- a/arch/s390/include/asm/schid.h +++ b/arch/s390/include/asm/schid.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef ASM_SCHID_H | 1 | #ifndef ASM_SCHID_H |
2 | #define ASM_SCHID_H | 2 | #define ASM_SCHID_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct subchannel_id { | 6 | struct subchannel_id { |
5 | __u32 cssid : 8; | 7 | __u32 cssid : 8; |
6 | __u32 : 4; | 8 | __u32 : 4; |
diff --git a/arch/s390/include/asm/swab.h b/arch/s390/include/asm/swab.h index bd9321aa55a9..eb18dc1f327b 100644 --- a/arch/s390/include/asm/swab.h +++ b/arch/s390/include/asm/swab.h | |||
@@ -9,7 +9,7 @@ | |||
9 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | 9 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <asm/types.h> | 12 | #include <linux/types.h> |
13 | 13 | ||
14 | #ifndef __s390x__ | 14 | #ifndef __s390x__ |
15 | # define __SWAB_64_THRU_32__ | 15 | # define __SWAB_64_THRU_32__ |
diff --git a/arch/s390/include/asm/types.h b/arch/s390/include/asm/types.h index 41c547656130..3dc3fc228812 100644 --- a/arch/s390/include/asm/types.h +++ b/arch/s390/include/asm/types.h | |||
@@ -9,11 +9,7 @@ | |||
9 | #ifndef _S390_TYPES_H | 9 | #ifndef _S390_TYPES_H |
10 | #define _S390_TYPES_H | 10 | #define _S390_TYPES_H |
11 | 11 | ||
12 | #ifndef __s390x__ | 12 | #include <asm-generic/int-ll64.h> |
13 | # include <asm-generic/int-ll64.h> | ||
14 | #else | ||
15 | # include <asm-generic/int-l64.h> | ||
16 | #endif | ||
17 | 13 | ||
18 | #ifndef __ASSEMBLY__ | 14 | #ifndef __ASSEMBLY__ |
19 | 15 | ||
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index 6b1896345eda..a65afc91e8aa 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
@@ -54,7 +54,5 @@ long sys_sigreturn(void); | |||
54 | long sys_rt_sigreturn(void); | 54 | long sys_rt_sigreturn(void); |
55 | long sys32_sigreturn(void); | 55 | long sys32_sigreturn(void); |
56 | long sys32_rt_sigreturn(void); | 56 | long sys32_rt_sigreturn(void); |
57 | long old_select(struct sel_arg_struct __user *arg); | ||
58 | long sys_ptrace(long request, long pid, long addr, long data); | ||
59 | 57 | ||
60 | #endif /* _ENTRY_H */ | 58 | #endif /* _ENTRY_H */ |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 9c0ccb532a45..2d337cbb9329 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -685,7 +685,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
685 | if (MACHINE_HAS_IEEE) | 685 | if (MACHINE_HAS_IEEE) |
686 | lowcore->extended_save_area_addr = (u32) save_area; | 686 | lowcore->extended_save_area_addr = (u32) save_area; |
687 | #else | 687 | #else |
688 | BUG_ON(vdso_alloc_per_cpu(smp_processor_id(), lowcore)); | 688 | if (vdso_alloc_per_cpu(smp_processor_id(), lowcore)) |
689 | BUG(); | ||
689 | #endif | 690 | #endif |
690 | set_prefix((u32)(unsigned long) lowcore); | 691 | set_prefix((u32)(unsigned long) lowcore); |
691 | local_mcck_enable(); | 692 | local_mcck_enable(); |
diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index 4fe952e557ac..c34be4568b80 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c | |||
@@ -103,25 +103,6 @@ out: | |||
103 | return error; | 103 | return error; |
104 | } | 104 | } |
105 | 105 | ||
106 | #ifndef CONFIG_64BIT | ||
107 | struct sel_arg_struct { | ||
108 | unsigned long n; | ||
109 | fd_set __user *inp, *outp, *exp; | ||
110 | struct timeval __user *tvp; | ||
111 | }; | ||
112 | |||
113 | asmlinkage long old_select(struct sel_arg_struct __user *arg) | ||
114 | { | ||
115 | struct sel_arg_struct a; | ||
116 | |||
117 | if (copy_from_user(&a, arg, sizeof(a))) | ||
118 | return -EFAULT; | ||
119 | /* sys_select() does the appropriate kernel locking */ | ||
120 | return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); | ||
121 | |||
122 | } | ||
123 | #endif /* CONFIG_64BIT */ | ||
124 | |||
125 | /* | 106 | /* |
126 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | 107 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. |
127 | * | 108 | * |
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index 25a6a82f1c02..690e17819686 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c | |||
@@ -322,7 +322,8 @@ static int __init vdso_init(void) | |||
322 | vdso64_pagelist[vdso64_pages - 1] = virt_to_page(vdso_data); | 322 | vdso64_pagelist[vdso64_pages - 1] = virt_to_page(vdso_data); |
323 | vdso64_pagelist[vdso64_pages] = NULL; | 323 | vdso64_pagelist[vdso64_pages] = NULL; |
324 | #ifndef CONFIG_SMP | 324 | #ifndef CONFIG_SMP |
325 | BUG_ON(vdso_alloc_per_cpu(0, S390_lowcore)); | 325 | if (vdso_alloc_per_cpu(0, &S390_lowcore)) |
326 | BUG(); | ||
326 | #endif | 327 | #endif |
327 | vdso_init_cr5(); | 328 | vdso_init_cr5(); |
328 | #endif /* CONFIG_64BIT */ | 329 | #endif /* CONFIG_64BIT */ |
diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S index c32f29c3d70c..ad8acfc949fb 100644 --- a/arch/s390/kernel/vdso32/gettimeofday.S +++ b/arch/s390/kernel/vdso32/gettimeofday.S | |||
@@ -13,10 +13,6 @@ | |||
13 | #include <asm/asm-offsets.h> | 13 | #include <asm/asm-offsets.h> |
14 | #include <asm/unistd.h> | 14 | #include <asm/unistd.h> |
15 | 15 | ||
16 | #include <asm/vdso.h> | ||
17 | #include <asm/asm-offsets.h> | ||
18 | #include <asm/unistd.h> | ||
19 | |||
20 | .text | 16 | .text |
21 | .align 4 | 17 | .align 4 |
22 | .globl __kernel_gettimeofday | 18 | .globl __kernel_gettimeofday |
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c index a0775e1f08df..8300309698fa 100644 --- a/arch/s390/kvm/diag.c +++ b/arch/s390/kvm/diag.c | |||
@@ -47,7 +47,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu) | |||
47 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL; | 47 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL; |
48 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT; | 48 | vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT; |
49 | vcpu->run->exit_reason = KVM_EXIT_S390_RESET; | 49 | vcpu->run->exit_reason = KVM_EXIT_S390_RESET; |
50 | VCPU_EVENT(vcpu, 3, "requesting userspace resets %lx", | 50 | VCPU_EVENT(vcpu, 3, "requesting userspace resets %llx", |
51 | vcpu->run->s390_reset_flags); | 51 | vcpu->run->s390_reset_flags); |
52 | return -EREMOTE; | 52 | return -EREMOTE; |
53 | } | 53 | } |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index 2960702b4824..f4fe28a2521a 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -160,7 +160,7 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
160 | break; | 160 | break; |
161 | 161 | ||
162 | case KVM_S390_INT_VIRTIO: | 162 | case KVM_S390_INT_VIRTIO: |
163 | VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%lx", | 163 | VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx", |
164 | inti->ext.ext_params, inti->ext.ext_params2); | 164 | inti->ext.ext_params, inti->ext.ext_params2); |
165 | vcpu->stat.deliver_virtio_interrupt++; | 165 | vcpu->stat.deliver_virtio_interrupt++; |
166 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603); | 166 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603); |
@@ -360,7 +360,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu) | |||
360 | vcpu->arch.ckc_timer.expires = jiffies + sltime; | 360 | vcpu->arch.ckc_timer.expires = jiffies + sltime; |
361 | 361 | ||
362 | add_timer(&vcpu->arch.ckc_timer); | 362 | add_timer(&vcpu->arch.ckc_timer); |
363 | VCPU_EVENT(vcpu, 5, "enabled wait timer:%lx jiffies", sltime); | 363 | VCPU_EVENT(vcpu, 5, "enabled wait timer:%llx jiffies", sltime); |
364 | no_timer: | 364 | no_timer: |
365 | spin_lock_bh(&vcpu->arch.local_int.float_int->lock); | 365 | spin_lock_bh(&vcpu->arch.local_int.float_int->lock); |
366 | spin_lock_bh(&vcpu->arch.local_int.lock); | 366 | spin_lock_bh(&vcpu->arch.local_int.lock); |
@@ -491,7 +491,7 @@ int kvm_s390_inject_vm(struct kvm *kvm, | |||
491 | 491 | ||
492 | switch (s390int->type) { | 492 | switch (s390int->type) { |
493 | case KVM_S390_INT_VIRTIO: | 493 | case KVM_S390_INT_VIRTIO: |
494 | VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%lx", | 494 | VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%llx", |
495 | s390int->parm, s390int->parm64); | 495 | s390int->parm, s390int->parm64); |
496 | inti->type = s390int->type; | 496 | inti->type = s390int->type; |
497 | inti->ext.ext_params = s390int->parm; | 497 | inti->ext.ext_params = s390int->parm; |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index cce40ff2913b..3605df45dd41 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
@@ -118,7 +118,7 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu) | |||
118 | goto out; | 118 | goto out; |
119 | } | 119 | } |
120 | 120 | ||
121 | VCPU_EVENT(vcpu, 5, "storing cpu address to %lx", useraddr); | 121 | VCPU_EVENT(vcpu, 5, "storing cpu address to %llx", useraddr); |
122 | out: | 122 | out: |
123 | return 0; | 123 | return 0; |
124 | } | 124 | } |
diff --git a/arch/sh/drivers/pci/ops-cayman.c b/arch/sh/drivers/pci/ops-cayman.c index 5ccf9ea3a9de..38ef76207af6 100644 --- a/arch/sh/drivers/pci/ops-cayman.c +++ b/arch/sh/drivers/pci/ops-cayman.c | |||
@@ -5,11 +5,6 @@ | |||
5 | #include <cpu/irq.h> | 5 | #include <cpu/irq.h> |
6 | #include "pci-sh5.h" | 6 | #include "pci-sh5.h" |
7 | 7 | ||
8 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
9 | { | ||
10 | return (((pin - 1) + slot) % 4) + 1; | ||
11 | } | ||
12 | |||
13 | int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) | 8 | int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) |
14 | { | 9 | { |
15 | int result = -1; | 10 | int result = -1; |
@@ -42,7 +37,7 @@ int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
42 | while (dev->bus->number > 0) { | 37 | while (dev->bus->number > 0) { |
43 | 38 | ||
44 | slot = path[i].slot = PCI_SLOT(dev->devfn); | 39 | slot = path[i].slot = PCI_SLOT(dev->devfn); |
45 | pin = path[i].pin = bridge_swizzle(pin, slot); | 40 | pin = path[i].pin = pci_swizzle_interrupt_pin(dev, pin); |
46 | dev = dev->bus->self; | 41 | dev = dev->bus->self; |
47 | i++; | 42 | i++; |
48 | if (i > 3) panic("PCI path to root bus too long!\n"); | 43 | if (i > 3) panic("PCI path to root bus too long!\n"); |
@@ -56,7 +51,7 @@ int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
56 | if ((slot < 3) || (i == 0)) { | 51 | if ((slot < 3) || (i == 0)) { |
57 | /* Bus 0 (incl. PCI-PCI bridge itself) : perform the final | 52 | /* Bus 0 (incl. PCI-PCI bridge itself) : perform the final |
58 | swizzle now. */ | 53 | swizzle now. */ |
59 | result = IRQ_INTA + bridge_swizzle(pin, slot) - 1; | 54 | result = IRQ_INTA + pci_swizzle_interrupt_pin(dev, pin) - 1; |
60 | } else { | 55 | } else { |
61 | i--; | 56 | i--; |
62 | slot = path[i].slot; | 57 | slot = path[i].slot; |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index d3839e609aac..e36c7b870861 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -21,26 +21,6 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <asm/io.h> | 22 | #include <asm/io.h> |
23 | 23 | ||
24 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
25 | { | ||
26 | return (((pin - 1) + slot) % 4) + 1; | ||
27 | } | ||
28 | |||
29 | static u8 __init simple_swizzle(struct pci_dev *dev, u8 *pinp) | ||
30 | { | ||
31 | u8 pin = *pinp; | ||
32 | |||
33 | while (dev->bus->parent) { | ||
34 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | ||
35 | /* Move up the chain of bridges. */ | ||
36 | dev = dev->bus->self; | ||
37 | } | ||
38 | *pinp = pin; | ||
39 | |||
40 | /* The slot is the slot of the last bridge. */ | ||
41 | return PCI_SLOT(dev->devfn); | ||
42 | } | ||
43 | |||
44 | static int __init pcibios_init(void) | 24 | static int __init pcibios_init(void) |
45 | { | 25 | { |
46 | struct pci_channel *p; | 26 | struct pci_channel *p; |
@@ -61,7 +41,7 @@ static int __init pcibios_init(void) | |||
61 | busno = bus->subordinate + 1; | 41 | busno = bus->subordinate + 1; |
62 | } | 42 | } |
63 | 43 | ||
64 | pci_fixup_irqs(simple_swizzle, pcibios_map_platform_irq); | 44 | pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq); |
65 | 45 | ||
66 | return 0; | 46 | return 0; |
67 | } | 47 | } |
diff --git a/arch/sh/include/asm/mmu.h b/arch/sh/include/asm/mmu.h index fdcb93bc6d11..6c43625bb1a5 100644 --- a/arch/sh/include/asm/mmu.h +++ b/arch/sh/include/asm/mmu.h | |||
@@ -9,7 +9,6 @@ typedef struct { | |||
9 | mm_context_id_t id; | 9 | mm_context_id_t id; |
10 | void *vdso; | 10 | void *vdso; |
11 | #else | 11 | #else |
12 | struct vm_list_struct *vmlist; | ||
13 | unsigned long end_brk; | 12 | unsigned long end_brk; |
14 | #endif | 13 | #endif |
15 | #ifdef CONFIG_BINFMT_ELF_FDPIC | 14 | #ifdef CONFIG_BINFMT_ELF_FDPIC |
diff --git a/arch/sparc/include/asm/timer_64.h b/arch/sparc/include/asm/timer_64.h index 5b779fd1f788..ef3c3682debf 100644 --- a/arch/sparc/include/asm/timer_64.h +++ b/arch/sparc/include/asm/timer_64.h | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | 11 | ||
12 | struct sparc64_tick_ops { | 12 | struct sparc64_tick_ops { |
13 | unsigned long (*get_tick)(void); | 13 | unsigned long long (*get_tick)(void); |
14 | int (*add_compare)(unsigned long); | 14 | int (*add_compare)(unsigned long); |
15 | unsigned long softint_mask; | 15 | unsigned long softint_mask; |
16 | void (*disable_irq)(void); | 16 | void (*disable_irq)(void); |
diff --git a/arch/sparc/include/asm/types.h b/arch/sparc/include/asm/types.h index 8c28fde5eaa2..2237118825d0 100644 --- a/arch/sparc/include/asm/types.h +++ b/arch/sparc/include/asm/types.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #if defined(__sparc__) && defined(__arch64__) | 11 | #if defined(__sparc__) && defined(__arch64__) |
12 | 12 | ||
13 | /*** SPARC 64 bit ***/ | 13 | /*** SPARC 64 bit ***/ |
14 | #include <asm-generic/int-l64.h> | 14 | #include <asm-generic/int-ll64.h> |
15 | 15 | ||
16 | #ifndef __ASSEMBLY__ | 16 | #ifndef __ASSEMBLY__ |
17 | 17 | ||
diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index f52e0534d91d..57c39843fb2a 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c | |||
@@ -286,7 +286,7 @@ static void md_update_data(struct ds_info *dp, | |||
286 | 286 | ||
287 | rp = (struct ds_md_update_req *) (dpkt + 1); | 287 | rp = (struct ds_md_update_req *) (dpkt + 1); |
288 | 288 | ||
289 | printk(KERN_INFO "ds-%lu: Machine description update.\n", dp->id); | 289 | printk(KERN_INFO "ds-%llu: Machine description update.\n", dp->id); |
290 | 290 | ||
291 | mdesc_update(); | 291 | mdesc_update(); |
292 | 292 | ||
@@ -325,7 +325,7 @@ static void domain_shutdown_data(struct ds_info *dp, | |||
325 | 325 | ||
326 | rp = (struct ds_shutdown_req *) (dpkt + 1); | 326 | rp = (struct ds_shutdown_req *) (dpkt + 1); |
327 | 327 | ||
328 | printk(KERN_ALERT "ds-%lu: Shutdown request from " | 328 | printk(KERN_ALERT "ds-%llu: Shutdown request from " |
329 | "LDOM manager received.\n", dp->id); | 329 | "LDOM manager received.\n", dp->id); |
330 | 330 | ||
331 | memset(&pkt, 0, sizeof(pkt)); | 331 | memset(&pkt, 0, sizeof(pkt)); |
@@ -365,7 +365,7 @@ static void domain_panic_data(struct ds_info *dp, | |||
365 | 365 | ||
366 | rp = (struct ds_panic_req *) (dpkt + 1); | 366 | rp = (struct ds_panic_req *) (dpkt + 1); |
367 | 367 | ||
368 | printk(KERN_ALERT "ds-%lu: Panic request from " | 368 | printk(KERN_ALERT "ds-%llu: Panic request from " |
369 | "LDOM manager received.\n", dp->id); | 369 | "LDOM manager received.\n", dp->id); |
370 | 370 | ||
371 | memset(&pkt, 0, sizeof(pkt)); | 371 | memset(&pkt, 0, sizeof(pkt)); |
@@ -549,7 +549,7 @@ static int __cpuinit dr_cpu_configure(struct ds_info *dp, | |||
549 | for_each_cpu_mask(cpu, *mask) { | 549 | for_each_cpu_mask(cpu, *mask) { |
550 | int err; | 550 | int err; |
551 | 551 | ||
552 | printk(KERN_INFO "ds-%lu: Starting cpu %d...\n", | 552 | printk(KERN_INFO "ds-%llu: Starting cpu %d...\n", |
553 | dp->id, cpu); | 553 | dp->id, cpu); |
554 | err = cpu_up(cpu); | 554 | err = cpu_up(cpu); |
555 | if (err) { | 555 | if (err) { |
@@ -565,7 +565,7 @@ static int __cpuinit dr_cpu_configure(struct ds_info *dp, | |||
565 | res = DR_CPU_RES_CPU_NOT_RESPONDING; | 565 | res = DR_CPU_RES_CPU_NOT_RESPONDING; |
566 | } | 566 | } |
567 | 567 | ||
568 | printk(KERN_INFO "ds-%lu: CPU startup failed err=%d\n", | 568 | printk(KERN_INFO "ds-%llu: CPU startup failed err=%d\n", |
569 | dp->id, err); | 569 | dp->id, err); |
570 | dr_cpu_mark(resp, cpu, ncpus, res, stat); | 570 | dr_cpu_mark(resp, cpu, ncpus, res, stat); |
571 | } | 571 | } |
@@ -605,7 +605,7 @@ static int dr_cpu_unconfigure(struct ds_info *dp, | |||
605 | for_each_cpu_mask(cpu, *mask) { | 605 | for_each_cpu_mask(cpu, *mask) { |
606 | int err; | 606 | int err; |
607 | 607 | ||
608 | printk(KERN_INFO "ds-%lu: Shutting down cpu %d...\n", | 608 | printk(KERN_INFO "ds-%llu: Shutting down cpu %d...\n", |
609 | dp->id, cpu); | 609 | dp->id, cpu); |
610 | err = cpu_down(cpu); | 610 | err = cpu_down(cpu); |
611 | if (err) | 611 | if (err) |
@@ -684,7 +684,7 @@ static void ds_pri_data(struct ds_info *dp, | |||
684 | 684 | ||
685 | rp = (struct ds_pri_msg *) (dpkt + 1); | 685 | rp = (struct ds_pri_msg *) (dpkt + 1); |
686 | 686 | ||
687 | printk(KERN_INFO "ds-%lu: PRI REQ [%lx:%lx], len=%d\n", | 687 | printk(KERN_INFO "ds-%llu: PRI REQ [%llx:%llx], len=%d\n", |
688 | dp->id, rp->req_num, rp->type, len); | 688 | dp->id, rp->req_num, rp->type, len); |
689 | } | 689 | } |
690 | 690 | ||
@@ -816,7 +816,7 @@ void ldom_set_var(const char *var, const char *value) | |||
816 | 816 | ||
817 | if (ds_var_doorbell == 0 || | 817 | if (ds_var_doorbell == 0 || |
818 | ds_var_response != DS_VAR_SUCCESS) | 818 | ds_var_response != DS_VAR_SUCCESS) |
819 | printk(KERN_ERR "ds-%lu: var-config [%s:%s] " | 819 | printk(KERN_ERR "ds-%llu: var-config [%s:%s] " |
820 | "failed, response(%d).\n", | 820 | "failed, response(%d).\n", |
821 | dp->id, var, value, | 821 | dp->id, var, value, |
822 | ds_var_response); | 822 | ds_var_response); |
@@ -850,7 +850,7 @@ void ldom_power_off(void) | |||
850 | 850 | ||
851 | static void ds_conn_reset(struct ds_info *dp) | 851 | static void ds_conn_reset(struct ds_info *dp) |
852 | { | 852 | { |
853 | printk(KERN_ERR "ds-%lu: ds_conn_reset() from %p\n", | 853 | printk(KERN_ERR "ds-%llu: ds_conn_reset() from %p\n", |
854 | dp->id, __builtin_return_address(0)); | 854 | dp->id, __builtin_return_address(0)); |
855 | } | 855 | } |
856 | 856 | ||
@@ -912,11 +912,11 @@ static int ds_handshake(struct ds_info *dp, struct ds_msg_tag *pkt) | |||
912 | struct ds_cap_state *cp = find_cap(dp, ap->handle); | 912 | struct ds_cap_state *cp = find_cap(dp, ap->handle); |
913 | 913 | ||
914 | if (!cp) { | 914 | if (!cp) { |
915 | printk(KERN_ERR "ds-%lu: REG ACK for unknown " | 915 | printk(KERN_ERR "ds-%llu: REG ACK for unknown " |
916 | "handle %lx\n", dp->id, ap->handle); | 916 | "handle %llx\n", dp->id, ap->handle); |
917 | return 0; | 917 | return 0; |
918 | } | 918 | } |
919 | printk(KERN_INFO "ds-%lu: Registered %s service.\n", | 919 | printk(KERN_INFO "ds-%llu: Registered %s service.\n", |
920 | dp->id, cp->service_id); | 920 | dp->id, cp->service_id); |
921 | cp->state = CAP_STATE_REGISTERED; | 921 | cp->state = CAP_STATE_REGISTERED; |
922 | } else if (pkt->type == DS_REG_NACK) { | 922 | } else if (pkt->type == DS_REG_NACK) { |
@@ -924,8 +924,8 @@ static int ds_handshake(struct ds_info *dp, struct ds_msg_tag *pkt) | |||
924 | struct ds_cap_state *cp = find_cap(dp, np->handle); | 924 | struct ds_cap_state *cp = find_cap(dp, np->handle); |
925 | 925 | ||
926 | if (!cp) { | 926 | if (!cp) { |
927 | printk(KERN_ERR "ds-%lu: REG NACK for " | 927 | printk(KERN_ERR "ds-%llu: REG NACK for " |
928 | "unknown handle %lx\n", | 928 | "unknown handle %llx\n", |
929 | dp->id, np->handle); | 929 | dp->id, np->handle); |
930 | return 0; | 930 | return 0; |
931 | } | 931 | } |
@@ -982,8 +982,8 @@ static void process_ds_work(void) | |||
982 | int req_len = qp->req_len; | 982 | int req_len = qp->req_len; |
983 | 983 | ||
984 | if (!cp) { | 984 | if (!cp) { |
985 | printk(KERN_ERR "ds-%lu: Data for unknown " | 985 | printk(KERN_ERR "ds-%llu: Data for unknown " |
986 | "handle %lu\n", | 986 | "handle %llu\n", |
987 | dp->id, dpkt->handle); | 987 | dp->id, dpkt->handle); |
988 | 988 | ||
989 | spin_lock_irqsave(&ds_lock, flags); | 989 | spin_lock_irqsave(&ds_lock, flags); |
@@ -1085,7 +1085,7 @@ static void ds_event(void *arg, int event) | |||
1085 | } | 1085 | } |
1086 | 1086 | ||
1087 | if (event != LDC_EVENT_DATA_READY) { | 1087 | if (event != LDC_EVENT_DATA_READY) { |
1088 | printk(KERN_WARNING "ds-%lu: Unexpected LDC event %d\n", | 1088 | printk(KERN_WARNING "ds-%llu: Unexpected LDC event %d\n", |
1089 | dp->id, event); | 1089 | dp->id, event); |
1090 | spin_unlock_irqrestore(&ds_lock, flags); | 1090 | spin_unlock_irqrestore(&ds_lock, flags); |
1091 | return; | 1091 | return; |
diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 1cc1995531e2..d8900e1d5aad 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c | |||
@@ -434,7 +434,7 @@ static void strbuf_flush(struct strbuf *strbuf, struct iommu *iommu, | |||
434 | val = iommu_read(matchreg); | 434 | val = iommu_read(matchreg); |
435 | if (unlikely(val)) { | 435 | if (unlikely(val)) { |
436 | printk(KERN_WARNING "strbuf_flush: ctx flush " | 436 | printk(KERN_WARNING "strbuf_flush: ctx flush " |
437 | "timeout matchreg[%lx] ctx[%lx]\n", | 437 | "timeout matchreg[%llx] ctx[%lx]\n", |
438 | val, ctx); | 438 | val, ctx); |
439 | goto do_page_flush; | 439 | goto do_page_flush; |
440 | } | 440 | } |
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index d68982330f66..6ce5d2598a09 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c | |||
@@ -625,22 +625,23 @@ static int process_ver_ack(struct ldc_channel *lp, struct ldc_version *vp) | |||
625 | static int process_ver_nack(struct ldc_channel *lp, struct ldc_version *vp) | 625 | static int process_ver_nack(struct ldc_channel *lp, struct ldc_version *vp) |
626 | { | 626 | { |
627 | struct ldc_version *vap; | 627 | struct ldc_version *vap; |
628 | struct ldc_packet *p; | ||
629 | unsigned long new_tail; | ||
628 | 630 | ||
629 | if ((vp->major == 0 && vp->minor == 0) || | 631 | if (vp->major == 0 && vp->minor == 0) |
630 | !(vap = find_by_major(vp->major))) { | 632 | return ldc_abort(lp); |
633 | |||
634 | vap = find_by_major(vp->major); | ||
635 | if (!vap) | ||
631 | return ldc_abort(lp); | 636 | return ldc_abort(lp); |
632 | } else { | ||
633 | struct ldc_packet *p; | ||
634 | unsigned long new_tail; | ||
635 | 637 | ||
636 | p = handshake_compose_ctrl(lp, LDC_INFO, LDC_VERS, | 638 | p = handshake_compose_ctrl(lp, LDC_INFO, LDC_VERS, |
637 | vap, sizeof(*vap), | 639 | vap, sizeof(*vap), |
638 | &new_tail); | 640 | &new_tail); |
639 | if (p) | 641 | if (!p) |
640 | return send_tx_packet(lp, p, new_tail); | 642 | return ldc_abort(lp); |
641 | else | 643 | |
642 | return ldc_abort(lp); | 644 | return send_tx_packet(lp, p, new_tail); |
643 | } | ||
644 | } | 645 | } |
645 | 646 | ||
646 | static int process_version(struct ldc_channel *lp, | 647 | static int process_version(struct ldc_channel *lp, |
diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index 3c539a6d7c18..3f79f0c23a08 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c | |||
@@ -536,24 +536,24 @@ static void __init report_platform_properties(void) | |||
536 | 536 | ||
537 | v = mdesc_get_property(hp, pn, "hostid", NULL); | 537 | v = mdesc_get_property(hp, pn, "hostid", NULL); |
538 | if (v) | 538 | if (v) |
539 | printk("PLATFORM: hostid [%08lx]\n", *v); | 539 | printk("PLATFORM: hostid [%08llx]\n", *v); |
540 | v = mdesc_get_property(hp, pn, "serial#", NULL); | 540 | v = mdesc_get_property(hp, pn, "serial#", NULL); |
541 | if (v) | 541 | if (v) |
542 | printk("PLATFORM: serial# [%08lx]\n", *v); | 542 | printk("PLATFORM: serial# [%08llx]\n", *v); |
543 | v = mdesc_get_property(hp, pn, "stick-frequency", NULL); | 543 | v = mdesc_get_property(hp, pn, "stick-frequency", NULL); |
544 | printk("PLATFORM: stick-frequency [%08lx]\n", *v); | 544 | printk("PLATFORM: stick-frequency [%08llx]\n", *v); |
545 | v = mdesc_get_property(hp, pn, "mac-address", NULL); | 545 | v = mdesc_get_property(hp, pn, "mac-address", NULL); |
546 | if (v) | 546 | if (v) |
547 | printk("PLATFORM: mac-address [%lx]\n", *v); | 547 | printk("PLATFORM: mac-address [%llx]\n", *v); |
548 | v = mdesc_get_property(hp, pn, "watchdog-resolution", NULL); | 548 | v = mdesc_get_property(hp, pn, "watchdog-resolution", NULL); |
549 | if (v) | 549 | if (v) |
550 | printk("PLATFORM: watchdog-resolution [%lu ms]\n", *v); | 550 | printk("PLATFORM: watchdog-resolution [%llu ms]\n", *v); |
551 | v = mdesc_get_property(hp, pn, "watchdog-max-timeout", NULL); | 551 | v = mdesc_get_property(hp, pn, "watchdog-max-timeout", NULL); |
552 | if (v) | 552 | if (v) |
553 | printk("PLATFORM: watchdog-max-timeout [%lu ms]\n", *v); | 553 | printk("PLATFORM: watchdog-max-timeout [%llu ms]\n", *v); |
554 | v = mdesc_get_property(hp, pn, "max-cpus", NULL); | 554 | v = mdesc_get_property(hp, pn, "max-cpus", NULL); |
555 | if (v) | 555 | if (v) |
556 | printk("PLATFORM: max-cpus [%lu]\n", *v); | 556 | printk("PLATFORM: max-cpus [%llu]\n", *v); |
557 | 557 | ||
558 | #ifdef CONFIG_SMP | 558 | #ifdef CONFIG_SMP |
559 | { | 559 | { |
diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c index 4873f28905b0..b4a12c9aa5f8 100644 --- a/arch/sparc/kernel/of_device_64.c +++ b/arch/sparc/kernel/of_device_64.c | |||
@@ -554,7 +554,7 @@ static void __init build_device_resources(struct of_device *op, | |||
554 | memset(r, 0, sizeof(*r)); | 554 | memset(r, 0, sizeof(*r)); |
555 | 555 | ||
556 | if (of_resource_verbose) | 556 | if (of_resource_verbose) |
557 | printk("%s reg[%d] -> %lx\n", | 557 | printk("%s reg[%d] -> %llx\n", |
558 | op->node->full_name, index, | 558 | op->node->full_name, index, |
559 | result); | 559 | result); |
560 | 560 | ||
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index bdb7c0a6d83d..923e9bbb9fe2 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c | |||
@@ -223,7 +223,7 @@ static void pci_parse_of_addrs(struct of_device *op, | |||
223 | continue; | 223 | continue; |
224 | i = addrs[0] & 0xff; | 224 | i = addrs[0] & 0xff; |
225 | if (ofpci_verbose) | 225 | if (ofpci_verbose) |
226 | printk(" start: %lx, end: %lx, i: %x\n", | 226 | printk(" start: %llx, end: %llx, i: %x\n", |
227 | op_res->start, op_res->end, i); | 227 | op_res->start, op_res->end, i); |
228 | 228 | ||
229 | if (PCI_BASE_ADDRESS_0 <= i && i <= PCI_BASE_ADDRESS_5) { | 229 | if (PCI_BASE_ADDRESS_0 <= i && i <= PCI_BASE_ADDRESS_5) { |
diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c index 23b88082d0b2..64e6edf17b9d 100644 --- a/arch/sparc/kernel/pci_common.c +++ b/arch/sparc/kernel/pci_common.c | |||
@@ -457,7 +457,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm) | |||
457 | prom_halt(); | 457 | prom_halt(); |
458 | } | 458 | } |
459 | 459 | ||
460 | printk("%s: PCI IO[%lx] MEM[%lx]\n", | 460 | printk("%s: PCI IO[%llx] MEM[%llx]\n", |
461 | pbm->name, | 461 | pbm->name, |
462 | pbm->io_space.start, | 462 | pbm->io_space.start, |
463 | pbm->mem_space.start); | 463 | pbm->mem_space.start); |
diff --git a/arch/sparc/kernel/pci_msi.c b/arch/sparc/kernel/pci_msi.c index 4ef282e81912..f1be37a7b123 100644 --- a/arch/sparc/kernel/pci_msi.c +++ b/arch/sparc/kernel/pci_msi.c | |||
@@ -426,8 +426,8 @@ void sparc64_pbm_msi_init(struct pci_pbm_info *pbm, | |||
426 | pbm->name, | 426 | pbm->name, |
427 | pbm->msi_first, pbm->msi_num, pbm->msi_data_mask, | 427 | pbm->msi_first, pbm->msi_num, pbm->msi_data_mask, |
428 | pbm->msix_data_width); | 428 | pbm->msix_data_width); |
429 | printk(KERN_INFO "%s: MSI addr32[0x%lx:0x%x] " | 429 | printk(KERN_INFO "%s: MSI addr32[0x%llx:0x%x] " |
430 | "addr64[0x%lx:0x%x]\n", | 430 | "addr64[0x%llx:0x%x]\n", |
431 | pbm->name, | 431 | pbm->name, |
432 | pbm->msi32_start, pbm->msi32_len, | 432 | pbm->msi32_start, pbm->msi32_len, |
433 | pbm->msi64_start, pbm->msi64_len); | 433 | pbm->msi64_start, pbm->msi64_len); |
diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c index 45d9dba1ba11..2b5cdde77af7 100644 --- a/arch/sparc/kernel/pci_schizo.c +++ b/arch/sparc/kernel/pci_schizo.c | |||
@@ -794,7 +794,7 @@ static irqreturn_t schizo_safarierr_intr(int irq, void *dev_id) | |||
794 | pbm->controller_regs + SCHIZO_SAFARI_ERRLOG); | 794 | pbm->controller_regs + SCHIZO_SAFARI_ERRLOG); |
795 | 795 | ||
796 | if (!(errlog & BUS_ERROR_UNMAP)) { | 796 | if (!(errlog & BUS_ERROR_UNMAP)) { |
797 | printk("%s: Unexpected Safari/JBUS error interrupt, errlog[%016lx]\n", | 797 | printk("%s: Unexpected Safari/JBUS error interrupt, errlog[%016llx]\n", |
798 | pbm->name, errlog); | 798 | pbm->name, errlog); |
799 | 799 | ||
800 | return IRQ_HANDLED; | 800 | return IRQ_HANDLED; |
diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 34a1fded3941..0ef0ab3d4763 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c | |||
@@ -73,7 +73,7 @@ static long iommu_batch_flush(struct iommu_batch *p) | |||
73 | if (unlikely(num < 0)) { | 73 | if (unlikely(num < 0)) { |
74 | if (printk_ratelimit()) | 74 | if (printk_ratelimit()) |
75 | printk("iommu_batch_flush: IOMMU map of " | 75 | printk("iommu_batch_flush: IOMMU map of " |
76 | "[%08lx:%08lx:%lx:%lx:%lx] failed with " | 76 | "[%08lx:%08llx:%lx:%lx:%lx] failed with " |
77 | "status %ld\n", | 77 | "status %ld\n", |
78 | devhandle, HV_PCI_TSBID(0, entry), | 78 | devhandle, HV_PCI_TSBID(0, entry), |
79 | npages, prot, __pa(pglist), num); | 79 | npages, prot, __pa(pglist), num); |
diff --git a/arch/sparc/kernel/power.c b/arch/sparc/kernel/power.c index 076cad7f9757..ae88f06a7ec4 100644 --- a/arch/sparc/kernel/power.c +++ b/arch/sparc/kernel/power.c | |||
@@ -40,7 +40,7 @@ static int __devinit power_probe(struct of_device *op, const struct of_device_id | |||
40 | 40 | ||
41 | power_reg = of_ioremap(res, 0, 0x4, "power"); | 41 | power_reg = of_ioremap(res, 0, 0x4, "power"); |
42 | 42 | ||
43 | printk(KERN_INFO "%s: Control reg at %lx\n", | 43 | printk(KERN_INFO "%s: Control reg at %llx\n", |
44 | op->node->name, res->start); | 44 | op->node->name, res->start); |
45 | 45 | ||
46 | if (has_button_interrupt(irq, op->node)) { | 46 | if (has_button_interrupt(irq, op->node)) { |
diff --git a/arch/sparc/kernel/prom_irqtrans.c b/arch/sparc/kernel/prom_irqtrans.c index 96958c4dce8e..5702ad4710cb 100644 --- a/arch/sparc/kernel/prom_irqtrans.c +++ b/arch/sparc/kernel/prom_irqtrans.c | |||
@@ -346,7 +346,7 @@ static void tomatillo_wsync_handler(unsigned int ino, void *_arg1, void *_arg2) | |||
346 | break; | 346 | break; |
347 | } | 347 | } |
348 | if (limit <= 0) { | 348 | if (limit <= 0) { |
349 | printk("tomatillo_wsync_handler: DMA won't sync [%lx:%lx]\n", | 349 | printk("tomatillo_wsync_handler: DMA won't sync [%llx:%llx]\n", |
350 | val, mask); | 350 | val, mask); |
351 | } | 351 | } |
352 | 352 | ||
diff --git a/arch/sparc/kernel/psycho_common.c b/arch/sparc/kernel/psycho_common.c index 790996428c14..40689ae3c9b0 100644 --- a/arch/sparc/kernel/psycho_common.c +++ b/arch/sparc/kernel/psycho_common.c | |||
@@ -94,7 +94,7 @@ static void psycho_check_stc_error(struct pci_pbm_info *pbm) | |||
94 | if (saw_error != 0) { | 94 | if (saw_error != 0) { |
95 | u64 tagval = stc_tag_buf[i]; | 95 | u64 tagval = stc_tag_buf[i]; |
96 | u64 lineval = stc_line_buf[i]; | 96 | u64 lineval = stc_line_buf[i]; |
97 | printk(KERN_ERR "%s: STC_TAG(%d)[PA(%016lx)VA(%08lx)" | 97 | printk(KERN_ERR "%s: STC_TAG(%d)[PA(%016llx)VA(%08llx)" |
98 | "V(%d)W(%d)]\n", | 98 | "V(%d)W(%d)]\n", |
99 | pbm->name, | 99 | pbm->name, |
100 | i, | 100 | i, |
@@ -102,8 +102,8 @@ static void psycho_check_stc_error(struct pci_pbm_info *pbm) | |||
102 | (tagval & PSYCHO_STCTAG_VPN), | 102 | (tagval & PSYCHO_STCTAG_VPN), |
103 | ((tagval & PSYCHO_STCTAG_VALID) ? 1 : 0), | 103 | ((tagval & PSYCHO_STCTAG_VALID) ? 1 : 0), |
104 | ((tagval & PSYCHO_STCTAG_WRITE) ? 1 : 0)); | 104 | ((tagval & PSYCHO_STCTAG_WRITE) ? 1 : 0)); |
105 | printk(KERN_ERR "%s: STC_LINE(%d)[LIDX(%lx)SP(%lx)" | 105 | printk(KERN_ERR "%s: STC_LINE(%d)[LIDX(%llx)SP(%llx)" |
106 | "LADDR(%lx)EP(%lx)V(%d)FOFN(%d)]\n", | 106 | "LADDR(%llx)EP(%llx)V(%d)FOFN(%d)]\n", |
107 | pbm->name, | 107 | pbm->name, |
108 | i, | 108 | i, |
109 | ((lineval & PSYCHO_STCLINE_LINDX) >> 21UL), | 109 | ((lineval & PSYCHO_STCLINE_LINDX) >> 21UL), |
@@ -179,14 +179,14 @@ static void psycho_dump_iommu_tags_and_data(struct pci_pbm_info *pbm, | |||
179 | } | 179 | } |
180 | 180 | ||
181 | printk(KERN_ERR "%s: IOMMU TAG(%d)[error(%s) wr(%d) " | 181 | printk(KERN_ERR "%s: IOMMU TAG(%d)[error(%s) wr(%d) " |
182 | "str(%d) sz(%dK) vpg(%08lx)]\n", | 182 | "str(%d) sz(%dK) vpg(%08llx)]\n", |
183 | pbm->name, i, type_str, | 183 | pbm->name, i, type_str, |
184 | ((tag_val & PSYCHO_IOMMU_TAG_WRITE) ? 1 : 0), | 184 | ((tag_val & PSYCHO_IOMMU_TAG_WRITE) ? 1 : 0), |
185 | ((tag_val & PSYCHO_IOMMU_TAG_STREAM) ? 1 : 0), | 185 | ((tag_val & PSYCHO_IOMMU_TAG_STREAM) ? 1 : 0), |
186 | ((tag_val & PSYCHO_IOMMU_TAG_SIZE) ? 64 : 8), | 186 | ((tag_val & PSYCHO_IOMMU_TAG_SIZE) ? 64 : 8), |
187 | (tag_val & PSYCHO_IOMMU_TAG_VPAGE) << IOMMU_PAGE_SHIFT); | 187 | (tag_val & PSYCHO_IOMMU_TAG_VPAGE) << IOMMU_PAGE_SHIFT); |
188 | printk(KERN_ERR "%s: IOMMU DATA(%d)[valid(%d) cache(%d) " | 188 | printk(KERN_ERR "%s: IOMMU DATA(%d)[valid(%d) cache(%d) " |
189 | "ppg(%016lx)]\n", | 189 | "ppg(%016llx)]\n", |
190 | pbm->name, i, | 190 | pbm->name, i, |
191 | ((data_val & PSYCHO_IOMMU_DATA_VALID) ? 1 : 0), | 191 | ((data_val & PSYCHO_IOMMU_DATA_VALID) ? 1 : 0), |
192 | ((data_val & PSYCHO_IOMMU_DATA_CACHE) ? 1 : 0), | 192 | ((data_val & PSYCHO_IOMMU_DATA_CACHE) ? 1 : 0), |
@@ -326,12 +326,12 @@ irqreturn_t psycho_pcierr_intr(int irq, void *dev_id) | |||
326 | "Excessive Retries" : | 326 | "Excessive Retries" : |
327 | ((error_bits & PSYCHO_PCIAFSR_PPERR) ? | 327 | ((error_bits & PSYCHO_PCIAFSR_PPERR) ? |
328 | "Parity Error" : "???")))))); | 328 | "Parity Error" : "???")))))); |
329 | printk(KERN_ERR "%s: bytemask[%04lx] UPA_MID[%02lx] was_block(%d)\n", | 329 | printk(KERN_ERR "%s: bytemask[%04llx] UPA_MID[%02llx] was_block(%d)\n", |
330 | pbm->name, | 330 | pbm->name, |
331 | (afsr & PSYCHO_PCIAFSR_BMSK) >> 32UL, | 331 | (afsr & PSYCHO_PCIAFSR_BMSK) >> 32UL, |
332 | (afsr & PSYCHO_PCIAFSR_MID) >> 25UL, | 332 | (afsr & PSYCHO_PCIAFSR_MID) >> 25UL, |
333 | (afsr & PSYCHO_PCIAFSR_BLK) ? 1 : 0); | 333 | (afsr & PSYCHO_PCIAFSR_BLK) ? 1 : 0); |
334 | printk(KERN_ERR "%s: PCI AFAR [%016lx]\n", pbm->name, afar); | 334 | printk(KERN_ERR "%s: PCI AFAR [%016llx]\n", pbm->name, afar); |
335 | printk(KERN_ERR "%s: PCI Secondary errors [", pbm->name); | 335 | printk(KERN_ERR "%s: PCI Secondary errors [", pbm->name); |
336 | reported = 0; | 336 | reported = 0; |
337 | if (afsr & PSYCHO_PCIAFSR_SMA) { | 337 | if (afsr & PSYCHO_PCIAFSR_SMA) { |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index 46329799f346..6cd1a5b65067 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
@@ -449,7 +449,7 @@ again: | |||
449 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" | 449 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" |
450 | : : "r" (pstate)); | 450 | : : "r" (pstate)); |
451 | if (stuck == 0) { | 451 | if (stuck == 0) { |
452 | printk("CPU[%d]: mondo stuckage result[%016lx]\n", | 452 | printk("CPU[%d]: mondo stuckage result[%016llx]\n", |
453 | smp_processor_id(), result); | 453 | smp_processor_id(), result); |
454 | } else { | 454 | } else { |
455 | udelay(2); | 455 | udelay(2); |
@@ -584,7 +584,7 @@ retry: | |||
584 | /* Busy bits will not clear, continue instead | 584 | /* Busy bits will not clear, continue instead |
585 | * of freezing up on this cpu. | 585 | * of freezing up on this cpu. |
586 | */ | 586 | */ |
587 | printk("CPU[%d]: mondo stuckage result[%016lx]\n", | 587 | printk("CPU[%d]: mondo stuckage result[%016llx]\n", |
588 | smp_processor_id(), dispatch_stat); | 588 | smp_processor_id(), dispatch_stat); |
589 | } else { | 589 | } else { |
590 | int i, this_busy_nack = 0; | 590 | int i, this_busy_nack = 0; |
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 4f8d60586b07..8040376c4890 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c | |||
@@ -54,7 +54,8 @@ extern int __smp4m_processor_id(void); | |||
54 | #define SMP_PRINTK(x) | 54 | #define SMP_PRINTK(x) |
55 | #endif | 55 | #endif |
56 | 56 | ||
57 | static inline unsigned long swap(volatile unsigned long *ptr, unsigned long val) | 57 | static inline unsigned long |
58 | swap_ulong(volatile unsigned long *ptr, unsigned long val) | ||
58 | { | 59 | { |
59 | __asm__ __volatile__("swap [%1], %0\n\t" : | 60 | __asm__ __volatile__("swap [%1], %0\n\t" : |
60 | "=&r" (val), "=&r" (ptr) : | 61 | "=&r" (val), "=&r" (ptr) : |
@@ -90,7 +91,7 @@ void __cpuinit smp4m_callin(void) | |||
90 | * to call the scheduler code. | 91 | * to call the scheduler code. |
91 | */ | 92 | */ |
92 | /* Allow master to continue. */ | 93 | /* Allow master to continue. */ |
93 | swap(&cpu_callin_map[cpuid], 1); | 94 | swap_ulong(&cpu_callin_map[cpuid], 1); |
94 | 95 | ||
95 | /* XXX: What's up with all the flushes? */ | 96 | /* XXX: What's up with all the flushes? */ |
96 | local_flush_cache_all(); | 97 | local_flush_cache_all(); |
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 9df8f095a8b1..54405d362148 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c | |||
@@ -106,7 +106,7 @@ static void tick_init_tick(void) | |||
106 | tick_disable_irq(); | 106 | tick_disable_irq(); |
107 | } | 107 | } |
108 | 108 | ||
109 | static unsigned long tick_get_tick(void) | 109 | static unsigned long long tick_get_tick(void) |
110 | { | 110 | { |
111 | unsigned long ret; | 111 | unsigned long ret; |
112 | 112 | ||
@@ -208,7 +208,7 @@ static void stick_init_tick(void) | |||
208 | stick_disable_irq(); | 208 | stick_disable_irq(); |
209 | } | 209 | } |
210 | 210 | ||
211 | static unsigned long stick_get_tick(void) | 211 | static unsigned long long stick_get_tick(void) |
212 | { | 212 | { |
213 | unsigned long ret; | 213 | unsigned long ret; |
214 | 214 | ||
@@ -352,7 +352,7 @@ static void hbtick_init_tick(void) | |||
352 | hbtick_disable_irq(); | 352 | hbtick_disable_irq(); |
353 | } | 353 | } |
354 | 354 | ||
355 | static unsigned long hbtick_get_tick(void) | 355 | static unsigned long long hbtick_get_tick(void) |
356 | { | 356 | { |
357 | return __hbird_read_stick() & ~TICK_PRIV_BIT; | 357 | return __hbird_read_stick() & ~TICK_PRIV_BIT; |
358 | } | 358 | } |
@@ -422,7 +422,7 @@ static int __devinit rtc_probe(struct of_device *op, const struct of_device_id * | |||
422 | { | 422 | { |
423 | struct resource *r; | 423 | struct resource *r; |
424 | 424 | ||
425 | printk(KERN_INFO "%s: RTC regs at 0x%lx\n", | 425 | printk(KERN_INFO "%s: RTC regs at 0x%llx\n", |
426 | op->node->full_name, op->resource[0].start); | 426 | op->node->full_name, op->resource[0].start); |
427 | 427 | ||
428 | /* The CMOS RTC driver only accepts IORESOURCE_IO, so cons | 428 | /* The CMOS RTC driver only accepts IORESOURCE_IO, so cons |
@@ -478,7 +478,7 @@ static struct platform_device rtc_bq4802_device = { | |||
478 | static int __devinit bq4802_probe(struct of_device *op, const struct of_device_id *match) | 478 | static int __devinit bq4802_probe(struct of_device *op, const struct of_device_id *match) |
479 | { | 479 | { |
480 | 480 | ||
481 | printk(KERN_INFO "%s: BQ4802 regs at 0x%lx\n", | 481 | printk(KERN_INFO "%s: BQ4802 regs at 0x%llx\n", |
482 | op->node->full_name, op->resource[0].start); | 482 | op->node->full_name, op->resource[0].start); |
483 | 483 | ||
484 | rtc_bq4802_device.resource = &op->resource[0]; | 484 | rtc_bq4802_device.resource = &op->resource[0]; |
@@ -542,7 +542,7 @@ static int __devinit mostek_probe(struct of_device *op, const struct of_device_i | |||
542 | strcmp(dp->parent->parent->name, "central") != 0) | 542 | strcmp(dp->parent->parent->name, "central") != 0) |
543 | return -ENODEV; | 543 | return -ENODEV; |
544 | 544 | ||
545 | printk(KERN_INFO "%s: Mostek regs at 0x%lx\n", | 545 | printk(KERN_INFO "%s: Mostek regs at 0x%llx\n", |
546 | dp->full_name, op->resource[0].start); | 546 | dp->full_name, op->resource[0].start); |
547 | 547 | ||
548 | m48t59_rtc.resource = &op->resource[0]; | 548 | m48t59_rtc.resource = &op->resource[0]; |
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index 4638af2f55a0..bca3b4e09c41 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
@@ -1168,20 +1168,20 @@ static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *in | |||
1168 | } | 1168 | } |
1169 | 1169 | ||
1170 | /* Now dump the cache snapshots. */ | 1170 | /* Now dump the cache snapshots. */ |
1171 | printk("%s" "ERROR(%d): D-cache idx[%x] tag[%016lx] utag[%016lx] stag[%016lx]\n", | 1171 | printk("%s" "ERROR(%d): D-cache idx[%x] tag[%016llx] utag[%016llx] stag[%016llx]\n", |
1172 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1172 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1173 | (int) info->dcache_index, | 1173 | (int) info->dcache_index, |
1174 | info->dcache_tag, | 1174 | info->dcache_tag, |
1175 | info->dcache_utag, | 1175 | info->dcache_utag, |
1176 | info->dcache_stag); | 1176 | info->dcache_stag); |
1177 | printk("%s" "ERROR(%d): D-cache data0[%016lx] data1[%016lx] data2[%016lx] data3[%016lx]\n", | 1177 | printk("%s" "ERROR(%d): D-cache data0[%016llx] data1[%016llx] data2[%016llx] data3[%016llx]\n", |
1178 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1178 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1179 | info->dcache_data[0], | 1179 | info->dcache_data[0], |
1180 | info->dcache_data[1], | 1180 | info->dcache_data[1], |
1181 | info->dcache_data[2], | 1181 | info->dcache_data[2], |
1182 | info->dcache_data[3]); | 1182 | info->dcache_data[3]); |
1183 | printk("%s" "ERROR(%d): I-cache idx[%x] tag[%016lx] utag[%016lx] stag[%016lx] " | 1183 | printk("%s" "ERROR(%d): I-cache idx[%x] tag[%016llx] utag[%016llx] stag[%016llx] " |
1184 | "u[%016lx] l[%016lx]\n", | 1184 | "u[%016llx] l[%016llx]\n", |
1185 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1185 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1186 | (int) info->icache_index, | 1186 | (int) info->icache_index, |
1187 | info->icache_tag, | 1187 | info->icache_tag, |
@@ -1189,22 +1189,22 @@ static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *in | |||
1189 | info->icache_stag, | 1189 | info->icache_stag, |
1190 | info->icache_upper, | 1190 | info->icache_upper, |
1191 | info->icache_lower); | 1191 | info->icache_lower); |
1192 | printk("%s" "ERROR(%d): I-cache INSN0[%016lx] INSN1[%016lx] INSN2[%016lx] INSN3[%016lx]\n", | 1192 | printk("%s" "ERROR(%d): I-cache INSN0[%016llx] INSN1[%016llx] INSN2[%016llx] INSN3[%016llx]\n", |
1193 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1193 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1194 | info->icache_data[0], | 1194 | info->icache_data[0], |
1195 | info->icache_data[1], | 1195 | info->icache_data[1], |
1196 | info->icache_data[2], | 1196 | info->icache_data[2], |
1197 | info->icache_data[3]); | 1197 | info->icache_data[3]); |
1198 | printk("%s" "ERROR(%d): I-cache INSN4[%016lx] INSN5[%016lx] INSN6[%016lx] INSN7[%016lx]\n", | 1198 | printk("%s" "ERROR(%d): I-cache INSN4[%016llx] INSN5[%016llx] INSN6[%016llx] INSN7[%016llx]\n", |
1199 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1199 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1200 | info->icache_data[4], | 1200 | info->icache_data[4], |
1201 | info->icache_data[5], | 1201 | info->icache_data[5], |
1202 | info->icache_data[6], | 1202 | info->icache_data[6], |
1203 | info->icache_data[7]); | 1203 | info->icache_data[7]); |
1204 | printk("%s" "ERROR(%d): E-cache idx[%x] tag[%016lx]\n", | 1204 | printk("%s" "ERROR(%d): E-cache idx[%x] tag[%016llx]\n", |
1205 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1205 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1206 | (int) info->ecache_index, info->ecache_tag); | 1206 | (int) info->ecache_index, info->ecache_tag); |
1207 | printk("%s" "ERROR(%d): E-cache data0[%016lx] data1[%016lx] data2[%016lx] data3[%016lx]\n", | 1207 | printk("%s" "ERROR(%d): E-cache data0[%016llx] data1[%016llx] data2[%016llx] data3[%016llx]\n", |
1208 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1208 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1209 | info->ecache_data[0], | 1209 | info->ecache_data[0], |
1210 | info->ecache_data[1], | 1210 | info->ecache_data[1], |
@@ -1794,7 +1794,7 @@ static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, | |||
1794 | int cnt; | 1794 | int cnt; |
1795 | 1795 | ||
1796 | printk("%s: Reporting on cpu %d\n", pfx, cpu); | 1796 | printk("%s: Reporting on cpu %d\n", pfx, cpu); |
1797 | printk("%s: err_handle[%lx] err_stick[%lx] err_type[%08x:%s]\n", | 1797 | printk("%s: err_handle[%llx] err_stick[%llx] err_type[%08x:%s]\n", |
1798 | pfx, | 1798 | pfx, |
1799 | ent->err_handle, ent->err_stick, | 1799 | ent->err_handle, ent->err_stick, |
1800 | ent->err_type, | 1800 | ent->err_type, |
@@ -1818,7 +1818,7 @@ static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, | |||
1818 | "privileged" : ""), | 1818 | "privileged" : ""), |
1819 | ((ent->err_attrs & SUN4V_ERR_ATTRS_RES_QUEUE_FULL) ? | 1819 | ((ent->err_attrs & SUN4V_ERR_ATTRS_RES_QUEUE_FULL) ? |
1820 | "queue-full" : "")); | 1820 | "queue-full" : "")); |
1821 | printk("%s: err_raddr[%016lx] err_size[%u] err_cpu[%u]\n", | 1821 | printk("%s: err_raddr[%016llx] err_size[%u] err_cpu[%u]\n", |
1822 | pfx, | 1822 | pfx, |
1823 | ent->err_raddr, ent->err_size, ent->err_cpu); | 1823 | ent->err_raddr, ent->err_size, ent->err_cpu); |
1824 | 1824 | ||
diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index 203ddfad9f27..f164d5a850f9 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c | |||
@@ -601,11 +601,15 @@ void handle_lddfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr | |||
601 | pc = (u32)pc; | 601 | pc = (u32)pc; |
602 | if (get_user(insn, (u32 __user *) pc) != -EFAULT) { | 602 | if (get_user(insn, (u32 __user *) pc) != -EFAULT) { |
603 | int asi = decode_asi(insn, regs); | 603 | int asi = decode_asi(insn, regs); |
604 | int err; | ||
605 | |||
604 | if ((asi > ASI_SNFL) || | 606 | if ((asi > ASI_SNFL) || |
605 | (asi < ASI_P)) | 607 | (asi < ASI_P)) |
606 | goto daex; | 608 | goto daex; |
607 | if (get_user(first, (u32 __user *)sfar) || | 609 | err = get_user(first, (u32 __user *)sfar); |
608 | get_user(second, (u32 __user *)(sfar + 4))) { | 610 | if (!err) |
611 | err = get_user(second, (u32 __user *)(sfar + 4)); | ||
612 | if (err) { | ||
609 | if (asi & 0x2) /* NF */ { | 613 | if (asi & 0x2) /* NF */ { |
610 | first = 0; second = 0; | 614 | first = 0; second = 0; |
611 | } else | 615 | } else |
diff --git a/arch/sparc/kernel/vio.c b/arch/sparc/kernel/vio.c index 92b1f8ec01de..753d128ed158 100644 --- a/arch/sparc/kernel/vio.c +++ b/arch/sparc/kernel/vio.c | |||
@@ -263,10 +263,10 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, | |||
263 | dev_set_name(&vdev->dev, "%s", bus_id_name); | 263 | dev_set_name(&vdev->dev, "%s", bus_id_name); |
264 | vdev->dev_no = ~(u64)0; | 264 | vdev->dev_no = ~(u64)0; |
265 | } else if (!cfg_handle) { | 265 | } else if (!cfg_handle) { |
266 | dev_set_name(&vdev->dev, "%s-%lu", bus_id_name, *id); | 266 | dev_set_name(&vdev->dev, "%s-%llu", bus_id_name, *id); |
267 | vdev->dev_no = *id; | 267 | vdev->dev_no = *id; |
268 | } else { | 268 | } else { |
269 | dev_set_name(&vdev->dev, "%s-%lu-%lu", bus_id_name, | 269 | dev_set_name(&vdev->dev, "%s-%llu-%llu", bus_id_name, |
270 | *cfg_handle, *id); | 270 | *cfg_handle, *id); |
271 | vdev->dev_no = *cfg_handle; | 271 | vdev->dev_no = *cfg_handle; |
272 | } | 272 | } |
diff --git a/arch/sparc/kernel/viohs.c b/arch/sparc/kernel/viohs.c index 708fa1705fbe..aa6ac70d4fd5 100644 --- a/arch/sparc/kernel/viohs.c +++ b/arch/sparc/kernel/viohs.c | |||
@@ -337,8 +337,10 @@ static int process_ver_nack(struct vio_driver_state *vio, | |||
337 | viodbg(HS, "GOT VERSION NACK maj[%u] min[%u] devclass[%u]\n", | 337 | viodbg(HS, "GOT VERSION NACK maj[%u] min[%u] devclass[%u]\n", |
338 | pkt->major, pkt->minor, pkt->dev_class); | 338 | pkt->major, pkt->minor, pkt->dev_class); |
339 | 339 | ||
340 | if ((pkt->major == 0 && pkt->minor == 0) || | 340 | if (pkt->major == 0 && pkt->minor == 0) |
341 | !(nver = find_by_major(vio, pkt->major))) | 341 | return handshake_failure(vio); |
342 | nver = find_by_major(vio, pkt->major); | ||
343 | if (!nver) | ||
342 | return handshake_failure(vio); | 344 | return handshake_failure(vio); |
343 | 345 | ||
344 | if (send_version(vio, nver->major, nver->minor) < 0) | 346 | if (send_version(vio, nver->major, nver->minor) < 0) |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index a507e1174662..12e447fc8542 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
@@ -283,7 +283,8 @@ bad_area_nosemaphore: | |||
283 | /* Is this in ex_table? */ | 283 | /* Is this in ex_table? */ |
284 | no_context: | 284 | no_context: |
285 | g2 = regs->u_regs[UREG_G2]; | 285 | g2 = regs->u_regs[UREG_G2]; |
286 | if (!from_user && (fixup = search_extables_range(regs->pc, &g2))) { | 286 | if (!from_user) { |
287 | fixup = search_extables_range(regs->pc, &g2); | ||
287 | if (fixup > 10) { /* Values below are reserved for other things */ | 288 | if (fixup > 10) { /* Values below are reserved for other things */ |
288 | extern const unsigned __memset_start[]; | 289 | extern const unsigned __memset_start[]; |
289 | extern const unsigned __memset_end[]; | 290 | extern const unsigned __memset_end[]; |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 6ea73da29312..c77c7ef5d5d4 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -258,21 +258,16 @@ static inline void tsb_insert(struct tsb *ent, unsigned long tag, unsigned long | |||
258 | unsigned long _PAGE_ALL_SZ_BITS __read_mostly; | 258 | unsigned long _PAGE_ALL_SZ_BITS __read_mostly; |
259 | unsigned long _PAGE_SZBITS __read_mostly; | 259 | unsigned long _PAGE_SZBITS __read_mostly; |
260 | 260 | ||
261 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | 261 | static void flush_dcache(unsigned long pfn) |
262 | { | 262 | { |
263 | struct mm_struct *mm; | 263 | struct page *page; |
264 | struct tsb *tsb; | ||
265 | unsigned long tag, flags; | ||
266 | unsigned long tsb_index, tsb_hash_shift; | ||
267 | 264 | ||
268 | if (tlb_type != hypervisor) { | 265 | page = pfn_to_page(pfn); |
269 | unsigned long pfn = pte_pfn(pte); | 266 | if (page && page_mapping(page)) { |
270 | unsigned long pg_flags; | 267 | unsigned long pg_flags; |
271 | struct page *page; | ||
272 | 268 | ||
273 | if (pfn_valid(pfn) && | 269 | pg_flags = page->flags; |
274 | (page = pfn_to_page(pfn), page_mapping(page)) && | 270 | if (pg_flags & (1UL << PG_dcache_dirty)) { |
275 | ((pg_flags = page->flags) & (1UL << PG_dcache_dirty))) { | ||
276 | int cpu = ((pg_flags >> PG_dcache_cpu_shift) & | 271 | int cpu = ((pg_flags >> PG_dcache_cpu_shift) & |
277 | PG_dcache_cpu_mask); | 272 | PG_dcache_cpu_mask); |
278 | int this_cpu = get_cpu(); | 273 | int this_cpu = get_cpu(); |
@@ -290,6 +285,21 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p | |||
290 | put_cpu(); | 285 | put_cpu(); |
291 | } | 286 | } |
292 | } | 287 | } |
288 | } | ||
289 | |||
290 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | ||
291 | { | ||
292 | struct mm_struct *mm; | ||
293 | struct tsb *tsb; | ||
294 | unsigned long tag, flags; | ||
295 | unsigned long tsb_index, tsb_hash_shift; | ||
296 | |||
297 | if (tlb_type != hypervisor) { | ||
298 | unsigned long pfn = pte_pfn(pte); | ||
299 | |||
300 | if (pfn_valid(pfn)) | ||
301 | flush_dcache(pfn); | ||
302 | } | ||
293 | 303 | ||
294 | mm = vma->vm_mm; | 304 | mm = vma->vm_mm; |
295 | 305 | ||
@@ -769,8 +779,8 @@ static int find_node(unsigned long addr) | |||
769 | return -1; | 779 | return -1; |
770 | } | 780 | } |
771 | 781 | ||
772 | static unsigned long nid_range(unsigned long start, unsigned long end, | 782 | static unsigned long long nid_range(unsigned long long start, |
773 | int *nid) | 783 | unsigned long long end, int *nid) |
774 | { | 784 | { |
775 | *nid = find_node(start); | 785 | *nid = find_node(start); |
776 | start += PAGE_SIZE; | 786 | start += PAGE_SIZE; |
@@ -788,8 +798,8 @@ static unsigned long nid_range(unsigned long start, unsigned long end, | |||
788 | return start; | 798 | return start; |
789 | } | 799 | } |
790 | #else | 800 | #else |
791 | static unsigned long nid_range(unsigned long start, unsigned long end, | 801 | static unsigned long long nid_range(unsigned long long start, |
792 | int *nid) | 802 | unsigned long long end, int *nid) |
793 | { | 803 | { |
794 | *nid = 0; | 804 | *nid = 0; |
795 | return end; | 805 | return end; |
@@ -1016,8 +1026,8 @@ static int __init grab_mlgroups(struct mdesc_handle *md) | |||
1016 | val = mdesc_get_property(md, node, "address-mask", NULL); | 1026 | val = mdesc_get_property(md, node, "address-mask", NULL); |
1017 | m->mask = *val; | 1027 | m->mask = *val; |
1018 | 1028 | ||
1019 | numadbg("MLGROUP[%d]: node[%lx] latency[%lx] " | 1029 | numadbg("MLGROUP[%d]: node[%llx] latency[%llx] " |
1020 | "match[%lx] mask[%lx]\n", | 1030 | "match[%llx] mask[%llx]\n", |
1021 | count - 1, m->node, m->latency, m->match, m->mask); | 1031 | count - 1, m->node, m->latency, m->match, m->mask); |
1022 | } | 1032 | } |
1023 | 1033 | ||
@@ -1056,7 +1066,7 @@ static int __init grab_mblocks(struct mdesc_handle *md) | |||
1056 | "address-congruence-offset", NULL); | 1066 | "address-congruence-offset", NULL); |
1057 | m->offset = *val; | 1067 | m->offset = *val; |
1058 | 1068 | ||
1059 | numadbg("MBLOCK[%d]: base[%lx] size[%lx] offset[%lx]\n", | 1069 | numadbg("MBLOCK[%d]: base[%llx] size[%llx] offset[%llx]\n", |
1060 | count - 1, m->base, m->size, m->offset); | 1070 | count - 1, m->base, m->size, m->offset); |
1061 | } | 1071 | } |
1062 | 1072 | ||
@@ -1127,7 +1137,7 @@ static int __init numa_attach_mlgroup(struct mdesc_handle *md, u64 grp, | |||
1127 | n->mask = candidate->mask; | 1137 | n->mask = candidate->mask; |
1128 | n->val = candidate->match; | 1138 | n->val = candidate->match; |
1129 | 1139 | ||
1130 | numadbg("NUMA NODE[%d]: mask[%lx] val[%lx] (latency[%lx])\n", | 1140 | numadbg("NUMA NODE[%d]: mask[%lx] val[%lx] (latency[%llx])\n", |
1131 | index, n->mask, n->val, candidate->latency); | 1141 | index, n->mask, n->val, candidate->latency); |
1132 | 1142 | ||
1133 | return 0; | 1143 | return 0; |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 862adb9bf0d4..73f7fe8fd4d1 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -27,6 +27,7 @@ config X86 | |||
27 | select HAVE_IOREMAP_PROT | 27 | select HAVE_IOREMAP_PROT |
28 | select HAVE_KPROBES | 28 | select HAVE_KPROBES |
29 | select ARCH_WANT_OPTIONAL_GPIOLIB | 29 | select ARCH_WANT_OPTIONAL_GPIOLIB |
30 | select ARCH_WANT_FRAME_POINTERS | ||
30 | select HAVE_KRETPROBES | 31 | select HAVE_KRETPROBES |
31 | select HAVE_FTRACE_MCOUNT_RECORD | 32 | select HAVE_FTRACE_MCOUNT_RECORD |
32 | select HAVE_DYNAMIC_FTRACE | 33 | select HAVE_DYNAMIC_FTRACE |
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 9fa9dcdf344b..e02a359d2aa5 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h | |||
@@ -300,7 +300,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) | |||
300 | return oldbit; | 300 | return oldbit; |
301 | } | 301 | } |
302 | 302 | ||
303 | static inline int constant_test_bit(int nr, const volatile unsigned long *addr) | 303 | static inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) |
304 | { | 304 | { |
305 | return ((1UL << (nr % BITS_PER_LONG)) & | 305 | return ((1UL << (nr % BITS_PER_LONG)) & |
306 | (((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; | 306 | (((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; |
diff --git a/arch/x86/include/asm/es7000/apic.h b/arch/x86/include/asm/es7000/apic.h index bc53d5ef1386..c58b9cc74465 100644 --- a/arch/x86/include/asm/es7000/apic.h +++ b/arch/x86/include/asm/es7000/apic.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __ASM_ES7000_APIC_H | 1 | #ifndef __ASM_ES7000_APIC_H |
2 | #define __ASM_ES7000_APIC_H | 2 | #define __ASM_ES7000_APIC_H |
3 | 3 | ||
4 | #include <linux/gfp.h> | ||
5 | |||
4 | #define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu) | 6 | #define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu) |
5 | #define esr_disable (1) | 7 | #define esr_disable (1) |
6 | 8 | ||
diff --git a/arch/x86/include/asm/es7000/mpparse.h b/arch/x86/include/asm/es7000/mpparse.h index ed5a3caae141..c1629b090ec2 100644 --- a/arch/x86/include/asm/es7000/mpparse.h +++ b/arch/x86/include/asm/es7000/mpparse.h | |||
@@ -10,8 +10,7 @@ extern void setup_unisys(void); | |||
10 | 10 | ||
11 | #ifndef CONFIG_X86_GENERICARCH | 11 | #ifndef CONFIG_X86_GENERICARCH |
12 | extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id); | 12 | extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id); |
13 | extern int mps_oem_check(struct mp_config_table *mpc, char *oem, | 13 | extern int mps_oem_check(struct mpc_table *mpc, char *oem, char *productid); |
14 | char *productid); | ||
15 | #endif | 14 | #endif |
16 | 15 | ||
17 | #ifdef CONFIG_ACPI | 16 | #ifdef CONFIG_ACPI |
diff --git a/arch/x86/include/asm/genapic_32.h b/arch/x86/include/asm/genapic_32.h index 746f37a7963a..2c05b737ee22 100644 --- a/arch/x86/include/asm/genapic_32.h +++ b/arch/x86/include/asm/genapic_32.h | |||
@@ -15,9 +15,9 @@ | |||
15 | * Copyright 2003 Andi Kleen, SuSE Labs. | 15 | * Copyright 2003 Andi Kleen, SuSE Labs. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | struct mpc_config_bus; | 18 | struct mpc_bus; |
19 | struct mp_config_table; | 19 | struct mpc_table; |
20 | struct mpc_config_processor; | 20 | struct mpc_cpu; |
21 | 21 | ||
22 | struct genapic { | 22 | struct genapic { |
23 | char *name; | 23 | char *name; |
@@ -51,7 +51,7 @@ struct genapic { | |||
51 | /* When one of the next two hooks returns 1 the genapic | 51 | /* When one of the next two hooks returns 1 the genapic |
52 | is switched to this. Essentially they are additional probe | 52 | is switched to this. Essentially they are additional probe |
53 | functions. */ | 53 | functions. */ |
54 | int (*mps_oem_check)(struct mp_config_table *mpc, char *oem, | 54 | int (*mps_oem_check)(struct mpc_table *mpc, char *oem, |
55 | char *productid); | 55 | char *productid); |
56 | int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id); | 56 | int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id); |
57 | 57 | ||
diff --git a/arch/x86/include/asm/mach-default/mach_mpparse.h b/arch/x86/include/asm/mach-default/mach_mpparse.h index 8c1ea21238a7..c70a263d68cd 100644 --- a/arch/x86/include/asm/mach-default/mach_mpparse.h +++ b/arch/x86/include/asm/mach-default/mach_mpparse.h | |||
@@ -1,8 +1,8 @@ | |||
1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H | 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H |
2 | #define _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H | 2 | #define _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H |
3 | 3 | ||
4 | static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, | 4 | static inline int |
5 | char *productid) | 5 | mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) |
6 | { | 6 | { |
7 | return 0; | 7 | return 0; |
8 | } | 8 | } |
diff --git a/arch/x86/include/asm/mach-generic/mach_mpparse.h b/arch/x86/include/asm/mach-generic/mach_mpparse.h index 048f1d468535..9444ab8dca94 100644 --- a/arch/x86/include/asm/mach-generic/mach_mpparse.h +++ b/arch/x86/include/asm/mach-generic/mach_mpparse.h | |||
@@ -2,9 +2,8 @@ | |||
2 | #define _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H | 2 | #define _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H |
3 | 3 | ||
4 | 4 | ||
5 | extern int mps_oem_check(struct mp_config_table *mpc, char *oem, | 5 | extern int mps_oem_check(struct mpc_table *, char *, char *); |
6 | char *productid); | ||
7 | 6 | ||
8 | extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id); | 7 | extern int acpi_madt_oem_check(char *, char *); |
9 | 8 | ||
10 | #endif /* _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H */ | 9 | #endif /* _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H */ |
diff --git a/arch/x86/include/asm/mach-generic/mach_mpspec.h b/arch/x86/include/asm/mach-generic/mach_mpspec.h index bbab5ccfd4fe..3bc407226578 100644 --- a/arch/x86/include/asm/mach-generic/mach_mpspec.h +++ b/arch/x86/include/asm/mach-generic/mach_mpspec.h | |||
@@ -7,6 +7,6 @@ | |||
7 | /* Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. */ | 7 | /* Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. */ |
8 | #define MAX_MP_BUSSES 260 | 8 | #define MAX_MP_BUSSES 260 |
9 | 9 | ||
10 | extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 10 | extern void numaq_mps_oem_check(struct mpc_table *, char *, char *); |
11 | char *productid); | 11 | |
12 | #endif /* _ASM_X86_MACH_GENERIC_MACH_MPSPEC_H */ | 12 | #endif /* _ASM_X86_MACH_GENERIC_MACH_MPSPEC_H */ |
diff --git a/arch/x86/include/asm/mpspec_def.h b/arch/x86/include/asm/mpspec_def.h index e3ace7d1d35d..59568bc4767f 100644 --- a/arch/x86/include/asm/mpspec_def.h +++ b/arch/x86/include/asm/mpspec_def.h | |||
@@ -39,17 +39,17 @@ struct intel_mp_floating { | |||
39 | 39 | ||
40 | #define MPC_SIGNATURE "PCMP" | 40 | #define MPC_SIGNATURE "PCMP" |
41 | 41 | ||
42 | struct mp_config_table { | 42 | struct mpc_table { |
43 | char mpc_signature[4]; | 43 | char signature[4]; |
44 | unsigned short mpc_length; /* Size of table */ | 44 | unsigned short length; /* Size of table */ |
45 | char mpc_spec; /* 0x01 */ | 45 | char spec; /* 0x01 */ |
46 | char mpc_checksum; | 46 | char checksum; |
47 | char mpc_oem[8]; | 47 | char oem[8]; |
48 | char mpc_productid[12]; | 48 | char productid[12]; |
49 | unsigned int mpc_oemptr; /* 0 if not present */ | 49 | unsigned int oemptr; /* 0 if not present */ |
50 | unsigned short mpc_oemsize; /* 0 if not present */ | 50 | unsigned short oemsize; /* 0 if not present */ |
51 | unsigned short mpc_oemcount; | 51 | unsigned short oemcount; |
52 | unsigned int mpc_lapic; /* APIC address */ | 52 | unsigned int lapic; /* APIC address */ |
53 | unsigned int reserved; | 53 | unsigned int reserved; |
54 | }; | 54 | }; |
55 | 55 | ||
@@ -70,20 +70,20 @@ struct mp_config_table { | |||
70 | #define CPU_MODEL_MASK 0x00F0 | 70 | #define CPU_MODEL_MASK 0x00F0 |
71 | #define CPU_FAMILY_MASK 0x0F00 | 71 | #define CPU_FAMILY_MASK 0x0F00 |
72 | 72 | ||
73 | struct mpc_config_processor { | 73 | struct mpc_cpu { |
74 | unsigned char mpc_type; | 74 | unsigned char type; |
75 | unsigned char mpc_apicid; /* Local APIC number */ | 75 | unsigned char apicid; /* Local APIC number */ |
76 | unsigned char mpc_apicver; /* Its versions */ | 76 | unsigned char apicver; /* Its versions */ |
77 | unsigned char mpc_cpuflag; | 77 | unsigned char cpuflag; |
78 | unsigned int mpc_cpufeature; | 78 | unsigned int cpufeature; |
79 | unsigned int mpc_featureflag; /* CPUID feature value */ | 79 | unsigned int featureflag; /* CPUID feature value */ |
80 | unsigned int mpc_reserved[2]; | 80 | unsigned int reserved[2]; |
81 | }; | 81 | }; |
82 | 82 | ||
83 | struct mpc_config_bus { | 83 | struct mpc_bus { |
84 | unsigned char mpc_type; | 84 | unsigned char type; |
85 | unsigned char mpc_busid; | 85 | unsigned char busid; |
86 | unsigned char mpc_bustype[6]; | 86 | unsigned char bustype[6]; |
87 | }; | 87 | }; |
88 | 88 | ||
89 | /* List of Bus Type string values, Intel MP Spec. */ | 89 | /* List of Bus Type string values, Intel MP Spec. */ |
@@ -108,22 +108,22 @@ struct mpc_config_bus { | |||
108 | 108 | ||
109 | #define MPC_APIC_USABLE 0x01 | 109 | #define MPC_APIC_USABLE 0x01 |
110 | 110 | ||
111 | struct mpc_config_ioapic { | 111 | struct mpc_ioapic { |
112 | unsigned char mpc_type; | 112 | unsigned char type; |
113 | unsigned char mpc_apicid; | 113 | unsigned char apicid; |
114 | unsigned char mpc_apicver; | 114 | unsigned char apicver; |
115 | unsigned char mpc_flags; | 115 | unsigned char flags; |
116 | unsigned int mpc_apicaddr; | 116 | unsigned int apicaddr; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | struct mpc_config_intsrc { | 119 | struct mpc_intsrc { |
120 | unsigned char mpc_type; | 120 | unsigned char type; |
121 | unsigned char mpc_irqtype; | 121 | unsigned char irqtype; |
122 | unsigned short mpc_irqflag; | 122 | unsigned short irqflag; |
123 | unsigned char mpc_srcbus; | 123 | unsigned char srcbus; |
124 | unsigned char mpc_srcbusirq; | 124 | unsigned char srcbusirq; |
125 | unsigned char mpc_dstapic; | 125 | unsigned char dstapic; |
126 | unsigned char mpc_dstirq; | 126 | unsigned char dstirq; |
127 | }; | 127 | }; |
128 | 128 | ||
129 | enum mp_irq_source_types { | 129 | enum mp_irq_source_types { |
@@ -139,24 +139,24 @@ enum mp_irq_source_types { | |||
139 | 139 | ||
140 | #define MP_APIC_ALL 0xFF | 140 | #define MP_APIC_ALL 0xFF |
141 | 141 | ||
142 | struct mpc_config_lintsrc { | 142 | struct mpc_lintsrc { |
143 | unsigned char mpc_type; | 143 | unsigned char type; |
144 | unsigned char mpc_irqtype; | 144 | unsigned char irqtype; |
145 | unsigned short mpc_irqflag; | 145 | unsigned short irqflag; |
146 | unsigned char mpc_srcbusid; | 146 | unsigned char srcbusid; |
147 | unsigned char mpc_srcbusirq; | 147 | unsigned char srcbusirq; |
148 | unsigned char mpc_destapic; | 148 | unsigned char destapic; |
149 | unsigned char mpc_destapiclint; | 149 | unsigned char destapiclint; |
150 | }; | 150 | }; |
151 | 151 | ||
152 | #define MPC_OEM_SIGNATURE "_OEM" | 152 | #define MPC_OEM_SIGNATURE "_OEM" |
153 | 153 | ||
154 | struct mp_config_oemtable { | 154 | struct mpc_oemtable { |
155 | char oem_signature[4]; | 155 | char signature[4]; |
156 | unsigned short oem_length; /* Size of table */ | 156 | unsigned short length; /* Size of table */ |
157 | char oem_rev; /* 0x01 */ | 157 | char rev; /* 0x01 */ |
158 | char oem_checksum; | 158 | char checksum; |
159 | char mpc_oem[8]; | 159 | char mpc[8]; |
160 | }; | 160 | }; |
161 | 161 | ||
162 | /* | 162 | /* |
diff --git a/arch/x86/include/asm/numaq/mpparse.h b/arch/x86/include/asm/numaq/mpparse.h index 252292e077b6..a2eeefcd1cc7 100644 --- a/arch/x86/include/asm/numaq/mpparse.h +++ b/arch/x86/include/asm/numaq/mpparse.h | |||
@@ -1,7 +1,6 @@ | |||
1 | #ifndef __ASM_NUMAQ_MPPARSE_H | 1 | #ifndef __ASM_NUMAQ_MPPARSE_H |
2 | #define __ASM_NUMAQ_MPPARSE_H | 2 | #define __ASM_NUMAQ_MPPARSE_H |
3 | 3 | ||
4 | extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 4 | extern void numaq_mps_oem_check(struct mpc_table *, char *, char *); |
5 | char *productid); | ||
6 | 5 | ||
7 | #endif /* __ASM_NUMAQ_MPPARSE_H */ | 6 | #endif /* __ASM_NUMAQ_MPPARSE_H */ |
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index 4fcd53fd5f43..ebe858cdc8a3 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
@@ -25,9 +25,9 @@ extern int wakeup_secondary_cpu_via_init(int apicid, unsigned long start_eip); | |||
25 | /* | 25 | /* |
26 | * Any setup quirks to be performed? | 26 | * Any setup quirks to be performed? |
27 | */ | 27 | */ |
28 | struct mpc_config_processor; | 28 | struct mpc_cpu; |
29 | struct mpc_config_bus; | 29 | struct mpc_bus; |
30 | struct mp_config_oemtable; | 30 | struct mpc_oemtable; |
31 | struct x86_quirks { | 31 | struct x86_quirks { |
32 | int (*arch_pre_time_init)(void); | 32 | int (*arch_pre_time_init)(void); |
33 | int (*arch_time_init)(void); | 33 | int (*arch_time_init)(void); |
@@ -39,10 +39,10 @@ struct x86_quirks { | |||
39 | int (*mach_find_smp_config)(unsigned int reserve); | 39 | int (*mach_find_smp_config)(unsigned int reserve); |
40 | 40 | ||
41 | int *mpc_record; | 41 | int *mpc_record; |
42 | int (*mpc_apic_id)(struct mpc_config_processor *m); | 42 | int (*mpc_apic_id)(struct mpc_cpu *m); |
43 | void (*mpc_oem_bus_info)(struct mpc_config_bus *m, char *name); | 43 | void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name); |
44 | void (*mpc_oem_pci_bus)(struct mpc_config_bus *m); | 44 | void (*mpc_oem_pci_bus)(struct mpc_bus *m); |
45 | void (*smp_read_mpc_oem)(struct mp_config_oemtable *oemtable, | 45 | void (*smp_read_mpc_oem)(struct mpc_oemtable *oemtable, |
46 | unsigned short oemsize); | 46 | unsigned short oemsize); |
47 | int (*setup_ioapic_ids)(void); | 47 | int (*setup_ioapic_ids)(void); |
48 | int (*update_genapic)(void); | 48 | int (*update_genapic)(void); |
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 830b9fcb6427..19953df61c52 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
@@ -18,9 +18,26 @@ | |||
18 | #include <asm/pda.h> | 18 | #include <asm/pda.h> |
19 | #include <asm/thread_info.h> | 19 | #include <asm/thread_info.h> |
20 | 20 | ||
21 | #ifdef CONFIG_X86_64 | ||
22 | |||
23 | extern cpumask_var_t cpu_callin_mask; | ||
24 | extern cpumask_var_t cpu_callout_mask; | ||
25 | extern cpumask_var_t cpu_initialized_mask; | ||
26 | extern cpumask_var_t cpu_sibling_setup_mask; | ||
27 | |||
28 | #else /* CONFIG_X86_32 */ | ||
29 | |||
30 | extern cpumask_t cpu_callin_map; | ||
21 | extern cpumask_t cpu_callout_map; | 31 | extern cpumask_t cpu_callout_map; |
22 | extern cpumask_t cpu_initialized; | 32 | extern cpumask_t cpu_initialized; |
23 | extern cpumask_t cpu_callin_map; | 33 | extern cpumask_t cpu_sibling_setup_map; |
34 | |||
35 | #define cpu_callin_mask ((struct cpumask *)&cpu_callin_map) | ||
36 | #define cpu_callout_mask ((struct cpumask *)&cpu_callout_map) | ||
37 | #define cpu_initialized_mask ((struct cpumask *)&cpu_initialized) | ||
38 | #define cpu_sibling_setup_mask ((struct cpumask *)&cpu_sibling_setup_map) | ||
39 | |||
40 | #endif /* CONFIG_X86_32 */ | ||
24 | 41 | ||
25 | extern void (*mtrr_hook)(void); | 42 | extern void (*mtrr_hook)(void); |
26 | extern void zap_low_mappings(void); | 43 | extern void zap_low_mappings(void); |
@@ -29,7 +46,6 @@ extern int __cpuinit get_local_pda(int cpu); | |||
29 | 46 | ||
30 | extern int smp_num_siblings; | 47 | extern int smp_num_siblings; |
31 | extern unsigned int num_processors; | 48 | extern unsigned int num_processors; |
32 | extern cpumask_t cpu_initialized; | ||
33 | 49 | ||
34 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 50 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); |
35 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 51 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); |
@@ -38,6 +54,16 @@ DECLARE_PER_CPU(u16, cpu_llc_id); | |||
38 | DECLARE_PER_CPU(int, cpu_number); | 54 | DECLARE_PER_CPU(int, cpu_number); |
39 | #endif | 55 | #endif |
40 | 56 | ||
57 | static inline struct cpumask *cpu_sibling_mask(int cpu) | ||
58 | { | ||
59 | return &per_cpu(cpu_sibling_map, cpu); | ||
60 | } | ||
61 | |||
62 | static inline struct cpumask *cpu_core_mask(int cpu) | ||
63 | { | ||
64 | return &per_cpu(cpu_core_map, cpu); | ||
65 | } | ||
66 | |||
41 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); | 67 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); |
42 | DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); | 68 | DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); |
43 | 69 | ||
@@ -149,7 +175,7 @@ void smp_store_cpu_info(int id); | |||
149 | /* We don't mark CPUs online until __cpu_up(), so we need another measure */ | 175 | /* We don't mark CPUs online until __cpu_up(), so we need another measure */ |
150 | static inline int num_booting_cpus(void) | 176 | static inline int num_booting_cpus(void) |
151 | { | 177 | { |
152 | return cpus_weight(cpu_callout_map); | 178 | return cpumask_weight(cpu_callout_mask); |
153 | } | 179 | } |
154 | #else | 180 | #else |
155 | static inline void prefill_possible_map(void) | 181 | static inline void prefill_possible_map(void) |
diff --git a/arch/x86/include/asm/summit/apic.h b/arch/x86/include/asm/summit/apic.h index 4bb5fb34f030..93d2c8667cfe 100644 --- a/arch/x86/include/asm/summit/apic.h +++ b/arch/x86/include/asm/summit/apic.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ASM_SUMMIT_APIC_H | 2 | #define __ASM_SUMMIT_APIC_H |
3 | 3 | ||
4 | #include <asm/smp.h> | 4 | #include <asm/smp.h> |
5 | #include <linux/gfp.h> | ||
5 | 6 | ||
6 | #define esr_disable (1) | 7 | #define esr_disable (1) |
7 | #define NO_BALANCE_IRQ (0) | 8 | #define NO_BALANCE_IRQ (0) |
diff --git a/arch/x86/include/asm/summit/mpparse.h b/arch/x86/include/asm/summit/mpparse.h index 013ce6fab2d5..380e86c02363 100644 --- a/arch/x86/include/asm/summit/mpparse.h +++ b/arch/x86/include/asm/summit/mpparse.h | |||
@@ -11,7 +11,7 @@ extern void setup_summit(void); | |||
11 | #define setup_summit() {} | 11 | #define setup_summit() {} |
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, | 14 | static inline int mps_oem_check(struct mpc_table *mpc, char *oem, |
15 | char *productid) | 15 | char *productid) |
16 | { | 16 | { |
17 | if (!strncmp(oem, "IBM ENSW", 8) && | 17 | if (!strncmp(oem, "IBM ENSW", 8) && |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 29dc0c89d4af..d37593c2f438 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | static int __initdata acpi_force = 0; | 49 | static int __initdata acpi_force = 0; |
50 | 50 | u32 acpi_rsdt_forced; | |
51 | #ifdef CONFIG_ACPI | 51 | #ifdef CONFIG_ACPI |
52 | int acpi_disabled = 0; | 52 | int acpi_disabled = 0; |
53 | #else | 53 | #else |
@@ -1374,6 +1374,17 @@ static void __init acpi_process_madt(void) | |||
1374 | "Invalid BIOS MADT, disabling ACPI\n"); | 1374 | "Invalid BIOS MADT, disabling ACPI\n"); |
1375 | disable_acpi(); | 1375 | disable_acpi(); |
1376 | } | 1376 | } |
1377 | } else { | ||
1378 | /* | ||
1379 | * ACPI found no MADT, and so ACPI wants UP PIC mode. | ||
1380 | * In the event an MPS table was found, forget it. | ||
1381 | * Boot with "acpi=off" to use MPS on such a system. | ||
1382 | */ | ||
1383 | if (smp_found_config) { | ||
1384 | printk(KERN_WARNING PREFIX | ||
1385 | "No APIC-table, disabling MPS\n"); | ||
1386 | smp_found_config = 0; | ||
1387 | } | ||
1377 | } | 1388 | } |
1378 | 1389 | ||
1379 | /* | 1390 | /* |
@@ -1809,6 +1820,10 @@ static int __init parse_acpi(char *arg) | |||
1809 | disable_acpi(); | 1820 | disable_acpi(); |
1810 | acpi_ht = 1; | 1821 | acpi_ht = 1; |
1811 | } | 1822 | } |
1823 | /* acpi=rsdt use RSDT instead of XSDT */ | ||
1824 | else if (strcmp(arg, "rsdt") == 0) { | ||
1825 | acpi_rsdt_forced = 1; | ||
1826 | } | ||
1812 | /* "acpi=noirq" disables ACPI interrupt routing */ | 1827 | /* "acpi=noirq" disables ACPI interrupt routing */ |
1813 | else if (strcmp(arg, "noirq") == 0) { | 1828 | else if (strcmp(arg, "noirq") == 0) { |
1814 | acpi_noirq_set(); | 1829 | acpi_noirq_set(); |
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index c2502eb9aa83..bbbe4bbb6f34 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c | |||
@@ -56,6 +56,7 @@ static struct cstate_entry *cpu_cstate_entry; /* per CPU ptr */ | |||
56 | static short mwait_supported[ACPI_PROCESSOR_MAX_POWER]; | 56 | static short mwait_supported[ACPI_PROCESSOR_MAX_POWER]; |
57 | 57 | ||
58 | #define MWAIT_SUBSTATE_MASK (0xf) | 58 | #define MWAIT_SUBSTATE_MASK (0xf) |
59 | #define MWAIT_CSTATE_MASK (0xf) | ||
59 | #define MWAIT_SUBSTATE_SIZE (4) | 60 | #define MWAIT_SUBSTATE_SIZE (4) |
60 | 61 | ||
61 | #define CPUID_MWAIT_LEAF (5) | 62 | #define CPUID_MWAIT_LEAF (5) |
@@ -66,39 +67,20 @@ static short mwait_supported[ACPI_PROCESSOR_MAX_POWER]; | |||
66 | 67 | ||
67 | #define NATIVE_CSTATE_BEYOND_HALT (2) | 68 | #define NATIVE_CSTATE_BEYOND_HALT (2) |
68 | 69 | ||
69 | int acpi_processor_ffh_cstate_probe(unsigned int cpu, | 70 | static long acpi_processor_ffh_cstate_probe_cpu(void *_cx) |
70 | struct acpi_processor_cx *cx, struct acpi_power_register *reg) | ||
71 | { | 71 | { |
72 | struct cstate_entry *percpu_entry; | 72 | struct acpi_processor_cx *cx = _cx; |
73 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 73 | long retval; |
74 | |||
75 | cpumask_t saved_mask; | ||
76 | int retval; | ||
77 | unsigned int eax, ebx, ecx, edx; | 74 | unsigned int eax, ebx, ecx, edx; |
78 | unsigned int edx_part; | 75 | unsigned int edx_part; |
79 | unsigned int cstate_type; /* C-state type and not ACPI C-state type */ | 76 | unsigned int cstate_type; /* C-state type and not ACPI C-state type */ |
80 | unsigned int num_cstate_subtype; | 77 | unsigned int num_cstate_subtype; |
81 | 78 | ||
82 | if (!cpu_cstate_entry || c->cpuid_level < CPUID_MWAIT_LEAF ) | ||
83 | return -1; | ||
84 | |||
85 | if (reg->bit_offset != NATIVE_CSTATE_BEYOND_HALT) | ||
86 | return -1; | ||
87 | |||
88 | percpu_entry = per_cpu_ptr(cpu_cstate_entry, cpu); | ||
89 | percpu_entry->states[cx->index].eax = 0; | ||
90 | percpu_entry->states[cx->index].ecx = 0; | ||
91 | |||
92 | /* Make sure we are running on right CPU */ | ||
93 | saved_mask = current->cpus_allowed; | ||
94 | retval = set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu)); | ||
95 | if (retval) | ||
96 | return -1; | ||
97 | |||
98 | cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx); | 79 | cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx); |
99 | 80 | ||
100 | /* Check whether this particular cx_type (in CST) is supported or not */ | 81 | /* Check whether this particular cx_type (in CST) is supported or not */ |
101 | cstate_type = (cx->address >> MWAIT_SUBSTATE_SIZE) + 1; | 82 | cstate_type = ((cx->address >> MWAIT_SUBSTATE_SIZE) & |
83 | MWAIT_CSTATE_MASK) + 1; | ||
102 | edx_part = edx >> (cstate_type * MWAIT_SUBSTATE_SIZE); | 84 | edx_part = edx >> (cstate_type * MWAIT_SUBSTATE_SIZE); |
103 | num_cstate_subtype = edx_part & MWAIT_SUBSTATE_MASK; | 85 | num_cstate_subtype = edx_part & MWAIT_SUBSTATE_MASK; |
104 | 86 | ||
@@ -114,21 +96,45 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, | |||
114 | retval = -1; | 96 | retval = -1; |
115 | goto out; | 97 | goto out; |
116 | } | 98 | } |
117 | percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; | ||
118 | |||
119 | /* Use the hint in CST */ | ||
120 | percpu_entry->states[cx->index].eax = cx->address; | ||
121 | 99 | ||
122 | if (!mwait_supported[cstate_type]) { | 100 | if (!mwait_supported[cstate_type]) { |
123 | mwait_supported[cstate_type] = 1; | 101 | mwait_supported[cstate_type] = 1; |
124 | printk(KERN_DEBUG "Monitor-Mwait will be used to enter C-%d " | 102 | printk(KERN_DEBUG |
125 | "state\n", cx->type); | 103 | "Monitor-Mwait will be used to enter C-%d " |
104 | "state\n", cx->type); | ||
126 | } | 105 | } |
127 | snprintf(cx->desc, ACPI_CX_DESC_LEN, "ACPI FFH INTEL MWAIT 0x%x", | 106 | snprintf(cx->desc, |
128 | cx->address); | 107 | ACPI_CX_DESC_LEN, "ACPI FFH INTEL MWAIT 0x%x", |
129 | 108 | cx->address); | |
130 | out: | 109 | out: |
131 | set_cpus_allowed_ptr(current, &saved_mask); | 110 | return retval; |
111 | } | ||
112 | |||
113 | int acpi_processor_ffh_cstate_probe(unsigned int cpu, | ||
114 | struct acpi_processor_cx *cx, struct acpi_power_register *reg) | ||
115 | { | ||
116 | struct cstate_entry *percpu_entry; | ||
117 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
118 | long retval; | ||
119 | |||
120 | if (!cpu_cstate_entry || c->cpuid_level < CPUID_MWAIT_LEAF) | ||
121 | return -1; | ||
122 | |||
123 | if (reg->bit_offset != NATIVE_CSTATE_BEYOND_HALT) | ||
124 | return -1; | ||
125 | |||
126 | percpu_entry = per_cpu_ptr(cpu_cstate_entry, cpu); | ||
127 | percpu_entry->states[cx->index].eax = 0; | ||
128 | percpu_entry->states[cx->index].ecx = 0; | ||
129 | |||
130 | /* Make sure we are running on right CPU */ | ||
131 | |||
132 | retval = work_on_cpu(cpu, acpi_processor_ffh_cstate_probe_cpu, cx); | ||
133 | if (retval == 0) { | ||
134 | /* Use the hint in CST */ | ||
135 | percpu_entry->states[cx->index].eax = cx->address; | ||
136 | percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; | ||
137 | } | ||
132 | return retval; | 138 | return retval; |
133 | } | 139 | } |
134 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); | 140 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 806b4e9051b4..707c1f6f95fa 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
@@ -159,6 +159,8 @@ static int __init acpi_sleep_setup(char *str) | |||
159 | #endif | 159 | #endif |
160 | if (strncmp(str, "old_ordering", 12) == 0) | 160 | if (strncmp(str, "old_ordering", 12) == 0) |
161 | acpi_old_suspend_ordering(); | 161 | acpi_old_suspend_ordering(); |
162 | if (strncmp(str, "s4_nonvs", 8) == 0) | ||
163 | acpi_s4_no_nvs(); | ||
162 | str = strchr(str, ','); | 164 | str = strchr(str, ','); |
163 | if (str != NULL) | 165 | if (str != NULL) |
164 | str += strspn(str, ", \t"); | 166 | str += strspn(str, ", \t"); |
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index b13d3c4dbd42..566a08466b19 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c | |||
@@ -31,9 +31,11 @@ | |||
31 | #include <linux/dmi.h> | 31 | #include <linux/dmi.h> |
32 | #include <linux/dmar.h> | 32 | #include <linux/dmar.h> |
33 | #include <linux/ftrace.h> | 33 | #include <linux/ftrace.h> |
34 | #include <linux/smp.h> | ||
35 | #include <linux/nmi.h> | ||
36 | #include <linux/timex.h> | ||
34 | 37 | ||
35 | #include <asm/atomic.h> | 38 | #include <asm/atomic.h> |
36 | #include <asm/smp.h> | ||
37 | #include <asm/mtrr.h> | 39 | #include <asm/mtrr.h> |
38 | #include <asm/mpspec.h> | 40 | #include <asm/mpspec.h> |
39 | #include <asm/desc.h> | 41 | #include <asm/desc.h> |
@@ -41,10 +43,8 @@ | |||
41 | #include <asm/hpet.h> | 43 | #include <asm/hpet.h> |
42 | #include <asm/pgalloc.h> | 44 | #include <asm/pgalloc.h> |
43 | #include <asm/i8253.h> | 45 | #include <asm/i8253.h> |
44 | #include <asm/nmi.h> | ||
45 | #include <asm/idle.h> | 46 | #include <asm/idle.h> |
46 | #include <asm/proto.h> | 47 | #include <asm/proto.h> |
47 | #include <asm/timex.h> | ||
48 | #include <asm/apic.h> | 48 | #include <asm/apic.h> |
49 | #include <asm/i8259.h> | 49 | #include <asm/i8259.h> |
50 | 50 | ||
@@ -687,7 +687,7 @@ static int __init calibrate_APIC_clock(void) | |||
687 | local_irq_enable(); | 687 | local_irq_enable(); |
688 | 688 | ||
689 | if (levt->features & CLOCK_EVT_FEAT_DUMMY) { | 689 | if (levt->features & CLOCK_EVT_FEAT_DUMMY) { |
690 | pr_warning("APIC timer disabled due to verification failure.\n"); | 690 | pr_warning("APIC timer disabled due to verification failure\n"); |
691 | return -1; | 691 | return -1; |
692 | } | 692 | } |
693 | 693 | ||
@@ -2087,14 +2087,12 @@ __cpuinit int apic_is_clustered_box(void) | |||
2087 | /* are we being called early in kernel startup? */ | 2087 | /* are we being called early in kernel startup? */ |
2088 | if (bios_cpu_apicid) { | 2088 | if (bios_cpu_apicid) { |
2089 | id = bios_cpu_apicid[i]; | 2089 | id = bios_cpu_apicid[i]; |
2090 | } | 2090 | } else if (i < nr_cpu_ids) { |
2091 | else if (i < nr_cpu_ids) { | ||
2092 | if (cpu_present(i)) | 2091 | if (cpu_present(i)) |
2093 | id = per_cpu(x86_bios_cpu_apicid, i); | 2092 | id = per_cpu(x86_bios_cpu_apicid, i); |
2094 | else | 2093 | else |
2095 | continue; | 2094 | continue; |
2096 | } | 2095 | } else |
2097 | else | ||
2098 | break; | 2096 | break; |
2099 | 2097 | ||
2100 | if (id != BAD_APICID) | 2098 | if (id != BAD_APICID) |
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 3a26525a3f31..98807bb095ad 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
@@ -160,9 +160,9 @@ | |||
160 | * Work around byte swap bug in one of the Vaio's BIOS's | 160 | * Work around byte swap bug in one of the Vaio's BIOS's |
161 | * (Marc Boucher <marc@mbsi.ca>). | 161 | * (Marc Boucher <marc@mbsi.ca>). |
162 | * Exposed the disable flag to dmi so that we can handle known | 162 | * Exposed the disable flag to dmi so that we can handle known |
163 | * broken APM (Alan Cox <alan@redhat.com>). | 163 | * broken APM (Alan Cox <alan@lxorguk.ukuu.org.uk>). |
164 | * 1.14ac: If the BIOS says "I slowed the CPU down" then don't spin | 164 | * 1.14ac: If the BIOS says "I slowed the CPU down" then don't spin |
165 | * calling it - instead idle. (Alan Cox <alan@redhat.com>) | 165 | * calling it - instead idle. (Alan Cox <alan@lxorguk.ukuu.org.uk>) |
166 | * If an APM idle fails log it and idle sensibly | 166 | * If an APM idle fails log it and idle sensibly |
167 | * 1.15: Don't queue events to clients who open the device O_WRONLY. | 167 | * 1.15: Don't queue events to clients who open the device O_WRONLY. |
168 | * Don't expect replies from clients who open the device O_RDONLY. | 168 | * Don't expect replies from clients who open the device O_RDONLY. |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 3f95a40f718a..83492b1f93b1 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -40,6 +40,26 @@ | |||
40 | 40 | ||
41 | #include "cpu.h" | 41 | #include "cpu.h" |
42 | 42 | ||
43 | #ifdef CONFIG_X86_64 | ||
44 | |||
45 | /* all of these masks are initialized in setup_cpu_local_masks() */ | ||
46 | cpumask_var_t cpu_callin_mask; | ||
47 | cpumask_var_t cpu_callout_mask; | ||
48 | cpumask_var_t cpu_initialized_mask; | ||
49 | |||
50 | /* representing cpus for which sibling maps can be computed */ | ||
51 | cpumask_var_t cpu_sibling_setup_mask; | ||
52 | |||
53 | #else /* CONFIG_X86_32 */ | ||
54 | |||
55 | cpumask_t cpu_callin_map; | ||
56 | cpumask_t cpu_callout_map; | ||
57 | cpumask_t cpu_initialized; | ||
58 | cpumask_t cpu_sibling_setup_map; | ||
59 | |||
60 | #endif /* CONFIG_X86_32 */ | ||
61 | |||
62 | |||
43 | static struct cpu_dev *this_cpu __cpuinitdata; | 63 | static struct cpu_dev *this_cpu __cpuinitdata; |
44 | 64 | ||
45 | #ifdef CONFIG_X86_64 | 65 | #ifdef CONFIG_X86_64 |
@@ -856,8 +876,6 @@ static __init int setup_disablecpuid(char *arg) | |||
856 | } | 876 | } |
857 | __setup("clearcpuid=", setup_disablecpuid); | 877 | __setup("clearcpuid=", setup_disablecpuid); |
858 | 878 | ||
859 | cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE; | ||
860 | |||
861 | #ifdef CONFIG_X86_64 | 879 | #ifdef CONFIG_X86_64 |
862 | struct x8664_pda **_cpu_pda __read_mostly; | 880 | struct x8664_pda **_cpu_pda __read_mostly; |
863 | EXPORT_SYMBOL(_cpu_pda); | 881 | EXPORT_SYMBOL(_cpu_pda); |
@@ -976,7 +994,7 @@ void __cpuinit cpu_init(void) | |||
976 | 994 | ||
977 | me = current; | 995 | me = current; |
978 | 996 | ||
979 | if (cpu_test_and_set(cpu, cpu_initialized)) | 997 | if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask)) |
980 | panic("CPU#%d already initialized!\n", cpu); | 998 | panic("CPU#%d already initialized!\n", cpu); |
981 | 999 | ||
982 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); | 1000 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); |
@@ -1085,7 +1103,7 @@ void __cpuinit cpu_init(void) | |||
1085 | struct tss_struct *t = &per_cpu(init_tss, cpu); | 1103 | struct tss_struct *t = &per_cpu(init_tss, cpu); |
1086 | struct thread_struct *thread = &curr->thread; | 1104 | struct thread_struct *thread = &curr->thread; |
1087 | 1105 | ||
1088 | if (cpu_test_and_set(cpu, cpu_initialized)) { | 1106 | if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask)) { |
1089 | printk(KERN_WARNING "CPU#%d already initialized!\n", cpu); | 1107 | printk(KERN_WARNING "CPU#%d already initialized!\n", cpu); |
1090 | for (;;) local_irq_enable(); | 1108 | for (;;) local_irq_enable(); |
1091 | } | 1109 | } |
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 28102ad1a363..06fcd8f9323c 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -145,13 +145,14 @@ typedef union { | |||
145 | 145 | ||
146 | struct drv_cmd { | 146 | struct drv_cmd { |
147 | unsigned int type; | 147 | unsigned int type; |
148 | cpumask_t mask; | 148 | cpumask_var_t mask; |
149 | drv_addr_union addr; | 149 | drv_addr_union addr; |
150 | u32 val; | 150 | u32 val; |
151 | }; | 151 | }; |
152 | 152 | ||
153 | static void do_drv_read(struct drv_cmd *cmd) | 153 | static long do_drv_read(void *_cmd) |
154 | { | 154 | { |
155 | struct drv_cmd *cmd = _cmd; | ||
155 | u32 h; | 156 | u32 h; |
156 | 157 | ||
157 | switch (cmd->type) { | 158 | switch (cmd->type) { |
@@ -166,10 +167,12 @@ static void do_drv_read(struct drv_cmd *cmd) | |||
166 | default: | 167 | default: |
167 | break; | 168 | break; |
168 | } | 169 | } |
170 | return 0; | ||
169 | } | 171 | } |
170 | 172 | ||
171 | static void do_drv_write(struct drv_cmd *cmd) | 173 | static long do_drv_write(void *_cmd) |
172 | { | 174 | { |
175 | struct drv_cmd *cmd = _cmd; | ||
173 | u32 lo, hi; | 176 | u32 lo, hi; |
174 | 177 | ||
175 | switch (cmd->type) { | 178 | switch (cmd->type) { |
@@ -186,48 +189,41 @@ static void do_drv_write(struct drv_cmd *cmd) | |||
186 | default: | 189 | default: |
187 | break; | 190 | break; |
188 | } | 191 | } |
192 | return 0; | ||
189 | } | 193 | } |
190 | 194 | ||
191 | static void drv_read(struct drv_cmd *cmd) | 195 | static void drv_read(struct drv_cmd *cmd) |
192 | { | 196 | { |
193 | cpumask_t saved_mask = current->cpus_allowed; | ||
194 | cmd->val = 0; | 197 | cmd->val = 0; |
195 | 198 | ||
196 | set_cpus_allowed_ptr(current, &cmd->mask); | 199 | work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd); |
197 | do_drv_read(cmd); | ||
198 | set_cpus_allowed_ptr(current, &saved_mask); | ||
199 | } | 200 | } |
200 | 201 | ||
201 | static void drv_write(struct drv_cmd *cmd) | 202 | static void drv_write(struct drv_cmd *cmd) |
202 | { | 203 | { |
203 | cpumask_t saved_mask = current->cpus_allowed; | ||
204 | unsigned int i; | 204 | unsigned int i; |
205 | 205 | ||
206 | for_each_cpu_mask_nr(i, cmd->mask) { | 206 | for_each_cpu(i, cmd->mask) { |
207 | set_cpus_allowed_ptr(current, &cpumask_of_cpu(i)); | 207 | work_on_cpu(i, do_drv_write, cmd); |
208 | do_drv_write(cmd); | ||
209 | } | 208 | } |
210 | |||
211 | set_cpus_allowed_ptr(current, &saved_mask); | ||
212 | return; | ||
213 | } | 209 | } |
214 | 210 | ||
215 | static u32 get_cur_val(const cpumask_t *mask) | 211 | static u32 get_cur_val(const struct cpumask *mask) |
216 | { | 212 | { |
217 | struct acpi_processor_performance *perf; | 213 | struct acpi_processor_performance *perf; |
218 | struct drv_cmd cmd; | 214 | struct drv_cmd cmd; |
219 | 215 | ||
220 | if (unlikely(cpus_empty(*mask))) | 216 | if (unlikely(cpumask_empty(mask))) |
221 | return 0; | 217 | return 0; |
222 | 218 | ||
223 | switch (per_cpu(drv_data, first_cpu(*mask))->cpu_feature) { | 219 | switch (per_cpu(drv_data, cpumask_first(mask))->cpu_feature) { |
224 | case SYSTEM_INTEL_MSR_CAPABLE: | 220 | case SYSTEM_INTEL_MSR_CAPABLE: |
225 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; | 221 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; |
226 | cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; | 222 | cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; |
227 | break; | 223 | break; |
228 | case SYSTEM_IO_CAPABLE: | 224 | case SYSTEM_IO_CAPABLE: |
229 | cmd.type = SYSTEM_IO_CAPABLE; | 225 | cmd.type = SYSTEM_IO_CAPABLE; |
230 | perf = per_cpu(drv_data, first_cpu(*mask))->acpi_data; | 226 | perf = per_cpu(drv_data, cpumask_first(mask))->acpi_data; |
231 | cmd.addr.io.port = perf->control_register.address; | 227 | cmd.addr.io.port = perf->control_register.address; |
232 | cmd.addr.io.bit_width = perf->control_register.bit_width; | 228 | cmd.addr.io.bit_width = perf->control_register.bit_width; |
233 | break; | 229 | break; |
@@ -235,15 +231,44 @@ static u32 get_cur_val(const cpumask_t *mask) | |||
235 | return 0; | 231 | return 0; |
236 | } | 232 | } |
237 | 233 | ||
238 | cmd.mask = *mask; | 234 | if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL))) |
235 | return 0; | ||
236 | |||
237 | cpumask_copy(cmd.mask, mask); | ||
239 | 238 | ||
240 | drv_read(&cmd); | 239 | drv_read(&cmd); |
241 | 240 | ||
241 | free_cpumask_var(cmd.mask); | ||
242 | |||
242 | dprintk("get_cur_val = %u\n", cmd.val); | 243 | dprintk("get_cur_val = %u\n", cmd.val); |
243 | 244 | ||
244 | return cmd.val; | 245 | return cmd.val; |
245 | } | 246 | } |
246 | 247 | ||
248 | struct perf_cur { | ||
249 | union { | ||
250 | struct { | ||
251 | u32 lo; | ||
252 | u32 hi; | ||
253 | } split; | ||
254 | u64 whole; | ||
255 | } aperf_cur, mperf_cur; | ||
256 | }; | ||
257 | |||
258 | |||
259 | static long read_measured_perf_ctrs(void *_cur) | ||
260 | { | ||
261 | struct perf_cur *cur = _cur; | ||
262 | |||
263 | rdmsr(MSR_IA32_APERF, cur->aperf_cur.split.lo, cur->aperf_cur.split.hi); | ||
264 | rdmsr(MSR_IA32_MPERF, cur->mperf_cur.split.lo, cur->mperf_cur.split.hi); | ||
265 | |||
266 | wrmsr(MSR_IA32_APERF, 0, 0); | ||
267 | wrmsr(MSR_IA32_MPERF, 0, 0); | ||
268 | |||
269 | return 0; | ||
270 | } | ||
271 | |||
247 | /* | 272 | /* |
248 | * Return the measured active (C0) frequency on this CPU since last call | 273 | * Return the measured active (C0) frequency on this CPU since last call |
249 | * to this function. | 274 | * to this function. |
@@ -260,31 +285,12 @@ static u32 get_cur_val(const cpumask_t *mask) | |||
260 | static unsigned int get_measured_perf(struct cpufreq_policy *policy, | 285 | static unsigned int get_measured_perf(struct cpufreq_policy *policy, |
261 | unsigned int cpu) | 286 | unsigned int cpu) |
262 | { | 287 | { |
263 | union { | 288 | struct perf_cur cur; |
264 | struct { | ||
265 | u32 lo; | ||
266 | u32 hi; | ||
267 | } split; | ||
268 | u64 whole; | ||
269 | } aperf_cur, mperf_cur; | ||
270 | |||
271 | cpumask_t saved_mask; | ||
272 | unsigned int perf_percent; | 289 | unsigned int perf_percent; |
273 | unsigned int retval; | 290 | unsigned int retval; |
274 | 291 | ||
275 | saved_mask = current->cpus_allowed; | 292 | if (!work_on_cpu(cpu, read_measured_perf_ctrs, &cur)) |
276 | set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu)); | ||
277 | if (get_cpu() != cpu) { | ||
278 | /* We were not able to run on requested processor */ | ||
279 | put_cpu(); | ||
280 | return 0; | 293 | return 0; |
281 | } | ||
282 | |||
283 | rdmsr(MSR_IA32_APERF, aperf_cur.split.lo, aperf_cur.split.hi); | ||
284 | rdmsr(MSR_IA32_MPERF, mperf_cur.split.lo, mperf_cur.split.hi); | ||
285 | |||
286 | wrmsr(MSR_IA32_APERF, 0,0); | ||
287 | wrmsr(MSR_IA32_MPERF, 0,0); | ||
288 | 294 | ||
289 | #ifdef __i386__ | 295 | #ifdef __i386__ |
290 | /* | 296 | /* |
@@ -292,37 +298,39 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy, | |||
292 | * Get an approximate value. Return failure in case we cannot get | 298 | * Get an approximate value. Return failure in case we cannot get |
293 | * an approximate value. | 299 | * an approximate value. |
294 | */ | 300 | */ |
295 | if (unlikely(aperf_cur.split.hi || mperf_cur.split.hi)) { | 301 | if (unlikely(cur.aperf_cur.split.hi || cur.mperf_cur.split.hi)) { |
296 | int shift_count; | 302 | int shift_count; |
297 | u32 h; | 303 | u32 h; |
298 | 304 | ||
299 | h = max_t(u32, aperf_cur.split.hi, mperf_cur.split.hi); | 305 | h = max_t(u32, cur.aperf_cur.split.hi, cur.mperf_cur.split.hi); |
300 | shift_count = fls(h); | 306 | shift_count = fls(h); |
301 | 307 | ||
302 | aperf_cur.whole >>= shift_count; | 308 | cur.aperf_cur.whole >>= shift_count; |
303 | mperf_cur.whole >>= shift_count; | 309 | cur.mperf_cur.whole >>= shift_count; |
304 | } | 310 | } |
305 | 311 | ||
306 | if (((unsigned long)(-1) / 100) < aperf_cur.split.lo) { | 312 | if (((unsigned long)(-1) / 100) < cur.aperf_cur.split.lo) { |
307 | int shift_count = 7; | 313 | int shift_count = 7; |
308 | aperf_cur.split.lo >>= shift_count; | 314 | cur.aperf_cur.split.lo >>= shift_count; |
309 | mperf_cur.split.lo >>= shift_count; | 315 | cur.mperf_cur.split.lo >>= shift_count; |
310 | } | 316 | } |
311 | 317 | ||
312 | if (aperf_cur.split.lo && mperf_cur.split.lo) | 318 | if (cur.aperf_cur.split.lo && cur.mperf_cur.split.lo) |
313 | perf_percent = (aperf_cur.split.lo * 100) / mperf_cur.split.lo; | 319 | perf_percent = (cur.aperf_cur.split.lo * 100) / |
320 | cur.mperf_cur.split.lo; | ||
314 | else | 321 | else |
315 | perf_percent = 0; | 322 | perf_percent = 0; |
316 | 323 | ||
317 | #else | 324 | #else |
318 | if (unlikely(((unsigned long)(-1) / 100) < aperf_cur.whole)) { | 325 | if (unlikely(((unsigned long)(-1) / 100) < cur.aperf_cur.whole)) { |
319 | int shift_count = 7; | 326 | int shift_count = 7; |
320 | aperf_cur.whole >>= shift_count; | 327 | cur.aperf_cur.whole >>= shift_count; |
321 | mperf_cur.whole >>= shift_count; | 328 | cur.mperf_cur.whole >>= shift_count; |
322 | } | 329 | } |
323 | 330 | ||
324 | if (aperf_cur.whole && mperf_cur.whole) | 331 | if (cur.aperf_cur.whole && cur.mperf_cur.whole) |
325 | perf_percent = (aperf_cur.whole * 100) / mperf_cur.whole; | 332 | perf_percent = (cur.aperf_cur.whole * 100) / |
333 | cur.mperf_cur.whole; | ||
326 | else | 334 | else |
327 | perf_percent = 0; | 335 | perf_percent = 0; |
328 | 336 | ||
@@ -330,10 +338,6 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy, | |||
330 | 338 | ||
331 | retval = per_cpu(drv_data, policy->cpu)->max_freq * perf_percent / 100; | 339 | retval = per_cpu(drv_data, policy->cpu)->max_freq * perf_percent / 100; |
332 | 340 | ||
333 | put_cpu(); | ||
334 | set_cpus_allowed_ptr(current, &saved_mask); | ||
335 | |||
336 | dprintk("cpu %d: performance percent %d\n", cpu, perf_percent); | ||
337 | return retval; | 341 | return retval; |
338 | } | 342 | } |
339 | 343 | ||
@@ -351,7 +355,7 @@ static unsigned int get_cur_freq_on_cpu(unsigned int cpu) | |||
351 | } | 355 | } |
352 | 356 | ||
353 | cached_freq = data->freq_table[data->acpi_data->state].frequency; | 357 | cached_freq = data->freq_table[data->acpi_data->state].frequency; |
354 | freq = extract_freq(get_cur_val(&cpumask_of_cpu(cpu)), data); | 358 | freq = extract_freq(get_cur_val(cpumask_of(cpu)), data); |
355 | if (freq != cached_freq) { | 359 | if (freq != cached_freq) { |
356 | /* | 360 | /* |
357 | * The dreaded BIOS frequency change behind our back. | 361 | * The dreaded BIOS frequency change behind our back. |
@@ -386,7 +390,6 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
386 | struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu); | 390 | struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu); |
387 | struct acpi_processor_performance *perf; | 391 | struct acpi_processor_performance *perf; |
388 | struct cpufreq_freqs freqs; | 392 | struct cpufreq_freqs freqs; |
389 | cpumask_t online_policy_cpus; | ||
390 | struct drv_cmd cmd; | 393 | struct drv_cmd cmd; |
391 | unsigned int next_state = 0; /* Index into freq_table */ | 394 | unsigned int next_state = 0; /* Index into freq_table */ |
392 | unsigned int next_perf_state = 0; /* Index into perf table */ | 395 | unsigned int next_perf_state = 0; /* Index into perf table */ |
@@ -401,20 +404,18 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
401 | return -ENODEV; | 404 | return -ENODEV; |
402 | } | 405 | } |
403 | 406 | ||
407 | if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL))) | ||
408 | return -ENOMEM; | ||
409 | |||
404 | perf = data->acpi_data; | 410 | perf = data->acpi_data; |
405 | result = cpufreq_frequency_table_target(policy, | 411 | result = cpufreq_frequency_table_target(policy, |
406 | data->freq_table, | 412 | data->freq_table, |
407 | target_freq, | 413 | target_freq, |
408 | relation, &next_state); | 414 | relation, &next_state); |
409 | if (unlikely(result)) | 415 | if (unlikely(result)) { |
410 | return -ENODEV; | 416 | result = -ENODEV; |
411 | 417 | goto out; | |
412 | #ifdef CONFIG_HOTPLUG_CPU | 418 | } |
413 | /* cpufreq holds the hotplug lock, so we are safe from here on */ | ||
414 | cpus_and(online_policy_cpus, cpu_online_map, policy->cpus); | ||
415 | #else | ||
416 | online_policy_cpus = policy->cpus; | ||
417 | #endif | ||
418 | 419 | ||
419 | next_perf_state = data->freq_table[next_state].index; | 420 | next_perf_state = data->freq_table[next_state].index; |
420 | if (perf->state == next_perf_state) { | 421 | if (perf->state == next_perf_state) { |
@@ -425,7 +426,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
425 | } else { | 426 | } else { |
426 | dprintk("Already at target state (P%d)\n", | 427 | dprintk("Already at target state (P%d)\n", |
427 | next_perf_state); | 428 | next_perf_state); |
428 | return 0; | 429 | goto out; |
429 | } | 430 | } |
430 | } | 431 | } |
431 | 432 | ||
@@ -444,19 +445,19 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
444 | cmd.val = (u32) perf->states[next_perf_state].control; | 445 | cmd.val = (u32) perf->states[next_perf_state].control; |
445 | break; | 446 | break; |
446 | default: | 447 | default: |
447 | return -ENODEV; | 448 | result = -ENODEV; |
449 | goto out; | ||
448 | } | 450 | } |
449 | 451 | ||
450 | cpus_clear(cmd.mask); | 452 | /* cpufreq holds the hotplug lock, so we are safe from here on */ |
451 | |||
452 | if (policy->shared_type != CPUFREQ_SHARED_TYPE_ANY) | 453 | if (policy->shared_type != CPUFREQ_SHARED_TYPE_ANY) |
453 | cmd.mask = online_policy_cpus; | 454 | cpumask_and(cmd.mask, cpu_online_mask, policy->cpus); |
454 | else | 455 | else |
455 | cpu_set(policy->cpu, cmd.mask); | 456 | cpumask_copy(cmd.mask, cpumask_of(policy->cpu)); |
456 | 457 | ||
457 | freqs.old = perf->states[perf->state].core_frequency * 1000; | 458 | freqs.old = perf->states[perf->state].core_frequency * 1000; |
458 | freqs.new = data->freq_table[next_state].frequency; | 459 | freqs.new = data->freq_table[next_state].frequency; |
459 | for_each_cpu_mask_nr(i, cmd.mask) { | 460 | for_each_cpu(i, cmd.mask) { |
460 | freqs.cpu = i; | 461 | freqs.cpu = i; |
461 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 462 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
462 | } | 463 | } |
@@ -464,19 +465,22 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
464 | drv_write(&cmd); | 465 | drv_write(&cmd); |
465 | 466 | ||
466 | if (acpi_pstate_strict) { | 467 | if (acpi_pstate_strict) { |
467 | if (!check_freqs(&cmd.mask, freqs.new, data)) { | 468 | if (!check_freqs(cmd.mask, freqs.new, data)) { |
468 | dprintk("acpi_cpufreq_target failed (%d)\n", | 469 | dprintk("acpi_cpufreq_target failed (%d)\n", |
469 | policy->cpu); | 470 | policy->cpu); |
470 | return -EAGAIN; | 471 | result = -EAGAIN; |
472 | goto out; | ||
471 | } | 473 | } |
472 | } | 474 | } |
473 | 475 | ||
474 | for_each_cpu_mask_nr(i, cmd.mask) { | 476 | for_each_cpu(i, cmd.mask) { |
475 | freqs.cpu = i; | 477 | freqs.cpu = i; |
476 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 478 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
477 | } | 479 | } |
478 | perf->state = next_perf_state; | 480 | perf->state = next_perf_state; |
479 | 481 | ||
482 | out: | ||
483 | free_cpumask_var(cmd.mask); | ||
480 | return result; | 484 | return result; |
481 | } | 485 | } |
482 | 486 | ||
@@ -626,15 +630,15 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
626 | */ | 630 | */ |
627 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || | 631 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || |
628 | policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) { | 632 | policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) { |
629 | cpumask_copy(&policy->cpus, perf->shared_cpu_map); | 633 | cpumask_copy(policy->cpus, perf->shared_cpu_map); |
630 | } | 634 | } |
631 | cpumask_copy(&policy->related_cpus, perf->shared_cpu_map); | 635 | cpumask_copy(policy->related_cpus, perf->shared_cpu_map); |
632 | 636 | ||
633 | #ifdef CONFIG_SMP | 637 | #ifdef CONFIG_SMP |
634 | dmi_check_system(sw_any_bug_dmi_table); | 638 | dmi_check_system(sw_any_bug_dmi_table); |
635 | if (bios_with_sw_any_bug && cpus_weight(policy->cpus) == 1) { | 639 | if (bios_with_sw_any_bug && cpumask_weight(policy->cpus) == 1) { |
636 | policy->shared_type = CPUFREQ_SHARED_TYPE_ALL; | 640 | policy->shared_type = CPUFREQ_SHARED_TYPE_ALL; |
637 | policy->cpus = per_cpu(cpu_core_map, cpu); | 641 | cpumask_copy(policy->cpus, cpu_core_mask(cpu)); |
638 | } | 642 | } |
639 | #endif | 643 | #endif |
640 | 644 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index b0461856acfb..a4cff5d6e380 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c | |||
@@ -982,7 +982,7 @@ static int __init longhaul_init(void) | |||
982 | case 10: | 982 | case 10: |
983 | printk(KERN_ERR PFX "Use acpi-cpufreq driver for VIA C7\n"); | 983 | printk(KERN_ERR PFX "Use acpi-cpufreq driver for VIA C7\n"); |
984 | default: | 984 | default: |
985 | ;; | 985 | ; |
986 | } | 986 | } |
987 | 987 | ||
988 | return -ENODEV; | 988 | return -ENODEV; |
diff --git a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c index beea4466b063..b585e04cbc9e 100644 --- a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c | |||
@@ -122,7 +122,7 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
122 | return 0; | 122 | return 0; |
123 | 123 | ||
124 | /* notifiers */ | 124 | /* notifiers */ |
125 | for_each_cpu_mask_nr(i, policy->cpus) { | 125 | for_each_cpu(i, policy->cpus) { |
126 | freqs.cpu = i; | 126 | freqs.cpu = i; |
127 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 127 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
128 | } | 128 | } |
@@ -130,11 +130,11 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
130 | /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software | 130 | /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software |
131 | * Developer's Manual, Volume 3 | 131 | * Developer's Manual, Volume 3 |
132 | */ | 132 | */ |
133 | for_each_cpu_mask_nr(i, policy->cpus) | 133 | for_each_cpu(i, policy->cpus) |
134 | cpufreq_p4_setdc(i, p4clockmod_table[newstate].index); | 134 | cpufreq_p4_setdc(i, p4clockmod_table[newstate].index); |
135 | 135 | ||
136 | /* notifiers */ | 136 | /* notifiers */ |
137 | for_each_cpu_mask_nr(i, policy->cpus) { | 137 | for_each_cpu(i, policy->cpus) { |
138 | freqs.cpu = i; | 138 | freqs.cpu = i; |
139 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 139 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
140 | } | 140 | } |
@@ -203,7 +203,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
203 | unsigned int i; | 203 | unsigned int i; |
204 | 204 | ||
205 | #ifdef CONFIG_SMP | 205 | #ifdef CONFIG_SMP |
206 | policy->cpus = per_cpu(cpu_sibling_map, policy->cpu); | 206 | cpumask_copy(policy->cpus, &per_cpu(cpu_sibling_map, policy->cpu)); |
207 | #endif | 207 | #endif |
208 | 208 | ||
209 | /* Errata workaround */ | 209 | /* Errata workaround */ |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index c3c9adbaa26f..5c28b37dea11 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
@@ -1199,10 +1199,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1199 | set_cpus_allowed_ptr(current, &oldmask); | 1199 | set_cpus_allowed_ptr(current, &oldmask); |
1200 | 1200 | ||
1201 | if (cpu_family == CPU_HW_PSTATE) | 1201 | if (cpu_family == CPU_HW_PSTATE) |
1202 | pol->cpus = cpumask_of_cpu(pol->cpu); | 1202 | cpumask_copy(pol->cpus, cpumask_of(pol->cpu)); |
1203 | else | 1203 | else |
1204 | pol->cpus = per_cpu(cpu_core_map, pol->cpu); | 1204 | cpumask_copy(pol->cpus, &per_cpu(cpu_core_map, pol->cpu)); |
1205 | data->available_cores = &(pol->cpus); | 1205 | data->available_cores = pol->cpus; |
1206 | 1206 | ||
1207 | /* Take a crude guess here. | 1207 | /* Take a crude guess here. |
1208 | * That guess was in microseconds, so multiply with 1000 */ | 1208 | * That guess was in microseconds, so multiply with 1000 */ |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h index 65cfb5d7f77f..8ecc75b6c7c3 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h | |||
@@ -53,7 +53,7 @@ struct powernow_k8_data { | |||
53 | /* we need to keep track of associated cores, but let cpufreq | 53 | /* we need to keep track of associated cores, but let cpufreq |
54 | * handle hotplug events - so just point at cpufreq pol->cpus | 54 | * handle hotplug events - so just point at cpufreq pol->cpus |
55 | * structure */ | 55 | * structure */ |
56 | cpumask_t *available_cores; | 56 | struct cpumask *available_cores; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | 59 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c index f0ea6fa2f53c..f08998278a3a 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c | |||
@@ -458,11 +458,6 @@ static int centrino_verify (struct cpufreq_policy *policy) | |||
458 | * | 458 | * |
459 | * Sets a new CPUFreq policy. | 459 | * Sets a new CPUFreq policy. |
460 | */ | 460 | */ |
461 | struct allmasks { | ||
462 | cpumask_t saved_mask; | ||
463 | cpumask_t covered_cpus; | ||
464 | }; | ||
465 | |||
466 | static int centrino_target (struct cpufreq_policy *policy, | 461 | static int centrino_target (struct cpufreq_policy *policy, |
467 | unsigned int target_freq, | 462 | unsigned int target_freq, |
468 | unsigned int relation) | 463 | unsigned int relation) |
@@ -472,12 +467,15 @@ static int centrino_target (struct cpufreq_policy *policy, | |||
472 | struct cpufreq_freqs freqs; | 467 | struct cpufreq_freqs freqs; |
473 | int retval = 0; | 468 | int retval = 0; |
474 | unsigned int j, k, first_cpu, tmp; | 469 | unsigned int j, k, first_cpu, tmp; |
475 | CPUMASK_ALLOC(allmasks); | 470 | cpumask_var_t saved_mask, covered_cpus; |
476 | CPUMASK_PTR(saved_mask, allmasks); | ||
477 | CPUMASK_PTR(covered_cpus, allmasks); | ||
478 | 471 | ||
479 | if (unlikely(allmasks == NULL)) | 472 | if (unlikely(!alloc_cpumask_var(&saved_mask, GFP_KERNEL))) |
480 | return -ENOMEM; | 473 | return -ENOMEM; |
474 | if (unlikely(!alloc_cpumask_var(&covered_cpus, GFP_KERNEL))) { | ||
475 | free_cpumask_var(saved_mask); | ||
476 | return -ENOMEM; | ||
477 | } | ||
478 | cpumask_copy(saved_mask, ¤t->cpus_allowed); | ||
481 | 479 | ||
482 | if (unlikely(per_cpu(centrino_model, cpu) == NULL)) { | 480 | if (unlikely(per_cpu(centrino_model, cpu) == NULL)) { |
483 | retval = -ENODEV; | 481 | retval = -ENODEV; |
@@ -493,11 +491,9 @@ static int centrino_target (struct cpufreq_policy *policy, | |||
493 | goto out; | 491 | goto out; |
494 | } | 492 | } |
495 | 493 | ||
496 | *saved_mask = current->cpus_allowed; | ||
497 | first_cpu = 1; | 494 | first_cpu = 1; |
498 | cpus_clear(*covered_cpus); | 495 | for_each_cpu(j, policy->cpus) { |
499 | for_each_cpu_mask_nr(j, policy->cpus) { | 496 | const struct cpumask *mask; |
500 | const cpumask_t *mask; | ||
501 | 497 | ||
502 | /* cpufreq holds the hotplug lock, so we are safe here */ | 498 | /* cpufreq holds the hotplug lock, so we are safe here */ |
503 | if (!cpu_online(j)) | 499 | if (!cpu_online(j)) |
@@ -508,9 +504,9 @@ static int centrino_target (struct cpufreq_policy *policy, | |||
508 | * Make sure we are running on CPU that wants to change freq | 504 | * Make sure we are running on CPU that wants to change freq |
509 | */ | 505 | */ |
510 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) | 506 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) |
511 | mask = &policy->cpus; | 507 | mask = policy->cpus; |
512 | else | 508 | else |
513 | mask = &cpumask_of_cpu(j); | 509 | mask = cpumask_of(j); |
514 | 510 | ||
515 | set_cpus_allowed_ptr(current, mask); | 511 | set_cpus_allowed_ptr(current, mask); |
516 | preempt_disable(); | 512 | preempt_disable(); |
@@ -542,7 +538,7 @@ static int centrino_target (struct cpufreq_policy *policy, | |||
542 | dprintk("target=%dkHz old=%d new=%d msr=%04x\n", | 538 | dprintk("target=%dkHz old=%d new=%d msr=%04x\n", |
543 | target_freq, freqs.old, freqs.new, msr); | 539 | target_freq, freqs.old, freqs.new, msr); |
544 | 540 | ||
545 | for_each_cpu_mask_nr(k, policy->cpus) { | 541 | for_each_cpu(k, policy->cpus) { |
546 | if (!cpu_online(k)) | 542 | if (!cpu_online(k)) |
547 | continue; | 543 | continue; |
548 | freqs.cpu = k; | 544 | freqs.cpu = k; |
@@ -567,7 +563,7 @@ static int centrino_target (struct cpufreq_policy *policy, | |||
567 | preempt_enable(); | 563 | preempt_enable(); |
568 | } | 564 | } |
569 | 565 | ||
570 | for_each_cpu_mask_nr(k, policy->cpus) { | 566 | for_each_cpu(k, policy->cpus) { |
571 | if (!cpu_online(k)) | 567 | if (!cpu_online(k)) |
572 | continue; | 568 | continue; |
573 | freqs.cpu = k; | 569 | freqs.cpu = k; |
@@ -590,7 +586,7 @@ static int centrino_target (struct cpufreq_policy *policy, | |||
590 | tmp = freqs.new; | 586 | tmp = freqs.new; |
591 | freqs.new = freqs.old; | 587 | freqs.new = freqs.old; |
592 | freqs.old = tmp; | 588 | freqs.old = tmp; |
593 | for_each_cpu_mask_nr(j, policy->cpus) { | 589 | for_each_cpu(j, policy->cpus) { |
594 | if (!cpu_online(j)) | 590 | if (!cpu_online(j)) |
595 | continue; | 591 | continue; |
596 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 592 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
@@ -605,7 +601,8 @@ migrate_end: | |||
605 | preempt_enable(); | 601 | preempt_enable(); |
606 | set_cpus_allowed_ptr(current, saved_mask); | 602 | set_cpus_allowed_ptr(current, saved_mask); |
607 | out: | 603 | out: |
608 | CPUMASK_FREE(allmasks); | 604 | free_cpumask_var(saved_mask); |
605 | free_cpumask_var(covered_cpus); | ||
609 | return retval; | 606 | return retval; |
610 | } | 607 | } |
611 | 608 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index 04d0376b64b0..dedc1e98f168 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | |||
@@ -229,7 +229,7 @@ static unsigned int speedstep_detect_chipset (void) | |||
229 | return 0; | 229 | return 0; |
230 | } | 230 | } |
231 | 231 | ||
232 | static unsigned int _speedstep_get(const cpumask_t *cpus) | 232 | static unsigned int _speedstep_get(const struct cpumask *cpus) |
233 | { | 233 | { |
234 | unsigned int speed; | 234 | unsigned int speed; |
235 | cpumask_t cpus_allowed; | 235 | cpumask_t cpus_allowed; |
@@ -244,7 +244,7 @@ static unsigned int _speedstep_get(const cpumask_t *cpus) | |||
244 | 244 | ||
245 | static unsigned int speedstep_get(unsigned int cpu) | 245 | static unsigned int speedstep_get(unsigned int cpu) |
246 | { | 246 | { |
247 | return _speedstep_get(&cpumask_of_cpu(cpu)); | 247 | return _speedstep_get(cpumask_of(cpu)); |
248 | } | 248 | } |
249 | 249 | ||
250 | /** | 250 | /** |
@@ -267,7 +267,7 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
267 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) | 267 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) |
268 | return -EINVAL; | 268 | return -EINVAL; |
269 | 269 | ||
270 | freqs.old = _speedstep_get(&policy->cpus); | 270 | freqs.old = _speedstep_get(policy->cpus); |
271 | freqs.new = speedstep_freqs[newstate].frequency; | 271 | freqs.new = speedstep_freqs[newstate].frequency; |
272 | freqs.cpu = policy->cpu; | 272 | freqs.cpu = policy->cpu; |
273 | 273 | ||
@@ -279,20 +279,20 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
279 | 279 | ||
280 | cpus_allowed = current->cpus_allowed; | 280 | cpus_allowed = current->cpus_allowed; |
281 | 281 | ||
282 | for_each_cpu_mask_nr(i, policy->cpus) { | 282 | for_each_cpu(i, policy->cpus) { |
283 | freqs.cpu = i; | 283 | freqs.cpu = i; |
284 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 284 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
285 | } | 285 | } |
286 | 286 | ||
287 | /* switch to physical CPU where state is to be changed */ | 287 | /* switch to physical CPU where state is to be changed */ |
288 | set_cpus_allowed_ptr(current, &policy->cpus); | 288 | set_cpus_allowed_ptr(current, policy->cpus); |
289 | 289 | ||
290 | speedstep_set_state(newstate); | 290 | speedstep_set_state(newstate); |
291 | 291 | ||
292 | /* allow to be run on all CPUs */ | 292 | /* allow to be run on all CPUs */ |
293 | set_cpus_allowed_ptr(current, &cpus_allowed); | 293 | set_cpus_allowed_ptr(current, &cpus_allowed); |
294 | 294 | ||
295 | for_each_cpu_mask_nr(i, policy->cpus) { | 295 | for_each_cpu(i, policy->cpus) { |
296 | freqs.cpu = i; | 296 | freqs.cpu = i; |
297 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 297 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
298 | } | 298 | } |
@@ -322,11 +322,11 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
322 | 322 | ||
323 | /* only run on CPU to be set, or on its sibling */ | 323 | /* only run on CPU to be set, or on its sibling */ |
324 | #ifdef CONFIG_SMP | 324 | #ifdef CONFIG_SMP |
325 | policy->cpus = per_cpu(cpu_sibling_map, policy->cpu); | 325 | cpumask_copy(policy->cpus, &per_cpu(cpu_sibling_map, policy->cpu)); |
326 | #endif | 326 | #endif |
327 | 327 | ||
328 | cpus_allowed = current->cpus_allowed; | 328 | cpus_allowed = current->cpus_allowed; |
329 | set_cpus_allowed_ptr(current, &policy->cpus); | 329 | set_cpus_allowed_ptr(current, policy->cpus); |
330 | 330 | ||
331 | /* detect low and high frequency and transition latency */ | 331 | /* detect low and high frequency and transition latency */ |
332 | result = speedstep_get_freqs(speedstep_processor, | 332 | result = speedstep_get_freqs(speedstep_processor, |
@@ -339,7 +339,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
339 | return result; | 339 | return result; |
340 | 340 | ||
341 | /* get current speed setting */ | 341 | /* get current speed setting */ |
342 | speed = _speedstep_get(&policy->cpus); | 342 | speed = _speedstep_get(policy->cpus); |
343 | if (!speed) | 343 | if (!speed) |
344 | return -EIO; | 344 | return -EIO; |
345 | 345 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/mce_32.c b/arch/x86/kernel/cpu/mcheck/mce_32.c index 0ebf3fc6a610..dfaebce3633e 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_32.c +++ b/arch/x86/kernel/cpu/mcheck/mce_32.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * mce.c - x86 Machine Check Exception Reporting | 2 | * mce.c - x86 Machine Check Exception Reporting |
3 | * (c) 2002 Alan Cox <alan@redhat.com>, Dave Jones <davej@redhat.com> | 3 | * (c) 2002 Alan Cox <alan@lxorguk.ukuu.org.uk>, Dave Jones <davej@redhat.com> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index a5a5e0530370..8ae8c4ff094d 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
@@ -462,7 +462,7 @@ out_free: | |||
462 | return err; | 462 | return err; |
463 | } | 463 | } |
464 | 464 | ||
465 | static long local_allocate_threshold_blocks(void *_bank) | 465 | static __cpuinit long local_allocate_threshold_blocks(void *_bank) |
466 | { | 466 | { |
467 | unsigned int *bank = _bank; | 467 | unsigned int *bank = _bank; |
468 | 468 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/p5.c b/arch/x86/kernel/cpu/mcheck/p5.c index bfa5817afdda..c9f77ea69edc 100644 --- a/arch/x86/kernel/cpu/mcheck/p5.c +++ b/arch/x86/kernel/cpu/mcheck/p5.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * P5 specific Machine Check Exception Reporting | 2 | * P5 specific Machine Check Exception Reporting |
3 | * (C) Copyright 2002 Alan Cox <alan@redhat.com> | 3 | * (C) Copyright 2002 Alan Cox <alan@lxorguk.ukuu.org.uk> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/p6.c b/arch/x86/kernel/cpu/mcheck/p6.c index 62efc9c2b3af..2ac52d7b434b 100644 --- a/arch/x86/kernel/cpu/mcheck/p6.c +++ b/arch/x86/kernel/cpu/mcheck/p6.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * P6 specific Machine Check Exception Reporting | 2 | * P6 specific Machine Check Exception Reporting |
3 | * (C) Copyright 2002 Alan Cox <alan@redhat.com> | 3 | * (C) Copyright 2002 Alan Cox <alan@lxorguk.ukuu.org.uk> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/winchip.c b/arch/x86/kernel/cpu/mcheck/winchip.c index f2be3e190c6b..2a043d89811d 100644 --- a/arch/x86/kernel/cpu/mcheck/winchip.c +++ b/arch/x86/kernel/cpu/mcheck/winchip.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * IDT Winchip specific Machine Check Exception Reporting | 2 | * IDT Winchip specific Machine Check Exception Reporting |
3 | * (C) Copyright 2002 Alan Cox <alan@redhat.com> | 3 | * (C) Copyright 2002 Alan Cox <alan@lxorguk.ukuu.org.uk> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 65a13943e098..e85826829cf2 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -665,6 +665,27 @@ void __init e820_mark_nosave_regions(unsigned long limit_pfn) | |||
665 | } | 665 | } |
666 | #endif | 666 | #endif |
667 | 667 | ||
668 | #ifdef CONFIG_HIBERNATION | ||
669 | /** | ||
670 | * Mark ACPI NVS memory region, so that we can save/restore it during | ||
671 | * hibernation and the subsequent resume. | ||
672 | */ | ||
673 | static int __init e820_mark_nvs_memory(void) | ||
674 | { | ||
675 | int i; | ||
676 | |||
677 | for (i = 0; i < e820.nr_map; i++) { | ||
678 | struct e820entry *ei = &e820.map[i]; | ||
679 | |||
680 | if (ei->type == E820_NVS) | ||
681 | hibernate_nvs_register(ei->addr, ei->size); | ||
682 | } | ||
683 | |||
684 | return 0; | ||
685 | } | ||
686 | core_initcall(e820_mark_nvs_memory); | ||
687 | #endif | ||
688 | |||
668 | /* | 689 | /* |
669 | * Early reserved memory areas. | 690 | * Early reserved memory areas. |
670 | */ | 691 | */ |
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 744aa7fc49d5..76b8cd953dee 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
@@ -201,6 +201,12 @@ struct chipset { | |||
201 | void (*f)(int num, int slot, int func); | 201 | void (*f)(int num, int slot, int func); |
202 | }; | 202 | }; |
203 | 203 | ||
204 | /* | ||
205 | * Only works for devices on the root bus. If you add any devices | ||
206 | * not on bus 0 readd another loop level in early_quirks(). But | ||
207 | * be careful because at least the Nvidia quirk here relies on | ||
208 | * only matching on bus 0. | ||
209 | */ | ||
204 | static struct chipset early_qrk[] __initdata = { | 210 | static struct chipset early_qrk[] __initdata = { |
205 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, | 211 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, |
206 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, | 212 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, |
@@ -267,17 +273,17 @@ static int __init check_dev_quirk(int num, int slot, int func) | |||
267 | 273 | ||
268 | void __init early_quirks(void) | 274 | void __init early_quirks(void) |
269 | { | 275 | { |
270 | int num, slot, func; | 276 | int slot, func; |
271 | 277 | ||
272 | if (!early_pci_allowed()) | 278 | if (!early_pci_allowed()) |
273 | return; | 279 | return; |
274 | 280 | ||
275 | /* Poor man's PCI discovery */ | 281 | /* Poor man's PCI discovery */ |
276 | for (num = 0; num < 32; num++) | 282 | /* Only scan the root bus */ |
277 | for (slot = 0; slot < 32; slot++) | 283 | for (slot = 0; slot < 32; slot++) |
278 | for (func = 0; func < 8; func++) { | 284 | for (func = 0; func < 8; func++) { |
279 | /* Only probe function 0 on single fn devices */ | 285 | /* Only probe function 0 on single fn devices */ |
280 | if (check_dev_quirk(num, slot, func)) | 286 | if (check_dev_quirk(0, slot, func)) |
281 | break; | 287 | break; |
282 | } | 288 | } |
283 | } | 289 | } |
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 26cfdc1d7c7f..0e275d495563 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
@@ -305,7 +305,7 @@ ENTRY(early_idt_handler) | |||
305 | call dump_stack | 305 | call dump_stack |
306 | #ifdef CONFIG_KALLSYMS | 306 | #ifdef CONFIG_KALLSYMS |
307 | leaq early_idt_ripmsg(%rip),%rdi | 307 | leaq early_idt_ripmsg(%rip),%rdi |
308 | movq 8(%rsp),%rsi # get rip again | 308 | movq 0(%rsp),%rsi # get rip again |
309 | call __print_symbol | 309 | call __print_symbol |
310 | #endif | 310 | #endif |
311 | #endif /* EARLY_PRINTK */ | 311 | #endif /* EARLY_PRINTK */ |
diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c index 4b8a53d841f7..11d5093eb281 100644 --- a/arch/x86/kernel/i8259.c +++ b/arch/x86/kernel/i8259.c | |||
@@ -11,15 +11,15 @@ | |||
11 | #include <linux/kernel_stat.h> | 11 | #include <linux/kernel_stat.h> |
12 | #include <linux/sysdev.h> | 12 | #include <linux/sysdev.h> |
13 | #include <linux/bitops.h> | 13 | #include <linux/bitops.h> |
14 | #include <linux/acpi.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
14 | 17 | ||
15 | #include <asm/acpi.h> | ||
16 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
17 | #include <asm/system.h> | 19 | #include <asm/system.h> |
18 | #include <asm/io.h> | ||
19 | #include <asm/timer.h> | 20 | #include <asm/timer.h> |
20 | #include <asm/hw_irq.h> | 21 | #include <asm/hw_irq.h> |
21 | #include <asm/pgtable.h> | 22 | #include <asm/pgtable.h> |
22 | #include <asm/delay.h> | ||
23 | #include <asm/desc.h> | 23 | #include <asm/desc.h> |
24 | #include <asm/apic.h> | 24 | #include <asm/apic.h> |
25 | #include <asm/arch_hooks.h> | 25 | #include <asm/arch_hooks.h> |
@@ -323,7 +323,7 @@ void init_8259A(int auto_eoi) | |||
323 | outb_pic(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */ | 323 | outb_pic(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */ |
324 | 324 | ||
325 | /* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 on x86-64, | 325 | /* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 on x86-64, |
326 | to 0x20-0x27 on i386 */ | 326 | to 0x20-0x27 on i386 */ |
327 | outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR); | 327 | outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR); |
328 | 328 | ||
329 | /* 8259A-1 (the master) has a slave on IR2 */ | 329 | /* 8259A-1 (the master) has a slave on IR2 */ |
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 3639442aa7a4..1c4a1302536c 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
@@ -129,7 +129,6 @@ static struct irq_pin_list *get_one_free_irq_2_pin(int cpu) | |||
129 | node = cpu_to_node(cpu); | 129 | node = cpu_to_node(cpu); |
130 | 130 | ||
131 | pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node); | 131 | pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node); |
132 | printk(KERN_DEBUG " alloc irq_2_pin on cpu %d node %d\n", cpu, node); | ||
133 | 132 | ||
134 | return pin; | 133 | return pin; |
135 | } | 134 | } |
@@ -227,7 +226,6 @@ static struct irq_cfg *get_one_free_irq_cfg(int cpu) | |||
227 | cpumask_clear(cfg->old_domain); | 226 | cpumask_clear(cfg->old_domain); |
228 | } | 227 | } |
229 | } | 228 | } |
230 | printk(KERN_DEBUG " alloc irq_cfg on cpu %d node %d\n", cpu, node); | ||
231 | 229 | ||
232 | return cfg; | 230 | return cfg; |
233 | } | 231 | } |
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index 191914302744..b12208f4dfee 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c | |||
@@ -35,8 +35,8 @@ static void set_bitmap(unsigned long *bitmap, unsigned int base, | |||
35 | */ | 35 | */ |
36 | asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) | 36 | asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) |
37 | { | 37 | { |
38 | struct thread_struct * t = ¤t->thread; | 38 | struct thread_struct *t = ¤t->thread; |
39 | struct tss_struct * tss; | 39 | struct tss_struct *tss; |
40 | unsigned int i, max_long, bytes, bytes_updated; | 40 | unsigned int i, max_long, bytes, bytes_updated; |
41 | 41 | ||
42 | if ((from + num <= from) || (from + num > IO_BITMAP_BITS)) | 42 | if ((from + num <= from) || (from + num > IO_BITMAP_BITS)) |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index bce53e1352a0..3973e2df7f87 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -5,10 +5,10 @@ | |||
5 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
6 | #include <linux/kernel_stat.h> | 6 | #include <linux/kernel_stat.h> |
7 | #include <linux/seq_file.h> | 7 | #include <linux/seq_file.h> |
8 | #include <linux/smp.h> | ||
8 | 9 | ||
9 | #include <asm/apic.h> | 10 | #include <asm/apic.h> |
10 | #include <asm/io_apic.h> | 11 | #include <asm/io_apic.h> |
11 | #include <asm/smp.h> | ||
12 | #include <asm/irq.h> | 12 | #include <asm/irq.h> |
13 | 13 | ||
14 | atomic_t irq_err_count; | 14 | atomic_t irq_err_count; |
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 9dc5588f336a..74b9ff7341e9 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
@@ -15,9 +15,9 @@ | |||
15 | #include <linux/notifier.h> | 15 | #include <linux/notifier.h> |
16 | #include <linux/cpu.h> | 16 | #include <linux/cpu.h> |
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/uaccess.h> | ||
18 | 19 | ||
19 | #include <asm/apic.h> | 20 | #include <asm/apic.h> |
20 | #include <asm/uaccess.h> | ||
21 | 21 | ||
22 | DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); | 22 | DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); |
23 | EXPORT_PER_CPU_SYMBOL(irq_stat); | 23 | EXPORT_PER_CPU_SYMBOL(irq_stat); |
@@ -93,7 +93,7 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) | |||
93 | return 0; | 93 | return 0; |
94 | 94 | ||
95 | /* build the stack frame on the IRQ stack */ | 95 | /* build the stack frame on the IRQ stack */ |
96 | isp = (u32 *) ((char*)irqctx + sizeof(*irqctx)); | 96 | isp = (u32 *) ((char *)irqctx + sizeof(*irqctx)); |
97 | irqctx->tinfo.task = curctx->tinfo.task; | 97 | irqctx->tinfo.task = curctx->tinfo.task; |
98 | irqctx->tinfo.previous_esp = current_stack_pointer; | 98 | irqctx->tinfo.previous_esp = current_stack_pointer; |
99 | 99 | ||
@@ -137,7 +137,7 @@ void __cpuinit irq_ctx_init(int cpu) | |||
137 | 137 | ||
138 | hardirq_ctx[cpu] = irqctx; | 138 | hardirq_ctx[cpu] = irqctx; |
139 | 139 | ||
140 | irqctx = (union irq_ctx*) &softirq_stack[cpu*THREAD_SIZE]; | 140 | irqctx = (union irq_ctx *) &softirq_stack[cpu*THREAD_SIZE]; |
141 | irqctx->tinfo.task = NULL; | 141 | irqctx->tinfo.task = NULL; |
142 | irqctx->tinfo.exec_domain = NULL; | 142 | irqctx->tinfo.exec_domain = NULL; |
143 | irqctx->tinfo.cpu = cpu; | 143 | irqctx->tinfo.cpu = cpu; |
@@ -147,7 +147,7 @@ void __cpuinit irq_ctx_init(int cpu) | |||
147 | softirq_ctx[cpu] = irqctx; | 147 | softirq_ctx[cpu] = irqctx; |
148 | 148 | ||
149 | printk(KERN_DEBUG "CPU %u irqstacks, hard=%p soft=%p\n", | 149 | printk(KERN_DEBUG "CPU %u irqstacks, hard=%p soft=%p\n", |
150 | cpu,hardirq_ctx[cpu],softirq_ctx[cpu]); | 150 | cpu, hardirq_ctx[cpu], softirq_ctx[cpu]); |
151 | } | 151 | } |
152 | 152 | ||
153 | void irq_ctx_exit(int cpu) | 153 | void irq_ctx_exit(int cpu) |
@@ -174,7 +174,7 @@ asmlinkage void do_softirq(void) | |||
174 | irqctx->tinfo.previous_esp = current_stack_pointer; | 174 | irqctx->tinfo.previous_esp = current_stack_pointer; |
175 | 175 | ||
176 | /* build the stack frame on the softirq stack */ | 176 | /* build the stack frame on the softirq stack */ |
177 | isp = (u32*) ((char*)irqctx + sizeof(*irqctx)); | 177 | isp = (u32 *) ((char *)irqctx + sizeof(*irqctx)); |
178 | 178 | ||
179 | call_on_stack(__do_softirq, isp); | 179 | call_on_stack(__do_softirq, isp); |
180 | /* | 180 | /* |
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c index 6383d50f82ea..63c88e6ec025 100644 --- a/arch/x86/kernel/irq_64.c +++ b/arch/x86/kernel/irq_64.c | |||
@@ -14,10 +14,10 @@ | |||
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/ftrace.h> | 16 | #include <linux/ftrace.h> |
17 | #include <asm/uaccess.h> | 17 | #include <linux/uaccess.h> |
18 | #include <linux/smp.h> | ||
18 | #include <asm/io_apic.h> | 19 | #include <asm/io_apic.h> |
19 | #include <asm/idle.h> | 20 | #include <asm/idle.h> |
20 | #include <asm/smp.h> | ||
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Probabilistic stack overflow check: | 23 | * Probabilistic stack overflow check: |
@@ -142,18 +142,18 @@ extern void call_softirq(void); | |||
142 | 142 | ||
143 | asmlinkage void do_softirq(void) | 143 | asmlinkage void do_softirq(void) |
144 | { | 144 | { |
145 | __u32 pending; | 145 | __u32 pending; |
146 | unsigned long flags; | 146 | unsigned long flags; |
147 | 147 | ||
148 | if (in_interrupt()) | 148 | if (in_interrupt()) |
149 | return; | 149 | return; |
150 | 150 | ||
151 | local_irq_save(flags); | 151 | local_irq_save(flags); |
152 | pending = local_softirq_pending(); | 152 | pending = local_softirq_pending(); |
153 | /* Switch to interrupt stack */ | 153 | /* Switch to interrupt stack */ |
154 | if (pending) { | 154 | if (pending) { |
155 | call_softirq(); | 155 | call_softirq(); |
156 | WARN_ON_ONCE(softirq_count()); | 156 | WARN_ON_ONCE(softirq_count()); |
157 | } | 157 | } |
158 | local_irq_restore(flags); | 158 | local_irq_restore(flags); |
159 | } | 159 | } |
diff --git a/arch/x86/kernel/irqinit_32.c b/arch/x86/kernel/irqinit_32.c index 84723295f88a..1507ad4e674d 100644 --- a/arch/x86/kernel/irqinit_32.c +++ b/arch/x86/kernel/irqinit_32.c | |||
@@ -9,18 +9,18 @@ | |||
9 | #include <linux/kernel_stat.h> | 9 | #include <linux/kernel_stat.h> |
10 | #include <linux/sysdev.h> | 10 | #include <linux/sysdev.h> |
11 | #include <linux/bitops.h> | 11 | #include <linux/bitops.h> |
12 | #include <linux/io.h> | ||
13 | #include <linux/delay.h> | ||
12 | 14 | ||
13 | #include <asm/atomic.h> | 15 | #include <asm/atomic.h> |
14 | #include <asm/system.h> | 16 | #include <asm/system.h> |
15 | #include <asm/io.h> | ||
16 | #include <asm/timer.h> | 17 | #include <asm/timer.h> |
17 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
18 | #include <asm/delay.h> | ||
19 | #include <asm/desc.h> | 19 | #include <asm/desc.h> |
20 | #include <asm/apic.h> | 20 | #include <asm/apic.h> |
21 | #include <asm/arch_hooks.h> | 21 | #include <asm/arch_hooks.h> |
22 | #include <asm/i8259.h> | 22 | #include <asm/i8259.h> |
23 | 23 | #include <asm/traps.h> | |
24 | 24 | ||
25 | 25 | ||
26 | /* | 26 | /* |
@@ -34,12 +34,10 @@ | |||
34 | * leads to races. IBM designers who came up with it should | 34 | * leads to races. IBM designers who came up with it should |
35 | * be shot. | 35 | * be shot. |
36 | */ | 36 | */ |
37 | |||
38 | 37 | ||
39 | static irqreturn_t math_error_irq(int cpl, void *dev_id) | 38 | static irqreturn_t math_error_irq(int cpl, void *dev_id) |
40 | { | 39 | { |
41 | extern void math_error(void __user *); | 40 | outb(0, 0xF0); |
42 | outb(0,0xF0); | ||
43 | if (ignore_fpu_irq || !boot_cpu_data.hard_math) | 41 | if (ignore_fpu_irq || !boot_cpu_data.hard_math) |
44 | return IRQ_NONE; | 42 | return IRQ_NONE; |
45 | math_error((void __user *)get_irq_regs()->ip); | 43 | math_error((void __user *)get_irq_regs()->ip); |
@@ -56,7 +54,7 @@ static struct irqaction fpu_irq = { | |||
56 | .name = "fpu", | 54 | .name = "fpu", |
57 | }; | 55 | }; |
58 | 56 | ||
59 | void __init init_ISA_irqs (void) | 57 | void __init init_ISA_irqs(void) |
60 | { | 58 | { |
61 | int i; | 59 | int i; |
62 | 60 | ||
diff --git a/arch/x86/kernel/irqinit_64.c b/arch/x86/kernel/irqinit_64.c index 31ebfe38e96c..da481a1e3f30 100644 --- a/arch/x86/kernel/irqinit_64.c +++ b/arch/x86/kernel/irqinit_64.c | |||
@@ -11,14 +11,14 @@ | |||
11 | #include <linux/kernel_stat.h> | 11 | #include <linux/kernel_stat.h> |
12 | #include <linux/sysdev.h> | 12 | #include <linux/sysdev.h> |
13 | #include <linux/bitops.h> | 13 | #include <linux/bitops.h> |
14 | #include <linux/acpi.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
14 | 17 | ||
15 | #include <asm/acpi.h> | ||
16 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
17 | #include <asm/system.h> | 19 | #include <asm/system.h> |
18 | #include <asm/io.h> | ||
19 | #include <asm/hw_irq.h> | 20 | #include <asm/hw_irq.h> |
20 | #include <asm/pgtable.h> | 21 | #include <asm/pgtable.h> |
21 | #include <asm/delay.h> | ||
22 | #include <asm/desc.h> | 22 | #include <asm/desc.h> |
23 | #include <asm/apic.h> | 23 | #include <asm/apic.h> |
24 | #include <asm/i8259.h> | 24 | #include <asm/i8259.h> |
@@ -81,7 +81,7 @@ int vector_used_by_percpu_irq(unsigned int vector) | |||
81 | return 0; | 81 | return 0; |
82 | } | 82 | } |
83 | 83 | ||
84 | void __init init_ISA_irqs(void) | 84 | static void __init init_ISA_irqs(void) |
85 | { | 85 | { |
86 | int i; | 86 | int i; |
87 | 87 | ||
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index c5c5b8df1dbc..c0601c2848a1 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Intel Multiprocessor Specification 1.1 and 1.4 | 2 | * Intel Multiprocessor Specification 1.1 and 1.4 |
3 | * compliant MP-table parsing routines. | 3 | * compliant MP-table parsing routines. |
4 | * | 4 | * |
5 | * (c) 1995 Alan Cox, Building #3 <alan@redhat.com> | 5 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> |
6 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> | 6 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> |
7 | * (c) 2008 Alexey Starikovskiy <astarikovskiy@suse.de> | 7 | * (c) 2008 Alexey Starikovskiy <astarikovskiy@suse.de> |
8 | */ | 8 | */ |
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/acpi.h> | 17 | #include <linux/acpi.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
20 | #include <linux/acpi.h> | ||
21 | 20 | ||
22 | #include <asm/mtrr.h> | 21 | #include <asm/mtrr.h> |
23 | #include <asm/mpspec.h> | 22 | #include <asm/mpspec.h> |
@@ -49,12 +48,12 @@ static int __init mpf_checksum(unsigned char *mp, int len) | |||
49 | return sum & 0xFF; | 48 | return sum & 0xFF; |
50 | } | 49 | } |
51 | 50 | ||
52 | static void __init MP_processor_info(struct mpc_config_processor *m) | 51 | static void __init MP_processor_info(struct mpc_cpu *m) |
53 | { | 52 | { |
54 | int apicid; | 53 | int apicid; |
55 | char *bootup_cpu = ""; | 54 | char *bootup_cpu = ""; |
56 | 55 | ||
57 | if (!(m->mpc_cpuflag & CPU_ENABLED)) { | 56 | if (!(m->cpuflag & CPU_ENABLED)) { |
58 | disabled_cpus++; | 57 | disabled_cpus++; |
59 | return; | 58 | return; |
60 | } | 59 | } |
@@ -62,54 +61,54 @@ static void __init MP_processor_info(struct mpc_config_processor *m) | |||
62 | if (x86_quirks->mpc_apic_id) | 61 | if (x86_quirks->mpc_apic_id) |
63 | apicid = x86_quirks->mpc_apic_id(m); | 62 | apicid = x86_quirks->mpc_apic_id(m); |
64 | else | 63 | else |
65 | apicid = m->mpc_apicid; | 64 | apicid = m->apicid; |
66 | 65 | ||
67 | if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { | 66 | if (m->cpuflag & CPU_BOOTPROCESSOR) { |
68 | bootup_cpu = " (Bootup-CPU)"; | 67 | bootup_cpu = " (Bootup-CPU)"; |
69 | boot_cpu_physical_apicid = m->mpc_apicid; | 68 | boot_cpu_physical_apicid = m->apicid; |
70 | } | 69 | } |
71 | 70 | ||
72 | printk(KERN_INFO "Processor #%d%s\n", m->mpc_apicid, bootup_cpu); | 71 | printk(KERN_INFO "Processor #%d%s\n", m->apicid, bootup_cpu); |
73 | generic_processor_info(apicid, m->mpc_apicver); | 72 | generic_processor_info(apicid, m->apicver); |
74 | } | 73 | } |
75 | 74 | ||
76 | #ifdef CONFIG_X86_IO_APIC | 75 | #ifdef CONFIG_X86_IO_APIC |
77 | static void __init MP_bus_info(struct mpc_config_bus *m) | 76 | static void __init MP_bus_info(struct mpc_bus *m) |
78 | { | 77 | { |
79 | char str[7]; | 78 | char str[7]; |
80 | memcpy(str, m->mpc_bustype, 6); | 79 | memcpy(str, m->bustype, 6); |
81 | str[6] = 0; | 80 | str[6] = 0; |
82 | 81 | ||
83 | if (x86_quirks->mpc_oem_bus_info) | 82 | if (x86_quirks->mpc_oem_bus_info) |
84 | x86_quirks->mpc_oem_bus_info(m, str); | 83 | x86_quirks->mpc_oem_bus_info(m, str); |
85 | else | 84 | else |
86 | apic_printk(APIC_VERBOSE, "Bus #%d is %s\n", m->mpc_busid, str); | 85 | apic_printk(APIC_VERBOSE, "Bus #%d is %s\n", m->busid, str); |
87 | 86 | ||
88 | #if MAX_MP_BUSSES < 256 | 87 | #if MAX_MP_BUSSES < 256 |
89 | if (m->mpc_busid >= MAX_MP_BUSSES) { | 88 | if (m->busid >= MAX_MP_BUSSES) { |
90 | printk(KERN_WARNING "MP table busid value (%d) for bustype %s " | 89 | printk(KERN_WARNING "MP table busid value (%d) for bustype %s " |
91 | " is too large, max. supported is %d\n", | 90 | " is too large, max. supported is %d\n", |
92 | m->mpc_busid, str, MAX_MP_BUSSES - 1); | 91 | m->busid, str, MAX_MP_BUSSES - 1); |
93 | return; | 92 | return; |
94 | } | 93 | } |
95 | #endif | 94 | #endif |
96 | 95 | ||
97 | if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) { | 96 | if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) { |
98 | set_bit(m->mpc_busid, mp_bus_not_pci); | 97 | set_bit(m->busid, mp_bus_not_pci); |
99 | #if defined(CONFIG_EISA) || defined(CONFIG_MCA) | 98 | #if defined(CONFIG_EISA) || defined(CONFIG_MCA) |
100 | mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA; | 99 | mp_bus_id_to_type[m->busid] = MP_BUS_ISA; |
101 | #endif | 100 | #endif |
102 | } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) { | 101 | } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) { |
103 | if (x86_quirks->mpc_oem_pci_bus) | 102 | if (x86_quirks->mpc_oem_pci_bus) |
104 | x86_quirks->mpc_oem_pci_bus(m); | 103 | x86_quirks->mpc_oem_pci_bus(m); |
105 | 104 | ||
106 | clear_bit(m->mpc_busid, mp_bus_not_pci); | 105 | clear_bit(m->busid, mp_bus_not_pci); |
107 | #if defined(CONFIG_EISA) || defined(CONFIG_MCA) | 106 | #if defined(CONFIG_EISA) || defined(CONFIG_MCA) |
108 | mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI; | 107 | mp_bus_id_to_type[m->busid] = MP_BUS_PCI; |
109 | } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA) - 1) == 0) { | 108 | } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA) - 1) == 0) { |
110 | mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA; | 109 | mp_bus_id_to_type[m->busid] = MP_BUS_EISA; |
111 | } else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA) - 1) == 0) { | 110 | } else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA) - 1) == 0) { |
112 | mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA; | 111 | mp_bus_id_to_type[m->busid] = MP_BUS_MCA; |
113 | #endif | 112 | #endif |
114 | } else | 113 | } else |
115 | printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); | 114 | printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); |
@@ -133,32 +132,31 @@ static int bad_ioapic(unsigned long address) | |||
133 | return 0; | 132 | return 0; |
134 | } | 133 | } |
135 | 134 | ||
136 | static void __init MP_ioapic_info(struct mpc_config_ioapic *m) | 135 | static void __init MP_ioapic_info(struct mpc_ioapic *m) |
137 | { | 136 | { |
138 | if (!(m->mpc_flags & MPC_APIC_USABLE)) | 137 | if (!(m->flags & MPC_APIC_USABLE)) |
139 | return; | 138 | return; |
140 | 139 | ||
141 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", | 140 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", |
142 | m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr); | 141 | m->apicid, m->apicver, m->apicaddr); |
143 | 142 | ||
144 | if (bad_ioapic(m->mpc_apicaddr)) | 143 | if (bad_ioapic(m->apicaddr)) |
145 | return; | 144 | return; |
146 | 145 | ||
147 | mp_ioapics[nr_ioapics].mp_apicaddr = m->mpc_apicaddr; | 146 | mp_ioapics[nr_ioapics].mp_apicaddr = m->apicaddr; |
148 | mp_ioapics[nr_ioapics].mp_apicid = m->mpc_apicid; | 147 | mp_ioapics[nr_ioapics].mp_apicid = m->apicid; |
149 | mp_ioapics[nr_ioapics].mp_type = m->mpc_type; | 148 | mp_ioapics[nr_ioapics].mp_type = m->type; |
150 | mp_ioapics[nr_ioapics].mp_apicver = m->mpc_apicver; | 149 | mp_ioapics[nr_ioapics].mp_apicver = m->apicver; |
151 | mp_ioapics[nr_ioapics].mp_flags = m->mpc_flags; | 150 | mp_ioapics[nr_ioapics].mp_flags = m->flags; |
152 | nr_ioapics++; | 151 | nr_ioapics++; |
153 | } | 152 | } |
154 | 153 | ||
155 | static void print_MP_intsrc_info(struct mpc_config_intsrc *m) | 154 | static void print_MP_intsrc_info(struct mpc_intsrc *m) |
156 | { | 155 | { |
157 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," | 156 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," |
158 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | 157 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", |
159 | m->mpc_irqtype, m->mpc_irqflag & 3, | 158 | m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus, |
160 | (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus, | 159 | m->srcbusirq, m->dstapic, m->dstirq); |
161 | m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq); | ||
162 | } | 160 | } |
163 | 161 | ||
164 | static void __init print_mp_irq_info(struct mp_config_intsrc *mp_irq) | 162 | static void __init print_mp_irq_info(struct mp_config_intsrc *mp_irq) |
@@ -170,52 +168,52 @@ static void __init print_mp_irq_info(struct mp_config_intsrc *mp_irq) | |||
170 | mp_irq->mp_srcbusirq, mp_irq->mp_dstapic, mp_irq->mp_dstirq); | 168 | mp_irq->mp_srcbusirq, mp_irq->mp_dstapic, mp_irq->mp_dstirq); |
171 | } | 169 | } |
172 | 170 | ||
173 | static void __init assign_to_mp_irq(struct mpc_config_intsrc *m, | 171 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, |
174 | struct mp_config_intsrc *mp_irq) | 172 | struct mp_config_intsrc *mp_irq) |
175 | { | 173 | { |
176 | mp_irq->mp_dstapic = m->mpc_dstapic; | 174 | mp_irq->mp_dstapic = m->dstapic; |
177 | mp_irq->mp_type = m->mpc_type; | 175 | mp_irq->mp_type = m->type; |
178 | mp_irq->mp_irqtype = m->mpc_irqtype; | 176 | mp_irq->mp_irqtype = m->irqtype; |
179 | mp_irq->mp_irqflag = m->mpc_irqflag; | 177 | mp_irq->mp_irqflag = m->irqflag; |
180 | mp_irq->mp_srcbus = m->mpc_srcbus; | 178 | mp_irq->mp_srcbus = m->srcbus; |
181 | mp_irq->mp_srcbusirq = m->mpc_srcbusirq; | 179 | mp_irq->mp_srcbusirq = m->srcbusirq; |
182 | mp_irq->mp_dstirq = m->mpc_dstirq; | 180 | mp_irq->mp_dstirq = m->dstirq; |
183 | } | 181 | } |
184 | 182 | ||
185 | static void __init assign_to_mpc_intsrc(struct mp_config_intsrc *mp_irq, | 183 | static void __init assign_to_mpc_intsrc(struct mp_config_intsrc *mp_irq, |
186 | struct mpc_config_intsrc *m) | 184 | struct mpc_intsrc *m) |
187 | { | 185 | { |
188 | m->mpc_dstapic = mp_irq->mp_dstapic; | 186 | m->dstapic = mp_irq->mp_dstapic; |
189 | m->mpc_type = mp_irq->mp_type; | 187 | m->type = mp_irq->mp_type; |
190 | m->mpc_irqtype = mp_irq->mp_irqtype; | 188 | m->irqtype = mp_irq->mp_irqtype; |
191 | m->mpc_irqflag = mp_irq->mp_irqflag; | 189 | m->irqflag = mp_irq->mp_irqflag; |
192 | m->mpc_srcbus = mp_irq->mp_srcbus; | 190 | m->srcbus = mp_irq->mp_srcbus; |
193 | m->mpc_srcbusirq = mp_irq->mp_srcbusirq; | 191 | m->srcbusirq = mp_irq->mp_srcbusirq; |
194 | m->mpc_dstirq = mp_irq->mp_dstirq; | 192 | m->dstirq = mp_irq->mp_dstirq; |
195 | } | 193 | } |
196 | 194 | ||
197 | static int __init mp_irq_mpc_intsrc_cmp(struct mp_config_intsrc *mp_irq, | 195 | static int __init mp_irq_mpc_intsrc_cmp(struct mp_config_intsrc *mp_irq, |
198 | struct mpc_config_intsrc *m) | 196 | struct mpc_intsrc *m) |
199 | { | 197 | { |
200 | if (mp_irq->mp_dstapic != m->mpc_dstapic) | 198 | if (mp_irq->mp_dstapic != m->dstapic) |
201 | return 1; | 199 | return 1; |
202 | if (mp_irq->mp_type != m->mpc_type) | 200 | if (mp_irq->mp_type != m->type) |
203 | return 2; | 201 | return 2; |
204 | if (mp_irq->mp_irqtype != m->mpc_irqtype) | 202 | if (mp_irq->mp_irqtype != m->irqtype) |
205 | return 3; | 203 | return 3; |
206 | if (mp_irq->mp_irqflag != m->mpc_irqflag) | 204 | if (mp_irq->mp_irqflag != m->irqflag) |
207 | return 4; | 205 | return 4; |
208 | if (mp_irq->mp_srcbus != m->mpc_srcbus) | 206 | if (mp_irq->mp_srcbus != m->srcbus) |
209 | return 5; | 207 | return 5; |
210 | if (mp_irq->mp_srcbusirq != m->mpc_srcbusirq) | 208 | if (mp_irq->mp_srcbusirq != m->srcbusirq) |
211 | return 6; | 209 | return 6; |
212 | if (mp_irq->mp_dstirq != m->mpc_dstirq) | 210 | if (mp_irq->mp_dstirq != m->dstirq) |
213 | return 7; | 211 | return 7; |
214 | 212 | ||
215 | return 0; | 213 | return 0; |
216 | } | 214 | } |
217 | 215 | ||
218 | static void __init MP_intsrc_info(struct mpc_config_intsrc *m) | 216 | static void __init MP_intsrc_info(struct mpc_intsrc *m) |
219 | { | 217 | { |
220 | int i; | 218 | int i; |
221 | 219 | ||
@@ -233,57 +231,55 @@ static void __init MP_intsrc_info(struct mpc_config_intsrc *m) | |||
233 | 231 | ||
234 | #endif | 232 | #endif |
235 | 233 | ||
236 | static void __init MP_lintsrc_info(struct mpc_config_lintsrc *m) | 234 | static void __init MP_lintsrc_info(struct mpc_lintsrc *m) |
237 | { | 235 | { |
238 | apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x," | 236 | apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x," |
239 | " IRQ %02x, APIC ID %x, APIC LINT %02x\n", | 237 | " IRQ %02x, APIC ID %x, APIC LINT %02x\n", |
240 | m->mpc_irqtype, m->mpc_irqflag & 3, | 238 | m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbusid, |
241 | (m->mpc_irqflag >> 2) & 3, m->mpc_srcbusid, | 239 | m->srcbusirq, m->destapic, m->destapiclint); |
242 | m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint); | ||
243 | } | 240 | } |
244 | 241 | ||
245 | /* | 242 | /* |
246 | * Read/parse the MPC | 243 | * Read/parse the MPC |
247 | */ | 244 | */ |
248 | 245 | ||
249 | static int __init smp_check_mpc(struct mp_config_table *mpc, char *oem, | 246 | static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str) |
250 | char *str) | ||
251 | { | 247 | { |
252 | 248 | ||
253 | if (memcmp(mpc->mpc_signature, MPC_SIGNATURE, 4)) { | 249 | if (memcmp(mpc->signature, MPC_SIGNATURE, 4)) { |
254 | printk(KERN_ERR "MPTABLE: bad signature [%c%c%c%c]!\n", | 250 | printk(KERN_ERR "MPTABLE: bad signature [%c%c%c%c]!\n", |
255 | mpc->mpc_signature[0], mpc->mpc_signature[1], | 251 | mpc->signature[0], mpc->signature[1], |
256 | mpc->mpc_signature[2], mpc->mpc_signature[3]); | 252 | mpc->signature[2], mpc->signature[3]); |
257 | return 0; | 253 | return 0; |
258 | } | 254 | } |
259 | if (mpf_checksum((unsigned char *)mpc, mpc->mpc_length)) { | 255 | if (mpf_checksum((unsigned char *)mpc, mpc->length)) { |
260 | printk(KERN_ERR "MPTABLE: checksum error!\n"); | 256 | printk(KERN_ERR "MPTABLE: checksum error!\n"); |
261 | return 0; | 257 | return 0; |
262 | } | 258 | } |
263 | if (mpc->mpc_spec != 0x01 && mpc->mpc_spec != 0x04) { | 259 | if (mpc->spec != 0x01 && mpc->spec != 0x04) { |
264 | printk(KERN_ERR "MPTABLE: bad table version (%d)!!\n", | 260 | printk(KERN_ERR "MPTABLE: bad table version (%d)!!\n", |
265 | mpc->mpc_spec); | 261 | mpc->spec); |
266 | return 0; | 262 | return 0; |
267 | } | 263 | } |
268 | if (!mpc->mpc_lapic) { | 264 | if (!mpc->lapic) { |
269 | printk(KERN_ERR "MPTABLE: null local APIC address!\n"); | 265 | printk(KERN_ERR "MPTABLE: null local APIC address!\n"); |
270 | return 0; | 266 | return 0; |
271 | } | 267 | } |
272 | memcpy(oem, mpc->mpc_oem, 8); | 268 | memcpy(oem, mpc->oem, 8); |
273 | oem[8] = 0; | 269 | oem[8] = 0; |
274 | printk(KERN_INFO "MPTABLE: OEM ID: %s\n", oem); | 270 | printk(KERN_INFO "MPTABLE: OEM ID: %s\n", oem); |
275 | 271 | ||
276 | memcpy(str, mpc->mpc_productid, 12); | 272 | memcpy(str, mpc->productid, 12); |
277 | str[12] = 0; | 273 | str[12] = 0; |
278 | 274 | ||
279 | printk(KERN_INFO "MPTABLE: Product ID: %s\n", str); | 275 | printk(KERN_INFO "MPTABLE: Product ID: %s\n", str); |
280 | 276 | ||
281 | printk(KERN_INFO "MPTABLE: APIC at: 0x%X\n", mpc->mpc_lapic); | 277 | printk(KERN_INFO "MPTABLE: APIC at: 0x%X\n", mpc->lapic); |
282 | 278 | ||
283 | return 1; | 279 | return 1; |
284 | } | 280 | } |
285 | 281 | ||
286 | static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | 282 | static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) |
287 | { | 283 | { |
288 | char str[16]; | 284 | char str[16]; |
289 | char oem[10]; | 285 | char oem[10]; |
@@ -308,14 +304,14 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | |||
308 | #endif | 304 | #endif |
309 | /* save the local APIC address, it might be non-default */ | 305 | /* save the local APIC address, it might be non-default */ |
310 | if (!acpi_lapic) | 306 | if (!acpi_lapic) |
311 | mp_lapic_addr = mpc->mpc_lapic; | 307 | mp_lapic_addr = mpc->lapic; |
312 | 308 | ||
313 | if (early) | 309 | if (early) |
314 | return 1; | 310 | return 1; |
315 | 311 | ||
316 | if (mpc->mpc_oemptr && x86_quirks->smp_read_mpc_oem) { | 312 | if (mpc->oemptr && x86_quirks->smp_read_mpc_oem) { |
317 | struct mp_config_oemtable *oem_table = (struct mp_config_oemtable *)(unsigned long)mpc->mpc_oemptr; | 313 | struct mpc_oemtable *oem_table = (void *)(long)mpc->oemptr; |
318 | x86_quirks->smp_read_mpc_oem(oem_table, mpc->mpc_oemsize); | 314 | x86_quirks->smp_read_mpc_oem(oem_table, mpc->oemsize); |
319 | } | 315 | } |
320 | 316 | ||
321 | /* | 317 | /* |
@@ -324,12 +320,11 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | |||
324 | if (x86_quirks->mpc_record) | 320 | if (x86_quirks->mpc_record) |
325 | *x86_quirks->mpc_record = 0; | 321 | *x86_quirks->mpc_record = 0; |
326 | 322 | ||
327 | while (count < mpc->mpc_length) { | 323 | while (count < mpc->length) { |
328 | switch (*mpt) { | 324 | switch (*mpt) { |
329 | case MP_PROCESSOR: | 325 | case MP_PROCESSOR: |
330 | { | 326 | { |
331 | struct mpc_config_processor *m = | 327 | struct mpc_cpu *m = (struct mpc_cpu *)mpt; |
332 | (struct mpc_config_processor *)mpt; | ||
333 | /* ACPI may have already provided this data */ | 328 | /* ACPI may have already provided this data */ |
334 | if (!acpi_lapic) | 329 | if (!acpi_lapic) |
335 | MP_processor_info(m); | 330 | MP_processor_info(m); |
@@ -339,8 +334,7 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | |||
339 | } | 334 | } |
340 | case MP_BUS: | 335 | case MP_BUS: |
341 | { | 336 | { |
342 | struct mpc_config_bus *m = | 337 | struct mpc_bus *m = (struct mpc_bus *)mpt; |
343 | (struct mpc_config_bus *)mpt; | ||
344 | #ifdef CONFIG_X86_IO_APIC | 338 | #ifdef CONFIG_X86_IO_APIC |
345 | MP_bus_info(m); | 339 | MP_bus_info(m); |
346 | #endif | 340 | #endif |
@@ -351,30 +345,28 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | |||
351 | case MP_IOAPIC: | 345 | case MP_IOAPIC: |
352 | { | 346 | { |
353 | #ifdef CONFIG_X86_IO_APIC | 347 | #ifdef CONFIG_X86_IO_APIC |
354 | struct mpc_config_ioapic *m = | 348 | struct mpc_ioapic *m = (struct mpc_ioapic *)mpt; |
355 | (struct mpc_config_ioapic *)mpt; | ||
356 | MP_ioapic_info(m); | 349 | MP_ioapic_info(m); |
357 | #endif | 350 | #endif |
358 | mpt += sizeof(struct mpc_config_ioapic); | 351 | mpt += sizeof(struct mpc_ioapic); |
359 | count += sizeof(struct mpc_config_ioapic); | 352 | count += sizeof(struct mpc_ioapic); |
360 | break; | 353 | break; |
361 | } | 354 | } |
362 | case MP_INTSRC: | 355 | case MP_INTSRC: |
363 | { | 356 | { |
364 | #ifdef CONFIG_X86_IO_APIC | 357 | #ifdef CONFIG_X86_IO_APIC |
365 | struct mpc_config_intsrc *m = | 358 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; |
366 | (struct mpc_config_intsrc *)mpt; | ||
367 | 359 | ||
368 | MP_intsrc_info(m); | 360 | MP_intsrc_info(m); |
369 | #endif | 361 | #endif |
370 | mpt += sizeof(struct mpc_config_intsrc); | 362 | mpt += sizeof(struct mpc_intsrc); |
371 | count += sizeof(struct mpc_config_intsrc); | 363 | count += sizeof(struct mpc_intsrc); |
372 | break; | 364 | break; |
373 | } | 365 | } |
374 | case MP_LINTSRC: | 366 | case MP_LINTSRC: |
375 | { | 367 | { |
376 | struct mpc_config_lintsrc *m = | 368 | struct mpc_lintsrc *m = |
377 | (struct mpc_config_lintsrc *)mpt; | 369 | (struct mpc_lintsrc *)mpt; |
378 | MP_lintsrc_info(m); | 370 | MP_lintsrc_info(m); |
379 | mpt += sizeof(*m); | 371 | mpt += sizeof(*m); |
380 | count += sizeof(*m); | 372 | count += sizeof(*m); |
@@ -385,8 +377,8 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | |||
385 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); | 377 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); |
386 | printk(KERN_ERR "type %x\n", *mpt); | 378 | printk(KERN_ERR "type %x\n", *mpt); |
387 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | 379 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, |
388 | 1, mpc, mpc->mpc_length, 1); | 380 | 1, mpc, mpc->length, 1); |
389 | count = mpc->mpc_length; | 381 | count = mpc->length; |
390 | break; | 382 | break; |
391 | } | 383 | } |
392 | if (x86_quirks->mpc_record) | 384 | if (x86_quirks->mpc_record) |
@@ -417,16 +409,16 @@ static int __init ELCR_trigger(unsigned int irq) | |||
417 | 409 | ||
418 | static void __init construct_default_ioirq_mptable(int mpc_default_type) | 410 | static void __init construct_default_ioirq_mptable(int mpc_default_type) |
419 | { | 411 | { |
420 | struct mpc_config_intsrc intsrc; | 412 | struct mpc_intsrc intsrc; |
421 | int i; | 413 | int i; |
422 | int ELCR_fallback = 0; | 414 | int ELCR_fallback = 0; |
423 | 415 | ||
424 | intsrc.mpc_type = MP_INTSRC; | 416 | intsrc.type = MP_INTSRC; |
425 | intsrc.mpc_irqflag = 0; /* conforming */ | 417 | intsrc.irqflag = 0; /* conforming */ |
426 | intsrc.mpc_srcbus = 0; | 418 | intsrc.srcbus = 0; |
427 | intsrc.mpc_dstapic = mp_ioapics[0].mp_apicid; | 419 | intsrc.dstapic = mp_ioapics[0].mp_apicid; |
428 | 420 | ||
429 | intsrc.mpc_irqtype = mp_INT; | 421 | intsrc.irqtype = mp_INT; |
430 | 422 | ||
431 | /* | 423 | /* |
432 | * If true, we have an ISA/PCI system with no IRQ entries | 424 | * If true, we have an ISA/PCI system with no IRQ entries |
@@ -469,30 +461,30 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
469 | * irqflag field (level sensitive, active high polarity). | 461 | * irqflag field (level sensitive, active high polarity). |
470 | */ | 462 | */ |
471 | if (ELCR_trigger(i)) | 463 | if (ELCR_trigger(i)) |
472 | intsrc.mpc_irqflag = 13; | 464 | intsrc.irqflag = 13; |
473 | else | 465 | else |
474 | intsrc.mpc_irqflag = 0; | 466 | intsrc.irqflag = 0; |
475 | } | 467 | } |
476 | 468 | ||
477 | intsrc.mpc_srcbusirq = i; | 469 | intsrc.srcbusirq = i; |
478 | intsrc.mpc_dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ | 470 | intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ |
479 | MP_intsrc_info(&intsrc); | 471 | MP_intsrc_info(&intsrc); |
480 | } | 472 | } |
481 | 473 | ||
482 | intsrc.mpc_irqtype = mp_ExtINT; | 474 | intsrc.irqtype = mp_ExtINT; |
483 | intsrc.mpc_srcbusirq = 0; | 475 | intsrc.srcbusirq = 0; |
484 | intsrc.mpc_dstirq = 0; /* 8259A to INTIN0 */ | 476 | intsrc.dstirq = 0; /* 8259A to INTIN0 */ |
485 | MP_intsrc_info(&intsrc); | 477 | MP_intsrc_info(&intsrc); |
486 | } | 478 | } |
487 | 479 | ||
488 | 480 | ||
489 | static void __init construct_ioapic_table(int mpc_default_type) | 481 | static void __init construct_ioapic_table(int mpc_default_type) |
490 | { | 482 | { |
491 | struct mpc_config_ioapic ioapic; | 483 | struct mpc_ioapic ioapic; |
492 | struct mpc_config_bus bus; | 484 | struct mpc_bus bus; |
493 | 485 | ||
494 | bus.mpc_type = MP_BUS; | 486 | bus.type = MP_BUS; |
495 | bus.mpc_busid = 0; | 487 | bus.busid = 0; |
496 | switch (mpc_default_type) { | 488 | switch (mpc_default_type) { |
497 | default: | 489 | default: |
498 | printk(KERN_ERR "???\nUnknown standard configuration %d\n", | 490 | printk(KERN_ERR "???\nUnknown standard configuration %d\n", |
@@ -500,29 +492,29 @@ static void __init construct_ioapic_table(int mpc_default_type) | |||
500 | /* fall through */ | 492 | /* fall through */ |
501 | case 1: | 493 | case 1: |
502 | case 5: | 494 | case 5: |
503 | memcpy(bus.mpc_bustype, "ISA ", 6); | 495 | memcpy(bus.bustype, "ISA ", 6); |
504 | break; | 496 | break; |
505 | case 2: | 497 | case 2: |
506 | case 6: | 498 | case 6: |
507 | case 3: | 499 | case 3: |
508 | memcpy(bus.mpc_bustype, "EISA ", 6); | 500 | memcpy(bus.bustype, "EISA ", 6); |
509 | break; | 501 | break; |
510 | case 4: | 502 | case 4: |
511 | case 7: | 503 | case 7: |
512 | memcpy(bus.mpc_bustype, "MCA ", 6); | 504 | memcpy(bus.bustype, "MCA ", 6); |
513 | } | 505 | } |
514 | MP_bus_info(&bus); | 506 | MP_bus_info(&bus); |
515 | if (mpc_default_type > 4) { | 507 | if (mpc_default_type > 4) { |
516 | bus.mpc_busid = 1; | 508 | bus.busid = 1; |
517 | memcpy(bus.mpc_bustype, "PCI ", 6); | 509 | memcpy(bus.bustype, "PCI ", 6); |
518 | MP_bus_info(&bus); | 510 | MP_bus_info(&bus); |
519 | } | 511 | } |
520 | 512 | ||
521 | ioapic.mpc_type = MP_IOAPIC; | 513 | ioapic.type = MP_IOAPIC; |
522 | ioapic.mpc_apicid = 2; | 514 | ioapic.apicid = 2; |
523 | ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01; | 515 | ioapic.apicver = mpc_default_type > 4 ? 0x10 : 0x01; |
524 | ioapic.mpc_flags = MPC_APIC_USABLE; | 516 | ioapic.flags = MPC_APIC_USABLE; |
525 | ioapic.mpc_apicaddr = 0xFEC00000; | 517 | ioapic.apicaddr = 0xFEC00000; |
526 | MP_ioapic_info(&ioapic); | 518 | MP_ioapic_info(&ioapic); |
527 | 519 | ||
528 | /* | 520 | /* |
@@ -536,8 +528,8 @@ static inline void __init construct_ioapic_table(int mpc_default_type) { } | |||
536 | 528 | ||
537 | static inline void __init construct_default_ISA_mptable(int mpc_default_type) | 529 | static inline void __init construct_default_ISA_mptable(int mpc_default_type) |
538 | { | 530 | { |
539 | struct mpc_config_processor processor; | 531 | struct mpc_cpu processor; |
540 | struct mpc_config_lintsrc lintsrc; | 532 | struct mpc_lintsrc lintsrc; |
541 | int linttypes[2] = { mp_ExtINT, mp_NMI }; | 533 | int linttypes[2] = { mp_ExtINT, mp_NMI }; |
542 | int i; | 534 | int i; |
543 | 535 | ||
@@ -549,30 +541,30 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
549 | /* | 541 | /* |
550 | * 2 CPUs, numbered 0 & 1. | 542 | * 2 CPUs, numbered 0 & 1. |
551 | */ | 543 | */ |
552 | processor.mpc_type = MP_PROCESSOR; | 544 | processor.type = MP_PROCESSOR; |
553 | /* Either an integrated APIC or a discrete 82489DX. */ | 545 | /* Either an integrated APIC or a discrete 82489DX. */ |
554 | processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01; | 546 | processor.apicver = mpc_default_type > 4 ? 0x10 : 0x01; |
555 | processor.mpc_cpuflag = CPU_ENABLED; | 547 | processor.cpuflag = CPU_ENABLED; |
556 | processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) | | 548 | processor.cpufeature = (boot_cpu_data.x86 << 8) | |
557 | (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask; | 549 | (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask; |
558 | processor.mpc_featureflag = boot_cpu_data.x86_capability[0]; | 550 | processor.featureflag = boot_cpu_data.x86_capability[0]; |
559 | processor.mpc_reserved[0] = 0; | 551 | processor.reserved[0] = 0; |
560 | processor.mpc_reserved[1] = 0; | 552 | processor.reserved[1] = 0; |
561 | for (i = 0; i < 2; i++) { | 553 | for (i = 0; i < 2; i++) { |
562 | processor.mpc_apicid = i; | 554 | processor.apicid = i; |
563 | MP_processor_info(&processor); | 555 | MP_processor_info(&processor); |
564 | } | 556 | } |
565 | 557 | ||
566 | construct_ioapic_table(mpc_default_type); | 558 | construct_ioapic_table(mpc_default_type); |
567 | 559 | ||
568 | lintsrc.mpc_type = MP_LINTSRC; | 560 | lintsrc.type = MP_LINTSRC; |
569 | lintsrc.mpc_irqflag = 0; /* conforming */ | 561 | lintsrc.irqflag = 0; /* conforming */ |
570 | lintsrc.mpc_srcbusid = 0; | 562 | lintsrc.srcbusid = 0; |
571 | lintsrc.mpc_srcbusirq = 0; | 563 | lintsrc.srcbusirq = 0; |
572 | lintsrc.mpc_destapic = MP_APIC_ALL; | 564 | lintsrc.destapic = MP_APIC_ALL; |
573 | for (i = 0; i < 2; i++) { | 565 | for (i = 0; i < 2; i++) { |
574 | lintsrc.mpc_irqtype = linttypes[i]; | 566 | lintsrc.irqtype = linttypes[i]; |
575 | lintsrc.mpc_destapiclint = i; | 567 | lintsrc.destapiclint = i; |
576 | MP_lintsrc_info(&lintsrc); | 568 | MP_lintsrc_info(&lintsrc); |
577 | } | 569 | } |
578 | } | 570 | } |
@@ -657,15 +649,15 @@ static void __init __get_smp_config(unsigned int early) | |||
657 | * ISA defaults and hope it will work. | 649 | * ISA defaults and hope it will work. |
658 | */ | 650 | */ |
659 | if (!mp_irq_entries) { | 651 | if (!mp_irq_entries) { |
660 | struct mpc_config_bus bus; | 652 | struct mpc_bus bus; |
661 | 653 | ||
662 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " | 654 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " |
663 | "using default mptable. " | 655 | "using default mptable. " |
664 | "(tell your hw vendor)\n"); | 656 | "(tell your hw vendor)\n"); |
665 | 657 | ||
666 | bus.mpc_type = MP_BUS; | 658 | bus.type = MP_BUS; |
667 | bus.mpc_busid = 0; | 659 | bus.busid = 0; |
668 | memcpy(bus.mpc_bustype, "ISA ", 6); | 660 | memcpy(bus.bustype, "ISA ", 6); |
669 | MP_bus_info(&bus); | 661 | MP_bus_info(&bus); |
670 | 662 | ||
671 | construct_default_ioirq_mptable(0); | 663 | construct_default_ioirq_mptable(0); |
@@ -803,14 +795,14 @@ void __init find_smp_config(void) | |||
803 | #ifdef CONFIG_X86_IO_APIC | 795 | #ifdef CONFIG_X86_IO_APIC |
804 | static u8 __initdata irq_used[MAX_IRQ_SOURCES]; | 796 | static u8 __initdata irq_used[MAX_IRQ_SOURCES]; |
805 | 797 | ||
806 | static int __init get_MP_intsrc_index(struct mpc_config_intsrc *m) | 798 | static int __init get_MP_intsrc_index(struct mpc_intsrc *m) |
807 | { | 799 | { |
808 | int i; | 800 | int i; |
809 | 801 | ||
810 | if (m->mpc_irqtype != mp_INT) | 802 | if (m->irqtype != mp_INT) |
811 | return 0; | 803 | return 0; |
812 | 804 | ||
813 | if (m->mpc_irqflag != 0x0f) | 805 | if (m->irqflag != 0x0f) |
814 | return 0; | 806 | return 0; |
815 | 807 | ||
816 | /* not legacy */ | 808 | /* not legacy */ |
@@ -822,9 +814,9 @@ static int __init get_MP_intsrc_index(struct mpc_config_intsrc *m) | |||
822 | if (mp_irqs[i].mp_irqflag != 0x0f) | 814 | if (mp_irqs[i].mp_irqflag != 0x0f) |
823 | continue; | 815 | continue; |
824 | 816 | ||
825 | if (mp_irqs[i].mp_srcbus != m->mpc_srcbus) | 817 | if (mp_irqs[i].mp_srcbus != m->srcbus) |
826 | continue; | 818 | continue; |
827 | if (mp_irqs[i].mp_srcbusirq != m->mpc_srcbusirq) | 819 | if (mp_irqs[i].mp_srcbusirq != m->srcbusirq) |
828 | continue; | 820 | continue; |
829 | if (irq_used[i]) { | 821 | if (irq_used[i]) { |
830 | /* already claimed */ | 822 | /* already claimed */ |
@@ -840,10 +832,10 @@ static int __init get_MP_intsrc_index(struct mpc_config_intsrc *m) | |||
840 | 832 | ||
841 | #define SPARE_SLOT_NUM 20 | 833 | #define SPARE_SLOT_NUM 20 |
842 | 834 | ||
843 | static struct mpc_config_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; | 835 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; |
844 | #endif | 836 | #endif |
845 | 837 | ||
846 | static int __init replace_intsrc_all(struct mp_config_table *mpc, | 838 | static int __init replace_intsrc_all(struct mpc_table *mpc, |
847 | unsigned long mpc_new_phys, | 839 | unsigned long mpc_new_phys, |
848 | unsigned long mpc_new_length) | 840 | unsigned long mpc_new_length) |
849 | { | 841 | { |
@@ -855,36 +847,33 @@ static int __init replace_intsrc_all(struct mp_config_table *mpc, | |||
855 | int count = sizeof(*mpc); | 847 | int count = sizeof(*mpc); |
856 | unsigned char *mpt = ((unsigned char *)mpc) + count; | 848 | unsigned char *mpt = ((unsigned char *)mpc) + count; |
857 | 849 | ||
858 | printk(KERN_INFO "mpc_length %x\n", mpc->mpc_length); | 850 | printk(KERN_INFO "mpc_length %x\n", mpc->length); |
859 | while (count < mpc->mpc_length) { | 851 | while (count < mpc->length) { |
860 | switch (*mpt) { | 852 | switch (*mpt) { |
861 | case MP_PROCESSOR: | 853 | case MP_PROCESSOR: |
862 | { | 854 | { |
863 | struct mpc_config_processor *m = | 855 | struct mpc_cpu *m = (struct mpc_cpu *)mpt; |
864 | (struct mpc_config_processor *)mpt; | ||
865 | mpt += sizeof(*m); | 856 | mpt += sizeof(*m); |
866 | count += sizeof(*m); | 857 | count += sizeof(*m); |
867 | break; | 858 | break; |
868 | } | 859 | } |
869 | case MP_BUS: | 860 | case MP_BUS: |
870 | { | 861 | { |
871 | struct mpc_config_bus *m = | 862 | struct mpc_bus *m = (struct mpc_bus *)mpt; |
872 | (struct mpc_config_bus *)mpt; | ||
873 | mpt += sizeof(*m); | 863 | mpt += sizeof(*m); |
874 | count += sizeof(*m); | 864 | count += sizeof(*m); |
875 | break; | 865 | break; |
876 | } | 866 | } |
877 | case MP_IOAPIC: | 867 | case MP_IOAPIC: |
878 | { | 868 | { |
879 | mpt += sizeof(struct mpc_config_ioapic); | 869 | mpt += sizeof(struct mpc_ioapic); |
880 | count += sizeof(struct mpc_config_ioapic); | 870 | count += sizeof(struct mpc_ioapic); |
881 | break; | 871 | break; |
882 | } | 872 | } |
883 | case MP_INTSRC: | 873 | case MP_INTSRC: |
884 | { | 874 | { |
885 | #ifdef CONFIG_X86_IO_APIC | 875 | #ifdef CONFIG_X86_IO_APIC |
886 | struct mpc_config_intsrc *m = | 876 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; |
887 | (struct mpc_config_intsrc *)mpt; | ||
888 | 877 | ||
889 | printk(KERN_INFO "OLD "); | 878 | printk(KERN_INFO "OLD "); |
890 | print_MP_intsrc_info(m); | 879 | print_MP_intsrc_info(m); |
@@ -905,14 +894,14 @@ static int __init replace_intsrc_all(struct mp_config_table *mpc, | |||
905 | nr_m_spare++; | 894 | nr_m_spare++; |
906 | } | 895 | } |
907 | #endif | 896 | #endif |
908 | mpt += sizeof(struct mpc_config_intsrc); | 897 | mpt += sizeof(struct mpc_intsrc); |
909 | count += sizeof(struct mpc_config_intsrc); | 898 | count += sizeof(struct mpc_intsrc); |
910 | break; | 899 | break; |
911 | } | 900 | } |
912 | case MP_LINTSRC: | 901 | case MP_LINTSRC: |
913 | { | 902 | { |
914 | struct mpc_config_lintsrc *m = | 903 | struct mpc_lintsrc *m = |
915 | (struct mpc_config_lintsrc *)mpt; | 904 | (struct mpc_lintsrc *)mpt; |
916 | mpt += sizeof(*m); | 905 | mpt += sizeof(*m); |
917 | count += sizeof(*m); | 906 | count += sizeof(*m); |
918 | break; | 907 | break; |
@@ -922,7 +911,7 @@ static int __init replace_intsrc_all(struct mp_config_table *mpc, | |||
922 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); | 911 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); |
923 | printk(KERN_ERR "type %x\n", *mpt); | 912 | printk(KERN_ERR "type %x\n", *mpt); |
924 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | 913 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, |
925 | 1, mpc, mpc->mpc_length, 1); | 914 | 1, mpc, mpc->length, 1); |
926 | goto out; | 915 | goto out; |
927 | } | 916 | } |
928 | } | 917 | } |
@@ -944,9 +933,8 @@ static int __init replace_intsrc_all(struct mp_config_table *mpc, | |||
944 | assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); | 933 | assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); |
945 | m_spare[nr_m_spare] = NULL; | 934 | m_spare[nr_m_spare] = NULL; |
946 | } else { | 935 | } else { |
947 | struct mpc_config_intsrc *m = | 936 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; |
948 | (struct mpc_config_intsrc *)mpt; | 937 | count += sizeof(struct mpc_intsrc); |
949 | count += sizeof(struct mpc_config_intsrc); | ||
950 | if (!mpc_new_phys) { | 938 | if (!mpc_new_phys) { |
951 | printk(KERN_INFO "No spare slots, try to append...take your risk, new mpc_length %x\n", count); | 939 | printk(KERN_INFO "No spare slots, try to append...take your risk, new mpc_length %x\n", count); |
952 | } else { | 940 | } else { |
@@ -958,17 +946,16 @@ static int __init replace_intsrc_all(struct mp_config_table *mpc, | |||
958 | } | 946 | } |
959 | } | 947 | } |
960 | assign_to_mpc_intsrc(&mp_irqs[i], m); | 948 | assign_to_mpc_intsrc(&mp_irqs[i], m); |
961 | mpc->mpc_length = count; | 949 | mpc->length = count; |
962 | mpt += sizeof(struct mpc_config_intsrc); | 950 | mpt += sizeof(struct mpc_intsrc); |
963 | } | 951 | } |
964 | print_mp_irq_info(&mp_irqs[i]); | 952 | print_mp_irq_info(&mp_irqs[i]); |
965 | } | 953 | } |
966 | #endif | 954 | #endif |
967 | out: | 955 | out: |
968 | /* update checksum */ | 956 | /* update checksum */ |
969 | mpc->mpc_checksum = 0; | 957 | mpc->checksum = 0; |
970 | mpc->mpc_checksum -= mpf_checksum((unsigned char *)mpc, | 958 | mpc->checksum -= mpf_checksum((unsigned char *)mpc, mpc->length); |
971 | mpc->mpc_length); | ||
972 | 959 | ||
973 | return 0; | 960 | return 0; |
974 | } | 961 | } |
@@ -1014,8 +1001,7 @@ static int __init update_mp_table(void) | |||
1014 | char str[16]; | 1001 | char str[16]; |
1015 | char oem[10]; | 1002 | char oem[10]; |
1016 | struct intel_mp_floating *mpf; | 1003 | struct intel_mp_floating *mpf; |
1017 | struct mp_config_table *mpc; | 1004 | struct mpc_table *mpc, *mpc_new; |
1018 | struct mp_config_table *mpc_new; | ||
1019 | 1005 | ||
1020 | if (!enable_update_mptable) | 1006 | if (!enable_update_mptable) |
1021 | return 0; | 1007 | return 0; |
@@ -1041,7 +1027,7 @@ static int __init update_mp_table(void) | |||
1041 | printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf)); | 1027 | printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf)); |
1042 | printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr); | 1028 | printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr); |
1043 | 1029 | ||
1044 | if (mpc_new_phys && mpc->mpc_length > mpc_new_length) { | 1030 | if (mpc_new_phys && mpc->length > mpc_new_length) { |
1045 | mpc_new_phys = 0; | 1031 | mpc_new_phys = 0; |
1046 | printk(KERN_INFO "mpc_new_length is %ld, please use alloc_mptable=8k\n", | 1032 | printk(KERN_INFO "mpc_new_length is %ld, please use alloc_mptable=8k\n", |
1047 | mpc_new_length); | 1033 | mpc_new_length); |
@@ -1050,10 +1036,10 @@ static int __init update_mp_table(void) | |||
1050 | if (!mpc_new_phys) { | 1036 | if (!mpc_new_phys) { |
1051 | unsigned char old, new; | 1037 | unsigned char old, new; |
1052 | /* check if we can change the postion */ | 1038 | /* check if we can change the postion */ |
1053 | mpc->mpc_checksum = 0; | 1039 | mpc->checksum = 0; |
1054 | old = mpf_checksum((unsigned char *)mpc, mpc->mpc_length); | 1040 | old = mpf_checksum((unsigned char *)mpc, mpc->length); |
1055 | mpc->mpc_checksum = 0xff; | 1041 | mpc->checksum = 0xff; |
1056 | new = mpf_checksum((unsigned char *)mpc, mpc->mpc_length); | 1042 | new = mpf_checksum((unsigned char *)mpc, mpc->length); |
1057 | if (old == new) { | 1043 | if (old == new) { |
1058 | printk(KERN_INFO "mpc is readonly, please try alloc_mptable instead\n"); | 1044 | printk(KERN_INFO "mpc is readonly, please try alloc_mptable instead\n"); |
1059 | return 0; | 1045 | return 0; |
@@ -1062,7 +1048,7 @@ static int __init update_mp_table(void) | |||
1062 | } else { | 1048 | } else { |
1063 | mpf->mpf_physptr = mpc_new_phys; | 1049 | mpf->mpf_physptr = mpc_new_phys; |
1064 | mpc_new = phys_to_virt(mpc_new_phys); | 1050 | mpc_new = phys_to_virt(mpc_new_phys); |
1065 | memcpy(mpc_new, mpc, mpc->mpc_length); | 1051 | memcpy(mpc_new, mpc, mpc->length); |
1066 | mpc = mpc_new; | 1052 | mpc = mpc_new; |
1067 | /* check if we can modify that */ | 1053 | /* check if we can modify that */ |
1068 | if (mpc_new_phys - mpf->mpf_physptr) { | 1054 | if (mpc_new_phys - mpf->mpf_physptr) { |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 45a09ccdc214..7228979f1e7f 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/kernel_stat.h> | 26 | #include <linux/kernel_stat.h> |
27 | #include <linux/kdebug.h> | 27 | #include <linux/kdebug.h> |
28 | #include <linux/smp.h> | 28 | #include <linux/smp.h> |
29 | #include <linux/nmi.h> | ||
30 | 29 | ||
31 | #include <asm/i8259.h> | 30 | #include <asm/i8259.h> |
32 | #include <asm/io_apic.h> | 31 | #include <asm/io_apic.h> |
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c index 0deea37a53cf..f2191d4f2717 100644 --- a/arch/x86/kernel/numaq_32.c +++ b/arch/x86/kernel/numaq_32.c | |||
@@ -117,16 +117,15 @@ static inline int generate_logical_apicid(int quad, int phys_apicid) | |||
117 | } | 117 | } |
118 | 118 | ||
119 | /* x86_quirks member */ | 119 | /* x86_quirks member */ |
120 | static int mpc_apic_id(struct mpc_config_processor *m) | 120 | static int mpc_apic_id(struct mpc_cpu *m) |
121 | { | 121 | { |
122 | int quad = translation_table[mpc_record]->trans_quad; | 122 | int quad = translation_table[mpc_record]->trans_quad; |
123 | int logical_apicid = generate_logical_apicid(quad, m->mpc_apicid); | 123 | int logical_apicid = generate_logical_apicid(quad, m->apicid); |
124 | 124 | ||
125 | printk(KERN_DEBUG "Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n", | 125 | printk(KERN_DEBUG "Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n", |
126 | m->mpc_apicid, | 126 | m->apicid, (m->cpufeature & CPU_FAMILY_MASK) >> 8, |
127 | (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8, | 127 | (m->cpufeature & CPU_MODEL_MASK) >> 4, |
128 | (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4, | 128 | m->apicver, quad, logical_apicid); |
129 | m->mpc_apicver, quad, logical_apicid); | ||
130 | return logical_apicid; | 129 | return logical_apicid; |
131 | } | 130 | } |
132 | 131 | ||
@@ -135,26 +134,26 @@ int mp_bus_id_to_node[MAX_MP_BUSSES]; | |||
135 | int mp_bus_id_to_local[MAX_MP_BUSSES]; | 134 | int mp_bus_id_to_local[MAX_MP_BUSSES]; |
136 | 135 | ||
137 | /* x86_quirks member */ | 136 | /* x86_quirks member */ |
138 | static void mpc_oem_bus_info(struct mpc_config_bus *m, char *name) | 137 | static void mpc_oem_bus_info(struct mpc_bus *m, char *name) |
139 | { | 138 | { |
140 | int quad = translation_table[mpc_record]->trans_quad; | 139 | int quad = translation_table[mpc_record]->trans_quad; |
141 | int local = translation_table[mpc_record]->trans_local; | 140 | int local = translation_table[mpc_record]->trans_local; |
142 | 141 | ||
143 | mp_bus_id_to_node[m->mpc_busid] = quad; | 142 | mp_bus_id_to_node[m->busid] = quad; |
144 | mp_bus_id_to_local[m->mpc_busid] = local; | 143 | mp_bus_id_to_local[m->busid] = local; |
145 | printk(KERN_INFO "Bus #%d is %s (node %d)\n", | 144 | printk(KERN_INFO "Bus #%d is %s (node %d)\n", |
146 | m->mpc_busid, name, quad); | 145 | m->busid, name, quad); |
147 | } | 146 | } |
148 | 147 | ||
149 | int quad_local_to_mp_bus_id [NR_CPUS/4][4]; | 148 | int quad_local_to_mp_bus_id [NR_CPUS/4][4]; |
150 | 149 | ||
151 | /* x86_quirks member */ | 150 | /* x86_quirks member */ |
152 | static void mpc_oem_pci_bus(struct mpc_config_bus *m) | 151 | static void mpc_oem_pci_bus(struct mpc_bus *m) |
153 | { | 152 | { |
154 | int quad = translation_table[mpc_record]->trans_quad; | 153 | int quad = translation_table[mpc_record]->trans_quad; |
155 | int local = translation_table[mpc_record]->trans_local; | 154 | int local = translation_table[mpc_record]->trans_local; |
156 | 155 | ||
157 | quad_local_to_mp_bus_id[quad][local] = m->mpc_busid; | 156 | quad_local_to_mp_bus_id[quad][local] = m->busid; |
158 | } | 157 | } |
159 | 158 | ||
160 | static void __init MP_translation_info(struct mpc_config_translation *m) | 159 | static void __init MP_translation_info(struct mpc_config_translation *m) |
@@ -186,7 +185,7 @@ static int __init mpf_checksum(unsigned char *mp, int len) | |||
186 | * Read/parse the MPC oem tables | 185 | * Read/parse the MPC oem tables |
187 | */ | 186 | */ |
188 | 187 | ||
189 | static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, | 188 | static void __init smp_read_mpc_oem(struct mpc_oemtable *oemtable, |
190 | unsigned short oemsize) | 189 | unsigned short oemsize) |
191 | { | 190 | { |
192 | int count = sizeof(*oemtable); /* the header size */ | 191 | int count = sizeof(*oemtable); /* the header size */ |
@@ -195,18 +194,18 @@ static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, | |||
195 | mpc_record = 0; | 194 | mpc_record = 0; |
196 | printk(KERN_INFO "Found an OEM MPC table at %8p - parsing it ... \n", | 195 | printk(KERN_INFO "Found an OEM MPC table at %8p - parsing it ... \n", |
197 | oemtable); | 196 | oemtable); |
198 | if (memcmp(oemtable->oem_signature, MPC_OEM_SIGNATURE, 4)) { | 197 | if (memcmp(oemtable->signature, MPC_OEM_SIGNATURE, 4)) { |
199 | printk(KERN_WARNING | 198 | printk(KERN_WARNING |
200 | "SMP mpc oemtable: bad signature [%c%c%c%c]!\n", | 199 | "SMP mpc oemtable: bad signature [%c%c%c%c]!\n", |
201 | oemtable->oem_signature[0], oemtable->oem_signature[1], | 200 | oemtable->signature[0], oemtable->signature[1], |
202 | oemtable->oem_signature[2], oemtable->oem_signature[3]); | 201 | oemtable->signature[2], oemtable->signature[3]); |
203 | return; | 202 | return; |
204 | } | 203 | } |
205 | if (mpf_checksum((unsigned char *)oemtable, oemtable->oem_length)) { | 204 | if (mpf_checksum((unsigned char *)oemtable, oemtable->length)) { |
206 | printk(KERN_WARNING "SMP oem mptable: checksum error!\n"); | 205 | printk(KERN_WARNING "SMP oem mptable: checksum error!\n"); |
207 | return; | 206 | return; |
208 | } | 207 | } |
209 | while (count < oemtable->oem_length) { | 208 | while (count < oemtable->length) { |
210 | switch (*oemptr) { | 209 | switch (*oemptr) { |
211 | case MP_TRANSLATION: | 210 | case MP_TRANSLATION: |
212 | { | 211 | { |
@@ -260,8 +259,7 @@ static struct x86_quirks numaq_x86_quirks __initdata = { | |||
260 | .update_genapic = numaq_update_genapic, | 259 | .update_genapic = numaq_update_genapic, |
261 | }; | 260 | }; |
262 | 261 | ||
263 | void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 262 | void numaq_mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) |
264 | char *productid) | ||
265 | { | 263 | { |
266 | if (strncmp(oem, "IBM NUMA", 8)) | 264 | if (strncmp(oem, "IBM NUMA", 8)) |
267 | printk("Warning! Not a NUMA-Q system!\n"); | 265 | printk("Warning! Not a NUMA-Q system!\n"); |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 19a1044a0cd9..b25428533141 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -38,7 +38,7 @@ EXPORT_SYMBOL(bad_dma_address); | |||
38 | be probably a smaller DMA mask, but this is bug-to-bug compatible | 38 | be probably a smaller DMA mask, but this is bug-to-bug compatible |
39 | to older i386. */ | 39 | to older i386. */ |
40 | struct device x86_dma_fallback_dev = { | 40 | struct device x86_dma_fallback_dev = { |
41 | .bus_id = "fallback device", | 41 | .init_name = "fallback device", |
42 | .coherent_dma_mask = DMA_32BIT_MASK, | 42 | .coherent_dma_mask = DMA_32BIT_MASK, |
43 | .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask, | 43 | .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask, |
44 | }; | 44 | }; |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 3ba155d24884..a546f55c77b4 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -39,11 +39,12 @@ | |||
39 | #include <linux/prctl.h> | 39 | #include <linux/prctl.h> |
40 | #include <linux/dmi.h> | 40 | #include <linux/dmi.h> |
41 | #include <linux/ftrace.h> | 41 | #include <linux/ftrace.h> |
42 | #include <linux/uaccess.h> | ||
43 | #include <linux/io.h> | ||
44 | #include <linux/kdebug.h> | ||
42 | 45 | ||
43 | #include <asm/uaccess.h> | ||
44 | #include <asm/pgtable.h> | 46 | #include <asm/pgtable.h> |
45 | #include <asm/system.h> | 47 | #include <asm/system.h> |
46 | #include <asm/io.h> | ||
47 | #include <asm/ldt.h> | 48 | #include <asm/ldt.h> |
48 | #include <asm/processor.h> | 49 | #include <asm/processor.h> |
49 | #include <asm/i387.h> | 50 | #include <asm/i387.h> |
@@ -56,10 +57,8 @@ | |||
56 | 57 | ||
57 | #include <asm/tlbflush.h> | 58 | #include <asm/tlbflush.h> |
58 | #include <asm/cpu.h> | 59 | #include <asm/cpu.h> |
59 | #include <asm/kdebug.h> | ||
60 | #include <asm/idle.h> | 60 | #include <asm/idle.h> |
61 | #include <asm/syscalls.h> | 61 | #include <asm/syscalls.h> |
62 | #include <asm/smp.h> | ||
63 | #include <asm/ds.h> | 62 | #include <asm/ds.h> |
64 | 63 | ||
65 | asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); | 64 | asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); |
@@ -205,7 +204,7 @@ extern void kernel_thread_helper(void); | |||
205 | /* | 204 | /* |
206 | * Create a kernel thread | 205 | * Create a kernel thread |
207 | */ | 206 | */ |
208 | int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) | 207 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) |
209 | { | 208 | { |
210 | struct pt_regs regs; | 209 | struct pt_regs regs; |
211 | 210 | ||
@@ -266,7 +265,7 @@ void flush_thread(void) | |||
266 | tsk->thread.debugreg3 = 0; | 265 | tsk->thread.debugreg3 = 0; |
267 | tsk->thread.debugreg6 = 0; | 266 | tsk->thread.debugreg6 = 0; |
268 | tsk->thread.debugreg7 = 0; | 267 | tsk->thread.debugreg7 = 0; |
269 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); | 268 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); |
270 | clear_tsk_thread_flag(tsk, TIF_DEBUG); | 269 | clear_tsk_thread_flag(tsk, TIF_DEBUG); |
271 | /* | 270 | /* |
272 | * Forget coprocessor state.. | 271 | * Forget coprocessor state.. |
@@ -293,9 +292,9 @@ void prepare_to_copy(struct task_struct *tsk) | |||
293 | 292 | ||
294 | int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | 293 | int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, |
295 | unsigned long unused, | 294 | unsigned long unused, |
296 | struct task_struct * p, struct pt_regs * regs) | 295 | struct task_struct *p, struct pt_regs *regs) |
297 | { | 296 | { |
298 | struct pt_regs * childregs; | 297 | struct pt_regs *childregs; |
299 | struct task_struct *tsk; | 298 | struct task_struct *tsk; |
300 | int err; | 299 | int err; |
301 | 300 | ||
@@ -347,7 +346,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
347 | void | 346 | void |
348 | start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | 347 | start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) |
349 | { | 348 | { |
350 | __asm__("movl %0, %%gs" :: "r"(0)); | 349 | __asm__("movl %0, %%gs" : : "r"(0)); |
351 | regs->fs = 0; | 350 | regs->fs = 0; |
352 | set_fs(USER_DS); | 351 | set_fs(USER_DS); |
353 | regs->ds = __USER_DS; | 352 | regs->ds = __USER_DS; |
@@ -638,7 +637,7 @@ asmlinkage int sys_vfork(struct pt_regs regs) | |||
638 | asmlinkage int sys_execve(struct pt_regs regs) | 637 | asmlinkage int sys_execve(struct pt_regs regs) |
639 | { | 638 | { |
640 | int error; | 639 | int error; |
641 | char * filename; | 640 | char *filename; |
642 | 641 | ||
643 | filename = getname((char __user *) regs.bx); | 642 | filename = getname((char __user *) regs.bx); |
644 | error = PTR_ERR(filename); | 643 | error = PTR_ERR(filename); |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index a4b619c33106..55c46074eba0 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
@@ -5,12 +5,11 @@ | |||
5 | #include <linux/percpu.h> | 5 | #include <linux/percpu.h> |
6 | #include <linux/kexec.h> | 6 | #include <linux/kexec.h> |
7 | #include <linux/crash_dump.h> | 7 | #include <linux/crash_dump.h> |
8 | #include <asm/smp.h> | 8 | #include <linux/smp.h> |
9 | #include <asm/percpu.h> | 9 | #include <linux/topology.h> |
10 | #include <asm/sections.h> | 10 | #include <asm/sections.h> |
11 | #include <asm/processor.h> | 11 | #include <asm/processor.h> |
12 | #include <asm/setup.h> | 12 | #include <asm/setup.h> |
13 | #include <asm/topology.h> | ||
14 | #include <asm/mpspec.h> | 13 | #include <asm/mpspec.h> |
15 | #include <asm/apicdef.h> | 14 | #include <asm/apicdef.h> |
16 | #include <asm/highmem.h> | 15 | #include <asm/highmem.h> |
@@ -20,8 +19,8 @@ unsigned int num_processors; | |||
20 | unsigned disabled_cpus __cpuinitdata; | 19 | unsigned disabled_cpus __cpuinitdata; |
21 | /* Processor that is doing the boot up */ | 20 | /* Processor that is doing the boot up */ |
22 | unsigned int boot_cpu_physical_apicid = -1U; | 21 | unsigned int boot_cpu_physical_apicid = -1U; |
23 | unsigned int max_physical_apicid; | ||
24 | EXPORT_SYMBOL(boot_cpu_physical_apicid); | 22 | EXPORT_SYMBOL(boot_cpu_physical_apicid); |
23 | unsigned int max_physical_apicid; | ||
25 | 24 | ||
26 | /* Bitmask of physically existing CPUs */ | 25 | /* Bitmask of physically existing CPUs */ |
27 | physid_mask_t phys_cpu_present_map; | 26 | physid_mask_t phys_cpu_present_map; |
@@ -131,7 +130,27 @@ static void __init setup_cpu_pda_map(void) | |||
131 | /* point to new pointer table */ | 130 | /* point to new pointer table */ |
132 | _cpu_pda = new_cpu_pda; | 131 | _cpu_pda = new_cpu_pda; |
133 | } | 132 | } |
134 | #endif | 133 | |
134 | #endif /* CONFIG_SMP && CONFIG_X86_64 */ | ||
135 | |||
136 | #ifdef CONFIG_X86_64 | ||
137 | |||
138 | /* correctly size the local cpu masks */ | ||
139 | static void setup_cpu_local_masks(void) | ||
140 | { | ||
141 | alloc_bootmem_cpumask_var(&cpu_initialized_mask); | ||
142 | alloc_bootmem_cpumask_var(&cpu_callin_mask); | ||
143 | alloc_bootmem_cpumask_var(&cpu_callout_mask); | ||
144 | alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask); | ||
145 | } | ||
146 | |||
147 | #else /* CONFIG_X86_32 */ | ||
148 | |||
149 | static inline void setup_cpu_local_masks(void) | ||
150 | { | ||
151 | } | ||
152 | |||
153 | #endif /* CONFIG_X86_32 */ | ||
135 | 154 | ||
136 | /* | 155 | /* |
137 | * Great future plan: | 156 | * Great future plan: |
@@ -187,6 +206,9 @@ void __init setup_per_cpu_areas(void) | |||
187 | 206 | ||
188 | /* Setup node to cpumask map */ | 207 | /* Setup node to cpumask map */ |
189 | setup_node_to_cpumask_map(); | 208 | setup_node_to_cpumask_map(); |
209 | |||
210 | /* Setup cpu initialized, callin, callout masks */ | ||
211 | setup_cpu_local_masks(); | ||
190 | } | 212 | } |
191 | 213 | ||
192 | #endif | 214 | #endif |
@@ -280,8 +302,8 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable) | |||
280 | 302 | ||
281 | cpulist_scnprintf(buf, sizeof(buf), mask); | 303 | cpulist_scnprintf(buf, sizeof(buf), mask); |
282 | printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n", | 304 | printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n", |
283 | enable? "numa_add_cpu":"numa_remove_cpu", cpu, node, buf); | 305 | enable ? "numa_add_cpu" : "numa_remove_cpu", cpu, node, buf); |
284 | } | 306 | } |
285 | 307 | ||
286 | void __cpuinit numa_add_cpu(int cpu) | 308 | void __cpuinit numa_add_cpu(int cpu) |
287 | { | 309 | { |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index beea2649a240..e6faa3316bd2 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Intel SMP support routines. | 2 | * Intel SMP support routines. |
3 | * | 3 | * |
4 | * (c) 1995 Alan Cox, Building #3 <alan@redhat.com> | 4 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> |
5 | * (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com> | 5 | * (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com> |
6 | * (c) 2002,2003 Andi Kleen, SuSE Labs. | 6 | * (c) 2002,2003 Andi Kleen, SuSE Labs. |
7 | * | 7 | * |
@@ -128,16 +128,23 @@ void native_send_call_func_single_ipi(int cpu) | |||
128 | 128 | ||
129 | void native_send_call_func_ipi(const struct cpumask *mask) | 129 | void native_send_call_func_ipi(const struct cpumask *mask) |
130 | { | 130 | { |
131 | cpumask_t allbutself; | 131 | cpumask_var_t allbutself; |
132 | 132 | ||
133 | allbutself = cpu_online_map; | 133 | if (!alloc_cpumask_var(&allbutself, GFP_ATOMIC)) { |
134 | cpu_clear(smp_processor_id(), allbutself); | 134 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); |
135 | return; | ||
136 | } | ||
135 | 137 | ||
136 | if (cpus_equal(*mask, allbutself) && | 138 | cpumask_copy(allbutself, cpu_online_mask); |
137 | cpus_equal(cpu_online_map, cpu_callout_map)) | 139 | cpumask_clear_cpu(smp_processor_id(), allbutself); |
140 | |||
141 | if (cpumask_equal(mask, allbutself) && | ||
142 | cpumask_equal(cpu_online_mask, cpu_callout_mask)) | ||
138 | send_IPI_allbutself(CALL_FUNCTION_VECTOR); | 143 | send_IPI_allbutself(CALL_FUNCTION_VECTOR); |
139 | else | 144 | else |
140 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); | 145 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); |
146 | |||
147 | free_cpumask_var(allbutself); | ||
141 | } | 148 | } |
142 | 149 | ||
143 | /* | 150 | /* |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 6bd4d9b73870..bb1a3b1fc87f 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * x86 SMP booting functions | 2 | * x86 SMP booting functions |
3 | * | 3 | * |
4 | * (c) 1995 Alan Cox, Building #3 <alan@redhat.com> | 4 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> |
5 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> | 5 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> |
6 | * Copyright 2001 Andi Kleen, SuSE Labs. | 6 | * Copyright 2001 Andi Kleen, SuSE Labs. |
7 | * | 7 | * |
@@ -102,9 +102,6 @@ EXPORT_SYMBOL(smp_num_siblings); | |||
102 | /* Last level cache ID of each logical CPU */ | 102 | /* Last level cache ID of each logical CPU */ |
103 | DEFINE_PER_CPU(u16, cpu_llc_id) = BAD_APICID; | 103 | DEFINE_PER_CPU(u16, cpu_llc_id) = BAD_APICID; |
104 | 104 | ||
105 | cpumask_t cpu_callin_map; | ||
106 | cpumask_t cpu_callout_map; | ||
107 | |||
108 | /* representing HT siblings of each logical CPU */ | 105 | /* representing HT siblings of each logical CPU */ |
109 | DEFINE_PER_CPU(cpumask_t, cpu_sibling_map); | 106 | DEFINE_PER_CPU(cpumask_t, cpu_sibling_map); |
110 | EXPORT_PER_CPU_SYMBOL(cpu_sibling_map); | 107 | EXPORT_PER_CPU_SYMBOL(cpu_sibling_map); |
@@ -120,9 +117,6 @@ EXPORT_PER_CPU_SYMBOL(cpu_info); | |||
120 | static atomic_t init_deasserted; | 117 | static atomic_t init_deasserted; |
121 | 118 | ||
122 | 119 | ||
123 | /* representing cpus for which sibling maps can be computed */ | ||
124 | static cpumask_t cpu_sibling_setup_map; | ||
125 | |||
126 | /* Set if we find a B stepping CPU */ | 120 | /* Set if we find a B stepping CPU */ |
127 | static int __cpuinitdata smp_b_stepping; | 121 | static int __cpuinitdata smp_b_stepping; |
128 | 122 | ||
@@ -140,7 +134,7 @@ EXPORT_SYMBOL(cpu_to_node_map); | |||
140 | static void map_cpu_to_node(int cpu, int node) | 134 | static void map_cpu_to_node(int cpu, int node) |
141 | { | 135 | { |
142 | printk(KERN_INFO "Mapping cpu %d to node %d\n", cpu, node); | 136 | printk(KERN_INFO "Mapping cpu %d to node %d\n", cpu, node); |
143 | cpu_set(cpu, node_to_cpumask_map[node]); | 137 | cpumask_set_cpu(cpu, &node_to_cpumask_map[node]); |
144 | cpu_to_node_map[cpu] = node; | 138 | cpu_to_node_map[cpu] = node; |
145 | } | 139 | } |
146 | 140 | ||
@@ -151,7 +145,7 @@ static void unmap_cpu_to_node(int cpu) | |||
151 | 145 | ||
152 | printk(KERN_INFO "Unmapping cpu %d from all nodes\n", cpu); | 146 | printk(KERN_INFO "Unmapping cpu %d from all nodes\n", cpu); |
153 | for (node = 0; node < MAX_NUMNODES; node++) | 147 | for (node = 0; node < MAX_NUMNODES; node++) |
154 | cpu_clear(cpu, node_to_cpumask_map[node]); | 148 | cpumask_clear_cpu(cpu, &node_to_cpumask_map[node]); |
155 | cpu_to_node_map[cpu] = 0; | 149 | cpu_to_node_map[cpu] = 0; |
156 | } | 150 | } |
157 | #else /* !(CONFIG_NUMA && CONFIG_X86_32) */ | 151 | #else /* !(CONFIG_NUMA && CONFIG_X86_32) */ |
@@ -209,7 +203,7 @@ static void __cpuinit smp_callin(void) | |||
209 | */ | 203 | */ |
210 | phys_id = read_apic_id(); | 204 | phys_id = read_apic_id(); |
211 | cpuid = smp_processor_id(); | 205 | cpuid = smp_processor_id(); |
212 | if (cpu_isset(cpuid, cpu_callin_map)) { | 206 | if (cpumask_test_cpu(cpuid, cpu_callin_mask)) { |
213 | panic("%s: phys CPU#%d, CPU#%d already present??\n", __func__, | 207 | panic("%s: phys CPU#%d, CPU#%d already present??\n", __func__, |
214 | phys_id, cpuid); | 208 | phys_id, cpuid); |
215 | } | 209 | } |
@@ -231,7 +225,7 @@ static void __cpuinit smp_callin(void) | |||
231 | /* | 225 | /* |
232 | * Has the boot CPU finished it's STARTUP sequence? | 226 | * Has the boot CPU finished it's STARTUP sequence? |
233 | */ | 227 | */ |
234 | if (cpu_isset(cpuid, cpu_callout_map)) | 228 | if (cpumask_test_cpu(cpuid, cpu_callout_mask)) |
235 | break; | 229 | break; |
236 | cpu_relax(); | 230 | cpu_relax(); |
237 | } | 231 | } |
@@ -274,7 +268,7 @@ static void __cpuinit smp_callin(void) | |||
274 | /* | 268 | /* |
275 | * Allow the master to continue. | 269 | * Allow the master to continue. |
276 | */ | 270 | */ |
277 | cpu_set(cpuid, cpu_callin_map); | 271 | cpumask_set_cpu(cpuid, cpu_callin_mask); |
278 | } | 272 | } |
279 | 273 | ||
280 | static int __cpuinitdata unsafe_smp; | 274 | static int __cpuinitdata unsafe_smp; |
@@ -332,7 +326,7 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
332 | ipi_call_lock(); | 326 | ipi_call_lock(); |
333 | lock_vector_lock(); | 327 | lock_vector_lock(); |
334 | __setup_vector_irq(smp_processor_id()); | 328 | __setup_vector_irq(smp_processor_id()); |
335 | cpu_set(smp_processor_id(), cpu_online_map); | 329 | set_cpu_online(smp_processor_id(), true); |
336 | unlock_vector_lock(); | 330 | unlock_vector_lock(); |
337 | ipi_call_unlock(); | 331 | ipi_call_unlock(); |
338 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 332 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
@@ -438,50 +432,52 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
438 | int i; | 432 | int i; |
439 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 433 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
440 | 434 | ||
441 | cpu_set(cpu, cpu_sibling_setup_map); | 435 | cpumask_set_cpu(cpu, cpu_sibling_setup_mask); |
442 | 436 | ||
443 | if (smp_num_siblings > 1) { | 437 | if (smp_num_siblings > 1) { |
444 | for_each_cpu_mask_nr(i, cpu_sibling_setup_map) { | 438 | for_each_cpu(i, cpu_sibling_setup_mask) { |
445 | if (c->phys_proc_id == cpu_data(i).phys_proc_id && | 439 | struct cpuinfo_x86 *o = &cpu_data(i); |
446 | c->cpu_core_id == cpu_data(i).cpu_core_id) { | 440 | |
447 | cpu_set(i, per_cpu(cpu_sibling_map, cpu)); | 441 | if (c->phys_proc_id == o->phys_proc_id && |
448 | cpu_set(cpu, per_cpu(cpu_sibling_map, i)); | 442 | c->cpu_core_id == o->cpu_core_id) { |
449 | cpu_set(i, per_cpu(cpu_core_map, cpu)); | 443 | cpumask_set_cpu(i, cpu_sibling_mask(cpu)); |
450 | cpu_set(cpu, per_cpu(cpu_core_map, i)); | 444 | cpumask_set_cpu(cpu, cpu_sibling_mask(i)); |
451 | cpu_set(i, c->llc_shared_map); | 445 | cpumask_set_cpu(i, cpu_core_mask(cpu)); |
452 | cpu_set(cpu, cpu_data(i).llc_shared_map); | 446 | cpumask_set_cpu(cpu, cpu_core_mask(i)); |
447 | cpumask_set_cpu(i, &c->llc_shared_map); | ||
448 | cpumask_set_cpu(cpu, &o->llc_shared_map); | ||
453 | } | 449 | } |
454 | } | 450 | } |
455 | } else { | 451 | } else { |
456 | cpu_set(cpu, per_cpu(cpu_sibling_map, cpu)); | 452 | cpumask_set_cpu(cpu, cpu_sibling_mask(cpu)); |
457 | } | 453 | } |
458 | 454 | ||
459 | cpu_set(cpu, c->llc_shared_map); | 455 | cpumask_set_cpu(cpu, &c->llc_shared_map); |
460 | 456 | ||
461 | if (current_cpu_data.x86_max_cores == 1) { | 457 | if (current_cpu_data.x86_max_cores == 1) { |
462 | per_cpu(cpu_core_map, cpu) = per_cpu(cpu_sibling_map, cpu); | 458 | cpumask_copy(cpu_core_mask(cpu), cpu_sibling_mask(cpu)); |
463 | c->booted_cores = 1; | 459 | c->booted_cores = 1; |
464 | return; | 460 | return; |
465 | } | 461 | } |
466 | 462 | ||
467 | for_each_cpu_mask_nr(i, cpu_sibling_setup_map) { | 463 | for_each_cpu(i, cpu_sibling_setup_mask) { |
468 | if (per_cpu(cpu_llc_id, cpu) != BAD_APICID && | 464 | if (per_cpu(cpu_llc_id, cpu) != BAD_APICID && |
469 | per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) { | 465 | per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) { |
470 | cpu_set(i, c->llc_shared_map); | 466 | cpumask_set_cpu(i, &c->llc_shared_map); |
471 | cpu_set(cpu, cpu_data(i).llc_shared_map); | 467 | cpumask_set_cpu(cpu, &cpu_data(i).llc_shared_map); |
472 | } | 468 | } |
473 | if (c->phys_proc_id == cpu_data(i).phys_proc_id) { | 469 | if (c->phys_proc_id == cpu_data(i).phys_proc_id) { |
474 | cpu_set(i, per_cpu(cpu_core_map, cpu)); | 470 | cpumask_set_cpu(i, cpu_core_mask(cpu)); |
475 | cpu_set(cpu, per_cpu(cpu_core_map, i)); | 471 | cpumask_set_cpu(cpu, cpu_core_mask(i)); |
476 | /* | 472 | /* |
477 | * Does this new cpu bringup a new core? | 473 | * Does this new cpu bringup a new core? |
478 | */ | 474 | */ |
479 | if (cpus_weight(per_cpu(cpu_sibling_map, cpu)) == 1) { | 475 | if (cpumask_weight(cpu_sibling_mask(cpu)) == 1) { |
480 | /* | 476 | /* |
481 | * for each core in package, increment | 477 | * for each core in package, increment |
482 | * the booted_cores for this new cpu | 478 | * the booted_cores for this new cpu |
483 | */ | 479 | */ |
484 | if (first_cpu(per_cpu(cpu_sibling_map, i)) == i) | 480 | if (cpumask_first(cpu_sibling_mask(i)) == i) |
485 | c->booted_cores++; | 481 | c->booted_cores++; |
486 | /* | 482 | /* |
487 | * increment the core count for all | 483 | * increment the core count for all |
@@ -504,7 +500,7 @@ const struct cpumask *cpu_coregroup_mask(int cpu) | |||
504 | * And for power savings, we return cpu_core_map | 500 | * And for power savings, we return cpu_core_map |
505 | */ | 501 | */ |
506 | if (sched_mc_power_savings || sched_smt_power_savings) | 502 | if (sched_mc_power_savings || sched_smt_power_savings) |
507 | return &per_cpu(cpu_core_map, cpu); | 503 | return cpu_core_mask(cpu); |
508 | else | 504 | else |
509 | return &c->llc_shared_map; | 505 | return &c->llc_shared_map; |
510 | } | 506 | } |
@@ -523,7 +519,7 @@ static void impress_friends(void) | |||
523 | */ | 519 | */ |
524 | pr_debug("Before bogomips.\n"); | 520 | pr_debug("Before bogomips.\n"); |
525 | for_each_possible_cpu(cpu) | 521 | for_each_possible_cpu(cpu) |
526 | if (cpu_isset(cpu, cpu_callout_map)) | 522 | if (cpumask_test_cpu(cpu, cpu_callout_mask)) |
527 | bogosum += cpu_data(cpu).loops_per_jiffy; | 523 | bogosum += cpu_data(cpu).loops_per_jiffy; |
528 | printk(KERN_INFO | 524 | printk(KERN_INFO |
529 | "Total of %d processors activated (%lu.%02lu BogoMIPS).\n", | 525 | "Total of %d processors activated (%lu.%02lu BogoMIPS).\n", |
@@ -904,19 +900,19 @@ do_rest: | |||
904 | * allow APs to start initializing. | 900 | * allow APs to start initializing. |
905 | */ | 901 | */ |
906 | pr_debug("Before Callout %d.\n", cpu); | 902 | pr_debug("Before Callout %d.\n", cpu); |
907 | cpu_set(cpu, cpu_callout_map); | 903 | cpumask_set_cpu(cpu, cpu_callout_mask); |
908 | pr_debug("After Callout %d.\n", cpu); | 904 | pr_debug("After Callout %d.\n", cpu); |
909 | 905 | ||
910 | /* | 906 | /* |
911 | * Wait 5s total for a response | 907 | * Wait 5s total for a response |
912 | */ | 908 | */ |
913 | for (timeout = 0; timeout < 50000; timeout++) { | 909 | for (timeout = 0; timeout < 50000; timeout++) { |
914 | if (cpu_isset(cpu, cpu_callin_map)) | 910 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) |
915 | break; /* It has booted */ | 911 | break; /* It has booted */ |
916 | udelay(100); | 912 | udelay(100); |
917 | } | 913 | } |
918 | 914 | ||
919 | if (cpu_isset(cpu, cpu_callin_map)) { | 915 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) { |
920 | /* number CPUs logically, starting from 1 (BSP is 0) */ | 916 | /* number CPUs logically, starting from 1 (BSP is 0) */ |
921 | pr_debug("OK.\n"); | 917 | pr_debug("OK.\n"); |
922 | printk(KERN_INFO "CPU%d: ", cpu); | 918 | printk(KERN_INFO "CPU%d: ", cpu); |
@@ -941,9 +937,14 @@ restore_state: | |||
941 | if (boot_error) { | 937 | if (boot_error) { |
942 | /* Try to put things back the way they were before ... */ | 938 | /* Try to put things back the way they were before ... */ |
943 | numa_remove_cpu(cpu); /* was set by numa_add_cpu */ | 939 | numa_remove_cpu(cpu); /* was set by numa_add_cpu */ |
944 | cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */ | 940 | |
945 | cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */ | 941 | /* was set by do_boot_cpu() */ |
946 | cpu_clear(cpu, cpu_present_map); | 942 | cpumask_clear_cpu(cpu, cpu_callout_mask); |
943 | |||
944 | /* was set by cpu_init() */ | ||
945 | cpumask_clear_cpu(cpu, cpu_initialized_mask); | ||
946 | |||
947 | set_cpu_present(cpu, false); | ||
947 | per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; | 948 | per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; |
948 | } | 949 | } |
949 | 950 | ||
@@ -977,7 +978,7 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
977 | /* | 978 | /* |
978 | * Already booted CPU? | 979 | * Already booted CPU? |
979 | */ | 980 | */ |
980 | if (cpu_isset(cpu, cpu_callin_map)) { | 981 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) { |
981 | pr_debug("do_boot_cpu %d Already started\n", cpu); | 982 | pr_debug("do_boot_cpu %d Already started\n", cpu); |
982 | return -ENOSYS; | 983 | return -ENOSYS; |
983 | } | 984 | } |
@@ -1032,8 +1033,9 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
1032 | */ | 1033 | */ |
1033 | static __init void disable_smp(void) | 1034 | static __init void disable_smp(void) |
1034 | { | 1035 | { |
1035 | cpu_present_map = cpumask_of_cpu(0); | 1036 | /* use the read/write pointers to the present and possible maps */ |
1036 | cpu_possible_map = cpumask_of_cpu(0); | 1037 | cpumask_copy(&cpu_present_map, cpumask_of(0)); |
1038 | cpumask_copy(&cpu_possible_map, cpumask_of(0)); | ||
1037 | smpboot_clear_io_apic_irqs(); | 1039 | smpboot_clear_io_apic_irqs(); |
1038 | 1040 | ||
1039 | if (smp_found_config) | 1041 | if (smp_found_config) |
@@ -1041,8 +1043,8 @@ static __init void disable_smp(void) | |||
1041 | else | 1043 | else |
1042 | physid_set_mask_of_physid(0, &phys_cpu_present_map); | 1044 | physid_set_mask_of_physid(0, &phys_cpu_present_map); |
1043 | map_cpu_to_logical_apicid(); | 1045 | map_cpu_to_logical_apicid(); |
1044 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); | 1046 | cpumask_set_cpu(0, cpu_sibling_mask(0)); |
1045 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 1047 | cpumask_set_cpu(0, cpu_core_mask(0)); |
1046 | } | 1048 | } |
1047 | 1049 | ||
1048 | /* | 1050 | /* |
@@ -1064,14 +1066,14 @@ static int __init smp_sanity_check(unsigned max_cpus) | |||
1064 | nr = 0; | 1066 | nr = 0; |
1065 | for_each_present_cpu(cpu) { | 1067 | for_each_present_cpu(cpu) { |
1066 | if (nr >= 8) | 1068 | if (nr >= 8) |
1067 | cpu_clear(cpu, cpu_present_map); | 1069 | set_cpu_present(cpu, false); |
1068 | nr++; | 1070 | nr++; |
1069 | } | 1071 | } |
1070 | 1072 | ||
1071 | nr = 0; | 1073 | nr = 0; |
1072 | for_each_possible_cpu(cpu) { | 1074 | for_each_possible_cpu(cpu) { |
1073 | if (nr >= 8) | 1075 | if (nr >= 8) |
1074 | cpu_clear(cpu, cpu_possible_map); | 1076 | set_cpu_possible(cpu, false); |
1075 | nr++; | 1077 | nr++; |
1076 | } | 1078 | } |
1077 | 1079 | ||
@@ -1167,7 +1169,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
1167 | preempt_disable(); | 1169 | preempt_disable(); |
1168 | smp_cpu_index_default(); | 1170 | smp_cpu_index_default(); |
1169 | current_cpu_data = boot_cpu_data; | 1171 | current_cpu_data = boot_cpu_data; |
1170 | cpu_callin_map = cpumask_of_cpu(0); | 1172 | cpumask_copy(cpu_callin_mask, cpumask_of(0)); |
1171 | mb(); | 1173 | mb(); |
1172 | /* | 1174 | /* |
1173 | * Setup boot CPU information | 1175 | * Setup boot CPU information |
@@ -1242,8 +1244,8 @@ void __init native_smp_prepare_boot_cpu(void) | |||
1242 | init_gdt(me); | 1244 | init_gdt(me); |
1243 | #endif | 1245 | #endif |
1244 | switch_to_new_gdt(); | 1246 | switch_to_new_gdt(); |
1245 | /* already set me in cpu_online_map in boot_cpu_init() */ | 1247 | /* already set me in cpu_online_mask in boot_cpu_init() */ |
1246 | cpu_set(me, cpu_callout_map); | 1248 | cpumask_set_cpu(me, cpu_callout_mask); |
1247 | per_cpu(cpu_state, me) = CPU_ONLINE; | 1249 | per_cpu(cpu_state, me) = CPU_ONLINE; |
1248 | } | 1250 | } |
1249 | 1251 | ||
@@ -1311,7 +1313,7 @@ __init void prefill_possible_map(void) | |||
1311 | possible, max_t(int, possible - num_processors, 0)); | 1313 | possible, max_t(int, possible - num_processors, 0)); |
1312 | 1314 | ||
1313 | for (i = 0; i < possible; i++) | 1315 | for (i = 0; i < possible; i++) |
1314 | cpu_set(i, cpu_possible_map); | 1316 | set_cpu_possible(i, true); |
1315 | 1317 | ||
1316 | nr_cpu_ids = possible; | 1318 | nr_cpu_ids = possible; |
1317 | } | 1319 | } |
@@ -1323,31 +1325,31 @@ static void remove_siblinginfo(int cpu) | |||
1323 | int sibling; | 1325 | int sibling; |
1324 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 1326 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
1325 | 1327 | ||
1326 | for_each_cpu_mask_nr(sibling, per_cpu(cpu_core_map, cpu)) { | 1328 | for_each_cpu(sibling, cpu_core_mask(cpu)) { |
1327 | cpu_clear(cpu, per_cpu(cpu_core_map, sibling)); | 1329 | cpumask_clear_cpu(cpu, cpu_core_mask(sibling)); |
1328 | /*/ | 1330 | /*/ |
1329 | * last thread sibling in this cpu core going down | 1331 | * last thread sibling in this cpu core going down |
1330 | */ | 1332 | */ |
1331 | if (cpus_weight(per_cpu(cpu_sibling_map, cpu)) == 1) | 1333 | if (cpumask_weight(cpu_sibling_mask(cpu)) == 1) |
1332 | cpu_data(sibling).booted_cores--; | 1334 | cpu_data(sibling).booted_cores--; |
1333 | } | 1335 | } |
1334 | 1336 | ||
1335 | for_each_cpu_mask_nr(sibling, per_cpu(cpu_sibling_map, cpu)) | 1337 | for_each_cpu(sibling, cpu_sibling_mask(cpu)) |
1336 | cpu_clear(cpu, per_cpu(cpu_sibling_map, sibling)); | 1338 | cpumask_clear_cpu(cpu, cpu_sibling_mask(sibling)); |
1337 | cpus_clear(per_cpu(cpu_sibling_map, cpu)); | 1339 | cpumask_clear(cpu_sibling_mask(cpu)); |
1338 | cpus_clear(per_cpu(cpu_core_map, cpu)); | 1340 | cpumask_clear(cpu_core_mask(cpu)); |
1339 | c->phys_proc_id = 0; | 1341 | c->phys_proc_id = 0; |
1340 | c->cpu_core_id = 0; | 1342 | c->cpu_core_id = 0; |
1341 | cpu_clear(cpu, cpu_sibling_setup_map); | 1343 | cpumask_clear_cpu(cpu, cpu_sibling_setup_mask); |
1342 | } | 1344 | } |
1343 | 1345 | ||
1344 | static void __ref remove_cpu_from_maps(int cpu) | 1346 | static void __ref remove_cpu_from_maps(int cpu) |
1345 | { | 1347 | { |
1346 | cpu_clear(cpu, cpu_online_map); | 1348 | set_cpu_online(cpu, false); |
1347 | cpu_clear(cpu, cpu_callout_map); | 1349 | cpumask_clear_cpu(cpu, cpu_callout_mask); |
1348 | cpu_clear(cpu, cpu_callin_map); | 1350 | cpumask_clear_cpu(cpu, cpu_callin_mask); |
1349 | /* was set by cpu_init() */ | 1351 | /* was set by cpu_init() */ |
1350 | cpu_clear(cpu, cpu_initialized); | 1352 | cpumask_clear_cpu(cpu, cpu_initialized_mask); |
1351 | numa_remove_cpu(cpu); | 1353 | numa_remove_cpu(cpu); |
1352 | } | 1354 | } |
1353 | 1355 | ||
diff --git a/arch/x86/kernel/time_32.c b/arch/x86/kernel/time_32.c index 65309e4cb1c0..3985cac0ed47 100644 --- a/arch/x86/kernel/time_32.c +++ b/arch/x86/kernel/time_32.c | |||
@@ -105,8 +105,8 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
105 | high bit of the PPI port B (0x61). Note that some PS/2s, | 105 | high bit of the PPI port B (0x61). Note that some PS/2s, |
106 | notably the 55SX, work fine if this is removed. */ | 106 | notably the 55SX, work fine if this is removed. */ |
107 | 107 | ||
108 | u8 irq_v = inb_p( 0x61 ); /* read the current state */ | 108 | u8 irq_v = inb_p(0x61); /* read the current state */ |
109 | outb_p( irq_v|0x80, 0x61 ); /* reset the IRQ */ | 109 | outb_p(irq_v | 0x80, 0x61); /* reset the IRQ */ |
110 | } | 110 | } |
111 | #endif | 111 | #endif |
112 | 112 | ||
diff --git a/arch/x86/kernel/time_64.c b/arch/x86/kernel/time_64.c index 891e7a7c4334..e6e695acd725 100644 --- a/arch/x86/kernel/time_64.c +++ b/arch/x86/kernel/time_64.c | |||
@@ -17,10 +17,10 @@ | |||
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/time.h> | 18 | #include <linux/time.h> |
19 | #include <linux/mca.h> | 19 | #include <linux/mca.h> |
20 | #include <linux/nmi.h> | ||
20 | 21 | ||
21 | #include <asm/i8253.h> | 22 | #include <asm/i8253.h> |
22 | #include <asm/hpet.h> | 23 | #include <asm/hpet.h> |
23 | #include <asm/nmi.h> | ||
24 | #include <asm/vgtod.h> | 24 | #include <asm/vgtod.h> |
25 | #include <asm/time.h> | 25 | #include <asm/time.h> |
26 | #include <asm/timer.h> | 26 | #include <asm/timer.h> |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index c9a666cdd3db..98c2d055284b 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -63,9 +63,6 @@ | |||
63 | #else | 63 | #else |
64 | #include <asm/processor-flags.h> | 64 | #include <asm/processor-flags.h> |
65 | #include <asm/arch_hooks.h> | 65 | #include <asm/arch_hooks.h> |
66 | #include <asm/nmi.h> | ||
67 | #include <asm/smp.h> | ||
68 | #include <asm/io.h> | ||
69 | #include <asm/traps.h> | 66 | #include <asm/traps.h> |
70 | 67 | ||
71 | #include "cpu/mcheck/mce.h" | 68 | #include "cpu/mcheck/mce.h" |
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 0c9667f0752a..d801d06af068 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
@@ -176,33 +176,31 @@ static int __init visws_get_smp_config(unsigned int early) | |||
176 | * No problem for Linux. | 176 | * No problem for Linux. |
177 | */ | 177 | */ |
178 | 178 | ||
179 | static void __init MP_processor_info(struct mpc_config_processor *m) | 179 | static void __init MP_processor_info(struct mpc_cpu *m) |
180 | { | 180 | { |
181 | int ver, logical_apicid; | 181 | int ver, logical_apicid; |
182 | physid_mask_t apic_cpus; | 182 | physid_mask_t apic_cpus; |
183 | 183 | ||
184 | if (!(m->mpc_cpuflag & CPU_ENABLED)) | 184 | if (!(m->cpuflag & CPU_ENABLED)) |
185 | return; | 185 | return; |
186 | 186 | ||
187 | logical_apicid = m->mpc_apicid; | 187 | logical_apicid = m->apicid; |
188 | printk(KERN_INFO "%sCPU #%d %u:%u APIC version %d\n", | 188 | printk(KERN_INFO "%sCPU #%d %u:%u APIC version %d\n", |
189 | m->mpc_cpuflag & CPU_BOOTPROCESSOR ? "Bootup " : "", | 189 | m->cpuflag & CPU_BOOTPROCESSOR ? "Bootup " : "", |
190 | m->mpc_apicid, | 190 | m->apicid, (m->cpufeature & CPU_FAMILY_MASK) >> 8, |
191 | (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8, | 191 | (m->cpufeature & CPU_MODEL_MASK) >> 4, m->apicver); |
192 | (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4, | ||
193 | m->mpc_apicver); | ||
194 | 192 | ||
195 | if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) | 193 | if (m->cpuflag & CPU_BOOTPROCESSOR) |
196 | boot_cpu_physical_apicid = m->mpc_apicid; | 194 | boot_cpu_physical_apicid = m->apicid; |
197 | 195 | ||
198 | ver = m->mpc_apicver; | 196 | ver = m->apicver; |
199 | if ((ver >= 0x14 && m->mpc_apicid >= 0xff) || m->mpc_apicid >= 0xf) { | 197 | if ((ver >= 0x14 && m->apicid >= 0xff) || m->apicid >= 0xf) { |
200 | printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", | 198 | printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", |
201 | m->mpc_apicid, MAX_APICS); | 199 | m->apicid, MAX_APICS); |
202 | return; | 200 | return; |
203 | } | 201 | } |
204 | 202 | ||
205 | apic_cpus = apicid_to_cpu_present(m->mpc_apicid); | 203 | apic_cpus = apicid_to_cpu_present(m->apicid); |
206 | physids_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus); | 204 | physids_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus); |
207 | /* | 205 | /* |
208 | * Validate version | 206 | * Validate version |
@@ -210,15 +208,15 @@ static void __init MP_processor_info(struct mpc_config_processor *m) | |||
210 | if (ver == 0x0) { | 208 | if (ver == 0x0) { |
211 | printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! " | 209 | printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! " |
212 | "fixing up to 0x10. (tell your hw vendor)\n", | 210 | "fixing up to 0x10. (tell your hw vendor)\n", |
213 | m->mpc_apicid); | 211 | m->apicid); |
214 | ver = 0x10; | 212 | ver = 0x10; |
215 | } | 213 | } |
216 | apic_version[m->mpc_apicid] = ver; | 214 | apic_version[m->apicid] = ver; |
217 | } | 215 | } |
218 | 216 | ||
219 | static int __init visws_find_smp_config(unsigned int reserve) | 217 | static int __init visws_find_smp_config(unsigned int reserve) |
220 | { | 218 | { |
221 | struct mpc_config_processor *mp = phys_to_virt(CO_CPU_TAB_PHYS); | 219 | struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS); |
222 | unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS)); | 220 | unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS)); |
223 | 221 | ||
224 | if (ncpus > CO_CPU_MAX) { | 222 | if (ncpus > CO_CPU_MAX) { |
diff --git a/arch/x86/mach-generic/es7000.c b/arch/x86/mach-generic/es7000.c index 4ba5ccaa1584..c2ded1448024 100644 --- a/arch/x86/mach-generic/es7000.c +++ b/arch/x86/mach-generic/es7000.c | |||
@@ -43,12 +43,12 @@ static void __init enable_apic_mode(void) | |||
43 | return; | 43 | return; |
44 | } | 44 | } |
45 | 45 | ||
46 | static __init int mps_oem_check(struct mp_config_table *mpc, char *oem, | 46 | static __init int |
47 | char *productid) | 47 | mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) |
48 | { | 48 | { |
49 | if (mpc->mpc_oemptr) { | 49 | if (mpc->oemptr) { |
50 | struct mp_config_oemtable *oem_table = | 50 | struct mpc_oemtable *oem_table = |
51 | (struct mp_config_oemtable *)mpc->mpc_oemptr; | 51 | (struct mpc_oemtable *)mpc->oemptr; |
52 | if (!strncmp(oem, "UNISYS", 6)) | 52 | if (!strncmp(oem, "UNISYS", 6)) |
53 | return parse_unisys_oem((char *)oem_table); | 53 | return parse_unisys_oem((char *)oem_table); |
54 | } | 54 | } |
diff --git a/arch/x86/mach-generic/numaq.c b/arch/x86/mach-generic/numaq.c index 511d7941364f..3679e2255645 100644 --- a/arch/x86/mach-generic/numaq.c +++ b/arch/x86/mach-generic/numaq.c | |||
@@ -19,8 +19,7 @@ | |||
19 | #include <asm/numaq/wakecpu.h> | 19 | #include <asm/numaq/wakecpu.h> |
20 | #include <asm/numaq.h> | 20 | #include <asm/numaq.h> |
21 | 21 | ||
22 | static int mps_oem_check(struct mp_config_table *mpc, char *oem, | 22 | static int mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) |
23 | char *productid) | ||
24 | { | 23 | { |
25 | numaq_mps_oem_check(mpc, oem, productid); | 24 | numaq_mps_oem_check(mpc, oem, productid); |
26 | return found_numaq; | 25 | return found_numaq; |
diff --git a/arch/x86/mach-generic/probe.c b/arch/x86/mach-generic/probe.c index c346d9d0226f..15a38daef1a8 100644 --- a/arch/x86/mach-generic/probe.c +++ b/arch/x86/mach-generic/probe.c | |||
@@ -110,8 +110,7 @@ void __init generic_apic_probe(void) | |||
110 | 110 | ||
111 | /* These functions can switch the APIC even after the initial ->probe() */ | 111 | /* These functions can switch the APIC even after the initial ->probe() */ |
112 | 112 | ||
113 | int __init mps_oem_check(struct mp_config_table *mpc, char *oem, | 113 | int __init mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) |
114 | char *productid) | ||
115 | { | 114 | { |
116 | int i; | 115 | int i; |
117 | for (i = 0; apic_probe[i]; ++i) { | 116 | for (i = 0; apic_probe[i]; ++i) { |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 544d724caeee..88f1b10de3be 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -328,6 +328,8 @@ int devmem_is_allowed(unsigned long pagenr) | |||
328 | { | 328 | { |
329 | if (pagenr <= 256) | 329 | if (pagenr <= 256) |
330 | return 1; | 330 | return 1; |
331 | if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) | ||
332 | return 0; | ||
331 | if (!page_is_ram(pagenr)) | 333 | if (!page_is_ram(pagenr)) |
332 | return 1; | 334 | return 1; |
333 | return 0; | 335 | return 0; |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 54c437e96541..23f68e77ad1f 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -888,6 +888,8 @@ int devmem_is_allowed(unsigned long pagenr) | |||
888 | { | 888 | { |
889 | if (pagenr <= 256) | 889 | if (pagenr <= 256) |
890 | return 1; | 890 | return 1; |
891 | if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) | ||
892 | return 0; | ||
891 | if (!page_is_ram(pagenr)) | 893 | if (!page_is_ram(pagenr)) |
892 | return 1; | 894 | return 1; |
893 | return 0; | 895 | return 0; |
diff --git a/arch/x86/mm/k8topology_64.c b/arch/x86/mm/k8topology_64.c index 41f1b5c00a1d..268f8255280f 100644 --- a/arch/x86/mm/k8topology_64.c +++ b/arch/x86/mm/k8topology_64.c | |||
@@ -81,7 +81,6 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end) | |||
81 | unsigned numnodes, cores, bits, apicid_base; | 81 | unsigned numnodes, cores, bits, apicid_base; |
82 | unsigned long prevbase; | 82 | unsigned long prevbase; |
83 | struct bootnode nodes[8]; | 83 | struct bootnode nodes[8]; |
84 | unsigned char nodeids[8]; | ||
85 | int i, j, nb, found = 0; | 84 | int i, j, nb, found = 0; |
86 | u32 nodeid, reg; | 85 | u32 nodeid, reg; |
87 | 86 | ||
@@ -110,7 +109,6 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end) | |||
110 | limit = read_pci_config(0, nb, 1, 0x44 + i*8); | 109 | limit = read_pci_config(0, nb, 1, 0x44 + i*8); |
111 | 110 | ||
112 | nodeid = limit & 7; | 111 | nodeid = limit & 7; |
113 | nodeids[i] = nodeid; | ||
114 | if ((base & 3) == 0) { | 112 | if ((base & 3) == 0) { |
115 | if (i < numnodes) | 113 | if (i < numnodes) |
116 | printk("Skipping disabled node %d\n", i); | 114 | printk("Skipping disabled node %d\n", i); |
@@ -179,9 +177,6 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end) | |||
179 | 177 | ||
180 | nodes[nodeid].start = base; | 178 | nodes[nodeid].start = base; |
181 | nodes[nodeid].end = limit; | 179 | nodes[nodeid].end = limit; |
182 | e820_register_active_regions(nodeid, | ||
183 | nodes[nodeid].start >> PAGE_SHIFT, | ||
184 | nodes[nodeid].end >> PAGE_SHIFT); | ||
185 | 180 | ||
186 | prevbase = base; | 181 | prevbase = base; |
187 | 182 | ||
@@ -211,12 +206,15 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end) | |||
211 | } | 206 | } |
212 | 207 | ||
213 | for (i = 0; i < 8; i++) { | 208 | for (i = 0; i < 8; i++) { |
214 | if (nodes[i].start != nodes[i].end) { | 209 | if (nodes[i].start == nodes[i].end) |
215 | nodeid = nodeids[i]; | 210 | continue; |
216 | for (j = apicid_base; j < cores + apicid_base; j++) | 211 | |
217 | apicid_to_node[(nodeid << bits) + j] = i; | 212 | e820_register_active_regions(i, |
218 | setup_node_bootmem(i, nodes[i].start, nodes[i].end); | 213 | nodes[i].start >> PAGE_SHIFT, |
219 | } | 214 | nodes[i].end >> PAGE_SHIFT); |
215 | for (j = apicid_base; j < cores + apicid_base; j++) | ||
216 | apicid_to_node[(i << bits) + j] = i; | ||
217 | setup_node_bootmem(i, nodes[i].start, nodes[i].end); | ||
220 | } | 218 | } |
221 | 219 | ||
222 | numa_init_array(); | 220 | numa_init_array(); |
diff --git a/arch/x86/mm/numa_32.c b/arch/x86/mm/numa_32.c index 8518c678d83f..d1f7439d173c 100644 --- a/arch/x86/mm/numa_32.c +++ b/arch/x86/mm/numa_32.c | |||
@@ -239,7 +239,7 @@ void resume_map_numa_kva(pgd_t *pgd_base) | |||
239 | start_pfn = node_remap_start_pfn[node]; | 239 | start_pfn = node_remap_start_pfn[node]; |
240 | size = node_remap_size[node]; | 240 | size = node_remap_size[node]; |
241 | 241 | ||
242 | printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); | 242 | printk(KERN_DEBUG "%s: node %d\n", __func__, node); |
243 | 243 | ||
244 | for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { | 244 | for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { |
245 | unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); | 245 | unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); |
@@ -251,7 +251,7 @@ void resume_map_numa_kva(pgd_t *pgd_base) | |||
251 | PAGE_KERNEL_LARGE_EXEC)); | 251 | PAGE_KERNEL_LARGE_EXEC)); |
252 | 252 | ||
253 | printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", | 253 | printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", |
254 | __FUNCTION__, vaddr, start_pfn + pfn); | 254 | __func__, vaddr, start_pfn + pfn); |
255 | } | 255 | } |
256 | } | 256 | } |
257 | } | 257 | } |
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index 98658f25f542..8fdf06e4edf9 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * @file op_model_amd.c | 2 | * @file op_model_amd.c |
3 | * athlon / K7 / K8 / Family 10h model-specific MSR operations | 3 | * athlon / K7 / K8 / Family 10h model-specific MSR operations |
4 | * | 4 | * |
5 | * @remark Copyright 2002-2008 OProfile authors | 5 | * @remark Copyright 2002-2009 OProfile authors |
6 | * @remark Read the file COPYING | 6 | * @remark Read the file COPYING |
7 | * | 7 | * |
8 | * @author John Levon | 8 | * @author John Levon |
@@ -10,7 +10,7 @@ | |||
10 | * @author Graydon Hoare | 10 | * @author Graydon Hoare |
11 | * @author Robert Richter <robert.richter@amd.com> | 11 | * @author Robert Richter <robert.richter@amd.com> |
12 | * @author Barry Kasindorf | 12 | * @author Barry Kasindorf |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/oprofile.h> | 15 | #include <linux/oprofile.h> |
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
@@ -60,53 +60,10 @@ static unsigned long reset_value[NUM_COUNTERS]; | |||
60 | #define IBS_OP_LOW_VALID_BIT (1ULL<<18) /* bit 18 */ | 60 | #define IBS_OP_LOW_VALID_BIT (1ULL<<18) /* bit 18 */ |
61 | #define IBS_OP_LOW_ENABLE (1ULL<<17) /* bit 17 */ | 61 | #define IBS_OP_LOW_ENABLE (1ULL<<17) /* bit 17 */ |
62 | 62 | ||
63 | /* Codes used in cpu_buffer.c */ | 63 | #define IBS_FETCH_SIZE 6 |
64 | /* This produces duplicate code, need to be fixed */ | 64 | #define IBS_OP_SIZE 12 |
65 | #define IBS_FETCH_BEGIN 3 | ||
66 | #define IBS_OP_BEGIN 4 | ||
67 | |||
68 | /* | ||
69 | * The function interface needs to be fixed, something like add | ||
70 | * data. Should then be added to linux/oprofile.h. | ||
71 | */ | ||
72 | extern void | ||
73 | oprofile_add_ibs_sample(struct pt_regs * const regs, | ||
74 | unsigned int * const ibs_sample, int ibs_code); | ||
75 | |||
76 | struct ibs_fetch_sample { | ||
77 | /* MSRC001_1031 IBS Fetch Linear Address Register */ | ||
78 | unsigned int ibs_fetch_lin_addr_low; | ||
79 | unsigned int ibs_fetch_lin_addr_high; | ||
80 | /* MSRC001_1030 IBS Fetch Control Register */ | ||
81 | unsigned int ibs_fetch_ctl_low; | ||
82 | unsigned int ibs_fetch_ctl_high; | ||
83 | /* MSRC001_1032 IBS Fetch Physical Address Register */ | ||
84 | unsigned int ibs_fetch_phys_addr_low; | ||
85 | unsigned int ibs_fetch_phys_addr_high; | ||
86 | }; | ||
87 | |||
88 | struct ibs_op_sample { | ||
89 | /* MSRC001_1034 IBS Op Logical Address Register (IbsRIP) */ | ||
90 | unsigned int ibs_op_rip_low; | ||
91 | unsigned int ibs_op_rip_high; | ||
92 | /* MSRC001_1035 IBS Op Data Register */ | ||
93 | unsigned int ibs_op_data1_low; | ||
94 | unsigned int ibs_op_data1_high; | ||
95 | /* MSRC001_1036 IBS Op Data 2 Register */ | ||
96 | unsigned int ibs_op_data2_low; | ||
97 | unsigned int ibs_op_data2_high; | ||
98 | /* MSRC001_1037 IBS Op Data 3 Register */ | ||
99 | unsigned int ibs_op_data3_low; | ||
100 | unsigned int ibs_op_data3_high; | ||
101 | /* MSRC001_1038 IBS DC Linear Address Register (IbsDcLinAd) */ | ||
102 | unsigned int ibs_dc_linear_low; | ||
103 | unsigned int ibs_dc_linear_high; | ||
104 | /* MSRC001_1039 IBS DC Physical Address Register (IbsDcPhysAd) */ | ||
105 | unsigned int ibs_dc_phys_low; | ||
106 | unsigned int ibs_dc_phys_high; | ||
107 | }; | ||
108 | 65 | ||
109 | static int ibs_allowed; /* AMD Family10h and later */ | 66 | static int has_ibs; /* AMD Family10h and later */ |
110 | 67 | ||
111 | struct op_ibs_config { | 68 | struct op_ibs_config { |
112 | unsigned long op_enabled; | 69 | unsigned long op_enabled; |
@@ -197,31 +154,29 @@ static inline int | |||
197 | op_amd_handle_ibs(struct pt_regs * const regs, | 154 | op_amd_handle_ibs(struct pt_regs * const regs, |
198 | struct op_msrs const * const msrs) | 155 | struct op_msrs const * const msrs) |
199 | { | 156 | { |
200 | unsigned int low, high; | 157 | u32 low, high; |
201 | struct ibs_fetch_sample ibs_fetch; | 158 | u64 msr; |
202 | struct ibs_op_sample ibs_op; | 159 | struct op_entry entry; |
203 | 160 | ||
204 | if (!ibs_allowed) | 161 | if (!has_ibs) |
205 | return 1; | 162 | return 1; |
206 | 163 | ||
207 | if (ibs_config.fetch_enabled) { | 164 | if (ibs_config.fetch_enabled) { |
208 | rdmsr(MSR_AMD64_IBSFETCHCTL, low, high); | 165 | rdmsr(MSR_AMD64_IBSFETCHCTL, low, high); |
209 | if (high & IBS_FETCH_HIGH_VALID_BIT) { | 166 | if (high & IBS_FETCH_HIGH_VALID_BIT) { |
210 | ibs_fetch.ibs_fetch_ctl_high = high; | 167 | rdmsrl(MSR_AMD64_IBSFETCHLINAD, msr); |
211 | ibs_fetch.ibs_fetch_ctl_low = low; | 168 | oprofile_write_reserve(&entry, regs, msr, |
212 | rdmsr(MSR_AMD64_IBSFETCHLINAD, low, high); | 169 | IBS_FETCH_CODE, IBS_FETCH_SIZE); |
213 | ibs_fetch.ibs_fetch_lin_addr_high = high; | 170 | oprofile_add_data(&entry, (u32)msr); |
214 | ibs_fetch.ibs_fetch_lin_addr_low = low; | 171 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
215 | rdmsr(MSR_AMD64_IBSFETCHPHYSAD, low, high); | 172 | oprofile_add_data(&entry, low); |
216 | ibs_fetch.ibs_fetch_phys_addr_high = high; | 173 | oprofile_add_data(&entry, high); |
217 | ibs_fetch.ibs_fetch_phys_addr_low = low; | 174 | rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, msr); |
218 | 175 | oprofile_add_data(&entry, (u32)msr); | |
219 | oprofile_add_ibs_sample(regs, | 176 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
220 | (unsigned int *)&ibs_fetch, | 177 | oprofile_write_commit(&entry); |
221 | IBS_FETCH_BEGIN); | ||
222 | 178 | ||
223 | /* reenable the IRQ */ | 179 | /* reenable the IRQ */ |
224 | rdmsr(MSR_AMD64_IBSFETCHCTL, low, high); | ||
225 | high &= ~IBS_FETCH_HIGH_VALID_BIT; | 180 | high &= ~IBS_FETCH_HIGH_VALID_BIT; |
226 | high |= IBS_FETCH_HIGH_ENABLE; | 181 | high |= IBS_FETCH_HIGH_ENABLE; |
227 | low &= IBS_FETCH_LOW_MAX_CNT_MASK; | 182 | low &= IBS_FETCH_LOW_MAX_CNT_MASK; |
@@ -232,30 +187,29 @@ op_amd_handle_ibs(struct pt_regs * const regs, | |||
232 | if (ibs_config.op_enabled) { | 187 | if (ibs_config.op_enabled) { |
233 | rdmsr(MSR_AMD64_IBSOPCTL, low, high); | 188 | rdmsr(MSR_AMD64_IBSOPCTL, low, high); |
234 | if (low & IBS_OP_LOW_VALID_BIT) { | 189 | if (low & IBS_OP_LOW_VALID_BIT) { |
235 | rdmsr(MSR_AMD64_IBSOPRIP, low, high); | 190 | rdmsrl(MSR_AMD64_IBSOPRIP, msr); |
236 | ibs_op.ibs_op_rip_low = low; | 191 | oprofile_write_reserve(&entry, regs, msr, |
237 | ibs_op.ibs_op_rip_high = high; | 192 | IBS_OP_CODE, IBS_OP_SIZE); |
238 | rdmsr(MSR_AMD64_IBSOPDATA, low, high); | 193 | oprofile_add_data(&entry, (u32)msr); |
239 | ibs_op.ibs_op_data1_low = low; | 194 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
240 | ibs_op.ibs_op_data1_high = high; | 195 | rdmsrl(MSR_AMD64_IBSOPDATA, msr); |
241 | rdmsr(MSR_AMD64_IBSOPDATA2, low, high); | 196 | oprofile_add_data(&entry, (u32)msr); |
242 | ibs_op.ibs_op_data2_low = low; | 197 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
243 | ibs_op.ibs_op_data2_high = high; | 198 | rdmsrl(MSR_AMD64_IBSOPDATA2, msr); |
244 | rdmsr(MSR_AMD64_IBSOPDATA3, low, high); | 199 | oprofile_add_data(&entry, (u32)msr); |
245 | ibs_op.ibs_op_data3_low = low; | 200 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
246 | ibs_op.ibs_op_data3_high = high; | 201 | rdmsrl(MSR_AMD64_IBSOPDATA3, msr); |
247 | rdmsr(MSR_AMD64_IBSDCLINAD, low, high); | 202 | oprofile_add_data(&entry, (u32)msr); |
248 | ibs_op.ibs_dc_linear_low = low; | 203 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
249 | ibs_op.ibs_dc_linear_high = high; | 204 | rdmsrl(MSR_AMD64_IBSDCLINAD, msr); |
250 | rdmsr(MSR_AMD64_IBSDCPHYSAD, low, high); | 205 | oprofile_add_data(&entry, (u32)msr); |
251 | ibs_op.ibs_dc_phys_low = low; | 206 | oprofile_add_data(&entry, (u32)(msr >> 32)); |
252 | ibs_op.ibs_dc_phys_high = high; | 207 | rdmsrl(MSR_AMD64_IBSDCPHYSAD, msr); |
208 | oprofile_add_data(&entry, (u32)msr); | ||
209 | oprofile_add_data(&entry, (u32)(msr >> 32)); | ||
210 | oprofile_write_commit(&entry); | ||
253 | 211 | ||
254 | /* reenable the IRQ */ | 212 | /* reenable the IRQ */ |
255 | oprofile_add_ibs_sample(regs, | ||
256 | (unsigned int *)&ibs_op, | ||
257 | IBS_OP_BEGIN); | ||
258 | rdmsr(MSR_AMD64_IBSOPCTL, low, high); | ||
259 | high = 0; | 213 | high = 0; |
260 | low &= ~IBS_OP_LOW_VALID_BIT; | 214 | low &= ~IBS_OP_LOW_VALID_BIT; |
261 | low |= IBS_OP_LOW_ENABLE; | 215 | low |= IBS_OP_LOW_ENABLE; |
@@ -305,14 +259,14 @@ static void op_amd_start(struct op_msrs const * const msrs) | |||
305 | } | 259 | } |
306 | 260 | ||
307 | #ifdef CONFIG_OPROFILE_IBS | 261 | #ifdef CONFIG_OPROFILE_IBS |
308 | if (ibs_allowed && ibs_config.fetch_enabled) { | 262 | if (has_ibs && ibs_config.fetch_enabled) { |
309 | low = (ibs_config.max_cnt_fetch >> 4) & 0xFFFF; | 263 | low = (ibs_config.max_cnt_fetch >> 4) & 0xFFFF; |
310 | high = ((ibs_config.rand_en & 0x1) << 25) /* bit 57 */ | 264 | high = ((ibs_config.rand_en & 0x1) << 25) /* bit 57 */ |
311 | + IBS_FETCH_HIGH_ENABLE; | 265 | + IBS_FETCH_HIGH_ENABLE; |
312 | wrmsr(MSR_AMD64_IBSFETCHCTL, low, high); | 266 | wrmsr(MSR_AMD64_IBSFETCHCTL, low, high); |
313 | } | 267 | } |
314 | 268 | ||
315 | if (ibs_allowed && ibs_config.op_enabled) { | 269 | if (has_ibs && ibs_config.op_enabled) { |
316 | low = ((ibs_config.max_cnt_op >> 4) & 0xFFFF) | 270 | low = ((ibs_config.max_cnt_op >> 4) & 0xFFFF) |
317 | + ((ibs_config.dispatched_ops & 0x1) << 19) /* bit 19 */ | 271 | + ((ibs_config.dispatched_ops & 0x1) << 19) /* bit 19 */ |
318 | + IBS_OP_LOW_ENABLE; | 272 | + IBS_OP_LOW_ENABLE; |
@@ -341,14 +295,14 @@ static void op_amd_stop(struct op_msrs const * const msrs) | |||
341 | } | 295 | } |
342 | 296 | ||
343 | #ifdef CONFIG_OPROFILE_IBS | 297 | #ifdef CONFIG_OPROFILE_IBS |
344 | if (ibs_allowed && ibs_config.fetch_enabled) { | 298 | if (has_ibs && ibs_config.fetch_enabled) { |
345 | /* clear max count and enable */ | 299 | /* clear max count and enable */ |
346 | low = 0; | 300 | low = 0; |
347 | high = 0; | 301 | high = 0; |
348 | wrmsr(MSR_AMD64_IBSFETCHCTL, low, high); | 302 | wrmsr(MSR_AMD64_IBSFETCHCTL, low, high); |
349 | } | 303 | } |
350 | 304 | ||
351 | if (ibs_allowed && ibs_config.op_enabled) { | 305 | if (has_ibs && ibs_config.op_enabled) { |
352 | /* clear max count and enable */ | 306 | /* clear max count and enable */ |
353 | low = 0; | 307 | low = 0; |
354 | high = 0; | 308 | high = 0; |
@@ -409,6 +363,7 @@ static int init_ibs_nmi(void) | |||
409 | | IBSCTL_LVTOFFSETVAL); | 363 | | IBSCTL_LVTOFFSETVAL); |
410 | pci_read_config_dword(cpu_cfg, IBSCTL, &value); | 364 | pci_read_config_dword(cpu_cfg, IBSCTL, &value); |
411 | if (value != (ibs_eilvt_off | IBSCTL_LVTOFFSETVAL)) { | 365 | if (value != (ibs_eilvt_off | IBSCTL_LVTOFFSETVAL)) { |
366 | pci_dev_put(cpu_cfg); | ||
412 | printk(KERN_DEBUG "Failed to setup IBS LVT offset, " | 367 | printk(KERN_DEBUG "Failed to setup IBS LVT offset, " |
413 | "IBSCTL = 0x%08x", value); | 368 | "IBSCTL = 0x%08x", value); |
414 | return 1; | 369 | return 1; |
@@ -436,20 +391,20 @@ static int init_ibs_nmi(void) | |||
436 | /* uninitialize the APIC for the IBS interrupts if needed */ | 391 | /* uninitialize the APIC for the IBS interrupts if needed */ |
437 | static void clear_ibs_nmi(void) | 392 | static void clear_ibs_nmi(void) |
438 | { | 393 | { |
439 | if (ibs_allowed) | 394 | if (has_ibs) |
440 | on_each_cpu(apic_clear_ibs_nmi_per_cpu, NULL, 1); | 395 | on_each_cpu(apic_clear_ibs_nmi_per_cpu, NULL, 1); |
441 | } | 396 | } |
442 | 397 | ||
443 | /* initialize the APIC for the IBS interrupts if available */ | 398 | /* initialize the APIC for the IBS interrupts if available */ |
444 | static void ibs_init(void) | 399 | static void ibs_init(void) |
445 | { | 400 | { |
446 | ibs_allowed = boot_cpu_has(X86_FEATURE_IBS); | 401 | has_ibs = boot_cpu_has(X86_FEATURE_IBS); |
447 | 402 | ||
448 | if (!ibs_allowed) | 403 | if (!has_ibs) |
449 | return; | 404 | return; |
450 | 405 | ||
451 | if (init_ibs_nmi()) { | 406 | if (init_ibs_nmi()) { |
452 | ibs_allowed = 0; | 407 | has_ibs = 0; |
453 | return; | 408 | return; |
454 | } | 409 | } |
455 | 410 | ||
@@ -458,7 +413,7 @@ static void ibs_init(void) | |||
458 | 413 | ||
459 | static void ibs_exit(void) | 414 | static void ibs_exit(void) |
460 | { | 415 | { |
461 | if (!ibs_allowed) | 416 | if (!has_ibs) |
462 | return; | 417 | return; |
463 | 418 | ||
464 | clear_ibs_nmi(); | 419 | clear_ibs_nmi(); |
@@ -478,7 +433,7 @@ static int setup_ibs_files(struct super_block *sb, struct dentry *root) | |||
478 | if (ret) | 433 | if (ret) |
479 | return ret; | 434 | return ret; |
480 | 435 | ||
481 | if (!ibs_allowed) | 436 | if (!has_ibs) |
482 | return ret; | 437 | return ret; |
483 | 438 | ||
484 | /* model specific files */ | 439 | /* model specific files */ |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 9e5752fe4d15..c0ecf250fe51 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -210,11 +210,10 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do | |||
210 | if (bus && node != -1) { | 210 | if (bus && node != -1) { |
211 | #ifdef CONFIG_ACPI_NUMA | 211 | #ifdef CONFIG_ACPI_NUMA |
212 | if (pxm >= 0) | 212 | if (pxm >= 0) |
213 | printk(KERN_DEBUG "bus %02x -> pxm %d -> node %d\n", | 213 | dev_printk(KERN_DEBUG, &bus->dev, |
214 | busnum, pxm, node); | 214 | "on NUMA node %d (pxm %d)\n", node, pxm); |
215 | #else | 215 | #else |
216 | printk(KERN_DEBUG "bus %02x -> node %d\n", | 216 | dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node); |
217 | busnum, node); | ||
218 | #endif | 217 | #endif |
219 | } | 218 | } |
220 | 219 | ||
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 62ddb73e09ed..82d22fc601ae 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -551,17 +551,25 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
551 | if ((err = pci_enable_resources(dev, mask)) < 0) | 551 | if ((err = pci_enable_resources(dev, mask)) < 0) |
552 | return err; | 552 | return err; |
553 | 553 | ||
554 | if (!dev->msi_enabled) | 554 | if (!pci_dev_msi_enabled(dev)) |
555 | return pcibios_enable_irq(dev); | 555 | return pcibios_enable_irq(dev); |
556 | return 0; | 556 | return 0; |
557 | } | 557 | } |
558 | 558 | ||
559 | void pcibios_disable_device (struct pci_dev *dev) | 559 | void pcibios_disable_device (struct pci_dev *dev) |
560 | { | 560 | { |
561 | if (!dev->msi_enabled && pcibios_disable_irq) | 561 | if (!pci_dev_msi_enabled(dev) && pcibios_disable_irq) |
562 | pcibios_disable_irq(dev); | 562 | pcibios_disable_irq(dev); |
563 | } | 563 | } |
564 | 564 | ||
565 | int pci_ext_cfg_avail(struct pci_dev *dev) | ||
566 | { | ||
567 | if (raw_pci_ext_ops) | ||
568 | return 1; | ||
569 | else | ||
570 | return 0; | ||
571 | } | ||
572 | |||
565 | struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node) | 573 | struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node) |
566 | { | 574 | { |
567 | struct pci_bus *bus = NULL; | 575 | struct pci_bus *bus = NULL; |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index e51bf2cda4b0..f884740da318 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -129,7 +129,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
129 | pr = pci_find_parent_resource(dev, r); | 129 | pr = pci_find_parent_resource(dev, r); |
130 | if (!r->start || !pr || | 130 | if (!r->start || !pr || |
131 | request_resource(pr, r) < 0) { | 131 | request_resource(pr, r) < 0) { |
132 | dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx); | 132 | dev_info(&dev->dev, "BAR %d: can't allocate resource\n", idx); |
133 | /* | 133 | /* |
134 | * Something is wrong with the region. | 134 | * Something is wrong with the region. |
135 | * Invalidate the resource to prevent | 135 | * Invalidate the resource to prevent |
@@ -170,7 +170,7 @@ static void __init pcibios_allocate_resources(int pass) | |||
170 | r->flags, disabled, pass); | 170 | r->flags, disabled, pass); |
171 | pr = pci_find_parent_resource(dev, r); | 171 | pr = pci_find_parent_resource(dev, r); |
172 | if (!pr || request_resource(pr, r) < 0) { | 172 | if (!pr || request_resource(pr, r) < 0) { |
173 | dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx); | 173 | dev_info(&dev->dev, "BAR %d: can't allocate resource\n", idx); |
174 | /* We'll assign a new address later */ | 174 | /* We'll assign a new address later */ |
175 | r->end -= r->start; | 175 | r->end -= r->start; |
176 | r->start = 0; | 176 | r->start = 0; |
diff --git a/arch/x86/pci/init.c b/arch/x86/pci/init.c index bec3b048e72b..25a1f8efed4a 100644 --- a/arch/x86/pci/init.c +++ b/arch/x86/pci/init.c | |||
@@ -12,7 +12,8 @@ static __init int pci_arch_init(void) | |||
12 | type = pci_direct_probe(); | 12 | type = pci_direct_probe(); |
13 | #endif | 13 | #endif |
14 | 14 | ||
15 | pci_mmcfg_early_init(); | 15 | if (!(pci_probe & PCI_PROBE_NOEARLY)) |
16 | pci_mmcfg_early_init(); | ||
16 | 17 | ||
17 | #ifdef CONFIG_PCI_OLPC | 18 | #ifdef CONFIG_PCI_OLPC |
18 | if (!pci_olpc_init()) | 19 | if (!pci_olpc_init()) |
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index 373b9afe6d44..4064345cf144 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -533,7 +533,7 @@ static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, | |||
533 | { | 533 | { |
534 | struct pci_dev *bridge; | 534 | struct pci_dev *bridge; |
535 | int pin = pci_get_interrupt_pin(dev, &bridge); | 535 | int pin = pci_get_interrupt_pin(dev, &bridge); |
536 | return pcibios_set_irq_routing(bridge, pin, irq); | 536 | return pcibios_set_irq_routing(bridge, pin - 1, irq); |
537 | } | 537 | } |
538 | 538 | ||
539 | #endif | 539 | #endif |
@@ -887,7 +887,6 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
887 | dev_dbg(&dev->dev, "no interrupt pin\n"); | 887 | dev_dbg(&dev->dev, "no interrupt pin\n"); |
888 | return 0; | 888 | return 0; |
889 | } | 889 | } |
890 | pin = pin - 1; | ||
891 | 890 | ||
892 | /* Find IRQ routing entry */ | 891 | /* Find IRQ routing entry */ |
893 | 892 | ||
@@ -897,17 +896,17 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
897 | info = pirq_get_info(dev); | 896 | info = pirq_get_info(dev); |
898 | if (!info) { | 897 | if (!info) { |
899 | dev_dbg(&dev->dev, "PCI INT %c not found in routing table\n", | 898 | dev_dbg(&dev->dev, "PCI INT %c not found in routing table\n", |
900 | 'A' + pin); | 899 | 'A' + pin - 1); |
901 | return 0; | 900 | return 0; |
902 | } | 901 | } |
903 | pirq = info->irq[pin].link; | 902 | pirq = info->irq[pin - 1].link; |
904 | mask = info->irq[pin].bitmap; | 903 | mask = info->irq[pin - 1].bitmap; |
905 | if (!pirq) { | 904 | if (!pirq) { |
906 | dev_dbg(&dev->dev, "PCI INT %c not routed\n", 'A' + pin); | 905 | dev_dbg(&dev->dev, "PCI INT %c not routed\n", 'A' + pin - 1); |
907 | return 0; | 906 | return 0; |
908 | } | 907 | } |
909 | dev_dbg(&dev->dev, "PCI INT %c -> PIRQ %02x, mask %04x, excl %04x", | 908 | dev_dbg(&dev->dev, "PCI INT %c -> PIRQ %02x, mask %04x, excl %04x", |
910 | 'A' + pin, pirq, mask, pirq_table->exclusive_irqs); | 909 | 'A' + pin - 1, pirq, mask, pirq_table->exclusive_irqs); |
911 | mask &= pcibios_irq_mask; | 910 | mask &= pcibios_irq_mask; |
912 | 911 | ||
913 | /* Work around broken HP Pavilion Notebooks which assign USB to | 912 | /* Work around broken HP Pavilion Notebooks which assign USB to |
@@ -949,7 +948,7 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
949 | newirq = i; | 948 | newirq = i; |
950 | } | 949 | } |
951 | } | 950 | } |
952 | dev_dbg(&dev->dev, "PCI INT %c -> newirq %d", 'A' + pin, newirq); | 951 | dev_dbg(&dev->dev, "PCI INT %c -> newirq %d", 'A' + pin - 1, newirq); |
953 | 952 | ||
954 | /* Check if it is hardcoded */ | 953 | /* Check if it is hardcoded */ |
955 | if ((pirq & 0xf0) == 0xf0) { | 954 | if ((pirq & 0xf0) == 0xf0) { |
@@ -977,18 +976,18 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
977 | return 0; | 976 | return 0; |
978 | } | 977 | } |
979 | } | 978 | } |
980 | dev_info(&dev->dev, "%s PCI INT %c -> IRQ %d\n", msg, 'A' + pin, irq); | 979 | dev_info(&dev->dev, "%s PCI INT %c -> IRQ %d\n", msg, 'A' + pin - 1, irq); |
981 | 980 | ||
982 | /* Update IRQ for all devices with the same pirq value */ | 981 | /* Update IRQ for all devices with the same pirq value */ |
983 | while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { | 982 | while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { |
984 | pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin); | 983 | pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin); |
985 | if (!pin) | 984 | if (!pin) |
986 | continue; | 985 | continue; |
987 | pin--; | 986 | |
988 | info = pirq_get_info(dev2); | 987 | info = pirq_get_info(dev2); |
989 | if (!info) | 988 | if (!info) |
990 | continue; | 989 | continue; |
991 | if (info->irq[pin].link == pirq) { | 990 | if (info->irq[pin - 1].link == pirq) { |
992 | /* | 991 | /* |
993 | * We refuse to override the dev->irq | 992 | * We refuse to override the dev->irq |
994 | * information. Give a warning! | 993 | * information. Give a warning! |
@@ -1042,6 +1041,9 @@ static void __init pcibios_fixup_irqs(void) | |||
1042 | dev = NULL; | 1041 | dev = NULL; |
1043 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 1042 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
1044 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); | 1043 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
1044 | if (!pin) | ||
1045 | continue; | ||
1046 | |||
1045 | #ifdef CONFIG_X86_IO_APIC | 1047 | #ifdef CONFIG_X86_IO_APIC |
1046 | /* | 1048 | /* |
1047 | * Recalculate IRQ numbers if we use the I/O APIC. | 1049 | * Recalculate IRQ numbers if we use the I/O APIC. |
@@ -1049,15 +1051,11 @@ static void __init pcibios_fixup_irqs(void) | |||
1049 | if (io_apic_assign_pci_irqs) { | 1051 | if (io_apic_assign_pci_irqs) { |
1050 | int irq; | 1052 | int irq; |
1051 | 1053 | ||
1052 | if (!pin) | ||
1053 | continue; | ||
1054 | |||
1055 | /* | 1054 | /* |
1056 | * interrupt pins are numbered starting from 1 | 1055 | * interrupt pins are numbered starting from 1 |
1057 | */ | 1056 | */ |
1058 | pin--; | ||
1059 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | 1057 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, |
1060 | PCI_SLOT(dev->devfn), pin); | 1058 | PCI_SLOT(dev->devfn), pin - 1); |
1061 | /* | 1059 | /* |
1062 | * Busses behind bridges are typically not listed in the | 1060 | * Busses behind bridges are typically not listed in the |
1063 | * MP-table. In this case we have to look up the IRQ | 1061 | * MP-table. In this case we have to look up the IRQ |
@@ -1070,22 +1068,22 @@ static void __init pcibios_fixup_irqs(void) | |||
1070 | struct pci_dev *bridge = dev->bus->self; | 1068 | struct pci_dev *bridge = dev->bus->self; |
1071 | int bus; | 1069 | int bus; |
1072 | 1070 | ||
1073 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; | 1071 | pin = pci_swizzle_interrupt_pin(dev, pin); |
1074 | bus = bridge->bus->number; | 1072 | bus = bridge->bus->number; |
1075 | irq = IO_APIC_get_PCI_irq_vector(bus, | 1073 | irq = IO_APIC_get_PCI_irq_vector(bus, |
1076 | PCI_SLOT(bridge->devfn), pin); | 1074 | PCI_SLOT(bridge->devfn), pin - 1); |
1077 | if (irq >= 0) | 1075 | if (irq >= 0) |
1078 | dev_warn(&dev->dev, | 1076 | dev_warn(&dev->dev, |
1079 | "using bridge %s INT %c to " | 1077 | "using bridge %s INT %c to " |
1080 | "get IRQ %d\n", | 1078 | "get IRQ %d\n", |
1081 | pci_name(bridge), | 1079 | pci_name(bridge), |
1082 | 'A' + pin, irq); | 1080 | 'A' + pin - 1, irq); |
1083 | } | 1081 | } |
1084 | if (irq >= 0) { | 1082 | if (irq >= 0) { |
1085 | dev_info(&dev->dev, | 1083 | dev_info(&dev->dev, |
1086 | "PCI->APIC IRQ transform: INT %c " | 1084 | "PCI->APIC IRQ transform: INT %c " |
1087 | "-> IRQ %d\n", | 1085 | "-> IRQ %d\n", |
1088 | 'A' + pin, irq); | 1086 | 'A' + pin - 1, irq); |
1089 | dev->irq = irq; | 1087 | dev->irq = irq; |
1090 | } | 1088 | } |
1091 | } | 1089 | } |
@@ -1093,7 +1091,7 @@ static void __init pcibios_fixup_irqs(void) | |||
1093 | /* | 1091 | /* |
1094 | * Still no IRQ? Try to lookup one... | 1092 | * Still no IRQ? Try to lookup one... |
1095 | */ | 1093 | */ |
1096 | if (pin && !dev->irq) | 1094 | if (!dev->irq) |
1097 | pcibios_lookup_irq(dev, 0); | 1095 | pcibios_lookup_irq(dev, 0); |
1098 | } | 1096 | } |
1099 | } | 1097 | } |
@@ -1220,12 +1218,10 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1220 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { | 1218 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { |
1221 | char *msg = ""; | 1219 | char *msg = ""; |
1222 | 1220 | ||
1223 | pin--; /* interrupt pins are numbered starting from 1 */ | ||
1224 | |||
1225 | if (io_apic_assign_pci_irqs) { | 1221 | if (io_apic_assign_pci_irqs) { |
1226 | int irq; | 1222 | int irq; |
1227 | 1223 | ||
1228 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); | 1224 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin - 1); |
1229 | /* | 1225 | /* |
1230 | * Busses behind bridges are typically not listed in the MP-table. | 1226 | * Busses behind bridges are typically not listed in the MP-table. |
1231 | * In this case we have to look up the IRQ based on the parent bus, | 1227 | * In this case we have to look up the IRQ based on the parent bus, |
@@ -1236,20 +1232,20 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1236 | while (irq < 0 && dev->bus->parent) { /* go back to the bridge */ | 1232 | while (irq < 0 && dev->bus->parent) { /* go back to the bridge */ |
1237 | struct pci_dev *bridge = dev->bus->self; | 1233 | struct pci_dev *bridge = dev->bus->self; |
1238 | 1234 | ||
1239 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; | 1235 | pin = pci_swizzle_interrupt_pin(dev, pin); |
1240 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, | 1236 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, |
1241 | PCI_SLOT(bridge->devfn), pin); | 1237 | PCI_SLOT(bridge->devfn), pin - 1); |
1242 | if (irq >= 0) | 1238 | if (irq >= 0) |
1243 | dev_warn(&dev->dev, "using bridge %s " | 1239 | dev_warn(&dev->dev, "using bridge %s " |
1244 | "INT %c to get IRQ %d\n", | 1240 | "INT %c to get IRQ %d\n", |
1245 | pci_name(bridge), 'A' + pin, | 1241 | pci_name(bridge), 'A' + pin - 1, |
1246 | irq); | 1242 | irq); |
1247 | dev = bridge; | 1243 | dev = bridge; |
1248 | } | 1244 | } |
1249 | dev = temp_dev; | 1245 | dev = temp_dev; |
1250 | if (irq >= 0) { | 1246 | if (irq >= 0) { |
1251 | dev_info(&dev->dev, "PCI->APIC IRQ transform: " | 1247 | dev_info(&dev->dev, "PCI->APIC IRQ transform: " |
1252 | "INT %c -> IRQ %d\n", 'A' + pin, irq); | 1248 | "INT %c -> IRQ %d\n", 'A' + pin - 1, irq); |
1253 | dev->irq = irq; | 1249 | dev->irq = irq; |
1254 | return 0; | 1250 | return 0; |
1255 | } else | 1251 | } else |
@@ -1268,7 +1264,7 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1268 | return 0; | 1264 | return 0; |
1269 | 1265 | ||
1270 | dev_warn(&dev->dev, "can't find IRQ for PCI INT %c%s\n", | 1266 | dev_warn(&dev->dev, "can't find IRQ for PCI INT %c%s\n", |
1271 | 'A' + pin, msg); | 1267 | 'A' + pin - 1, msg); |
1272 | } | 1268 | } |
1273 | return 0; | 1269 | return 0; |
1274 | } | 1270 | } |
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c index 16d0c0eb0d19..bcead7a46871 100644 --- a/arch/x86/pci/visws.c +++ b/arch/x86/pci/visws.c | |||
@@ -24,24 +24,6 @@ static void pci_visws_disable_irq(struct pci_dev *dev) { } | |||
24 | 24 | ||
25 | unsigned int pci_bus0, pci_bus1; | 25 | unsigned int pci_bus0, pci_bus1; |
26 | 26 | ||
27 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
28 | { | ||
29 | return (((pin - 1) + slot) % 4) + 1; | ||
30 | } | ||
31 | |||
32 | static u8 __init visws_swizzle(struct pci_dev *dev, u8 *pinp) | ||
33 | { | ||
34 | u8 pin = *pinp; | ||
35 | |||
36 | while (dev->bus->self) { /* Move up the chain of bridges. */ | ||
37 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | ||
38 | dev = dev->bus->self; | ||
39 | } | ||
40 | *pinp = pin; | ||
41 | |||
42 | return PCI_SLOT(dev->devfn); | ||
43 | } | ||
44 | |||
45 | static int __init visws_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 27 | static int __init visws_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
46 | { | 28 | { |
47 | int irq, bus = dev->bus->number; | 29 | int irq, bus = dev->bus->number; |
@@ -106,7 +88,7 @@ int __init pci_visws_init(void) | |||
106 | raw_pci_ops = &pci_direct_conf1; | 88 | raw_pci_ops = &pci_direct_conf1; |
107 | pci_scan_bus_with_sysdata(pci_bus0); | 89 | pci_scan_bus_with_sysdata(pci_bus0); |
108 | pci_scan_bus_with_sysdata(pci_bus1); | 90 | pci_scan_bus_with_sysdata(pci_bus1); |
109 | pci_fixup_irqs(visws_swizzle, visws_map_irq); | 91 | pci_fixup_irqs(pci_common_swizzle, visws_map_irq); |
110 | pcibios_resource_survey(); | 92 | pcibios_resource_survey(); |
111 | return 0; | 93 | return 0; |
112 | } | 94 | } |