diff options
210 files changed, 2361 insertions, 1734 deletions
diff --git a/Documentation/hwmon/sysfs-interface b/Documentation/hwmon/sysfs-interface index 2f10ce6a879f..004ee161721e 100644 --- a/Documentation/hwmon/sysfs-interface +++ b/Documentation/hwmon/sysfs-interface | |||
@@ -150,6 +150,11 @@ fan[1-*]_min Fan minimum value | |||
150 | Unit: revolution/min (RPM) | 150 | Unit: revolution/min (RPM) |
151 | RW | 151 | RW |
152 | 152 | ||
153 | fan[1-*]_max Fan maximum value | ||
154 | Unit: revolution/min (RPM) | ||
155 | Only rarely supported by the hardware. | ||
156 | RW | ||
157 | |||
153 | fan[1-*]_input Fan input value. | 158 | fan[1-*]_input Fan input value. |
154 | Unit: revolution/min (RPM) | 159 | Unit: revolution/min (RPM) |
155 | RO | 160 | RO |
@@ -390,6 +395,7 @@ OR | |||
390 | in[0-*]_min_alarm | 395 | in[0-*]_min_alarm |
391 | in[0-*]_max_alarm | 396 | in[0-*]_max_alarm |
392 | fan[1-*]_min_alarm | 397 | fan[1-*]_min_alarm |
398 | fan[1-*]_max_alarm | ||
393 | temp[1-*]_min_alarm | 399 | temp[1-*]_min_alarm |
394 | temp[1-*]_max_alarm | 400 | temp[1-*]_max_alarm |
395 | temp[1-*]_crit_alarm | 401 | temp[1-*]_crit_alarm |
diff --git a/Documentation/input/multi-touch-protocol.txt b/Documentation/input/multi-touch-protocol.txt index 9f09557aea39..a12ea3b586e6 100644 --- a/Documentation/input/multi-touch-protocol.txt +++ b/Documentation/input/multi-touch-protocol.txt | |||
@@ -18,8 +18,12 @@ Usage | |||
18 | Anonymous finger details are sent sequentially as separate packets of ABS | 18 | Anonymous finger details are sent sequentially as separate packets of ABS |
19 | events. Only the ABS_MT events are recognized as part of a finger | 19 | events. Only the ABS_MT events are recognized as part of a finger |
20 | packet. The end of a packet is marked by calling the input_mt_sync() | 20 | packet. The end of a packet is marked by calling the input_mt_sync() |
21 | function, which generates a SYN_MT_REPORT event. The end of multi-touch | 21 | function, which generates a SYN_MT_REPORT event. This instructs the |
22 | transfer is marked by calling the usual input_sync() function. | 22 | receiver to accept the data for the current finger and prepare to receive |
23 | another. The end of a multi-touch transfer is marked by calling the usual | ||
24 | input_sync() function. This instructs the receiver to act upon events | ||
25 | accumulated since last EV_SYN/SYN_REPORT and prepare to receive a new | ||
26 | set of events/packets. | ||
23 | 27 | ||
24 | A set of ABS_MT events with the desired properties is defined. The events | 28 | A set of ABS_MT events with the desired properties is defined. The events |
25 | are divided into categories, to allow for partial implementation. The | 29 | are divided into categories, to allow for partial implementation. The |
@@ -27,11 +31,26 @@ minimum set consists of ABS_MT_TOUCH_MAJOR, ABS_MT_POSITION_X and | |||
27 | ABS_MT_POSITION_Y, which allows for multiple fingers to be tracked. If the | 31 | ABS_MT_POSITION_Y, which allows for multiple fingers to be tracked. If the |
28 | device supports it, the ABS_MT_WIDTH_MAJOR may be used to provide the size | 32 | device supports it, the ABS_MT_WIDTH_MAJOR may be used to provide the size |
29 | of the approaching finger. Anisotropy and direction may be specified with | 33 | of the approaching finger. Anisotropy and direction may be specified with |
30 | ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION. Devices with | 34 | ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION. The |
31 | more granular information may specify general shapes as blobs, i.e., as a | 35 | ABS_MT_TOOL_TYPE may be used to specify whether the touching tool is a |
32 | sequence of rectangular shapes grouped together by an | 36 | finger or a pen or something else. Devices with more granular information |
33 | ABS_MT_BLOB_ID. Finally, the ABS_MT_TOOL_TYPE may be used to specify | 37 | may specify general shapes as blobs, i.e., as a sequence of rectangular |
34 | whether the touching tool is a finger or a pen or something else. | 38 | shapes grouped together by an ABS_MT_BLOB_ID. Finally, for the few devices |
39 | that currently support it, the ABS_MT_TRACKING_ID event may be used to | ||
40 | report finger tracking from hardware [5]. | ||
41 | |||
42 | Here is what a minimal event sequence for a two-finger touch would look | ||
43 | like: | ||
44 | |||
45 | ABS_MT_TOUCH_MAJOR | ||
46 | ABS_MT_POSITION_X | ||
47 | ABS_MT_POSITION_Y | ||
48 | SYN_MT_REPORT | ||
49 | ABS_MT_TOUCH_MAJOR | ||
50 | ABS_MT_POSITION_X | ||
51 | ABS_MT_POSITION_Y | ||
52 | SYN_MT_REPORT | ||
53 | SYN_REPORT | ||
35 | 54 | ||
36 | 55 | ||
37 | Event Semantics | 56 | Event Semantics |
@@ -44,24 +63,24 @@ ABS_MT_TOUCH_MAJOR | |||
44 | 63 | ||
45 | The length of the major axis of the contact. The length should be given in | 64 | The length of the major axis of the contact. The length should be given in |
46 | surface units. If the surface has an X times Y resolution, the largest | 65 | surface units. If the surface has an X times Y resolution, the largest |
47 | possible value of ABS_MT_TOUCH_MAJOR is sqrt(X^2 + Y^2), the diagonal. | 66 | possible value of ABS_MT_TOUCH_MAJOR is sqrt(X^2 + Y^2), the diagonal [4]. |
48 | 67 | ||
49 | ABS_MT_TOUCH_MINOR | 68 | ABS_MT_TOUCH_MINOR |
50 | 69 | ||
51 | The length, in surface units, of the minor axis of the contact. If the | 70 | The length, in surface units, of the minor axis of the contact. If the |
52 | contact is circular, this event can be omitted. | 71 | contact is circular, this event can be omitted [4]. |
53 | 72 | ||
54 | ABS_MT_WIDTH_MAJOR | 73 | ABS_MT_WIDTH_MAJOR |
55 | 74 | ||
56 | The length, in surface units, of the major axis of the approaching | 75 | The length, in surface units, of the major axis of the approaching |
57 | tool. This should be understood as the size of the tool itself. The | 76 | tool. This should be understood as the size of the tool itself. The |
58 | orientation of the contact and the approaching tool are assumed to be the | 77 | orientation of the contact and the approaching tool are assumed to be the |
59 | same. | 78 | same [4]. |
60 | 79 | ||
61 | ABS_MT_WIDTH_MINOR | 80 | ABS_MT_WIDTH_MINOR |
62 | 81 | ||
63 | The length, in surface units, of the minor axis of the approaching | 82 | The length, in surface units, of the minor axis of the approaching |
64 | tool. Omit if circular. | 83 | tool. Omit if circular [4]. |
65 | 84 | ||
66 | The above four values can be used to derive additional information about | 85 | The above four values can be used to derive additional information about |
67 | the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates | 86 | the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates |
@@ -70,14 +89,17 @@ different characteristic widths [1]. | |||
70 | 89 | ||
71 | ABS_MT_ORIENTATION | 90 | ABS_MT_ORIENTATION |
72 | 91 | ||
73 | The orientation of the ellipse. The value should describe half a revolution | 92 | The orientation of the ellipse. The value should describe a signed quarter |
74 | clockwise around the touch center. The scale of the value is arbitrary, but | 93 | of a revolution clockwise around the touch center. The signed value range |
75 | zero should be returned for an ellipse aligned along the Y axis of the | 94 | is arbitrary, but zero should be returned for a finger aligned along the Y |
76 | surface. As an example, an index finger placed straight onto the axis could | 95 | axis of the surface, a negative value when finger is turned to the left, and |
77 | return zero orientation, something negative when twisted to the left, and | 96 | a positive value when finger turned to the right. When completely aligned with |
78 | something positive when twisted to the right. This value can be omitted if | 97 | the X axis, the range max should be returned. Orientation can be omitted |
79 | the touching object is circular, or if the information is not available in | 98 | if the touching object is circular, or if the information is not available |
80 | the kernel driver. | 99 | in the kernel driver. Partial orientation support is possible if the device |
100 | can distinguish between the two axis, but not (uniquely) any values in | ||
101 | between. In such cases, the range of ABS_MT_ORIENTATION should be [0, 1] | ||
102 | [4]. | ||
81 | 103 | ||
82 | ABS_MT_POSITION_X | 104 | ABS_MT_POSITION_X |
83 | 105 | ||
@@ -98,8 +120,35 @@ ABS_MT_BLOB_ID | |||
98 | 120 | ||
99 | The BLOB_ID groups several packets together into one arbitrarily shaped | 121 | The BLOB_ID groups several packets together into one arbitrarily shaped |
100 | contact. This is a low-level anonymous grouping, and should not be confused | 122 | contact. This is a low-level anonymous grouping, and should not be confused |
101 | with the high-level contactID, explained below. Most kernel drivers will | 123 | with the high-level trackingID [5]. Most kernel drivers will not have blob |
102 | not have this capability, and can safely omit the event. | 124 | capability, and can safely omit the event. |
125 | |||
126 | ABS_MT_TRACKING_ID | ||
127 | |||
128 | The TRACKING_ID identifies an initiated contact throughout its life cycle | ||
129 | [5]. There are currently only a few devices that support it, so this event | ||
130 | should normally be omitted. | ||
131 | |||
132 | |||
133 | Event Computation | ||
134 | ----------------- | ||
135 | |||
136 | The flora of different hardware unavoidably leads to some devices fitting | ||
137 | better to the MT protocol than others. To simplify and unify the mapping, | ||
138 | this section gives recipes for how to compute certain events. | ||
139 | |||
140 | For devices reporting contacts as rectangular shapes, signed orientation | ||
141 | cannot be obtained. Assuming X and Y are the lengths of the sides of the | ||
142 | touching rectangle, here is a simple formula that retains the most | ||
143 | information possible: | ||
144 | |||
145 | ABS_MT_TOUCH_MAJOR := max(X, Y) | ||
146 | ABS_MT_TOUCH_MINOR := min(X, Y) | ||
147 | ABS_MT_ORIENTATION := bool(X > Y) | ||
148 | |||
149 | The range of ABS_MT_ORIENTATION should be set to [0, 1], to indicate that | ||
150 | the device can distinguish between a finger along the Y axis (0) and a | ||
151 | finger along the X axis (1). | ||
103 | 152 | ||
104 | 153 | ||
105 | Finger Tracking | 154 | Finger Tracking |
@@ -109,14 +158,18 @@ The kernel driver should generate an arbitrary enumeration of the set of | |||
109 | anonymous contacts currently on the surface. The order in which the packets | 158 | anonymous contacts currently on the surface. The order in which the packets |
110 | appear in the event stream is not important. | 159 | appear in the event stream is not important. |
111 | 160 | ||
112 | The process of finger tracking, i.e., to assign a unique contactID to each | 161 | The process of finger tracking, i.e., to assign a unique trackingID to each |
113 | initiated contact on the surface, is left to user space; preferably the | 162 | initiated contact on the surface, is left to user space; preferably the |
114 | multi-touch X driver [3]. In that driver, the contactID stays the same and | 163 | multi-touch X driver [3]. In that driver, the trackingID stays the same and |
115 | unique until the contact vanishes (when the finger leaves the surface). The | 164 | unique until the contact vanishes (when the finger leaves the surface). The |
116 | problem of assigning a set of anonymous fingers to a set of identified | 165 | problem of assigning a set of anonymous fingers to a set of identified |
117 | fingers is a euclidian bipartite matching problem at each event update, and | 166 | fingers is a euclidian bipartite matching problem at each event update, and |
118 | relies on a sufficiently rapid update rate. | 167 | relies on a sufficiently rapid update rate. |
119 | 168 | ||
169 | There are a few devices that support trackingID in hardware. User space can | ||
170 | make use of these native identifiers to reduce bandwidth and cpu usage. | ||
171 | |||
172 | |||
120 | Notes | 173 | Notes |
121 | ----- | 174 | ----- |
122 | 175 | ||
@@ -136,5 +189,7 @@ could be used to derive tilt. | |||
136 | time of writing (April 2009), the MT protocol is not yet merged, and the | 189 | time of writing (April 2009), the MT protocol is not yet merged, and the |
137 | prototype implements finger matching, basic mouse support and two-finger | 190 | prototype implements finger matching, basic mouse support and two-finger |
138 | scrolling. The project aims at improving the quality of current multi-touch | 191 | scrolling. The project aims at improving the quality of current multi-touch |
139 | functionality available in the synaptics X driver, and in addition | 192 | functionality available in the Synaptics X driver, and in addition |
140 | implement more advanced gestures. | 193 | implement more advanced gestures. |
194 | [4] See the section on event computation. | ||
195 | [5] See the section on finger tracking. | ||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index fd5cac013037..11648c13a729 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1575,6 +1575,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1575 | noinitrd [RAM] Tells the kernel not to load any configured | 1575 | noinitrd [RAM] Tells the kernel not to load any configured |
1576 | initial RAM disk. | 1576 | initial RAM disk. |
1577 | 1577 | ||
1578 | nointremap [X86-64, Intel-IOMMU] Do not enable interrupt | ||
1579 | remapping. | ||
1580 | |||
1578 | nointroute [IA-64] | 1581 | nointroute [IA-64] |
1579 | 1582 | ||
1580 | nojitter [IA64] Disables jitter checking for ITC timers. | 1583 | nojitter [IA64] Disables jitter checking for ITC timers. |
diff --git a/Documentation/sound/alsa/Procfile.txt b/Documentation/sound/alsa/Procfile.txt index bba2dbb79d81..cfac20cf9e33 100644 --- a/Documentation/sound/alsa/Procfile.txt +++ b/Documentation/sound/alsa/Procfile.txt | |||
@@ -104,6 +104,11 @@ card*/pcm*/xrun_debug | |||
104 | When this value is greater than 1, the driver will show the | 104 | When this value is greater than 1, the driver will show the |
105 | stack trace additionally. This may help the debugging. | 105 | stack trace additionally. This may help the debugging. |
106 | 106 | ||
107 | Since 2.6.30, this option also enables the hwptr check using | ||
108 | jiffies. This detects spontaneous invalid pointer callback | ||
109 | values, but can be lead to too much corrections for a (mostly | ||
110 | buggy) hardware that doesn't give smooth pointer updates. | ||
111 | |||
107 | card*/pcm*/sub*/info | 112 | card*/pcm*/sub*/info |
108 | The general information of this PCM sub-stream. | 113 | The general information of this PCM sub-stream. |
109 | 114 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 5ee166e27b9f..cf4abddfc8a4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -434,7 +434,7 @@ F: arch/alpha/ | |||
434 | 434 | ||
435 | AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER | 435 | AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER |
436 | P: Thomas Dahlmann | 436 | P: Thomas Dahlmann |
437 | M: thomas.dahlmann@amd.com | 437 | M: dahlmann.thomas@arcor.de |
438 | L: linux-geode@lists.infradead.org (moderated for non-subscribers) | 438 | L: linux-geode@lists.infradead.org (moderated for non-subscribers) |
439 | S: Supported | 439 | S: Supported |
440 | F: drivers/usb/gadget/amd5536udc.* | 440 | F: drivers/usb/gadget/amd5536udc.* |
@@ -624,6 +624,7 @@ M: paulius.zaleckas@teltonika.lt | |||
624 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) | 624 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) |
625 | T: git git://gitorious.org/linux-gemini/mainline.git | 625 | T: git git://gitorious.org/linux-gemini/mainline.git |
626 | S: Maintained | 626 | S: Maintained |
627 | F: arch/arm/mach-gemini/ | ||
627 | 628 | ||
628 | ARM/EBSA110 MACHINE SUPPORT | 629 | ARM/EBSA110 MACHINE SUPPORT |
629 | P: Russell King | 630 | P: Russell King |
@@ -650,6 +651,7 @@ P: Paulius Zaleckas | |||
650 | M: paulius.zaleckas@teltonika.lt | 651 | M: paulius.zaleckas@teltonika.lt |
651 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) | 652 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) |
652 | S: Maintained | 653 | S: Maintained |
654 | F: arch/arm/mm/*-fa* | ||
653 | 655 | ||
654 | ARM/FOOTBRIDGE ARCHITECTURE | 656 | ARM/FOOTBRIDGE ARCHITECTURE |
655 | P: Russell King | 657 | P: Russell King |
@@ -1540,6 +1542,13 @@ W: http://www.fi.muni.cz/~kas/cosa/ | |||
1540 | S: Maintained | 1542 | S: Maintained |
1541 | F: drivers/net/wan/cosa* | 1543 | F: drivers/net/wan/cosa* |
1542 | 1544 | ||
1545 | CPMAC ETHERNET DRIVER | ||
1546 | P: Florian Fainelli | ||
1547 | M: florian@openwrt.org | ||
1548 | L: netdev@vger.kernel.org | ||
1549 | S: Maintained | ||
1550 | F: drivers/net/cpmac.c | ||
1551 | |||
1543 | CPU FREQUENCY DRIVERS | 1552 | CPU FREQUENCY DRIVERS |
1544 | P: Dave Jones | 1553 | P: Dave Jones |
1545 | M: davej@redhat.com | 1554 | M: davej@redhat.com |
@@ -1971,8 +1980,8 @@ F: include/linux/edac.h | |||
1971 | 1980 | ||
1972 | EDAC-E752X | 1981 | EDAC-E752X |
1973 | P: Mark Gross | 1982 | P: Mark Gross |
1974 | P: Doug Thompson | ||
1975 | M: mark.gross@intel.com | 1983 | M: mark.gross@intel.com |
1984 | P: Doug Thompson | ||
1976 | M: dougthompson@xmission.com | 1985 | M: dougthompson@xmission.com |
1977 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 1986 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
1978 | W: bluesmoke.sourceforge.net | 1987 | W: bluesmoke.sourceforge.net |
@@ -2249,7 +2258,7 @@ P: Li Yang | |||
2249 | M: leoli@freescale.com | 2258 | M: leoli@freescale.com |
2250 | P: Zhang Wei | 2259 | P: Zhang Wei |
2251 | M: zw@zh-kernel.org | 2260 | M: zw@zh-kernel.org |
2252 | L: linuxppc-embedded@ozlabs.org | 2261 | L: linuxppc-dev@ozlabs.org |
2253 | L: linux-kernel@vger.kernel.org | 2262 | L: linux-kernel@vger.kernel.org |
2254 | S: Maintained | 2263 | S: Maintained |
2255 | F: drivers/dma/fsldma.* | 2264 | F: drivers/dma/fsldma.* |
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index 9c9d1fd4155f..5bd5259324b7 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -176,22 +176,26 @@ cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) | |||
176 | } | 176 | } |
177 | } | 177 | } |
178 | 178 | ||
179 | static void | 179 | static int |
180 | dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) | 180 | dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) |
181 | { | 181 | { |
182 | spin_lock(&dp264_irq_lock); | 182 | spin_lock(&dp264_irq_lock); |
183 | cpu_set_irq_affinity(irq, *affinity); | 183 | cpu_set_irq_affinity(irq, *affinity); |
184 | tsunami_update_irq_hw(cached_irq_mask); | 184 | tsunami_update_irq_hw(cached_irq_mask); |
185 | spin_unlock(&dp264_irq_lock); | 185 | spin_unlock(&dp264_irq_lock); |
186 | |||
187 | return 0; | ||
186 | } | 188 | } |
187 | 189 | ||
188 | static void | 190 | static int |
189 | clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) | 191 | clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) |
190 | { | 192 | { |
191 | spin_lock(&dp264_irq_lock); | 193 | spin_lock(&dp264_irq_lock); |
192 | cpu_set_irq_affinity(irq - 16, *affinity); | 194 | cpu_set_irq_affinity(irq - 16, *affinity); |
193 | tsunami_update_irq_hw(cached_irq_mask); | 195 | tsunami_update_irq_hw(cached_irq_mask); |
194 | spin_unlock(&dp264_irq_lock); | 196 | spin_unlock(&dp264_irq_lock); |
197 | |||
198 | return 0; | ||
195 | } | 199 | } |
196 | 200 | ||
197 | static struct hw_interrupt_type dp264_irq_type = { | 201 | static struct hw_interrupt_type dp264_irq_type = { |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 27f840a4ad3d..8dd239ebdb9e 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -157,13 +157,15 @@ titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) | |||
157 | 157 | ||
158 | } | 158 | } |
159 | 159 | ||
160 | static void | 160 | static int |
161 | titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | 161 | titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) |
162 | { | 162 | { |
163 | spin_lock(&titan_irq_lock); | 163 | spin_lock(&titan_irq_lock); |
164 | titan_cpu_set_irq_affinity(irq - 16, *affinity); | 164 | titan_cpu_set_irq_affinity(irq - 16, *affinity); |
165 | titan_update_irq_hw(titan_cached_irq_mask); | 165 | titan_update_irq_hw(titan_cached_irq_mask); |
166 | spin_unlock(&titan_irq_lock); | 166 | spin_unlock(&titan_irq_lock); |
167 | |||
168 | return 0; | ||
167 | } | 169 | } |
168 | 170 | ||
169 | static void | 171 | static void |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 3e1714c6523f..664c7b8b1ba8 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
@@ -109,7 +109,7 @@ static void gic_unmask_irq(unsigned int irq) | |||
109 | } | 109 | } |
110 | 110 | ||
111 | #ifdef CONFIG_SMP | 111 | #ifdef CONFIG_SMP |
112 | static void gic_set_cpu(unsigned int irq, const struct cpumask *mask_val) | 112 | static int gic_set_cpu(unsigned int irq, const struct cpumask *mask_val) |
113 | { | 113 | { |
114 | void __iomem *reg = gic_dist_base(irq) + GIC_DIST_TARGET + (gic_irq(irq) & ~3); | 114 | void __iomem *reg = gic_dist_base(irq) + GIC_DIST_TARGET + (gic_irq(irq) & ~3); |
115 | unsigned int shift = (irq % 4) * 8; | 115 | unsigned int shift = (irq % 4) * 8; |
@@ -122,6 +122,8 @@ static void gic_set_cpu(unsigned int irq, const struct cpumask *mask_val) | |||
122 | val |= 1 << (cpu + shift); | 122 | val |= 1 << (cpu + shift); |
123 | writel(val, reg); | 123 | writel(val, reg); |
124 | spin_unlock(&irq_controller_lock); | 124 | spin_unlock(&irq_controller_lock); |
125 | |||
126 | return 0; | ||
125 | } | 127 | } |
126 | #endif | 128 | #endif |
127 | 129 | ||
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 6116e4893c0a..15f8a092b700 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -114,3 +114,16 @@ | |||
114 | .align 3; \ | 114 | .align 3; \ |
115 | .long 9999b,9001f; \ | 115 | .long 9999b,9001f; \ |
116 | .previous | 116 | .previous |
117 | |||
118 | /* | ||
119 | * SMP data memory barrier | ||
120 | */ | ||
121 | .macro smp_dmb | ||
122 | #ifdef CONFIG_SMP | ||
123 | #if __LINUX_ARM_ARCH__ >= 7 | ||
124 | dmb | ||
125 | #elif __LINUX_ARM_ARCH__ == 6 | ||
126 | mcr p15, 0, r0, c7, c10, 5 @ dmb | ||
127 | #endif | ||
128 | #endif | ||
129 | .endm | ||
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index ee99723b3a6c..16b52f397983 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h | |||
@@ -44,11 +44,29 @@ static inline void atomic_set(atomic_t *v, int i) | |||
44 | : "cc"); | 44 | : "cc"); |
45 | } | 45 | } |
46 | 46 | ||
47 | static inline void atomic_add(int i, atomic_t *v) | ||
48 | { | ||
49 | unsigned long tmp; | ||
50 | int result; | ||
51 | |||
52 | __asm__ __volatile__("@ atomic_add\n" | ||
53 | "1: ldrex %0, [%2]\n" | ||
54 | " add %0, %0, %3\n" | ||
55 | " strex %1, %0, [%2]\n" | ||
56 | " teq %1, #0\n" | ||
57 | " bne 1b" | ||
58 | : "=&r" (result), "=&r" (tmp) | ||
59 | : "r" (&v->counter), "Ir" (i) | ||
60 | : "cc"); | ||
61 | } | ||
62 | |||
47 | static inline int atomic_add_return(int i, atomic_t *v) | 63 | static inline int atomic_add_return(int i, atomic_t *v) |
48 | { | 64 | { |
49 | unsigned long tmp; | 65 | unsigned long tmp; |
50 | int result; | 66 | int result; |
51 | 67 | ||
68 | smp_mb(); | ||
69 | |||
52 | __asm__ __volatile__("@ atomic_add_return\n" | 70 | __asm__ __volatile__("@ atomic_add_return\n" |
53 | "1: ldrex %0, [%2]\n" | 71 | "1: ldrex %0, [%2]\n" |
54 | " add %0, %0, %3\n" | 72 | " add %0, %0, %3\n" |
@@ -59,14 +77,34 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
59 | : "r" (&v->counter), "Ir" (i) | 77 | : "r" (&v->counter), "Ir" (i) |
60 | : "cc"); | 78 | : "cc"); |
61 | 79 | ||
80 | smp_mb(); | ||
81 | |||
62 | return result; | 82 | return result; |
63 | } | 83 | } |
64 | 84 | ||
85 | static inline void atomic_sub(int i, atomic_t *v) | ||
86 | { | ||
87 | unsigned long tmp; | ||
88 | int result; | ||
89 | |||
90 | __asm__ __volatile__("@ atomic_sub\n" | ||
91 | "1: ldrex %0, [%2]\n" | ||
92 | " sub %0, %0, %3\n" | ||
93 | " strex %1, %0, [%2]\n" | ||
94 | " teq %1, #0\n" | ||
95 | " bne 1b" | ||
96 | : "=&r" (result), "=&r" (tmp) | ||
97 | : "r" (&v->counter), "Ir" (i) | ||
98 | : "cc"); | ||
99 | } | ||
100 | |||
65 | static inline int atomic_sub_return(int i, atomic_t *v) | 101 | static inline int atomic_sub_return(int i, atomic_t *v) |
66 | { | 102 | { |
67 | unsigned long tmp; | 103 | unsigned long tmp; |
68 | int result; | 104 | int result; |
69 | 105 | ||
106 | smp_mb(); | ||
107 | |||
70 | __asm__ __volatile__("@ atomic_sub_return\n" | 108 | __asm__ __volatile__("@ atomic_sub_return\n" |
71 | "1: ldrex %0, [%2]\n" | 109 | "1: ldrex %0, [%2]\n" |
72 | " sub %0, %0, %3\n" | 110 | " sub %0, %0, %3\n" |
@@ -77,6 +115,8 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
77 | : "r" (&v->counter), "Ir" (i) | 115 | : "r" (&v->counter), "Ir" (i) |
78 | : "cc"); | 116 | : "cc"); |
79 | 117 | ||
118 | smp_mb(); | ||
119 | |||
80 | return result; | 120 | return result; |
81 | } | 121 | } |
82 | 122 | ||
@@ -84,6 +124,8 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) | |||
84 | { | 124 | { |
85 | unsigned long oldval, res; | 125 | unsigned long oldval, res; |
86 | 126 | ||
127 | smp_mb(); | ||
128 | |||
87 | do { | 129 | do { |
88 | __asm__ __volatile__("@ atomic_cmpxchg\n" | 130 | __asm__ __volatile__("@ atomic_cmpxchg\n" |
89 | "ldrex %1, [%2]\n" | 131 | "ldrex %1, [%2]\n" |
@@ -95,6 +137,8 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) | |||
95 | : "cc"); | 137 | : "cc"); |
96 | } while (res); | 138 | } while (res); |
97 | 139 | ||
140 | smp_mb(); | ||
141 | |||
98 | return oldval; | 142 | return oldval; |
99 | } | 143 | } |
100 | 144 | ||
@@ -135,6 +179,7 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
135 | 179 | ||
136 | return val; | 180 | return val; |
137 | } | 181 | } |
182 | #define atomic_add(i, v) (void) atomic_add_return(i, v) | ||
138 | 183 | ||
139 | static inline int atomic_sub_return(int i, atomic_t *v) | 184 | static inline int atomic_sub_return(int i, atomic_t *v) |
140 | { | 185 | { |
@@ -148,6 +193,7 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
148 | 193 | ||
149 | return val; | 194 | return val; |
150 | } | 195 | } |
196 | #define atomic_sub(i, v) (void) atomic_sub_return(i, v) | ||
151 | 197 | ||
152 | static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | 198 | static inline int atomic_cmpxchg(atomic_t *v, int old, int new) |
153 | { | 199 | { |
@@ -187,10 +233,8 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
187 | } | 233 | } |
188 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 234 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
189 | 235 | ||
190 | #define atomic_add(i, v) (void) atomic_add_return(i, v) | 236 | #define atomic_inc(v) atomic_add(1, v) |
191 | #define atomic_inc(v) (void) atomic_add_return(1, v) | 237 | #define atomic_dec(v) atomic_sub(1, v) |
192 | #define atomic_sub(i, v) (void) atomic_sub_return(i, v) | ||
193 | #define atomic_dec(v) (void) atomic_sub_return(1, v) | ||
194 | 238 | ||
195 | #define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0) | 239 | #define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0) |
196 | #define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0) | 240 | #define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0) |
@@ -200,11 +244,10 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
200 | 244 | ||
201 | #define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0) | 245 | #define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0) |
202 | 246 | ||
203 | /* Atomic operations are already serializing on ARM */ | 247 | #define smp_mb__before_atomic_dec() smp_mb() |
204 | #define smp_mb__before_atomic_dec() barrier() | 248 | #define smp_mb__after_atomic_dec() smp_mb() |
205 | #define smp_mb__after_atomic_dec() barrier() | 249 | #define smp_mb__before_atomic_inc() smp_mb() |
206 | #define smp_mb__before_atomic_inc() barrier() | 250 | #define smp_mb__after_atomic_inc() smp_mb() |
207 | #define smp_mb__after_atomic_inc() barrier() | ||
208 | 251 | ||
209 | #include <asm-generic/atomic.h> | 252 | #include <asm-generic/atomic.h> |
210 | #endif | 253 | #endif |
diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h index 1d77e51907f6..59426a4595c9 100644 --- a/arch/arm/include/asm/flat.h +++ b/arch/arm/include/asm/flat.h | |||
@@ -5,9 +5,6 @@ | |||
5 | #ifndef __ARM_FLAT_H__ | 5 | #ifndef __ARM_FLAT_H__ |
6 | #define __ARM_FLAT_H__ | 6 | #define __ARM_FLAT_H__ |
7 | 7 | ||
8 | /* An odd number of words will be pushed after this alignment, so | ||
9 | deliberately misalign the value. */ | ||
10 | #define flat_stack_align(sp) sp = (void *)(((unsigned long)(sp) - 4) | 4) | ||
11 | #define flat_argvp_envp_on_stack() 1 | 8 | #define flat_argvp_envp_on_stack() 1 |
12 | #define flat_old_ram_flag(flags) (flags) | 9 | #define flat_old_ram_flag(flags) (flags) |
13 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 10 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) |
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index bd4dc8ed53d5..d65b2f5bf41f 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
@@ -248,6 +248,8 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size | |||
248 | unsigned int tmp; | 248 | unsigned int tmp; |
249 | #endif | 249 | #endif |
250 | 250 | ||
251 | smp_mb(); | ||
252 | |||
251 | switch (size) { | 253 | switch (size) { |
252 | #if __LINUX_ARM_ARCH__ >= 6 | 254 | #if __LINUX_ARM_ARCH__ >= 6 |
253 | case 1: | 255 | case 1: |
@@ -307,6 +309,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size | |||
307 | __bad_xchg(ptr, size), ret = 0; | 309 | __bad_xchg(ptr, size), ret = 0; |
308 | break; | 310 | break; |
309 | } | 311 | } |
312 | smp_mb(); | ||
310 | 313 | ||
311 | return ret; | 314 | return ret; |
312 | } | 315 | } |
@@ -316,6 +319,12 @@ extern void enable_hlt(void); | |||
316 | 319 | ||
317 | #include <asm-generic/cmpxchg-local.h> | 320 | #include <asm-generic/cmpxchg-local.h> |
318 | 321 | ||
322 | #if __LINUX_ARM_ARCH__ < 6 | ||
323 | |||
324 | #ifdef CONFIG_SMP | ||
325 | #error "SMP is not supported on this platform" | ||
326 | #endif | ||
327 | |||
319 | /* | 328 | /* |
320 | * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make | 329 | * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make |
321 | * them available. | 330 | * them available. |
@@ -329,6 +338,173 @@ extern void enable_hlt(void); | |||
329 | #include <asm-generic/cmpxchg.h> | 338 | #include <asm-generic/cmpxchg.h> |
330 | #endif | 339 | #endif |
331 | 340 | ||
341 | #else /* __LINUX_ARM_ARCH__ >= 6 */ | ||
342 | |||
343 | extern void __bad_cmpxchg(volatile void *ptr, int size); | ||
344 | |||
345 | /* | ||
346 | * cmpxchg only support 32-bits operands on ARMv6. | ||
347 | */ | ||
348 | |||
349 | static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | ||
350 | unsigned long new, int size) | ||
351 | { | ||
352 | unsigned long oldval, res; | ||
353 | |||
354 | switch (size) { | ||
355 | #ifdef CONFIG_CPU_32v6K | ||
356 | case 1: | ||
357 | do { | ||
358 | asm volatile("@ __cmpxchg1\n" | ||
359 | " ldrexb %1, [%2]\n" | ||
360 | " mov %0, #0\n" | ||
361 | " teq %1, %3\n" | ||
362 | " strexbeq %0, %4, [%2]\n" | ||
363 | : "=&r" (res), "=&r" (oldval) | ||
364 | : "r" (ptr), "Ir" (old), "r" (new) | ||
365 | : "memory", "cc"); | ||
366 | } while (res); | ||
367 | break; | ||
368 | case 2: | ||
369 | do { | ||
370 | asm volatile("@ __cmpxchg1\n" | ||
371 | " ldrexh %1, [%2]\n" | ||
372 | " mov %0, #0\n" | ||
373 | " teq %1, %3\n" | ||
374 | " strexheq %0, %4, [%2]\n" | ||
375 | : "=&r" (res), "=&r" (oldval) | ||
376 | : "r" (ptr), "Ir" (old), "r" (new) | ||
377 | : "memory", "cc"); | ||
378 | } while (res); | ||
379 | break; | ||
380 | #endif /* CONFIG_CPU_32v6K */ | ||
381 | case 4: | ||
382 | do { | ||
383 | asm volatile("@ __cmpxchg4\n" | ||
384 | " ldrex %1, [%2]\n" | ||
385 | " mov %0, #0\n" | ||
386 | " teq %1, %3\n" | ||
387 | " strexeq %0, %4, [%2]\n" | ||
388 | : "=&r" (res), "=&r" (oldval) | ||
389 | : "r" (ptr), "Ir" (old), "r" (new) | ||
390 | : "memory", "cc"); | ||
391 | } while (res); | ||
392 | break; | ||
393 | default: | ||
394 | __bad_cmpxchg(ptr, size); | ||
395 | oldval = 0; | ||
396 | } | ||
397 | |||
398 | return oldval; | ||
399 | } | ||
400 | |||
401 | static inline unsigned long __cmpxchg_mb(volatile void *ptr, unsigned long old, | ||
402 | unsigned long new, int size) | ||
403 | { | ||
404 | unsigned long ret; | ||
405 | |||
406 | smp_mb(); | ||
407 | ret = __cmpxchg(ptr, old, new, size); | ||
408 | smp_mb(); | ||
409 | |||
410 | return ret; | ||
411 | } | ||
412 | |||
413 | #define cmpxchg(ptr,o,n) \ | ||
414 | ((__typeof__(*(ptr)))__cmpxchg_mb((ptr), \ | ||
415 | (unsigned long)(o), \ | ||
416 | (unsigned long)(n), \ | ||
417 | sizeof(*(ptr)))) | ||
418 | |||
419 | static inline unsigned long __cmpxchg_local(volatile void *ptr, | ||
420 | unsigned long old, | ||
421 | unsigned long new, int size) | ||
422 | { | ||
423 | unsigned long ret; | ||
424 | |||
425 | switch (size) { | ||
426 | #ifndef CONFIG_CPU_32v6K | ||
427 | case 1: | ||
428 | case 2: | ||
429 | ret = __cmpxchg_local_generic(ptr, old, new, size); | ||
430 | break; | ||
431 | #endif /* !CONFIG_CPU_32v6K */ | ||
432 | default: | ||
433 | ret = __cmpxchg(ptr, old, new, size); | ||
434 | } | ||
435 | |||
436 | return ret; | ||
437 | } | ||
438 | |||
439 | #define cmpxchg_local(ptr,o,n) \ | ||
440 | ((__typeof__(*(ptr)))__cmpxchg_local((ptr), \ | ||
441 | (unsigned long)(o), \ | ||
442 | (unsigned long)(n), \ | ||
443 | sizeof(*(ptr)))) | ||
444 | |||
445 | #ifdef CONFIG_CPU_32v6K | ||
446 | |||
447 | /* | ||
448 | * Note : ARMv7-M (currently unsupported by Linux) does not support | ||
449 | * ldrexd/strexd. If ARMv7-M is ever supported by the Linux kernel, it should | ||
450 | * not be allowed to use __cmpxchg64. | ||
451 | */ | ||
452 | static inline unsigned long long __cmpxchg64(volatile void *ptr, | ||
453 | unsigned long long old, | ||
454 | unsigned long long new) | ||
455 | { | ||
456 | register unsigned long long oldval asm("r0"); | ||
457 | register unsigned long long __old asm("r2") = old; | ||
458 | register unsigned long long __new asm("r4") = new; | ||
459 | unsigned long res; | ||
460 | |||
461 | do { | ||
462 | asm volatile( | ||
463 | " @ __cmpxchg8\n" | ||
464 | " ldrexd %1, %H1, [%2]\n" | ||
465 | " mov %0, #0\n" | ||
466 | " teq %1, %3\n" | ||
467 | " teqeq %H1, %H3\n" | ||
468 | " strexdeq %0, %4, %H4, [%2]\n" | ||
469 | : "=&r" (res), "=&r" (oldval) | ||
470 | : "r" (ptr), "Ir" (__old), "r" (__new) | ||
471 | : "memory", "cc"); | ||
472 | } while (res); | ||
473 | |||
474 | return oldval; | ||
475 | } | ||
476 | |||
477 | static inline unsigned long long __cmpxchg64_mb(volatile void *ptr, | ||
478 | unsigned long long old, | ||
479 | unsigned long long new) | ||
480 | { | ||
481 | unsigned long long ret; | ||
482 | |||
483 | smp_mb(); | ||
484 | ret = __cmpxchg64(ptr, old, new); | ||
485 | smp_mb(); | ||
486 | |||
487 | return ret; | ||
488 | } | ||
489 | |||
490 | #define cmpxchg64(ptr,o,n) \ | ||
491 | ((__typeof__(*(ptr)))__cmpxchg64_mb((ptr), \ | ||
492 | (unsigned long long)(o), \ | ||
493 | (unsigned long long)(n))) | ||
494 | |||
495 | #define cmpxchg64_local(ptr,o,n) \ | ||
496 | ((__typeof__(*(ptr)))__cmpxchg64((ptr), \ | ||
497 | (unsigned long long)(o), \ | ||
498 | (unsigned long long)(n))) | ||
499 | |||
500 | #else /* !CONFIG_CPU_32v6K */ | ||
501 | |||
502 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | ||
503 | |||
504 | #endif /* CONFIG_CPU_32v6K */ | ||
505 | |||
506 | #endif /* __LINUX_ARM_ARCH__ >= 6 */ | ||
507 | |||
332 | #endif /* __ASSEMBLY__ */ | 508 | #endif /* __ASSEMBLY__ */ |
333 | 509 | ||
334 | #define arch_align_stack(x) (x) | 510 | #define arch_align_stack(x) (x) |
diff --git a/arch/arm/kernel/elf.c b/arch/arm/kernel/elf.c index d4a0da1e48f4..950391f194c4 100644 --- a/arch/arm/kernel/elf.c +++ b/arch/arm/kernel/elf.c | |||
@@ -78,6 +78,15 @@ int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack) | |||
78 | return 1; | 78 | return 1; |
79 | if (cpu_architecture() < CPU_ARCH_ARMv6) | 79 | if (cpu_architecture() < CPU_ARCH_ARMv6) |
80 | return 1; | 80 | return 1; |
81 | #if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT) | ||
82 | /* | ||
83 | * If we have support for OABI programs, we can never allow NX | ||
84 | * support - our signal syscall restart mechanism relies upon | ||
85 | * being able to execute code placed on the user stack. | ||
86 | */ | ||
87 | return 1; | ||
88 | #else | ||
81 | return 0; | 89 | return 0; |
90 | #endif | ||
82 | } | 91 | } |
83 | EXPORT_SYMBOL(arm_elf_read_implies_exec); | 92 | EXPORT_SYMBOL(arm_elf_read_implies_exec); |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index d662a2f1fd85..83b1da6b7baa 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -815,10 +815,7 @@ __kuser_helper_start: | |||
815 | */ | 815 | */ |
816 | 816 | ||
817 | __kuser_memory_barrier: @ 0xffff0fa0 | 817 | __kuser_memory_barrier: @ 0xffff0fa0 |
818 | 818 | smp_dmb | |
819 | #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_SMP) | ||
820 | mcr p15, 0, r0, c7, c10, 5 @ dmb | ||
821 | #endif | ||
822 | usr_ret lr | 819 | usr_ret lr |
823 | 820 | ||
824 | .align 5 | 821 | .align 5 |
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h index 2e787d40d599..c7f2627385e7 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h | |||
@@ -18,12 +18,14 @@ | |||
18 | mov r2, #1 | 18 | mov r2, #1 |
19 | add r1, r1, r0, lsr #3 @ Get byte offset | 19 | add r1, r1, r0, lsr #3 @ Get byte offset |
20 | mov r3, r2, lsl r3 @ create mask | 20 | mov r3, r2, lsl r3 @ create mask |
21 | smp_dmb | ||
21 | 1: ldrexb r2, [r1] | 22 | 1: ldrexb r2, [r1] |
22 | ands r0, r2, r3 @ save old value of bit | 23 | ands r0, r2, r3 @ save old value of bit |
23 | \instr r2, r2, r3 @ toggle bit | 24 | \instr r2, r2, r3 @ toggle bit |
24 | strexb ip, r2, [r1] | 25 | strexb ip, r2, [r1] |
25 | cmp ip, #0 | 26 | cmp ip, #0 |
26 | bne 1b | 27 | bne 1b |
28 | smp_dmb | ||
27 | cmp r0, #0 | 29 | cmp r0, #0 |
28 | movne r0, #1 | 30 | movne r0, #1 |
29 | 2: mov pc, lr | 31 | 2: mov pc, lr |
diff --git a/arch/arm/mach-gemini/include/mach/hardware.h b/arch/arm/mach-gemini/include/mach/hardware.h index de6752674c05..213a4fcfeb1c 100644 --- a/arch/arm/mach-gemini/include/mach/hardware.h +++ b/arch/arm/mach-gemini/include/mach/hardware.h | |||
@@ -15,10 +15,9 @@ | |||
15 | /* | 15 | /* |
16 | * Memory Map definitions | 16 | * Memory Map definitions |
17 | */ | 17 | */ |
18 | /* FIXME: Does it really swap SRAM like this? */ | ||
19 | #ifdef CONFIG_GEMINI_MEM_SWAP | 18 | #ifdef CONFIG_GEMINI_MEM_SWAP |
20 | # define GEMINI_DRAM_BASE 0x00000000 | 19 | # define GEMINI_DRAM_BASE 0x00000000 |
21 | # define GEMINI_SRAM_BASE 0x20000000 | 20 | # define GEMINI_SRAM_BASE 0x70000000 |
22 | #else | 21 | #else |
23 | # define GEMINI_SRAM_BASE 0x00000000 | 22 | # define GEMINI_SRAM_BASE 0x00000000 |
24 | # define GEMINI_DRAM_BASE 0x10000000 | 23 | # define GEMINI_DRAM_BASE 0x10000000 |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index eeb00240d784..be1ca28fed3f 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -144,6 +144,9 @@ static struct platform_device kirkwood_ge00 = { | |||
144 | .id = 0, | 144 | .id = 0, |
145 | .num_resources = 1, | 145 | .num_resources = 1, |
146 | .resource = kirkwood_ge00_resources, | 146 | .resource = kirkwood_ge00_resources, |
147 | .dev = { | ||
148 | .coherent_dma_mask = 0xffffffff, | ||
149 | }, | ||
147 | }; | 150 | }; |
148 | 151 | ||
149 | void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) | 152 | void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -202,6 +205,9 @@ static struct platform_device kirkwood_ge01 = { | |||
202 | .id = 1, | 205 | .id = 1, |
203 | .num_resources = 1, | 206 | .num_resources = 1, |
204 | .resource = kirkwood_ge01_resources, | 207 | .resource = kirkwood_ge01_resources, |
208 | .dev = { | ||
209 | .coherent_dma_mask = 0xffffffff, | ||
210 | }, | ||
205 | }; | 211 | }; |
206 | 212 | ||
207 | void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) | 213 | void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -386,12 +392,10 @@ static struct mv64xxx_i2c_pdata kirkwood_i2c_pdata = { | |||
386 | 392 | ||
387 | static struct resource kirkwood_i2c_resources[] = { | 393 | static struct resource kirkwood_i2c_resources[] = { |
388 | { | 394 | { |
389 | .name = "i2c", | ||
390 | .start = I2C_PHYS_BASE, | 395 | .start = I2C_PHYS_BASE, |
391 | .end = I2C_PHYS_BASE + 0x1f, | 396 | .end = I2C_PHYS_BASE + 0x1f, |
392 | .flags = IORESOURCE_MEM, | 397 | .flags = IORESOURCE_MEM, |
393 | }, { | 398 | }, { |
394 | .name = "i2c", | ||
395 | .start = IRQ_KIRKWOOD_TWSI, | 399 | .start = IRQ_KIRKWOOD_TWSI, |
396 | .end = IRQ_KIRKWOOD_TWSI, | 400 | .end = IRQ_KIRKWOOD_TWSI, |
397 | .flags = IORESOURCE_IRQ, | 401 | .flags = IORESOURCE_IRQ, |
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c index dda5743cf3e0..01aa213c0a6f 100644 --- a/arch/arm/mach-kirkwood/ts219-setup.c +++ b/arch/arm/mach-kirkwood/ts219-setup.c | |||
@@ -142,6 +142,8 @@ static unsigned int qnap_ts219_mpp_config[] __initdata = { | |||
142 | MPP1_SPI_MOSI, | 142 | MPP1_SPI_MOSI, |
143 | MPP2_SPI_SCK, | 143 | MPP2_SPI_SCK, |
144 | MPP3_SPI_MISO, | 144 | MPP3_SPI_MISO, |
145 | MPP4_SATA1_ACTn, | ||
146 | MPP5_SATA0_ACTn, | ||
145 | MPP8_TW_SDA, | 147 | MPP8_TW_SDA, |
146 | MPP9_TW_SCK, | 148 | MPP9_TW_SCK, |
147 | MPP10_UART0_TXD, | 149 | MPP10_UART0_TXD, |
@@ -150,10 +152,6 @@ static unsigned int qnap_ts219_mpp_config[] __initdata = { | |||
150 | MPP14_UART1_RXD, /* PIC controller */ | 152 | MPP14_UART1_RXD, /* PIC controller */ |
151 | MPP15_GPIO, /* USB Copy button */ | 153 | MPP15_GPIO, /* USB Copy button */ |
152 | MPP16_GPIO, /* Reset button */ | 154 | MPP16_GPIO, /* Reset button */ |
153 | MPP20_SATA1_ACTn, | ||
154 | MPP21_SATA0_ACTn, | ||
155 | MPP22_SATA1_PRESENTn, | ||
156 | MPP23_SATA0_PRESENTn, | ||
157 | 0 | 155 | 0 |
158 | }; | 156 | }; |
159 | 157 | ||
diff --git a/arch/arm/mach-loki/common.c b/arch/arm/mach-loki/common.c index c0d2d9d12e74..818f19d7ab1f 100644 --- a/arch/arm/mach-loki/common.c +++ b/arch/arm/mach-loki/common.c | |||
@@ -82,6 +82,9 @@ static struct platform_device loki_ge0 = { | |||
82 | .id = 0, | 82 | .id = 0, |
83 | .num_resources = 1, | 83 | .num_resources = 1, |
84 | .resource = loki_ge0_resources, | 84 | .resource = loki_ge0_resources, |
85 | .dev = { | ||
86 | .coherent_dma_mask = 0xffffffff, | ||
87 | }, | ||
85 | }; | 88 | }; |
86 | 89 | ||
87 | void __init loki_ge0_init(struct mv643xx_eth_platform_data *eth_data) | 90 | void __init loki_ge0_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -136,6 +139,9 @@ static struct platform_device loki_ge1 = { | |||
136 | .id = 1, | 139 | .id = 1, |
137 | .num_resources = 1, | 140 | .num_resources = 1, |
138 | .resource = loki_ge1_resources, | 141 | .resource = loki_ge1_resources, |
142 | .dev = { | ||
143 | .coherent_dma_mask = 0xffffffff, | ||
144 | }, | ||
139 | }; | 145 | }; |
140 | 146 | ||
141 | void __init loki_ge1_init(struct mv643xx_eth_platform_data *eth_data) | 147 | void __init loki_ge1_init(struct mv643xx_eth_platform_data *eth_data) |
diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h index d0bdb6e3682b..2e914649b9e4 100644 --- a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h | |||
@@ -3,6 +3,11 @@ | |||
3 | 3 | ||
4 | #include <mach/mfp.h> | 4 | #include <mach/mfp.h> |
5 | 5 | ||
6 | #define MFP_DRIVE_VERY_SLOW (0x0 << 13) | ||
7 | #define MFP_DRIVE_SLOW (0x1 << 13) | ||
8 | #define MFP_DRIVE_MEDIUM (0x2 << 13) | ||
9 | #define MFP_DRIVE_FAST (0x3 << 13) | ||
10 | |||
6 | /* GPIO */ | 11 | /* GPIO */ |
7 | #define GPIO0_GPIO MFP_CFG(GPIO0, AF5) | 12 | #define GPIO0_GPIO MFP_CFG(GPIO0, AF5) |
8 | #define GPIO1_GPIO MFP_CFG(GPIO1, AF5) | 13 | #define GPIO1_GPIO MFP_CFG(GPIO1, AF5) |
diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa910.h b/arch/arm/mach-mmp/include/mach/mfp-pxa910.h index 48a1cbc7c56b..d97de36c50ad 100644 --- a/arch/arm/mach-mmp/include/mach/mfp-pxa910.h +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa910.h | |||
@@ -3,6 +3,11 @@ | |||
3 | 3 | ||
4 | #include <mach/mfp.h> | 4 | #include <mach/mfp.h> |
5 | 5 | ||
6 | #define MFP_DRIVE_VERY_SLOW (0x0 << 13) | ||
7 | #define MFP_DRIVE_SLOW (0x2 << 13) | ||
8 | #define MFP_DRIVE_MEDIUM (0x4 << 13) | ||
9 | #define MFP_DRIVE_FAST (0x8 << 13) | ||
10 | |||
6 | /* UART2 */ | 11 | /* UART2 */ |
7 | #define GPIO47_UART2_RXD MFP_CFG(GPIO47, AF6) | 12 | #define GPIO47_UART2_RXD MFP_CFG(GPIO47, AF6) |
8 | #define GPIO48_UART2_TXD MFP_CFG(GPIO48, AF6) | 13 | #define GPIO48_UART2_TXD MFP_CFG(GPIO48, AF6) |
diff --git a/arch/arm/mach-mmp/include/mach/mfp.h b/arch/arm/mach-mmp/include/mach/mfp.h index 277ea4cd0f9f..62e510e80a58 100644 --- a/arch/arm/mach-mmp/include/mach/mfp.h +++ b/arch/arm/mach-mmp/include/mach/mfp.h | |||
@@ -12,16 +12,13 @@ | |||
12 | * possible, we make the following compromise: | 12 | * possible, we make the following compromise: |
13 | * | 13 | * |
14 | * 1. SLEEP_OE_N will always be programmed to '1' (by MFP_LPM_FLOAT) | 14 | * 1. SLEEP_OE_N will always be programmed to '1' (by MFP_LPM_FLOAT) |
15 | * 2. DRIVE strength definitions redefined to include the reserved bit10 | 15 | * 2. DRIVE strength definitions redefined to include the reserved bit |
16 | * - the reserved bit differs between pxa168 and pxa910, and the | ||
17 | * MFP_DRIVE_* macros are individually defined in mfp-pxa{168,910}.h | ||
16 | * 3. Override MFP_CFG() and MFP_CFG_DRV() | 18 | * 3. Override MFP_CFG() and MFP_CFG_DRV() |
17 | * 4. Drop the use of MFP_CFG_LPM() and MFP_CFG_X() | 19 | * 4. Drop the use of MFP_CFG_LPM() and MFP_CFG_X() |
18 | */ | 20 | */ |
19 | 21 | ||
20 | #define MFP_DRIVE_VERY_SLOW (0x0 << 13) | ||
21 | #define MFP_DRIVE_SLOW (0x2 << 13) | ||
22 | #define MFP_DRIVE_MEDIUM (0x4 << 13) | ||
23 | #define MFP_DRIVE_FAST (0x8 << 13) | ||
24 | |||
25 | #undef MFP_CFG | 22 | #undef MFP_CFG |
26 | #undef MFP_CFG_DRV | 23 | #undef MFP_CFG_DRV |
27 | #undef MFP_CFG_LPM | 24 | #undef MFP_CFG_LPM |
diff --git a/arch/arm/mach-mmp/time.c b/arch/arm/mach-mmp/time.c index b03a6eda7419..a8400bb891e7 100644 --- a/arch/arm/mach-mmp/time.c +++ b/arch/arm/mach-mmp/time.c | |||
@@ -136,7 +136,7 @@ static struct clock_event_device ckevt = { | |||
136 | .set_mode = timer_set_mode, | 136 | .set_mode = timer_set_mode, |
137 | }; | 137 | }; |
138 | 138 | ||
139 | static cycle_t clksrc_read(void) | 139 | static cycle_t clksrc_read(struct clocksource *cs) |
140 | { | 140 | { |
141 | return timer_read(); | 141 | return timer_read(); |
142 | } | 142 | } |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index 9ba595083dab..1b22e4af8791 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
@@ -321,6 +321,9 @@ static struct platform_device mv78xx0_ge00 = { | |||
321 | .id = 0, | 321 | .id = 0, |
322 | .num_resources = 1, | 322 | .num_resources = 1, |
323 | .resource = mv78xx0_ge00_resources, | 323 | .resource = mv78xx0_ge00_resources, |
324 | .dev = { | ||
325 | .coherent_dma_mask = 0xffffffff, | ||
326 | }, | ||
324 | }; | 327 | }; |
325 | 328 | ||
326 | void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) | 329 | void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -375,6 +378,9 @@ static struct platform_device mv78xx0_ge01 = { | |||
375 | .id = 1, | 378 | .id = 1, |
376 | .num_resources = 1, | 379 | .num_resources = 1, |
377 | .resource = mv78xx0_ge01_resources, | 380 | .resource = mv78xx0_ge01_resources, |
381 | .dev = { | ||
382 | .coherent_dma_mask = 0xffffffff, | ||
383 | }, | ||
378 | }; | 384 | }; |
379 | 385 | ||
380 | void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) | 386 | void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -429,6 +435,9 @@ static struct platform_device mv78xx0_ge10 = { | |||
429 | .id = 2, | 435 | .id = 2, |
430 | .num_resources = 1, | 436 | .num_resources = 1, |
431 | .resource = mv78xx0_ge10_resources, | 437 | .resource = mv78xx0_ge10_resources, |
438 | .dev = { | ||
439 | .coherent_dma_mask = 0xffffffff, | ||
440 | }, | ||
432 | }; | 441 | }; |
433 | 442 | ||
434 | void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data) | 443 | void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -496,6 +505,9 @@ static struct platform_device mv78xx0_ge11 = { | |||
496 | .id = 3, | 505 | .id = 3, |
497 | .num_resources = 1, | 506 | .num_resources = 1, |
498 | .resource = mv78xx0_ge11_resources, | 507 | .resource = mv78xx0_ge11_resources, |
508 | .dev = { | ||
509 | .coherent_dma_mask = 0xffffffff, | ||
510 | }, | ||
499 | }; | 511 | }; |
500 | 512 | ||
501 | void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data) | 513 | void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -532,12 +544,10 @@ static struct mv64xxx_i2c_pdata mv78xx0_i2c_0_pdata = { | |||
532 | 544 | ||
533 | static struct resource mv78xx0_i2c_0_resources[] = { | 545 | static struct resource mv78xx0_i2c_0_resources[] = { |
534 | { | 546 | { |
535 | .name = "i2c 0 base", | ||
536 | .start = I2C_0_PHYS_BASE, | 547 | .start = I2C_0_PHYS_BASE, |
537 | .end = I2C_0_PHYS_BASE + 0x1f, | 548 | .end = I2C_0_PHYS_BASE + 0x1f, |
538 | .flags = IORESOURCE_MEM, | 549 | .flags = IORESOURCE_MEM, |
539 | }, { | 550 | }, { |
540 | .name = "i2c 0 irq", | ||
541 | .start = IRQ_MV78XX0_I2C_0, | 551 | .start = IRQ_MV78XX0_I2C_0, |
542 | .end = IRQ_MV78XX0_I2C_0, | 552 | .end = IRQ_MV78XX0_I2C_0, |
543 | .flags = IORESOURCE_IRQ, | 553 | .flags = IORESOURCE_IRQ, |
@@ -567,12 +577,10 @@ static struct mv64xxx_i2c_pdata mv78xx0_i2c_1_pdata = { | |||
567 | 577 | ||
568 | static struct resource mv78xx0_i2c_1_resources[] = { | 578 | static struct resource mv78xx0_i2c_1_resources[] = { |
569 | { | 579 | { |
570 | .name = "i2c 1 base", | ||
571 | .start = I2C_1_PHYS_BASE, | 580 | .start = I2C_1_PHYS_BASE, |
572 | .end = I2C_1_PHYS_BASE + 0x1f, | 581 | .end = I2C_1_PHYS_BASE + 0x1f, |
573 | .flags = IORESOURCE_MEM, | 582 | .flags = IORESOURCE_MEM, |
574 | }, { | 583 | }, { |
575 | .name = "i2c 1 irq", | ||
576 | .start = IRQ_MV78XX0_I2C_1, | 584 | .start = IRQ_MV78XX0_I2C_1, |
577 | .end = IRQ_MV78XX0_I2C_1, | 585 | .end = IRQ_MV78XX0_I2C_1, |
578 | .flags = IORESOURCE_IRQ, | 586 | .flags = IORESOURCE_IRQ, |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 6af99ddabdfb..b1c7778d9f96 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -188,6 +188,9 @@ static struct platform_device orion5x_eth = { | |||
188 | .id = 0, | 188 | .id = 0, |
189 | .num_resources = 1, | 189 | .num_resources = 1, |
190 | .resource = orion5x_eth_resources, | 190 | .resource = orion5x_eth_resources, |
191 | .dev = { | ||
192 | .coherent_dma_mask = 0xffffffff, | ||
193 | }, | ||
191 | }; | 194 | }; |
192 | 195 | ||
193 | void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) | 196 | void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) |
@@ -248,12 +251,10 @@ static struct mv64xxx_i2c_pdata orion5x_i2c_pdata = { | |||
248 | 251 | ||
249 | static struct resource orion5x_i2c_resources[] = { | 252 | static struct resource orion5x_i2c_resources[] = { |
250 | { | 253 | { |
251 | .name = "i2c base", | ||
252 | .start = I2C_PHYS_BASE, | 254 | .start = I2C_PHYS_BASE, |
253 | .end = I2C_PHYS_BASE + 0x1f, | 255 | .end = I2C_PHYS_BASE + 0x1f, |
254 | .flags = IORESOURCE_MEM, | 256 | .flags = IORESOURCE_MEM, |
255 | }, { | 257 | }, { |
256 | .name = "i2c irq", | ||
257 | .start = IRQ_ORION5X_I2C, | 258 | .start = IRQ_ORION5X_I2C, |
258 | .end = IRQ_ORION5X_I2C, | 259 | .end = IRQ_ORION5X_I2C, |
259 | .flags = IORESOURCE_IRQ, | 260 | .flags = IORESOURCE_IRQ, |
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c index 92ba16e1b6fc..7db966dc29ce 100644 --- a/arch/arm/mach-pxa/ezx.c +++ b/arch/arm/mach-pxa/ezx.c | |||
@@ -111,9 +111,9 @@ static unsigned long ezx_pin_config[] __initdata = { | |||
111 | GPIO25_SSP1_TXD, | 111 | GPIO25_SSP1_TXD, |
112 | GPIO26_SSP1_RXD, | 112 | GPIO26_SSP1_RXD, |
113 | GPIO24_GPIO, /* pcap chip select */ | 113 | GPIO24_GPIO, /* pcap chip select */ |
114 | GPIO1_GPIO, /* pcap interrupt */ | 114 | GPIO1_GPIO | WAKEUP_ON_EDGE_RISE, /* pcap interrupt */ |
115 | GPIO4_GPIO, /* WDI_AP */ | 115 | GPIO4_GPIO | MFP_LPM_DRIVE_HIGH, /* WDI_AP */ |
116 | GPIO55_GPIO, /* SYS_RESTART */ | 116 | GPIO55_GPIO | MFP_LPM_DRIVE_HIGH, /* SYS_RESTART */ |
117 | 117 | ||
118 | /* MMC */ | 118 | /* MMC */ |
119 | GPIO32_MMC_CLK, | 119 | GPIO32_MMC_CLK, |
@@ -144,20 +144,20 @@ static unsigned long ezx_pin_config[] __initdata = { | |||
144 | #if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_E680) | 144 | #if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_E680) |
145 | static unsigned long gen1_pin_config[] __initdata = { | 145 | static unsigned long gen1_pin_config[] __initdata = { |
146 | /* flip / lockswitch */ | 146 | /* flip / lockswitch */ |
147 | GPIO12_GPIO, | 147 | GPIO12_GPIO | WAKEUP_ON_EDGE_BOTH, |
148 | 148 | ||
149 | /* bluetooth (bcm2035) */ | 149 | /* bluetooth (bcm2035) */ |
150 | GPIO14_GPIO | WAKEUP_ON_LEVEL_HIGH, /* HOSTWAKE */ | 150 | GPIO14_GPIO | WAKEUP_ON_EDGE_RISE, /* HOSTWAKE */ |
151 | GPIO48_GPIO, /* RESET */ | 151 | GPIO48_GPIO, /* RESET */ |
152 | GPIO28_GPIO, /* WAKEUP */ | 152 | GPIO28_GPIO, /* WAKEUP */ |
153 | 153 | ||
154 | /* Neptune handshake */ | 154 | /* Neptune handshake */ |
155 | GPIO0_GPIO | WAKEUP_ON_LEVEL_HIGH, /* BP_RDY */ | 155 | GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* BP_RDY */ |
156 | GPIO57_GPIO, /* AP_RDY */ | 156 | GPIO57_GPIO | MFP_LPM_DRIVE_HIGH, /* AP_RDY */ |
157 | GPIO13_GPIO | WAKEUP_ON_LEVEL_HIGH, /* WDI */ | 157 | GPIO13_GPIO | WAKEUP_ON_EDGE_BOTH, /* WDI */ |
158 | GPIO3_GPIO | WAKEUP_ON_LEVEL_HIGH, /* WDI2 */ | 158 | GPIO3_GPIO | WAKEUP_ON_EDGE_BOTH, /* WDI2 */ |
159 | GPIO82_GPIO, /* RESET */ | 159 | GPIO82_GPIO | MFP_LPM_DRIVE_HIGH, /* RESET */ |
160 | GPIO99_GPIO, /* TC_MM_EN */ | 160 | GPIO99_GPIO | MFP_LPM_DRIVE_HIGH, /* TC_MM_EN */ |
161 | 161 | ||
162 | /* sound */ | 162 | /* sound */ |
163 | GPIO52_SSP3_SCLK, | 163 | GPIO52_SSP3_SCLK, |
@@ -199,21 +199,21 @@ static unsigned long gen1_pin_config[] __initdata = { | |||
199 | defined(CONFIG_MACH_EZX_E2) || defined(CONFIG_MACH_EZX_E6) | 199 | defined(CONFIG_MACH_EZX_E2) || defined(CONFIG_MACH_EZX_E6) |
200 | static unsigned long gen2_pin_config[] __initdata = { | 200 | static unsigned long gen2_pin_config[] __initdata = { |
201 | /* flip / lockswitch */ | 201 | /* flip / lockswitch */ |
202 | GPIO15_GPIO, | 202 | GPIO15_GPIO | WAKEUP_ON_EDGE_BOTH, |
203 | 203 | ||
204 | /* EOC */ | 204 | /* EOC */ |
205 | GPIO10_GPIO, | 205 | GPIO10_GPIO | WAKEUP_ON_EDGE_RISE, |
206 | 206 | ||
207 | /* bluetooth (bcm2045) */ | 207 | /* bluetooth (bcm2045) */ |
208 | GPIO13_GPIO | WAKEUP_ON_LEVEL_HIGH, /* HOSTWAKE */ | 208 | GPIO13_GPIO | WAKEUP_ON_EDGE_RISE, /* HOSTWAKE */ |
209 | GPIO37_GPIO, /* RESET */ | 209 | GPIO37_GPIO, /* RESET */ |
210 | GPIO57_GPIO, /* WAKEUP */ | 210 | GPIO57_GPIO, /* WAKEUP */ |
211 | 211 | ||
212 | /* Neptune handshake */ | 212 | /* Neptune handshake */ |
213 | GPIO0_GPIO | WAKEUP_ON_LEVEL_HIGH, /* BP_RDY */ | 213 | GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* BP_RDY */ |
214 | GPIO96_GPIO, /* AP_RDY */ | 214 | GPIO96_GPIO | MFP_LPM_DRIVE_HIGH, /* AP_RDY */ |
215 | GPIO3_GPIO | WAKEUP_ON_LEVEL_HIGH, /* WDI */ | 215 | GPIO3_GPIO | WAKEUP_ON_EDGE_FALL, /* WDI */ |
216 | GPIO116_GPIO, /* RESET */ | 216 | GPIO116_GPIO | MFP_LPM_DRIVE_HIGH, /* RESET */ |
217 | GPIO41_GPIO, /* BP_FLASH */ | 217 | GPIO41_GPIO, /* BP_FLASH */ |
218 | 218 | ||
219 | /* sound */ | 219 | /* sound */ |
diff --git a/arch/arm/mach-pxa/include/mach/reset.h b/arch/arm/mach-pxa/include/mach/reset.h index 31e6a7b6ad80..b6c10556fbc7 100644 --- a/arch/arm/mach-pxa/include/mach/reset.h +++ b/arch/arm/mach-pxa/include/mach/reset.h | |||
@@ -13,8 +13,9 @@ extern void clear_reset_status(unsigned int mask); | |||
13 | /** | 13 | /** |
14 | * init_gpio_reset() - register GPIO as reset generator | 14 | * init_gpio_reset() - register GPIO as reset generator |
15 | * @gpio: gpio nr | 15 | * @gpio: gpio nr |
16 | * @output: set gpio as out/low instead of input during normal work | 16 | * @output: set gpio as output instead of input during normal work |
17 | * @level: output level | ||
17 | */ | 18 | */ |
18 | extern int init_gpio_reset(int gpio, int output); | 19 | extern int init_gpio_reset(int gpio, int output, int level); |
19 | 20 | ||
20 | #endif /* __ASM_ARCH_RESET_H */ | 21 | #endif /* __ASM_ARCH_RESET_H */ |
diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c b/arch/arm/mach-pxa/mfp-pxa2xx.c index 7ffb91d64c39..cf6b720c055f 100644 --- a/arch/arm/mach-pxa/mfp-pxa2xx.c +++ b/arch/arm/mach-pxa/mfp-pxa2xx.c | |||
@@ -322,6 +322,7 @@ static inline void pxa27x_mfp_init(void) {} | |||
322 | #ifdef CONFIG_PM | 322 | #ifdef CONFIG_PM |
323 | static unsigned long saved_gafr[2][4]; | 323 | static unsigned long saved_gafr[2][4]; |
324 | static unsigned long saved_gpdr[4]; | 324 | static unsigned long saved_gpdr[4]; |
325 | static unsigned long saved_pgsr[4]; | ||
325 | 326 | ||
326 | static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state) | 327 | static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state) |
327 | { | 328 | { |
@@ -332,6 +333,7 @@ static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state) | |||
332 | saved_gafr[0][i] = GAFR_L(i); | 333 | saved_gafr[0][i] = GAFR_L(i); |
333 | saved_gafr[1][i] = GAFR_U(i); | 334 | saved_gafr[1][i] = GAFR_U(i); |
334 | saved_gpdr[i] = GPDR(i * 32); | 335 | saved_gpdr[i] = GPDR(i * 32); |
336 | saved_pgsr[i] = PGSR(i); | ||
335 | 337 | ||
336 | GPDR(i * 32) = gpdr_lpm[i]; | 338 | GPDR(i * 32) = gpdr_lpm[i]; |
337 | } | 339 | } |
@@ -346,6 +348,7 @@ static int pxa2xx_mfp_resume(struct sys_device *d) | |||
346 | GAFR_L(i) = saved_gafr[0][i]; | 348 | GAFR_L(i) = saved_gafr[0][i]; |
347 | GAFR_U(i) = saved_gafr[1][i]; | 349 | GAFR_U(i) = saved_gafr[1][i]; |
348 | GPDR(i * 32) = saved_gpdr[i]; | 350 | GPDR(i * 32) = saved_gpdr[i]; |
351 | PGSR(i) = saved_pgsr[i]; | ||
349 | } | 352 | } |
350 | PSSR = PSSR_RDH | PSSR_PH; | 353 | PSSR = PSSR_RDH | PSSR_PH; |
351 | return 0; | 354 | return 0; |
@@ -374,6 +377,9 @@ static int __init pxa2xx_mfp_init(void) | |||
374 | if (cpu_is_pxa27x()) | 377 | if (cpu_is_pxa27x()) |
375 | pxa27x_mfp_init(); | 378 | pxa27x_mfp_init(); |
376 | 379 | ||
380 | /* clear RDH bit to enable GPIO receivers after reset/sleep exit */ | ||
381 | PSSR = PSSR_RDH; | ||
382 | |||
377 | /* initialize gafr_run[], pgsr_lpm[] from existing values */ | 383 | /* initialize gafr_run[], pgsr_lpm[] from existing values */ |
378 | for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++) | 384 | for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++) |
379 | gpdr_lpm[i] = GPDR(i * 32); | 385 | gpdr_lpm[i] = GPDR(i * 32); |
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index 1cec1806f002..471a853e548b 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c | |||
@@ -62,6 +62,8 @@ static unsigned long palmld_pin_config[] __initdata = { | |||
62 | GPIO29_AC97_SDATA_IN_0, | 62 | GPIO29_AC97_SDATA_IN_0, |
63 | GPIO30_AC97_SDATA_OUT, | 63 | GPIO30_AC97_SDATA_OUT, |
64 | GPIO31_AC97_SYNC, | 64 | GPIO31_AC97_SYNC, |
65 | GPIO89_AC97_SYSCLK, | ||
66 | GPIO95_AC97_nRESET, | ||
65 | 67 | ||
66 | /* IrDA */ | 68 | /* IrDA */ |
67 | GPIO108_GPIO, /* ir disable */ | 69 | GPIO108_GPIO, /* ir disable */ |
diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c index 30662363907b..05bf979b78a6 100644 --- a/arch/arm/mach-pxa/palmt5.c +++ b/arch/arm/mach-pxa/palmt5.c | |||
@@ -64,6 +64,7 @@ static unsigned long palmt5_pin_config[] __initdata = { | |||
64 | GPIO29_AC97_SDATA_IN_0, | 64 | GPIO29_AC97_SDATA_IN_0, |
65 | GPIO30_AC97_SDATA_OUT, | 65 | GPIO30_AC97_SDATA_OUT, |
66 | GPIO31_AC97_SYNC, | 66 | GPIO31_AC97_SYNC, |
67 | GPIO89_AC97_SYSCLK, | ||
67 | GPIO95_AC97_nRESET, | 68 | GPIO95_AC97_nRESET, |
68 | 69 | ||
69 | /* IrDA */ | 70 | /* IrDA */ |
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index e2d44b1a8a9b..e99a893c58a7 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
@@ -65,6 +65,7 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
65 | GPIO29_AC97_SDATA_IN_0, | 65 | GPIO29_AC97_SDATA_IN_0, |
66 | GPIO30_AC97_SDATA_OUT, | 66 | GPIO30_AC97_SDATA_OUT, |
67 | GPIO31_AC97_SYNC, | 67 | GPIO31_AC97_SYNC, |
68 | GPIO89_AC97_SYSCLK, | ||
68 | GPIO95_AC97_nRESET, | 69 | GPIO95_AC97_nRESET, |
69 | 70 | ||
70 | /* IrDA */ | 71 | /* IrDA */ |
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index df29d45fb4e7..01e9d643394a 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -20,7 +20,7 @@ static void do_hw_reset(void); | |||
20 | 20 | ||
21 | static int reset_gpio = -1; | 21 | static int reset_gpio = -1; |
22 | 22 | ||
23 | int init_gpio_reset(int gpio, int output) | 23 | int init_gpio_reset(int gpio, int output, int level) |
24 | { | 24 | { |
25 | int rc; | 25 | int rc; |
26 | 26 | ||
@@ -31,7 +31,7 @@ int init_gpio_reset(int gpio, int output) | |||
31 | } | 31 | } |
32 | 32 | ||
33 | if (output) | 33 | if (output) |
34 | rc = gpio_direction_output(gpio, 0); | 34 | rc = gpio_direction_output(gpio, level); |
35 | else | 35 | else |
36 | rc = gpio_direction_input(gpio); | 36 | rc = gpio_direction_input(gpio); |
37 | if (rc) { | 37 | if (rc) { |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index c18e34acafcb..5a45fe340a10 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -531,9 +531,15 @@ static int spitz_ohci_init(struct device *dev) | |||
531 | return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1); | 531 | return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1); |
532 | } | 532 | } |
533 | 533 | ||
534 | static void spitz_ohci_exit(struct device *dev) | ||
535 | { | ||
536 | gpio_free(SPITZ_GPIO_USB_HOST); | ||
537 | } | ||
538 | |||
534 | static struct pxaohci_platform_data spitz_ohci_platform_data = { | 539 | static struct pxaohci_platform_data spitz_ohci_platform_data = { |
535 | .port_mode = PMM_NPS_MODE, | 540 | .port_mode = PMM_NPS_MODE, |
536 | .init = spitz_ohci_init, | 541 | .init = spitz_ohci_init, |
542 | .exit = spitz_ohci_exit, | ||
537 | .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION, | 543 | .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION, |
538 | .power_budget = 150, | 544 | .power_budget = 150, |
539 | }; | 545 | }; |
@@ -731,7 +737,7 @@ static void spitz_restart(char mode, const char *cmd) | |||
731 | 737 | ||
732 | static void __init common_init(void) | 738 | static void __init common_init(void) |
733 | { | 739 | { |
734 | init_gpio_reset(SPITZ_GPIO_ON_RESET, 1); | 740 | init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0); |
735 | pm_power_off = spitz_poweroff; | 741 | pm_power_off = spitz_poweroff; |
736 | arm_pm_restart = spitz_restart; | 742 | arm_pm_restart = spitz_restart; |
737 | 743 | ||
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index afac5b6d3d78..a0bd46ef5d30 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -897,7 +897,7 @@ static void __init tosa_init(void) | |||
897 | gpio_set_wake(MFP_PIN_GPIO1, 1); | 897 | gpio_set_wake(MFP_PIN_GPIO1, 1); |
898 | /* We can't pass to gpio-keys since it will drop the Reset altfunc */ | 898 | /* We can't pass to gpio-keys since it will drop the Reset altfunc */ |
899 | 899 | ||
900 | init_gpio_reset(TOSA_GPIO_ON_RESET, 0); | 900 | init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0); |
901 | 901 | ||
902 | pm_power_off = tosa_poweroff; | 902 | pm_power_off = tosa_poweroff; |
903 | arm_pm_restart = tosa_restart; | 903 | arm_pm_restart = tosa_restart; |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 945e0d237a1d..fec64678a63a 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
@@ -12,7 +12,7 @@ | |||
12 | # | 12 | # |
13 | # http://www.arm.linux.org.uk/developer/machines/?action=new | 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new |
14 | # | 14 | # |
15 | # Last update: Mon Mar 23 20:09:01 2009 | 15 | # Last update: Fri May 29 10:14:20 2009 |
16 | # | 16 | # |
17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
18 | # | 18 | # |
@@ -916,7 +916,7 @@ nxdb500 MACH_NXDB500 NXDB500 905 | |||
916 | apf9328 MACH_APF9328 APF9328 906 | 916 | apf9328 MACH_APF9328 APF9328 906 |
917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 | 917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 |
918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 | 918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 |
919 | palmt650 MACH_PALMT650 PALMT650 909 | 919 | treo650 MACH_TREO650 TREO650 909 |
920 | acumen MACH_ACUMEN ACUMEN 910 | 920 | acumen MACH_ACUMEN ACUMEN 910 |
921 | xp100 MACH_XP100 XP100 911 | 921 | xp100 MACH_XP100 XP100 911 |
922 | fs2410 MACH_FS2410 FS2410 912 | 922 | fs2410 MACH_FS2410 FS2410 912 |
@@ -1232,7 +1232,7 @@ ql202b MACH_QL202B QL202B 1226 | |||
1232 | vpac270 MACH_VPAC270 VPAC270 1227 | 1232 | vpac270 MACH_VPAC270 VPAC270 1227 |
1233 | rd129 MACH_RD129 RD129 1228 | 1233 | rd129 MACH_RD129 RD129 1228 |
1234 | htcwizard MACH_HTCWIZARD HTCWIZARD 1229 | 1234 | htcwizard MACH_HTCWIZARD HTCWIZARD 1229 |
1235 | xscale_treo680 MACH_XSCALE_TREO680 XSCALE_TREO680 1230 | 1235 | treo680 MACH_TREO680 TREO680 1230 |
1236 | tecon_tmezon MACH_TECON_TMEZON TECON_TMEZON 1231 | 1236 | tecon_tmezon MACH_TECON_TMEZON TECON_TMEZON 1231 |
1237 | zylonite MACH_ZYLONITE ZYLONITE 1233 | 1237 | zylonite MACH_ZYLONITE ZYLONITE 1233 |
1238 | gene1270 MACH_GENE1270 GENE1270 1234 | 1238 | gene1270 MACH_GENE1270 GENE1270 1234 |
@@ -1418,10 +1418,10 @@ looxc550 MACH_LOOXC550 LOOXC550 1417 | |||
1418 | cnty_titan MACH_CNTY_TITAN CNTY_TITAN 1418 | 1418 | cnty_titan MACH_CNTY_TITAN CNTY_TITAN 1418 |
1419 | app3xx MACH_APP3XX APP3XX 1419 | 1419 | app3xx MACH_APP3XX APP3XX 1419 |
1420 | sideoatsgrama MACH_SIDEOATSGRAMA SIDEOATSGRAMA 1420 | 1420 | sideoatsgrama MACH_SIDEOATSGRAMA SIDEOATSGRAMA 1420 |
1421 | palmtreo700p MACH_PALMTREO700P PALMTREO700P 1421 | 1421 | treo700p MACH_TREO700P TREO700P 1421 |
1422 | palmtreo700w MACH_PALMTREO700W PALMTREO700W 1422 | 1422 | treo700w MACH_TREO700W TREO700W 1422 |
1423 | palmtreo750 MACH_PALMTREO750 PALMTREO750 1423 | 1423 | treo750 MACH_TREO750 TREO750 1423 |
1424 | palmtreo755p MACH_PALMTREO755P PALMTREO755P 1424 | 1424 | treo755p MACH_TREO755P TREO755P 1424 |
1425 | ezreganut9200 MACH_EZREGANUT9200 EZREGANUT9200 1425 | 1425 | ezreganut9200 MACH_EZREGANUT9200 EZREGANUT9200 1425 |
1426 | sarge MACH_SARGE SARGE 1426 | 1426 | sarge MACH_SARGE SARGE 1426 |
1427 | a696 MACH_A696 A696 1427 | 1427 | a696 MACH_A696 A696 1427 |
@@ -1721,7 +1721,7 @@ sapphire MACH_SAPPHIRE SAPPHIRE 1729 | |||
1721 | csb637xo MACH_CSB637XO CSB637XO 1730 | 1721 | csb637xo MACH_CSB637XO CSB637XO 1730 |
1722 | evisiong MACH_EVISIONG EVISIONG 1731 | 1722 | evisiong MACH_EVISIONG EVISIONG 1731 |
1723 | stmp37xx MACH_STMP37XX STMP37XX 1732 | 1723 | stmp37xx MACH_STMP37XX STMP37XX 1732 |
1724 | stmp378x MACH_STMP38XX STMP38XX 1733 | 1724 | stmp378x MACH_STMP378X STMP378X 1733 |
1725 | tnt MACH_TNT TNT 1734 | 1725 | tnt MACH_TNT TNT 1734 |
1726 | tbxt MACH_TBXT TBXT 1735 | 1726 | tbxt MACH_TBXT TBXT 1735 |
1727 | playmate MACH_PLAYMATE PLAYMATE 1736 | 1727 | playmate MACH_PLAYMATE PLAYMATE 1736 |
@@ -1817,7 +1817,7 @@ smdkc100 MACH_SMDKC100 SMDKC100 1826 | |||
1817 | tavorevb MACH_TAVOREVB TAVOREVB 1827 | 1817 | tavorevb MACH_TAVOREVB TAVOREVB 1827 |
1818 | saar MACH_SAAR SAAR 1828 | 1818 | saar MACH_SAAR SAAR 1828 |
1819 | deister_eyecam MACH_DEISTER_EYECAM DEISTER_EYECAM 1829 | 1819 | deister_eyecam MACH_DEISTER_EYECAM DEISTER_EYECAM 1829 |
1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 | 1820 | at91sam9m10g45ek MACH_AT91SAM9M10G45EK AT91SAM9M10G45EK 1830 |
1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 | 1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 |
1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 | 1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 |
1823 | adx_rmu MACH_ADX_RMU ADX_RMU 1833 | 1823 | adx_rmu MACH_ADX_RMU ADX_RMU 1833 |
@@ -2132,3 +2132,116 @@ apollo MACH_APOLLO APOLLO 2141 | |||
2132 | at91cap9stk MACH_AT91CAP9STK AT91CAP9STK 2142 | 2132 | at91cap9stk MACH_AT91CAP9STK AT91CAP9STK 2142 |
2133 | spc300 MACH_SPC300 SPC300 2143 | 2133 | spc300 MACH_SPC300 SPC300 2143 |
2134 | eko MACH_EKO EKO 2144 | 2134 | eko MACH_EKO EKO 2144 |
2135 | ccw9m2443 MACH_CCW9M2443 CCW9M2443 2145 | ||
2136 | ccw9m2443js MACH_CCW9M2443JS CCW9M2443JS 2146 | ||
2137 | m2m_router_device MACH_M2M_ROUTER_DEVICE M2M_ROUTER_DEVICE 2147 | ||
2138 | str9104nas MACH_STAR9104NAS STAR9104NAS 2148 | ||
2139 | pca100 MACH_PCA100 PCA100 2149 | ||
2140 | z3_dm365_mod_01 MACH_Z3_DM365_MOD_01 Z3_DM365_MOD_01 2150 | ||
2141 | hipox MACH_HIPOX HIPOX 2151 | ||
2142 | omap3_piteds MACH_OMAP3_PITEDS OMAP3_PITEDS 2152 | ||
2143 | bm150r MACH_BM150R BM150R 2153 | ||
2144 | tbone MACH_TBONE TBONE 2154 | ||
2145 | merlin MACH_MERLIN MERLIN 2155 | ||
2146 | falcon MACH_FALCON FALCON 2156 | ||
2147 | davinci_da850_evm MACH_DAVINCI_DA850_EVM DAVINCI_DA850_EVM 2157 | ||
2148 | s5p6440 MACH_S5P6440 S5P6440 2158 | ||
2149 | at91sam9g10ek MACH_AT91SAM9G10EK AT91SAM9G10EK 2159 | ||
2150 | omap_4430sdp MACH_OMAP_4430SDP OMAP_4430SDP 2160 | ||
2151 | lpc313x MACH_LPC313X LPC313X 2161 | ||
2152 | magx_zn5 MACH_MAGX_ZN5 MAGX_ZN5 2162 | ||
2153 | magx_em30 MACH_MAGX_EM30 MAGX_EM30 2163 | ||
2154 | magx_ve66 MACH_MAGX_VE66 MAGX_VE66 2164 | ||
2155 | meesc MACH_MEESC MEESC 2165 | ||
2156 | otc570 MACH_OTC570 OTC570 2166 | ||
2157 | bcu2412 MACH_BCU2412 BCU2412 2167 | ||
2158 | beacon MACH_BEACON BEACON 2168 | ||
2159 | actia_tgw MACH_ACTIA_TGW ACTIA_TGW 2169 | ||
2160 | e4430 MACH_E4430 E4430 2170 | ||
2161 | ql300 MACH_QL300 QL300 2171 | ||
2162 | btmavb101 MACH_BTMAVB101 BTMAVB101 2172 | ||
2163 | btmawb101 MACH_BTMAWB101 BTMAWB101 2173 | ||
2164 | sq201 MACH_SQ201 SQ201 2174 | ||
2165 | quatro45xx MACH_QUATRO45XX QUATRO45XX 2175 | ||
2166 | openpad MACH_OPENPAD OPENPAD 2176 | ||
2167 | tx25 MACH_TX25 TX25 2177 | ||
2168 | omap3_torpedo MACH_OMAP3_TORPEDO OMAP3_TORPEDO 2178 | ||
2169 | htcraphael_k MACH_HTCRAPHAEL_K HTCRAPHAEL_K 2179 | ||
2170 | lal43 MACH_LAL43 LAL43 2181 | ||
2171 | htcraphael_cdma500 MACH_HTCRAPHAEL_CDMA500 HTCRAPHAEL_CDMA500 2182 | ||
2172 | anw6410 MACH_ANW6410 ANW6410 2183 | ||
2173 | htcprophet MACH_HTCPROPHET HTCPROPHET 2185 | ||
2174 | cfa_10022 MACH_CFA_10022 CFA_10022 2186 | ||
2175 | imx27_visstrim_m10 MACH_IMX27_VISSTRIM_M10 IMX27_VISSTRIM_M10 2187 | ||
2176 | px2imx27 MACH_PX2IMX27 PX2IMX27 2188 | ||
2177 | stm3210e_eval MACH_STM3210E_EVAL STM3210E_EVAL 2189 | ||
2178 | dvs10 MACH_DVS10 DVS10 2190 | ||
2179 | portuxg20 MACH_PORTUXG20 PORTUXG20 2191 | ||
2180 | arm_spv MACH_ARM_SPV ARM_SPV 2192 | ||
2181 | smdkc110 MACH_SMDKC110 SMDKC110 2193 | ||
2182 | cabespresso MACH_CABESPRESSO CABESPRESSO 2194 | ||
2183 | hmc800 MACH_HMC800 HMC800 2195 | ||
2184 | sholes MACH_SHOLES SHOLES 2196 | ||
2185 | btmxc31 MACH_BTMXC31 BTMXC31 2197 | ||
2186 | dt501 MACH_DT501 DT501 2198 | ||
2187 | ktx MACH_KTX KTX 2199 | ||
2188 | omap3517evm MACH_OMAP3517EVM OMAP3517EVM 2200 | ||
2189 | netspace_v2 MACH_NETSPACE_V2 NETSPACE_V2 2201 | ||
2190 | netspace_max_v2 MACH_NETSPACE_MAX_V2 NETSPACE_MAX_V2 2202 | ||
2191 | d2net_v2 MACH_D2NET_V2 D2NET_V2 2203 | ||
2192 | net2big_v2 MACH_NET2BIG_V2 NET2BIG_V2 2204 | ||
2193 | net4big_v2 MACH_NET4BIG_V2 NET4BIG_V2 2205 | ||
2194 | net5big_v2 MACH_NET5BIG_V2 NET5BIG_V2 2206 | ||
2195 | endb2443 MACH_ENDB2443 ENDB2443 2207 | ||
2196 | inetspace_v2 MACH_INETSPACE_V2 INETSPACE_V2 2208 | ||
2197 | tros MACH_TROS TROS 2209 | ||
2198 | pelco_homer MACH_PELCO_HOMER PELCO_HOMER 2210 | ||
2199 | ofsp8 MACH_OFSP8 OFSP8 2211 | ||
2200 | at91sam9g45ekes MACH_AT91SAM9G45EKES AT91SAM9G45EKES 2212 | ||
2201 | guf_cupid MACH_GUF_CUPID GUF_CUPID 2213 | ||
2202 | eab1r MACH_EAB1R EAB1R 2214 | ||
2203 | desirec MACH_DESIREC DESIREC 2215 | ||
2204 | cordoba MACH_CORDOBA CORDOBA 2216 | ||
2205 | irvine MACH_IRVINE IRVINE 2217 | ||
2206 | sff772 MACH_SFF772 SFF772 2218 | ||
2207 | pelco_milano MACH_PELCO_MILANO PELCO_MILANO 2219 | ||
2208 | pc7302 MACH_PC7302 PC7302 2220 | ||
2209 | bip6000 MACH_BIP6000 BIP6000 2221 | ||
2210 | silvermoon MACH_SILVERMOON SILVERMOON 2222 | ||
2211 | vc0830 MACH_VC0830 VC0830 2223 | ||
2212 | dt430 MACH_DT430 DT430 2224 | ||
2213 | ji42pf MACH_JI42PF JI42PF 2225 | ||
2214 | gnet_ksm MACH_GNET_KSM GNET_KSM 2226 | ||
2215 | gnet_sgm MACH_GNET_SGM GNET_SGM 2227 | ||
2216 | gnet_sgr MACH_GNET_SGR GNET_SGR 2228 | ||
2217 | omap3_icetekevm MACH_OMAP3_ICETEKEVM OMAP3_ICETEKEVM 2229 | ||
2218 | pnp MACH_PNP PNP 2230 | ||
2219 | ctera_2bay_k MACH_CTERA_2BAY_K CTERA_2BAY_K 2231 | ||
2220 | ctera_2bay_u MACH_CTERA_2BAY_U CTERA_2BAY_U 2232 | ||
2221 | sas_c MACH_SAS_C SAS_C 2233 | ||
2222 | vma2315 MACH_VMA2315 VMA2315 2234 | ||
2223 | vcs MACH_VCS VCS 2235 | ||
2224 | spear600 MACH_SPEAR600 SPEAR600 2236 | ||
2225 | spear300 MACH_SPEAR300 SPEAR300 2237 | ||
2226 | spear1300 MACH_SPEAR1300 SPEAR1300 2238 | ||
2227 | lilly1131 MACH_LILLY1131 LILLY1131 2239 | ||
2228 | arvoo_ax301 MACH_ARVOO_AX301 ARVOO_AX301 2240 | ||
2229 | mapphone MACH_MAPPHONE MAPPHONE 2241 | ||
2230 | legend MACH_LEGEND LEGEND 2242 | ||
2231 | salsa MACH_SALSA SALSA 2243 | ||
2232 | lounge MACH_LOUNGE LOUNGE 2244 | ||
2233 | vision MACH_VISION VISION 2245 | ||
2234 | vmb20 MACH_VMB20 VMB20 2246 | ||
2235 | hy2410 MACH_HY2410 HY2410 2247 | ||
2236 | hy9315 MACH_HY9315 HY9315 2248 | ||
2237 | bullwinkle MACH_BULLWINKLE BULLWINKLE 2249 | ||
2238 | arm_ultimator2 MACH_ARM_ULTIMATOR2 ARM_ULTIMATOR2 2250 | ||
2239 | vs_v210 MACH_VS_V210 VS_V210 2252 | ||
2240 | vs_v212 MACH_VS_V212 VS_V212 2253 | ||
2241 | hmt MACH_HMT HMT 2254 | ||
2242 | suen3 MACH_SUEN3 SUEN3 2255 | ||
2243 | vesper MACH_VESPER VESPER 2256 | ||
2244 | str9 MACH_STR9 STR9 2257 | ||
2245 | omap3_wl_ff MACH_OMAP3_WL_FF OMAP3_WL_FF 2258 | ||
2246 | simcom MACH_SIMCOM SIMCOM 2259 | ||
2247 | mcwebio MACH_MCWEBIO MCWEBIO 2260 | ||
diff --git a/arch/blackfin/include/asm/flat.h b/arch/blackfin/include/asm/flat.h index e70074e05f4e..733a178d782d 100644 --- a/arch/blackfin/include/asm/flat.h +++ b/arch/blackfin/include/asm/flat.h | |||
@@ -10,7 +10,6 @@ | |||
10 | 10 | ||
11 | #include <asm/unaligned.h> | 11 | #include <asm/unaligned.h> |
12 | 12 | ||
13 | #define flat_stack_align(sp) /* nothing needed */ | ||
14 | #define flat_argvp_envp_on_stack() 0 | 13 | #define flat_argvp_envp_on_stack() 0 |
15 | #define flat_old_ram_flag(flags) (flags) | 14 | #define flat_old_ram_flag(flags) (flags) |
16 | 15 | ||
diff --git a/arch/cris/arch-v32/kernel/irq.c b/arch/cris/arch-v32/kernel/irq.c index df3925cb1c7f..d70b445f4a8f 100644 --- a/arch/cris/arch-v32/kernel/irq.c +++ b/arch/cris/arch-v32/kernel/irq.c | |||
@@ -325,12 +325,14 @@ static void end_crisv32_irq(unsigned int irq) | |||
325 | { | 325 | { |
326 | } | 326 | } |
327 | 327 | ||
328 | void set_affinity_crisv32_irq(unsigned int irq, const struct cpumask *dest) | 328 | int set_affinity_crisv32_irq(unsigned int irq, const struct cpumask *dest) |
329 | { | 329 | { |
330 | unsigned long flags; | 330 | unsigned long flags; |
331 | spin_lock_irqsave(&irq_lock, flags); | 331 | spin_lock_irqsave(&irq_lock, flags); |
332 | irq_allocations[irq - FIRST_IRQ].mask = *dest; | 332 | irq_allocations[irq - FIRST_IRQ].mask = *dest; |
333 | spin_unlock_irqrestore(&irq_lock, flags); | 333 | spin_unlock_irqrestore(&irq_lock, flags); |
334 | |||
335 | return 0; | ||
334 | } | 336 | } |
335 | 337 | ||
336 | static struct irq_chip crisv32_irq_type = { | 338 | static struct irq_chip crisv32_irq_type = { |
diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h index 2a873508a9a1..bd12b31b90e6 100644 --- a/arch/h8300/include/asm/flat.h +++ b/arch/h8300/include/asm/flat.h | |||
@@ -5,7 +5,6 @@ | |||
5 | #ifndef __H8300_FLAT_H__ | 5 | #ifndef __H8300_FLAT_H__ |
6 | #define __H8300_FLAT_H__ | 6 | #define __H8300_FLAT_H__ |
7 | 7 | ||
8 | #define flat_stack_align(sp) /* nothing needed */ | ||
9 | #define flat_argvp_envp_on_stack() 1 | 8 | #define flat_argvp_envp_on_stack() 1 |
10 | #define flat_old_ram_flag(flags) 1 | 9 | #define flat_old_ram_flag(flags) 1 |
11 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 10 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) |
diff --git a/arch/ia64/hp/sim/hpsim_irq.c b/arch/ia64/hp/sim/hpsim_irq.c index cc0a3182db3c..acb5047ab573 100644 --- a/arch/ia64/hp/sim/hpsim_irq.c +++ b/arch/ia64/hp/sim/hpsim_irq.c | |||
@@ -21,9 +21,10 @@ hpsim_irq_noop (unsigned int irq) | |||
21 | { | 21 | { |
22 | } | 22 | } |
23 | 23 | ||
24 | static void | 24 | static int |
25 | hpsim_set_affinity_noop(unsigned int a, const struct cpumask *b) | 25 | hpsim_set_affinity_noop(unsigned int a, const struct cpumask *b) |
26 | { | 26 | { |
27 | return 0; | ||
27 | } | 28 | } |
28 | 29 | ||
29 | static struct hw_interrupt_type irq_type_hp_sim = { | 30 | static struct hw_interrupt_type irq_type_hp_sim = { |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 5510317db37b..baec6f00f7f3 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -636,7 +636,7 @@ void __init acpi_numa_arch_fixup(void) | |||
636 | * success: return IRQ number (>=0) | 636 | * success: return IRQ number (>=0) |
637 | * failure: return < 0 | 637 | * failure: return < 0 |
638 | */ | 638 | */ |
639 | int acpi_register_gsi(u32 gsi, int triggering, int polarity) | 639 | int acpi_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity) |
640 | { | 640 | { |
641 | if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) | 641 | if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) |
642 | return gsi; | 642 | return gsi; |
@@ -678,7 +678,8 @@ static int __init acpi_parse_fadt(struct acpi_table_header *table) | |||
678 | 678 | ||
679 | fadt = (struct acpi_table_fadt *)fadt_header; | 679 | fadt = (struct acpi_table_fadt *)fadt_header; |
680 | 680 | ||
681 | acpi_register_gsi(fadt->sci_interrupt, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW); | 681 | acpi_register_gsi(NULL, fadt->sci_interrupt, ACPI_LEVEL_SENSITIVE, |
682 | ACPI_ACTIVE_LOW); | ||
682 | return 0; | 683 | return 0; |
683 | } | 684 | } |
684 | 685 | ||
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 166e0d839fa0..f92cef47bf86 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -329,7 +329,7 @@ unmask_irq (unsigned int irq) | |||
329 | } | 329 | } |
330 | 330 | ||
331 | 331 | ||
332 | static void | 332 | static int |
333 | iosapic_set_affinity(unsigned int irq, const struct cpumask *mask) | 333 | iosapic_set_affinity(unsigned int irq, const struct cpumask *mask) |
334 | { | 334 | { |
335 | #ifdef CONFIG_SMP | 335 | #ifdef CONFIG_SMP |
@@ -343,15 +343,15 @@ iosapic_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
343 | 343 | ||
344 | cpu = cpumask_first_and(cpu_online_mask, mask); | 344 | cpu = cpumask_first_and(cpu_online_mask, mask); |
345 | if (cpu >= nr_cpu_ids) | 345 | if (cpu >= nr_cpu_ids) |
346 | return; | 346 | return -1; |
347 | 347 | ||
348 | if (irq_prepare_move(irq, cpu)) | 348 | if (irq_prepare_move(irq, cpu)) |
349 | return; | 349 | return -1; |
350 | 350 | ||
351 | dest = cpu_physical_id(cpu); | 351 | dest = cpu_physical_id(cpu); |
352 | 352 | ||
353 | if (!iosapic_intr_info[irq].count) | 353 | if (!iosapic_intr_info[irq].count) |
354 | return; /* not an IOSAPIC interrupt */ | 354 | return -1; /* not an IOSAPIC interrupt */ |
355 | 355 | ||
356 | set_irq_affinity_info(irq, dest, redir); | 356 | set_irq_affinity_info(irq, dest, redir); |
357 | 357 | ||
@@ -376,7 +376,9 @@ iosapic_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
376 | iosapic_write(iosapic, IOSAPIC_RTE_HIGH(rte_index), high32); | 376 | iosapic_write(iosapic, IOSAPIC_RTE_HIGH(rte_index), high32); |
377 | iosapic_write(iosapic, IOSAPIC_RTE_LOW(rte_index), low32); | 377 | iosapic_write(iosapic, IOSAPIC_RTE_LOW(rte_index), low32); |
378 | } | 378 | } |
379 | |||
379 | #endif | 380 | #endif |
381 | return 0; | ||
380 | } | 382 | } |
381 | 383 | ||
382 | /* | 384 | /* |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 2b15e233f7fe..0f8ade9331ba 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -12,7 +12,7 @@ | |||
12 | static struct irq_chip ia64_msi_chip; | 12 | static struct irq_chip ia64_msi_chip; |
13 | 13 | ||
14 | #ifdef CONFIG_SMP | 14 | #ifdef CONFIG_SMP |
15 | static void ia64_set_msi_irq_affinity(unsigned int irq, | 15 | static int ia64_set_msi_irq_affinity(unsigned int irq, |
16 | const cpumask_t *cpu_mask) | 16 | const cpumask_t *cpu_mask) |
17 | { | 17 | { |
18 | struct msi_msg msg; | 18 | struct msi_msg msg; |
@@ -20,10 +20,10 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
20 | int cpu = first_cpu(*cpu_mask); | 20 | int cpu = first_cpu(*cpu_mask); |
21 | 21 | ||
22 | if (!cpu_online(cpu)) | 22 | if (!cpu_online(cpu)) |
23 | return; | 23 | return -1; |
24 | 24 | ||
25 | if (irq_prepare_move(irq, cpu)) | 25 | if (irq_prepare_move(irq, cpu)) |
26 | return; | 26 | return -1; |
27 | 27 | ||
28 | read_msi_msg(irq, &msg); | 28 | read_msi_msg(irq, &msg); |
29 | 29 | ||
@@ -39,6 +39,8 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
39 | 39 | ||
40 | write_msi_msg(irq, &msg); | 40 | write_msi_msg(irq, &msg); |
41 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); | 41 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
42 | |||
43 | return 0; | ||
42 | } | 44 | } |
43 | #endif /* CONFIG_SMP */ | 45 | #endif /* CONFIG_SMP */ |
44 | 46 | ||
@@ -130,17 +132,17 @@ void arch_teardown_msi_irq(unsigned int irq) | |||
130 | 132 | ||
131 | #ifdef CONFIG_DMAR | 133 | #ifdef CONFIG_DMAR |
132 | #ifdef CONFIG_SMP | 134 | #ifdef CONFIG_SMP |
133 | static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | 135 | static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) |
134 | { | 136 | { |
135 | struct irq_cfg *cfg = irq_cfg + irq; | 137 | struct irq_cfg *cfg = irq_cfg + irq; |
136 | struct msi_msg msg; | 138 | struct msi_msg msg; |
137 | int cpu = cpumask_first(mask); | 139 | int cpu = cpumask_first(mask); |
138 | 140 | ||
139 | if (!cpu_online(cpu)) | 141 | if (!cpu_online(cpu)) |
140 | return; | 142 | return -1; |
141 | 143 | ||
142 | if (irq_prepare_move(irq, cpu)) | 144 | if (irq_prepare_move(irq, cpu)) |
143 | return; | 145 | return -1; |
144 | 146 | ||
145 | dmar_msi_read(irq, &msg); | 147 | dmar_msi_read(irq, &msg); |
146 | 148 | ||
@@ -151,6 +153,8 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
151 | 153 | ||
152 | dmar_msi_write(irq, &msg); | 154 | dmar_msi_write(irq, &msg); |
153 | cpumask_copy(irq_desc[irq].affinity, mask); | 155 | cpumask_copy(irq_desc[irq].affinity, mask); |
156 | |||
157 | return 0; | ||
154 | } | 158 | } |
155 | #endif /* CONFIG_SMP */ | 159 | #endif /* CONFIG_SMP */ |
156 | 160 | ||
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index 66fd705e82c0..764f26abac05 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c | |||
@@ -227,7 +227,7 @@ finish_up: | |||
227 | return new_irq_info; | 227 | return new_irq_info; |
228 | } | 228 | } |
229 | 229 | ||
230 | static void sn_set_affinity_irq(unsigned int irq, const struct cpumask *mask) | 230 | static int sn_set_affinity_irq(unsigned int irq, const struct cpumask *mask) |
231 | { | 231 | { |
232 | struct sn_irq_info *sn_irq_info, *sn_irq_info_safe; | 232 | struct sn_irq_info *sn_irq_info, *sn_irq_info_safe; |
233 | nasid_t nasid; | 233 | nasid_t nasid; |
@@ -239,6 +239,8 @@ static void sn_set_affinity_irq(unsigned int irq, const struct cpumask *mask) | |||
239 | list_for_each_entry_safe(sn_irq_info, sn_irq_info_safe, | 239 | list_for_each_entry_safe(sn_irq_info, sn_irq_info_safe, |
240 | sn_irq_lh[irq], list) | 240 | sn_irq_lh[irq], list) |
241 | (void)sn_retarget_vector(sn_irq_info, nasid, slice); | 241 | (void)sn_retarget_vector(sn_irq_info, nasid, slice); |
242 | |||
243 | return 0; | ||
242 | } | 244 | } |
243 | 245 | ||
244 | #ifdef CONFIG_SMP | 246 | #ifdef CONFIG_SMP |
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c index 81e428943d73..fbbfb9701201 100644 --- a/arch/ia64/sn/kernel/msi_sn.c +++ b/arch/ia64/sn/kernel/msi_sn.c | |||
@@ -151,7 +151,7 @@ int sn_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *entry) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | #ifdef CONFIG_SMP | 153 | #ifdef CONFIG_SMP |
154 | static void sn_set_msi_irq_affinity(unsigned int irq, | 154 | static int sn_set_msi_irq_affinity(unsigned int irq, |
155 | const struct cpumask *cpu_mask) | 155 | const struct cpumask *cpu_mask) |
156 | { | 156 | { |
157 | struct msi_msg msg; | 157 | struct msi_msg msg; |
@@ -168,7 +168,7 @@ static void sn_set_msi_irq_affinity(unsigned int irq, | |||
168 | cpu = cpumask_first(cpu_mask); | 168 | cpu = cpumask_first(cpu_mask); |
169 | sn_irq_info = sn_msi_info[irq].sn_irq_info; | 169 | sn_irq_info = sn_msi_info[irq].sn_irq_info; |
170 | if (sn_irq_info == NULL || sn_irq_info->irq_int_bit >= 0) | 170 | if (sn_irq_info == NULL || sn_irq_info->irq_int_bit >= 0) |
171 | return; | 171 | return -1; |
172 | 172 | ||
173 | /* | 173 | /* |
174 | * Release XIO resources for the old MSI PCI address | 174 | * Release XIO resources for the old MSI PCI address |
@@ -189,7 +189,7 @@ static void sn_set_msi_irq_affinity(unsigned int irq, | |||
189 | new_irq_info = sn_retarget_vector(sn_irq_info, nasid, slice); | 189 | new_irq_info = sn_retarget_vector(sn_irq_info, nasid, slice); |
190 | sn_msi_info[irq].sn_irq_info = new_irq_info; | 190 | sn_msi_info[irq].sn_irq_info = new_irq_info; |
191 | if (new_irq_info == NULL) | 191 | if (new_irq_info == NULL) |
192 | return; | 192 | return -1; |
193 | 193 | ||
194 | /* | 194 | /* |
195 | * Map the xio address into bus space | 195 | * Map the xio address into bus space |
@@ -206,6 +206,8 @@ static void sn_set_msi_irq_affinity(unsigned int irq, | |||
206 | 206 | ||
207 | write_msi_msg(irq, &msg); | 207 | write_msi_msg(irq, &msg); |
208 | cpumask_copy(irq_desc[irq].affinity, cpu_mask); | 208 | cpumask_copy(irq_desc[irq].affinity, cpu_mask); |
209 | |||
210 | return 0; | ||
209 | } | 211 | } |
210 | #endif /* CONFIG_SMP */ | 212 | #endif /* CONFIG_SMP */ |
211 | 213 | ||
diff --git a/arch/m32r/include/asm/flat.h b/arch/m32r/include/asm/flat.h index d851cf0c4aa5..5d711c4688fb 100644 --- a/arch/m32r/include/asm/flat.h +++ b/arch/m32r/include/asm/flat.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #ifndef __ASM_M32R_FLAT_H | 12 | #ifndef __ASM_M32R_FLAT_H |
13 | #define __ASM_M32R_FLAT_H | 13 | #define __ASM_M32R_FLAT_H |
14 | 14 | ||
15 | #define flat_stack_align(sp) (*sp += (*sp & 3 ? (4 - (*sp & 3)): 0)) | ||
16 | #define flat_argvp_envp_on_stack() 0 | 15 | #define flat_argvp_envp_on_stack() 0 |
17 | #define flat_old_ram_flag(flags) (flags) | 16 | #define flat_old_ram_flag(flags) (flags) |
18 | #define flat_set_persistent(relval, p) 0 | 17 | #define flat_set_persistent(relval, p) 0 |
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h index 814b5174a8e0..a0e290793978 100644 --- a/arch/m68k/include/asm/flat.h +++ b/arch/m68k/include/asm/flat.h | |||
@@ -5,7 +5,6 @@ | |||
5 | #ifndef __M68KNOMMU_FLAT_H__ | 5 | #ifndef __M68KNOMMU_FLAT_H__ |
6 | #define __M68KNOMMU_FLAT_H__ | 6 | #define __M68KNOMMU_FLAT_H__ |
7 | 7 | ||
8 | #define flat_stack_align(sp) /* nothing needed */ | ||
9 | #define flat_argvp_envp_on_stack() 1 | 8 | #define flat_argvp_envp_on_stack() 1 |
10 | #define flat_old_ram_flag(flags) (flags) | 9 | #define flat_old_ram_flag(flags) (flags) |
11 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 10 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) |
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c index 1c19af8daa62..d3a0c8154bec 100644 --- a/arch/mips/cavium-octeon/octeon-irq.c +++ b/arch/mips/cavium-octeon/octeon-irq.c | |||
@@ -177,7 +177,7 @@ static void octeon_irq_ciu0_disable(unsigned int irq) | |||
177 | } | 177 | } |
178 | 178 | ||
179 | #ifdef CONFIG_SMP | 179 | #ifdef CONFIG_SMP |
180 | static void octeon_irq_ciu0_set_affinity(unsigned int irq, const struct cpumask *dest) | 180 | static int octeon_irq_ciu0_set_affinity(unsigned int irq, const struct cpumask *dest) |
181 | { | 181 | { |
182 | int cpu; | 182 | int cpu; |
183 | int bit = irq - OCTEON_IRQ_WORKQ0; /* Bit 0-63 of EN0 */ | 183 | int bit = irq - OCTEON_IRQ_WORKQ0; /* Bit 0-63 of EN0 */ |
@@ -199,6 +199,8 @@ static void octeon_irq_ciu0_set_affinity(unsigned int irq, const struct cpumask | |||
199 | */ | 199 | */ |
200 | cvmx_read_csr(CVMX_CIU_INTX_EN0(cvmx_get_core_num() * 2)); | 200 | cvmx_read_csr(CVMX_CIU_INTX_EN0(cvmx_get_core_num() * 2)); |
201 | write_unlock(&octeon_irq_ciu0_rwlock); | 201 | write_unlock(&octeon_irq_ciu0_rwlock); |
202 | |||
203 | return 0; | ||
202 | } | 204 | } |
203 | #endif | 205 | #endif |
204 | 206 | ||
@@ -292,7 +294,7 @@ static void octeon_irq_ciu1_disable(unsigned int irq) | |||
292 | } | 294 | } |
293 | 295 | ||
294 | #ifdef CONFIG_SMP | 296 | #ifdef CONFIG_SMP |
295 | static void octeon_irq_ciu1_set_affinity(unsigned int irq, const struct cpumask *dest) | 297 | static int octeon_irq_ciu1_set_affinity(unsigned int irq, const struct cpumask *dest) |
296 | { | 298 | { |
297 | int cpu; | 299 | int cpu; |
298 | int bit = irq - OCTEON_IRQ_WDOG0; /* Bit 0-63 of EN1 */ | 300 | int bit = irq - OCTEON_IRQ_WDOG0; /* Bit 0-63 of EN1 */ |
@@ -315,6 +317,8 @@ static void octeon_irq_ciu1_set_affinity(unsigned int irq, const struct cpumask | |||
315 | */ | 317 | */ |
316 | cvmx_read_csr(CVMX_CIU_INTX_EN1(cvmx_get_core_num() * 2 + 1)); | 318 | cvmx_read_csr(CVMX_CIU_INTX_EN1(cvmx_get_core_num() * 2 + 1)); |
317 | write_unlock(&octeon_irq_ciu1_rwlock); | 319 | write_unlock(&octeon_irq_ciu1_rwlock); |
320 | |||
321 | return 0; | ||
318 | } | 322 | } |
319 | #endif | 323 | #endif |
320 | 324 | ||
diff --git a/arch/mips/include/asm/irq.h b/arch/mips/include/asm/irq.h index 3214ade02d10..4f1eed107b08 100644 --- a/arch/mips/include/asm/irq.h +++ b/arch/mips/include/asm/irq.h | |||
@@ -49,7 +49,7 @@ static inline void smtc_im_ack_irq(unsigned int irq) | |||
49 | #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF | 49 | #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF |
50 | #include <linux/cpumask.h> | 50 | #include <linux/cpumask.h> |
51 | 51 | ||
52 | extern void plat_set_irq_affinity(unsigned int irq, | 52 | extern int plat_set_irq_affinity(unsigned int irq, |
53 | const struct cpumask *affinity); | 53 | const struct cpumask *affinity); |
54 | extern void smtc_forward_irq(unsigned int irq); | 54 | extern void smtc_forward_irq(unsigned int irq); |
55 | 55 | ||
diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c index 87deb8f6c458..3f43c2e3aa5a 100644 --- a/arch/mips/kernel/irq-gic.c +++ b/arch/mips/kernel/irq-gic.c | |||
@@ -155,7 +155,7 @@ static void gic_unmask_irq(unsigned int irq) | |||
155 | 155 | ||
156 | static DEFINE_SPINLOCK(gic_lock); | 156 | static DEFINE_SPINLOCK(gic_lock); |
157 | 157 | ||
158 | static void gic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | 158 | static int gic_set_affinity(unsigned int irq, const struct cpumask *cpumask) |
159 | { | 159 | { |
160 | cpumask_t tmp = CPU_MASK_NONE; | 160 | cpumask_t tmp = CPU_MASK_NONE; |
161 | unsigned long flags; | 161 | unsigned long flags; |
@@ -166,7 +166,7 @@ static void gic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
166 | 166 | ||
167 | cpumask_and(&tmp, cpumask, cpu_online_mask); | 167 | cpumask_and(&tmp, cpumask, cpu_online_mask); |
168 | if (cpus_empty(tmp)) | 168 | if (cpus_empty(tmp)) |
169 | return; | 169 | return -1; |
170 | 170 | ||
171 | /* Assumption : cpumask refers to a single CPU */ | 171 | /* Assumption : cpumask refers to a single CPU */ |
172 | spin_lock_irqsave(&gic_lock, flags); | 172 | spin_lock_irqsave(&gic_lock, flags); |
@@ -190,6 +190,7 @@ static void gic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
190 | cpumask_copy(irq_desc[irq].affinity, cpumask); | 190 | cpumask_copy(irq_desc[irq].affinity, cpumask); |
191 | spin_unlock_irqrestore(&gic_lock, flags); | 191 | spin_unlock_irqrestore(&gic_lock, flags); |
192 | 192 | ||
193 | return 0; | ||
193 | } | 194 | } |
194 | #endif | 195 | #endif |
195 | 196 | ||
diff --git a/arch/mips/mti-malta/malta-smtc.c b/arch/mips/mti-malta/malta-smtc.c index 5ba31888fefb..499ffe5475df 100644 --- a/arch/mips/mti-malta/malta-smtc.c +++ b/arch/mips/mti-malta/malta-smtc.c | |||
@@ -114,7 +114,7 @@ struct plat_smp_ops msmtc_smp_ops = { | |||
114 | */ | 114 | */ |
115 | 115 | ||
116 | 116 | ||
117 | void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | 117 | int plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) |
118 | { | 118 | { |
119 | cpumask_t tmask; | 119 | cpumask_t tmask; |
120 | int cpu = 0; | 120 | int cpu = 0; |
@@ -156,5 +156,7 @@ void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | |||
156 | 156 | ||
157 | /* Do any generic SMTC IRQ affinity setup */ | 157 | /* Do any generic SMTC IRQ affinity setup */ |
158 | smtc_set_irq_affinity(irq, tmask); | 158 | smtc_set_irq_affinity(irq, tmask); |
159 | |||
160 | return 0; | ||
159 | } | 161 | } |
160 | #endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */ | 162 | #endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */ |
diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c index c147c4b35d3f..690de06bde90 100644 --- a/arch/mips/sibyte/bcm1480/irq.c +++ b/arch/mips/sibyte/bcm1480/irq.c | |||
@@ -50,7 +50,7 @@ static void enable_bcm1480_irq(unsigned int irq); | |||
50 | static void disable_bcm1480_irq(unsigned int irq); | 50 | static void disable_bcm1480_irq(unsigned int irq); |
51 | static void ack_bcm1480_irq(unsigned int irq); | 51 | static void ack_bcm1480_irq(unsigned int irq); |
52 | #ifdef CONFIG_SMP | 52 | #ifdef CONFIG_SMP |
53 | static void bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask); | 53 | static int bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask); |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | #ifdef CONFIG_PCI | 56 | #ifdef CONFIG_PCI |
@@ -109,7 +109,7 @@ void bcm1480_unmask_irq(int cpu, int irq) | |||
109 | } | 109 | } |
110 | 110 | ||
111 | #ifdef CONFIG_SMP | 111 | #ifdef CONFIG_SMP |
112 | static void bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask) | 112 | static int bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask) |
113 | { | 113 | { |
114 | int i = 0, old_cpu, cpu, int_on, k; | 114 | int i = 0, old_cpu, cpu, int_on, k; |
115 | u64 cur_ints; | 115 | u64 cur_ints; |
@@ -118,7 +118,7 @@ static void bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
118 | 118 | ||
119 | if (cpumask_weight(mask) != 1) { | 119 | if (cpumask_weight(mask) != 1) { |
120 | printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq); | 120 | printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq); |
121 | return; | 121 | return -1; |
122 | } | 122 | } |
123 | i = cpumask_first(mask); | 123 | i = cpumask_first(mask); |
124 | 124 | ||
@@ -152,6 +152,8 @@ static void bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
152 | } | 152 | } |
153 | } | 153 | } |
154 | spin_unlock_irqrestore(&bcm1480_imr_lock, flags); | 154 | spin_unlock_irqrestore(&bcm1480_imr_lock, flags); |
155 | |||
156 | return 0; | ||
155 | } | 157 | } |
156 | #endif | 158 | #endif |
157 | 159 | ||
diff --git a/arch/mips/sibyte/sb1250/irq.c b/arch/mips/sibyte/sb1250/irq.c index 38cb998ade22..409dec798863 100644 --- a/arch/mips/sibyte/sb1250/irq.c +++ b/arch/mips/sibyte/sb1250/irq.c | |||
@@ -50,7 +50,7 @@ static void enable_sb1250_irq(unsigned int irq); | |||
50 | static void disable_sb1250_irq(unsigned int irq); | 50 | static void disable_sb1250_irq(unsigned int irq); |
51 | static void ack_sb1250_irq(unsigned int irq); | 51 | static void ack_sb1250_irq(unsigned int irq); |
52 | #ifdef CONFIG_SMP | 52 | #ifdef CONFIG_SMP |
53 | static void sb1250_set_affinity(unsigned int irq, const struct cpumask *mask); | 53 | static int sb1250_set_affinity(unsigned int irq, const struct cpumask *mask); |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | #ifdef CONFIG_SIBYTE_HAS_LDT | 56 | #ifdef CONFIG_SIBYTE_HAS_LDT |
@@ -103,7 +103,7 @@ void sb1250_unmask_irq(int cpu, int irq) | |||
103 | } | 103 | } |
104 | 104 | ||
105 | #ifdef CONFIG_SMP | 105 | #ifdef CONFIG_SMP |
106 | static void sb1250_set_affinity(unsigned int irq, const struct cpumask *mask) | 106 | static int sb1250_set_affinity(unsigned int irq, const struct cpumask *mask) |
107 | { | 107 | { |
108 | int i = 0, old_cpu, cpu, int_on; | 108 | int i = 0, old_cpu, cpu, int_on; |
109 | u64 cur_ints; | 109 | u64 cur_ints; |
@@ -113,7 +113,7 @@ static void sb1250_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
113 | 113 | ||
114 | if (cpumask_weight(mask) > 1) { | 114 | if (cpumask_weight(mask) > 1) { |
115 | printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq); | 115 | printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq); |
116 | return; | 116 | return -1; |
117 | } | 117 | } |
118 | 118 | ||
119 | /* Convert logical CPU to physical CPU */ | 119 | /* Convert logical CPU to physical CPU */ |
@@ -143,6 +143,8 @@ static void sb1250_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
143 | R_IMR_INTERRUPT_MASK)); | 143 | R_IMR_INTERRUPT_MASK)); |
144 | } | 144 | } |
145 | spin_unlock_irqrestore(&sb1250_imr_lock, flags); | 145 | spin_unlock_irqrestore(&sb1250_imr_lock, flags); |
146 | |||
147 | return 0; | ||
146 | } | 148 | } |
147 | #endif | 149 | #endif |
148 | 150 | ||
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 4ea4229d765c..8007f1e65729 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -130,15 +130,17 @@ int cpu_check_affinity(unsigned int irq, const struct cpumask *dest) | |||
130 | return cpu_dest; | 130 | return cpu_dest; |
131 | } | 131 | } |
132 | 132 | ||
133 | static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) | 133 | static int cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) |
134 | { | 134 | { |
135 | int cpu_dest; | 135 | int cpu_dest; |
136 | 136 | ||
137 | cpu_dest = cpu_check_affinity(irq, dest); | 137 | cpu_dest = cpu_check_affinity(irq, dest); |
138 | if (cpu_dest < 0) | 138 | if (cpu_dest < 0) |
139 | return; | 139 | return -1; |
140 | 140 | ||
141 | cpumask_copy(&irq_desc[irq].affinity, dest); | 141 | cpumask_copy(&irq_desc[irq].affinity, dest); |
142 | |||
143 | return 0; | ||
142 | } | 144 | } |
143 | #endif | 145 | #endif |
144 | 146 | ||
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 80b513449f4c..be3581a8c294 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -333,7 +333,7 @@ static void xics_eoi_lpar(unsigned int virq) | |||
333 | lpar_xirr_info_set((0xff << 24) | irq); | 333 | lpar_xirr_info_set((0xff << 24) | irq); |
334 | } | 334 | } |
335 | 335 | ||
336 | static void xics_set_affinity(unsigned int virq, const struct cpumask *cpumask) | 336 | static int xics_set_affinity(unsigned int virq, const struct cpumask *cpumask) |
337 | { | 337 | { |
338 | unsigned int irq; | 338 | unsigned int irq; |
339 | int status; | 339 | int status; |
@@ -342,14 +342,14 @@ static void xics_set_affinity(unsigned int virq, const struct cpumask *cpumask) | |||
342 | 342 | ||
343 | irq = (unsigned int)irq_map[virq].hwirq; | 343 | irq = (unsigned int)irq_map[virq].hwirq; |
344 | if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) | 344 | if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) |
345 | return; | 345 | return -1; |
346 | 346 | ||
347 | status = rtas_call(ibm_get_xive, 1, 3, xics_status, irq); | 347 | status = rtas_call(ibm_get_xive, 1, 3, xics_status, irq); |
348 | 348 | ||
349 | if (status) { | 349 | if (status) { |
350 | printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n", | 350 | printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n", |
351 | __func__, irq, status); | 351 | __func__, irq, status); |
352 | return; | 352 | return -1; |
353 | } | 353 | } |
354 | 354 | ||
355 | /* | 355 | /* |
@@ -363,7 +363,7 @@ static void xics_set_affinity(unsigned int virq, const struct cpumask *cpumask) | |||
363 | printk(KERN_WARNING | 363 | printk(KERN_WARNING |
364 | "%s: No online cpus in the mask %s for irq %d\n", | 364 | "%s: No online cpus in the mask %s for irq %d\n", |
365 | __func__, cpulist, virq); | 365 | __func__, cpulist, virq); |
366 | return; | 366 | return -1; |
367 | } | 367 | } |
368 | 368 | ||
369 | status = rtas_call(ibm_set_xive, 3, 1, NULL, | 369 | status = rtas_call(ibm_set_xive, 3, 1, NULL, |
@@ -372,8 +372,10 @@ static void xics_set_affinity(unsigned int virq, const struct cpumask *cpumask) | |||
372 | if (status) { | 372 | if (status) { |
373 | printk(KERN_ERR "%s: ibm,set-xive irq=%u returns %d\n", | 373 | printk(KERN_ERR "%s: ibm,set-xive irq=%u returns %d\n", |
374 | __func__, irq, status); | 374 | __func__, irq, status); |
375 | return; | 375 | return -1; |
376 | } | 376 | } |
377 | |||
378 | return 0; | ||
377 | } | 379 | } |
378 | 380 | ||
379 | static struct irq_chip xics_pic_direct = { | 381 | static struct irq_chip xics_pic_direct = { |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 0efc12d1a3d7..352d8c3ef526 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -807,7 +807,7 @@ static void mpic_end_ipi(unsigned int irq) | |||
807 | 807 | ||
808 | #endif /* CONFIG_SMP */ | 808 | #endif /* CONFIG_SMP */ |
809 | 809 | ||
810 | void mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | 810 | int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask) |
811 | { | 811 | { |
812 | struct mpic *mpic = mpic_from_irq(irq); | 812 | struct mpic *mpic = mpic_from_irq(irq); |
813 | unsigned int src = mpic_irq_to_hw(irq); | 813 | unsigned int src = mpic_irq_to_hw(irq); |
@@ -824,6 +824,8 @@ void mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
824 | mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), | 824 | mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), |
825 | mpic_physmask(cpus_addr(tmp)[0])); | 825 | mpic_physmask(cpus_addr(tmp)[0])); |
826 | } | 826 | } |
827 | |||
828 | return 0; | ||
827 | } | 829 | } |
828 | 830 | ||
829 | static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type) | 831 | static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type) |
diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h index 3cef2af10f42..eff433c322a0 100644 --- a/arch/powerpc/sysdev/mpic.h +++ b/arch/powerpc/sysdev/mpic.h | |||
@@ -36,6 +36,6 @@ static inline int mpic_pasemi_msi_init(struct mpic *mpic) | |||
36 | 36 | ||
37 | extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type); | 37 | extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type); |
38 | extern void mpic_set_vector(unsigned int virq, unsigned int vector); | 38 | extern void mpic_set_vector(unsigned int virq, unsigned int vector); |
39 | extern void mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask); | 39 | extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask); |
40 | 40 | ||
41 | #endif /* _POWERPC_SYSDEV_MPIC_H */ | 41 | #endif /* _POWERPC_SYSDEV_MPIC_H */ |
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h index d3b2b4f109e3..5d84df5e27f6 100644 --- a/arch/sh/include/asm/flat.h +++ b/arch/sh/include/asm/flat.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #ifndef __ASM_SH_FLAT_H | 12 | #ifndef __ASM_SH_FLAT_H |
13 | #define __ASM_SH_FLAT_H | 13 | #define __ASM_SH_FLAT_H |
14 | 14 | ||
15 | #define flat_stack_align(sp) /* nothing needed */ | ||
16 | #define flat_argvp_envp_on_stack() 0 | 15 | #define flat_argvp_envp_on_stack() 0 |
17 | #define flat_old_ram_flag(flags) (flags) | 16 | #define flat_old_ram_flag(flags) (flags) |
18 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 17 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) |
diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h index 425c2f9be6d5..d42e393078c4 100644 --- a/arch/sparc/include/asm/elf_64.h +++ b/arch/sparc/include/asm/elf_64.h | |||
@@ -208,8 +208,9 @@ do { unsigned long new_flags = current_thread_info()->flags; \ | |||
208 | else \ | 208 | else \ |
209 | clear_thread_flag(TIF_ABI_PENDING); \ | 209 | clear_thread_flag(TIF_ABI_PENDING); \ |
210 | /* flush_thread will update pgd cache */ \ | 210 | /* flush_thread will update pgd cache */ \ |
211 | if (current->personality != PER_LINUX32) \ | 211 | if (personality(current->personality) != PER_LINUX32) \ |
212 | set_personality(PER_LINUX); \ | 212 | set_personality(PER_LINUX | \ |
213 | (current->personality & (~PER_MASK))); \ | ||
213 | } while (0) | 214 | } while (0) |
214 | 215 | ||
215 | #endif /* !(__ASM_SPARC64_ELF_H) */ | 216 | #endif /* !(__ASM_SPARC64_ELF_H) */ |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 5deabe921a47..e5e78f9cfc95 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
@@ -318,10 +318,12 @@ static void sun4u_irq_enable(unsigned int virt_irq) | |||
318 | } | 318 | } |
319 | } | 319 | } |
320 | 320 | ||
321 | static void sun4u_set_affinity(unsigned int virt_irq, | 321 | static int sun4u_set_affinity(unsigned int virt_irq, |
322 | const struct cpumask *mask) | 322 | const struct cpumask *mask) |
323 | { | 323 | { |
324 | sun4u_irq_enable(virt_irq); | 324 | sun4u_irq_enable(virt_irq); |
325 | |||
326 | return 0; | ||
325 | } | 327 | } |
326 | 328 | ||
327 | /* Don't do anything. The desc->status check for IRQ_DISABLED in | 329 | /* Don't do anything. The desc->status check for IRQ_DISABLED in |
@@ -377,7 +379,7 @@ static void sun4v_irq_enable(unsigned int virt_irq) | |||
377 | ino, err); | 379 | ino, err); |
378 | } | 380 | } |
379 | 381 | ||
380 | static void sun4v_set_affinity(unsigned int virt_irq, | 382 | static int sun4v_set_affinity(unsigned int virt_irq, |
381 | const struct cpumask *mask) | 383 | const struct cpumask *mask) |
382 | { | 384 | { |
383 | unsigned int ino = virt_irq_table[virt_irq].dev_ino; | 385 | unsigned int ino = virt_irq_table[virt_irq].dev_ino; |
@@ -388,6 +390,8 @@ static void sun4v_set_affinity(unsigned int virt_irq, | |||
388 | if (err != HV_EOK) | 390 | if (err != HV_EOK) |
389 | printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): " | 391 | printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): " |
390 | "err(%d)\n", ino, cpuid, err); | 392 | "err(%d)\n", ino, cpuid, err); |
393 | |||
394 | return 0; | ||
391 | } | 395 | } |
392 | 396 | ||
393 | static void sun4v_irq_disable(unsigned int virt_irq) | 397 | static void sun4v_irq_disable(unsigned int virt_irq) |
@@ -445,7 +449,7 @@ static void sun4v_virq_enable(unsigned int virt_irq) | |||
445 | dev_handle, dev_ino, err); | 449 | dev_handle, dev_ino, err); |
446 | } | 450 | } |
447 | 451 | ||
448 | static void sun4v_virt_set_affinity(unsigned int virt_irq, | 452 | static int sun4v_virt_set_affinity(unsigned int virt_irq, |
449 | const struct cpumask *mask) | 453 | const struct cpumask *mask) |
450 | { | 454 | { |
451 | unsigned long cpuid, dev_handle, dev_ino; | 455 | unsigned long cpuid, dev_handle, dev_ino; |
@@ -461,6 +465,8 @@ static void sun4v_virt_set_affinity(unsigned int virt_irq, | |||
461 | printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): " | 465 | printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): " |
462 | "err(%d)\n", | 466 | "err(%d)\n", |
463 | dev_handle, dev_ino, cpuid, err); | 467 | dev_handle, dev_ino, cpuid, err); |
468 | |||
469 | return 0; | ||
464 | } | 470 | } |
465 | 471 | ||
466 | static void sun4v_virq_disable(unsigned int virt_irq) | 472 | static void sun4v_virq_disable(unsigned int virt_irq) |
diff --git a/arch/sparc/lib/csum_copy_from_user.S b/arch/sparc/lib/csum_copy_from_user.S index a22eddbe5dba..e0304e6a2242 100644 --- a/arch/sparc/lib/csum_copy_from_user.S +++ b/arch/sparc/lib/csum_copy_from_user.S | |||
@@ -5,7 +5,7 @@ | |||
5 | 5 | ||
6 | #define EX_LD(x) \ | 6 | #define EX_LD(x) \ |
7 | 98: x; \ | 7 | 98: x; \ |
8 | .section .fixup; \ | 8 | .section .fixup, "ax"; \ |
9 | .align 4; \ | 9 | .align 4; \ |
10 | 99: retl; \ | 10 | 99: retl; \ |
11 | mov -1, %o0; \ | 11 | mov -1, %o0; \ |
diff --git a/arch/sparc/lib/csum_copy_to_user.S b/arch/sparc/lib/csum_copy_to_user.S index d5b12f441f02..afd01acc587c 100644 --- a/arch/sparc/lib/csum_copy_to_user.S +++ b/arch/sparc/lib/csum_copy_to_user.S | |||
@@ -5,7 +5,7 @@ | |||
5 | 5 | ||
6 | #define EX_ST(x) \ | 6 | #define EX_ST(x) \ |
7 | 98: x; \ | 7 | 98: x; \ |
8 | .section .fixup; \ | 8 | .section .fixup,"ax"; \ |
9 | .align 4; \ | 9 | .align 4; \ |
10 | 99: retl; \ | 10 | 99: retl; \ |
11 | mov -1, %o0; \ | 11 | mov -1, %o0; \ |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 8c0fff0860bd..afd1168eeefb 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -274,15 +274,9 @@ config SPARSE_IRQ | |||
274 | 274 | ||
275 | If you don't know what to do here, say N. | 275 | If you don't know what to do here, say N. |
276 | 276 | ||
277 | config NUMA_MIGRATE_IRQ_DESC | 277 | config NUMA_IRQ_DESC |
278 | bool "Move irq desc when changing irq smp_affinity" | 278 | def_bool y |
279 | depends on SPARSE_IRQ && NUMA | 279 | depends on SPARSE_IRQ && NUMA |
280 | depends on BROKEN | ||
281 | default n | ||
282 | ---help--- | ||
283 | This enables moving irq_desc to cpu/node that irq will use handled. | ||
284 | |||
285 | If you don't know what to do here, say N. | ||
286 | 280 | ||
287 | config X86_MPPARSE | 281 | config X86_MPPARSE |
288 | bool "Enable MPS table" if ACPI | 282 | bool "Enable MPS table" if ACPI |
@@ -355,7 +349,7 @@ config X86_UV | |||
355 | depends on X86_64 | 349 | depends on X86_64 |
356 | depends on X86_EXTENDED_PLATFORM | 350 | depends on X86_EXTENDED_PLATFORM |
357 | depends on NUMA | 351 | depends on NUMA |
358 | select X86_X2APIC | 352 | depends on X86_X2APIC |
359 | ---help--- | 353 | ---help--- |
360 | This option is needed in order to support SGI Ultraviolet systems. | 354 | This option is needed in order to support SGI Ultraviolet systems. |
361 | If you don't have one of these, you should say N here. | 355 | If you don't have one of these, you should say N here. |
diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig index 9fe5d212ab4c..27b8ce0f5908 100644 --- a/arch/x86/configs/x86_64_defconfig +++ b/arch/x86/configs/x86_64_defconfig | |||
@@ -195,7 +195,6 @@ CONFIG_HIGH_RES_TIMERS=y | |||
195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
196 | CONFIG_SMP=y | 196 | CONFIG_SMP=y |
197 | CONFIG_SPARSE_IRQ=y | 197 | CONFIG_SPARSE_IRQ=y |
198 | # CONFIG_NUMA_MIGRATE_IRQ_DESC is not set | ||
199 | CONFIG_X86_FIND_SMP_CONFIG=y | 198 | CONFIG_X86_FIND_SMP_CONFIG=y |
200 | CONFIG_X86_MPPARSE=y | 199 | CONFIG_X86_MPPARSE=y |
201 | # CONFIG_X86_ELAN is not set | 200 | # CONFIG_X86_ELAN is not set |
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index 42f2f8377422..3738438a91f5 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -107,8 +107,7 @@ extern u32 native_safe_apic_wait_icr_idle(void); | |||
107 | extern void native_apic_icr_write(u32 low, u32 id); | 107 | extern void native_apic_icr_write(u32 low, u32 id); |
108 | extern u64 native_apic_icr_read(void); | 108 | extern u64 native_apic_icr_read(void); |
109 | 109 | ||
110 | #define EIM_8BIT_APIC_ID 0 | 110 | extern int x2apic_mode; |
111 | #define EIM_32BIT_APIC_ID 1 | ||
112 | 111 | ||
113 | #ifdef CONFIG_X86_X2APIC | 112 | #ifdef CONFIG_X86_X2APIC |
114 | /* | 113 | /* |
@@ -166,10 +165,9 @@ static inline u64 native_x2apic_icr_read(void) | |||
166 | return val; | 165 | return val; |
167 | } | 166 | } |
168 | 167 | ||
169 | extern int x2apic, x2apic_phys; | 168 | extern int x2apic_phys; |
170 | extern void check_x2apic(void); | 169 | extern void check_x2apic(void); |
171 | extern void enable_x2apic(void); | 170 | extern void enable_x2apic(void); |
172 | extern void enable_IR_x2apic(void); | ||
173 | extern void x2apic_icr_write(u32 low, u32 id); | 171 | extern void x2apic_icr_write(u32 low, u32 id); |
174 | static inline int x2apic_enabled(void) | 172 | static inline int x2apic_enabled(void) |
175 | { | 173 | { |
@@ -183,6 +181,8 @@ static inline int x2apic_enabled(void) | |||
183 | return 1; | 181 | return 1; |
184 | return 0; | 182 | return 0; |
185 | } | 183 | } |
184 | |||
185 | #define x2apic_supported() (cpu_has_x2apic) | ||
186 | #else | 186 | #else |
187 | static inline void check_x2apic(void) | 187 | static inline void check_x2apic(void) |
188 | { | 188 | { |
@@ -190,28 +190,20 @@ static inline void check_x2apic(void) | |||
190 | static inline void enable_x2apic(void) | 190 | static inline void enable_x2apic(void) |
191 | { | 191 | { |
192 | } | 192 | } |
193 | static inline void enable_IR_x2apic(void) | ||
194 | { | ||
195 | } | ||
196 | static inline int x2apic_enabled(void) | 193 | static inline int x2apic_enabled(void) |
197 | { | 194 | { |
198 | return 0; | 195 | return 0; |
199 | } | 196 | } |
200 | 197 | ||
201 | #define x2apic 0 | 198 | #define x2apic_preenabled 0 |
202 | 199 | #define x2apic_supported() 0 | |
203 | #endif | 200 | #endif |
204 | 201 | ||
205 | extern int get_physical_broadcast(void); | 202 | extern void enable_IR_x2apic(void); |
206 | 203 | ||
207 | #ifdef CONFIG_X86_X2APIC | 204 | extern int get_physical_broadcast(void); |
208 | static inline void ack_x2APIC_irq(void) | ||
209 | { | ||
210 | /* Docs say use 0 for future compatibility */ | ||
211 | native_apic_msr_write(APIC_EOI, 0); | ||
212 | } | ||
213 | #endif | ||
214 | 205 | ||
206 | extern void apic_disable(void); | ||
215 | extern int lapic_get_maxlvt(void); | 207 | extern int lapic_get_maxlvt(void); |
216 | extern void clear_local_APIC(void); | 208 | extern void clear_local_APIC(void); |
217 | extern void connect_bsp_APIC(void); | 209 | extern void connect_bsp_APIC(void); |
@@ -252,7 +244,7 @@ static inline void lapic_shutdown(void) { } | |||
252 | #define local_apic_timer_c2_ok 1 | 244 | #define local_apic_timer_c2_ok 1 |
253 | static inline void init_apic_mappings(void) { } | 245 | static inline void init_apic_mappings(void) { } |
254 | static inline void disable_local_APIC(void) { } | 246 | static inline void disable_local_APIC(void) { } |
255 | 247 | static inline void apic_disable(void) { } | |
256 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 248 | #endif /* !CONFIG_X86_LOCAL_APIC */ |
257 | 249 | ||
258 | #ifdef CONFIG_X86_64 | 250 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/include/asm/apicdef.h b/arch/x86/include/asm/apicdef.h index bc9514fb3b13..7ddb36ab933b 100644 --- a/arch/x86/include/asm/apicdef.h +++ b/arch/x86/include/asm/apicdef.h | |||
@@ -22,6 +22,7 @@ | |||
22 | # define APIC_INTEGRATED(x) (1) | 22 | # define APIC_INTEGRATED(x) (1) |
23 | #endif | 23 | #endif |
24 | #define APIC_XAPIC(x) ((x) >= 0x14) | 24 | #define APIC_XAPIC(x) ((x) >= 0x14) |
25 | #define APIC_EXT_SPACE(x) ((x) & 0x80000000) | ||
25 | #define APIC_TASKPRI 0x80 | 26 | #define APIC_TASKPRI 0x80 |
26 | #define APIC_TPRI_MASK 0xFFu | 27 | #define APIC_TPRI_MASK 0xFFu |
27 | #define APIC_ARBPRI 0x90 | 28 | #define APIC_ARBPRI 0x90 |
@@ -116,7 +117,9 @@ | |||
116 | #define APIC_TDR_DIV_32 0x8 | 117 | #define APIC_TDR_DIV_32 0x8 |
117 | #define APIC_TDR_DIV_64 0x9 | 118 | #define APIC_TDR_DIV_64 0x9 |
118 | #define APIC_TDR_DIV_128 0xA | 119 | #define APIC_TDR_DIV_128 0xA |
119 | #define APIC_EILVT0 0x500 | 120 | #define APIC_EFEAT 0x400 |
121 | #define APIC_ECTRL 0x410 | ||
122 | #define APIC_EILVTn(n) (0x500 + 0x10 * n) | ||
120 | #define APIC_EILVT_NR_AMD_K8 1 /* # of extended interrupts */ | 123 | #define APIC_EILVT_NR_AMD_K8 1 /* # of extended interrupts */ |
121 | #define APIC_EILVT_NR_AMD_10H 4 | 124 | #define APIC_EILVT_NR_AMD_10H 4 |
122 | #define APIC_EILVT_LVTOFF(x) (((x) >> 4) & 0xF) | 125 | #define APIC_EILVT_LVTOFF(x) (((x) >> 4) & 0xF) |
@@ -125,9 +128,6 @@ | |||
125 | #define APIC_EILVT_MSG_NMI 0x4 | 128 | #define APIC_EILVT_MSG_NMI 0x4 |
126 | #define APIC_EILVT_MSG_EXT 0x7 | 129 | #define APIC_EILVT_MSG_EXT 0x7 |
127 | #define APIC_EILVT_MASKED (1 << 16) | 130 | #define APIC_EILVT_MASKED (1 << 16) |
128 | #define APIC_EILVT1 0x510 | ||
129 | #define APIC_EILVT2 0x520 | ||
130 | #define APIC_EILVT3 0x530 | ||
131 | 131 | ||
132 | #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) | 132 | #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) |
133 | #define APIC_BASE_MSR 0x800 | 133 | #define APIC_BASE_MSR 0x800 |
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index bb83b1c397aa..13cc6a503a02 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -22,7 +22,7 @@ | |||
22 | #define X86_FEATURE_TSC (0*32+ 4) /* Time Stamp Counter */ | 22 | #define X86_FEATURE_TSC (0*32+ 4) /* Time Stamp Counter */ |
23 | #define X86_FEATURE_MSR (0*32+ 5) /* Model-Specific Registers */ | 23 | #define X86_FEATURE_MSR (0*32+ 5) /* Model-Specific Registers */ |
24 | #define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */ | 24 | #define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */ |
25 | #define X86_FEATURE_MCE (0*32+ 7) /* Machine Check Architecture */ | 25 | #define X86_FEATURE_MCE (0*32+ 7) /* Machine Check Exception */ |
26 | #define X86_FEATURE_CX8 (0*32+ 8) /* CMPXCHG8 instruction */ | 26 | #define X86_FEATURE_CX8 (0*32+ 8) /* CMPXCHG8 instruction */ |
27 | #define X86_FEATURE_APIC (0*32+ 9) /* Onboard APIC */ | 27 | #define X86_FEATURE_APIC (0*32+ 9) /* Onboard APIC */ |
28 | #define X86_FEATURE_SEP (0*32+11) /* SYSENTER/SYSEXIT */ | 28 | #define X86_FEATURE_SEP (0*32+11) /* SYSENTER/SYSEXIT */ |
@@ -192,11 +192,11 @@ extern const char * const x86_power_flags[32]; | |||
192 | #define clear_cpu_cap(c, bit) clear_bit(bit, (unsigned long *)((c)->x86_capability)) | 192 | #define clear_cpu_cap(c, bit) clear_bit(bit, (unsigned long *)((c)->x86_capability)) |
193 | #define setup_clear_cpu_cap(bit) do { \ | 193 | #define setup_clear_cpu_cap(bit) do { \ |
194 | clear_cpu_cap(&boot_cpu_data, bit); \ | 194 | clear_cpu_cap(&boot_cpu_data, bit); \ |
195 | set_bit(bit, (unsigned long *)cleared_cpu_caps); \ | 195 | set_bit(bit, (unsigned long *)cpu_caps_cleared); \ |
196 | } while (0) | 196 | } while (0) |
197 | #define setup_force_cpu_cap(bit) do { \ | 197 | #define setup_force_cpu_cap(bit) do { \ |
198 | set_cpu_cap(&boot_cpu_data, bit); \ | 198 | set_cpu_cap(&boot_cpu_data, bit); \ |
199 | clear_bit(bit, (unsigned long *)cleared_cpu_caps); \ | 199 | set_bit(bit, (unsigned long *)cpu_caps_set); \ |
200 | } while (0) | 200 | } while (0) |
201 | 201 | ||
202 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) | 202 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) |
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h index b762ea49bd70..a7d14bbae110 100644 --- a/arch/x86/include/asm/hw_irq.h +++ b/arch/x86/include/asm/hw_irq.h | |||
@@ -63,7 +63,26 @@ extern unsigned long io_apic_irqs; | |||
63 | extern void init_VISWS_APIC_irqs(void); | 63 | extern void init_VISWS_APIC_irqs(void); |
64 | extern void setup_IO_APIC(void); | 64 | extern void setup_IO_APIC(void); |
65 | extern void disable_IO_APIC(void); | 65 | extern void disable_IO_APIC(void); |
66 | extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); | 66 | |
67 | struct io_apic_irq_attr { | ||
68 | int ioapic; | ||
69 | int ioapic_pin; | ||
70 | int trigger; | ||
71 | int polarity; | ||
72 | }; | ||
73 | |||
74 | static inline void set_io_apic_irq_attr(struct io_apic_irq_attr *irq_attr, | ||
75 | int ioapic, int ioapic_pin, | ||
76 | int trigger, int polarity) | ||
77 | { | ||
78 | irq_attr->ioapic = ioapic; | ||
79 | irq_attr->ioapic_pin = ioapic_pin; | ||
80 | irq_attr->trigger = trigger; | ||
81 | irq_attr->polarity = polarity; | ||
82 | } | ||
83 | |||
84 | extern int IO_APIC_get_PCI_irq_vector(int bus, int devfn, int pin, | ||
85 | struct io_apic_irq_attr *irq_attr); | ||
67 | extern void setup_ioapic_dest(void); | 86 | extern void setup_ioapic_dest(void); |
68 | 87 | ||
69 | extern void enable_IO_APIC(void); | 88 | extern void enable_IO_APIC(void); |
diff --git a/arch/x86/include/asm/i8259.h b/arch/x86/include/asm/i8259.h index 1a99e6c092af..58d7091eeb1f 100644 --- a/arch/x86/include/asm/i8259.h +++ b/arch/x86/include/asm/i8259.h | |||
@@ -60,8 +60,4 @@ extern struct irq_chip i8259A_chip; | |||
60 | extern void mask_8259A(void); | 60 | extern void mask_8259A(void); |
61 | extern void unmask_8259A(void); | 61 | extern void unmask_8259A(void); |
62 | 62 | ||
63 | #ifdef CONFIG_X86_32 | ||
64 | extern void init_ISA_irqs(void); | ||
65 | #endif | ||
66 | |||
67 | #endif /* _ASM_X86_I8259_H */ | 63 | #endif /* _ASM_X86_I8259_H */ |
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 9d826e436010..daf866ed0612 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
@@ -154,22 +154,19 @@ extern int timer_through_8259; | |||
154 | extern int io_apic_get_unique_id(int ioapic, int apic_id); | 154 | extern int io_apic_get_unique_id(int ioapic, int apic_id); |
155 | extern int io_apic_get_version(int ioapic); | 155 | extern int io_apic_get_version(int ioapic); |
156 | extern int io_apic_get_redir_entries(int ioapic); | 156 | extern int io_apic_get_redir_entries(int ioapic); |
157 | extern int io_apic_set_pci_routing(int ioapic, int pin, int irq, | ||
158 | int edge_level, int active_high_low); | ||
159 | #endif /* CONFIG_ACPI */ | 157 | #endif /* CONFIG_ACPI */ |
160 | 158 | ||
159 | struct io_apic_irq_attr; | ||
160 | extern int io_apic_set_pci_routing(struct device *dev, int irq, | ||
161 | struct io_apic_irq_attr *irq_attr); | ||
161 | extern int (*ioapic_renumber_irq)(int ioapic, int irq); | 162 | extern int (*ioapic_renumber_irq)(int ioapic, int irq); |
162 | extern void ioapic_init_mappings(void); | 163 | extern void ioapic_init_mappings(void); |
163 | 164 | ||
164 | #ifdef CONFIG_X86_64 | ||
165 | extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); | 165 | extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); |
166 | extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries); | 166 | extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries); |
167 | extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); | 167 | extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); |
168 | extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); | 168 | extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); |
169 | extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); | 169 | extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); |
170 | extern void reinit_intr_remapped_IO_APIC(int intr_remapping, | ||
171 | struct IO_APIC_route_entry **ioapic_entries); | ||
172 | #endif | ||
173 | 170 | ||
174 | extern void probe_nr_irqs_gsi(void); | 171 | extern void probe_nr_irqs_gsi(void); |
175 | 172 | ||
diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h index 0396760fccb8..f275e2244505 100644 --- a/arch/x86/include/asm/irq_remapping.h +++ b/arch/x86/include/asm/irq_remapping.h | |||
@@ -1,6 +1,6 @@ | |||
1 | #ifndef _ASM_X86_IRQ_REMAPPING_H | 1 | #ifndef _ASM_X86_IRQ_REMAPPING_H |
2 | #define _ASM_X86_IRQ_REMAPPING_H | 2 | #define _ASM_X86_IRQ_REMAPPING_H |
3 | 3 | ||
4 | #define IRTE_DEST(dest) ((x2apic) ? dest : dest << 8) | 4 | #define IRTE_DEST(dest) ((x2apic_mode) ? dest : dest << 8) |
5 | 5 | ||
6 | #endif /* _ASM_X86_IRQ_REMAPPING_H */ | 6 | #endif /* _ASM_X86_IRQ_REMAPPING_H */ |
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h index 233006c4e365..8c46b851296a 100644 --- a/arch/x86/include/asm/irq_vectors.h +++ b/arch/x86/include/asm/irq_vectors.h | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #ifdef CONFIG_X86_32 | 35 | #ifdef CONFIG_X86_32 |
36 | # define SYSCALL_VECTOR 0x80 | 36 | # define SYSCALL_VECTOR 0x80 |
37 | # define IA32_SYSCALL_VECTOR 0x80 | ||
37 | #else | 38 | #else |
38 | # define IA32_SYSCALL_VECTOR 0x80 | 39 | # define IA32_SYSCALL_VECTOR 0x80 |
39 | #endif | 40 | #endif |
diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h index 642fc7fc8cdc..e2a1bb6d71ea 100644 --- a/arch/x86/include/asm/mpspec.h +++ b/arch/x86/include/asm/mpspec.h | |||
@@ -61,9 +61,11 @@ extern void get_smp_config(void); | |||
61 | #ifdef CONFIG_X86_MPPARSE | 61 | #ifdef CONFIG_X86_MPPARSE |
62 | extern void find_smp_config(void); | 62 | extern void find_smp_config(void); |
63 | extern void early_reserve_e820_mpc_new(void); | 63 | extern void early_reserve_e820_mpc_new(void); |
64 | extern int enable_update_mptable; | ||
64 | #else | 65 | #else |
65 | static inline void find_smp_config(void) { } | 66 | static inline void find_smp_config(void) { } |
66 | static inline void early_reserve_e820_mpc_new(void) { } | 67 | static inline void early_reserve_e820_mpc_new(void) { } |
68 | #define enable_update_mptable 0 | ||
67 | #endif | 69 | #endif |
68 | 70 | ||
69 | void __cpuinit generic_processor_info(int apicid, int version); | 71 | void __cpuinit generic_processor_info(int apicid, int version); |
@@ -72,20 +74,13 @@ extern void mp_register_ioapic(int id, u32 address, u32 gsi_base); | |||
72 | extern void mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, | 74 | extern void mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, |
73 | u32 gsi); | 75 | u32 gsi); |
74 | extern void mp_config_acpi_legacy_irqs(void); | 76 | extern void mp_config_acpi_legacy_irqs(void); |
75 | extern int mp_register_gsi(u32 gsi, int edge_level, int active_high_low); | 77 | struct device; |
78 | extern int mp_register_gsi(struct device *dev, u32 gsi, int edge_level, | ||
79 | int active_high_low); | ||
76 | extern int acpi_probe_gsi(void); | 80 | extern int acpi_probe_gsi(void); |
77 | #ifdef CONFIG_X86_IO_APIC | 81 | #ifdef CONFIG_X86_IO_APIC |
78 | extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | ||
79 | u32 gsi, int triggering, int polarity); | ||
80 | extern int mp_find_ioapic(int gsi); | 82 | extern int mp_find_ioapic(int gsi); |
81 | extern int mp_find_ioapic_pin(int ioapic, int gsi); | 83 | extern int mp_find_ioapic_pin(int ioapic, int gsi); |
82 | #else | ||
83 | static inline int | ||
84 | mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | ||
85 | u32 gsi, int triggering, int polarity) | ||
86 | { | ||
87 | return 0; | ||
88 | } | ||
89 | #endif | 84 | #endif |
90 | #else /* !CONFIG_ACPI: */ | 85 | #else /* !CONFIG_ACPI: */ |
91 | static inline int acpi_probe_gsi(void) | 86 | static inline int acpi_probe_gsi(void) |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index c2cceae709c8..fed93fec9764 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -135,7 +135,8 @@ extern struct cpuinfo_x86 boot_cpu_data; | |||
135 | extern struct cpuinfo_x86 new_cpu_data; | 135 | extern struct cpuinfo_x86 new_cpu_data; |
136 | 136 | ||
137 | extern struct tss_struct doublefault_tss; | 137 | extern struct tss_struct doublefault_tss; |
138 | extern __u32 cleared_cpu_caps[NCAPINTS]; | 138 | extern __u32 cpu_caps_cleared[NCAPINTS]; |
139 | extern __u32 cpu_caps_set[NCAPINTS]; | ||
139 | 140 | ||
140 | #ifdef CONFIG_SMP | 141 | #ifdef CONFIG_SMP |
141 | DECLARE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); | 142 | DECLARE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); |
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index bdc2ada05ae0..4093d1ed6db2 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
@@ -33,7 +33,6 @@ struct x86_quirks { | |||
33 | int (*setup_ioapic_ids)(void); | 33 | int (*setup_ioapic_ids)(void); |
34 | }; | 34 | }; |
35 | 35 | ||
36 | extern void x86_quirk_pre_intr_init(void); | ||
37 | extern void x86_quirk_intr_init(void); | 36 | extern void x86_quirk_intr_init(void); |
38 | 37 | ||
39 | extern void x86_quirk_trap_init(void); | 38 | extern void x86_quirk_trap_init(void); |
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 19e0d88b966d..6a84ed166aec 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
@@ -180,7 +180,7 @@ extern int safe_smp_processor_id(void); | |||
180 | static inline int logical_smp_processor_id(void) | 180 | static inline int logical_smp_processor_id(void) |
181 | { | 181 | { |
182 | /* we don't want to mark this access volatile - bad code generation */ | 182 | /* we don't want to mark this access volatile - bad code generation */ |
183 | return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); | 183 | return GET_APIC_LOGICAL_ID(apic_read(APIC_LDR)); |
184 | } | 184 | } |
185 | 185 | ||
186 | #endif | 186 | #endif |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 88d1bfc847d3..235f5927bb97 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -28,7 +28,7 @@ CFLAGS_paravirt.o := $(nostackp) | |||
28 | obj-y := process_$(BITS).o signal.o entry_$(BITS).o | 28 | obj-y := process_$(BITS).o signal.o entry_$(BITS).o |
29 | obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o | 29 | obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o |
30 | obj-y += time_$(BITS).o ioport.o ldt.o dumpstack.o | 30 | obj-y += time_$(BITS).o ioport.o ldt.o dumpstack.o |
31 | obj-y += setup.o i8259.o irqinit_$(BITS).o | 31 | obj-y += setup.o i8259.o irqinit.o |
32 | obj-$(CONFIG_X86_VISWS) += visws_quirks.o | 32 | obj-$(CONFIG_X86_VISWS) += visws_quirks.o |
33 | obj-$(CONFIG_X86_32) += probe_roms_32.o | 33 | obj-$(CONFIG_X86_32) += probe_roms_32.o |
34 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o | 34 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 723989d7f802..844e5e25213b 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/irq.h> | 33 | #include <linux/irq.h> |
34 | #include <linux/bootmem.h> | 34 | #include <linux/bootmem.h> |
35 | #include <linux/ioport.h> | 35 | #include <linux/ioport.h> |
36 | #include <linux/pci.h> | ||
36 | 37 | ||
37 | #include <asm/pgtable.h> | 38 | #include <asm/pgtable.h> |
38 | #include <asm/io_apic.h> | 39 | #include <asm/io_apic.h> |
@@ -522,7 +523,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) | |||
522 | * success: return IRQ number (>=0) | 523 | * success: return IRQ number (>=0) |
523 | * failure: return < 0 | 524 | * failure: return < 0 |
524 | */ | 525 | */ |
525 | int acpi_register_gsi(u32 gsi, int triggering, int polarity) | 526 | int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) |
526 | { | 527 | { |
527 | unsigned int irq; | 528 | unsigned int irq; |
528 | unsigned int plat_gsi = gsi; | 529 | unsigned int plat_gsi = gsi; |
@@ -532,14 +533,14 @@ int acpi_register_gsi(u32 gsi, int triggering, int polarity) | |||
532 | * Make sure all (legacy) PCI IRQs are set as level-triggered. | 533 | * Make sure all (legacy) PCI IRQs are set as level-triggered. |
533 | */ | 534 | */ |
534 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { | 535 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { |
535 | if (triggering == ACPI_LEVEL_SENSITIVE) | 536 | if (trigger == ACPI_LEVEL_SENSITIVE) |
536 | eisa_set_level_irq(gsi); | 537 | eisa_set_level_irq(gsi); |
537 | } | 538 | } |
538 | #endif | 539 | #endif |
539 | 540 | ||
540 | #ifdef CONFIG_X86_IO_APIC | 541 | #ifdef CONFIG_X86_IO_APIC |
541 | if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) { | 542 | if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) { |
542 | plat_gsi = mp_register_gsi(gsi, triggering, polarity); | 543 | plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); |
543 | } | 544 | } |
544 | #endif | 545 | #endif |
545 | acpi_gsi_to_irq(plat_gsi, &irq); | 546 | acpi_gsi_to_irq(plat_gsi, &irq); |
@@ -903,10 +904,8 @@ extern int es7000_plat; | |||
903 | #endif | 904 | #endif |
904 | 905 | ||
905 | static struct { | 906 | static struct { |
906 | int apic_id; | ||
907 | int gsi_base; | 907 | int gsi_base; |
908 | int gsi_end; | 908 | int gsi_end; |
909 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); | ||
910 | } mp_ioapic_routing[MAX_IO_APICS]; | 909 | } mp_ioapic_routing[MAX_IO_APICS]; |
911 | 910 | ||
912 | int mp_find_ioapic(int gsi) | 911 | int mp_find_ioapic(int gsi) |
@@ -995,7 +994,6 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
995 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups | 994 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups |
996 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). | 995 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). |
997 | */ | 996 | */ |
998 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].apicid; | ||
999 | mp_ioapic_routing[idx].gsi_base = gsi_base; | 997 | mp_ioapic_routing[idx].gsi_base = gsi_base; |
1000 | mp_ioapic_routing[idx].gsi_end = gsi_base + | 998 | mp_ioapic_routing[idx].gsi_end = gsi_base + |
1001 | io_apic_get_redir_entries(idx); | 999 | io_apic_get_redir_entries(idx); |
@@ -1158,26 +1156,52 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
1158 | } | 1156 | } |
1159 | } | 1157 | } |
1160 | 1158 | ||
1161 | int mp_register_gsi(u32 gsi, int triggering, int polarity) | 1159 | static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger, |
1160 | int polarity) | ||
1162 | { | 1161 | { |
1162 | #ifdef CONFIG_X86_MPPARSE | ||
1163 | struct mpc_intsrc mp_irq; | ||
1164 | struct pci_dev *pdev; | ||
1165 | unsigned char number; | ||
1166 | unsigned int devfn; | ||
1163 | int ioapic; | 1167 | int ioapic; |
1164 | int ioapic_pin; | 1168 | u8 pin; |
1165 | #ifdef CONFIG_X86_32 | ||
1166 | #define MAX_GSI_NUM 4096 | ||
1167 | #define IRQ_COMPRESSION_START 64 | ||
1168 | 1169 | ||
1169 | static int pci_irq = IRQ_COMPRESSION_START; | 1170 | if (!acpi_ioapic) |
1170 | /* | 1171 | return 0; |
1171 | * Mapping between Global System Interrupts, which | 1172 | if (!dev) |
1172 | * represent all possible interrupts, and IRQs | 1173 | return 0; |
1173 | * assigned to actual devices. | 1174 | if (dev->bus != &pci_bus_type) |
1174 | */ | 1175 | return 0; |
1175 | static int gsi_to_irq[MAX_GSI_NUM]; | 1176 | |
1176 | #else | 1177 | pdev = to_pci_dev(dev); |
1178 | number = pdev->bus->number; | ||
1179 | devfn = pdev->devfn; | ||
1180 | pin = pdev->pin; | ||
1181 | /* print the entry should happen on mptable identically */ | ||
1182 | mp_irq.type = MP_INTSRC; | ||
1183 | mp_irq.irqtype = mp_INT; | ||
1184 | mp_irq.irqflag = (trigger == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | | ||
1185 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); | ||
1186 | mp_irq.srcbus = number; | ||
1187 | mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); | ||
1188 | ioapic = mp_find_ioapic(gsi); | ||
1189 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; | ||
1190 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); | ||
1191 | |||
1192 | save_mp_irq(&mp_irq); | ||
1193 | #endif | ||
1194 | return 0; | ||
1195 | } | ||
1196 | |||
1197 | int mp_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | ||
1198 | { | ||
1199 | int ioapic; | ||
1200 | int ioapic_pin; | ||
1201 | struct io_apic_irq_attr irq_attr; | ||
1177 | 1202 | ||
1178 | if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC) | 1203 | if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC) |
1179 | return gsi; | 1204 | return gsi; |
1180 | #endif | ||
1181 | 1205 | ||
1182 | /* Don't set up the ACPI SCI because it's already set up */ | 1206 | /* Don't set up the ACPI SCI because it's already set up */ |
1183 | if (acpi_gbl_FADT.sci_interrupt == gsi) | 1207 | if (acpi_gbl_FADT.sci_interrupt == gsi) |
@@ -1196,93 +1220,22 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity) | |||
1196 | gsi = ioapic_renumber_irq(ioapic, gsi); | 1220 | gsi = ioapic_renumber_irq(ioapic, gsi); |
1197 | #endif | 1221 | #endif |
1198 | 1222 | ||
1199 | /* | ||
1200 | * Avoid pin reprogramming. PRTs typically include entries | ||
1201 | * with redundant pin->gsi mappings (but unique PCI devices); | ||
1202 | * we only program the IOAPIC on the first. | ||
1203 | */ | ||
1204 | if (ioapic_pin > MP_MAX_IOAPIC_PIN) { | 1223 | if (ioapic_pin > MP_MAX_IOAPIC_PIN) { |
1205 | printk(KERN_ERR "Invalid reference to IOAPIC pin " | 1224 | printk(KERN_ERR "Invalid reference to IOAPIC pin " |
1206 | "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, | 1225 | "%d-%d\n", mp_ioapics[ioapic].apicid, |
1207 | ioapic_pin); | 1226 | ioapic_pin); |
1208 | return gsi; | 1227 | return gsi; |
1209 | } | 1228 | } |
1210 | if (test_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) { | ||
1211 | pr_debug("Pin %d-%d already programmed\n", | ||
1212 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); | ||
1213 | #ifdef CONFIG_X86_32 | ||
1214 | return (gsi < IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]); | ||
1215 | #else | ||
1216 | return gsi; | ||
1217 | #endif | ||
1218 | } | ||
1219 | |||
1220 | set_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed); | ||
1221 | #ifdef CONFIG_X86_32 | ||
1222 | /* | ||
1223 | * For GSI >= 64, use IRQ compression | ||
1224 | */ | ||
1225 | if ((gsi >= IRQ_COMPRESSION_START) | ||
1226 | && (triggering == ACPI_LEVEL_SENSITIVE)) { | ||
1227 | /* | ||
1228 | * For PCI devices assign IRQs in order, avoiding gaps | ||
1229 | * due to unused I/O APIC pins. | ||
1230 | */ | ||
1231 | int irq = gsi; | ||
1232 | if (gsi < MAX_GSI_NUM) { | ||
1233 | /* | ||
1234 | * Retain the VIA chipset work-around (gsi > 15), but | ||
1235 | * avoid a problem where the 8254 timer (IRQ0) is setup | ||
1236 | * via an override (so it's not on pin 0 of the ioapic), | ||
1237 | * and at the same time, the pin 0 interrupt is a PCI | ||
1238 | * type. The gsi > 15 test could cause these two pins | ||
1239 | * to be shared as IRQ0, and they are not shareable. | ||
1240 | * So test for this condition, and if necessary, avoid | ||
1241 | * the pin collision. | ||
1242 | */ | ||
1243 | gsi = pci_irq++; | ||
1244 | /* | ||
1245 | * Don't assign IRQ used by ACPI SCI | ||
1246 | */ | ||
1247 | if (gsi == acpi_gbl_FADT.sci_interrupt) | ||
1248 | gsi = pci_irq++; | ||
1249 | gsi_to_irq[irq] = gsi; | ||
1250 | } else { | ||
1251 | printk(KERN_ERR "GSI %u is too high\n", gsi); | ||
1252 | return gsi; | ||
1253 | } | ||
1254 | } | ||
1255 | #endif | ||
1256 | io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, | ||
1257 | triggering == ACPI_EDGE_SENSITIVE ? 0 : 1, | ||
1258 | polarity == ACPI_ACTIVE_HIGH ? 0 : 1); | ||
1259 | return gsi; | ||
1260 | } | ||
1261 | |||
1262 | int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | ||
1263 | u32 gsi, int triggering, int polarity) | ||
1264 | { | ||
1265 | #ifdef CONFIG_X86_MPPARSE | ||
1266 | struct mpc_intsrc mp_irq; | ||
1267 | int ioapic; | ||
1268 | 1229 | ||
1269 | if (!acpi_ioapic) | 1230 | if (enable_update_mptable) |
1270 | return 0; | 1231 | mp_config_acpi_gsi(dev, gsi, trigger, polarity); |
1271 | 1232 | ||
1272 | /* print the entry should happen on mptable identically */ | 1233 | set_io_apic_irq_attr(&irq_attr, ioapic, ioapic_pin, |
1273 | mp_irq.type = MP_INTSRC; | 1234 | trigger == ACPI_EDGE_SENSITIVE ? 0 : 1, |
1274 | mp_irq.irqtype = mp_INT; | 1235 | polarity == ACPI_ACTIVE_HIGH ? 0 : 1); |
1275 | mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | | 1236 | io_apic_set_pci_routing(dev, gsi, &irq_attr); |
1276 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); | ||
1277 | mp_irq.srcbus = number; | ||
1278 | mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); | ||
1279 | ioapic = mp_find_ioapic(gsi); | ||
1280 | mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id; | ||
1281 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); | ||
1282 | 1237 | ||
1283 | save_mp_irq(&mp_irq); | 1238 | return gsi; |
1284 | #endif | ||
1285 | return 0; | ||
1286 | } | 1239 | } |
1287 | 1240 | ||
1288 | /* | 1241 | /* |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index ad532289ef2e..ee75d2a9b9cd 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -98,6 +98,29 @@ early_param("lapic", parse_lapic); | |||
98 | /* Local APIC was disabled by the BIOS and enabled by the kernel */ | 98 | /* Local APIC was disabled by the BIOS and enabled by the kernel */ |
99 | static int enabled_via_apicbase; | 99 | static int enabled_via_apicbase; |
100 | 100 | ||
101 | /* | ||
102 | * Handle interrupt mode configuration register (IMCR). | ||
103 | * This register controls whether the interrupt signals | ||
104 | * that reach the BSP come from the master PIC or from the | ||
105 | * local APIC. Before entering Symmetric I/O Mode, either | ||
106 | * the BIOS or the operating system must switch out of | ||
107 | * PIC Mode by changing the IMCR. | ||
108 | */ | ||
109 | static inline void imcr_pic_to_apic(void) | ||
110 | { | ||
111 | /* select IMCR register */ | ||
112 | outb(0x70, 0x22); | ||
113 | /* NMI and 8259 INTR go through APIC */ | ||
114 | outb(0x01, 0x23); | ||
115 | } | ||
116 | |||
117 | static inline void imcr_apic_to_pic(void) | ||
118 | { | ||
119 | /* select IMCR register */ | ||
120 | outb(0x70, 0x22); | ||
121 | /* NMI and 8259 INTR go directly to BSP */ | ||
122 | outb(0x00, 0x23); | ||
123 | } | ||
101 | #endif | 124 | #endif |
102 | 125 | ||
103 | #ifdef CONFIG_X86_64 | 126 | #ifdef CONFIG_X86_64 |
@@ -111,13 +134,19 @@ static __init int setup_apicpmtimer(char *s) | |||
111 | __setup("apicpmtimer", setup_apicpmtimer); | 134 | __setup("apicpmtimer", setup_apicpmtimer); |
112 | #endif | 135 | #endif |
113 | 136 | ||
137 | int x2apic_mode; | ||
114 | #ifdef CONFIG_X86_X2APIC | 138 | #ifdef CONFIG_X86_X2APIC |
115 | int x2apic; | ||
116 | /* x2apic enabled before OS handover */ | 139 | /* x2apic enabled before OS handover */ |
117 | static int x2apic_preenabled; | 140 | static int x2apic_preenabled; |
118 | static int disable_x2apic; | 141 | static int disable_x2apic; |
119 | static __init int setup_nox2apic(char *str) | 142 | static __init int setup_nox2apic(char *str) |
120 | { | 143 | { |
144 | if (x2apic_enabled()) { | ||
145 | pr_warning("Bios already enabled x2apic, " | ||
146 | "can't enforce nox2apic"); | ||
147 | return 0; | ||
148 | } | ||
149 | |||
121 | disable_x2apic = 1; | 150 | disable_x2apic = 1; |
122 | setup_clear_cpu_cap(X86_FEATURE_X2APIC); | 151 | setup_clear_cpu_cap(X86_FEATURE_X2APIC); |
123 | return 0; | 152 | return 0; |
@@ -209,6 +238,31 @@ static int modern_apic(void) | |||
209 | return lapic_get_version() >= 0x14; | 238 | return lapic_get_version() >= 0x14; |
210 | } | 239 | } |
211 | 240 | ||
241 | /* | ||
242 | * bare function to substitute write operation | ||
243 | * and it's _that_ fast :) | ||
244 | */ | ||
245 | static void native_apic_write_dummy(u32 reg, u32 v) | ||
246 | { | ||
247 | WARN_ON_ONCE((cpu_has_apic || !disable_apic)); | ||
248 | } | ||
249 | |||
250 | static u32 native_apic_read_dummy(u32 reg) | ||
251 | { | ||
252 | WARN_ON_ONCE((cpu_has_apic || !disable_apic)); | ||
253 | return 0; | ||
254 | } | ||
255 | |||
256 | /* | ||
257 | * right after this call apic->write/read doesn't do anything | ||
258 | * note that there is no restore operation it works one way | ||
259 | */ | ||
260 | void apic_disable(void) | ||
261 | { | ||
262 | apic->read = native_apic_read_dummy; | ||
263 | apic->write = native_apic_write_dummy; | ||
264 | } | ||
265 | |||
212 | void native_apic_wait_icr_idle(void) | 266 | void native_apic_wait_icr_idle(void) |
213 | { | 267 | { |
214 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) | 268 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) |
@@ -348,7 +402,7 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen) | |||
348 | 402 | ||
349 | static void setup_APIC_eilvt(u8 lvt_off, u8 vector, u8 msg_type, u8 mask) | 403 | static void setup_APIC_eilvt(u8 lvt_off, u8 vector, u8 msg_type, u8 mask) |
350 | { | 404 | { |
351 | unsigned long reg = (lvt_off << 4) + APIC_EILVT0; | 405 | unsigned long reg = (lvt_off << 4) + APIC_EILVTn(0); |
352 | unsigned int v = (mask << 16) | (msg_type << 8) | vector; | 406 | unsigned int v = (mask << 16) | (msg_type << 8) | vector; |
353 | 407 | ||
354 | apic_write(reg, v); | 408 | apic_write(reg, v); |
@@ -815,7 +869,7 @@ void clear_local_APIC(void) | |||
815 | u32 v; | 869 | u32 v; |
816 | 870 | ||
817 | /* APIC hasn't been mapped yet */ | 871 | /* APIC hasn't been mapped yet */ |
818 | if (!x2apic && !apic_phys) | 872 | if (!x2apic_mode && !apic_phys) |
819 | return; | 873 | return; |
820 | 874 | ||
821 | maxlvt = lapic_get_maxlvt(); | 875 | maxlvt = lapic_get_maxlvt(); |
@@ -1287,7 +1341,7 @@ void check_x2apic(void) | |||
1287 | { | 1341 | { |
1288 | if (x2apic_enabled()) { | 1342 | if (x2apic_enabled()) { |
1289 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); | 1343 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); |
1290 | x2apic_preenabled = x2apic = 1; | 1344 | x2apic_preenabled = x2apic_mode = 1; |
1291 | } | 1345 | } |
1292 | } | 1346 | } |
1293 | 1347 | ||
@@ -1295,7 +1349,7 @@ void enable_x2apic(void) | |||
1295 | { | 1349 | { |
1296 | int msr, msr2; | 1350 | int msr, msr2; |
1297 | 1351 | ||
1298 | if (!x2apic) | 1352 | if (!x2apic_mode) |
1299 | return; | 1353 | return; |
1300 | 1354 | ||
1301 | rdmsr(MSR_IA32_APICBASE, msr, msr2); | 1355 | rdmsr(MSR_IA32_APICBASE, msr, msr2); |
@@ -1304,6 +1358,7 @@ void enable_x2apic(void) | |||
1304 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0); | 1358 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0); |
1305 | } | 1359 | } |
1306 | } | 1360 | } |
1361 | #endif /* CONFIG_X86_X2APIC */ | ||
1307 | 1362 | ||
1308 | void __init enable_IR_x2apic(void) | 1363 | void __init enable_IR_x2apic(void) |
1309 | { | 1364 | { |
@@ -1312,32 +1367,21 @@ void __init enable_IR_x2apic(void) | |||
1312 | unsigned long flags; | 1367 | unsigned long flags; |
1313 | struct IO_APIC_route_entry **ioapic_entries = NULL; | 1368 | struct IO_APIC_route_entry **ioapic_entries = NULL; |
1314 | 1369 | ||
1315 | if (!cpu_has_x2apic) | 1370 | ret = dmar_table_init(); |
1316 | return; | 1371 | if (ret) { |
1317 | 1372 | pr_debug("dmar_table_init() failed with %d:\n", ret); | |
1318 | if (!x2apic_preenabled && disable_x2apic) { | 1373 | goto ir_failed; |
1319 | pr_info("Skipped enabling x2apic and Interrupt-remapping " | ||
1320 | "because of nox2apic\n"); | ||
1321 | return; | ||
1322 | } | 1374 | } |
1323 | 1375 | ||
1324 | if (x2apic_preenabled && disable_x2apic) | 1376 | if (!intr_remapping_supported()) { |
1325 | panic("Bios already enabled x2apic, can't enforce nox2apic"); | 1377 | pr_debug("intr-remapping not supported\n"); |
1326 | 1378 | goto ir_failed; | |
1327 | if (!x2apic_preenabled && skip_ioapic_setup) { | ||
1328 | pr_info("Skipped enabling x2apic and Interrupt-remapping " | ||
1329 | "because of skipping io-apic setup\n"); | ||
1330 | return; | ||
1331 | } | 1379 | } |
1332 | 1380 | ||
1333 | ret = dmar_table_init(); | ||
1334 | if (ret) { | ||
1335 | pr_info("dmar_table_init() failed with %d:\n", ret); | ||
1336 | 1381 | ||
1337 | if (x2apic_preenabled) | 1382 | if (!x2apic_preenabled && skip_ioapic_setup) { |
1338 | panic("x2apic enabled by bios. But IR enabling failed"); | 1383 | pr_info("Skipped enabling intr-remap because of skipping " |
1339 | else | 1384 | "io-apic setup\n"); |
1340 | pr_info("Not enabling x2apic,Intr-remapping\n"); | ||
1341 | return; | 1385 | return; |
1342 | } | 1386 | } |
1343 | 1387 | ||
@@ -1357,19 +1401,16 @@ void __init enable_IR_x2apic(void) | |||
1357 | mask_IO_APIC_setup(ioapic_entries); | 1401 | mask_IO_APIC_setup(ioapic_entries); |
1358 | mask_8259A(); | 1402 | mask_8259A(); |
1359 | 1403 | ||
1360 | ret = enable_intr_remapping(EIM_32BIT_APIC_ID); | 1404 | ret = enable_intr_remapping(x2apic_supported()); |
1361 | |||
1362 | if (ret && x2apic_preenabled) { | ||
1363 | local_irq_restore(flags); | ||
1364 | panic("x2apic enabled by bios. But IR enabling failed"); | ||
1365 | } | ||
1366 | |||
1367 | if (ret) | 1405 | if (ret) |
1368 | goto end_restore; | 1406 | goto end_restore; |
1369 | 1407 | ||
1370 | if (!x2apic) { | 1408 | pr_info("Enabled Interrupt-remapping\n"); |
1371 | x2apic = 1; | 1409 | |
1410 | if (x2apic_supported() && !x2apic_mode) { | ||
1411 | x2apic_mode = 1; | ||
1372 | enable_x2apic(); | 1412 | enable_x2apic(); |
1413 | pr_info("Enabled x2apic\n"); | ||
1373 | } | 1414 | } |
1374 | 1415 | ||
1375 | end_restore: | 1416 | end_restore: |
@@ -1378,37 +1419,34 @@ end_restore: | |||
1378 | * IR enabling failed | 1419 | * IR enabling failed |
1379 | */ | 1420 | */ |
1380 | restore_IO_APIC_setup(ioapic_entries); | 1421 | restore_IO_APIC_setup(ioapic_entries); |
1381 | else | ||
1382 | reinit_intr_remapped_IO_APIC(x2apic_preenabled, ioapic_entries); | ||
1383 | 1422 | ||
1384 | unmask_8259A(); | 1423 | unmask_8259A(); |
1385 | local_irq_restore(flags); | 1424 | local_irq_restore(flags); |
1386 | 1425 | ||
1387 | end: | 1426 | end: |
1388 | if (!ret) { | ||
1389 | if (!x2apic_preenabled) | ||
1390 | pr_info("Enabled x2apic and interrupt-remapping\n"); | ||
1391 | else | ||
1392 | pr_info("Enabled Interrupt-remapping\n"); | ||
1393 | } else | ||
1394 | pr_err("Failed to enable Interrupt-remapping and x2apic\n"); | ||
1395 | if (ioapic_entries) | 1427 | if (ioapic_entries) |
1396 | free_ioapic_entries(ioapic_entries); | 1428 | free_ioapic_entries(ioapic_entries); |
1429 | |||
1430 | if (!ret) | ||
1431 | return; | ||
1432 | |||
1433 | ir_failed: | ||
1434 | if (x2apic_preenabled) | ||
1435 | panic("x2apic enabled by bios. But IR enabling failed"); | ||
1436 | else if (cpu_has_x2apic) | ||
1437 | pr_info("Not enabling x2apic,Intr-remapping\n"); | ||
1397 | #else | 1438 | #else |
1398 | if (!cpu_has_x2apic) | 1439 | if (!cpu_has_x2apic) |
1399 | return; | 1440 | return; |
1400 | 1441 | ||
1401 | if (x2apic_preenabled) | 1442 | if (x2apic_preenabled) |
1402 | panic("x2apic enabled prior OS handover," | 1443 | panic("x2apic enabled prior OS handover," |
1403 | " enable CONFIG_INTR_REMAP"); | 1444 | " enable CONFIG_X86_X2APIC, CONFIG_INTR_REMAP"); |
1404 | |||
1405 | pr_info("Enable CONFIG_INTR_REMAP for enabling intr-remapping " | ||
1406 | " and x2apic\n"); | ||
1407 | #endif | 1445 | #endif |
1408 | 1446 | ||
1409 | return; | 1447 | return; |
1410 | } | 1448 | } |
1411 | #endif /* CONFIG_X86_X2APIC */ | 1449 | |
1412 | 1450 | ||
1413 | #ifdef CONFIG_X86_64 | 1451 | #ifdef CONFIG_X86_64 |
1414 | /* | 1452 | /* |
@@ -1425,7 +1463,6 @@ static int __init detect_init_APIC(void) | |||
1425 | } | 1463 | } |
1426 | 1464 | ||
1427 | mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; | 1465 | mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; |
1428 | boot_cpu_physical_apicid = 0; | ||
1429 | return 0; | 1466 | return 0; |
1430 | } | 1467 | } |
1431 | #else | 1468 | #else |
@@ -1539,32 +1576,42 @@ void __init early_init_lapic_mapping(void) | |||
1539 | */ | 1576 | */ |
1540 | void __init init_apic_mappings(void) | 1577 | void __init init_apic_mappings(void) |
1541 | { | 1578 | { |
1542 | if (x2apic) { | 1579 | unsigned int new_apicid; |
1580 | |||
1581 | if (x2apic_mode) { | ||
1543 | boot_cpu_physical_apicid = read_apic_id(); | 1582 | boot_cpu_physical_apicid = read_apic_id(); |
1544 | return; | 1583 | return; |
1545 | } | 1584 | } |
1546 | 1585 | ||
1547 | /* | 1586 | /* If no local APIC can be found return early */ |
1548 | * If no local APIC can be found then set up a fake all | ||
1549 | * zeroes page to simulate the local APIC and another | ||
1550 | * one for the IO-APIC. | ||
1551 | */ | ||
1552 | if (!smp_found_config && detect_init_APIC()) { | 1587 | if (!smp_found_config && detect_init_APIC()) { |
1553 | apic_phys = (unsigned long) alloc_bootmem_pages(PAGE_SIZE); | 1588 | /* lets NOP'ify apic operations */ |
1554 | apic_phys = __pa(apic_phys); | 1589 | pr_info("APIC: disable apic facility\n"); |
1555 | } else | 1590 | apic_disable(); |
1591 | } else { | ||
1556 | apic_phys = mp_lapic_addr; | 1592 | apic_phys = mp_lapic_addr; |
1557 | 1593 | ||
1558 | set_fixmap_nocache(FIX_APIC_BASE, apic_phys); | 1594 | /* |
1559 | apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n", | 1595 | * acpi lapic path already maps that address in |
1560 | APIC_BASE, apic_phys); | 1596 | * acpi_register_lapic_address() |
1597 | */ | ||
1598 | if (!acpi_lapic) | ||
1599 | set_fixmap_nocache(FIX_APIC_BASE, apic_phys); | ||
1600 | |||
1601 | apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n", | ||
1602 | APIC_BASE, apic_phys); | ||
1603 | } | ||
1561 | 1604 | ||
1562 | /* | 1605 | /* |
1563 | * Fetch the APIC ID of the BSP in case we have a | 1606 | * Fetch the APIC ID of the BSP in case we have a |
1564 | * default configuration (or the MP table is broken). | 1607 | * default configuration (or the MP table is broken). |
1565 | */ | 1608 | */ |
1566 | if (boot_cpu_physical_apicid == -1U) | 1609 | new_apicid = read_apic_id(); |
1567 | boot_cpu_physical_apicid = read_apic_id(); | 1610 | if (boot_cpu_physical_apicid != new_apicid) { |
1611 | boot_cpu_physical_apicid = new_apicid; | ||
1612 | apic_version[new_apicid] = | ||
1613 | GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
1614 | } | ||
1568 | } | 1615 | } |
1569 | 1616 | ||
1570 | /* | 1617 | /* |
@@ -1733,8 +1780,7 @@ void __init connect_bsp_APIC(void) | |||
1733 | */ | 1780 | */ |
1734 | apic_printk(APIC_VERBOSE, "leaving PIC mode, " | 1781 | apic_printk(APIC_VERBOSE, "leaving PIC mode, " |
1735 | "enabling APIC mode.\n"); | 1782 | "enabling APIC mode.\n"); |
1736 | outb(0x70, 0x22); | 1783 | imcr_pic_to_apic(); |
1737 | outb(0x01, 0x23); | ||
1738 | } | 1784 | } |
1739 | #endif | 1785 | #endif |
1740 | if (apic->enable_apic_mode) | 1786 | if (apic->enable_apic_mode) |
@@ -1762,8 +1808,7 @@ void disconnect_bsp_APIC(int virt_wire_setup) | |||
1762 | */ | 1808 | */ |
1763 | apic_printk(APIC_VERBOSE, "disabling APIC mode, " | 1809 | apic_printk(APIC_VERBOSE, "disabling APIC mode, " |
1764 | "entering PIC mode.\n"); | 1810 | "entering PIC mode.\n"); |
1765 | outb(0x70, 0x22); | 1811 | imcr_apic_to_pic(); |
1766 | outb(0x00, 0x23); | ||
1767 | return; | 1812 | return; |
1768 | } | 1813 | } |
1769 | #endif | 1814 | #endif |
@@ -1969,10 +2014,10 @@ static int lapic_suspend(struct sys_device *dev, pm_message_t state) | |||
1969 | 2014 | ||
1970 | local_irq_save(flags); | 2015 | local_irq_save(flags); |
1971 | disable_local_APIC(); | 2016 | disable_local_APIC(); |
1972 | #ifdef CONFIG_INTR_REMAP | 2017 | |
1973 | if (intr_remapping_enabled) | 2018 | if (intr_remapping_enabled) |
1974 | disable_intr_remapping(); | 2019 | disable_intr_remapping(); |
1975 | #endif | 2020 | |
1976 | local_irq_restore(flags); | 2021 | local_irq_restore(flags); |
1977 | return 0; | 2022 | return 0; |
1978 | } | 2023 | } |
@@ -1982,8 +2027,6 @@ static int lapic_resume(struct sys_device *dev) | |||
1982 | unsigned int l, h; | 2027 | unsigned int l, h; |
1983 | unsigned long flags; | 2028 | unsigned long flags; |
1984 | int maxlvt; | 2029 | int maxlvt; |
1985 | |||
1986 | #ifdef CONFIG_INTR_REMAP | ||
1987 | int ret; | 2030 | int ret; |
1988 | struct IO_APIC_route_entry **ioapic_entries = NULL; | 2031 | struct IO_APIC_route_entry **ioapic_entries = NULL; |
1989 | 2032 | ||
@@ -1991,7 +2034,7 @@ static int lapic_resume(struct sys_device *dev) | |||
1991 | return 0; | 2034 | return 0; |
1992 | 2035 | ||
1993 | local_irq_save(flags); | 2036 | local_irq_save(flags); |
1994 | if (x2apic) { | 2037 | if (intr_remapping_enabled) { |
1995 | ioapic_entries = alloc_ioapic_entries(); | 2038 | ioapic_entries = alloc_ioapic_entries(); |
1996 | if (!ioapic_entries) { | 2039 | if (!ioapic_entries) { |
1997 | WARN(1, "Alloc ioapic_entries in lapic resume failed."); | 2040 | WARN(1, "Alloc ioapic_entries in lapic resume failed."); |
@@ -2007,17 +2050,10 @@ static int lapic_resume(struct sys_device *dev) | |||
2007 | 2050 | ||
2008 | mask_IO_APIC_setup(ioapic_entries); | 2051 | mask_IO_APIC_setup(ioapic_entries); |
2009 | mask_8259A(); | 2052 | mask_8259A(); |
2010 | enable_x2apic(); | ||
2011 | } | 2053 | } |
2012 | #else | ||
2013 | if (!apic_pm_state.active) | ||
2014 | return 0; | ||
2015 | 2054 | ||
2016 | local_irq_save(flags); | 2055 | if (x2apic_mode) |
2017 | if (x2apic) | ||
2018 | enable_x2apic(); | 2056 | enable_x2apic(); |
2019 | #endif | ||
2020 | |||
2021 | else { | 2057 | else { |
2022 | /* | 2058 | /* |
2023 | * Make sure the APICBASE points to the right address | 2059 | * Make sure the APICBASE points to the right address |
@@ -2055,20 +2091,15 @@ static int lapic_resume(struct sys_device *dev) | |||
2055 | apic_write(APIC_ESR, 0); | 2091 | apic_write(APIC_ESR, 0); |
2056 | apic_read(APIC_ESR); | 2092 | apic_read(APIC_ESR); |
2057 | 2093 | ||
2058 | #ifdef CONFIG_INTR_REMAP | 2094 | if (intr_remapping_enabled) { |
2059 | if (intr_remapping_enabled) | 2095 | reenable_intr_remapping(x2apic_mode); |
2060 | reenable_intr_remapping(EIM_32BIT_APIC_ID); | ||
2061 | |||
2062 | if (x2apic) { | ||
2063 | unmask_8259A(); | 2096 | unmask_8259A(); |
2064 | restore_IO_APIC_setup(ioapic_entries); | 2097 | restore_IO_APIC_setup(ioapic_entries); |
2065 | free_ioapic_entries(ioapic_entries); | 2098 | free_ioapic_entries(ioapic_entries); |
2066 | } | 2099 | } |
2067 | #endif | ||
2068 | 2100 | ||
2069 | local_irq_restore(flags); | 2101 | local_irq_restore(flags); |
2070 | 2102 | ||
2071 | |||
2072 | return 0; | 2103 | return 0; |
2073 | } | 2104 | } |
2074 | 2105 | ||
@@ -2117,31 +2148,14 @@ static void apic_pm_activate(void) { } | |||
2117 | #endif /* CONFIG_PM */ | 2148 | #endif /* CONFIG_PM */ |
2118 | 2149 | ||
2119 | #ifdef CONFIG_X86_64 | 2150 | #ifdef CONFIG_X86_64 |
2120 | /* | 2151 | |
2121 | * apic_is_clustered_box() -- Check if we can expect good TSC | 2152 | static int __cpuinit apic_cluster_num(void) |
2122 | * | ||
2123 | * Thus far, the major user of this is IBM's Summit2 series: | ||
2124 | * | ||
2125 | * Clustered boxes may have unsynced TSC problems if they are | ||
2126 | * multi-chassis. Use available data to take a good guess. | ||
2127 | * If in doubt, go HPET. | ||
2128 | */ | ||
2129 | __cpuinit int apic_is_clustered_box(void) | ||
2130 | { | 2153 | { |
2131 | int i, clusters, zeros; | 2154 | int i, clusters, zeros; |
2132 | unsigned id; | 2155 | unsigned id; |
2133 | u16 *bios_cpu_apicid; | 2156 | u16 *bios_cpu_apicid; |
2134 | DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS); | 2157 | DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS); |
2135 | 2158 | ||
2136 | /* | ||
2137 | * there is not this kind of box with AMD CPU yet. | ||
2138 | * Some AMD box with quadcore cpu and 8 sockets apicid | ||
2139 | * will be [4, 0x23] or [8, 0x27] could be thought to | ||
2140 | * vsmp box still need checking... | ||
2141 | */ | ||
2142 | if ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && !is_vsmp_box()) | ||
2143 | return 0; | ||
2144 | |||
2145 | bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid); | 2159 | bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid); |
2146 | bitmap_zero(clustermap, NUM_APIC_CLUSTERS); | 2160 | bitmap_zero(clustermap, NUM_APIC_CLUSTERS); |
2147 | 2161 | ||
@@ -2177,18 +2191,67 @@ __cpuinit int apic_is_clustered_box(void) | |||
2177 | ++zeros; | 2191 | ++zeros; |
2178 | } | 2192 | } |
2179 | 2193 | ||
2180 | /* ScaleMP vSMPowered boxes have one cluster per board and TSCs are | 2194 | return clusters; |
2181 | * not guaranteed to be synced between boards | 2195 | } |
2182 | */ | 2196 | |
2183 | if (is_vsmp_box() && clusters > 1) | 2197 | static int __cpuinitdata multi_checked; |
2198 | static int __cpuinitdata multi; | ||
2199 | |||
2200 | static int __cpuinit set_multi(const struct dmi_system_id *d) | ||
2201 | { | ||
2202 | if (multi) | ||
2203 | return 0; | ||
2204 | pr_info("APIC: %s detected, Multi Chassis\n", d->ident); | ||
2205 | multi = 1; | ||
2206 | return 0; | ||
2207 | } | ||
2208 | |||
2209 | static const __cpuinitconst struct dmi_system_id multi_dmi_table[] = { | ||
2210 | { | ||
2211 | .callback = set_multi, | ||
2212 | .ident = "IBM System Summit2", | ||
2213 | .matches = { | ||
2214 | DMI_MATCH(DMI_SYS_VENDOR, "IBM"), | ||
2215 | DMI_MATCH(DMI_PRODUCT_NAME, "Summit2"), | ||
2216 | }, | ||
2217 | }, | ||
2218 | {} | ||
2219 | }; | ||
2220 | |||
2221 | static void __cpuinit dmi_check_multi(void) | ||
2222 | { | ||
2223 | if (multi_checked) | ||
2224 | return; | ||
2225 | |||
2226 | dmi_check_system(multi_dmi_table); | ||
2227 | multi_checked = 1; | ||
2228 | } | ||
2229 | |||
2230 | /* | ||
2231 | * apic_is_clustered_box() -- Check if we can expect good TSC | ||
2232 | * | ||
2233 | * Thus far, the major user of this is IBM's Summit2 series: | ||
2234 | * Clustered boxes may have unsynced TSC problems if they are | ||
2235 | * multi-chassis. | ||
2236 | * Use DMI to check them | ||
2237 | */ | ||
2238 | __cpuinit int apic_is_clustered_box(void) | ||
2239 | { | ||
2240 | dmi_check_multi(); | ||
2241 | if (multi) | ||
2184 | return 1; | 2242 | return 1; |
2185 | 2243 | ||
2244 | if (!is_vsmp_box()) | ||
2245 | return 0; | ||
2246 | |||
2186 | /* | 2247 | /* |
2187 | * If clusters > 2, then should be multi-chassis. | 2248 | * ScaleMP vSMPowered boxes have one cluster per board and TSCs are |
2188 | * May have to revisit this when multi-core + hyperthreaded CPUs come | 2249 | * not guaranteed to be synced between boards |
2189 | * out, but AFAIK this will work even for them. | ||
2190 | */ | 2250 | */ |
2191 | return (clusters > 2); | 2251 | if (apic_cluster_num() > 1) |
2252 | return 1; | ||
2253 | |||
2254 | return 0; | ||
2192 | } | 2255 | } |
2193 | #endif | 2256 | #endif |
2194 | 2257 | ||
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index 306e5e88fb6f..d0c99abc26c3 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c | |||
@@ -161,7 +161,7 @@ static int flat_apic_id_registered(void) | |||
161 | 161 | ||
162 | static int flat_phys_pkg_id(int initial_apic_id, int index_msb) | 162 | static int flat_phys_pkg_id(int initial_apic_id, int index_msb) |
163 | { | 163 | { |
164 | return hard_smp_processor_id() >> index_msb; | 164 | return initial_apic_id >> index_msb; |
165 | } | 165 | } |
166 | 166 | ||
167 | struct apic apic_flat = { | 167 | struct apic apic_flat = { |
@@ -235,7 +235,7 @@ static int physflat_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
235 | * regardless of how many processors are present (x86_64 ES7000 | 235 | * regardless of how many processors are present (x86_64 ES7000 |
236 | * is an example). | 236 | * is an example). |
237 | */ | 237 | */ |
238 | if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID && | 238 | if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID && |
239 | (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) { | 239 | (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) { |
240 | printk(KERN_DEBUG "system APIC only can use physical flat"); | 240 | printk(KERN_DEBUG "system APIC only can use physical flat"); |
241 | return 1; | 241 | return 1; |
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c index 302947775575..69328ac8de9c 100644 --- a/arch/x86/kernel/apic/es7000_32.c +++ b/arch/x86/kernel/apic/es7000_32.c | |||
@@ -145,7 +145,7 @@ es7000_rename_gsi(int ioapic, int gsi) | |||
145 | return gsi; | 145 | return gsi; |
146 | } | 146 | } |
147 | 147 | ||
148 | static int wakeup_secondary_cpu_via_mip(int cpu, unsigned long eip) | 148 | static int __cpuinit wakeup_secondary_cpu_via_mip(int cpu, unsigned long eip) |
149 | { | 149 | { |
150 | unsigned long vect = 0, psaival = 0; | 150 | unsigned long vect = 0, psaival = 0; |
151 | 151 | ||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 30da617d18e4..ac7f3b6ad583 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -129,12 +129,9 @@ struct irq_pin_list { | |||
129 | struct irq_pin_list *next; | 129 | struct irq_pin_list *next; |
130 | }; | 130 | }; |
131 | 131 | ||
132 | static struct irq_pin_list *get_one_free_irq_2_pin(int cpu) | 132 | static struct irq_pin_list *get_one_free_irq_2_pin(int node) |
133 | { | 133 | { |
134 | struct irq_pin_list *pin; | 134 | struct irq_pin_list *pin; |
135 | int node; | ||
136 | |||
137 | node = cpu_to_node(cpu); | ||
138 | 135 | ||
139 | pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node); | 136 | pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node); |
140 | 137 | ||
@@ -148,9 +145,6 @@ struct irq_cfg { | |||
148 | unsigned move_cleanup_count; | 145 | unsigned move_cleanup_count; |
149 | u8 vector; | 146 | u8 vector; |
150 | u8 move_in_progress : 1; | 147 | u8 move_in_progress : 1; |
151 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
152 | u8 move_desc_pending : 1; | ||
153 | #endif | ||
154 | }; | 148 | }; |
155 | 149 | ||
156 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ | 150 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ |
@@ -212,12 +206,9 @@ static struct irq_cfg *irq_cfg(unsigned int irq) | |||
212 | return cfg; | 206 | return cfg; |
213 | } | 207 | } |
214 | 208 | ||
215 | static struct irq_cfg *get_one_free_irq_cfg(int cpu) | 209 | static struct irq_cfg *get_one_free_irq_cfg(int node) |
216 | { | 210 | { |
217 | struct irq_cfg *cfg; | 211 | struct irq_cfg *cfg; |
218 | int node; | ||
219 | |||
220 | node = cpu_to_node(cpu); | ||
221 | 212 | ||
222 | cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node); | 213 | cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node); |
223 | if (cfg) { | 214 | if (cfg) { |
@@ -238,13 +229,13 @@ static struct irq_cfg *get_one_free_irq_cfg(int cpu) | |||
238 | return cfg; | 229 | return cfg; |
239 | } | 230 | } |
240 | 231 | ||
241 | int arch_init_chip_data(struct irq_desc *desc, int cpu) | 232 | int arch_init_chip_data(struct irq_desc *desc, int node) |
242 | { | 233 | { |
243 | struct irq_cfg *cfg; | 234 | struct irq_cfg *cfg; |
244 | 235 | ||
245 | cfg = desc->chip_data; | 236 | cfg = desc->chip_data; |
246 | if (!cfg) { | 237 | if (!cfg) { |
247 | desc->chip_data = get_one_free_irq_cfg(cpu); | 238 | desc->chip_data = get_one_free_irq_cfg(node); |
248 | if (!desc->chip_data) { | 239 | if (!desc->chip_data) { |
249 | printk(KERN_ERR "can not alloc irq_cfg\n"); | 240 | printk(KERN_ERR "can not alloc irq_cfg\n"); |
250 | BUG_ON(1); | 241 | BUG_ON(1); |
@@ -254,10 +245,9 @@ int arch_init_chip_data(struct irq_desc *desc, int cpu) | |||
254 | return 0; | 245 | return 0; |
255 | } | 246 | } |
256 | 247 | ||
257 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | 248 | /* for move_irq_desc */ |
258 | |||
259 | static void | 249 | static void |
260 | init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int cpu) | 250 | init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int node) |
261 | { | 251 | { |
262 | struct irq_pin_list *old_entry, *head, *tail, *entry; | 252 | struct irq_pin_list *old_entry, *head, *tail, *entry; |
263 | 253 | ||
@@ -266,7 +256,7 @@ init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int cpu) | |||
266 | if (!old_entry) | 256 | if (!old_entry) |
267 | return; | 257 | return; |
268 | 258 | ||
269 | entry = get_one_free_irq_2_pin(cpu); | 259 | entry = get_one_free_irq_2_pin(node); |
270 | if (!entry) | 260 | if (!entry) |
271 | return; | 261 | return; |
272 | 262 | ||
@@ -276,7 +266,7 @@ init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int cpu) | |||
276 | tail = entry; | 266 | tail = entry; |
277 | old_entry = old_entry->next; | 267 | old_entry = old_entry->next; |
278 | while (old_entry) { | 268 | while (old_entry) { |
279 | entry = get_one_free_irq_2_pin(cpu); | 269 | entry = get_one_free_irq_2_pin(node); |
280 | if (!entry) { | 270 | if (!entry) { |
281 | entry = head; | 271 | entry = head; |
282 | while (entry) { | 272 | while (entry) { |
@@ -316,12 +306,12 @@ static void free_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg) | |||
316 | } | 306 | } |
317 | 307 | ||
318 | void arch_init_copy_chip_data(struct irq_desc *old_desc, | 308 | void arch_init_copy_chip_data(struct irq_desc *old_desc, |
319 | struct irq_desc *desc, int cpu) | 309 | struct irq_desc *desc, int node) |
320 | { | 310 | { |
321 | struct irq_cfg *cfg; | 311 | struct irq_cfg *cfg; |
322 | struct irq_cfg *old_cfg; | 312 | struct irq_cfg *old_cfg; |
323 | 313 | ||
324 | cfg = get_one_free_irq_cfg(cpu); | 314 | cfg = get_one_free_irq_cfg(node); |
325 | 315 | ||
326 | if (!cfg) | 316 | if (!cfg) |
327 | return; | 317 | return; |
@@ -332,7 +322,7 @@ void arch_init_copy_chip_data(struct irq_desc *old_desc, | |||
332 | 322 | ||
333 | memcpy(cfg, old_cfg, sizeof(struct irq_cfg)); | 323 | memcpy(cfg, old_cfg, sizeof(struct irq_cfg)); |
334 | 324 | ||
335 | init_copy_irq_2_pin(old_cfg, cfg, cpu); | 325 | init_copy_irq_2_pin(old_cfg, cfg, node); |
336 | } | 326 | } |
337 | 327 | ||
338 | static void free_irq_cfg(struct irq_cfg *old_cfg) | 328 | static void free_irq_cfg(struct irq_cfg *old_cfg) |
@@ -356,19 +346,7 @@ void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc) | |||
356 | old_desc->chip_data = NULL; | 346 | old_desc->chip_data = NULL; |
357 | } | 347 | } |
358 | } | 348 | } |
359 | 349 | /* end for move_irq_desc */ | |
360 | static void | ||
361 | set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | ||
362 | { | ||
363 | struct irq_cfg *cfg = desc->chip_data; | ||
364 | |||
365 | if (!cfg->move_in_progress) { | ||
366 | /* it means that domain is not changed */ | ||
367 | if (!cpumask_intersects(desc->affinity, mask)) | ||
368 | cfg->move_desc_pending = 1; | ||
369 | } | ||
370 | } | ||
371 | #endif | ||
372 | 350 | ||
373 | #else | 351 | #else |
374 | static struct irq_cfg *irq_cfg(unsigned int irq) | 352 | static struct irq_cfg *irq_cfg(unsigned int irq) |
@@ -378,13 +356,6 @@ static struct irq_cfg *irq_cfg(unsigned int irq) | |||
378 | 356 | ||
379 | #endif | 357 | #endif |
380 | 358 | ||
381 | #ifndef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
382 | static inline void | ||
383 | set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | ||
384 | { | ||
385 | } | ||
386 | #endif | ||
387 | |||
388 | struct io_apic { | 359 | struct io_apic { |
389 | unsigned int index; | 360 | unsigned int index; |
390 | unsigned int unused[3]; | 361 | unsigned int unused[3]; |
@@ -518,132 +489,18 @@ static void ioapic_mask_entry(int apic, int pin) | |||
518 | spin_unlock_irqrestore(&ioapic_lock, flags); | 489 | spin_unlock_irqrestore(&ioapic_lock, flags); |
519 | } | 490 | } |
520 | 491 | ||
521 | #ifdef CONFIG_SMP | ||
522 | static void send_cleanup_vector(struct irq_cfg *cfg) | ||
523 | { | ||
524 | cpumask_var_t cleanup_mask; | ||
525 | |||
526 | if (unlikely(!alloc_cpumask_var(&cleanup_mask, GFP_ATOMIC))) { | ||
527 | unsigned int i; | ||
528 | cfg->move_cleanup_count = 0; | ||
529 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) | ||
530 | cfg->move_cleanup_count++; | ||
531 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) | ||
532 | apic->send_IPI_mask(cpumask_of(i), IRQ_MOVE_CLEANUP_VECTOR); | ||
533 | } else { | ||
534 | cpumask_and(cleanup_mask, cfg->old_domain, cpu_online_mask); | ||
535 | cfg->move_cleanup_count = cpumask_weight(cleanup_mask); | ||
536 | apic->send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR); | ||
537 | free_cpumask_var(cleanup_mask); | ||
538 | } | ||
539 | cfg->move_in_progress = 0; | ||
540 | } | ||
541 | |||
542 | static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg) | ||
543 | { | ||
544 | int apic, pin; | ||
545 | struct irq_pin_list *entry; | ||
546 | u8 vector = cfg->vector; | ||
547 | |||
548 | entry = cfg->irq_2_pin; | ||
549 | for (;;) { | ||
550 | unsigned int reg; | ||
551 | |||
552 | if (!entry) | ||
553 | break; | ||
554 | |||
555 | apic = entry->apic; | ||
556 | pin = entry->pin; | ||
557 | /* | ||
558 | * With interrupt-remapping, destination information comes | ||
559 | * from interrupt-remapping table entry. | ||
560 | */ | ||
561 | if (!irq_remapped(irq)) | ||
562 | io_apic_write(apic, 0x11 + pin*2, dest); | ||
563 | reg = io_apic_read(apic, 0x10 + pin*2); | ||
564 | reg &= ~IO_APIC_REDIR_VECTOR_MASK; | ||
565 | reg |= vector; | ||
566 | io_apic_modify(apic, 0x10 + pin*2, reg); | ||
567 | if (!entry->next) | ||
568 | break; | ||
569 | entry = entry->next; | ||
570 | } | ||
571 | } | ||
572 | |||
573 | static int | ||
574 | assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask); | ||
575 | |||
576 | /* | ||
577 | * Either sets desc->affinity to a valid value, and returns | ||
578 | * ->cpu_mask_to_apicid of that, or returns BAD_APICID and | ||
579 | * leaves desc->affinity untouched. | ||
580 | */ | ||
581 | static unsigned int | ||
582 | set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | ||
583 | { | ||
584 | struct irq_cfg *cfg; | ||
585 | unsigned int irq; | ||
586 | |||
587 | if (!cpumask_intersects(mask, cpu_online_mask)) | ||
588 | return BAD_APICID; | ||
589 | |||
590 | irq = desc->irq; | ||
591 | cfg = desc->chip_data; | ||
592 | if (assign_irq_vector(irq, cfg, mask)) | ||
593 | return BAD_APICID; | ||
594 | |||
595 | /* check that before desc->addinity get updated */ | ||
596 | set_extra_move_desc(desc, mask); | ||
597 | |||
598 | cpumask_copy(desc->affinity, mask); | ||
599 | |||
600 | return apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain); | ||
601 | } | ||
602 | |||
603 | static void | ||
604 | set_ioapic_affinity_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | ||
605 | { | ||
606 | struct irq_cfg *cfg; | ||
607 | unsigned long flags; | ||
608 | unsigned int dest; | ||
609 | unsigned int irq; | ||
610 | |||
611 | irq = desc->irq; | ||
612 | cfg = desc->chip_data; | ||
613 | |||
614 | spin_lock_irqsave(&ioapic_lock, flags); | ||
615 | dest = set_desc_affinity(desc, mask); | ||
616 | if (dest != BAD_APICID) { | ||
617 | /* Only the high 8 bits are valid. */ | ||
618 | dest = SET_APIC_LOGICAL_ID(dest); | ||
619 | __target_IO_APIC_irq(irq, dest, cfg); | ||
620 | } | ||
621 | spin_unlock_irqrestore(&ioapic_lock, flags); | ||
622 | } | ||
623 | |||
624 | static void | ||
625 | set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask) | ||
626 | { | ||
627 | struct irq_desc *desc; | ||
628 | |||
629 | desc = irq_to_desc(irq); | ||
630 | |||
631 | set_ioapic_affinity_irq_desc(desc, mask); | ||
632 | } | ||
633 | #endif /* CONFIG_SMP */ | ||
634 | |||
635 | /* | 492 | /* |
636 | * The common case is 1:1 IRQ<->pin mappings. Sometimes there are | 493 | * The common case is 1:1 IRQ<->pin mappings. Sometimes there are |
637 | * shared ISA-space IRQs, so we have to support them. We are super | 494 | * shared ISA-space IRQs, so we have to support them. We are super |
638 | * fast in the common case, and fast for shared ISA-space IRQs. | 495 | * fast in the common case, and fast for shared ISA-space IRQs. |
639 | */ | 496 | */ |
640 | static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin) | 497 | static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin) |
641 | { | 498 | { |
642 | struct irq_pin_list *entry; | 499 | struct irq_pin_list *entry; |
643 | 500 | ||
644 | entry = cfg->irq_2_pin; | 501 | entry = cfg->irq_2_pin; |
645 | if (!entry) { | 502 | if (!entry) { |
646 | entry = get_one_free_irq_2_pin(cpu); | 503 | entry = get_one_free_irq_2_pin(node); |
647 | if (!entry) { | 504 | if (!entry) { |
648 | printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n", | 505 | printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n", |
649 | apic, pin); | 506 | apic, pin); |
@@ -663,7 +520,7 @@ static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin) | |||
663 | entry = entry->next; | 520 | entry = entry->next; |
664 | } | 521 | } |
665 | 522 | ||
666 | entry->next = get_one_free_irq_2_pin(cpu); | 523 | entry->next = get_one_free_irq_2_pin(node); |
667 | entry = entry->next; | 524 | entry = entry->next; |
668 | entry->apic = apic; | 525 | entry->apic = apic; |
669 | entry->pin = pin; | 526 | entry->pin = pin; |
@@ -672,7 +529,7 @@ static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin) | |||
672 | /* | 529 | /* |
673 | * Reroute an IRQ to a different pin. | 530 | * Reroute an IRQ to a different pin. |
674 | */ | 531 | */ |
675 | static void __init replace_pin_at_irq_cpu(struct irq_cfg *cfg, int cpu, | 532 | static void __init replace_pin_at_irq_node(struct irq_cfg *cfg, int node, |
676 | int oldapic, int oldpin, | 533 | int oldapic, int oldpin, |
677 | int newapic, int newpin) | 534 | int newapic, int newpin) |
678 | { | 535 | { |
@@ -692,7 +549,7 @@ static void __init replace_pin_at_irq_cpu(struct irq_cfg *cfg, int cpu, | |||
692 | 549 | ||
693 | /* why? call replace before add? */ | 550 | /* why? call replace before add? */ |
694 | if (!replaced) | 551 | if (!replaced) |
695 | add_pin_to_irq_cpu(cfg, cpu, newapic, newpin); | 552 | add_pin_to_irq_node(cfg, node, newapic, newpin); |
696 | } | 553 | } |
697 | 554 | ||
698 | static inline void io_apic_modify_irq(struct irq_cfg *cfg, | 555 | static inline void io_apic_modify_irq(struct irq_cfg *cfg, |
@@ -850,7 +707,6 @@ static int __init ioapic_pirq_setup(char *str) | |||
850 | __setup("pirq=", ioapic_pirq_setup); | 707 | __setup("pirq=", ioapic_pirq_setup); |
851 | #endif /* CONFIG_X86_32 */ | 708 | #endif /* CONFIG_X86_32 */ |
852 | 709 | ||
853 | #ifdef CONFIG_INTR_REMAP | ||
854 | struct IO_APIC_route_entry **alloc_ioapic_entries(void) | 710 | struct IO_APIC_route_entry **alloc_ioapic_entries(void) |
855 | { | 711 | { |
856 | int apic; | 712 | int apic; |
@@ -948,20 +804,6 @@ int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries) | |||
948 | return 0; | 804 | return 0; |
949 | } | 805 | } |
950 | 806 | ||
951 | void reinit_intr_remapped_IO_APIC(int intr_remapping, | ||
952 | struct IO_APIC_route_entry **ioapic_entries) | ||
953 | |||
954 | { | ||
955 | /* | ||
956 | * for now plain restore of previous settings. | ||
957 | * TBD: In the case of OS enabling interrupt-remapping, | ||
958 | * IO-APIC RTE's need to be setup to point to interrupt-remapping | ||
959 | * table entries. for now, do a plain restore, and wait for | ||
960 | * the setup_IO_APIC_irqs() to do proper initialization. | ||
961 | */ | ||
962 | restore_IO_APIC_setup(ioapic_entries); | ||
963 | } | ||
964 | |||
965 | void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries) | 807 | void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries) |
966 | { | 808 | { |
967 | int apic; | 809 | int apic; |
@@ -971,7 +813,6 @@ void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries) | |||
971 | 813 | ||
972 | kfree(ioapic_entries); | 814 | kfree(ioapic_entries); |
973 | } | 815 | } |
974 | #endif | ||
975 | 816 | ||
976 | /* | 817 | /* |
977 | * Find the IRQ entry number of a certain pin. | 818 | * Find the IRQ entry number of a certain pin. |
@@ -1032,54 +873,6 @@ static int __init find_isa_irq_apic(int irq, int type) | |||
1032 | return -1; | 873 | return -1; |
1033 | } | 874 | } |
1034 | 875 | ||
1035 | /* | ||
1036 | * Find a specific PCI IRQ entry. | ||
1037 | * Not an __init, possibly needed by modules | ||
1038 | */ | ||
1039 | static int pin_2_irq(int idx, int apic, int pin); | ||
1040 | |||
1041 | int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) | ||
1042 | { | ||
1043 | int apic, i, best_guess = -1; | ||
1044 | |||
1045 | apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n", | ||
1046 | bus, slot, pin); | ||
1047 | if (test_bit(bus, mp_bus_not_pci)) { | ||
1048 | apic_printk(APIC_VERBOSE, "PCI BIOS passed nonexistent PCI bus %d!\n", bus); | ||
1049 | return -1; | ||
1050 | } | ||
1051 | for (i = 0; i < mp_irq_entries; i++) { | ||
1052 | int lbus = mp_irqs[i].srcbus; | ||
1053 | |||
1054 | for (apic = 0; apic < nr_ioapics; apic++) | ||
1055 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic || | ||
1056 | mp_irqs[i].dstapic == MP_APIC_ALL) | ||
1057 | break; | ||
1058 | |||
1059 | if (!test_bit(lbus, mp_bus_not_pci) && | ||
1060 | !mp_irqs[i].irqtype && | ||
1061 | (bus == lbus) && | ||
1062 | (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) { | ||
1063 | int irq = pin_2_irq(i, apic, mp_irqs[i].dstirq); | ||
1064 | |||
1065 | if (!(apic || IO_APIC_IRQ(irq))) | ||
1066 | continue; | ||
1067 | |||
1068 | if (pin == (mp_irqs[i].srcbusirq & 3)) | ||
1069 | return irq; | ||
1070 | /* | ||
1071 | * Use the first all-but-pin matching entry as a | ||
1072 | * best-guess fuzzy result for broken mptables. | ||
1073 | */ | ||
1074 | if (best_guess < 0) | ||
1075 | best_guess = irq; | ||
1076 | } | ||
1077 | } | ||
1078 | return best_guess; | ||
1079 | } | ||
1080 | |||
1081 | EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector); | ||
1082 | |||
1083 | #if defined(CONFIG_EISA) || defined(CONFIG_MCA) | 876 | #if defined(CONFIG_EISA) || defined(CONFIG_MCA) |
1084 | /* | 877 | /* |
1085 | * EISA Edge/Level control register, ELCR | 878 | * EISA Edge/Level control register, ELCR |
@@ -1298,6 +1091,64 @@ static int pin_2_irq(int idx, int apic, int pin) | |||
1298 | return irq; | 1091 | return irq; |
1299 | } | 1092 | } |
1300 | 1093 | ||
1094 | /* | ||
1095 | * Find a specific PCI IRQ entry. | ||
1096 | * Not an __init, possibly needed by modules | ||
1097 | */ | ||
1098 | int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin, | ||
1099 | struct io_apic_irq_attr *irq_attr) | ||
1100 | { | ||
1101 | int apic, i, best_guess = -1; | ||
1102 | |||
1103 | apic_printk(APIC_DEBUG, | ||
1104 | "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n", | ||
1105 | bus, slot, pin); | ||
1106 | if (test_bit(bus, mp_bus_not_pci)) { | ||
1107 | apic_printk(APIC_VERBOSE, | ||
1108 | "PCI BIOS passed nonexistent PCI bus %d!\n", bus); | ||
1109 | return -1; | ||
1110 | } | ||
1111 | for (i = 0; i < mp_irq_entries; i++) { | ||
1112 | int lbus = mp_irqs[i].srcbus; | ||
1113 | |||
1114 | for (apic = 0; apic < nr_ioapics; apic++) | ||
1115 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic || | ||
1116 | mp_irqs[i].dstapic == MP_APIC_ALL) | ||
1117 | break; | ||
1118 | |||
1119 | if (!test_bit(lbus, mp_bus_not_pci) && | ||
1120 | !mp_irqs[i].irqtype && | ||
1121 | (bus == lbus) && | ||
1122 | (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) { | ||
1123 | int irq = pin_2_irq(i, apic, mp_irqs[i].dstirq); | ||
1124 | |||
1125 | if (!(apic || IO_APIC_IRQ(irq))) | ||
1126 | continue; | ||
1127 | |||
1128 | if (pin == (mp_irqs[i].srcbusirq & 3)) { | ||
1129 | set_io_apic_irq_attr(irq_attr, apic, | ||
1130 | mp_irqs[i].dstirq, | ||
1131 | irq_trigger(i), | ||
1132 | irq_polarity(i)); | ||
1133 | return irq; | ||
1134 | } | ||
1135 | /* | ||
1136 | * Use the first all-but-pin matching entry as a | ||
1137 | * best-guess fuzzy result for broken mptables. | ||
1138 | */ | ||
1139 | if (best_guess < 0) { | ||
1140 | set_io_apic_irq_attr(irq_attr, apic, | ||
1141 | mp_irqs[i].dstirq, | ||
1142 | irq_trigger(i), | ||
1143 | irq_polarity(i)); | ||
1144 | best_guess = irq; | ||
1145 | } | ||
1146 | } | ||
1147 | } | ||
1148 | return best_guess; | ||
1149 | } | ||
1150 | EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector); | ||
1151 | |||
1301 | void lock_vector_lock(void) | 1152 | void lock_vector_lock(void) |
1302 | { | 1153 | { |
1303 | /* Used to the online set of cpus does not change | 1154 | /* Used to the online set of cpus does not change |
@@ -1628,58 +1479,70 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq | |||
1628 | ioapic_write_entry(apic_id, pin, entry); | 1479 | ioapic_write_entry(apic_id, pin, entry); |
1629 | } | 1480 | } |
1630 | 1481 | ||
1482 | static struct { | ||
1483 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); | ||
1484 | } mp_ioapic_routing[MAX_IO_APICS]; | ||
1485 | |||
1631 | static void __init setup_IO_APIC_irqs(void) | 1486 | static void __init setup_IO_APIC_irqs(void) |
1632 | { | 1487 | { |
1633 | int apic_id, pin, idx, irq; | 1488 | int apic_id = 0, pin, idx, irq; |
1634 | int notcon = 0; | 1489 | int notcon = 0; |
1635 | struct irq_desc *desc; | 1490 | struct irq_desc *desc; |
1636 | struct irq_cfg *cfg; | 1491 | struct irq_cfg *cfg; |
1637 | int cpu = boot_cpu_id; | 1492 | int node = cpu_to_node(boot_cpu_id); |
1638 | 1493 | ||
1639 | apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); | 1494 | apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); |
1640 | 1495 | ||
1641 | for (apic_id = 0; apic_id < nr_ioapics; apic_id++) { | 1496 | #ifdef CONFIG_ACPI |
1642 | for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) { | 1497 | if (!acpi_disabled && acpi_ioapic) { |
1643 | 1498 | apic_id = mp_find_ioapic(0); | |
1644 | idx = find_irq_entry(apic_id, pin, mp_INT); | 1499 | if (apic_id < 0) |
1645 | if (idx == -1) { | 1500 | apic_id = 0; |
1646 | if (!notcon) { | 1501 | } |
1647 | notcon = 1; | 1502 | #endif |
1648 | apic_printk(APIC_VERBOSE, | ||
1649 | KERN_DEBUG " %d-%d", | ||
1650 | mp_ioapics[apic_id].apicid, pin); | ||
1651 | } else | ||
1652 | apic_printk(APIC_VERBOSE, " %d-%d", | ||
1653 | mp_ioapics[apic_id].apicid, pin); | ||
1654 | continue; | ||
1655 | } | ||
1656 | if (notcon) { | ||
1657 | apic_printk(APIC_VERBOSE, | ||
1658 | " (apicid-pin) not connected\n"); | ||
1659 | notcon = 0; | ||
1660 | } | ||
1661 | 1503 | ||
1662 | irq = pin_2_irq(idx, apic_id, pin); | 1504 | for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) { |
1505 | idx = find_irq_entry(apic_id, pin, mp_INT); | ||
1506 | if (idx == -1) { | ||
1507 | if (!notcon) { | ||
1508 | notcon = 1; | ||
1509 | apic_printk(APIC_VERBOSE, | ||
1510 | KERN_DEBUG " %d-%d", | ||
1511 | mp_ioapics[apic_id].apicid, pin); | ||
1512 | } else | ||
1513 | apic_printk(APIC_VERBOSE, " %d-%d", | ||
1514 | mp_ioapics[apic_id].apicid, pin); | ||
1515 | continue; | ||
1516 | } | ||
1517 | if (notcon) { | ||
1518 | apic_printk(APIC_VERBOSE, | ||
1519 | " (apicid-pin) not connected\n"); | ||
1520 | notcon = 0; | ||
1521 | } | ||
1663 | 1522 | ||
1664 | /* | 1523 | irq = pin_2_irq(idx, apic_id, pin); |
1665 | * Skip the timer IRQ if there's a quirk handler | ||
1666 | * installed and if it returns 1: | ||
1667 | */ | ||
1668 | if (apic->multi_timer_check && | ||
1669 | apic->multi_timer_check(apic_id, irq)) | ||
1670 | continue; | ||
1671 | 1524 | ||
1672 | desc = irq_to_desc_alloc_cpu(irq, cpu); | 1525 | /* |
1673 | if (!desc) { | 1526 | * Skip the timer IRQ if there's a quirk handler |
1674 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); | 1527 | * installed and if it returns 1: |
1675 | continue; | 1528 | */ |
1676 | } | 1529 | if (apic->multi_timer_check && |
1677 | cfg = desc->chip_data; | 1530 | apic->multi_timer_check(apic_id, irq)) |
1678 | add_pin_to_irq_cpu(cfg, cpu, apic_id, pin); | 1531 | continue; |
1679 | 1532 | ||
1680 | setup_IO_APIC_irq(apic_id, pin, irq, desc, | 1533 | desc = irq_to_desc_alloc_node(irq, node); |
1681 | irq_trigger(idx), irq_polarity(idx)); | 1534 | if (!desc) { |
1535 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); | ||
1536 | continue; | ||
1682 | } | 1537 | } |
1538 | cfg = desc->chip_data; | ||
1539 | add_pin_to_irq_node(cfg, node, apic_id, pin); | ||
1540 | /* | ||
1541 | * don't mark it in pin_programmed, so later acpi could | ||
1542 | * set it correctly when irq < 16 | ||
1543 | */ | ||
1544 | setup_IO_APIC_irq(apic_id, pin, irq, desc, | ||
1545 | irq_trigger(idx), irq_polarity(idx)); | ||
1683 | } | 1546 | } |
1684 | 1547 | ||
1685 | if (notcon) | 1548 | if (notcon) |
@@ -1869,7 +1732,7 @@ __apicdebuginit(void) print_APIC_bitfield(int base) | |||
1869 | 1732 | ||
1870 | __apicdebuginit(void) print_local_APIC(void *dummy) | 1733 | __apicdebuginit(void) print_local_APIC(void *dummy) |
1871 | { | 1734 | { |
1872 | unsigned int v, ver, maxlvt; | 1735 | unsigned int i, v, ver, maxlvt; |
1873 | u64 icr; | 1736 | u64 icr; |
1874 | 1737 | ||
1875 | if (apic_verbosity == APIC_QUIET) | 1738 | if (apic_verbosity == APIC_QUIET) |
@@ -1957,6 +1820,18 @@ __apicdebuginit(void) print_local_APIC(void *dummy) | |||
1957 | printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v); | 1820 | printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v); |
1958 | v = apic_read(APIC_TDCR); | 1821 | v = apic_read(APIC_TDCR); |
1959 | printk(KERN_DEBUG "... APIC TDCR: %08x\n", v); | 1822 | printk(KERN_DEBUG "... APIC TDCR: %08x\n", v); |
1823 | |||
1824 | if (boot_cpu_has(X86_FEATURE_EXTAPIC)) { | ||
1825 | v = apic_read(APIC_EFEAT); | ||
1826 | maxlvt = (v >> 16) & 0xff; | ||
1827 | printk(KERN_DEBUG "... APIC EFEAT: %08x\n", v); | ||
1828 | v = apic_read(APIC_ECTRL); | ||
1829 | printk(KERN_DEBUG "... APIC ECTRL: %08x\n", v); | ||
1830 | for (i = 0; i < maxlvt; i++) { | ||
1831 | v = apic_read(APIC_EILVTn(i)); | ||
1832 | printk(KERN_DEBUG "... APIC EILVT%d: %08x\n", i, v); | ||
1833 | } | ||
1834 | } | ||
1960 | printk("\n"); | 1835 | printk("\n"); |
1961 | } | 1836 | } |
1962 | 1837 | ||
@@ -2005,6 +1880,11 @@ __apicdebuginit(void) print_PIC(void) | |||
2005 | __apicdebuginit(int) print_all_ICs(void) | 1880 | __apicdebuginit(int) print_all_ICs(void) |
2006 | { | 1881 | { |
2007 | print_PIC(); | 1882 | print_PIC(); |
1883 | |||
1884 | /* don't print out if apic is not there */ | ||
1885 | if (!cpu_has_apic || disable_apic) | ||
1886 | return 0; | ||
1887 | |||
2008 | print_all_local_APICs(); | 1888 | print_all_local_APICs(); |
2009 | print_IO_APIC(); | 1889 | print_IO_APIC(); |
2010 | 1890 | ||
@@ -2360,6 +2240,118 @@ static int ioapic_retrigger_irq(unsigned int irq) | |||
2360 | */ | 2240 | */ |
2361 | 2241 | ||
2362 | #ifdef CONFIG_SMP | 2242 | #ifdef CONFIG_SMP |
2243 | static void send_cleanup_vector(struct irq_cfg *cfg) | ||
2244 | { | ||
2245 | cpumask_var_t cleanup_mask; | ||
2246 | |||
2247 | if (unlikely(!alloc_cpumask_var(&cleanup_mask, GFP_ATOMIC))) { | ||
2248 | unsigned int i; | ||
2249 | cfg->move_cleanup_count = 0; | ||
2250 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) | ||
2251 | cfg->move_cleanup_count++; | ||
2252 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) | ||
2253 | apic->send_IPI_mask(cpumask_of(i), IRQ_MOVE_CLEANUP_VECTOR); | ||
2254 | } else { | ||
2255 | cpumask_and(cleanup_mask, cfg->old_domain, cpu_online_mask); | ||
2256 | cfg->move_cleanup_count = cpumask_weight(cleanup_mask); | ||
2257 | apic->send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR); | ||
2258 | free_cpumask_var(cleanup_mask); | ||
2259 | } | ||
2260 | cfg->move_in_progress = 0; | ||
2261 | } | ||
2262 | |||
2263 | static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg) | ||
2264 | { | ||
2265 | int apic, pin; | ||
2266 | struct irq_pin_list *entry; | ||
2267 | u8 vector = cfg->vector; | ||
2268 | |||
2269 | entry = cfg->irq_2_pin; | ||
2270 | for (;;) { | ||
2271 | unsigned int reg; | ||
2272 | |||
2273 | if (!entry) | ||
2274 | break; | ||
2275 | |||
2276 | apic = entry->apic; | ||
2277 | pin = entry->pin; | ||
2278 | /* | ||
2279 | * With interrupt-remapping, destination information comes | ||
2280 | * from interrupt-remapping table entry. | ||
2281 | */ | ||
2282 | if (!irq_remapped(irq)) | ||
2283 | io_apic_write(apic, 0x11 + pin*2, dest); | ||
2284 | reg = io_apic_read(apic, 0x10 + pin*2); | ||
2285 | reg &= ~IO_APIC_REDIR_VECTOR_MASK; | ||
2286 | reg |= vector; | ||
2287 | io_apic_modify(apic, 0x10 + pin*2, reg); | ||
2288 | if (!entry->next) | ||
2289 | break; | ||
2290 | entry = entry->next; | ||
2291 | } | ||
2292 | } | ||
2293 | |||
2294 | static int | ||
2295 | assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask); | ||
2296 | |||
2297 | /* | ||
2298 | * Either sets desc->affinity to a valid value, and returns | ||
2299 | * ->cpu_mask_to_apicid of that, or returns BAD_APICID and | ||
2300 | * leaves desc->affinity untouched. | ||
2301 | */ | ||
2302 | static unsigned int | ||
2303 | set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | ||
2304 | { | ||
2305 | struct irq_cfg *cfg; | ||
2306 | unsigned int irq; | ||
2307 | |||
2308 | if (!cpumask_intersects(mask, cpu_online_mask)) | ||
2309 | return BAD_APICID; | ||
2310 | |||
2311 | irq = desc->irq; | ||
2312 | cfg = desc->chip_data; | ||
2313 | if (assign_irq_vector(irq, cfg, mask)) | ||
2314 | return BAD_APICID; | ||
2315 | |||
2316 | cpumask_copy(desc->affinity, mask); | ||
2317 | |||
2318 | return apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain); | ||
2319 | } | ||
2320 | |||
2321 | static int | ||
2322 | set_ioapic_affinity_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | ||
2323 | { | ||
2324 | struct irq_cfg *cfg; | ||
2325 | unsigned long flags; | ||
2326 | unsigned int dest; | ||
2327 | unsigned int irq; | ||
2328 | int ret = -1; | ||
2329 | |||
2330 | irq = desc->irq; | ||
2331 | cfg = desc->chip_data; | ||
2332 | |||
2333 | spin_lock_irqsave(&ioapic_lock, flags); | ||
2334 | dest = set_desc_affinity(desc, mask); | ||
2335 | if (dest != BAD_APICID) { | ||
2336 | /* Only the high 8 bits are valid. */ | ||
2337 | dest = SET_APIC_LOGICAL_ID(dest); | ||
2338 | __target_IO_APIC_irq(irq, dest, cfg); | ||
2339 | ret = 0; | ||
2340 | } | ||
2341 | spin_unlock_irqrestore(&ioapic_lock, flags); | ||
2342 | |||
2343 | return ret; | ||
2344 | } | ||
2345 | |||
2346 | static int | ||
2347 | set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask) | ||
2348 | { | ||
2349 | struct irq_desc *desc; | ||
2350 | |||
2351 | desc = irq_to_desc(irq); | ||
2352 | |||
2353 | return set_ioapic_affinity_irq_desc(desc, mask); | ||
2354 | } | ||
2363 | 2355 | ||
2364 | #ifdef CONFIG_INTR_REMAP | 2356 | #ifdef CONFIG_INTR_REMAP |
2365 | 2357 | ||
@@ -2374,26 +2366,25 @@ static int ioapic_retrigger_irq(unsigned int irq) | |||
2374 | * Real vector that is used for interrupting cpu will be coming from | 2366 | * Real vector that is used for interrupting cpu will be coming from |
2375 | * the interrupt-remapping table entry. | 2367 | * the interrupt-remapping table entry. |
2376 | */ | 2368 | */ |
2377 | static void | 2369 | static int |
2378 | migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | 2370 | migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) |
2379 | { | 2371 | { |
2380 | struct irq_cfg *cfg; | 2372 | struct irq_cfg *cfg; |
2381 | struct irte irte; | 2373 | struct irte irte; |
2382 | unsigned int dest; | 2374 | unsigned int dest; |
2383 | unsigned int irq; | 2375 | unsigned int irq; |
2376 | int ret = -1; | ||
2384 | 2377 | ||
2385 | if (!cpumask_intersects(mask, cpu_online_mask)) | 2378 | if (!cpumask_intersects(mask, cpu_online_mask)) |
2386 | return; | 2379 | return ret; |
2387 | 2380 | ||
2388 | irq = desc->irq; | 2381 | irq = desc->irq; |
2389 | if (get_irte(irq, &irte)) | 2382 | if (get_irte(irq, &irte)) |
2390 | return; | 2383 | return ret; |
2391 | 2384 | ||
2392 | cfg = desc->chip_data; | 2385 | cfg = desc->chip_data; |
2393 | if (assign_irq_vector(irq, cfg, mask)) | 2386 | if (assign_irq_vector(irq, cfg, mask)) |
2394 | return; | 2387 | return ret; |
2395 | |||
2396 | set_extra_move_desc(desc, mask); | ||
2397 | 2388 | ||
2398 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); | 2389 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); |
2399 | 2390 | ||
@@ -2409,27 +2400,30 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
2409 | send_cleanup_vector(cfg); | 2400 | send_cleanup_vector(cfg); |
2410 | 2401 | ||
2411 | cpumask_copy(desc->affinity, mask); | 2402 | cpumask_copy(desc->affinity, mask); |
2403 | |||
2404 | return 0; | ||
2412 | } | 2405 | } |
2413 | 2406 | ||
2414 | /* | 2407 | /* |
2415 | * Migrates the IRQ destination in the process context. | 2408 | * Migrates the IRQ destination in the process context. |
2416 | */ | 2409 | */ |
2417 | static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | 2410 | static int set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, |
2418 | const struct cpumask *mask) | 2411 | const struct cpumask *mask) |
2419 | { | 2412 | { |
2420 | migrate_ioapic_irq_desc(desc, mask); | 2413 | return migrate_ioapic_irq_desc(desc, mask); |
2421 | } | 2414 | } |
2422 | static void set_ir_ioapic_affinity_irq(unsigned int irq, | 2415 | static int set_ir_ioapic_affinity_irq(unsigned int irq, |
2423 | const struct cpumask *mask) | 2416 | const struct cpumask *mask) |
2424 | { | 2417 | { |
2425 | struct irq_desc *desc = irq_to_desc(irq); | 2418 | struct irq_desc *desc = irq_to_desc(irq); |
2426 | 2419 | ||
2427 | set_ir_ioapic_affinity_irq_desc(desc, mask); | 2420 | return set_ir_ioapic_affinity_irq_desc(desc, mask); |
2428 | } | 2421 | } |
2429 | #else | 2422 | #else |
2430 | static inline void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | 2423 | static inline int set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, |
2431 | const struct cpumask *mask) | 2424 | const struct cpumask *mask) |
2432 | { | 2425 | { |
2426 | return 0; | ||
2433 | } | 2427 | } |
2434 | #endif | 2428 | #endif |
2435 | 2429 | ||
@@ -2491,86 +2485,19 @@ static void irq_complete_move(struct irq_desc **descp) | |||
2491 | struct irq_cfg *cfg = desc->chip_data; | 2485 | struct irq_cfg *cfg = desc->chip_data; |
2492 | unsigned vector, me; | 2486 | unsigned vector, me; |
2493 | 2487 | ||
2494 | if (likely(!cfg->move_in_progress)) { | 2488 | if (likely(!cfg->move_in_progress)) |
2495 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
2496 | if (likely(!cfg->move_desc_pending)) | ||
2497 | return; | ||
2498 | |||
2499 | /* domain has not changed, but affinity did */ | ||
2500 | me = smp_processor_id(); | ||
2501 | if (cpumask_test_cpu(me, desc->affinity)) { | ||
2502 | *descp = desc = move_irq_desc(desc, me); | ||
2503 | /* get the new one */ | ||
2504 | cfg = desc->chip_data; | ||
2505 | cfg->move_desc_pending = 0; | ||
2506 | } | ||
2507 | #endif | ||
2508 | return; | 2489 | return; |
2509 | } | ||
2510 | 2490 | ||
2511 | vector = ~get_irq_regs()->orig_ax; | 2491 | vector = ~get_irq_regs()->orig_ax; |
2512 | me = smp_processor_id(); | 2492 | me = smp_processor_id(); |
2513 | 2493 | ||
2514 | if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) { | 2494 | if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) |
2515 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
2516 | *descp = desc = move_irq_desc(desc, me); | ||
2517 | /* get the new one */ | ||
2518 | cfg = desc->chip_data; | ||
2519 | #endif | ||
2520 | send_cleanup_vector(cfg); | 2495 | send_cleanup_vector(cfg); |
2521 | } | ||
2522 | } | 2496 | } |
2523 | #else | 2497 | #else |
2524 | static inline void irq_complete_move(struct irq_desc **descp) {} | 2498 | static inline void irq_complete_move(struct irq_desc **descp) {} |
2525 | #endif | 2499 | #endif |
2526 | 2500 | ||
2527 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | ||
2528 | { | ||
2529 | int apic, pin; | ||
2530 | struct irq_pin_list *entry; | ||
2531 | |||
2532 | entry = cfg->irq_2_pin; | ||
2533 | for (;;) { | ||
2534 | |||
2535 | if (!entry) | ||
2536 | break; | ||
2537 | |||
2538 | apic = entry->apic; | ||
2539 | pin = entry->pin; | ||
2540 | io_apic_eoi(apic, pin); | ||
2541 | entry = entry->next; | ||
2542 | } | ||
2543 | } | ||
2544 | |||
2545 | static void | ||
2546 | eoi_ioapic_irq(struct irq_desc *desc) | ||
2547 | { | ||
2548 | struct irq_cfg *cfg; | ||
2549 | unsigned long flags; | ||
2550 | unsigned int irq; | ||
2551 | |||
2552 | irq = desc->irq; | ||
2553 | cfg = desc->chip_data; | ||
2554 | |||
2555 | spin_lock_irqsave(&ioapic_lock, flags); | ||
2556 | __eoi_ioapic_irq(irq, cfg); | ||
2557 | spin_unlock_irqrestore(&ioapic_lock, flags); | ||
2558 | } | ||
2559 | |||
2560 | #ifdef CONFIG_X86_X2APIC | ||
2561 | static void ack_x2apic_level(unsigned int irq) | ||
2562 | { | ||
2563 | struct irq_desc *desc = irq_to_desc(irq); | ||
2564 | ack_x2APIC_irq(); | ||
2565 | eoi_ioapic_irq(desc); | ||
2566 | } | ||
2567 | |||
2568 | static void ack_x2apic_edge(unsigned int irq) | ||
2569 | { | ||
2570 | ack_x2APIC_irq(); | ||
2571 | } | ||
2572 | #endif | ||
2573 | |||
2574 | static void ack_apic_edge(unsigned int irq) | 2501 | static void ack_apic_edge(unsigned int irq) |
2575 | { | 2502 | { |
2576 | struct irq_desc *desc = irq_to_desc(irq); | 2503 | struct irq_desc *desc = irq_to_desc(irq); |
@@ -2634,9 +2561,6 @@ static void ack_apic_level(unsigned int irq) | |||
2634 | */ | 2561 | */ |
2635 | ack_APIC_irq(); | 2562 | ack_APIC_irq(); |
2636 | 2563 | ||
2637 | if (irq_remapped(irq)) | ||
2638 | eoi_ioapic_irq(desc); | ||
2639 | |||
2640 | /* Now we can move and renable the irq */ | 2564 | /* Now we can move and renable the irq */ |
2641 | if (unlikely(do_unmask_irq)) { | 2565 | if (unlikely(do_unmask_irq)) { |
2642 | /* Only migrate the irq if the ack has been received. | 2566 | /* Only migrate the irq if the ack has been received. |
@@ -2683,22 +2607,50 @@ static void ack_apic_level(unsigned int irq) | |||
2683 | } | 2607 | } |
2684 | 2608 | ||
2685 | #ifdef CONFIG_INTR_REMAP | 2609 | #ifdef CONFIG_INTR_REMAP |
2610 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | ||
2611 | { | ||
2612 | int apic, pin; | ||
2613 | struct irq_pin_list *entry; | ||
2614 | |||
2615 | entry = cfg->irq_2_pin; | ||
2616 | for (;;) { | ||
2617 | |||
2618 | if (!entry) | ||
2619 | break; | ||
2620 | |||
2621 | apic = entry->apic; | ||
2622 | pin = entry->pin; | ||
2623 | io_apic_eoi(apic, pin); | ||
2624 | entry = entry->next; | ||
2625 | } | ||
2626 | } | ||
2627 | |||
2628 | static void | ||
2629 | eoi_ioapic_irq(struct irq_desc *desc) | ||
2630 | { | ||
2631 | struct irq_cfg *cfg; | ||
2632 | unsigned long flags; | ||
2633 | unsigned int irq; | ||
2634 | |||
2635 | irq = desc->irq; | ||
2636 | cfg = desc->chip_data; | ||
2637 | |||
2638 | spin_lock_irqsave(&ioapic_lock, flags); | ||
2639 | __eoi_ioapic_irq(irq, cfg); | ||
2640 | spin_unlock_irqrestore(&ioapic_lock, flags); | ||
2641 | } | ||
2642 | |||
2686 | static void ir_ack_apic_edge(unsigned int irq) | 2643 | static void ir_ack_apic_edge(unsigned int irq) |
2687 | { | 2644 | { |
2688 | #ifdef CONFIG_X86_X2APIC | 2645 | ack_APIC_irq(); |
2689 | if (x2apic_enabled()) | ||
2690 | return ack_x2apic_edge(irq); | ||
2691 | #endif | ||
2692 | return ack_apic_edge(irq); | ||
2693 | } | 2646 | } |
2694 | 2647 | ||
2695 | static void ir_ack_apic_level(unsigned int irq) | 2648 | static void ir_ack_apic_level(unsigned int irq) |
2696 | { | 2649 | { |
2697 | #ifdef CONFIG_X86_X2APIC | 2650 | struct irq_desc *desc = irq_to_desc(irq); |
2698 | if (x2apic_enabled()) | 2651 | |
2699 | return ack_x2apic_level(irq); | 2652 | ack_APIC_irq(); |
2700 | #endif | 2653 | eoi_ioapic_irq(desc); |
2701 | return ack_apic_level(irq); | ||
2702 | } | 2654 | } |
2703 | #endif /* CONFIG_INTR_REMAP */ | 2655 | #endif /* CONFIG_INTR_REMAP */ |
2704 | 2656 | ||
@@ -2903,7 +2855,7 @@ static inline void __init check_timer(void) | |||
2903 | { | 2855 | { |
2904 | struct irq_desc *desc = irq_to_desc(0); | 2856 | struct irq_desc *desc = irq_to_desc(0); |
2905 | struct irq_cfg *cfg = desc->chip_data; | 2857 | struct irq_cfg *cfg = desc->chip_data; |
2906 | int cpu = boot_cpu_id; | 2858 | int node = cpu_to_node(boot_cpu_id); |
2907 | int apic1, pin1, apic2, pin2; | 2859 | int apic1, pin1, apic2, pin2; |
2908 | unsigned long flags; | 2860 | unsigned long flags; |
2909 | int no_pin1 = 0; | 2861 | int no_pin1 = 0; |
@@ -2969,7 +2921,7 @@ static inline void __init check_timer(void) | |||
2969 | * Ok, does IRQ0 through the IOAPIC work? | 2921 | * Ok, does IRQ0 through the IOAPIC work? |
2970 | */ | 2922 | */ |
2971 | if (no_pin1) { | 2923 | if (no_pin1) { |
2972 | add_pin_to_irq_cpu(cfg, cpu, apic1, pin1); | 2924 | add_pin_to_irq_node(cfg, node, apic1, pin1); |
2973 | setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); | 2925 | setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); |
2974 | } else { | 2926 | } else { |
2975 | /* for edge trigger, setup_IO_APIC_irq already | 2927 | /* for edge trigger, setup_IO_APIC_irq already |
@@ -3006,7 +2958,7 @@ static inline void __init check_timer(void) | |||
3006 | /* | 2958 | /* |
3007 | * legacy devices should be connected to IO APIC #0 | 2959 | * legacy devices should be connected to IO APIC #0 |
3008 | */ | 2960 | */ |
3009 | replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2); | 2961 | replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2); |
3010 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); | 2962 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); |
3011 | enable_8259A_irq(0); | 2963 | enable_8259A_irq(0); |
3012 | if (timer_irq_works()) { | 2964 | if (timer_irq_works()) { |
@@ -3218,14 +3170,13 @@ static int nr_irqs_gsi = NR_IRQS_LEGACY; | |||
3218 | /* | 3170 | /* |
3219 | * Dynamic irq allocate and deallocation | 3171 | * Dynamic irq allocate and deallocation |
3220 | */ | 3172 | */ |
3221 | unsigned int create_irq_nr(unsigned int irq_want) | 3173 | unsigned int create_irq_nr(unsigned int irq_want, int node) |
3222 | { | 3174 | { |
3223 | /* Allocate an unused irq */ | 3175 | /* Allocate an unused irq */ |
3224 | unsigned int irq; | 3176 | unsigned int irq; |
3225 | unsigned int new; | 3177 | unsigned int new; |
3226 | unsigned long flags; | 3178 | unsigned long flags; |
3227 | struct irq_cfg *cfg_new = NULL; | 3179 | struct irq_cfg *cfg_new = NULL; |
3228 | int cpu = boot_cpu_id; | ||
3229 | struct irq_desc *desc_new = NULL; | 3180 | struct irq_desc *desc_new = NULL; |
3230 | 3181 | ||
3231 | irq = 0; | 3182 | irq = 0; |
@@ -3234,7 +3185,7 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
3234 | 3185 | ||
3235 | spin_lock_irqsave(&vector_lock, flags); | 3186 | spin_lock_irqsave(&vector_lock, flags); |
3236 | for (new = irq_want; new < nr_irqs; new++) { | 3187 | for (new = irq_want; new < nr_irqs; new++) { |
3237 | desc_new = irq_to_desc_alloc_cpu(new, cpu); | 3188 | desc_new = irq_to_desc_alloc_node(new, node); |
3238 | if (!desc_new) { | 3189 | if (!desc_new) { |
3239 | printk(KERN_INFO "can not get irq_desc for %d\n", new); | 3190 | printk(KERN_INFO "can not get irq_desc for %d\n", new); |
3240 | continue; | 3191 | continue; |
@@ -3243,6 +3194,9 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
3243 | 3194 | ||
3244 | if (cfg_new->vector != 0) | 3195 | if (cfg_new->vector != 0) |
3245 | continue; | 3196 | continue; |
3197 | |||
3198 | desc_new = move_irq_desc(desc_new, node); | ||
3199 | |||
3246 | if (__assign_irq_vector(new, cfg_new, apic->target_cpus()) == 0) | 3200 | if (__assign_irq_vector(new, cfg_new, apic->target_cpus()) == 0) |
3247 | irq = new; | 3201 | irq = new; |
3248 | break; | 3202 | break; |
@@ -3260,11 +3214,12 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
3260 | 3214 | ||
3261 | int create_irq(void) | 3215 | int create_irq(void) |
3262 | { | 3216 | { |
3217 | int node = cpu_to_node(boot_cpu_id); | ||
3263 | unsigned int irq_want; | 3218 | unsigned int irq_want; |
3264 | int irq; | 3219 | int irq; |
3265 | 3220 | ||
3266 | irq_want = nr_irqs_gsi; | 3221 | irq_want = nr_irqs_gsi; |
3267 | irq = create_irq_nr(irq_want); | 3222 | irq = create_irq_nr(irq_want, node); |
3268 | 3223 | ||
3269 | if (irq == 0) | 3224 | if (irq == 0) |
3270 | irq = -1; | 3225 | irq = -1; |
@@ -3366,7 +3321,7 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
3366 | } | 3321 | } |
3367 | 3322 | ||
3368 | #ifdef CONFIG_SMP | 3323 | #ifdef CONFIG_SMP |
3369 | static void set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | 3324 | static int set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) |
3370 | { | 3325 | { |
3371 | struct irq_desc *desc = irq_to_desc(irq); | 3326 | struct irq_desc *desc = irq_to_desc(irq); |
3372 | struct irq_cfg *cfg; | 3327 | struct irq_cfg *cfg; |
@@ -3375,7 +3330,7 @@ static void set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3375 | 3330 | ||
3376 | dest = set_desc_affinity(desc, mask); | 3331 | dest = set_desc_affinity(desc, mask); |
3377 | if (dest == BAD_APICID) | 3332 | if (dest == BAD_APICID) |
3378 | return; | 3333 | return -1; |
3379 | 3334 | ||
3380 | cfg = desc->chip_data; | 3335 | cfg = desc->chip_data; |
3381 | 3336 | ||
@@ -3387,13 +3342,15 @@ static void set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3387 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); | 3342 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); |
3388 | 3343 | ||
3389 | write_msi_msg_desc(desc, &msg); | 3344 | write_msi_msg_desc(desc, &msg); |
3345 | |||
3346 | return 0; | ||
3390 | } | 3347 | } |
3391 | #ifdef CONFIG_INTR_REMAP | 3348 | #ifdef CONFIG_INTR_REMAP |
3392 | /* | 3349 | /* |
3393 | * Migrate the MSI irq to another cpumask. This migration is | 3350 | * Migrate the MSI irq to another cpumask. This migration is |
3394 | * done in the process context using interrupt-remapping hardware. | 3351 | * done in the process context using interrupt-remapping hardware. |
3395 | */ | 3352 | */ |
3396 | static void | 3353 | static int |
3397 | ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | 3354 | ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) |
3398 | { | 3355 | { |
3399 | struct irq_desc *desc = irq_to_desc(irq); | 3356 | struct irq_desc *desc = irq_to_desc(irq); |
@@ -3402,11 +3359,11 @@ ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3402 | struct irte irte; | 3359 | struct irte irte; |
3403 | 3360 | ||
3404 | if (get_irte(irq, &irte)) | 3361 | if (get_irte(irq, &irte)) |
3405 | return; | 3362 | return -1; |
3406 | 3363 | ||
3407 | dest = set_desc_affinity(desc, mask); | 3364 | dest = set_desc_affinity(desc, mask); |
3408 | if (dest == BAD_APICID) | 3365 | if (dest == BAD_APICID) |
3409 | return; | 3366 | return -1; |
3410 | 3367 | ||
3411 | irte.vector = cfg->vector; | 3368 | irte.vector = cfg->vector; |
3412 | irte.dest_id = IRTE_DEST(dest); | 3369 | irte.dest_id = IRTE_DEST(dest); |
@@ -3423,6 +3380,8 @@ ir_set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3423 | */ | 3380 | */ |
3424 | if (cfg->move_in_progress) | 3381 | if (cfg->move_in_progress) |
3425 | send_cleanup_vector(cfg); | 3382 | send_cleanup_vector(cfg); |
3383 | |||
3384 | return 0; | ||
3426 | } | 3385 | } |
3427 | 3386 | ||
3428 | #endif | 3387 | #endif |
@@ -3518,15 +3477,17 @@ int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
3518 | unsigned int irq_want; | 3477 | unsigned int irq_want; |
3519 | struct intel_iommu *iommu = NULL; | 3478 | struct intel_iommu *iommu = NULL; |
3520 | int index = 0; | 3479 | int index = 0; |
3480 | int node; | ||
3521 | 3481 | ||
3522 | /* x86 doesn't support multiple MSI yet */ | 3482 | /* x86 doesn't support multiple MSI yet */ |
3523 | if (type == PCI_CAP_ID_MSI && nvec > 1) | 3483 | if (type == PCI_CAP_ID_MSI && nvec > 1) |
3524 | return 1; | 3484 | return 1; |
3525 | 3485 | ||
3486 | node = dev_to_node(&dev->dev); | ||
3526 | irq_want = nr_irqs_gsi; | 3487 | irq_want = nr_irqs_gsi; |
3527 | sub_handle = 0; | 3488 | sub_handle = 0; |
3528 | list_for_each_entry(msidesc, &dev->msi_list, list) { | 3489 | list_for_each_entry(msidesc, &dev->msi_list, list) { |
3529 | irq = create_irq_nr(irq_want); | 3490 | irq = create_irq_nr(irq_want, node); |
3530 | if (irq == 0) | 3491 | if (irq == 0) |
3531 | return -1; | 3492 | return -1; |
3532 | irq_want = irq + 1; | 3493 | irq_want = irq + 1; |
@@ -3576,7 +3537,7 @@ void arch_teardown_msi_irq(unsigned int irq) | |||
3576 | 3537 | ||
3577 | #if defined (CONFIG_DMAR) || defined (CONFIG_INTR_REMAP) | 3538 | #if defined (CONFIG_DMAR) || defined (CONFIG_INTR_REMAP) |
3578 | #ifdef CONFIG_SMP | 3539 | #ifdef CONFIG_SMP |
3579 | static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | 3540 | static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) |
3580 | { | 3541 | { |
3581 | struct irq_desc *desc = irq_to_desc(irq); | 3542 | struct irq_desc *desc = irq_to_desc(irq); |
3582 | struct irq_cfg *cfg; | 3543 | struct irq_cfg *cfg; |
@@ -3585,7 +3546,7 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
3585 | 3546 | ||
3586 | dest = set_desc_affinity(desc, mask); | 3547 | dest = set_desc_affinity(desc, mask); |
3587 | if (dest == BAD_APICID) | 3548 | if (dest == BAD_APICID) |
3588 | return; | 3549 | return -1; |
3589 | 3550 | ||
3590 | cfg = desc->chip_data; | 3551 | cfg = desc->chip_data; |
3591 | 3552 | ||
@@ -3597,6 +3558,8 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
3597 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); | 3558 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); |
3598 | 3559 | ||
3599 | dmar_msi_write(irq, &msg); | 3560 | dmar_msi_write(irq, &msg); |
3561 | |||
3562 | return 0; | ||
3600 | } | 3563 | } |
3601 | 3564 | ||
3602 | #endif /* CONFIG_SMP */ | 3565 | #endif /* CONFIG_SMP */ |
@@ -3630,7 +3593,7 @@ int arch_setup_dmar_msi(unsigned int irq) | |||
3630 | #ifdef CONFIG_HPET_TIMER | 3593 | #ifdef CONFIG_HPET_TIMER |
3631 | 3594 | ||
3632 | #ifdef CONFIG_SMP | 3595 | #ifdef CONFIG_SMP |
3633 | static void hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | 3596 | static int hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask) |
3634 | { | 3597 | { |
3635 | struct irq_desc *desc = irq_to_desc(irq); | 3598 | struct irq_desc *desc = irq_to_desc(irq); |
3636 | struct irq_cfg *cfg; | 3599 | struct irq_cfg *cfg; |
@@ -3639,7 +3602,7 @@ static void hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
3639 | 3602 | ||
3640 | dest = set_desc_affinity(desc, mask); | 3603 | dest = set_desc_affinity(desc, mask); |
3641 | if (dest == BAD_APICID) | 3604 | if (dest == BAD_APICID) |
3642 | return; | 3605 | return -1; |
3643 | 3606 | ||
3644 | cfg = desc->chip_data; | 3607 | cfg = desc->chip_data; |
3645 | 3608 | ||
@@ -3651,6 +3614,8 @@ static void hpet_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
3651 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); | 3614 | msg.address_lo |= MSI_ADDR_DEST_ID(dest); |
3652 | 3615 | ||
3653 | hpet_msi_write(irq, &msg); | 3616 | hpet_msi_write(irq, &msg); |
3617 | |||
3618 | return 0; | ||
3654 | } | 3619 | } |
3655 | 3620 | ||
3656 | #endif /* CONFIG_SMP */ | 3621 | #endif /* CONFIG_SMP */ |
@@ -3707,7 +3672,7 @@ static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector) | |||
3707 | write_ht_irq_msg(irq, &msg); | 3672 | write_ht_irq_msg(irq, &msg); |
3708 | } | 3673 | } |
3709 | 3674 | ||
3710 | static void set_ht_irq_affinity(unsigned int irq, const struct cpumask *mask) | 3675 | static int set_ht_irq_affinity(unsigned int irq, const struct cpumask *mask) |
3711 | { | 3676 | { |
3712 | struct irq_desc *desc = irq_to_desc(irq); | 3677 | struct irq_desc *desc = irq_to_desc(irq); |
3713 | struct irq_cfg *cfg; | 3678 | struct irq_cfg *cfg; |
@@ -3715,11 +3680,13 @@ static void set_ht_irq_affinity(unsigned int irq, const struct cpumask *mask) | |||
3715 | 3680 | ||
3716 | dest = set_desc_affinity(desc, mask); | 3681 | dest = set_desc_affinity(desc, mask); |
3717 | if (dest == BAD_APICID) | 3682 | if (dest == BAD_APICID) |
3718 | return; | 3683 | return -1; |
3719 | 3684 | ||
3720 | cfg = desc->chip_data; | 3685 | cfg = desc->chip_data; |
3721 | 3686 | ||
3722 | target_ht_irq(irq, dest, cfg->vector); | 3687 | target_ht_irq(irq, dest, cfg->vector); |
3688 | |||
3689 | return 0; | ||
3723 | } | 3690 | } |
3724 | 3691 | ||
3725 | #endif | 3692 | #endif |
@@ -3794,6 +3761,8 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade, | |||
3794 | unsigned long flags; | 3761 | unsigned long flags; |
3795 | int err; | 3762 | int err; |
3796 | 3763 | ||
3764 | BUILD_BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long)); | ||
3765 | |||
3797 | cfg = irq_cfg(irq); | 3766 | cfg = irq_cfg(irq); |
3798 | 3767 | ||
3799 | err = assign_irq_vector(irq, cfg, eligible_cpu); | 3768 | err = assign_irq_vector(irq, cfg, eligible_cpu); |
@@ -3807,15 +3776,13 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade, | |||
3807 | 3776 | ||
3808 | mmr_value = 0; | 3777 | mmr_value = 0; |
3809 | entry = (struct uv_IO_APIC_route_entry *)&mmr_value; | 3778 | entry = (struct uv_IO_APIC_route_entry *)&mmr_value; |
3810 | BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long)); | 3779 | entry->vector = cfg->vector; |
3811 | 3780 | entry->delivery_mode = apic->irq_delivery_mode; | |
3812 | entry->vector = cfg->vector; | 3781 | entry->dest_mode = apic->irq_dest_mode; |
3813 | entry->delivery_mode = apic->irq_delivery_mode; | 3782 | entry->polarity = 0; |
3814 | entry->dest_mode = apic->irq_dest_mode; | 3783 | entry->trigger = 0; |
3815 | entry->polarity = 0; | 3784 | entry->mask = 0; |
3816 | entry->trigger = 0; | 3785 | entry->dest = apic->cpu_mask_to_apicid(eligible_cpu); |
3817 | entry->mask = 0; | ||
3818 | entry->dest = apic->cpu_mask_to_apicid(eligible_cpu); | ||
3819 | 3786 | ||
3820 | mmr_pnode = uv_blade_to_pnode(mmr_blade); | 3787 | mmr_pnode = uv_blade_to_pnode(mmr_blade); |
3821 | uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value); | 3788 | uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value); |
@@ -3833,10 +3800,10 @@ void arch_disable_uv_irq(int mmr_blade, unsigned long mmr_offset) | |||
3833 | struct uv_IO_APIC_route_entry *entry; | 3800 | struct uv_IO_APIC_route_entry *entry; |
3834 | int mmr_pnode; | 3801 | int mmr_pnode; |
3835 | 3802 | ||
3803 | BUILD_BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long)); | ||
3804 | |||
3836 | mmr_value = 0; | 3805 | mmr_value = 0; |
3837 | entry = (struct uv_IO_APIC_route_entry *)&mmr_value; | 3806 | entry = (struct uv_IO_APIC_route_entry *)&mmr_value; |
3838 | BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long)); | ||
3839 | |||
3840 | entry->mask = 1; | 3807 | entry->mask = 1; |
3841 | 3808 | ||
3842 | mmr_pnode = uv_blade_to_pnode(mmr_blade); | 3809 | mmr_pnode = uv_blade_to_pnode(mmr_blade); |
@@ -3900,6 +3867,71 @@ int __init arch_probe_nr_irqs(void) | |||
3900 | } | 3867 | } |
3901 | #endif | 3868 | #endif |
3902 | 3869 | ||
3870 | static int __io_apic_set_pci_routing(struct device *dev, int irq, | ||
3871 | struct io_apic_irq_attr *irq_attr) | ||
3872 | { | ||
3873 | struct irq_desc *desc; | ||
3874 | struct irq_cfg *cfg; | ||
3875 | int node; | ||
3876 | int ioapic, pin; | ||
3877 | int trigger, polarity; | ||
3878 | |||
3879 | ioapic = irq_attr->ioapic; | ||
3880 | if (!IO_APIC_IRQ(irq)) { | ||
3881 | apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n", | ||
3882 | ioapic); | ||
3883 | return -EINVAL; | ||
3884 | } | ||
3885 | |||
3886 | if (dev) | ||
3887 | node = dev_to_node(dev); | ||
3888 | else | ||
3889 | node = cpu_to_node(boot_cpu_id); | ||
3890 | |||
3891 | desc = irq_to_desc_alloc_node(irq, node); | ||
3892 | if (!desc) { | ||
3893 | printk(KERN_INFO "can not get irq_desc %d\n", irq); | ||
3894 | return 0; | ||
3895 | } | ||
3896 | |||
3897 | pin = irq_attr->ioapic_pin; | ||
3898 | trigger = irq_attr->trigger; | ||
3899 | polarity = irq_attr->polarity; | ||
3900 | |||
3901 | /* | ||
3902 | * IRQs < 16 are already in the irq_2_pin[] map | ||
3903 | */ | ||
3904 | if (irq >= NR_IRQS_LEGACY) { | ||
3905 | cfg = desc->chip_data; | ||
3906 | add_pin_to_irq_node(cfg, node, ioapic, pin); | ||
3907 | } | ||
3908 | |||
3909 | setup_IO_APIC_irq(ioapic, pin, irq, desc, trigger, polarity); | ||
3910 | |||
3911 | return 0; | ||
3912 | } | ||
3913 | |||
3914 | int io_apic_set_pci_routing(struct device *dev, int irq, | ||
3915 | struct io_apic_irq_attr *irq_attr) | ||
3916 | { | ||
3917 | int ioapic, pin; | ||
3918 | /* | ||
3919 | * Avoid pin reprogramming. PRTs typically include entries | ||
3920 | * with redundant pin->gsi mappings (but unique PCI devices); | ||
3921 | * we only program the IOAPIC on the first. | ||
3922 | */ | ||
3923 | ioapic = irq_attr->ioapic; | ||
3924 | pin = irq_attr->ioapic_pin; | ||
3925 | if (test_bit(pin, mp_ioapic_routing[ioapic].pin_programmed)) { | ||
3926 | pr_debug("Pin %d-%d already programmed\n", | ||
3927 | mp_ioapics[ioapic].apicid, pin); | ||
3928 | return 0; | ||
3929 | } | ||
3930 | set_bit(pin, mp_ioapic_routing[ioapic].pin_programmed); | ||
3931 | |||
3932 | return __io_apic_set_pci_routing(dev, irq, irq_attr); | ||
3933 | } | ||
3934 | |||
3903 | /* -------------------------------------------------------------------------- | 3935 | /* -------------------------------------------------------------------------- |
3904 | ACPI-based IOAPIC Configuration | 3936 | ACPI-based IOAPIC Configuration |
3905 | -------------------------------------------------------------------------- */ | 3937 | -------------------------------------------------------------------------- */ |
@@ -3994,38 +4026,6 @@ int __init io_apic_get_version(int ioapic) | |||
3994 | } | 4026 | } |
3995 | #endif | 4027 | #endif |
3996 | 4028 | ||
3997 | int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity) | ||
3998 | { | ||
3999 | struct irq_desc *desc; | ||
4000 | struct irq_cfg *cfg; | ||
4001 | int cpu = boot_cpu_id; | ||
4002 | |||
4003 | if (!IO_APIC_IRQ(irq)) { | ||
4004 | apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n", | ||
4005 | ioapic); | ||
4006 | return -EINVAL; | ||
4007 | } | ||
4008 | |||
4009 | desc = irq_to_desc_alloc_cpu(irq, cpu); | ||
4010 | if (!desc) { | ||
4011 | printk(KERN_INFO "can not get irq_desc %d\n", irq); | ||
4012 | return 0; | ||
4013 | } | ||
4014 | |||
4015 | /* | ||
4016 | * IRQs < 16 are already in the irq_2_pin[] map | ||
4017 | */ | ||
4018 | if (irq >= NR_IRQS_LEGACY) { | ||
4019 | cfg = desc->chip_data; | ||
4020 | add_pin_to_irq_cpu(cfg, cpu, ioapic, pin); | ||
4021 | } | ||
4022 | |||
4023 | setup_IO_APIC_irq(ioapic, pin, irq, desc, triggering, polarity); | ||
4024 | |||
4025 | return 0; | ||
4026 | } | ||
4027 | |||
4028 | |||
4029 | int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | 4029 | int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) |
4030 | { | 4030 | { |
4031 | int i; | 4031 | int i; |
@@ -4055,51 +4055,44 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | |||
4055 | #ifdef CONFIG_SMP | 4055 | #ifdef CONFIG_SMP |
4056 | void __init setup_ioapic_dest(void) | 4056 | void __init setup_ioapic_dest(void) |
4057 | { | 4057 | { |
4058 | int pin, ioapic, irq, irq_entry; | 4058 | int pin, ioapic = 0, irq, irq_entry; |
4059 | struct irq_desc *desc; | 4059 | struct irq_desc *desc; |
4060 | struct irq_cfg *cfg; | ||
4061 | const struct cpumask *mask; | 4060 | const struct cpumask *mask; |
4062 | 4061 | ||
4063 | if (skip_ioapic_setup == 1) | 4062 | if (skip_ioapic_setup == 1) |
4064 | return; | 4063 | return; |
4065 | 4064 | ||
4066 | for (ioapic = 0; ioapic < nr_ioapics; ioapic++) { | 4065 | #ifdef CONFIG_ACPI |
4067 | for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) { | 4066 | if (!acpi_disabled && acpi_ioapic) { |
4068 | irq_entry = find_irq_entry(ioapic, pin, mp_INT); | 4067 | ioapic = mp_find_ioapic(0); |
4069 | if (irq_entry == -1) | 4068 | if (ioapic < 0) |
4070 | continue; | 4069 | ioapic = 0; |
4071 | irq = pin_2_irq(irq_entry, ioapic, pin); | 4070 | } |
4072 | 4071 | #endif | |
4073 | /* setup_IO_APIC_irqs could fail to get vector for some device | ||
4074 | * when you have too many devices, because at that time only boot | ||
4075 | * cpu is online. | ||
4076 | */ | ||
4077 | desc = irq_to_desc(irq); | ||
4078 | cfg = desc->chip_data; | ||
4079 | if (!cfg->vector) { | ||
4080 | setup_IO_APIC_irq(ioapic, pin, irq, desc, | ||
4081 | irq_trigger(irq_entry), | ||
4082 | irq_polarity(irq_entry)); | ||
4083 | continue; | ||
4084 | 4072 | ||
4085 | } | 4073 | for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) { |
4074 | irq_entry = find_irq_entry(ioapic, pin, mp_INT); | ||
4075 | if (irq_entry == -1) | ||
4076 | continue; | ||
4077 | irq = pin_2_irq(irq_entry, ioapic, pin); | ||
4086 | 4078 | ||
4087 | /* | 4079 | desc = irq_to_desc(irq); |
4088 | * Honour affinities which have been set in early boot | ||
4089 | */ | ||
4090 | if (desc->status & | ||
4091 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) | ||
4092 | mask = desc->affinity; | ||
4093 | else | ||
4094 | mask = apic->target_cpus(); | ||
4095 | 4080 | ||
4096 | if (intr_remapping_enabled) | 4081 | /* |
4097 | set_ir_ioapic_affinity_irq_desc(desc, mask); | 4082 | * Honour affinities which have been set in early boot |
4098 | else | 4083 | */ |
4099 | set_ioapic_affinity_irq_desc(desc, mask); | 4084 | if (desc->status & |
4100 | } | 4085 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) |
4086 | mask = desc->affinity; | ||
4087 | else | ||
4088 | mask = apic->target_cpus(); | ||
4101 | 4089 | ||
4090 | if (intr_remapping_enabled) | ||
4091 | set_ir_ioapic_affinity_irq_desc(desc, mask); | ||
4092 | else | ||
4093 | set_ioapic_affinity_irq_desc(desc, mask); | ||
4102 | } | 4094 | } |
4095 | |||
4103 | } | 4096 | } |
4104 | #endif | 4097 | #endif |
4105 | 4098 | ||
diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c index 1783652bb0e5..bc3e880f9b82 100644 --- a/arch/x86/kernel/apic/probe_64.c +++ b/arch/x86/kernel/apic/probe_64.c | |||
@@ -50,7 +50,7 @@ static struct apic *apic_probe[] __initdata = { | |||
50 | void __init default_setup_apic_routing(void) | 50 | void __init default_setup_apic_routing(void) |
51 | { | 51 | { |
52 | #ifdef CONFIG_X86_X2APIC | 52 | #ifdef CONFIG_X86_X2APIC |
53 | if (x2apic && (apic != &apic_x2apic_phys && | 53 | if (x2apic_mode && (apic != &apic_x2apic_phys && |
54 | #ifdef CONFIG_X86_UV | 54 | #ifdef CONFIG_X86_UV |
55 | apic != &apic_x2apic_uv_x && | 55 | apic != &apic_x2apic_uv_x && |
56 | #endif | 56 | #endif |
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c index 9cfe1f415d81..344eee4ac0a4 100644 --- a/arch/x86/kernel/apic/summit_32.c +++ b/arch/x86/kernel/apic/summit_32.c | |||
@@ -173,13 +173,6 @@ static inline int is_WPEG(struct rio_detail *rio){ | |||
173 | rio->type == LookOutAWPEG || rio->type == LookOutBWPEG); | 173 | rio->type == LookOutAWPEG || rio->type == LookOutBWPEG); |
174 | } | 174 | } |
175 | 175 | ||
176 | |||
177 | /* In clustered mode, the high nibble of APIC ID is a cluster number. | ||
178 | * The low nibble is a 4-bit bitmap. */ | ||
179 | #define XAPIC_DEST_CPUS_SHIFT 4 | ||
180 | #define XAPIC_DEST_CPUS_MASK ((1u << XAPIC_DEST_CPUS_SHIFT) - 1) | ||
181 | #define XAPIC_DEST_CLUSTER_MASK (XAPIC_DEST_CPUS_MASK << XAPIC_DEST_CPUS_SHIFT) | ||
182 | |||
183 | #define SUMMIT_APIC_DFR_VALUE (APIC_DFR_CLUSTER) | 176 | #define SUMMIT_APIC_DFR_VALUE (APIC_DFR_CLUSTER) |
184 | 177 | ||
185 | static const struct cpumask *summit_target_cpus(void) | 178 | static const struct cpumask *summit_target_cpus(void) |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 2bda69352976..780a733a5e7a 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -105,7 +105,7 @@ static void uv_vector_allocation_domain(int cpu, struct cpumask *retmask) | |||
105 | cpumask_set_cpu(cpu, retmask); | 105 | cpumask_set_cpu(cpu, retmask); |
106 | } | 106 | } |
107 | 107 | ||
108 | static int uv_wakeup_secondary(int phys_apicid, unsigned long start_rip) | 108 | static int __cpuinit uv_wakeup_secondary(int phys_apicid, unsigned long start_rip) |
109 | { | 109 | { |
110 | #ifdef CONFIG_SMP | 110 | #ifdef CONFIG_SMP |
111 | unsigned long val; | 111 | unsigned long val; |
@@ -583,15 +583,18 @@ void __init uv_system_init(void) | |||
583 | 583 | ||
584 | bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades(); | 584 | bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades(); |
585 | uv_blade_info = kmalloc(bytes, GFP_KERNEL); | 585 | uv_blade_info = kmalloc(bytes, GFP_KERNEL); |
586 | BUG_ON(!uv_blade_info); | ||
586 | 587 | ||
587 | get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); | 588 | get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); |
588 | 589 | ||
589 | bytes = sizeof(uv_node_to_blade[0]) * num_possible_nodes(); | 590 | bytes = sizeof(uv_node_to_blade[0]) * num_possible_nodes(); |
590 | uv_node_to_blade = kmalloc(bytes, GFP_KERNEL); | 591 | uv_node_to_blade = kmalloc(bytes, GFP_KERNEL); |
592 | BUG_ON(!uv_node_to_blade); | ||
591 | memset(uv_node_to_blade, 255, bytes); | 593 | memset(uv_node_to_blade, 255, bytes); |
592 | 594 | ||
593 | bytes = sizeof(uv_cpu_to_blade[0]) * num_possible_cpus(); | 595 | bytes = sizeof(uv_cpu_to_blade[0]) * num_possible_cpus(); |
594 | uv_cpu_to_blade = kmalloc(bytes, GFP_KERNEL); | 596 | uv_cpu_to_blade = kmalloc(bytes, GFP_KERNEL); |
597 | BUG_ON(!uv_cpu_to_blade); | ||
595 | memset(uv_cpu_to_blade, 255, bytes); | 598 | memset(uv_cpu_to_blade, 255, bytes); |
596 | 599 | ||
597 | blade = 0; | 600 | blade = 0; |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 7e4a459daa64..728b3750a3e8 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -272,7 +272,7 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c) | |||
272 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) | 272 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) |
273 | int cpu = smp_processor_id(); | 273 | int cpu = smp_processor_id(); |
274 | int node; | 274 | int node; |
275 | unsigned apicid = hard_smp_processor_id(); | 275 | unsigned apicid = cpu_has_apic ? hard_smp_processor_id() : c->apicid; |
276 | 276 | ||
277 | node = c->phys_proc_id; | 277 | node = c->phys_proc_id; |
278 | if (apicid_to_node[apicid] != NUMA_NO_NODE) | 278 | if (apicid_to_node[apicid] != NUMA_NO_NODE) |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 77848d9fca68..b0517aa2bd3b 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -299,7 +299,8 @@ static const char *__cpuinit table_lookup_model(struct cpuinfo_x86 *c) | |||
299 | return NULL; /* Not found */ | 299 | return NULL; /* Not found */ |
300 | } | 300 | } |
301 | 301 | ||
302 | __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata; | 302 | __u32 cpu_caps_cleared[NCAPINTS] __cpuinitdata; |
303 | __u32 cpu_caps_set[NCAPINTS] __cpuinitdata; | ||
303 | 304 | ||
304 | void load_percpu_segment(int cpu) | 305 | void load_percpu_segment(int cpu) |
305 | { | 306 | { |
@@ -768,6 +769,12 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
768 | if (this_cpu->c_identify) | 769 | if (this_cpu->c_identify) |
769 | this_cpu->c_identify(c); | 770 | this_cpu->c_identify(c); |
770 | 771 | ||
772 | /* Clear/Set all flags overriden by options, after probe */ | ||
773 | for (i = 0; i < NCAPINTS; i++) { | ||
774 | c->x86_capability[i] &= ~cpu_caps_cleared[i]; | ||
775 | c->x86_capability[i] |= cpu_caps_set[i]; | ||
776 | } | ||
777 | |||
771 | #ifdef CONFIG_X86_64 | 778 | #ifdef CONFIG_X86_64 |
772 | c->apicid = apic->phys_pkg_id(c->initial_apicid, 0); | 779 | c->apicid = apic->phys_pkg_id(c->initial_apicid, 0); |
773 | #endif | 780 | #endif |
@@ -813,6 +820,16 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
813 | #endif | 820 | #endif |
814 | 821 | ||
815 | init_hypervisor(c); | 822 | init_hypervisor(c); |
823 | |||
824 | /* | ||
825 | * Clear/Set all flags overriden by options, need do it | ||
826 | * before following smp all cpus cap AND. | ||
827 | */ | ||
828 | for (i = 0; i < NCAPINTS; i++) { | ||
829 | c->x86_capability[i] &= ~cpu_caps_cleared[i]; | ||
830 | c->x86_capability[i] |= cpu_caps_set[i]; | ||
831 | } | ||
832 | |||
816 | /* | 833 | /* |
817 | * On SMP, boot_cpu_data holds the common feature set between | 834 | * On SMP, boot_cpu_data holds the common feature set between |
818 | * all CPUs; so make sure that we indicate which features are | 835 | * all CPUs; so make sure that we indicate which features are |
@@ -825,10 +842,6 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
825 | boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; | 842 | boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; |
826 | } | 843 | } |
827 | 844 | ||
828 | /* Clear all flags overriden by options */ | ||
829 | for (i = 0; i < NCAPINTS; i++) | ||
830 | c->x86_capability[i] &= ~cleared_cpu_caps[i]; | ||
831 | |||
832 | #ifdef CONFIG_X86_MCE | 845 | #ifdef CONFIG_X86_MCE |
833 | /* Init Machine Check Exception if available. */ | 846 | /* Init Machine Check Exception if available. */ |
834 | mcheck_init(c); | 847 | mcheck_init(c); |
diff --git a/arch/x86/kernel/cpu/cpu_debug.c b/arch/x86/kernel/cpu/cpu_debug.c index 46e29ab96c6a..2fc4f6bb9ca5 100644 --- a/arch/x86/kernel/cpu/cpu_debug.c +++ b/arch/x86/kernel/cpu/cpu_debug.c | |||
@@ -588,8 +588,20 @@ static void print_apic(void *arg) | |||
588 | seq_printf(seq, " TMICT\t\t: %08x\n", apic_read(APIC_TMICT)); | 588 | seq_printf(seq, " TMICT\t\t: %08x\n", apic_read(APIC_TMICT)); |
589 | seq_printf(seq, " TMCCT\t\t: %08x\n", apic_read(APIC_TMCCT)); | 589 | seq_printf(seq, " TMCCT\t\t: %08x\n", apic_read(APIC_TMCCT)); |
590 | seq_printf(seq, " TDCR\t\t: %08x\n", apic_read(APIC_TDCR)); | 590 | seq_printf(seq, " TDCR\t\t: %08x\n", apic_read(APIC_TDCR)); |
591 | #endif /* CONFIG_X86_LOCAL_APIC */ | 591 | if (boot_cpu_has(X86_FEATURE_EXTAPIC)) { |
592 | unsigned int i, v, maxeilvt; | ||
593 | |||
594 | v = apic_read(APIC_EFEAT); | ||
595 | maxeilvt = (v >> 16) & 0xff; | ||
596 | seq_printf(seq, " EFEAT\t\t: %08x\n", v); | ||
597 | seq_printf(seq, " ECTRL\t\t: %08x\n", apic_read(APIC_ECTRL)); | ||
592 | 598 | ||
599 | for (i = 0; i < maxeilvt; i++) { | ||
600 | v = apic_read(APIC_EILVTn(i)); | ||
601 | seq_printf(seq, " EILVT%d\t\t: %08x\n", i, v); | ||
602 | } | ||
603 | } | ||
604 | #endif /* CONFIG_X86_LOCAL_APIC */ | ||
593 | seq_printf(seq, "\n MSR\t:\n"); | 605 | seq_printf(seq, "\n MSR\t:\n"); |
594 | } | 606 | } |
595 | 607 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 208ecf6643df..54b6de2cd947 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -693,8 +693,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
693 | if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE && | 693 | if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE && |
694 | policy->cpuinfo.transition_latency > 20 * 1000) { | 694 | policy->cpuinfo.transition_latency > 20 * 1000) { |
695 | policy->cpuinfo.transition_latency = 20 * 1000; | 695 | policy->cpuinfo.transition_latency = 20 * 1000; |
696 | printk_once(KERN_INFO "Capping off P-state tranision" | 696 | printk_once(KERN_INFO |
697 | " latency at 20 uS\n"); | 697 | "P-state transition latency capped at 20 uS\n"); |
698 | } | 698 | } |
699 | 699 | ||
700 | /* table init */ | 700 | /* table init */ |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 7437fa133c02..daed39ba2614 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -229,12 +229,12 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | |||
229 | } | 229 | } |
230 | #endif | 230 | #endif |
231 | 231 | ||
232 | static void __cpuinit srat_detect_node(void) | 232 | static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c) |
233 | { | 233 | { |
234 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) | 234 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) |
235 | unsigned node; | 235 | unsigned node; |
236 | int cpu = smp_processor_id(); | 236 | int cpu = smp_processor_id(); |
237 | int apicid = hard_smp_processor_id(); | 237 | int apicid = cpu_has_apic ? hard_smp_processor_id() : c->apicid; |
238 | 238 | ||
239 | /* Don't do the funky fallback heuristics the AMD version employs | 239 | /* Don't do the funky fallback heuristics the AMD version employs |
240 | for now. */ | 240 | for now. */ |
@@ -400,7 +400,7 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) | |||
400 | } | 400 | } |
401 | 401 | ||
402 | /* Work around errata */ | 402 | /* Work around errata */ |
403 | srat_detect_node(); | 403 | srat_detect_node(c); |
404 | 404 | ||
405 | if (cpu_has(c, X86_FEATURE_VMX)) | 405 | if (cpu_has(c, X86_FEATURE_VMX)) |
406 | detect_vmx_virtcap(c); | 406 | detect_vmx_virtcap(c); |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 35eddc9ec99e..a05660bf0299 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -24,9 +24,9 @@ void (*generic_interrupt_extension)(void) = NULL; | |||
24 | */ | 24 | */ |
25 | void ack_bad_irq(unsigned int irq) | 25 | void ack_bad_irq(unsigned int irq) |
26 | { | 26 | { |
27 | printk(KERN_ERR "unexpected IRQ trap at vector %02x\n", irq); | 27 | if (printk_ratelimit()) |
28 | pr_err("unexpected IRQ trap at vector %02x\n", irq); | ||
28 | 29 | ||
29 | #ifdef CONFIG_X86_LOCAL_APIC | ||
30 | /* | 30 | /* |
31 | * Currently unexpected vectors happen only on SMP and APIC. | 31 | * Currently unexpected vectors happen only on SMP and APIC. |
32 | * We _must_ ack these because every local APIC has only N | 32 | * We _must_ ack these because every local APIC has only N |
@@ -36,9 +36,7 @@ void ack_bad_irq(unsigned int irq) | |||
36 | * completely. | 36 | * completely. |
37 | * But only ack when the APIC is enabled -AK | 37 | * But only ack when the APIC is enabled -AK |
38 | */ | 38 | */ |
39 | if (cpu_has_apic) | 39 | ack_APIC_irq(); |
40 | ack_APIC_irq(); | ||
41 | #endif | ||
42 | } | 40 | } |
43 | 41 | ||
44 | #define irq_stats(x) (&per_cpu(irq_stat, x)) | 42 | #define irq_stats(x) (&per_cpu(irq_stat, x)) |
@@ -178,7 +176,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu) | |||
178 | sum += irq_stats(cpu)->irq_thermal_count; | 176 | sum += irq_stats(cpu)->irq_thermal_count; |
179 | # ifdef CONFIG_X86_MCE_THRESHOLD | 177 | # ifdef CONFIG_X86_MCE_THRESHOLD |
180 | sum += irq_stats(cpu)->irq_threshold_count; | 178 | sum += irq_stats(cpu)->irq_threshold_count; |
181 | #endif | 179 | # endif |
182 | #endif | 180 | #endif |
183 | return sum; | 181 | return sum; |
184 | } | 182 | } |
@@ -213,14 +211,11 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs) | |||
213 | irq = __get_cpu_var(vector_irq)[vector]; | 211 | irq = __get_cpu_var(vector_irq)[vector]; |
214 | 212 | ||
215 | if (!handle_irq(irq, regs)) { | 213 | if (!handle_irq(irq, regs)) { |
216 | #ifdef CONFIG_X86_64 | 214 | ack_APIC_irq(); |
217 | if (!disable_apic) | ||
218 | ack_APIC_irq(); | ||
219 | #endif | ||
220 | 215 | ||
221 | if (printk_ratelimit()) | 216 | if (printk_ratelimit()) |
222 | printk(KERN_EMERG "%s: %d.%d No irq handler for vector (irq %d)\n", | 217 | pr_emerg("%s: %d.%d No irq handler for vector (irq %d)\n", |
223 | __func__, smp_processor_id(), vector, irq); | 218 | __func__, smp_processor_id(), vector, irq); |
224 | } | 219 | } |
225 | 220 | ||
226 | irq_exit(); | 221 | irq_exit(); |
diff --git a/arch/x86/kernel/irqinit_32.c b/arch/x86/kernel/irqinit.c index 2512ad93dabf..aab3d277766c 100644 --- a/arch/x86/kernel/irqinit_32.c +++ b/arch/x86/kernel/irqinit.c | |||
@@ -1,20 +1,25 @@ | |||
1 | #include <linux/linkage.h> | ||
1 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
2 | #include <linux/signal.h> | 3 | #include <linux/signal.h> |
3 | #include <linux/sched.h> | 4 | #include <linux/sched.h> |
4 | #include <linux/ioport.h> | 5 | #include <linux/ioport.h> |
5 | #include <linux/interrupt.h> | 6 | #include <linux/interrupt.h> |
7 | #include <linux/timex.h> | ||
6 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
7 | #include <linux/random.h> | 9 | #include <linux/random.h> |
10 | #include <linux/kprobes.h> | ||
8 | #include <linux/init.h> | 11 | #include <linux/init.h> |
9 | #include <linux/kernel_stat.h> | 12 | #include <linux/kernel_stat.h> |
10 | #include <linux/sysdev.h> | 13 | #include <linux/sysdev.h> |
11 | #include <linux/bitops.h> | 14 | #include <linux/bitops.h> |
15 | #include <linux/acpi.h> | ||
12 | #include <linux/io.h> | 16 | #include <linux/io.h> |
13 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
14 | 18 | ||
15 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
16 | #include <asm/system.h> | 20 | #include <asm/system.h> |
17 | #include <asm/timer.h> | 21 | #include <asm/timer.h> |
22 | #include <asm/hw_irq.h> | ||
18 | #include <asm/pgtable.h> | 23 | #include <asm/pgtable.h> |
19 | #include <asm/desc.h> | 24 | #include <asm/desc.h> |
20 | #include <asm/apic.h> | 25 | #include <asm/apic.h> |
@@ -22,7 +27,23 @@ | |||
22 | #include <asm/i8259.h> | 27 | #include <asm/i8259.h> |
23 | #include <asm/traps.h> | 28 | #include <asm/traps.h> |
24 | 29 | ||
30 | /* | ||
31 | * ISA PIC or low IO-APIC triggered (INTA-cycle or APIC) interrupts: | ||
32 | * (these are usually mapped to vectors 0x30-0x3f) | ||
33 | */ | ||
34 | |||
35 | /* | ||
36 | * The IO-APIC gives us many more interrupt sources. Most of these | ||
37 | * are unused but an SMP system is supposed to have enough memory ... | ||
38 | * sometimes (mostly wrt. hw bugs) we get corrupted vectors all | ||
39 | * across the spectrum, so we really want to be prepared to get all | ||
40 | * of these. Plus, more powerful systems might have more than 64 | ||
41 | * IO-APIC registers. | ||
42 | * | ||
43 | * (these are usually mapped into the 0x30-0xff vector range) | ||
44 | */ | ||
25 | 45 | ||
46 | #ifdef CONFIG_X86_32 | ||
26 | /* | 47 | /* |
27 | * Note that on a 486, we don't want to do a SIGFPE on an irq13 | 48 | * Note that on a 486, we don't want to do a SIGFPE on an irq13 |
28 | * as the irq is unreliable, and exception 16 works correctly | 49 | * as the irq is unreliable, and exception 16 works correctly |
@@ -52,30 +73,7 @@ static struct irqaction fpu_irq = { | |||
52 | .handler = math_error_irq, | 73 | .handler = math_error_irq, |
53 | .name = "fpu", | 74 | .name = "fpu", |
54 | }; | 75 | }; |
55 | |||
56 | void __init init_ISA_irqs(void) | ||
57 | { | ||
58 | int i; | ||
59 | |||
60 | #ifdef CONFIG_X86_LOCAL_APIC | ||
61 | init_bsp_APIC(); | ||
62 | #endif | 76 | #endif |
63 | init_8259A(0); | ||
64 | |||
65 | /* | ||
66 | * 16 old-style INTA-cycle interrupts: | ||
67 | */ | ||
68 | for (i = 0; i < NR_IRQS_LEGACY; i++) { | ||
69 | struct irq_desc *desc = irq_to_desc(i); | ||
70 | |||
71 | desc->status = IRQ_DISABLED; | ||
72 | desc->action = NULL; | ||
73 | desc->depth = 1; | ||
74 | |||
75 | set_irq_chip_and_handler_name(i, &i8259A_chip, | ||
76 | handle_level_irq, "XT"); | ||
77 | } | ||
78 | } | ||
79 | 77 | ||
80 | /* | 78 | /* |
81 | * IRQ2 is cascade interrupt to second interrupt controller | 79 | * IRQ2 is cascade interrupt to second interrupt controller |
@@ -118,29 +116,37 @@ int vector_used_by_percpu_irq(unsigned int vector) | |||
118 | return 0; | 116 | return 0; |
119 | } | 117 | } |
120 | 118 | ||
121 | /* Overridden in paravirt.c */ | 119 | static void __init init_ISA_irqs(void) |
122 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); | ||
123 | |||
124 | void __init native_init_IRQ(void) | ||
125 | { | 120 | { |
126 | int i; | 121 | int i; |
127 | 122 | ||
128 | /* Execute any quirks before the call gates are initialised: */ | 123 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_LOCAL_APIC) |
129 | x86_quirk_pre_intr_init(); | 124 | init_bsp_APIC(); |
125 | #endif | ||
126 | init_8259A(0); | ||
130 | 127 | ||
131 | /* | 128 | /* |
132 | * Cover the whole vector space, no vector can escape | 129 | * 16 old-style INTA-cycle interrupts: |
133 | * us. (some of these will be overridden and become | ||
134 | * 'special' SMP interrupts) | ||
135 | */ | 130 | */ |
136 | for (i = FIRST_EXTERNAL_VECTOR; i < NR_VECTORS; i++) { | 131 | for (i = 0; i < NR_IRQS_LEGACY; i++) { |
137 | /* SYSCALL_VECTOR was reserved in trap_init. */ | 132 | struct irq_desc *desc = irq_to_desc(i); |
138 | if (i != SYSCALL_VECTOR) | 133 | |
139 | set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]); | 134 | desc->status = IRQ_DISABLED; |
135 | desc->action = NULL; | ||
136 | desc->depth = 1; | ||
137 | |||
138 | set_irq_chip_and_handler_name(i, &i8259A_chip, | ||
139 | handle_level_irq, "XT"); | ||
140 | } | 140 | } |
141 | } | ||
141 | 142 | ||
143 | /* Overridden in paravirt.c */ | ||
144 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); | ||
142 | 145 | ||
143 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_SMP) | 146 | static void __init smp_intr_init(void) |
147 | { | ||
148 | #ifdef CONFIG_SMP | ||
149 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_LOCAL_APIC) | ||
144 | /* | 150 | /* |
145 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper | 151 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper |
146 | * IPI, driven by wakeup. | 152 | * IPI, driven by wakeup. |
@@ -160,16 +166,29 @@ void __init native_init_IRQ(void) | |||
160 | /* IPI for generic function call */ | 166 | /* IPI for generic function call */ |
161 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); | 167 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); |
162 | 168 | ||
163 | /* IPI for single call function */ | 169 | /* IPI for generic single function call */ |
164 | alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR, | 170 | alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR, |
165 | call_function_single_interrupt); | 171 | call_function_single_interrupt); |
166 | 172 | ||
167 | /* Low priority IPI to cleanup after moving an irq */ | 173 | /* Low priority IPI to cleanup after moving an irq */ |
168 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); | 174 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); |
169 | set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors); | 175 | set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors); |
170 | #endif | 176 | #endif |
177 | #endif /* CONFIG_SMP */ | ||
178 | } | ||
179 | |||
180 | static void __init apic_intr_init(void) | ||
181 | { | ||
182 | smp_intr_init(); | ||
171 | 183 | ||
172 | #ifdef CONFIG_X86_LOCAL_APIC | 184 | #ifdef CONFIG_X86_THERMAL_VECTOR |
185 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | ||
186 | #endif | ||
187 | #ifdef CONFIG_X86_THRESHOLD | ||
188 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); | ||
189 | #endif | ||
190 | |||
191 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_LOCAL_APIC) | ||
173 | /* self generated IPI for local APIC timer */ | 192 | /* self generated IPI for local APIC timer */ |
174 | alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt); | 193 | alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt); |
175 | 194 | ||
@@ -179,20 +198,60 @@ void __init native_init_IRQ(void) | |||
179 | /* IPI vectors for APIC spurious and error interrupts */ | 198 | /* IPI vectors for APIC spurious and error interrupts */ |
180 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); | 199 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); |
181 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); | 200 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); |
182 | #endif | ||
183 | 201 | ||
184 | #ifdef CONFIG_X86_THERMAL_VECTOR | 202 | /* Performance monitoring interrupts: */ |
185 | /* thermal monitor LVT interrupt */ | 203 | # ifdef CONFIG_PERF_COUNTERS |
186 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | 204 | alloc_intr_gate(LOCAL_PERF_VECTOR, perf_counter_interrupt); |
205 | alloc_intr_gate(LOCAL_PENDING_VECTOR, perf_pending_interrupt); | ||
206 | # endif | ||
207 | |||
187 | #endif | 208 | #endif |
209 | } | ||
188 | 210 | ||
189 | #ifdef CONFIG_X86_MCE_THRESHOLD | 211 | /** |
190 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); | 212 | * x86_quirk_pre_intr_init - initialisation prior to setting up interrupt vectors |
213 | * | ||
214 | * Description: | ||
215 | * Perform any necessary interrupt initialisation prior to setting up | ||
216 | * the "ordinary" interrupt call gates. For legacy reasons, the ISA | ||
217 | * interrupts should be initialised here if the machine emulates a PC | ||
218 | * in any way. | ||
219 | **/ | ||
220 | static void __init x86_quirk_pre_intr_init(void) | ||
221 | { | ||
222 | #ifdef CONFIG_X86_32 | ||
223 | if (x86_quirks->arch_pre_intr_init) { | ||
224 | if (x86_quirks->arch_pre_intr_init()) | ||
225 | return; | ||
226 | } | ||
191 | #endif | 227 | #endif |
228 | init_ISA_irqs(); | ||
229 | } | ||
230 | |||
231 | void __init native_init_IRQ(void) | ||
232 | { | ||
233 | int i; | ||
234 | |||
235 | /* Execute any quirks before the call gates are initialised: */ | ||
236 | x86_quirk_pre_intr_init(); | ||
237 | |||
238 | apic_intr_init(); | ||
239 | |||
240 | /* | ||
241 | * Cover the whole vector space, no vector can escape | ||
242 | * us. (some of these will be overridden and become | ||
243 | * 'special' SMP interrupts) | ||
244 | */ | ||
245 | for (i = FIRST_EXTERNAL_VECTOR; i < NR_VECTORS; i++) { | ||
246 | /* IA32_SYSCALL_VECTOR could be used in trap_init already. */ | ||
247 | if (!test_bit(i, used_vectors)) | ||
248 | set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]); | ||
249 | } | ||
192 | 250 | ||
193 | if (!acpi_ioapic) | 251 | if (!acpi_ioapic) |
194 | setup_irq(2, &irq2); | 252 | setup_irq(2, &irq2); |
195 | 253 | ||
254 | #ifdef CONFIG_X86_32 | ||
196 | /* | 255 | /* |
197 | * Call quirks after call gates are initialised (usually add in | 256 | * Call quirks after call gates are initialised (usually add in |
198 | * the architecture specific gates): | 257 | * the architecture specific gates): |
@@ -207,4 +266,5 @@ void __init native_init_IRQ(void) | |||
207 | setup_irq(FPU_IRQ, &fpu_irq); | 266 | setup_irq(FPU_IRQ, &fpu_irq); |
208 | 267 | ||
209 | irq_ctx_init(smp_processor_id()); | 268 | irq_ctx_init(smp_processor_id()); |
269 | #endif | ||
210 | } | 270 | } |
diff --git a/arch/x86/kernel/irqinit_64.c b/arch/x86/kernel/irqinit_64.c deleted file mode 100644 index 8cd10537fd46..000000000000 --- a/arch/x86/kernel/irqinit_64.c +++ /dev/null | |||
@@ -1,177 +0,0 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <linux/signal.h> | ||
4 | #include <linux/sched.h> | ||
5 | #include <linux/ioport.h> | ||
6 | #include <linux/interrupt.h> | ||
7 | #include <linux/timex.h> | ||
8 | #include <linux/slab.h> | ||
9 | #include <linux/random.h> | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/kernel_stat.h> | ||
12 | #include <linux/sysdev.h> | ||
13 | #include <linux/bitops.h> | ||
14 | #include <linux/acpi.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
17 | |||
18 | #include <asm/atomic.h> | ||
19 | #include <asm/system.h> | ||
20 | #include <asm/hw_irq.h> | ||
21 | #include <asm/pgtable.h> | ||
22 | #include <asm/desc.h> | ||
23 | #include <asm/apic.h> | ||
24 | #include <asm/i8259.h> | ||
25 | |||
26 | /* | ||
27 | * ISA PIC or low IO-APIC triggered (INTA-cycle or APIC) interrupts: | ||
28 | * (these are usually mapped to vectors 0x30-0x3f) | ||
29 | */ | ||
30 | |||
31 | /* | ||
32 | * The IO-APIC gives us many more interrupt sources. Most of these | ||
33 | * are unused but an SMP system is supposed to have enough memory ... | ||
34 | * sometimes (mostly wrt. hw bugs) we get corrupted vectors all | ||
35 | * across the spectrum, so we really want to be prepared to get all | ||
36 | * of these. Plus, more powerful systems might have more than 64 | ||
37 | * IO-APIC registers. | ||
38 | * | ||
39 | * (these are usually mapped into the 0x30-0xff vector range) | ||
40 | */ | ||
41 | |||
42 | /* | ||
43 | * IRQ2 is cascade interrupt to second interrupt controller | ||
44 | */ | ||
45 | |||
46 | static struct irqaction irq2 = { | ||
47 | .handler = no_action, | ||
48 | .name = "cascade", | ||
49 | }; | ||
50 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { | ||
51 | [0 ... IRQ0_VECTOR - 1] = -1, | ||
52 | [IRQ0_VECTOR] = 0, | ||
53 | [IRQ1_VECTOR] = 1, | ||
54 | [IRQ2_VECTOR] = 2, | ||
55 | [IRQ3_VECTOR] = 3, | ||
56 | [IRQ4_VECTOR] = 4, | ||
57 | [IRQ5_VECTOR] = 5, | ||
58 | [IRQ6_VECTOR] = 6, | ||
59 | [IRQ7_VECTOR] = 7, | ||
60 | [IRQ8_VECTOR] = 8, | ||
61 | [IRQ9_VECTOR] = 9, | ||
62 | [IRQ10_VECTOR] = 10, | ||
63 | [IRQ11_VECTOR] = 11, | ||
64 | [IRQ12_VECTOR] = 12, | ||
65 | [IRQ13_VECTOR] = 13, | ||
66 | [IRQ14_VECTOR] = 14, | ||
67 | [IRQ15_VECTOR] = 15, | ||
68 | [IRQ15_VECTOR + 1 ... NR_VECTORS - 1] = -1 | ||
69 | }; | ||
70 | |||
71 | int vector_used_by_percpu_irq(unsigned int vector) | ||
72 | { | ||
73 | int cpu; | ||
74 | |||
75 | for_each_online_cpu(cpu) { | ||
76 | if (per_cpu(vector_irq, cpu)[vector] != -1) | ||
77 | return 1; | ||
78 | } | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | static void __init init_ISA_irqs(void) | ||
84 | { | ||
85 | int i; | ||
86 | |||
87 | init_bsp_APIC(); | ||
88 | init_8259A(0); | ||
89 | |||
90 | for (i = 0; i < NR_IRQS_LEGACY; i++) { | ||
91 | struct irq_desc *desc = irq_to_desc(i); | ||
92 | |||
93 | desc->status = IRQ_DISABLED; | ||
94 | desc->action = NULL; | ||
95 | desc->depth = 1; | ||
96 | |||
97 | /* | ||
98 | * 16 old-style INTA-cycle interrupts: | ||
99 | */ | ||
100 | set_irq_chip_and_handler_name(i, &i8259A_chip, | ||
101 | handle_level_irq, "XT"); | ||
102 | } | ||
103 | } | ||
104 | |||
105 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); | ||
106 | |||
107 | static void __init smp_intr_init(void) | ||
108 | { | ||
109 | #ifdef CONFIG_SMP | ||
110 | /* | ||
111 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper | ||
112 | * IPI, driven by wakeup. | ||
113 | */ | ||
114 | alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt); | ||
115 | |||
116 | /* IPIs for invalidation */ | ||
117 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+0, invalidate_interrupt0); | ||
118 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+1, invalidate_interrupt1); | ||
119 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+2, invalidate_interrupt2); | ||
120 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+3, invalidate_interrupt3); | ||
121 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+4, invalidate_interrupt4); | ||
122 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+5, invalidate_interrupt5); | ||
123 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+6, invalidate_interrupt6); | ||
124 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+7, invalidate_interrupt7); | ||
125 | |||
126 | /* IPI for generic function call */ | ||
127 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); | ||
128 | |||
129 | /* IPI for generic single function call */ | ||
130 | alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR, | ||
131 | call_function_single_interrupt); | ||
132 | |||
133 | /* Low priority IPI to cleanup after moving an irq */ | ||
134 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); | ||
135 | set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors); | ||
136 | #endif | ||
137 | } | ||
138 | |||
139 | static void __init apic_intr_init(void) | ||
140 | { | ||
141 | smp_intr_init(); | ||
142 | |||
143 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | ||
144 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); | ||
145 | |||
146 | /* self generated IPI for local APIC timer */ | ||
147 | alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt); | ||
148 | |||
149 | /* generic IPI for platform specific use */ | ||
150 | alloc_intr_gate(GENERIC_INTERRUPT_VECTOR, generic_interrupt); | ||
151 | |||
152 | /* IPI vectors for APIC spurious and error interrupts */ | ||
153 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); | ||
154 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); | ||
155 | } | ||
156 | |||
157 | void __init native_init_IRQ(void) | ||
158 | { | ||
159 | int i; | ||
160 | |||
161 | init_ISA_irqs(); | ||
162 | /* | ||
163 | * Cover the whole vector space, no vector can escape | ||
164 | * us. (some of these will be overridden and become | ||
165 | * 'special' SMP interrupts) | ||
166 | */ | ||
167 | for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { | ||
168 | int vector = FIRST_EXTERNAL_VECTOR + i; | ||
169 | if (vector != IA32_SYSCALL_VECTOR) | ||
170 | set_intr_gate(vector, interrupt[i]); | ||
171 | } | ||
172 | |||
173 | apic_intr_init(); | ||
174 | |||
175 | if (!acpi_ioapic) | ||
176 | setup_irq(2, &irq2); | ||
177 | } | ||
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 70fd7e414c15..651c93b28862 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -17,6 +17,7 @@ | |||
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/pci.h> | ||
20 | 21 | ||
21 | #include <asm/mtrr.h> | 22 | #include <asm/mtrr.h> |
22 | #include <asm/mpspec.h> | 23 | #include <asm/mpspec.h> |
@@ -870,24 +871,17 @@ static | |||
870 | inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} | 871 | inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} |
871 | #endif /* CONFIG_X86_IO_APIC */ | 872 | #endif /* CONFIG_X86_IO_APIC */ |
872 | 873 | ||
873 | static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, | 874 | static int |
874 | int count) | 875 | check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, int count) |
875 | { | 876 | { |
876 | if (!mpc_new_phys) { | 877 | int ret = 0; |
877 | pr_info("No spare slots, try to append...take your risk, " | 878 | |
878 | "new mpc_length %x\n", count); | 879 | if (!mpc_new_phys || count <= mpc_new_length) { |
879 | } else { | 880 | WARN(1, "update_mptable: No spare slots (length: %x)\n", count); |
880 | if (count <= mpc_new_length) | 881 | return -1; |
881 | pr_info("No spare slots, try to append..., " | ||
882 | "new mpc_length %x\n", count); | ||
883 | else { | ||
884 | pr_err("mpc_new_length %lx is too small\n", | ||
885 | mpc_new_length); | ||
886 | return -1; | ||
887 | } | ||
888 | } | 882 | } |
889 | 883 | ||
890 | return 0; | 884 | return ret; |
891 | } | 885 | } |
892 | 886 | ||
893 | static int __init replace_intsrc_all(struct mpc_table *mpc, | 887 | static int __init replace_intsrc_all(struct mpc_table *mpc, |
@@ -946,7 +940,7 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
946 | } else { | 940 | } else { |
947 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 941 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; |
948 | count += sizeof(struct mpc_intsrc); | 942 | count += sizeof(struct mpc_intsrc); |
949 | if (!check_slot(mpc_new_phys, mpc_new_length, count)) | 943 | if (check_slot(mpc_new_phys, mpc_new_length, count) < 0) |
950 | goto out; | 944 | goto out; |
951 | assign_to_mpc_intsrc(&mp_irqs[i], m); | 945 | assign_to_mpc_intsrc(&mp_irqs[i], m); |
952 | mpc->length = count; | 946 | mpc->length = count; |
@@ -963,11 +957,14 @@ out: | |||
963 | return 0; | 957 | return 0; |
964 | } | 958 | } |
965 | 959 | ||
966 | static int __initdata enable_update_mptable; | 960 | int enable_update_mptable; |
967 | 961 | ||
968 | static int __init update_mptable_setup(char *str) | 962 | static int __init update_mptable_setup(char *str) |
969 | { | 963 | { |
970 | enable_update_mptable = 1; | 964 | enable_update_mptable = 1; |
965 | #ifdef CONFIG_PCI | ||
966 | pci_routeirq = 1; | ||
967 | #endif | ||
971 | return 0; | 968 | return 0; |
972 | } | 969 | } |
973 | early_param("update_mptable", update_mptable_setup); | 970 | early_param("update_mptable", update_mptable_setup); |
@@ -980,6 +977,9 @@ static int __initdata alloc_mptable; | |||
980 | static int __init parse_alloc_mptable_opt(char *p) | 977 | static int __init parse_alloc_mptable_opt(char *p) |
981 | { | 978 | { |
982 | enable_update_mptable = 1; | 979 | enable_update_mptable = 1; |
980 | #ifdef CONFIG_PCI | ||
981 | pci_routeirq = 1; | ||
982 | #endif | ||
983 | alloc_mptable = 1; | 983 | alloc_mptable = 1; |
984 | if (!p) | 984 | if (!p) |
985 | return 0; | 985 | return 0; |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index b4158439bf63..523bb697120d 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -997,24 +997,6 @@ void __init setup_arch(char **cmdline_p) | |||
997 | #ifdef CONFIG_X86_32 | 997 | #ifdef CONFIG_X86_32 |
998 | 998 | ||
999 | /** | 999 | /** |
1000 | * x86_quirk_pre_intr_init - initialisation prior to setting up interrupt vectors | ||
1001 | * | ||
1002 | * Description: | ||
1003 | * Perform any necessary interrupt initialisation prior to setting up | ||
1004 | * the "ordinary" interrupt call gates. For legacy reasons, the ISA | ||
1005 | * interrupts should be initialised here if the machine emulates a PC | ||
1006 | * in any way. | ||
1007 | **/ | ||
1008 | void __init x86_quirk_pre_intr_init(void) | ||
1009 | { | ||
1010 | if (x86_quirks->arch_pre_intr_init) { | ||
1011 | if (x86_quirks->arch_pre_intr_init()) | ||
1012 | return; | ||
1013 | } | ||
1014 | init_ISA_irqs(); | ||
1015 | } | ||
1016 | |||
1017 | /** | ||
1018 | * x86_quirk_intr_init - post gate setup interrupt initialisation | 1000 | * x86_quirk_intr_init - post gate setup interrupt initialisation |
1019 | * | 1001 | * |
1020 | * Description: | 1002 | * Description: |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index 13f33ea8ccaa..f6db48c405b8 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
@@ -193,19 +193,19 @@ void smp_call_function_single_interrupt(struct pt_regs *regs) | |||
193 | } | 193 | } |
194 | 194 | ||
195 | struct smp_ops smp_ops = { | 195 | struct smp_ops smp_ops = { |
196 | .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu, | 196 | .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu, |
197 | .smp_prepare_cpus = native_smp_prepare_cpus, | 197 | .smp_prepare_cpus = native_smp_prepare_cpus, |
198 | .smp_cpus_done = native_smp_cpus_done, | 198 | .smp_cpus_done = native_smp_cpus_done, |
199 | 199 | ||
200 | .smp_send_stop = native_smp_send_stop, | 200 | .smp_send_stop = native_smp_send_stop, |
201 | .smp_send_reschedule = native_smp_send_reschedule, | 201 | .smp_send_reschedule = native_smp_send_reschedule, |
202 | 202 | ||
203 | .cpu_up = native_cpu_up, | 203 | .cpu_up = native_cpu_up, |
204 | .cpu_die = native_cpu_die, | 204 | .cpu_die = native_cpu_die, |
205 | .cpu_disable = native_cpu_disable, | 205 | .cpu_disable = native_cpu_disable, |
206 | .play_dead = native_play_dead, | 206 | .play_dead = native_play_dead, |
207 | 207 | ||
208 | .send_call_func_ipi = native_send_call_func_ipi, | 208 | .send_call_func_ipi = native_send_call_func_ipi, |
209 | .send_call_func_single_ipi = native_send_call_func_single_ipi, | 209 | .send_call_func_single_ipi = native_send_call_func_single_ipi, |
210 | }; | 210 | }; |
211 | EXPORT_SYMBOL_GPL(smp_ops); | 211 | EXPORT_SYMBOL_GPL(smp_ops); |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 58d24ef917d8..d2e8de958156 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -504,7 +504,7 @@ void __inquire_remote_apic(int apicid) | |||
504 | * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this | 504 | * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this |
505 | * won't ... remember to clear down the APIC, etc later. | 505 | * won't ... remember to clear down the APIC, etc later. |
506 | */ | 506 | */ |
507 | int __devinit | 507 | int __cpuinit |
508 | wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip) | 508 | wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip) |
509 | { | 509 | { |
510 | unsigned long send_status, accept_status = 0; | 510 | unsigned long send_status, accept_status = 0; |
@@ -538,7 +538,7 @@ wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip) | |||
538 | return (send_status | accept_status); | 538 | return (send_status | accept_status); |
539 | } | 539 | } |
540 | 540 | ||
541 | int __devinit | 541 | static int __cpuinit |
542 | wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip) | 542 | wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip) |
543 | { | 543 | { |
544 | unsigned long send_status, accept_status = 0; | 544 | unsigned long send_status, accept_status = 0; |
@@ -822,10 +822,12 @@ do_rest: | |||
822 | /* mark "stuck" area as not stuck */ | 822 | /* mark "stuck" area as not stuck */ |
823 | *((volatile unsigned long *)trampoline_base) = 0; | 823 | *((volatile unsigned long *)trampoline_base) = 0; |
824 | 824 | ||
825 | /* | 825 | if (get_uv_system_type() != UV_NON_UNIQUE_APIC) { |
826 | * Cleanup possible dangling ends... | 826 | /* |
827 | */ | 827 | * Cleanup possible dangling ends... |
828 | smpboot_restore_warm_reset_vector(); | 828 | */ |
829 | smpboot_restore_warm_reset_vector(); | ||
830 | } | ||
829 | 831 | ||
830 | return boot_error; | 832 | return boot_error; |
831 | } | 833 | } |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 0d358c884b35..f4d683b630ba 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -969,11 +969,8 @@ void __init trap_init(void) | |||
969 | for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++) | 969 | for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++) |
970 | set_bit(i, used_vectors); | 970 | set_bit(i, used_vectors); |
971 | 971 | ||
972 | #ifdef CONFIG_X86_64 | ||
973 | set_bit(IA32_SYSCALL_VECTOR, used_vectors); | 972 | set_bit(IA32_SYSCALL_VECTOR, used_vectors); |
974 | #else | 973 | |
975 | set_bit(SYSCALL_VECTOR, used_vectors); | ||
976 | #endif | ||
977 | /* | 974 | /* |
978 | * Should be a barrier for any external CPU state: | 975 | * Should be a barrier for any external CPU state: |
979 | */ | 976 | */ |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index ca7ec44bafc3..45acbcf25683 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -636,7 +636,7 @@ static void __init lguest_init_IRQ(void) | |||
636 | 636 | ||
637 | void lguest_setup_irq(unsigned int irq) | 637 | void lguest_setup_irq(unsigned int irq) |
638 | { | 638 | { |
639 | irq_to_desc_alloc_cpu(irq, 0); | 639 | irq_to_desc_alloc_node(irq, 0); |
640 | set_irq_chip_and_handler_name(irq, &lguest_irq_controller, | 640 | set_irq_chip_and_handler_name(irq, &lguest_irq_controller, |
641 | handle_level_irq, "level"); | 641 | handle_level_irq, "level"); |
642 | } | 642 | } |
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 8f307d914c2e..f46c340727b8 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c | |||
@@ -26,12 +26,16 @@ static unsigned long page_table_shareable(struct vm_area_struct *svma, | |||
26 | unsigned long sbase = saddr & PUD_MASK; | 26 | unsigned long sbase = saddr & PUD_MASK; |
27 | unsigned long s_end = sbase + PUD_SIZE; | 27 | unsigned long s_end = sbase + PUD_SIZE; |
28 | 28 | ||
29 | /* Allow segments to share if only one is marked locked */ | ||
30 | unsigned long vm_flags = vma->vm_flags & ~VM_LOCKED; | ||
31 | unsigned long svm_flags = svma->vm_flags & ~VM_LOCKED; | ||
32 | |||
29 | /* | 33 | /* |
30 | * match the virtual addresses, permission and the alignment of the | 34 | * match the virtual addresses, permission and the alignment of the |
31 | * page table page. | 35 | * page table page. |
32 | */ | 36 | */ |
33 | if (pmd_index(addr) != pmd_index(saddr) || | 37 | if (pmd_index(addr) != pmd_index(saddr) || |
34 | vma->vm_flags != svma->vm_flags || | 38 | vm_flags != svm_flags || |
35 | sbase < svma->vm_start || svma->vm_end < s_end) | 39 | sbase < svma->vm_start || svma->vm_end < s_end) |
36 | return 0; | 40 | return 0; |
37 | 41 | ||
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index fecbce6e7d7c..0696d506c4ad 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -889,6 +889,9 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
889 | return 0; | 889 | return 0; |
890 | } | 890 | } |
891 | 891 | ||
892 | if (io_apic_assign_pci_irqs) | ||
893 | return 0; | ||
894 | |||
892 | /* Find IRQ routing entry */ | 895 | /* Find IRQ routing entry */ |
893 | 896 | ||
894 | if (!pirq_table) | 897 | if (!pirq_table) |
@@ -1039,56 +1042,15 @@ static void __init pcibios_fixup_irqs(void) | |||
1039 | pirq_penalty[dev->irq]++; | 1042 | pirq_penalty[dev->irq]++; |
1040 | } | 1043 | } |
1041 | 1044 | ||
1045 | if (io_apic_assign_pci_irqs) | ||
1046 | return; | ||
1047 | |||
1042 | dev = NULL; | 1048 | dev = NULL; |
1043 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 1049 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
1044 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); | 1050 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
1045 | if (!pin) | 1051 | if (!pin) |
1046 | continue; | 1052 | continue; |
1047 | 1053 | ||
1048 | #ifdef CONFIG_X86_IO_APIC | ||
1049 | /* | ||
1050 | * Recalculate IRQ numbers if we use the I/O APIC. | ||
1051 | */ | ||
1052 | if (io_apic_assign_pci_irqs) { | ||
1053 | int irq; | ||
1054 | |||
1055 | /* | ||
1056 | * interrupt pins are numbered starting from 1 | ||
1057 | */ | ||
1058 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | ||
1059 | PCI_SLOT(dev->devfn), pin - 1); | ||
1060 | /* | ||
1061 | * Busses behind bridges are typically not listed in the | ||
1062 | * MP-table. In this case we have to look up the IRQ | ||
1063 | * based on the parent bus, parent slot, and pin number. | ||
1064 | * The SMP code detects such bridged busses itself so we | ||
1065 | * should get into this branch reliably. | ||
1066 | */ | ||
1067 | if (irq < 0 && dev->bus->parent) { | ||
1068 | /* go back to the bridge */ | ||
1069 | struct pci_dev *bridge = dev->bus->self; | ||
1070 | int bus; | ||
1071 | |||
1072 | pin = pci_swizzle_interrupt_pin(dev, pin); | ||
1073 | bus = bridge->bus->number; | ||
1074 | irq = IO_APIC_get_PCI_irq_vector(bus, | ||
1075 | PCI_SLOT(bridge->devfn), pin - 1); | ||
1076 | if (irq >= 0) | ||
1077 | dev_warn(&dev->dev, | ||
1078 | "using bridge %s INT %c to " | ||
1079 | "get IRQ %d\n", | ||
1080 | pci_name(bridge), | ||
1081 | 'A' + pin - 1, irq); | ||
1082 | } | ||
1083 | if (irq >= 0) { | ||
1084 | dev_info(&dev->dev, | ||
1085 | "PCI->APIC IRQ transform: INT %c " | ||
1086 | "-> IRQ %d\n", | ||
1087 | 'A' + pin - 1, irq); | ||
1088 | dev->irq = irq; | ||
1089 | } | ||
1090 | } | ||
1091 | #endif | ||
1092 | /* | 1054 | /* |
1093 | * Still no IRQ? Try to lookup one... | 1055 | * Still no IRQ? Try to lookup one... |
1094 | */ | 1056 | */ |
@@ -1183,6 +1145,19 @@ int __init pcibios_irq_init(void) | |||
1183 | pcibios_enable_irq = pirq_enable_irq; | 1145 | pcibios_enable_irq = pirq_enable_irq; |
1184 | 1146 | ||
1185 | pcibios_fixup_irqs(); | 1147 | pcibios_fixup_irqs(); |
1148 | |||
1149 | if (io_apic_assign_pci_irqs && pci_routeirq) { | ||
1150 | struct pci_dev *dev = NULL; | ||
1151 | /* | ||
1152 | * PCI IRQ routing is set up by pci_enable_device(), but we | ||
1153 | * also do it here in case there are still broken drivers that | ||
1154 | * don't use pci_enable_device(). | ||
1155 | */ | ||
1156 | printk(KERN_INFO "PCI: Routing PCI interrupts for all devices because \"pci=routeirq\" specified\n"); | ||
1157 | for_each_pci_dev(dev) | ||
1158 | pirq_enable_irq(dev); | ||
1159 | } | ||
1160 | |||
1186 | return 0; | 1161 | return 0; |
1187 | } | 1162 | } |
1188 | 1163 | ||
@@ -1213,16 +1188,23 @@ void pcibios_penalize_isa_irq(int irq, int active) | |||
1213 | static int pirq_enable_irq(struct pci_dev *dev) | 1188 | static int pirq_enable_irq(struct pci_dev *dev) |
1214 | { | 1189 | { |
1215 | u8 pin; | 1190 | u8 pin; |
1216 | struct pci_dev *temp_dev; | ||
1217 | 1191 | ||
1218 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); | 1192 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
1219 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { | 1193 | if (pin && !pcibios_lookup_irq(dev, 1)) { |
1220 | char *msg = ""; | 1194 | char *msg = ""; |
1221 | 1195 | ||
1196 | if (!io_apic_assign_pci_irqs && dev->irq) | ||
1197 | return 0; | ||
1198 | |||
1222 | if (io_apic_assign_pci_irqs) { | 1199 | if (io_apic_assign_pci_irqs) { |
1200 | #ifdef CONFIG_X86_IO_APIC | ||
1201 | struct pci_dev *temp_dev; | ||
1223 | int irq; | 1202 | int irq; |
1203 | struct io_apic_irq_attr irq_attr; | ||
1224 | 1204 | ||
1225 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin - 1); | 1205 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, |
1206 | PCI_SLOT(dev->devfn), | ||
1207 | pin - 1, &irq_attr); | ||
1226 | /* | 1208 | /* |
1227 | * Busses behind bridges are typically not listed in the MP-table. | 1209 | * Busses behind bridges are typically not listed in the MP-table. |
1228 | * In this case we have to look up the IRQ based on the parent bus, | 1210 | * In this case we have to look up the IRQ based on the parent bus, |
@@ -1235,7 +1217,8 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1235 | 1217 | ||
1236 | pin = pci_swizzle_interrupt_pin(dev, pin); | 1218 | pin = pci_swizzle_interrupt_pin(dev, pin); |
1237 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, | 1219 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, |
1238 | PCI_SLOT(bridge->devfn), pin - 1); | 1220 | PCI_SLOT(bridge->devfn), |
1221 | pin - 1, &irq_attr); | ||
1239 | if (irq >= 0) | 1222 | if (irq >= 0) |
1240 | dev_warn(&dev->dev, "using bridge %s " | 1223 | dev_warn(&dev->dev, "using bridge %s " |
1241 | "INT %c to get IRQ %d\n", | 1224 | "INT %c to get IRQ %d\n", |
@@ -1245,12 +1228,15 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1245 | } | 1228 | } |
1246 | dev = temp_dev; | 1229 | dev = temp_dev; |
1247 | if (irq >= 0) { | 1230 | if (irq >= 0) { |
1231 | io_apic_set_pci_routing(&dev->dev, irq, | ||
1232 | &irq_attr); | ||
1233 | dev->irq = irq; | ||
1248 | dev_info(&dev->dev, "PCI->APIC IRQ transform: " | 1234 | dev_info(&dev->dev, "PCI->APIC IRQ transform: " |
1249 | "INT %c -> IRQ %d\n", 'A' + pin - 1, irq); | 1235 | "INT %c -> IRQ %d\n", 'A' + pin - 1, irq); |
1250 | dev->irq = irq; | ||
1251 | return 0; | 1236 | return 0; |
1252 | } else | 1237 | } else |
1253 | msg = "; probably buggy MP table"; | 1238 | msg = "; probably buggy MP table"; |
1239 | #endif | ||
1254 | } else if (pci_probe & PCI_BIOS_IRQ_SCAN) | 1240 | } else if (pci_probe & PCI_BIOS_IRQ_SCAN) |
1255 | msg = ""; | 1241 | msg = ""; |
1256 | else | 1242 | else |
diff --git a/drivers/acpi/pci_bind.c b/drivers/acpi/pci_bind.c index 95650f83ce2e..bc46de3d967f 100644 --- a/drivers/acpi/pci_bind.c +++ b/drivers/acpi/pci_bind.c | |||
@@ -116,9 +116,6 @@ int acpi_pci_bind(struct acpi_device *device) | |||
116 | struct acpi_pci_data *pdata; | 116 | struct acpi_pci_data *pdata; |
117 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 117 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
118 | acpi_handle handle; | 118 | acpi_handle handle; |
119 | struct pci_dev *dev; | ||
120 | struct pci_bus *bus; | ||
121 | |||
122 | 119 | ||
123 | if (!device || !device->parent) | 120 | if (!device || !device->parent) |
124 | return -EINVAL; | 121 | return -EINVAL; |
@@ -176,20 +173,9 @@ int acpi_pci_bind(struct acpi_device *device) | |||
176 | * Locate matching device in PCI namespace. If it doesn't exist | 173 | * Locate matching device in PCI namespace. If it doesn't exist |
177 | * this typically means that the device isn't currently inserted | 174 | * this typically means that the device isn't currently inserted |
178 | * (e.g. docking station, port replicator, etc.). | 175 | * (e.g. docking station, port replicator, etc.). |
179 | * We cannot simply search the global pci device list, since | ||
180 | * PCI devices are added to the global pci list when the root | ||
181 | * bridge start ops are run, which may not have happened yet. | ||
182 | */ | 176 | */ |
183 | bus = pci_find_bus(data->id.segment, data->id.bus); | 177 | data->dev = pci_get_slot(pdata->bus, |
184 | if (bus) { | 178 | PCI_DEVFN(data->id.device, data->id.function)); |
185 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
186 | if (dev->devfn == PCI_DEVFN(data->id.device, | ||
187 | data->id.function)) { | ||
188 | data->dev = dev; | ||
189 | break; | ||
190 | } | ||
191 | } | ||
192 | } | ||
193 | if (!data->dev) { | 179 | if (!data->dev) { |
194 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 180 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
195 | "Device %04x:%02x:%02x.%d not present in PCI namespace\n", | 181 | "Device %04x:%02x:%02x.%d not present in PCI namespace\n", |
@@ -259,9 +245,10 @@ int acpi_pci_bind(struct acpi_device *device) | |||
259 | 245 | ||
260 | end: | 246 | end: |
261 | kfree(buffer.pointer); | 247 | kfree(buffer.pointer); |
262 | if (result) | 248 | if (result) { |
249 | pci_dev_put(data->dev); | ||
263 | kfree(data); | 250 | kfree(data); |
264 | 251 | } | |
265 | return result; | 252 | return result; |
266 | } | 253 | } |
267 | 254 | ||
@@ -303,6 +290,7 @@ static int acpi_pci_unbind(struct acpi_device *device) | |||
303 | if (data->dev->subordinate) { | 290 | if (data->dev->subordinate) { |
304 | acpi_pci_irq_del_prt(data->id.segment, data->bus->number); | 291 | acpi_pci_irq_del_prt(data->id.segment, data->bus->number); |
305 | } | 292 | } |
293 | pci_dev_put(data->dev); | ||
306 | kfree(data); | 294 | kfree(data); |
307 | 295 | ||
308 | end: | 296 | end: |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 51b9f8280f88..2faa9e2ac893 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -401,7 +401,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | |||
401 | /* Interrupt Line values above 0xF are forbidden */ | 401 | /* Interrupt Line values above 0xF are forbidden */ |
402 | if (dev->irq > 0 && (dev->irq <= 0xF)) { | 402 | if (dev->irq > 0 && (dev->irq <= 0xF)) { |
403 | printk(" - using IRQ %d\n", dev->irq); | 403 | printk(" - using IRQ %d\n", dev->irq); |
404 | acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, | 404 | acpi_register_gsi(&dev->dev, dev->irq, |
405 | ACPI_LEVEL_SENSITIVE, | ||
405 | ACPI_ACTIVE_LOW); | 406 | ACPI_ACTIVE_LOW); |
406 | return 0; | 407 | return 0; |
407 | } else { | 408 | } else { |
@@ -410,7 +411,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | |||
410 | } | 411 | } |
411 | } | 412 | } |
412 | 413 | ||
413 | rc = acpi_register_gsi(gsi, triggering, polarity); | 414 | rc = acpi_register_gsi(&dev->dev, gsi, triggering, polarity); |
414 | if (rc < 0) { | 415 | if (rc < 0) { |
415 | dev_warn(&dev->dev, "PCI INT %c: failed to register GSI\n", | 416 | dev_warn(&dev->dev, "PCI INT %c: failed to register GSI\n", |
416 | pin_name(pin)); | 417 | pin_name(pin)); |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 72069ba5f1ed..10a2d913635a 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -148,6 +148,9 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr, | |||
148 | if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT)) | 148 | if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT)) |
149 | return; | 149 | return; |
150 | 150 | ||
151 | if (boot_cpu_has(X86_FEATURE_AMDC1E)) | ||
152 | type = ACPI_STATE_C1; | ||
153 | |||
151 | /* | 154 | /* |
152 | * Check, if one of the previous states already marked the lapic | 155 | * Check, if one of the previous states already marked the lapic |
153 | * unstable | 156 | * unstable |
@@ -611,6 +614,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr) | |||
611 | switch (cx->type) { | 614 | switch (cx->type) { |
612 | case ACPI_STATE_C1: | 615 | case ACPI_STATE_C1: |
613 | cx->valid = 1; | 616 | cx->valid = 1; |
617 | acpi_timer_check_state(i, pr, cx); | ||
614 | break; | 618 | break; |
615 | 619 | ||
616 | case ACPI_STATE_C2: | 620 | case ACPI_STATE_C2: |
@@ -830,11 +834,12 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev, | |||
830 | 834 | ||
831 | /* Do not access any ACPI IO ports in suspend path */ | 835 | /* Do not access any ACPI IO ports in suspend path */ |
832 | if (acpi_idle_suspend) { | 836 | if (acpi_idle_suspend) { |
833 | acpi_safe_halt(); | ||
834 | local_irq_enable(); | 837 | local_irq_enable(); |
838 | cpu_relax(); | ||
835 | return 0; | 839 | return 0; |
836 | } | 840 | } |
837 | 841 | ||
842 | acpi_state_timer_broadcast(pr, cx, 1); | ||
838 | kt1 = ktime_get_real(); | 843 | kt1 = ktime_get_real(); |
839 | acpi_idle_do_entry(cx); | 844 | acpi_idle_do_entry(cx); |
840 | kt2 = ktime_get_real(); | 845 | kt2 = ktime_get_real(); |
@@ -842,6 +847,7 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev, | |||
842 | 847 | ||
843 | local_irq_enable(); | 848 | local_irq_enable(); |
844 | cx->usage++; | 849 | cx->usage++; |
850 | acpi_state_timer_broadcast(pr, cx, 0); | ||
845 | 851 | ||
846 | return idle_time; | 852 | return idle_time; |
847 | } | 853 | } |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index cafb41000f6b..60e543d3234e 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
@@ -309,9 +309,15 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr) | |||
309 | (u32) px->bus_master_latency, | 309 | (u32) px->bus_master_latency, |
310 | (u32) px->control, (u32) px->status)); | 310 | (u32) px->control, (u32) px->status)); |
311 | 311 | ||
312 | if (!px->core_frequency) { | 312 | /* |
313 | printk(KERN_ERR PREFIX | 313 | * Check that ACPI's u64 MHz will be valid as u32 KHz in cpufreq |
314 | "Invalid _PSS data: freq is zero\n"); | 314 | */ |
315 | if (!px->core_frequency || | ||
316 | ((u32)(px->core_frequency * 1000) != | ||
317 | (px->core_frequency * 1000))) { | ||
318 | printk(KERN_ERR FW_BUG PREFIX | ||
319 | "Invalid BIOS _PSS frequency: 0x%llx MHz\n", | ||
320 | px->core_frequency); | ||
315 | result = -EFAULT; | 321 | result = -EFAULT; |
316 | kfree(pr->performance->states); | 322 | kfree(pr->performance->states); |
317 | goto end; | 323 | goto end; |
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 7f16f5f8e7d3..227543789ba9 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
@@ -840,7 +840,7 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr) | |||
840 | state = acpi_get_throttling_state(pr, value); | 840 | state = acpi_get_throttling_state(pr, value); |
841 | if (state == -1) { | 841 | if (state == -1) { |
842 | ACPI_WARNING((AE_INFO, | 842 | ACPI_WARNING((AE_INFO, |
843 | "Invalid throttling state, reset\n")); | 843 | "Invalid throttling state, reset")); |
844 | state = 0; | 844 | state = 0; |
845 | ret = acpi_processor_set_throttling(pr, state); | 845 | ret = acpi_processor_set_throttling(pr, state); |
846 | if (ret) | 846 | if (ret) |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 810cca90ca7f..1bdfb37377e3 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -570,6 +570,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
570 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"), | 570 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"), |
571 | }, | 571 | }, |
572 | }, | 572 | }, |
573 | { | ||
574 | .callback = video_set_bqc_offset, | ||
575 | .ident = "eMachines E510", | ||
576 | .matches = { | ||
577 | DMI_MATCH(DMI_BOARD_VENDOR, "EMACHINES"), | ||
578 | DMI_MATCH(DMI_PRODUCT_NAME, "eMachines E510"), | ||
579 | }, | ||
580 | }, | ||
581 | { | ||
582 | .callback = video_set_bqc_offset, | ||
583 | .ident = "Acer Aspire 5315", | ||
584 | .matches = { | ||
585 | DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), | ||
586 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), | ||
587 | }, | ||
588 | }, | ||
573 | {} | 589 | {} |
574 | }; | 590 | }; |
575 | 591 | ||
@@ -2334,7 +2350,7 @@ static int __init acpi_video_init(void) | |||
2334 | return acpi_video_register(); | 2350 | return acpi_video_register(); |
2335 | } | 2351 | } |
2336 | 2352 | ||
2337 | void __exit acpi_video_exit(void) | 2353 | void acpi_video_exit(void) |
2338 | { | 2354 | { |
2339 | 2355 | ||
2340 | acpi_bus_unregister_driver(&acpi_video_bus); | 2356 | acpi_bus_unregister_driver(&acpi_video_bus); |
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index dc030f1f00f1..c6599618523e 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -700,8 +700,10 @@ int bus_add_driver(struct device_driver *drv) | |||
700 | } | 700 | } |
701 | 701 | ||
702 | kobject_uevent(&priv->kobj, KOBJ_ADD); | 702 | kobject_uevent(&priv->kobj, KOBJ_ADD); |
703 | return error; | 703 | return 0; |
704 | out_unregister: | 704 | out_unregister: |
705 | kfree(drv->p); | ||
706 | drv->p = NULL; | ||
705 | kobject_put(&priv->kobj); | 707 | kobject_put(&priv->kobj); |
706 | out_put_bus: | 708 | out_put_bus: |
707 | bus_put(bus); | 709 | bus_put(bus); |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 4aa527b8a913..1977d4beb89e 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -879,7 +879,7 @@ int device_add(struct device *dev) | |||
879 | } | 879 | } |
880 | 880 | ||
881 | if (!dev_name(dev)) | 881 | if (!dev_name(dev)) |
882 | goto done; | 882 | goto name_error; |
883 | 883 | ||
884 | pr_debug("device: '%s': %s\n", dev_name(dev), __func__); | 884 | pr_debug("device: '%s': %s\n", dev_name(dev), __func__); |
885 | 885 | ||
@@ -978,6 +978,9 @@ done: | |||
978 | cleanup_device_parent(dev); | 978 | cleanup_device_parent(dev); |
979 | if (parent) | 979 | if (parent) |
980 | put_device(parent); | 980 | put_device(parent); |
981 | name_error: | ||
982 | kfree(dev->p); | ||
983 | dev->p = NULL; | ||
981 | goto done; | 984 | goto done; |
982 | } | 985 | } |
983 | 986 | ||
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index c51f11bb29ae..8ae0f63602e0 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c | |||
@@ -257,6 +257,10 @@ EXPORT_SYMBOL_GPL(driver_register); | |||
257 | */ | 257 | */ |
258 | void driver_unregister(struct device_driver *drv) | 258 | void driver_unregister(struct device_driver *drv) |
259 | { | 259 | { |
260 | if (!drv || !drv->p) { | ||
261 | WARN(1, "Unexpected driver unregister!\n"); | ||
262 | return; | ||
263 | } | ||
260 | driver_remove_groups(drv, drv->groups); | 264 | driver_remove_groups(drv, drv->groups); |
261 | bus_remove_driver(drv); | 265 | bus_remove_driver(drv); |
262 | } | 266 | } |
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 340ba4f9dc54..4a9f3492b921 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -224,7 +224,7 @@ static void hpet_timer_set_irq(struct hpet_dev *devp) | |||
224 | break; | 224 | break; |
225 | } | 225 | } |
226 | 226 | ||
227 | gsi = acpi_register_gsi(irq, ACPI_LEVEL_SENSITIVE, | 227 | gsi = acpi_register_gsi(NULL, irq, ACPI_LEVEL_SENSITIVE, |
228 | ACPI_ACTIVE_LOW); | 228 | ACPI_ACTIVE_LOW); |
229 | if (gsi > 0) | 229 | if (gsi > 0) |
230 | break; | 230 | break; |
@@ -939,7 +939,7 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data) | |||
939 | irqp = &res->data.extended_irq; | 939 | irqp = &res->data.extended_irq; |
940 | 940 | ||
941 | for (i = 0; i < irqp->interrupt_count; i++) { | 941 | for (i = 0; i < irqp->interrupt_count; i++) { |
942 | irq = acpi_register_gsi(irqp->interrupts[i], | 942 | irq = acpi_register_gsi(NULL, irqp->interrupts[i], |
943 | irqp->triggering, irqp->polarity); | 943 | irqp->triggering, irqp->polarity); |
944 | if (irq < 0) | 944 | if (irq < 0) |
945 | return AE_ERROR; | 945 | return AE_ERROR; |
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index da8a8ed9e411..f18d1bde0439 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c | |||
@@ -179,9 +179,14 @@ static void dma_halt(struct fsl_dma_chan *fsl_chan) | |||
179 | static void set_ld_eol(struct fsl_dma_chan *fsl_chan, | 179 | static void set_ld_eol(struct fsl_dma_chan *fsl_chan, |
180 | struct fsl_desc_sw *desc) | 180 | struct fsl_desc_sw *desc) |
181 | { | 181 | { |
182 | u64 snoop_bits; | ||
183 | |||
184 | snoop_bits = ((fsl_chan->feature & FSL_DMA_IP_MASK) == FSL_DMA_IP_83XX) | ||
185 | ? FSL_DMA_SNEN : 0; | ||
186 | |||
182 | desc->hw.next_ln_addr = CPU_TO_DMA(fsl_chan, | 187 | desc->hw.next_ln_addr = CPU_TO_DMA(fsl_chan, |
183 | DMA_TO_CPU(fsl_chan, desc->hw.next_ln_addr, 64) | FSL_DMA_EOL, | 188 | DMA_TO_CPU(fsl_chan, desc->hw.next_ln_addr, 64) | FSL_DMA_EOL |
184 | 64); | 189 | | snoop_bits, 64); |
185 | } | 190 | } |
186 | 191 | ||
187 | static void append_ld_queue(struct fsl_dma_chan *fsl_chan, | 192 | static void append_ld_queue(struct fsl_dma_chan *fsl_chan, |
@@ -313,8 +318,8 @@ static void fsl_chan_toggle_ext_start(struct fsl_dma_chan *fsl_chan, int enable) | |||
313 | 318 | ||
314 | static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx) | 319 | static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx) |
315 | { | 320 | { |
316 | struct fsl_desc_sw *desc = tx_to_fsl_desc(tx); | ||
317 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(tx->chan); | 321 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(tx->chan); |
322 | struct fsl_desc_sw *desc; | ||
318 | unsigned long flags; | 323 | unsigned long flags; |
319 | dma_cookie_t cookie; | 324 | dma_cookie_t cookie; |
320 | 325 | ||
@@ -322,14 +327,17 @@ static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx) | |||
322 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | 327 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); |
323 | 328 | ||
324 | cookie = fsl_chan->common.cookie; | 329 | cookie = fsl_chan->common.cookie; |
325 | cookie++; | 330 | list_for_each_entry(desc, &tx->tx_list, node) { |
326 | if (cookie < 0) | 331 | cookie++; |
327 | cookie = 1; | 332 | if (cookie < 0) |
328 | desc->async_tx.cookie = cookie; | 333 | cookie = 1; |
329 | fsl_chan->common.cookie = desc->async_tx.cookie; | ||
330 | 334 | ||
331 | append_ld_queue(fsl_chan, desc); | 335 | desc->async_tx.cookie = cookie; |
332 | list_splice_init(&desc->async_tx.tx_list, fsl_chan->ld_queue.prev); | 336 | } |
337 | |||
338 | fsl_chan->common.cookie = cookie; | ||
339 | append_ld_queue(fsl_chan, tx_to_fsl_desc(tx)); | ||
340 | list_splice_init(&tx->tx_list, fsl_chan->ld_queue.prev); | ||
333 | 341 | ||
334 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | 342 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); |
335 | 343 | ||
@@ -454,8 +462,8 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy( | |||
454 | { | 462 | { |
455 | struct fsl_dma_chan *fsl_chan; | 463 | struct fsl_dma_chan *fsl_chan; |
456 | struct fsl_desc_sw *first = NULL, *prev = NULL, *new; | 464 | struct fsl_desc_sw *first = NULL, *prev = NULL, *new; |
465 | struct list_head *list; | ||
457 | size_t copy; | 466 | size_t copy; |
458 | LIST_HEAD(link_chain); | ||
459 | 467 | ||
460 | if (!chan) | 468 | if (!chan) |
461 | return NULL; | 469 | return NULL; |
@@ -472,7 +480,7 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy( | |||
472 | if (!new) { | 480 | if (!new) { |
473 | dev_err(fsl_chan->dev, | 481 | dev_err(fsl_chan->dev, |
474 | "No free memory for link descriptor\n"); | 482 | "No free memory for link descriptor\n"); |
475 | return NULL; | 483 | goto fail; |
476 | } | 484 | } |
477 | #ifdef FSL_DMA_LD_DEBUG | 485 | #ifdef FSL_DMA_LD_DEBUG |
478 | dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new); | 486 | dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new); |
@@ -507,7 +515,19 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy( | |||
507 | /* Set End-of-link to the last link descriptor of new list*/ | 515 | /* Set End-of-link to the last link descriptor of new list*/ |
508 | set_ld_eol(fsl_chan, new); | 516 | set_ld_eol(fsl_chan, new); |
509 | 517 | ||
510 | return first ? &first->async_tx : NULL; | 518 | return &first->async_tx; |
519 | |||
520 | fail: | ||
521 | if (!first) | ||
522 | return NULL; | ||
523 | |||
524 | list = &first->async_tx.tx_list; | ||
525 | list_for_each_entry_safe_reverse(new, prev, list, node) { | ||
526 | list_del(&new->node); | ||
527 | dma_pool_free(fsl_chan->desc_pool, new, new->async_tx.phys); | ||
528 | } | ||
529 | |||
530 | return NULL; | ||
511 | } | 531 | } |
512 | 532 | ||
513 | /** | 533 | /** |
@@ -598,15 +618,16 @@ static void fsl_chan_xfer_ld_queue(struct fsl_dma_chan *fsl_chan) | |||
598 | dma_addr_t next_dest_addr; | 618 | dma_addr_t next_dest_addr; |
599 | unsigned long flags; | 619 | unsigned long flags; |
600 | 620 | ||
621 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
622 | |||
601 | if (!dma_is_idle(fsl_chan)) | 623 | if (!dma_is_idle(fsl_chan)) |
602 | return; | 624 | goto out_unlock; |
603 | 625 | ||
604 | dma_halt(fsl_chan); | 626 | dma_halt(fsl_chan); |
605 | 627 | ||
606 | /* If there are some link descriptors | 628 | /* If there are some link descriptors |
607 | * not transfered in queue. We need to start it. | 629 | * not transfered in queue. We need to start it. |
608 | */ | 630 | */ |
609 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
610 | 631 | ||
611 | /* Find the first un-transfer desciptor */ | 632 | /* Find the first un-transfer desciptor */ |
612 | for (ld_node = fsl_chan->ld_queue.next; | 633 | for (ld_node = fsl_chan->ld_queue.next; |
@@ -617,19 +638,20 @@ static void fsl_chan_xfer_ld_queue(struct fsl_dma_chan *fsl_chan) | |||
617 | fsl_chan->common.cookie) == DMA_SUCCESS); | 638 | fsl_chan->common.cookie) == DMA_SUCCESS); |
618 | ld_node = ld_node->next); | 639 | ld_node = ld_node->next); |
619 | 640 | ||
620 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
621 | |||
622 | if (ld_node != &fsl_chan->ld_queue) { | 641 | if (ld_node != &fsl_chan->ld_queue) { |
623 | /* Get the ld start address from ld_queue */ | 642 | /* Get the ld start address from ld_queue */ |
624 | next_dest_addr = to_fsl_desc(ld_node)->async_tx.phys; | 643 | next_dest_addr = to_fsl_desc(ld_node)->async_tx.phys; |
625 | dev_dbg(fsl_chan->dev, "xfer LDs staring from %p\n", | 644 | dev_dbg(fsl_chan->dev, "xfer LDs staring from 0x%llx\n", |
626 | (void *)next_dest_addr); | 645 | (unsigned long long)next_dest_addr); |
627 | set_cdar(fsl_chan, next_dest_addr); | 646 | set_cdar(fsl_chan, next_dest_addr); |
628 | dma_start(fsl_chan); | 647 | dma_start(fsl_chan); |
629 | } else { | 648 | } else { |
630 | set_cdar(fsl_chan, 0); | 649 | set_cdar(fsl_chan, 0); |
631 | set_ndar(fsl_chan, 0); | 650 | set_ndar(fsl_chan, 0); |
632 | } | 651 | } |
652 | |||
653 | out_unlock: | ||
654 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
633 | } | 655 | } |
634 | 656 | ||
635 | /** | 657 | /** |
@@ -734,8 +756,9 @@ static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data) | |||
734 | */ | 756 | */ |
735 | if (stat & FSL_DMA_SR_EOSI) { | 757 | if (stat & FSL_DMA_SR_EOSI) { |
736 | dev_dbg(fsl_chan->dev, "event: End-of-segments INT\n"); | 758 | dev_dbg(fsl_chan->dev, "event: End-of-segments INT\n"); |
737 | dev_dbg(fsl_chan->dev, "event: clndar %p, nlndar %p\n", | 759 | dev_dbg(fsl_chan->dev, "event: clndar 0x%llx, nlndar 0x%llx\n", |
738 | (void *)get_cdar(fsl_chan), (void *)get_ndar(fsl_chan)); | 760 | (unsigned long long)get_cdar(fsl_chan), |
761 | (unsigned long long)get_ndar(fsl_chan)); | ||
739 | stat &= ~FSL_DMA_SR_EOSI; | 762 | stat &= ~FSL_DMA_SR_EOSI; |
740 | update_cookie = 1; | 763 | update_cookie = 1; |
741 | } | 764 | } |
@@ -830,7 +853,7 @@ static int __devinit fsl_dma_chan_probe(struct fsl_dma_device *fdev, | |||
830 | new_fsl_chan->reg.end - new_fsl_chan->reg.start + 1); | 853 | new_fsl_chan->reg.end - new_fsl_chan->reg.start + 1); |
831 | 854 | ||
832 | new_fsl_chan->id = ((new_fsl_chan->reg.start - 0x100) & 0xfff) >> 7; | 855 | new_fsl_chan->id = ((new_fsl_chan->reg.start - 0x100) & 0xfff) >> 7; |
833 | if (new_fsl_chan->id > FSL_DMA_MAX_CHANS_PER_DEVICE) { | 856 | if (new_fsl_chan->id >= FSL_DMA_MAX_CHANS_PER_DEVICE) { |
834 | dev_err(fdev->dev, "There is no %d channel!\n", | 857 | dev_err(fdev->dev, "There is no %d channel!\n", |
835 | new_fsl_chan->id); | 858 | new_fsl_chan->id); |
836 | err = -EINVAL; | 859 | err = -EINVAL; |
@@ -925,8 +948,8 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev, | |||
925 | } | 948 | } |
926 | 949 | ||
927 | dev_info(&dev->dev, "Probe the Freescale DMA driver for %s " | 950 | dev_info(&dev->dev, "Probe the Freescale DMA driver for %s " |
928 | "controller at %p...\n", | 951 | "controller at 0x%llx...\n", |
929 | match->compatible, (void *)fdev->reg.start); | 952 | match->compatible, (unsigned long long)fdev->reg.start); |
930 | fdev->reg_base = ioremap(fdev->reg.start, fdev->reg.end | 953 | fdev->reg_base = ioremap(fdev->reg.start, fdev->reg.end |
931 | - fdev->reg.start + 1); | 954 | - fdev->reg.start + 1); |
932 | 955 | ||
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c index 1955ee8d6d20..a600fc0f7962 100644 --- a/drivers/dma/ioat_dma.c +++ b/drivers/dma/ioat_dma.c | |||
@@ -173,7 +173,7 @@ static int ioat_dma_enumerate_channels(struct ioatdma_device *device) | |||
173 | xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale)); | 173 | xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale)); |
174 | 174 | ||
175 | #ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL | 175 | #ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL |
176 | if (i7300_idle_platform_probe(NULL, NULL) == 0) { | 176 | if (i7300_idle_platform_probe(NULL, NULL, 1) == 0) { |
177 | device->common.chancnt--; | 177 | device->common.chancnt--; |
178 | } | 178 | } |
179 | #endif | 179 | #endif |
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index e5f5c5a8ba6c..956982f8739b 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
@@ -192,16 +192,20 @@ config EDAC_PPC4XX | |||
192 | 192 | ||
193 | config EDAC_AMD8131 | 193 | config EDAC_AMD8131 |
194 | tristate "AMD8131 HyperTransport PCI-X Tunnel" | 194 | tristate "AMD8131 HyperTransport PCI-X Tunnel" |
195 | depends on EDAC_MM_EDAC && PCI | 195 | depends on EDAC_MM_EDAC && PCI && PPC_MAPLE |
196 | help | 196 | help |
197 | Support for error detection and correction on the | 197 | Support for error detection and correction on the |
198 | AMD8131 HyperTransport PCI-X Tunnel chip. | 198 | AMD8131 HyperTransport PCI-X Tunnel chip. |
199 | Note, add more Kconfig dependency if it's adopted | ||
200 | on some machine other than Maple. | ||
199 | 201 | ||
200 | config EDAC_AMD8111 | 202 | config EDAC_AMD8111 |
201 | tristate "AMD8111 HyperTransport I/O Hub" | 203 | tristate "AMD8111 HyperTransport I/O Hub" |
202 | depends on EDAC_MM_EDAC && PCI | 204 | depends on EDAC_MM_EDAC && PCI && PPC_MAPLE |
203 | help | 205 | help |
204 | Support for error detection and correction on the | 206 | Support for error detection and correction on the |
205 | AMD8111 HyperTransport I/O Hub chip. | 207 | AMD8111 HyperTransport I/O Hub chip. |
208 | Note, add more Kconfig dependency if it's adopted | ||
209 | on some machine other than Maple. | ||
206 | 210 | ||
207 | endif # EDAC | 211 | endif # EDAC |
diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile index a5fdcf02f591..59076819135d 100644 --- a/drivers/edac/Makefile +++ b/drivers/edac/Makefile | |||
@@ -35,3 +35,5 @@ obj-$(CONFIG_EDAC_MPC85XX) += mpc85xx_edac.o | |||
35 | obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o | 35 | obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o |
36 | obj-$(CONFIG_EDAC_CELL) += cell_edac.o | 36 | obj-$(CONFIG_EDAC_CELL) += cell_edac.o |
37 | obj-$(CONFIG_EDAC_PPC4XX) += ppc4xx_edac.o | 37 | obj-$(CONFIG_EDAC_PPC4XX) += ppc4xx_edac.o |
38 | obj-$(CONFIG_EDAC_AMD8111) += amd8111_edac.o | ||
39 | obj-$(CONFIG_EDAC_AMD8131) += amd8131_edac.o | ||
diff --git a/drivers/edac/amd8111_edac.c b/drivers/edac/amd8111_edac.c index 614692181120..2cb58ef743e0 100644 --- a/drivers/edac/amd8111_edac.c +++ b/drivers/edac/amd8111_edac.c | |||
@@ -389,7 +389,7 @@ static int amd8111_dev_probe(struct pci_dev *dev, | |||
389 | dev_info->edac_dev->dev = &dev_info->dev->dev; | 389 | dev_info->edac_dev->dev = &dev_info->dev->dev; |
390 | dev_info->edac_dev->mod_name = AMD8111_EDAC_MOD_STR; | 390 | dev_info->edac_dev->mod_name = AMD8111_EDAC_MOD_STR; |
391 | dev_info->edac_dev->ctl_name = dev_info->ctl_name; | 391 | dev_info->edac_dev->ctl_name = dev_info->ctl_name; |
392 | dev_info->edac_dev->dev_name = dev_info->dev->dev.bus_id; | 392 | dev_info->edac_dev->dev_name = dev_name(&dev_info->dev->dev); |
393 | 393 | ||
394 | if (edac_op_state == EDAC_OPSTATE_POLL) | 394 | if (edac_op_state == EDAC_OPSTATE_POLL) |
395 | dev_info->edac_dev->edac_check = dev_info->check; | 395 | dev_info->edac_dev->edac_check = dev_info->check; |
@@ -473,7 +473,7 @@ static int amd8111_pci_probe(struct pci_dev *dev, | |||
473 | pci_info->edac_dev->dev = &pci_info->dev->dev; | 473 | pci_info->edac_dev->dev = &pci_info->dev->dev; |
474 | pci_info->edac_dev->mod_name = AMD8111_EDAC_MOD_STR; | 474 | pci_info->edac_dev->mod_name = AMD8111_EDAC_MOD_STR; |
475 | pci_info->edac_dev->ctl_name = pci_info->ctl_name; | 475 | pci_info->edac_dev->ctl_name = pci_info->ctl_name; |
476 | pci_info->edac_dev->dev_name = pci_info->dev->dev.bus_id; | 476 | pci_info->edac_dev->dev_name = dev_name(&pci_info->dev->dev); |
477 | 477 | ||
478 | if (edac_op_state == EDAC_OPSTATE_POLL) | 478 | if (edac_op_state == EDAC_OPSTATE_POLL) |
479 | pci_info->edac_dev->edac_check = pci_info->check; | 479 | pci_info->edac_dev->edac_check = pci_info->check; |
diff --git a/drivers/edac/amd8131_edac.c b/drivers/edac/amd8131_edac.c index c083b31cac5a..b432d60c622a 100644 --- a/drivers/edac/amd8131_edac.c +++ b/drivers/edac/amd8131_edac.c | |||
@@ -287,7 +287,7 @@ static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
287 | dev_info->edac_dev->dev = &dev_info->dev->dev; | 287 | dev_info->edac_dev->dev = &dev_info->dev->dev; |
288 | dev_info->edac_dev->mod_name = AMD8131_EDAC_MOD_STR; | 288 | dev_info->edac_dev->mod_name = AMD8131_EDAC_MOD_STR; |
289 | dev_info->edac_dev->ctl_name = dev_info->ctl_name; | 289 | dev_info->edac_dev->ctl_name = dev_info->ctl_name; |
290 | dev_info->edac_dev->dev_name = dev_info->dev->dev.bus_id; | 290 | dev_info->edac_dev->dev_name = dev_name(&dev_info->dev->dev); |
291 | 291 | ||
292 | if (edac_op_state == EDAC_OPSTATE_POLL) | 292 | if (edac_op_state == EDAC_OPSTATE_POLL) |
293 | dev_info->edac_dev->edac_check = amd8131_chipset.check; | 293 | dev_info->edac_dev->edac_check = amd8131_chipset.check; |
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 4cd35d8fd799..f5d46e7199d4 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig | |||
@@ -67,12 +67,18 @@ config DRM_I830 | |||
67 | will load the correct one. | 67 | will load the correct one. |
68 | 68 | ||
69 | config DRM_I915 | 69 | config DRM_I915 |
70 | tristate "i915 driver" | ||
70 | select FB_CFB_FILLRECT | 71 | select FB_CFB_FILLRECT |
71 | select FB_CFB_COPYAREA | 72 | select FB_CFB_COPYAREA |
72 | select FB_CFB_IMAGEBLIT | 73 | select FB_CFB_IMAGEBLIT |
73 | select FB | 74 | select FB |
74 | select FRAMEBUFFER_CONSOLE if !EMBEDDED | 75 | select FRAMEBUFFER_CONSOLE if !EMBEDDED |
75 | tristate "i915 driver" | 76 | # i915 depends on ACPI_VIDEO when ACPI is enabled |
77 | # but for select to work, need to select ACPI_VIDEO's dependencies, ick | ||
78 | select VIDEO_OUTPUT_CONTROL if ACPI | ||
79 | select BACKLIGHT_CLASS_DEVICE if ACPI | ||
80 | select INPUT if ACPI | ||
81 | select ACPI_VIDEO if ACPI | ||
76 | help | 82 | help |
77 | Choose this option if you have a system that has Intel 830M, 845G, | 83 | Choose this option if you have a system that has Intel 830M, 845G, |
78 | 852GM, 855GM 865G or 915G integrated graphics. If M is selected, the | 84 | 852GM, 855GM 865G or 915G integrated graphics. If M is selected, the |
@@ -84,12 +90,6 @@ config DRM_I915 | |||
84 | config DRM_I915_KMS | 90 | config DRM_I915_KMS |
85 | bool "Enable modesetting on intel by default" | 91 | bool "Enable modesetting on intel by default" |
86 | depends on DRM_I915 | 92 | depends on DRM_I915 |
87 | # i915 KMS depends on ACPI_VIDEO when ACPI is enabled | ||
88 | # but for select to work, need to select ACPI_VIDEO's dependencies, ick | ||
89 | select VIDEO_OUTPUT_CONTROL if ACPI | ||
90 | select BACKLIGHT_CLASS_DEVICE if ACPI | ||
91 | select INPUT if ACPI | ||
92 | select ACPI_VIDEO if ACPI | ||
93 | help | 93 | help |
94 | Choose this option if you want kernel modesetting enabled by default, | 94 | Choose this option if you want kernel modesetting enabled by default, |
95 | and you have a new enough userspace to support this. Running old | 95 | and you have a new enough userspace to support this. Running old |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 717b6a854bcd..670d12881468 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1145,6 +1145,13 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1145 | mutex_unlock(&dev->struct_mutex); | 1145 | mutex_unlock(&dev->struct_mutex); |
1146 | return VM_FAULT_SIGBUS; | 1146 | return VM_FAULT_SIGBUS; |
1147 | } | 1147 | } |
1148 | |||
1149 | ret = i915_gem_object_set_to_gtt_domain(obj, write); | ||
1150 | if (ret) { | ||
1151 | mutex_unlock(&dev->struct_mutex); | ||
1152 | return VM_FAULT_SIGBUS; | ||
1153 | } | ||
1154 | |||
1148 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); | 1155 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); |
1149 | } | 1156 | } |
1150 | 1157 | ||
@@ -2128,8 +2135,10 @@ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) | |||
2128 | return; | 2135 | return; |
2129 | } | 2136 | } |
2130 | 2137 | ||
2131 | pitch_val = (obj_priv->stride / 128) - 1; | 2138 | pitch_val = obj_priv->stride / 128; |
2132 | WARN_ON(pitch_val & ~0x0000000f); | 2139 | pitch_val = ffs(pitch_val) - 1; |
2140 | WARN_ON(pitch_val > I830_FENCE_MAX_PITCH_VAL); | ||
2141 | |||
2133 | val = obj_priv->gtt_offset; | 2142 | val = obj_priv->gtt_offset; |
2134 | if (obj_priv->tiling_mode == I915_TILING_Y) | 2143 | if (obj_priv->tiling_mode == I915_TILING_Y) |
2135 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; | 2144 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; |
@@ -2421,6 +2430,16 @@ i915_gem_clflush_object(struct drm_gem_object *obj) | |||
2421 | if (obj_priv->pages == NULL) | 2430 | if (obj_priv->pages == NULL) |
2422 | return; | 2431 | return; |
2423 | 2432 | ||
2433 | /* XXX: The 865 in particular appears to be weird in how it handles | ||
2434 | * cache flushing. We haven't figured it out, but the | ||
2435 | * clflush+agp_chipset_flush doesn't appear to successfully get the | ||
2436 | * data visible to the PGU, while wbinvd + agp_chipset_flush does. | ||
2437 | */ | ||
2438 | if (IS_I865G(obj->dev)) { | ||
2439 | wbinvd(); | ||
2440 | return; | ||
2441 | } | ||
2442 | |||
2424 | drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); | 2443 | drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); |
2425 | } | 2444 | } |
2426 | 2445 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 52a059354e83..540dd336e6ec 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
@@ -213,7 +213,8 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
213 | if (tiling_mode == I915_TILING_NONE) | 213 | if (tiling_mode == I915_TILING_NONE) |
214 | return true; | 214 | return true; |
215 | 215 | ||
216 | if (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) | 216 | if (!IS_I9XX(dev) || |
217 | (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) | ||
217 | tile_width = 128; | 218 | tile_width = 128; |
218 | else | 219 | else |
219 | tile_width = 512; | 220 | tile_width = 512; |
@@ -225,11 +226,18 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
225 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) | 226 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
226 | return false; | 227 | return false; |
227 | } else if (IS_I9XX(dev)) { | 228 | } else if (IS_I9XX(dev)) { |
228 | if (stride / tile_width > I830_FENCE_MAX_PITCH_VAL || | 229 | uint32_t pitch_val = ffs(stride / tile_width) - 1; |
230 | |||
231 | /* XXX: For Y tiling, FENCE_MAX_PITCH_VAL is actually 6 (8KB) | ||
232 | * instead of 4 (2KB) on 945s. | ||
233 | */ | ||
234 | if (pitch_val > I915_FENCE_MAX_PITCH_VAL || | ||
229 | size > (I830_FENCE_MAX_SIZE_VAL << 20)) | 235 | size > (I830_FENCE_MAX_SIZE_VAL << 20)) |
230 | return false; | 236 | return false; |
231 | } else { | 237 | } else { |
232 | if (stride / 128 > I830_FENCE_MAX_PITCH_VAL || | 238 | uint32_t pitch_val = ffs(stride / tile_width) - 1; |
239 | |||
240 | if (pitch_val > I830_FENCE_MAX_PITCH_VAL || | ||
233 | size > (I830_FENCE_MAX_SIZE_VAL << 19)) | 241 | size > (I830_FENCE_MAX_SIZE_VAL << 19)) |
234 | return false; | 242 | return false; |
235 | } | 243 | } |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 9668cc0d7f4e..375569d01d01 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -190,7 +190,8 @@ | |||
190 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) | 190 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) |
191 | #define I830_FENCE_PITCH_SHIFT 4 | 191 | #define I830_FENCE_PITCH_SHIFT 4 |
192 | #define I830_FENCE_REG_VALID (1<<0) | 192 | #define I830_FENCE_REG_VALID (1<<0) |
193 | #define I830_FENCE_MAX_PITCH_VAL 0x10 | 193 | #define I915_FENCE_MAX_PITCH_VAL 0x10 |
194 | #define I830_FENCE_MAX_PITCH_VAL 6 | ||
194 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) | 195 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) |
195 | 196 | ||
196 | #define I915_FENCE_START_MASK 0x0ff00000 | 197 | #define I915_FENCE_START_MASK 0x0ff00000 |
diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c index b5e3b2851698..a1787fdf5b9f 100644 --- a/drivers/hwmon/lm78.c +++ b/drivers/hwmon/lm78.c | |||
@@ -182,7 +182,7 @@ static struct platform_driver lm78_isa_driver = { | |||
182 | .name = "lm78", | 182 | .name = "lm78", |
183 | }, | 183 | }, |
184 | .probe = lm78_isa_probe, | 184 | .probe = lm78_isa_probe, |
185 | .remove = lm78_isa_remove, | 185 | .remove = __devexit_p(lm78_isa_remove), |
186 | }; | 186 | }; |
187 | 187 | ||
188 | 188 | ||
diff --git a/drivers/ide/ide-pci-generic.c b/drivers/ide/ide-pci-generic.c index 61111fd27130..39d4e01f5c9c 100644 --- a/drivers/ide/ide-pci-generic.c +++ b/drivers/ide/ide-pci-generic.c | |||
@@ -33,6 +33,16 @@ static int ide_generic_all; /* Set to claim all devices */ | |||
33 | module_param_named(all_generic_ide, ide_generic_all, bool, 0444); | 33 | module_param_named(all_generic_ide, ide_generic_all, bool, 0444); |
34 | MODULE_PARM_DESC(all_generic_ide, "IDE generic will claim all unknown PCI IDE storage controllers."); | 34 | MODULE_PARM_DESC(all_generic_ide, "IDE generic will claim all unknown PCI IDE storage controllers."); |
35 | 35 | ||
36 | static void netcell_quirkproc(ide_drive_t *drive) | ||
37 | { | ||
38 | /* mark words 85-87 as valid */ | ||
39 | drive->id[ATA_ID_CSF_DEFAULT] |= 0x4000; | ||
40 | } | ||
41 | |||
42 | static const struct ide_port_ops netcell_port_ops = { | ||
43 | .quirkproc = netcell_quirkproc, | ||
44 | }; | ||
45 | |||
36 | #define DECLARE_GENERIC_PCI_DEV(extra_flags) \ | 46 | #define DECLARE_GENERIC_PCI_DEV(extra_flags) \ |
37 | { \ | 47 | { \ |
38 | .name = DRV_NAME, \ | 48 | .name = DRV_NAME, \ |
@@ -74,6 +84,7 @@ static const struct ide_port_info generic_chipsets[] __devinitdata = { | |||
74 | 84 | ||
75 | { /* 6: Revolution */ | 85 | { /* 6: Revolution */ |
76 | .name = DRV_NAME, | 86 | .name = DRV_NAME, |
87 | .port_ops = &netcell_port_ops, | ||
77 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | | 88 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | |
78 | IDE_HFLAG_TRUST_BIOS_FOR_DMA | | 89 | IDE_HFLAG_TRUST_BIOS_FOR_DMA | |
79 | IDE_HFLAG_OFF_BOARD, | 90 | IDE_HFLAG_OFF_BOARD, |
diff --git a/drivers/idle/i7300_idle.c b/drivers/idle/i7300_idle.c index bf740394d704..949c97ff57e3 100644 --- a/drivers/idle/i7300_idle.c +++ b/drivers/idle/i7300_idle.c | |||
@@ -41,6 +41,10 @@ static int debug; | |||
41 | module_param_named(debug, debug, uint, 0644); | 41 | module_param_named(debug, debug, uint, 0644); |
42 | MODULE_PARM_DESC(debug, "Enable debug printks in this driver"); | 42 | MODULE_PARM_DESC(debug, "Enable debug printks in this driver"); |
43 | 43 | ||
44 | static int forceload; | ||
45 | module_param_named(forceload, forceload, uint, 0644); | ||
46 | MODULE_PARM_DESC(debug, "Enable driver testing on unvalidated i5000"); | ||
47 | |||
44 | #define dprintk(fmt, arg...) \ | 48 | #define dprintk(fmt, arg...) \ |
45 | do { if (debug) printk(KERN_INFO I7300_PRINT fmt, ##arg); } while (0) | 49 | do { if (debug) printk(KERN_INFO I7300_PRINT fmt, ##arg); } while (0) |
46 | 50 | ||
@@ -552,7 +556,7 @@ static int __init i7300_idle_init(void) | |||
552 | cpus_clear(idle_cpumask); | 556 | cpus_clear(idle_cpumask); |
553 | total_us = 0; | 557 | total_us = 0; |
554 | 558 | ||
555 | if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev)) | 559 | if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev, forceload)) |
556 | return -ENODEV; | 560 | return -ENODEV; |
557 | 561 | ||
558 | if (i7300_idle_thrt_save()) | 562 | if (i7300_idle_thrt_save()) |
diff --git a/drivers/input/input.c b/drivers/input/input.c index e54e002665b0..5d445f48789b 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -42,6 +42,7 @@ static unsigned int input_abs_bypass_init_data[] __initdata = { | |||
42 | ABS_MT_POSITION_Y, | 42 | ABS_MT_POSITION_Y, |
43 | ABS_MT_TOOL_TYPE, | 43 | ABS_MT_TOOL_TYPE, |
44 | ABS_MT_BLOB_ID, | 44 | ABS_MT_BLOB_ID, |
45 | ABS_MT_TRACKING_ID, | ||
45 | 0 | 46 | 0 |
46 | }; | 47 | }; |
47 | static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)]; | 48 | static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)]; |
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index 67248c31e19a..be5bbbb8ae4e 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c | |||
@@ -210,7 +210,7 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) | |||
210 | timeout = wait_event_timeout(ps2dev->wait, | 210 | timeout = wait_event_timeout(ps2dev->wait, |
211 | !(ps2dev->flags & PS2_FLAG_CMD1), timeout); | 211 | !(ps2dev->flags & PS2_FLAG_CMD1), timeout); |
212 | 212 | ||
213 | if (ps2dev->cmdcnt && timeout > 0) { | 213 | if (ps2dev->cmdcnt && !(ps2dev->flags & PS2_FLAG_CMD1)) { |
214 | 214 | ||
215 | timeout = ps2_adjust_timeout(ps2dev, command, timeout); | 215 | timeout = ps2_adjust_timeout(ps2dev, command, timeout); |
216 | wait_event_timeout(ps2dev->wait, | 216 | wait_event_timeout(ps2dev->wait, |
diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c index f100c7f4c1db..6954f5500108 100644 --- a/drivers/input/touchscreen/ucb1400_ts.c +++ b/drivers/input/touchscreen/ucb1400_ts.c | |||
@@ -419,7 +419,7 @@ static int ucb1400_ts_remove(struct platform_device *dev) | |||
419 | #ifdef CONFIG_PM | 419 | #ifdef CONFIG_PM |
420 | static int ucb1400_ts_resume(struct platform_device *dev) | 420 | static int ucb1400_ts_resume(struct platform_device *dev) |
421 | { | 421 | { |
422 | struct ucb1400_ts *ucb = platform_get_drvdata(dev); | 422 | struct ucb1400_ts *ucb = dev->dev.platform_data; |
423 | 423 | ||
424 | if (ucb->ts_task) { | 424 | if (ucb->ts_task) { |
425 | /* | 425 | /* |
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index f3548d048014..40c26080ecda 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
@@ -831,6 +831,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
831 | break; | 831 | break; |
832 | 832 | ||
833 | case NAND_CMD_READID: | 833 | case NAND_CMD_READID: |
834 | host->col_addr = 0; | ||
834 | send_read_id(host); | 835 | send_read_id(host); |
835 | break; | 836 | break; |
836 | 837 | ||
@@ -867,6 +868,7 @@ static int __init mxcnd_probe(struct platform_device *pdev) | |||
867 | mtd->priv = this; | 868 | mtd->priv = this; |
868 | mtd->owner = THIS_MODULE; | 869 | mtd->owner = THIS_MODULE; |
869 | mtd->dev.parent = &pdev->dev; | 870 | mtd->dev.parent = &pdev->dev; |
871 | mtd->name = "mxc_nand"; | ||
870 | 872 | ||
871 | /* 50 us command delay time */ | 873 | /* 50 us command delay time */ |
872 | this->chip_delay = 5; | 874 | this->chip_delay = 5; |
@@ -882,8 +884,10 @@ static int __init mxcnd_probe(struct platform_device *pdev) | |||
882 | this->verify_buf = mxc_nand_verify_buf; | 884 | this->verify_buf = mxc_nand_verify_buf; |
883 | 885 | ||
884 | host->clk = clk_get(&pdev->dev, "nfc"); | 886 | host->clk = clk_get(&pdev->dev, "nfc"); |
885 | if (IS_ERR(host->clk)) | 887 | if (IS_ERR(host->clk)) { |
888 | err = PTR_ERR(host->clk); | ||
886 | goto eclk; | 889 | goto eclk; |
890 | } | ||
887 | 891 | ||
888 | clk_enable(host->clk); | 892 | clk_enable(host->clk); |
889 | host->clk_act = 1; | 893 | host->clk_act = 1; |
@@ -896,7 +900,7 @@ static int __init mxcnd_probe(struct platform_device *pdev) | |||
896 | 900 | ||
897 | host->regs = ioremap(res->start, res->end - res->start + 1); | 901 | host->regs = ioremap(res->start, res->end - res->start + 1); |
898 | if (!host->regs) { | 902 | if (!host->regs) { |
899 | err = -EIO; | 903 | err = -ENOMEM; |
900 | goto eres; | 904 | goto eres; |
901 | } | 905 | } |
902 | 906 | ||
@@ -1011,30 +1015,35 @@ static int __devexit mxcnd_remove(struct platform_device *pdev) | |||
1011 | #ifdef CONFIG_PM | 1015 | #ifdef CONFIG_PM |
1012 | static int mxcnd_suspend(struct platform_device *pdev, pm_message_t state) | 1016 | static int mxcnd_suspend(struct platform_device *pdev, pm_message_t state) |
1013 | { | 1017 | { |
1014 | struct mtd_info *info = platform_get_drvdata(pdev); | 1018 | struct mtd_info *mtd = platform_get_drvdata(pdev); |
1019 | struct nand_chip *nand_chip = mtd->priv; | ||
1020 | struct mxc_nand_host *host = nand_chip->priv; | ||
1015 | int ret = 0; | 1021 | int ret = 0; |
1016 | 1022 | ||
1017 | DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND : NAND suspend\n"); | 1023 | DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND : NAND suspend\n"); |
1018 | if (info) | 1024 | if (mtd) { |
1019 | ret = info->suspend(info); | 1025 | ret = mtd->suspend(mtd); |
1020 | 1026 | /* Disable the NFC clock */ | |
1021 | /* Disable the NFC clock */ | 1027 | clk_disable(host->clk); |
1022 | clk_disable(nfc_clk); /* FIXME */ | 1028 | } |
1023 | 1029 | ||
1024 | return ret; | 1030 | return ret; |
1025 | } | 1031 | } |
1026 | 1032 | ||
1027 | static int mxcnd_resume(struct platform_device *pdev) | 1033 | static int mxcnd_resume(struct platform_device *pdev) |
1028 | { | 1034 | { |
1029 | struct mtd_info *info = platform_get_drvdata(pdev); | 1035 | struct mtd_info *mtd = platform_get_drvdata(pdev); |
1036 | struct nand_chip *nand_chip = mtd->priv; | ||
1037 | struct mxc_nand_host *host = nand_chip->priv; | ||
1030 | int ret = 0; | 1038 | int ret = 0; |
1031 | 1039 | ||
1032 | DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND : NAND resume\n"); | 1040 | DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND : NAND resume\n"); |
1033 | /* Enable the NFC clock */ | ||
1034 | clk_enable(nfc_clk); /* FIXME */ | ||
1035 | 1041 | ||
1036 | if (info) | 1042 | if (mtd) { |
1037 | info->resume(info); | 1043 | /* Enable the NFC clock */ |
1044 | clk_enable(host->clk); | ||
1045 | mtd->resume(mtd); | ||
1046 | } | ||
1038 | 1047 | ||
1039 | return ret; | 1048 | return ret; |
1040 | } | 1049 | } |
@@ -1055,13 +1064,7 @@ static struct platform_driver mxcnd_driver = { | |||
1055 | 1064 | ||
1056 | static int __init mxc_nd_init(void) | 1065 | static int __init mxc_nd_init(void) |
1057 | { | 1066 | { |
1058 | /* Register the device driver structure. */ | 1067 | return platform_driver_probe(&mxcnd_driver, mxcnd_probe); |
1059 | pr_info("MXC MTD nand Driver\n"); | ||
1060 | if (platform_driver_probe(&mxcnd_driver, mxcnd_probe) != 0) { | ||
1061 | printk(KERN_ERR "Driver register failed for mxcnd_driver\n"); | ||
1062 | return -ENODEV; | ||
1063 | } | ||
1064 | return 0; | ||
1065 | } | 1068 | } |
1066 | 1069 | ||
1067 | static void __exit mxc_nd_cleanup(void) | 1070 | static void __exit mxc_nd_cleanup(void) |
diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c index fbb371921991..682aad897081 100644 --- a/drivers/net/3c509.c +++ b/drivers/net/3c509.c | |||
@@ -480,9 +480,13 @@ static int pnp_registered; | |||
480 | 480 | ||
481 | #ifdef CONFIG_EISA | 481 | #ifdef CONFIG_EISA |
482 | static struct eisa_device_id el3_eisa_ids[] = { | 482 | static struct eisa_device_id el3_eisa_ids[] = { |
483 | { "TCM5090" }, | ||
484 | { "TCM5091" }, | ||
483 | { "TCM5092" }, | 485 | { "TCM5092" }, |
484 | { "TCM5093" }, | 486 | { "TCM5093" }, |
487 | { "TCM5094" }, | ||
485 | { "TCM5095" }, | 488 | { "TCM5095" }, |
489 | { "TCM5098" }, | ||
486 | { "" } | 490 | { "" } |
487 | }; | 491 | }; |
488 | MODULE_DEVICE_TABLE(eisa, el3_eisa_ids); | 492 | MODULE_DEVICE_TABLE(eisa, el3_eisa_ids); |
diff --git a/drivers/net/atl1e/atl1e_main.c b/drivers/net/atl1e/atl1e_main.c index fb57b750866b..1342418fb209 100644 --- a/drivers/net/atl1e/atl1e_main.c +++ b/drivers/net/atl1e/atl1e_main.c | |||
@@ -37,6 +37,7 @@ char atl1e_driver_version[] = DRV_VERSION; | |||
37 | */ | 37 | */ |
38 | static struct pci_device_id atl1e_pci_tbl[] = { | 38 | static struct pci_device_id atl1e_pci_tbl[] = { |
39 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1E)}, | 39 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1E)}, |
40 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, 0x1066)}, | ||
40 | /* required last entry */ | 41 | /* required last entry */ |
41 | { 0 } | 42 | { 0 } |
42 | }; | 43 | }; |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 0ab22540bf59..4e817126e280 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
@@ -82,6 +82,12 @@ | |||
82 | 82 | ||
83 | #include "atl1.h" | 83 | #include "atl1.h" |
84 | 84 | ||
85 | #define ATLX_DRIVER_VERSION "2.1.3" | ||
86 | MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, \ | ||
87 | Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>"); | ||
88 | MODULE_LICENSE("GPL"); | ||
89 | MODULE_VERSION(ATLX_DRIVER_VERSION); | ||
90 | |||
85 | /* Temporary hack for merging atl1 and atl2 */ | 91 | /* Temporary hack for merging atl1 and atl2 */ |
86 | #include "atlx.c" | 92 | #include "atlx.c" |
87 | 93 | ||
diff --git a/drivers/net/atlx/atlx.h b/drivers/net/atlx/atlx.h index 297a03da6b7f..14054b75aa62 100644 --- a/drivers/net/atlx/atlx.h +++ b/drivers/net/atlx/atlx.h | |||
@@ -29,12 +29,6 @@ | |||
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | 31 | ||
32 | #define ATLX_DRIVER_VERSION "2.1.3" | ||
33 | MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, \ | ||
34 | Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>"); | ||
35 | MODULE_LICENSE("GPL"); | ||
36 | MODULE_VERSION(ATLX_DRIVER_VERSION); | ||
37 | |||
38 | #define ATLX_ERR_PHY 2 | 32 | #define ATLX_ERR_PHY 2 |
39 | #define ATLX_ERR_PHY_SPEED 7 | 33 | #define ATLX_ERR_PHY_SPEED 7 |
40 | #define ATLX_ERR_PHY_RES 8 | 34 | #define ATLX_ERR_PHY_RES 8 |
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index 9f971ed6b58d..b4da18213324 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c | |||
@@ -979,22 +979,7 @@ static int bfin_mac_open(struct net_device *dev) | |||
979 | return 0; | 979 | return 0; |
980 | } | 980 | } |
981 | 981 | ||
982 | static const struct net_device_ops bfin_mac_netdev_ops = { | ||
983 | .ndo_open = bfin_mac_open, | ||
984 | .ndo_stop = bfin_mac_close, | ||
985 | .ndo_start_xmit = bfin_mac_hard_start_xmit, | ||
986 | .ndo_set_mac_address = bfin_mac_set_mac_address, | ||
987 | .ndo_tx_timeout = bfin_mac_timeout, | ||
988 | .ndo_set_multicast_list = bfin_mac_set_multicast_list, | ||
989 | .ndo_validate_addr = eth_validate_addr, | ||
990 | .ndo_change_mtu = eth_change_mtu, | ||
991 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
992 | .ndo_poll_controller = bfin_mac_poll, | ||
993 | #endif | ||
994 | }; | ||
995 | |||
996 | /* | 982 | /* |
997 | * | ||
998 | * this makes the board clean up everything that it can | 983 | * this makes the board clean up everything that it can |
999 | * and not talk to the outside world. Caused by | 984 | * and not talk to the outside world. Caused by |
1000 | * an 'ifconfig ethX down' | 985 | * an 'ifconfig ethX down' |
@@ -1019,6 +1004,20 @@ static int bfin_mac_close(struct net_device *dev) | |||
1019 | return 0; | 1004 | return 0; |
1020 | } | 1005 | } |
1021 | 1006 | ||
1007 | static const struct net_device_ops bfin_mac_netdev_ops = { | ||
1008 | .ndo_open = bfin_mac_open, | ||
1009 | .ndo_stop = bfin_mac_close, | ||
1010 | .ndo_start_xmit = bfin_mac_hard_start_xmit, | ||
1011 | .ndo_set_mac_address = bfin_mac_set_mac_address, | ||
1012 | .ndo_tx_timeout = bfin_mac_timeout, | ||
1013 | .ndo_set_multicast_list = bfin_mac_set_multicast_list, | ||
1014 | .ndo_validate_addr = eth_validate_addr, | ||
1015 | .ndo_change_mtu = eth_change_mtu, | ||
1016 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
1017 | .ndo_poll_controller = bfin_mac_poll, | ||
1018 | #endif | ||
1019 | }; | ||
1020 | |||
1022 | static int __devinit bfin_mac_probe(struct platform_device *pdev) | 1021 | static int __devinit bfin_mac_probe(struct platform_device *pdev) |
1023 | { | 1022 | { |
1024 | struct net_device *ndev; | 1023 | struct net_device *ndev; |
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h index 714df2b675e6..c888e97c9671 100644 --- a/drivers/net/cxgb3/adapter.h +++ b/drivers/net/cxgb3/adapter.h | |||
@@ -85,8 +85,8 @@ struct fl_pg_chunk { | |||
85 | struct page *page; | 85 | struct page *page; |
86 | void *va; | 86 | void *va; |
87 | unsigned int offset; | 87 | unsigned int offset; |
88 | u64 *p_cnt; | 88 | unsigned long *p_cnt; |
89 | DECLARE_PCI_UNMAP_ADDR(mapping); | 89 | dma_addr_t mapping; |
90 | }; | 90 | }; |
91 | 91 | ||
92 | struct rx_desc; | 92 | struct rx_desc; |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 7ea48414c6cb..17858b9a5830 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -2496,14 +2496,16 @@ static void check_link_status(struct adapter *adapter) | |||
2496 | for_each_port(adapter, i) { | 2496 | for_each_port(adapter, i) { |
2497 | struct net_device *dev = adapter->port[i]; | 2497 | struct net_device *dev = adapter->port[i]; |
2498 | struct port_info *p = netdev_priv(dev); | 2498 | struct port_info *p = netdev_priv(dev); |
2499 | int link_fault; | ||
2499 | 2500 | ||
2500 | spin_lock_irq(&adapter->work_lock); | 2501 | spin_lock_irq(&adapter->work_lock); |
2501 | if (p->link_fault) { | 2502 | link_fault = p->link_fault; |
2503 | spin_unlock_irq(&adapter->work_lock); | ||
2504 | |||
2505 | if (link_fault) { | ||
2502 | t3_link_fault(adapter, i); | 2506 | t3_link_fault(adapter, i); |
2503 | spin_unlock_irq(&adapter->work_lock); | ||
2504 | continue; | 2507 | continue; |
2505 | } | 2508 | } |
2506 | spin_unlock_irq(&adapter->work_lock); | ||
2507 | 2509 | ||
2508 | if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) { | 2510 | if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) { |
2509 | t3_xgm_intr_disable(adapter, i); | 2511 | t3_xgm_intr_disable(adapter, i); |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index 26d3587f3399..b3ee2bc1a005 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -355,7 +355,7 @@ static void clear_rx_desc(struct pci_dev *pdev, const struct sge_fl *q, | |||
355 | (*d->pg_chunk.p_cnt)--; | 355 | (*d->pg_chunk.p_cnt)--; |
356 | if (!*d->pg_chunk.p_cnt) | 356 | if (!*d->pg_chunk.p_cnt) |
357 | pci_unmap_page(pdev, | 357 | pci_unmap_page(pdev, |
358 | pci_unmap_addr(&d->pg_chunk, mapping), | 358 | d->pg_chunk.mapping, |
359 | q->alloc_size, PCI_DMA_FROMDEVICE); | 359 | q->alloc_size, PCI_DMA_FROMDEVICE); |
360 | 360 | ||
361 | put_page(d->pg_chunk.page); | 361 | put_page(d->pg_chunk.page); |
@@ -454,7 +454,7 @@ static int alloc_pg_chunk(struct adapter *adapter, struct sge_fl *q, | |||
454 | q->pg_chunk.offset = 0; | 454 | q->pg_chunk.offset = 0; |
455 | mapping = pci_map_page(adapter->pdev, q->pg_chunk.page, | 455 | mapping = pci_map_page(adapter->pdev, q->pg_chunk.page, |
456 | 0, q->alloc_size, PCI_DMA_FROMDEVICE); | 456 | 0, q->alloc_size, PCI_DMA_FROMDEVICE); |
457 | pci_unmap_addr_set(&q->pg_chunk, mapping, mapping); | 457 | q->pg_chunk.mapping = mapping; |
458 | } | 458 | } |
459 | sd->pg_chunk = q->pg_chunk; | 459 | sd->pg_chunk = q->pg_chunk; |
460 | 460 | ||
@@ -511,8 +511,7 @@ static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp) | |||
511 | nomem: q->alloc_failed++; | 511 | nomem: q->alloc_failed++; |
512 | break; | 512 | break; |
513 | } | 513 | } |
514 | mapping = pci_unmap_addr(&sd->pg_chunk, mapping) + | 514 | mapping = sd->pg_chunk.mapping + sd->pg_chunk.offset; |
515 | sd->pg_chunk.offset; | ||
516 | pci_unmap_addr_set(sd, dma_addr, mapping); | 515 | pci_unmap_addr_set(sd, dma_addr, mapping); |
517 | 516 | ||
518 | add_one_rx_chunk(mapping, d, q->gen); | 517 | add_one_rx_chunk(mapping, d, q->gen); |
@@ -881,7 +880,7 @@ recycle: | |||
881 | (*sd->pg_chunk.p_cnt)--; | 880 | (*sd->pg_chunk.p_cnt)--; |
882 | if (!*sd->pg_chunk.p_cnt) | 881 | if (!*sd->pg_chunk.p_cnt) |
883 | pci_unmap_page(adap->pdev, | 882 | pci_unmap_page(adap->pdev, |
884 | pci_unmap_addr(&sd->pg_chunk, mapping), | 883 | sd->pg_chunk.mapping, |
885 | fl->alloc_size, | 884 | fl->alloc_size, |
886 | PCI_DMA_FROMDEVICE); | 885 | PCI_DMA_FROMDEVICE); |
887 | if (!skb) { | 886 | if (!skb) { |
@@ -2096,7 +2095,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
2096 | (*sd->pg_chunk.p_cnt)--; | 2095 | (*sd->pg_chunk.p_cnt)--; |
2097 | if (!*sd->pg_chunk.p_cnt) | 2096 | if (!*sd->pg_chunk.p_cnt) |
2098 | pci_unmap_page(adap->pdev, | 2097 | pci_unmap_page(adap->pdev, |
2099 | pci_unmap_addr(&sd->pg_chunk, mapping), | 2098 | sd->pg_chunk.mapping, |
2100 | fl->alloc_size, | 2099 | fl->alloc_size, |
2101 | PCI_DMA_FROMDEVICE); | 2100 | PCI_DMA_FROMDEVICE); |
2102 | 2101 | ||
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index 4f68aeb2679a..4950d5d789ae 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -1274,6 +1274,11 @@ void t3_link_fault(struct adapter *adapter, int port_id) | |||
1274 | A_XGM_INT_STATUS + mac->offset); | 1274 | A_XGM_INT_STATUS + mac->offset); |
1275 | link_fault &= F_LINKFAULTCHANGE; | 1275 | link_fault &= F_LINKFAULTCHANGE; |
1276 | 1276 | ||
1277 | link_ok = lc->link_ok; | ||
1278 | speed = lc->speed; | ||
1279 | duplex = lc->duplex; | ||
1280 | fc = lc->fc; | ||
1281 | |||
1277 | phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc); | 1282 | phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc); |
1278 | 1283 | ||
1279 | if (link_fault) { | 1284 | if (link_fault) { |
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index 0642d52aef5c..cf352961ae9b 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
@@ -259,7 +259,7 @@ extern const char gfar_driver_version[]; | |||
259 | (IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \ | 259 | (IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \ |
260 | IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \ | 260 | IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \ |
261 | | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \ | 261 | | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \ |
262 | | IEVENT_MAG) | 262 | | IEVENT_MAG | IEVENT_BABR) |
263 | 263 | ||
264 | #define IMASK_INIT_CLEAR 0x00000000 | 264 | #define IMASK_INIT_CLEAR 0x00000000 |
265 | #define IMASK_BABR 0x80000000 | 265 | #define IMASK_BABR 0x80000000 |
diff --git a/drivers/net/mac8390.c b/drivers/net/mac8390.c index f26667d5eaae..22e74a0e0361 100644 --- a/drivers/net/mac8390.c +++ b/drivers/net/mac8390.c | |||
@@ -489,7 +489,7 @@ static const struct net_device_ops mac8390_netdev_ops = { | |||
489 | .ndo_set_mac_address = eth_mac_addr, | 489 | .ndo_set_mac_address = eth_mac_addr, |
490 | .ndo_change_mtu = eth_change_mtu, | 490 | .ndo_change_mtu = eth_change_mtu, |
491 | #ifdef CONFIG_NET_POLL_CONTROLLER | 491 | #ifdef CONFIG_NET_POLL_CONTROLLER |
492 | .ndo_poll_controller = ei_poll, | 492 | .ndo_poll_controller = __ei_poll, |
493 | #endif | 493 | #endif |
494 | }; | 494 | }; |
495 | 495 | ||
diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c index ac6fc499b280..e5c98a98ad37 100644 --- a/drivers/net/mlx4/en_tx.c +++ b/drivers/net/mlx4/en_tx.c | |||
@@ -426,7 +426,7 @@ void mlx4_en_poll_tx_cq(unsigned long data) | |||
426 | 426 | ||
427 | INC_PERF_COUNTER(priv->pstats.tx_poll); | 427 | INC_PERF_COUNTER(priv->pstats.tx_poll); |
428 | 428 | ||
429 | if (!spin_trylock(&ring->comp_lock)) { | 429 | if (!spin_trylock_irq(&ring->comp_lock)) { |
430 | mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT); | 430 | mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT); |
431 | return; | 431 | return; |
432 | } | 432 | } |
@@ -439,7 +439,7 @@ void mlx4_en_poll_tx_cq(unsigned long data) | |||
439 | if (inflight && priv->port_up) | 439 | if (inflight && priv->port_up) |
440 | mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT); | 440 | mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT); |
441 | 441 | ||
442 | spin_unlock(&ring->comp_lock); | 442 | spin_unlock_irq(&ring->comp_lock); |
443 | } | 443 | } |
444 | 444 | ||
445 | static struct mlx4_en_tx_desc *mlx4_en_bounce_to_desc(struct mlx4_en_priv *priv, | 445 | static struct mlx4_en_tx_desc *mlx4_en_bounce_to_desc(struct mlx4_en_priv *priv, |
@@ -482,9 +482,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind) | |||
482 | 482 | ||
483 | /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ | 483 | /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ |
484 | if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) | 484 | if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) |
485 | if (spin_trylock(&ring->comp_lock)) { | 485 | if (spin_trylock_irq(&ring->comp_lock)) { |
486 | mlx4_en_process_tx_cq(priv->dev, cq); | 486 | mlx4_en_process_tx_cq(priv->dev, cq); |
487 | spin_unlock(&ring->comp_lock); | 487 | spin_unlock_irq(&ring->comp_lock); |
488 | } | 488 | } |
489 | } | 489 | } |
490 | 490 | ||
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index 8a0823588c51..3d94e7dfea69 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -430,6 +430,7 @@ config RTL8187 | |||
430 | ASUS P5B Deluxe | 430 | ASUS P5B Deluxe |
431 | Toshiba Satellite Pro series of laptops | 431 | Toshiba Satellite Pro series of laptops |
432 | Asus Wireless Link | 432 | Asus Wireless Link |
433 | Linksys WUSB54GC-EU | ||
433 | 434 | ||
434 | Thanks to Realtek for their support! | 435 | Thanks to Realtek for their support! |
435 | 436 | ||
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c index 744f4f4dd3d1..8d93ca4651b9 100644 --- a/drivers/net/wireless/at76c50x-usb.c +++ b/drivers/net/wireless/at76c50x-usb.c | |||
@@ -1873,18 +1873,18 @@ static void at76_dwork_hw_scan(struct work_struct *work) | |||
1873 | if (ret != CMD_STATUS_COMPLETE) { | 1873 | if (ret != CMD_STATUS_COMPLETE) { |
1874 | queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan, | 1874 | queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan, |
1875 | SCAN_POLL_INTERVAL); | 1875 | SCAN_POLL_INTERVAL); |
1876 | goto exit; | 1876 | mutex_unlock(&priv->mtx); |
1877 | return; | ||
1877 | } | 1878 | } |
1878 | 1879 | ||
1879 | ieee80211_scan_completed(priv->hw, false); | ||
1880 | |||
1881 | if (is_valid_ether_addr(priv->bssid)) | 1880 | if (is_valid_ether_addr(priv->bssid)) |
1882 | at76_join(priv); | 1881 | at76_join(priv); |
1883 | 1882 | ||
1884 | ieee80211_wake_queues(priv->hw); | ||
1885 | |||
1886 | exit: | ||
1887 | mutex_unlock(&priv->mtx); | 1883 | mutex_unlock(&priv->mtx); |
1884 | |||
1885 | ieee80211_scan_completed(priv->hw, false); | ||
1886 | |||
1887 | ieee80211_wake_queues(priv->hw); | ||
1888 | } | 1888 | } |
1889 | 1889 | ||
1890 | static int at76_hw_scan(struct ieee80211_hw *hw, | 1890 | static int at76_hw_scan(struct ieee80211_hw *hw, |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index bac6cfba6abd..d51ba0a88c23 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
@@ -71,6 +71,8 @@ static struct usb_device_id rtl8187_table[] __devinitdata = { | |||
71 | {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187}, | 71 | {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187}, |
72 | /* AirLive */ | 72 | /* AirLive */ |
73 | {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187}, | 73 | {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187}, |
74 | /* Linksys */ | ||
75 | {USB_DEVICE(0x1737, 0x0073), .driver_info = DEVICE_RTL8187B}, | ||
74 | {} | 76 | {} |
75 | }; | 77 | }; |
76 | 78 | ||
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 73348c4047e9..4a9cc92d4d18 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -702,7 +702,7 @@ static unsigned int iosapic_startup_irq(unsigned int irq) | |||
702 | } | 702 | } |
703 | 703 | ||
704 | #ifdef CONFIG_SMP | 704 | #ifdef CONFIG_SMP |
705 | static void iosapic_set_affinity_irq(unsigned int irq, | 705 | static int iosapic_set_affinity_irq(unsigned int irq, |
706 | const struct cpumask *dest) | 706 | const struct cpumask *dest) |
707 | { | 707 | { |
708 | struct vector_info *vi = iosapic_get_vector(irq); | 708 | struct vector_info *vi = iosapic_get_vector(irq); |
@@ -712,7 +712,7 @@ static void iosapic_set_affinity_irq(unsigned int irq, | |||
712 | 712 | ||
713 | dest_cpu = cpu_check_affinity(irq, dest); | 713 | dest_cpu = cpu_check_affinity(irq, dest); |
714 | if (dest_cpu < 0) | 714 | if (dest_cpu < 0) |
715 | return; | 715 | return -1; |
716 | 716 | ||
717 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(dest_cpu)); | 717 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(dest_cpu)); |
718 | vi->txn_addr = txn_affinity_addr(irq, dest_cpu); | 718 | vi->txn_addr = txn_affinity_addr(irq, dest_cpu); |
@@ -724,6 +724,8 @@ static void iosapic_set_affinity_irq(unsigned int irq, | |||
724 | iosapic_set_irt_data(vi, &dummy_d0, &d1); | 724 | iosapic_set_irt_data(vi, &dummy_d0, &d1); |
725 | iosapic_wr_irt_entry(vi, d0, d1); | 725 | iosapic_wr_irt_entry(vi, d0, d1); |
726 | spin_unlock_irqrestore(&iosapic_lock, flags); | 726 | spin_unlock_irqrestore(&iosapic_lock, flags); |
727 | |||
728 | return 0; | ||
727 | } | 729 | } |
728 | #endif | 730 | #endif |
729 | 731 | ||
diff --git a/drivers/parport/parport_gsc.c b/drivers/parport/parport_gsc.c index e6a7e847ee80..ea31a452b153 100644 --- a/drivers/parport/parport_gsc.c +++ b/drivers/parport/parport_gsc.c | |||
@@ -352,8 +352,8 @@ static int __devinit parport_init_chip(struct parisc_device *dev) | |||
352 | unsigned long port; | 352 | unsigned long port; |
353 | 353 | ||
354 | if (!dev->irq) { | 354 | if (!dev->irq) { |
355 | printk(KERN_WARNING "IRQ not found for parallel device at 0x%lx\n", | 355 | printk(KERN_WARNING "IRQ not found for parallel device at 0x%llx\n", |
356 | dev->hpa.start); | 356 | (unsigned long long)dev->hpa.start); |
357 | return -ENODEV; | 357 | return -ENODEV; |
358 | } | 358 | } |
359 | 359 | ||
diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h index 4fc168b70095..e68d5f20ffb3 100644 --- a/drivers/pci/hotplug/acpiphp.h +++ b/drivers/pci/hotplug/acpiphp.h | |||
@@ -129,7 +129,6 @@ struct acpiphp_func { | |||
129 | struct acpiphp_bridge *bridge; /* Ejectable PCI-to-PCI bridge */ | 129 | struct acpiphp_bridge *bridge; /* Ejectable PCI-to-PCI bridge */ |
130 | 130 | ||
131 | struct list_head sibling; | 131 | struct list_head sibling; |
132 | struct pci_dev *pci_dev; | ||
133 | struct notifier_block nb; | 132 | struct notifier_block nb; |
134 | acpi_handle handle; | 133 | acpi_handle handle; |
135 | 134 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index a33794d9e0dc..3a6064bce561 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -32,9 +32,6 @@ | |||
32 | 32 | ||
33 | /* | 33 | /* |
34 | * Lifetime rules for pci_dev: | 34 | * Lifetime rules for pci_dev: |
35 | * - The one in acpiphp_func has its refcount elevated by pci_get_slot() | ||
36 | * when the driver is loaded or when an insertion event occurs. It loses | ||
37 | * a refcount when its ejected or the driver unloads. | ||
38 | * - The one in acpiphp_bridge has its refcount elevated by pci_get_slot() | 35 | * - The one in acpiphp_bridge has its refcount elevated by pci_get_slot() |
39 | * when the bridge is scanned and it loses a refcount when the bridge | 36 | * when the bridge is scanned and it loses a refcount when the bridge |
40 | * is removed. | 37 | * is removed. |
@@ -130,6 +127,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
130 | unsigned long long adr, sun; | 127 | unsigned long long adr, sun; |
131 | int device, function, retval; | 128 | int device, function, retval; |
132 | struct pci_bus *pbus = bridge->pci_bus; | 129 | struct pci_bus *pbus = bridge->pci_bus; |
130 | struct pci_dev *pdev; | ||
133 | 131 | ||
134 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) | 132 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) |
135 | return AE_OK; | 133 | return AE_OK; |
@@ -213,10 +211,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
213 | newfunc->slot = slot; | 211 | newfunc->slot = slot; |
214 | list_add_tail(&newfunc->sibling, &slot->funcs); | 212 | list_add_tail(&newfunc->sibling, &slot->funcs); |
215 | 213 | ||
216 | /* associate corresponding pci_dev */ | 214 | pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); |
217 | newfunc->pci_dev = pci_get_slot(pbus, PCI_DEVFN(device, function)); | 215 | if (pdev) { |
218 | if (newfunc->pci_dev) { | ||
219 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); | 216 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); |
217 | pci_dev_put(pdev); | ||
220 | } | 218 | } |
221 | 219 | ||
222 | if (is_dock_device(handle)) { | 220 | if (is_dock_device(handle)) { |
@@ -617,7 +615,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge) | |||
617 | if (ACPI_FAILURE(status)) | 615 | if (ACPI_FAILURE(status)) |
618 | err("failed to remove notify handler\n"); | 616 | err("failed to remove notify handler\n"); |
619 | } | 617 | } |
620 | pci_dev_put(func->pci_dev); | ||
621 | list_del(list); | 618 | list_del(list); |
622 | kfree(func); | 619 | kfree(func); |
623 | } | 620 | } |
@@ -1101,22 +1098,24 @@ static int __ref enable_device(struct acpiphp_slot *slot) | |||
1101 | pci_enable_bridges(bus); | 1098 | pci_enable_bridges(bus); |
1102 | pci_bus_add_devices(bus); | 1099 | pci_bus_add_devices(bus); |
1103 | 1100 | ||
1104 | /* associate pci_dev to our representation */ | ||
1105 | list_for_each (l, &slot->funcs) { | 1101 | list_for_each (l, &slot->funcs) { |
1106 | func = list_entry(l, struct acpiphp_func, sibling); | 1102 | func = list_entry(l, struct acpiphp_func, sibling); |
1107 | func->pci_dev = pci_get_slot(bus, PCI_DEVFN(slot->device, | 1103 | dev = pci_get_slot(bus, PCI_DEVFN(slot->device, |
1108 | func->function)); | 1104 | func->function)); |
1109 | if (!func->pci_dev) | 1105 | if (!dev) |
1110 | continue; | 1106 | continue; |
1111 | 1107 | ||
1112 | if (func->pci_dev->hdr_type != PCI_HEADER_TYPE_BRIDGE && | 1108 | if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE && |
1113 | func->pci_dev->hdr_type != PCI_HEADER_TYPE_CARDBUS) | 1109 | dev->hdr_type != PCI_HEADER_TYPE_CARDBUS) { |
1110 | pci_dev_put(dev); | ||
1114 | continue; | 1111 | continue; |
1112 | } | ||
1115 | 1113 | ||
1116 | status = find_p2p_bridge(func->handle, (u32)1, bus, NULL); | 1114 | status = find_p2p_bridge(func->handle, (u32)1, bus, NULL); |
1117 | if (ACPI_FAILURE(status)) | 1115 | if (ACPI_FAILURE(status)) |
1118 | warn("find_p2p_bridge failed (error code = 0x%x)\n", | 1116 | warn("find_p2p_bridge failed (error code = 0x%x)\n", |
1119 | status); | 1117 | status); |
1118 | pci_dev_put(dev); | ||
1120 | } | 1119 | } |
1121 | 1120 | ||
1122 | slot->flags |= SLOT_ENABLED; | 1121 | slot->flags |= SLOT_ENABLED; |
@@ -1142,17 +1141,14 @@ static void disable_bridges(struct pci_bus *bus) | |||
1142 | */ | 1141 | */ |
1143 | static int disable_device(struct acpiphp_slot *slot) | 1142 | static int disable_device(struct acpiphp_slot *slot) |
1144 | { | 1143 | { |
1145 | int retval = 0; | ||
1146 | struct acpiphp_func *func; | 1144 | struct acpiphp_func *func; |
1147 | struct list_head *l; | 1145 | struct pci_dev *pdev; |
1148 | 1146 | ||
1149 | /* is this slot already disabled? */ | 1147 | /* is this slot already disabled? */ |
1150 | if (!(slot->flags & SLOT_ENABLED)) | 1148 | if (!(slot->flags & SLOT_ENABLED)) |
1151 | goto err_exit; | 1149 | goto err_exit; |
1152 | 1150 | ||
1153 | list_for_each (l, &slot->funcs) { | 1151 | list_for_each_entry(func, &slot->funcs, sibling) { |
1154 | func = list_entry(l, struct acpiphp_func, sibling); | ||
1155 | |||
1156 | if (func->bridge) { | 1152 | if (func->bridge) { |
1157 | /* cleanup p2p bridges under this P2P bridge */ | 1153 | /* cleanup p2p bridges under this P2P bridge */ |
1158 | cleanup_p2p_bridge(func->bridge->handle, | 1154 | cleanup_p2p_bridge(func->bridge->handle, |
@@ -1160,35 +1156,28 @@ static int disable_device(struct acpiphp_slot *slot) | |||
1160 | func->bridge = NULL; | 1156 | func->bridge = NULL; |
1161 | } | 1157 | } |
1162 | 1158 | ||
1163 | if (func->pci_dev) { | 1159 | pdev = pci_get_slot(slot->bridge->pci_bus, |
1164 | pci_stop_bus_device(func->pci_dev); | 1160 | PCI_DEVFN(slot->device, func->function)); |
1165 | if (func->pci_dev->subordinate) { | 1161 | if (pdev) { |
1166 | disable_bridges(func->pci_dev->subordinate); | 1162 | pci_stop_bus_device(pdev); |
1167 | pci_disable_device(func->pci_dev); | 1163 | if (pdev->subordinate) { |
1164 | disable_bridges(pdev->subordinate); | ||
1165 | pci_disable_device(pdev); | ||
1168 | } | 1166 | } |
1167 | pci_remove_bus_device(pdev); | ||
1168 | pci_dev_put(pdev); | ||
1169 | } | 1169 | } |
1170 | } | 1170 | } |
1171 | 1171 | ||
1172 | list_for_each (l, &slot->funcs) { | 1172 | list_for_each_entry(func, &slot->funcs, sibling) { |
1173 | func = list_entry(l, struct acpiphp_func, sibling); | ||
1174 | |||
1175 | acpiphp_unconfigure_ioapics(func->handle); | 1173 | acpiphp_unconfigure_ioapics(func->handle); |
1176 | acpiphp_bus_trim(func->handle); | 1174 | acpiphp_bus_trim(func->handle); |
1177 | /* try to remove anyway. | ||
1178 | * acpiphp_bus_add might have been failed */ | ||
1179 | |||
1180 | if (!func->pci_dev) | ||
1181 | continue; | ||
1182 | |||
1183 | pci_remove_bus_device(func->pci_dev); | ||
1184 | pci_dev_put(func->pci_dev); | ||
1185 | func->pci_dev = NULL; | ||
1186 | } | 1175 | } |
1187 | 1176 | ||
1188 | slot->flags &= (~SLOT_ENABLED); | 1177 | slot->flags &= (~SLOT_ENABLED); |
1189 | 1178 | ||
1190 | err_exit: | 1179 | err_exit: |
1191 | return retval; | 1180 | return 0; |
1192 | } | 1181 | } |
1193 | 1182 | ||
1194 | 1183 | ||
diff --git a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c index dd18f857dfb0..42e4260c3b12 100644 --- a/drivers/pci/hotplug/ibmphp_core.c +++ b/drivers/pci/hotplug/ibmphp_core.c | |||
@@ -153,45 +153,47 @@ int ibmphp_init_devno(struct slot **cur_slot) | |||
153 | return -1; | 153 | return -1; |
154 | } | 154 | } |
155 | for (loop = 0; loop < len; loop++) { | 155 | for (loop = 0; loop < len; loop++) { |
156 | if ((*cur_slot)->number == rtable->slots[loop].slot) { | 156 | if ((*cur_slot)->number == rtable->slots[loop].slot && |
157 | if ((*cur_slot)->bus == rtable->slots[loop].bus) { | 157 | (*cur_slot)->bus == rtable->slots[loop].bus) { |
158 | struct io_apic_irq_attr irq_attr; | ||
159 | |||
158 | (*cur_slot)->device = PCI_SLOT(rtable->slots[loop].devfn); | 160 | (*cur_slot)->device = PCI_SLOT(rtable->slots[loop].devfn); |
159 | for (i = 0; i < 4; i++) | 161 | for (i = 0; i < 4; i++) |
160 | (*cur_slot)->irq[i] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot)->bus, | 162 | (*cur_slot)->irq[i] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot)->bus, |
161 | (int) (*cur_slot)->device, i); | 163 | (int) (*cur_slot)->device, i, |
162 | 164 | &irq_attr); | |
163 | debug("(*cur_slot)->irq[0] = %x\n", | 165 | |
164 | (*cur_slot)->irq[0]); | 166 | debug("(*cur_slot)->irq[0] = %x\n", |
165 | debug("(*cur_slot)->irq[1] = %x\n", | 167 | (*cur_slot)->irq[0]); |
166 | (*cur_slot)->irq[1]); | 168 | debug("(*cur_slot)->irq[1] = %x\n", |
167 | debug("(*cur_slot)->irq[2] = %x\n", | 169 | (*cur_slot)->irq[1]); |
168 | (*cur_slot)->irq[2]); | 170 | debug("(*cur_slot)->irq[2] = %x\n", |
169 | debug("(*cur_slot)->irq[3] = %x\n", | 171 | (*cur_slot)->irq[2]); |
170 | (*cur_slot)->irq[3]); | 172 | debug("(*cur_slot)->irq[3] = %x\n", |
171 | 173 | (*cur_slot)->irq[3]); | |
172 | debug("rtable->exlusive_irqs = %x\n", | 174 | |
175 | debug("rtable->exlusive_irqs = %x\n", | ||
173 | rtable->exclusive_irqs); | 176 | rtable->exclusive_irqs); |
174 | debug("rtable->slots[loop].irq[0].bitmap = %x\n", | 177 | debug("rtable->slots[loop].irq[0].bitmap = %x\n", |
175 | rtable->slots[loop].irq[0].bitmap); | 178 | rtable->slots[loop].irq[0].bitmap); |
176 | debug("rtable->slots[loop].irq[1].bitmap = %x\n", | 179 | debug("rtable->slots[loop].irq[1].bitmap = %x\n", |
177 | rtable->slots[loop].irq[1].bitmap); | 180 | rtable->slots[loop].irq[1].bitmap); |
178 | debug("rtable->slots[loop].irq[2].bitmap = %x\n", | 181 | debug("rtable->slots[loop].irq[2].bitmap = %x\n", |
179 | rtable->slots[loop].irq[2].bitmap); | 182 | rtable->slots[loop].irq[2].bitmap); |
180 | debug("rtable->slots[loop].irq[3].bitmap = %x\n", | 183 | debug("rtable->slots[loop].irq[3].bitmap = %x\n", |
181 | rtable->slots[loop].irq[3].bitmap); | 184 | rtable->slots[loop].irq[3].bitmap); |
182 | 185 | ||
183 | debug("rtable->slots[loop].irq[0].link = %x\n", | 186 | debug("rtable->slots[loop].irq[0].link = %x\n", |
184 | rtable->slots[loop].irq[0].link); | 187 | rtable->slots[loop].irq[0].link); |
185 | debug("rtable->slots[loop].irq[1].link = %x\n", | 188 | debug("rtable->slots[loop].irq[1].link = %x\n", |
186 | rtable->slots[loop].irq[1].link); | 189 | rtable->slots[loop].irq[1].link); |
187 | debug("rtable->slots[loop].irq[2].link = %x\n", | 190 | debug("rtable->slots[loop].irq[2].link = %x\n", |
188 | rtable->slots[loop].irq[2].link); | 191 | rtable->slots[loop].irq[2].link); |
189 | debug("rtable->slots[loop].irq[3].link = %x\n", | 192 | debug("rtable->slots[loop].irq[3].link = %x\n", |
190 | rtable->slots[loop].irq[3].link); | 193 | rtable->slots[loop].irq[3].link); |
191 | debug("end of init_devno\n"); | 194 | debug("end of init_devno\n"); |
192 | kfree(rtable); | 195 | kfree(rtable); |
193 | return 0; | 196 | return 0; |
194 | } | ||
195 | } | 197 | } |
196 | } | 198 | } |
197 | 199 | ||
diff --git a/drivers/pci/htirq.c b/drivers/pci/htirq.c index 6808d8333ecc..737a1c44b07a 100644 --- a/drivers/pci/htirq.c +++ b/drivers/pci/htirq.c | |||
@@ -98,6 +98,7 @@ int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update) | |||
98 | int max_irq; | 98 | int max_irq; |
99 | int pos; | 99 | int pos; |
100 | int irq; | 100 | int irq; |
101 | int node; | ||
101 | 102 | ||
102 | pos = pci_find_ht_capability(dev, HT_CAPTYPE_IRQ); | 103 | pos = pci_find_ht_capability(dev, HT_CAPTYPE_IRQ); |
103 | if (!pos) | 104 | if (!pos) |
@@ -125,7 +126,8 @@ int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update) | |||
125 | cfg->msg.address_lo = 0xffffffff; | 126 | cfg->msg.address_lo = 0xffffffff; |
126 | cfg->msg.address_hi = 0xffffffff; | 127 | cfg->msg.address_hi = 0xffffffff; |
127 | 128 | ||
128 | irq = create_irq(); | 129 | node = dev_to_node(&dev->dev); |
130 | irq = create_irq_nr(0, node); | ||
129 | 131 | ||
130 | if (irq <= 0) { | 132 | if (irq <= 0) { |
131 | kfree(cfg); | 133 | kfree(cfg); |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index a563fbe559d0..cd389162735f 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -1972,15 +1972,6 @@ static int __init init_dmars(void) | |||
1972 | } | 1972 | } |
1973 | } | 1973 | } |
1974 | 1974 | ||
1975 | #ifdef CONFIG_INTR_REMAP | ||
1976 | if (!intr_remapping_enabled) { | ||
1977 | ret = enable_intr_remapping(0); | ||
1978 | if (ret) | ||
1979 | printk(KERN_ERR | ||
1980 | "IOMMU: enable interrupt remapping failed\n"); | ||
1981 | } | ||
1982 | #endif | ||
1983 | |||
1984 | /* | 1975 | /* |
1985 | * For each rmrr | 1976 | * For each rmrr |
1986 | * for each dev attached to rmrr | 1977 | * for each dev attached to rmrr |
diff --git a/drivers/pci/intr_remapping.c b/drivers/pci/intr_remapping.c index f5e0ea724a6f..3a0cb0bb0593 100644 --- a/drivers/pci/intr_remapping.c +++ b/drivers/pci/intr_remapping.c | |||
@@ -15,6 +15,14 @@ static struct ioapic_scope ir_ioapic[MAX_IO_APICS]; | |||
15 | static int ir_ioapic_num; | 15 | static int ir_ioapic_num; |
16 | int intr_remapping_enabled; | 16 | int intr_remapping_enabled; |
17 | 17 | ||
18 | static int disable_intremap; | ||
19 | static __init int setup_nointremap(char *str) | ||
20 | { | ||
21 | disable_intremap = 1; | ||
22 | return 0; | ||
23 | } | ||
24 | early_param("nointremap", setup_nointremap); | ||
25 | |||
18 | struct irq_2_iommu { | 26 | struct irq_2_iommu { |
19 | struct intel_iommu *iommu; | 27 | struct intel_iommu *iommu; |
20 | u16 irte_index; | 28 | u16 irte_index; |
@@ -23,15 +31,12 @@ struct irq_2_iommu { | |||
23 | }; | 31 | }; |
24 | 32 | ||
25 | #ifdef CONFIG_GENERIC_HARDIRQS | 33 | #ifdef CONFIG_GENERIC_HARDIRQS |
26 | static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu) | 34 | static struct irq_2_iommu *get_one_free_irq_2_iommu(int node) |
27 | { | 35 | { |
28 | struct irq_2_iommu *iommu; | 36 | struct irq_2_iommu *iommu; |
29 | int node; | ||
30 | |||
31 | node = cpu_to_node(cpu); | ||
32 | 37 | ||
33 | iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node); | 38 | iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node); |
34 | printk(KERN_DEBUG "alloc irq_2_iommu on cpu %d node %d\n", cpu, node); | 39 | printk(KERN_DEBUG "alloc irq_2_iommu on node %d\n", node); |
35 | 40 | ||
36 | return iommu; | 41 | return iommu; |
37 | } | 42 | } |
@@ -48,7 +53,7 @@ static struct irq_2_iommu *irq_2_iommu(unsigned int irq) | |||
48 | return desc->irq_2_iommu; | 53 | return desc->irq_2_iommu; |
49 | } | 54 | } |
50 | 55 | ||
51 | static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu) | 56 | static struct irq_2_iommu *irq_2_iommu_alloc_node(unsigned int irq, int node) |
52 | { | 57 | { |
53 | struct irq_desc *desc; | 58 | struct irq_desc *desc; |
54 | struct irq_2_iommu *irq_iommu; | 59 | struct irq_2_iommu *irq_iommu; |
@@ -56,7 +61,7 @@ static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu) | |||
56 | /* | 61 | /* |
57 | * alloc irq desc if not allocated already. | 62 | * alloc irq desc if not allocated already. |
58 | */ | 63 | */ |
59 | desc = irq_to_desc_alloc_cpu(irq, cpu); | 64 | desc = irq_to_desc_alloc_node(irq, node); |
60 | if (!desc) { | 65 | if (!desc) { |
61 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); | 66 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); |
62 | return NULL; | 67 | return NULL; |
@@ -65,14 +70,14 @@ static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu) | |||
65 | irq_iommu = desc->irq_2_iommu; | 70 | irq_iommu = desc->irq_2_iommu; |
66 | 71 | ||
67 | if (!irq_iommu) | 72 | if (!irq_iommu) |
68 | desc->irq_2_iommu = get_one_free_irq_2_iommu(cpu); | 73 | desc->irq_2_iommu = get_one_free_irq_2_iommu(node); |
69 | 74 | ||
70 | return desc->irq_2_iommu; | 75 | return desc->irq_2_iommu; |
71 | } | 76 | } |
72 | 77 | ||
73 | static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq) | 78 | static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq) |
74 | { | 79 | { |
75 | return irq_2_iommu_alloc_cpu(irq, boot_cpu_id); | 80 | return irq_2_iommu_alloc_node(irq, cpu_to_node(boot_cpu_id)); |
76 | } | 81 | } |
77 | 82 | ||
78 | #else /* !CONFIG_SPARSE_IRQ */ | 83 | #else /* !CONFIG_SPARSE_IRQ */ |
@@ -423,20 +428,6 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode) | |||
423 | readl, (sts & DMA_GSTS_IRTPS), sts); | 428 | readl, (sts & DMA_GSTS_IRTPS), sts); |
424 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 429 | spin_unlock_irqrestore(&iommu->register_lock, flags); |
425 | 430 | ||
426 | if (mode == 0) { | ||
427 | spin_lock_irqsave(&iommu->register_lock, flags); | ||
428 | |||
429 | /* enable comaptiblity format interrupt pass through */ | ||
430 | cmd = iommu->gcmd | DMA_GCMD_CFI; | ||
431 | iommu->gcmd |= DMA_GCMD_CFI; | ||
432 | writel(cmd, iommu->reg + DMAR_GCMD_REG); | ||
433 | |||
434 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | ||
435 | readl, (sts & DMA_GSTS_CFIS), sts); | ||
436 | |||
437 | spin_unlock_irqrestore(&iommu->register_lock, flags); | ||
438 | } | ||
439 | |||
440 | /* | 431 | /* |
441 | * global invalidation of interrupt entry cache before enabling | 432 | * global invalidation of interrupt entry cache before enabling |
442 | * interrupt-remapping. | 433 | * interrupt-remapping. |
@@ -516,6 +507,23 @@ end: | |||
516 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 507 | spin_unlock_irqrestore(&iommu->register_lock, flags); |
517 | } | 508 | } |
518 | 509 | ||
510 | int __init intr_remapping_supported(void) | ||
511 | { | ||
512 | struct dmar_drhd_unit *drhd; | ||
513 | |||
514 | if (disable_intremap) | ||
515 | return 0; | ||
516 | |||
517 | for_each_drhd_unit(drhd) { | ||
518 | struct intel_iommu *iommu = drhd->iommu; | ||
519 | |||
520 | if (!ecap_ir_support(iommu->ecap)) | ||
521 | return 0; | ||
522 | } | ||
523 | |||
524 | return 1; | ||
525 | } | ||
526 | |||
519 | int __init enable_intr_remapping(int eim) | 527 | int __init enable_intr_remapping(int eim) |
520 | { | 528 | { |
521 | struct dmar_drhd_unit *drhd; | 529 | struct dmar_drhd_unit *drhd; |
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index adf17856bacc..7f207f335bec 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
@@ -123,7 +123,7 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev, | |||
123 | } | 123 | } |
124 | 124 | ||
125 | flags = irq_flags(triggering, polarity, shareable); | 125 | flags = irq_flags(triggering, polarity, shareable); |
126 | irq = acpi_register_gsi(gsi, triggering, polarity); | 126 | irq = acpi_register_gsi(&dev->dev, gsi, triggering, polarity); |
127 | if (irq >= 0) | 127 | if (irq >= 0) |
128 | pcibios_penalize_isa_irq(irq, 1); | 128 | pcibios_penalize_isa_irq(irq, 1); |
129 | else | 129 | else |
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index b4b39811b445..a0127e93ade0 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
@@ -137,6 +137,7 @@ struct uart_8250_port { | |||
137 | unsigned char mcr; | 137 | unsigned char mcr; |
138 | unsigned char mcr_mask; /* mask of user bits */ | 138 | unsigned char mcr_mask; /* mask of user bits */ |
139 | unsigned char mcr_force; /* mask of forced bits */ | 139 | unsigned char mcr_force; /* mask of forced bits */ |
140 | unsigned char cur_iotype; /* Running I/O type */ | ||
140 | 141 | ||
141 | /* | 142 | /* |
142 | * Some bits in registers are cleared on a read, so they must | 143 | * Some bits in registers are cleared on a read, so they must |
@@ -471,6 +472,7 @@ static void io_serial_out(struct uart_port *p, int offset, int value) | |||
471 | 472 | ||
472 | static void set_io_from_upio(struct uart_port *p) | 473 | static void set_io_from_upio(struct uart_port *p) |
473 | { | 474 | { |
475 | struct uart_8250_port *up = (struct uart_8250_port *)p; | ||
474 | switch (p->iotype) { | 476 | switch (p->iotype) { |
475 | case UPIO_HUB6: | 477 | case UPIO_HUB6: |
476 | p->serial_in = hub6_serial_in; | 478 | p->serial_in = hub6_serial_in; |
@@ -509,6 +511,8 @@ static void set_io_from_upio(struct uart_port *p) | |||
509 | p->serial_out = io_serial_out; | 511 | p->serial_out = io_serial_out; |
510 | break; | 512 | break; |
511 | } | 513 | } |
514 | /* Remember loaded iotype */ | ||
515 | up->cur_iotype = p->iotype; | ||
512 | } | 516 | } |
513 | 517 | ||
514 | static void | 518 | static void |
@@ -1937,6 +1941,9 @@ static int serial8250_startup(struct uart_port *port) | |||
1937 | up->capabilities = uart_config[up->port.type].flags; | 1941 | up->capabilities = uart_config[up->port.type].flags; |
1938 | up->mcr = 0; | 1942 | up->mcr = 0; |
1939 | 1943 | ||
1944 | if (up->port.iotype != up->cur_iotype) | ||
1945 | set_io_from_upio(port); | ||
1946 | |||
1940 | if (up->port.type == PORT_16C950) { | 1947 | if (up->port.type == PORT_16C950) { |
1941 | /* Wake up and initialize UART */ | 1948 | /* Wake up and initialize UART */ |
1942 | up->acr = 0; | 1949 | up->acr = 0; |
@@ -2563,6 +2570,9 @@ static void serial8250_config_port(struct uart_port *port, int flags) | |||
2563 | if (ret < 0) | 2570 | if (ret < 0) |
2564 | probeflags &= ~PROBE_RSA; | 2571 | probeflags &= ~PROBE_RSA; |
2565 | 2572 | ||
2573 | if (up->port.iotype != up->cur_iotype) | ||
2574 | set_io_from_upio(port); | ||
2575 | |||
2566 | if (flags & UART_CONFIG_TYPE) | 2576 | if (flags & UART_CONFIG_TYPE) |
2567 | autoconfig(up, probeflags); | 2577 | autoconfig(up, probeflags); |
2568 | if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ) | 2578 | if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ) |
@@ -2671,6 +2681,11 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev) | |||
2671 | { | 2681 | { |
2672 | int i; | 2682 | int i; |
2673 | 2683 | ||
2684 | for (i = 0; i < nr_uarts; i++) { | ||
2685 | struct uart_8250_port *up = &serial8250_ports[i]; | ||
2686 | up->cur_iotype = 0xFF; | ||
2687 | } | ||
2688 | |||
2674 | serial8250_isa_init_ports(); | 2689 | serial8250_isa_init_ports(); |
2675 | 2690 | ||
2676 | for (i = 0; i < nr_uarts; i++) { | 2691 | for (i = 0; i < nr_uarts; i++) { |
diff --git a/drivers/serial/8250_gsc.c b/drivers/serial/8250_gsc.c index 418b4fe9a0a1..33149d982e82 100644 --- a/drivers/serial/8250_gsc.c +++ b/drivers/serial/8250_gsc.c | |||
@@ -39,9 +39,9 @@ static int __init serial_init_chip(struct parisc_device *dev) | |||
39 | */ | 39 | */ |
40 | if (parisc_parent(dev)->id.hw_type != HPHW_IOA) | 40 | if (parisc_parent(dev)->id.hw_type != HPHW_IOA) |
41 | printk(KERN_INFO | 41 | printk(KERN_INFO |
42 | "Serial: device 0x%lx not configured.\n" | 42 | "Serial: device 0x%llx not configured.\n" |
43 | "Enable support for Wax, Lasi, Asp or Dino.\n", | 43 | "Enable support for Wax, Lasi, Asp or Dino.\n", |
44 | dev->hpa.start); | 44 | (unsigned long long)dev->hpa.start); |
45 | return -ENODEV; | 45 | return -ENODEV; |
46 | } | 46 | } |
47 | 47 | ||
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 7f72f8ceaa6f..b3feb6198d57 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
@@ -988,7 +988,7 @@ mpc52xx_console_setup(struct console *co, char *options) | |||
988 | pr_debug("mpc52xx_console_setup co=%p, co->index=%i, options=%s\n", | 988 | pr_debug("mpc52xx_console_setup co=%p, co->index=%i, options=%s\n", |
989 | co, co->index, options); | 989 | co, co->index, options); |
990 | 990 | ||
991 | if ((co->index < 0) || (co->index > MPC52xx_PSC_MAXNUM)) { | 991 | if ((co->index < 0) || (co->index >= MPC52xx_PSC_MAXNUM)) { |
992 | pr_debug("PSC%x out of range\n", co->index); | 992 | pr_debug("PSC%x out of range\n", co->index); |
993 | return -EINVAL; | 993 | return -EINVAL; |
994 | } | 994 | } |
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 0716cdb44cd8..0a3dc5ece634 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
@@ -11,7 +11,6 @@ obj-$(CONFIG_USB_MON) += mon/ | |||
11 | obj-$(CONFIG_PCI) += host/ | 11 | obj-$(CONFIG_PCI) += host/ |
12 | obj-$(CONFIG_USB_EHCI_HCD) += host/ | 12 | obj-$(CONFIG_USB_EHCI_HCD) += host/ |
13 | obj-$(CONFIG_USB_ISP116X_HCD) += host/ | 13 | obj-$(CONFIG_USB_ISP116X_HCD) += host/ |
14 | obj-$(CONFIG_USB_ISP1760_HCD) += host/ | ||
15 | obj-$(CONFIG_USB_OHCI_HCD) += host/ | 14 | obj-$(CONFIG_USB_OHCI_HCD) += host/ |
16 | obj-$(CONFIG_USB_UHCI_HCD) += host/ | 15 | obj-$(CONFIG_USB_UHCI_HCD) += host/ |
17 | obj-$(CONFIG_USB_FHCI_HCD) += host/ | 16 | obj-$(CONFIG_USB_FHCI_HCD) += host/ |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 0a69c0977e3f..7a1164dd1d37 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -1375,6 +1375,9 @@ static struct usb_device_id acm_ids[] = { | |||
1375 | { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */ | 1375 | { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */ |
1376 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | 1376 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
1377 | }, | 1377 | }, |
1378 | { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */ | ||
1379 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
1380 | }, | ||
1378 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ | 1381 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ |
1379 | }, | 1382 | }, |
1380 | { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ | 1383 | { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ |
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index 563d57275448..05c913cc3658 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c | |||
@@ -794,7 +794,8 @@ usba_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
794 | if (ep->desc) { | 794 | if (ep->desc) { |
795 | list_add_tail(&req->queue, &ep->queue); | 795 | list_add_tail(&req->queue, &ep->queue); |
796 | 796 | ||
797 | if (ep->is_in || (ep_is_control(ep) | 797 | if ((!ep_is_control(ep) && ep->is_in) || |
798 | (ep_is_control(ep) | ||
798 | && (ep->state == DATA_STAGE_IN | 799 | && (ep->state == DATA_STAGE_IN |
799 | || ep->state == STATUS_STAGE_IN))) | 800 | || ep->state == STATUS_STAGE_IN))) |
800 | usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY); | 801 | usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY); |
@@ -1940,7 +1941,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1940 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | 1941 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); |
1941 | clk_disable(pclk); | 1942 | clk_disable(pclk); |
1942 | 1943 | ||
1943 | usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep, | 1944 | usba_ep = kzalloc(sizeof(struct usba_ep) * pdata->num_ep, |
1944 | GFP_KERNEL); | 1945 | GFP_KERNEL); |
1945 | if (!usba_ep) | 1946 | if (!usba_ep) |
1946 | goto err_alloc_ep; | 1947 | goto err_alloc_ep; |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index cd07ea3f0c63..15438469f21a 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -1658,6 +1658,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1658 | u32 reg_base, or_reg, skip_reg; | 1658 | u32 reg_base, or_reg, skip_reg; |
1659 | unsigned long flags; | 1659 | unsigned long flags; |
1660 | struct ptd ptd; | 1660 | struct ptd ptd; |
1661 | packet_enqueue *pe; | ||
1661 | 1662 | ||
1662 | switch (usb_pipetype(urb->pipe)) { | 1663 | switch (usb_pipetype(urb->pipe)) { |
1663 | case PIPE_ISOCHRONOUS: | 1664 | case PIPE_ISOCHRONOUS: |
@@ -1669,6 +1670,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1669 | reg_base = INT_REGS_OFFSET; | 1670 | reg_base = INT_REGS_OFFSET; |
1670 | or_reg = HC_INT_IRQ_MASK_OR_REG; | 1671 | or_reg = HC_INT_IRQ_MASK_OR_REG; |
1671 | skip_reg = HC_INT_PTD_SKIPMAP_REG; | 1672 | skip_reg = HC_INT_PTD_SKIPMAP_REG; |
1673 | pe = enqueue_an_INT_packet; | ||
1672 | break; | 1674 | break; |
1673 | 1675 | ||
1674 | default: | 1676 | default: |
@@ -1676,6 +1678,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1676 | reg_base = ATL_REGS_OFFSET; | 1678 | reg_base = ATL_REGS_OFFSET; |
1677 | or_reg = HC_ATL_IRQ_MASK_OR_REG; | 1679 | or_reg = HC_ATL_IRQ_MASK_OR_REG; |
1678 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; | 1680 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; |
1681 | pe = enqueue_an_ATL_packet; | ||
1679 | break; | 1682 | break; |
1680 | } | 1683 | } |
1681 | 1684 | ||
@@ -1687,6 +1690,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1687 | u32 skip_map; | 1690 | u32 skip_map; |
1688 | u32 or_map; | 1691 | u32 or_map; |
1689 | struct isp1760_qtd *qtd; | 1692 | struct isp1760_qtd *qtd; |
1693 | struct isp1760_qh *qh = ints->qh; | ||
1690 | 1694 | ||
1691 | skip_map = isp1760_readl(hcd->regs + skip_reg); | 1695 | skip_map = isp1760_readl(hcd->regs + skip_reg); |
1692 | skip_map |= 1 << i; | 1696 | skip_map |= 1 << i; |
@@ -1699,8 +1703,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1699 | priv_write_copy(priv, (u32 *)&ptd, hcd->regs + reg_base | 1703 | priv_write_copy(priv, (u32 *)&ptd, hcd->regs + reg_base |
1700 | + i * sizeof(ptd), sizeof(ptd)); | 1704 | + i * sizeof(ptd), sizeof(ptd)); |
1701 | qtd = ints->qtd; | 1705 | qtd = ints->qtd; |
1702 | 1706 | qtd = clean_up_qtdlist(qtd); | |
1703 | clean_up_qtdlist(qtd); | ||
1704 | 1707 | ||
1705 | free_mem(priv, ints->payload); | 1708 | free_mem(priv, ints->payload); |
1706 | 1709 | ||
@@ -1711,7 +1714,24 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1711 | ints->payload = 0; | 1714 | ints->payload = 0; |
1712 | 1715 | ||
1713 | isp1760_urb_done(priv, urb, status); | 1716 | isp1760_urb_done(priv, urb, status); |
1717 | if (qtd) | ||
1718 | pe(hcd, qh, qtd); | ||
1714 | break; | 1719 | break; |
1720 | |||
1721 | } else if (ints->qtd) { | ||
1722 | struct isp1760_qtd *qtd, *prev_qtd = ints->qtd; | ||
1723 | |||
1724 | for (qtd = ints->qtd->hw_next; qtd; qtd = qtd->hw_next) { | ||
1725 | if (qtd->urb == urb) { | ||
1726 | prev_qtd->hw_next = clean_up_qtdlist(qtd); | ||
1727 | isp1760_urb_done(priv, urb, status); | ||
1728 | break; | ||
1729 | } | ||
1730 | prev_qtd = qtd; | ||
1731 | } | ||
1732 | /* we found the urb before the end of the list */ | ||
1733 | if (qtd) | ||
1734 | break; | ||
1715 | } | 1735 | } |
1716 | ints++; | 1736 | ints++; |
1717 | } | 1737 | } |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 0a566eea49c0..f331e2bde88a 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -974,6 +974,7 @@ int usb_serial_probe(struct usb_interface *interface, | |||
974 | if (retval > 0) { | 974 | if (retval > 0) { |
975 | /* quietly accept this device, but don't bind to a | 975 | /* quietly accept this device, but don't bind to a |
976 | serial port as it's about to disappear */ | 976 | serial port as it's about to disappear */ |
977 | serial->num_ports = 0; | ||
977 | goto exit; | 978 | goto exit; |
978 | } | 979 | } |
979 | } | 980 | } |
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 9a577a800db5..2fb63f6ea2f1 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -29,14 +29,8 @@ | |||
29 | 29 | ||
30 | /* configurable parameters */ | 30 | /* configurable parameters */ |
31 | #define ATMEL_LCDC_CVAL_DEFAULT 0xc8 | 31 | #define ATMEL_LCDC_CVAL_DEFAULT 0xc8 |
32 | #define ATMEL_LCDC_DMA_BURST_LEN 8 | 32 | #define ATMEL_LCDC_DMA_BURST_LEN 8 /* words */ |
33 | 33 | #define ATMEL_LCDC_FIFO_SIZE 512 /* words */ | |
34 | #if defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91CAP9) || \ | ||
35 | defined(CONFIG_ARCH_AT91SAM9RL) | ||
36 | #define ATMEL_LCDC_FIFO_SIZE 2048 | ||
37 | #else | ||
38 | #define ATMEL_LCDC_FIFO_SIZE 512 | ||
39 | #endif | ||
40 | 34 | ||
41 | #if defined(CONFIG_ARCH_AT91) | 35 | #if defined(CONFIG_ARCH_AT91) |
42 | #define ATMEL_LCDFB_FBINFO_DEFAULT (FBINFO_DEFAULT \ | 36 | #define ATMEL_LCDFB_FBINFO_DEFAULT (FBINFO_DEFAULT \ |
diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c index 5e9c6302433b..d3a568e6b169 100644 --- a/drivers/video/s3c-fb.c +++ b/drivers/video/s3c-fb.c | |||
@@ -947,7 +947,8 @@ static int __devexit s3c_fb_remove(struct platform_device *pdev) | |||
947 | int win; | 947 | int win; |
948 | 948 | ||
949 | for (win = 0; win <= S3C_FB_MAX_WIN; win++) | 949 | for (win = 0; win <= S3C_FB_MAX_WIN; win++) |
950 | s3c_fb_release_win(sfb, sfb->windows[win]); | 950 | if (sfb->windows[win]) |
951 | s3c_fb_release_win(sfb, sfb->windows[win]); | ||
951 | 952 | ||
952 | iounmap(sfb->regs); | 953 | iounmap(sfb->regs); |
953 | 954 | ||
@@ -985,11 +986,20 @@ static int s3c_fb_suspend(struct platform_device *pdev, pm_message_t state) | |||
985 | static int s3c_fb_resume(struct platform_device *pdev) | 986 | static int s3c_fb_resume(struct platform_device *pdev) |
986 | { | 987 | { |
987 | struct s3c_fb *sfb = platform_get_drvdata(pdev); | 988 | struct s3c_fb *sfb = platform_get_drvdata(pdev); |
989 | struct s3c_fb_platdata *pd = sfb->pdata; | ||
988 | struct s3c_fb_win *win; | 990 | struct s3c_fb_win *win; |
989 | int win_no; | 991 | int win_no; |
990 | 992 | ||
991 | clk_enable(sfb->bus_clk); | 993 | clk_enable(sfb->bus_clk); |
992 | 994 | ||
995 | /* setup registers */ | ||
996 | writel(pd->vidcon1, sfb->regs + VIDCON1); | ||
997 | |||
998 | /* zero all windows before we do anything */ | ||
999 | for (win_no = 0; win_no < S3C_FB_MAX_WIN; win_no++) | ||
1000 | s3c_fb_clear_win(sfb, win_no); | ||
1001 | |||
1002 | /* restore framebuffers */ | ||
993 | for (win_no = 0; win_no < S3C_FB_MAX_WIN; win_no++) { | 1003 | for (win_no = 0; win_no < S3C_FB_MAX_WIN; win_no++) { |
994 | win = sfb->windows[win_no]; | 1004 | win = sfb->windows[win_no]; |
995 | if (!win) | 1005 | if (!win) |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 30963af5dba0..be437c2bc942 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
@@ -335,7 +335,7 @@ static int find_unbound_irq(void) | |||
335 | if (irq == nr_irqs) | 335 | if (irq == nr_irqs) |
336 | panic("No available IRQ to bind to: increase nr_irqs!\n"); | 336 | panic("No available IRQ to bind to: increase nr_irqs!\n"); |
337 | 337 | ||
338 | desc = irq_to_desc_alloc_cpu(irq, 0); | 338 | desc = irq_to_desc_alloc_node(irq, 0); |
339 | if (WARN_ON(desc == NULL)) | 339 | if (WARN_ON(desc == NULL)) |
340 | return -1; | 340 | return -1; |
341 | 341 | ||
@@ -688,13 +688,13 @@ void rebind_evtchn_irq(int evtchn, int irq) | |||
688 | } | 688 | } |
689 | 689 | ||
690 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ | 690 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ |
691 | static void rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | 691 | static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) |
692 | { | 692 | { |
693 | struct evtchn_bind_vcpu bind_vcpu; | 693 | struct evtchn_bind_vcpu bind_vcpu; |
694 | int evtchn = evtchn_from_irq(irq); | 694 | int evtchn = evtchn_from_irq(irq); |
695 | 695 | ||
696 | if (!VALID_EVTCHN(evtchn)) | 696 | if (!VALID_EVTCHN(evtchn)) |
697 | return; | 697 | return -1; |
698 | 698 | ||
699 | /* Send future instances of this interrupt to other vcpu. */ | 699 | /* Send future instances of this interrupt to other vcpu. */ |
700 | bind_vcpu.port = evtchn; | 700 | bind_vcpu.port = evtchn; |
@@ -707,13 +707,15 @@ static void rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | |||
707 | */ | 707 | */ |
708 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) | 708 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) |
709 | bind_evtchn_to_cpu(evtchn, tcpu); | 709 | bind_evtchn_to_cpu(evtchn, tcpu); |
710 | } | ||
711 | 710 | ||
711 | return 0; | ||
712 | } | ||
712 | 713 | ||
713 | static void set_affinity_irq(unsigned irq, const struct cpumask *dest) | 714 | static int set_affinity_irq(unsigned irq, const struct cpumask *dest) |
714 | { | 715 | { |
715 | unsigned tcpu = cpumask_first(dest); | 716 | unsigned tcpu = cpumask_first(dest); |
716 | rebind_irq_to_cpu(irq, tcpu); | 717 | |
718 | return rebind_irq_to_cpu(irq, tcpu); | ||
717 | } | 719 | } |
718 | 720 | ||
719 | int resend_irq_on_evtchn(unsigned int irq) | 721 | int resend_irq_on_evtchn(unsigned int irq) |
diff --git a/firmware/cis/.gitignore b/firmware/cis/.gitignore new file mode 100644 index 000000000000..1de39847f261 --- /dev/null +++ b/firmware/cis/.gitignore | |||
@@ -0,0 +1 @@ | |||
*.cis | |||
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 5cebf0b37798..697f6b5f1313 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/uaccess.h> | 41 | #include <asm/uaccess.h> |
42 | #include <asm/unaligned.h> | 42 | #include <asm/unaligned.h> |
43 | #include <asm/cacheflush.h> | 43 | #include <asm/cacheflush.h> |
44 | #include <asm/page.h> | ||
44 | 45 | ||
45 | /****************************************************************************/ | 46 | /****************************************************************************/ |
46 | 47 | ||
@@ -54,6 +55,18 @@ | |||
54 | #define DBG_FLT(a...) | 55 | #define DBG_FLT(a...) |
55 | #endif | 56 | #endif |
56 | 57 | ||
58 | /* | ||
59 | * User data (stack, data section and bss) needs to be aligned | ||
60 | * for the same reasons as SLAB memory is, and to the same amount. | ||
61 | * Avoid duplicating architecture specific code by using the same | ||
62 | * macro as with SLAB allocation: | ||
63 | */ | ||
64 | #ifdef ARCH_SLAB_MINALIGN | ||
65 | #define FLAT_DATA_ALIGN (ARCH_SLAB_MINALIGN) | ||
66 | #else | ||
67 | #define FLAT_DATA_ALIGN (sizeof(void *)) | ||
68 | #endif | ||
69 | |||
57 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ | 70 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ |
58 | #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ | 71 | #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ |
59 | 72 | ||
@@ -114,20 +127,18 @@ static unsigned long create_flat_tables( | |||
114 | int envc = bprm->envc; | 127 | int envc = bprm->envc; |
115 | char uninitialized_var(dummy); | 128 | char uninitialized_var(dummy); |
116 | 129 | ||
117 | sp = (unsigned long *) ((-(unsigned long)sizeof(char *))&(unsigned long) p); | 130 | sp = (unsigned long *)p; |
131 | sp -= (envc + argc + 2) + 1 + (flat_argvp_envp_on_stack() ? 2 : 0); | ||
132 | sp = (unsigned long *) ((unsigned long)sp & -FLAT_DATA_ALIGN); | ||
133 | argv = sp + 1 + (flat_argvp_envp_on_stack() ? 2 : 0); | ||
134 | envp = argv + (argc + 1); | ||
118 | 135 | ||
119 | sp -= envc+1; | ||
120 | envp = sp; | ||
121 | sp -= argc+1; | ||
122 | argv = sp; | ||
123 | |||
124 | flat_stack_align(sp); | ||
125 | if (flat_argvp_envp_on_stack()) { | 136 | if (flat_argvp_envp_on_stack()) { |
126 | --sp; put_user((unsigned long) envp, sp); | 137 | put_user((unsigned long) envp, sp + 2); |
127 | --sp; put_user((unsigned long) argv, sp); | 138 | put_user((unsigned long) argv, sp + 1); |
128 | } | 139 | } |
129 | 140 | ||
130 | put_user(argc,--sp); | 141 | put_user(argc, sp); |
131 | current->mm->arg_start = (unsigned long) p; | 142 | current->mm->arg_start = (unsigned long) p; |
132 | while (argc-->0) { | 143 | while (argc-->0) { |
133 | put_user((unsigned long) p, argv++); | 144 | put_user((unsigned long) p, argv++); |
@@ -558,7 +569,9 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
558 | ret = realdatastart; | 569 | ret = realdatastart; |
559 | goto err; | 570 | goto err; |
560 | } | 571 | } |
561 | datapos = realdatastart + MAX_SHARED_LIBS * sizeof(unsigned long); | 572 | datapos = ALIGN(realdatastart + |
573 | MAX_SHARED_LIBS * sizeof(unsigned long), | ||
574 | FLAT_DATA_ALIGN); | ||
562 | 575 | ||
563 | DBG_FLT("BINFMT_FLAT: Allocated data+bss+stack (%d bytes): %x\n", | 576 | DBG_FLT("BINFMT_FLAT: Allocated data+bss+stack (%d bytes): %x\n", |
564 | (int)(data_len + bss_len + stack_len), (int)datapos); | 577 | (int)(data_len + bss_len + stack_len), (int)datapos); |
@@ -604,9 +617,12 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
604 | } | 617 | } |
605 | 618 | ||
606 | realdatastart = textpos + ntohl(hdr->data_start); | 619 | realdatastart = textpos + ntohl(hdr->data_start); |
607 | datapos = realdatastart + MAX_SHARED_LIBS * sizeof(unsigned long); | 620 | datapos = ALIGN(realdatastart + |
608 | reloc = (unsigned long *) (textpos + ntohl(hdr->reloc_start) + | 621 | MAX_SHARED_LIBS * sizeof(unsigned long), |
609 | MAX_SHARED_LIBS * sizeof(unsigned long)); | 622 | FLAT_DATA_ALIGN); |
623 | |||
624 | reloc = (unsigned long *) | ||
625 | (datapos + (ntohl(hdr->reloc_start) - text_len)); | ||
610 | memp = textpos; | 626 | memp = textpos; |
611 | memp_size = len; | 627 | memp_size = len; |
612 | #ifdef CONFIG_BINFMT_ZFLAT | 628 | #ifdef CONFIG_BINFMT_ZFLAT |
@@ -854,7 +870,7 @@ static int load_flat_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
854 | stack_len = TOP_OF_ARGS - bprm->p; /* the strings */ | 870 | stack_len = TOP_OF_ARGS - bprm->p; /* the strings */ |
855 | stack_len += (bprm->argc + 1) * sizeof(char *); /* the argv array */ | 871 | stack_len += (bprm->argc + 1) * sizeof(char *); /* the argv array */ |
856 | stack_len += (bprm->envc + 1) * sizeof(char *); /* the envp array */ | 872 | stack_len += (bprm->envc + 1) * sizeof(char *); /* the envp array */ |
857 | 873 | stack_len += FLAT_DATA_ALIGN - 1; /* reserve for upcoming alignment */ | |
858 | 874 | ||
859 | res = load_flat_file(bprm, &libinfo, 0, &stack_len); | 875 | res = load_flat_file(bprm, &libinfo, 0, &stack_len); |
860 | if (res > (unsigned long)-4096) | 876 | if (res > (unsigned long)-4096) |
diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index c32b4a1ad6cf..a0244740b75a 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c | |||
@@ -480,13 +480,6 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb | |||
480 | return; | 480 | return; |
481 | 481 | ||
482 | filebad: | 482 | filebad: |
483 | mutex_lock(&c->erase_free_sem); | ||
484 | spin_lock(&c->erase_completion_lock); | ||
485 | /* Stick it on a list (any list) so erase_failed can take it | ||
486 | right off again. Silly, but shouldn't happen often. */ | ||
487 | list_move(&jeb->list, &c->erasing_list); | ||
488 | spin_unlock(&c->erase_completion_lock); | ||
489 | mutex_unlock(&c->erase_free_sem); | ||
490 | jffs2_erase_failed(c, jeb, bad_offset); | 483 | jffs2_erase_failed(c, jeb, bad_offset); |
491 | return; | 484 | return; |
492 | 485 | ||
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 6c68ffd6b4bb..b660435978d2 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1015,6 +1015,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, | |||
1015 | host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset); | 1015 | host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset); |
1016 | set_fs(oldfs); | 1016 | set_fs(oldfs); |
1017 | if (host_err >= 0) { | 1017 | if (host_err >= 0) { |
1018 | *cnt = host_err; | ||
1018 | nfsdstats.io_write += host_err; | 1019 | nfsdstats.io_write += host_err; |
1019 | fsnotify_modify(file->f_path.dentry); | 1020 | fsnotify_modify(file->f_path.dentry); |
1020 | } | 1021 | } |
@@ -1060,10 +1061,9 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, | |||
1060 | } | 1061 | } |
1061 | 1062 | ||
1062 | dprintk("nfsd: write complete host_err=%d\n", host_err); | 1063 | dprintk("nfsd: write complete host_err=%d\n", host_err); |
1063 | if (host_err >= 0) { | 1064 | if (host_err >= 0) |
1064 | err = 0; | 1065 | err = 0; |
1065 | *cnt = host_err; | 1066 | else |
1066 | } else | ||
1067 | err = nfserrno(host_err); | 1067 | err = nfserrno(host_err); |
1068 | out: | 1068 | out: |
1069 | return err; | 1069 | return err; |
diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c index e90b60dfced9..300f1cdfa862 100644 --- a/fs/nilfs2/cpfile.c +++ b/fs/nilfs2/cpfile.c | |||
@@ -311,7 +311,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
311 | ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh); | 311 | ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh); |
312 | if (ret < 0) { | 312 | if (ret < 0) { |
313 | if (ret != -ENOENT) | 313 | if (ret != -ENOENT) |
314 | goto out_sem; | 314 | goto out_header; |
315 | /* skip hole */ | 315 | /* skip hole */ |
316 | ret = 0; | 316 | ret = 0; |
317 | continue; | 317 | continue; |
@@ -344,7 +344,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
344 | continue; | 344 | continue; |
345 | printk(KERN_ERR "%s: cannot delete block\n", | 345 | printk(KERN_ERR "%s: cannot delete block\n", |
346 | __func__); | 346 | __func__); |
347 | goto out_sem; | 347 | goto out_header; |
348 | } | 348 | } |
349 | } | 349 | } |
350 | 350 | ||
@@ -361,6 +361,8 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
361 | nilfs_mdt_mark_dirty(cpfile); | 361 | nilfs_mdt_mark_dirty(cpfile); |
362 | kunmap_atomic(kaddr, KM_USER0); | 362 | kunmap_atomic(kaddr, KM_USER0); |
363 | } | 363 | } |
364 | |||
365 | out_header: | ||
364 | brelse(header_bh); | 366 | brelse(header_bh); |
365 | 367 | ||
366 | out_sem: | 368 | out_sem: |
diff --git a/fs/proc/base.c b/fs/proc/base.c index fb45615943c2..3326bbf9ab95 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1956,7 +1956,7 @@ static struct dentry *proc_pident_instantiate(struct inode *dir, | |||
1956 | const struct pid_entry *p = ptr; | 1956 | const struct pid_entry *p = ptr; |
1957 | struct inode *inode; | 1957 | struct inode *inode; |
1958 | struct proc_inode *ei; | 1958 | struct proc_inode *ei; |
1959 | struct dentry *error = ERR_PTR(-EINVAL); | 1959 | struct dentry *error = ERR_PTR(-ENOENT); |
1960 | 1960 | ||
1961 | inode = proc_pid_make_inode(dir->i_sb, task); | 1961 | inode = proc_pid_make_inode(dir->i_sb, task); |
1962 | if (!inode) | 1962 | if (!inode) |
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index b1606e07b7a3..561a9c050cef 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -723,7 +723,7 @@ int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), | |||
723 | mutex_unlock(&sysfs_workq_mutex); | 723 | mutex_unlock(&sysfs_workq_mutex); |
724 | 724 | ||
725 | if (sysfs_workqueue == NULL) { | 725 | if (sysfs_workqueue == NULL) { |
726 | sysfs_workqueue = create_workqueue("sysfsd"); | 726 | sysfs_workqueue = create_singlethread_workqueue("sysfsd"); |
727 | if (sysfs_workqueue == NULL) { | 727 | if (sysfs_workqueue == NULL) { |
728 | module_put(owner); | 728 | module_put(owner); |
729 | return -ENOMEM; | 729 | return -ENOMEM; |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 88be890ee3c7..51b4b0a5ce8c 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -119,7 +119,7 @@ extern int pci_mmcfg_config_num; | |||
119 | extern int sbf_port; | 119 | extern int sbf_port; |
120 | extern unsigned long acpi_realmode_flags; | 120 | extern unsigned long acpi_realmode_flags; |
121 | 121 | ||
122 | int acpi_register_gsi (u32 gsi, int triggering, int polarity); | 122 | int acpi_register_gsi (struct device *dev, u32 gsi, int triggering, int polarity); |
123 | int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); | 123 | int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); |
124 | 124 | ||
125 | #ifdef CONFIG_X86_IO_APIC | 125 | #ifdef CONFIG_X86_IO_APIC |
diff --git a/include/linux/auto_fs.h b/include/linux/auto_fs.h index 63265852b7d1..7b09c8348fd3 100644 --- a/include/linux/auto_fs.h +++ b/include/linux/auto_fs.h | |||
@@ -14,13 +14,12 @@ | |||
14 | #ifndef _LINUX_AUTO_FS_H | 14 | #ifndef _LINUX_AUTO_FS_H |
15 | #define _LINUX_AUTO_FS_H | 15 | #define _LINUX_AUTO_FS_H |
16 | 16 | ||
17 | #include <linux/types.h> | ||
17 | #ifdef __KERNEL__ | 18 | #ifdef __KERNEL__ |
18 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
19 | #include <linux/limits.h> | 20 | #include <linux/limits.h> |
20 | #include <linux/types.h> | ||
21 | #include <linux/ioctl.h> | 21 | #include <linux/ioctl.h> |
22 | #else | 22 | #else |
23 | #include <asm/types.h> | ||
24 | #include <sys/ioctl.h> | 23 | #include <sys/ioctl.h> |
25 | #endif /* __KERNEL__ */ | 24 | #endif /* __KERNEL__ */ |
26 | 25 | ||
diff --git a/include/linux/cred.h b/include/linux/cred.h index 3282ee4318e7..4fa999696310 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define _LINUX_CRED_H | 13 | #define _LINUX_CRED_H |
14 | 14 | ||
15 | #include <linux/capability.h> | 15 | #include <linux/capability.h> |
16 | #include <linux/init.h> | ||
16 | #include <linux/key.h> | 17 | #include <linux/key.h> |
17 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
18 | 19 | ||
diff --git a/include/linux/dmar.h b/include/linux/dmar.h index e397dc342cda..10ff5c498824 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h | |||
@@ -108,6 +108,7 @@ struct irte { | |||
108 | }; | 108 | }; |
109 | #ifdef CONFIG_INTR_REMAP | 109 | #ifdef CONFIG_INTR_REMAP |
110 | extern int intr_remapping_enabled; | 110 | extern int intr_remapping_enabled; |
111 | extern int intr_remapping_supported(void); | ||
111 | extern int enable_intr_remapping(int); | 112 | extern int enable_intr_remapping(int); |
112 | extern void disable_intr_remapping(void); | 113 | extern void disable_intr_remapping(void); |
113 | extern int reenable_intr_remapping(int); | 114 | extern int reenable_intr_remapping(int); |
@@ -157,6 +158,8 @@ static inline struct intel_iommu *map_ioapic_to_ir(int apic) | |||
157 | } | 158 | } |
158 | #define irq_remapped(irq) (0) | 159 | #define irq_remapped(irq) (0) |
159 | #define enable_intr_remapping(mode) (-1) | 160 | #define enable_intr_remapping(mode) (-1) |
161 | #define disable_intr_remapping() (0) | ||
162 | #define reenable_intr_remapping(mode) (0) | ||
160 | #define intr_remapping_enabled (0) | 163 | #define intr_remapping_enabled (0) |
161 | #endif | 164 | #endif |
162 | 165 | ||
diff --git a/include/linux/i7300_idle.h b/include/linux/i7300_idle.h index 05a80c44513c..1587b7dec505 100644 --- a/include/linux/i7300_idle.h +++ b/include/linux/i7300_idle.h | |||
@@ -16,35 +16,33 @@ | |||
16 | struct fbd_ioat { | 16 | struct fbd_ioat { |
17 | unsigned int vendor; | 17 | unsigned int vendor; |
18 | unsigned int ioat_dev; | 18 | unsigned int ioat_dev; |
19 | unsigned int enabled; | ||
19 | }; | 20 | }; |
20 | 21 | ||
21 | /* | 22 | /* |
22 | * The i5000 chip-set has the same hooks as the i7300 | 23 | * The i5000 chip-set has the same hooks as the i7300 |
23 | * but support is disabled by default because this driver | 24 | * but it is not enabled by default and must be manually |
24 | * has not been validated on that platform. | 25 | * manually enabled with "forceload=1" because it is |
26 | * only lightly validated. | ||
25 | */ | 27 | */ |
26 | #define SUPPORT_I5000 0 | ||
27 | 28 | ||
28 | static const struct fbd_ioat fbd_ioat_list[] = { | 29 | static const struct fbd_ioat fbd_ioat_list[] = { |
29 | {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB}, | 30 | {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB, 1}, |
30 | #if SUPPORT_I5000 | 31 | {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT, 0}, |
31 | {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT}, | ||
32 | #endif | ||
33 | {0, 0} | 32 | {0, 0} |
34 | }; | 33 | }; |
35 | 34 | ||
36 | /* table of devices that work with this driver */ | 35 | /* table of devices that work with this driver */ |
37 | static const struct pci_device_id pci_tbl[] = { | 36 | static const struct pci_device_id pci_tbl[] = { |
38 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_FBD_CNB) }, | 37 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_FBD_CNB) }, |
39 | #if SUPPORT_I5000 | ||
40 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5000_ERR) }, | 38 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5000_ERR) }, |
41 | #endif | ||
42 | { } /* Terminating entry */ | 39 | { } /* Terminating entry */ |
43 | }; | 40 | }; |
44 | 41 | ||
45 | /* Check for known platforms with I/O-AT */ | 42 | /* Check for known platforms with I/O-AT */ |
46 | static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev, | 43 | static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev, |
47 | struct pci_dev **ioat_dev) | 44 | struct pci_dev **ioat_dev, |
45 | int enable_all) | ||
48 | { | 46 | { |
49 | int i; | 47 | int i; |
50 | struct pci_dev *memdev, *dmadev; | 48 | struct pci_dev *memdev, *dmadev; |
@@ -69,6 +67,8 @@ static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev, | |||
69 | for (i = 0; fbd_ioat_list[i].vendor != 0; i++) { | 67 | for (i = 0; fbd_ioat_list[i].vendor != 0; i++) { |
70 | if (dmadev->vendor == fbd_ioat_list[i].vendor && | 68 | if (dmadev->vendor == fbd_ioat_list[i].vendor && |
71 | dmadev->device == fbd_ioat_list[i].ioat_dev) { | 69 | dmadev->device == fbd_ioat_list[i].ioat_dev) { |
70 | if (!(fbd_ioat_list[i].enabled || enable_all)) | ||
71 | continue; | ||
72 | if (fbd_dev) | 72 | if (fbd_dev) |
73 | *fbd_dev = memdev; | 73 | *fbd_dev = memdev; |
74 | if (ioat_dev) | 74 | if (ioat_dev) |
diff --git a/include/linux/input.h b/include/linux/input.h index 0e6ff5de3588..6fed4f6a9c9e 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -656,6 +656,7 @@ struct input_absinfo { | |||
656 | #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */ | 656 | #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */ |
657 | #define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */ | 657 | #define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */ |
658 | #define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */ | 658 | #define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */ |
659 | #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */ | ||
659 | 660 | ||
660 | #define ABS_MAX 0x3f | 661 | #define ABS_MAX 0x3f |
661 | #define ABS_CNT (ABS_MAX+1) | 662 | #define ABS_CNT (ABS_MAX+1) |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 91bb76f44f14..ff374ceface0 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -566,6 +566,6 @@ struct irq_desc; | |||
566 | extern int early_irq_init(void); | 566 | extern int early_irq_init(void); |
567 | extern int arch_probe_nr_irqs(void); | 567 | extern int arch_probe_nr_irqs(void); |
568 | extern int arch_early_irq_init(void); | 568 | extern int arch_early_irq_init(void); |
569 | extern int arch_init_chip_data(struct irq_desc *desc, int cpu); | 569 | extern int arch_init_chip_data(struct irq_desc *desc, int node); |
570 | 570 | ||
571 | #endif | 571 | #endif |
diff --git a/include/linux/irq.h b/include/linux/irq.h index b7cbeed972e4..eedbb8e5e0cc 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -117,7 +117,7 @@ struct irq_chip { | |||
117 | void (*eoi)(unsigned int irq); | 117 | void (*eoi)(unsigned int irq); |
118 | 118 | ||
119 | void (*end)(unsigned int irq); | 119 | void (*end)(unsigned int irq); |
120 | void (*set_affinity)(unsigned int irq, | 120 | int (*set_affinity)(unsigned int irq, |
121 | const struct cpumask *dest); | 121 | const struct cpumask *dest); |
122 | int (*retrigger)(unsigned int irq); | 122 | int (*retrigger)(unsigned int irq); |
123 | int (*set_type)(unsigned int irq, unsigned int flow_type); | 123 | int (*set_type)(unsigned int irq, unsigned int flow_type); |
@@ -187,7 +187,7 @@ struct irq_desc { | |||
187 | spinlock_t lock; | 187 | spinlock_t lock; |
188 | #ifdef CONFIG_SMP | 188 | #ifdef CONFIG_SMP |
189 | cpumask_var_t affinity; | 189 | cpumask_var_t affinity; |
190 | unsigned int cpu; | 190 | unsigned int node; |
191 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 191 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
192 | cpumask_var_t pending_mask; | 192 | cpumask_var_t pending_mask; |
193 | #endif | 193 | #endif |
@@ -201,26 +201,23 @@ struct irq_desc { | |||
201 | } ____cacheline_internodealigned_in_smp; | 201 | } ____cacheline_internodealigned_in_smp; |
202 | 202 | ||
203 | extern void arch_init_copy_chip_data(struct irq_desc *old_desc, | 203 | extern void arch_init_copy_chip_data(struct irq_desc *old_desc, |
204 | struct irq_desc *desc, int cpu); | 204 | struct irq_desc *desc, int node); |
205 | extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); | 205 | extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); |
206 | 206 | ||
207 | #ifndef CONFIG_SPARSE_IRQ | 207 | #ifndef CONFIG_SPARSE_IRQ |
208 | extern struct irq_desc irq_desc[NR_IRQS]; | 208 | extern struct irq_desc irq_desc[NR_IRQS]; |
209 | #else /* CONFIG_SPARSE_IRQ */ | 209 | #endif |
210 | extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu); | ||
211 | #endif /* CONFIG_SPARSE_IRQ */ | ||
212 | |||
213 | extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); | ||
214 | 210 | ||
215 | static inline struct irq_desc * | 211 | #ifdef CONFIG_NUMA_IRQ_DESC |
216 | irq_remap_to_desc(unsigned int irq, struct irq_desc *desc) | 212 | extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int node); |
217 | { | ||
218 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
219 | return irq_to_desc(irq); | ||
220 | #else | 213 | #else |
214 | static inline struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | ||
215 | { | ||
221 | return desc; | 216 | return desc; |
222 | #endif | ||
223 | } | 217 | } |
218 | #endif | ||
219 | |||
220 | extern struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node); | ||
224 | 221 | ||
225 | /* | 222 | /* |
226 | * Migration helpers for obsolete names, they will go away: | 223 | * Migration helpers for obsolete names, they will go away: |
@@ -386,7 +383,7 @@ extern void set_irq_noprobe(unsigned int irq); | |||
386 | extern void set_irq_probe(unsigned int irq); | 383 | extern void set_irq_probe(unsigned int irq); |
387 | 384 | ||
388 | /* Handle dynamic irq creation and destruction */ | 385 | /* Handle dynamic irq creation and destruction */ |
389 | extern unsigned int create_irq_nr(unsigned int irq_want); | 386 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
390 | extern int create_irq(void); | 387 | extern int create_irq(void); |
391 | extern void destroy_irq(unsigned int irq); | 388 | extern void destroy_irq(unsigned int irq); |
392 | 389 | ||
@@ -424,47 +421,48 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | |||
424 | 421 | ||
425 | #ifdef CONFIG_SMP | 422 | #ifdef CONFIG_SMP |
426 | /** | 423 | /** |
427 | * init_alloc_desc_masks - allocate cpumasks for irq_desc | 424 | * alloc_desc_masks - allocate cpumasks for irq_desc |
428 | * @desc: pointer to irq_desc struct | 425 | * @desc: pointer to irq_desc struct |
429 | * @cpu: cpu which will be handling the cpumasks | 426 | * @cpu: cpu which will be handling the cpumasks |
430 | * @boot: true if need bootmem | 427 | * @boot: true if need bootmem |
431 | * | 428 | * |
432 | * Allocates affinity and pending_mask cpumask if required. | 429 | * Allocates affinity and pending_mask cpumask if required. |
433 | * Returns true if successful (or not required). | 430 | * Returns true if successful (or not required). |
434 | * Side effect: affinity has all bits set, pending_mask has all bits clear. | ||
435 | */ | 431 | */ |
436 | static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, | 432 | static inline bool alloc_desc_masks(struct irq_desc *desc, int node, |
437 | bool boot) | 433 | bool boot) |
438 | { | 434 | { |
439 | int node; | 435 | #ifdef CONFIG_CPUMASK_OFFSTACK |
440 | |||
441 | if (boot) { | 436 | if (boot) { |
442 | alloc_bootmem_cpumask_var(&desc->affinity); | 437 | alloc_bootmem_cpumask_var(&desc->affinity); |
443 | cpumask_setall(desc->affinity); | ||
444 | 438 | ||
445 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 439 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
446 | alloc_bootmem_cpumask_var(&desc->pending_mask); | 440 | alloc_bootmem_cpumask_var(&desc->pending_mask); |
447 | cpumask_clear(desc->pending_mask); | ||
448 | #endif | 441 | #endif |
449 | return true; | 442 | return true; |
450 | } | 443 | } |
451 | 444 | ||
452 | node = cpu_to_node(cpu); | ||
453 | |||
454 | if (!alloc_cpumask_var_node(&desc->affinity, GFP_ATOMIC, node)) | 445 | if (!alloc_cpumask_var_node(&desc->affinity, GFP_ATOMIC, node)) |
455 | return false; | 446 | return false; |
456 | cpumask_setall(desc->affinity); | ||
457 | 447 | ||
458 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 448 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
459 | if (!alloc_cpumask_var_node(&desc->pending_mask, GFP_ATOMIC, node)) { | 449 | if (!alloc_cpumask_var_node(&desc->pending_mask, GFP_ATOMIC, node)) { |
460 | free_cpumask_var(desc->affinity); | 450 | free_cpumask_var(desc->affinity); |
461 | return false; | 451 | return false; |
462 | } | 452 | } |
463 | cpumask_clear(desc->pending_mask); | 453 | #endif |
464 | #endif | 454 | #endif |
465 | return true; | 455 | return true; |
466 | } | 456 | } |
467 | 457 | ||
458 | static inline void init_desc_masks(struct irq_desc *desc) | ||
459 | { | ||
460 | cpumask_setall(desc->affinity); | ||
461 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
462 | cpumask_clear(desc->pending_mask); | ||
463 | #endif | ||
464 | } | ||
465 | |||
468 | /** | 466 | /** |
469 | * init_copy_desc_masks - copy cpumasks for irq_desc | 467 | * init_copy_desc_masks - copy cpumasks for irq_desc |
470 | * @old_desc: pointer to old irq_desc struct | 468 | * @old_desc: pointer to old irq_desc struct |
@@ -478,7 +476,7 @@ static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, | |||
478 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | 476 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, |
479 | struct irq_desc *new_desc) | 477 | struct irq_desc *new_desc) |
480 | { | 478 | { |
481 | #ifdef CONFIG_CPUMASKS_OFFSTACK | 479 | #ifdef CONFIG_CPUMASK_OFFSTACK |
482 | cpumask_copy(new_desc->affinity, old_desc->affinity); | 480 | cpumask_copy(new_desc->affinity, old_desc->affinity); |
483 | 481 | ||
484 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 482 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
@@ -499,12 +497,16 @@ static inline void free_desc_masks(struct irq_desc *old_desc, | |||
499 | 497 | ||
500 | #else /* !CONFIG_SMP */ | 498 | #else /* !CONFIG_SMP */ |
501 | 499 | ||
502 | static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, | 500 | static inline bool alloc_desc_masks(struct irq_desc *desc, int node, |
503 | bool boot) | 501 | bool boot) |
504 | { | 502 | { |
505 | return true; | 503 | return true; |
506 | } | 504 | } |
507 | 505 | ||
506 | static inline void init_desc_masks(struct irq_desc *desc) | ||
507 | { | ||
508 | } | ||
509 | |||
508 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | 510 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, |
509 | struct irq_desc *new_desc) | 511 | struct irq_desc *new_desc) |
510 | { | 512 | { |
diff --git a/include/linux/net_dropmon.h b/include/linux/net_dropmon.h index 0217fb81a630..0e2e100c44a2 100644 --- a/include/linux/net_dropmon.h +++ b/include/linux/net_dropmon.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef __NET_DROPMON_H | 1 | #ifndef __NET_DROPMON_H |
2 | #define __NET_DROPMON_H | 2 | #define __NET_DROPMON_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
4 | #include <linux/netlink.h> | 5 | #include <linux/netlink.h> |
5 | 6 | ||
6 | struct net_dm_drop_point { | 7 | struct net_dm_drop_point { |
diff --git a/include/linux/netfilter/nf_conntrack_tcp.h b/include/linux/netfilter/nf_conntrack_tcp.h index 3066789b972a..b2f384d42611 100644 --- a/include/linux/netfilter/nf_conntrack_tcp.h +++ b/include/linux/netfilter/nf_conntrack_tcp.h | |||
@@ -35,6 +35,9 @@ enum tcp_conntrack { | |||
35 | /* Has unacknowledged data */ | 35 | /* Has unacknowledged data */ |
36 | #define IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED 0x10 | 36 | #define IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED 0x10 |
37 | 37 | ||
38 | /* The field td_maxack has been set */ | ||
39 | #define IP_CT_TCP_FLAG_MAXACK_SET 0x20 | ||
40 | |||
38 | struct nf_ct_tcp_flags { | 41 | struct nf_ct_tcp_flags { |
39 | __u8 flags; | 42 | __u8 flags; |
40 | __u8 mask; | 43 | __u8 mask; |
@@ -46,6 +49,7 @@ struct ip_ct_tcp_state { | |||
46 | u_int32_t td_end; /* max of seq + len */ | 49 | u_int32_t td_end; /* max of seq + len */ |
47 | u_int32_t td_maxend; /* max of ack + max(win, 1) */ | 50 | u_int32_t td_maxend; /* max of ack + max(win, 1) */ |
48 | u_int32_t td_maxwin; /* max(win) */ | 51 | u_int32_t td_maxwin; /* max(win) */ |
52 | u_int32_t td_maxack; /* max of ack */ | ||
49 | u_int8_t td_scale; /* window scale factor */ | 53 | u_int8_t td_scale; /* window scale factor */ |
50 | u_int8_t flags; /* per direction options */ | 54 | u_int8_t flags; /* per direction options */ |
51 | }; | 55 | }; |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 62d81435347a..d476aad3ff57 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -437,6 +437,11 @@ static inline int mem_cgroup_cache_charge_swapin(struct page *page, | |||
437 | return 0; | 437 | return 0; |
438 | } | 438 | } |
439 | 439 | ||
440 | static inline void | ||
441 | mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent) | ||
442 | { | ||
443 | } | ||
444 | |||
440 | #endif /* CONFIG_SWAP */ | 445 | #endif /* CONFIG_SWAP */ |
441 | #endif /* __KERNEL__*/ | 446 | #endif /* __KERNEL__*/ |
442 | #endif /* _LINUX_SWAP_H */ | 447 | #endif /* _LINUX_SWAP_H */ |
diff --git a/kernel/irq/Makefile b/kernel/irq/Makefile index 3394f8f52964..7d047808419d 100644 --- a/kernel/irq/Makefile +++ b/kernel/irq/Makefile | |||
@@ -3,5 +3,5 @@ obj-y := handle.o manage.o spurious.o resend.o chip.o devres.o | |||
3 | obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o | 3 | obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o |
4 | obj-$(CONFIG_PROC_FS) += proc.o | 4 | obj-$(CONFIG_PROC_FS) += proc.o |
5 | obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o | 5 | obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o |
6 | obj-$(CONFIG_NUMA_MIGRATE_IRQ_DESC) += numa_migrate.o | 6 | obj-$(CONFIG_NUMA_IRQ_DESC) += numa_migrate.o |
7 | obj-$(CONFIG_PM_SLEEP) += pm.o | 7 | obj-$(CONFIG_PM_SLEEP) += pm.o |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index c687ba4363f2..13c68e71b726 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -359,7 +359,6 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
359 | 359 | ||
360 | spin_lock(&desc->lock); | 360 | spin_lock(&desc->lock); |
361 | mask_ack_irq(desc, irq); | 361 | mask_ack_irq(desc, irq); |
362 | desc = irq_remap_to_desc(irq, desc); | ||
363 | 362 | ||
364 | if (unlikely(desc->status & IRQ_INPROGRESS)) | 363 | if (unlikely(desc->status & IRQ_INPROGRESS)) |
365 | goto out_unlock; | 364 | goto out_unlock; |
@@ -438,7 +437,6 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc) | |||
438 | desc->status &= ~IRQ_INPROGRESS; | 437 | desc->status &= ~IRQ_INPROGRESS; |
439 | out: | 438 | out: |
440 | desc->chip->eoi(irq); | 439 | desc->chip->eoi(irq); |
441 | desc = irq_remap_to_desc(irq, desc); | ||
442 | 440 | ||
443 | spin_unlock(&desc->lock); | 441 | spin_unlock(&desc->lock); |
444 | } | 442 | } |
@@ -475,7 +473,6 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
475 | !desc->action)) { | 473 | !desc->action)) { |
476 | desc->status |= (IRQ_PENDING | IRQ_MASKED); | 474 | desc->status |= (IRQ_PENDING | IRQ_MASKED); |
477 | mask_ack_irq(desc, irq); | 475 | mask_ack_irq(desc, irq); |
478 | desc = irq_remap_to_desc(irq, desc); | ||
479 | goto out_unlock; | 476 | goto out_unlock; |
480 | } | 477 | } |
481 | kstat_incr_irqs_this_cpu(irq, desc); | 478 | kstat_incr_irqs_this_cpu(irq, desc); |
@@ -483,7 +480,6 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
483 | /* Start handling the irq */ | 480 | /* Start handling the irq */ |
484 | if (desc->chip->ack) | 481 | if (desc->chip->ack) |
485 | desc->chip->ack(irq); | 482 | desc->chip->ack(irq); |
486 | desc = irq_remap_to_desc(irq, desc); | ||
487 | 483 | ||
488 | /* Mark the IRQ currently in progress.*/ | 484 | /* Mark the IRQ currently in progress.*/ |
489 | desc->status |= IRQ_INPROGRESS; | 485 | desc->status |= IRQ_INPROGRESS; |
@@ -544,10 +540,8 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc) | |||
544 | if (!noirqdebug) | 540 | if (!noirqdebug) |
545 | note_interrupt(irq, desc, action_ret); | 541 | note_interrupt(irq, desc, action_ret); |
546 | 542 | ||
547 | if (desc->chip->eoi) { | 543 | if (desc->chip->eoi) |
548 | desc->chip->eoi(irq); | 544 | desc->chip->eoi(irq); |
549 | desc = irq_remap_to_desc(irq, desc); | ||
550 | } | ||
551 | } | 545 | } |
552 | 546 | ||
553 | void | 547 | void |
@@ -582,10 +576,8 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
582 | 576 | ||
583 | /* Uninstall? */ | 577 | /* Uninstall? */ |
584 | if (handle == handle_bad_irq) { | 578 | if (handle == handle_bad_irq) { |
585 | if (desc->chip != &no_irq_chip) { | 579 | if (desc->chip != &no_irq_chip) |
586 | mask_ack_irq(desc, irq); | 580 | mask_ack_irq(desc, irq); |
587 | desc = irq_remap_to_desc(irq, desc); | ||
588 | } | ||
589 | desc->status |= IRQ_DISABLED; | 581 | desc->status |= IRQ_DISABLED; |
590 | desc->depth = 1; | 582 | desc->depth = 1; |
591 | } | 583 | } |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 26e08754744f..18041a254d32 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -11,6 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/slab.h> | ||
14 | #include <linux/module.h> | 15 | #include <linux/module.h> |
15 | #include <linux/random.h> | 16 | #include <linux/random.h> |
16 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
@@ -81,45 +82,48 @@ static struct irq_desc irq_desc_init = { | |||
81 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock), | 82 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock), |
82 | }; | 83 | }; |
83 | 84 | ||
84 | void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr) | 85 | void __ref init_kstat_irqs(struct irq_desc *desc, int node, int nr) |
85 | { | 86 | { |
86 | int node; | ||
87 | void *ptr; | 87 | void *ptr; |
88 | 88 | ||
89 | node = cpu_to_node(cpu); | 89 | if (slab_is_available()) |
90 | ptr = kzalloc_node(nr * sizeof(*desc->kstat_irqs), GFP_ATOMIC, node); | 90 | ptr = kzalloc_node(nr * sizeof(*desc->kstat_irqs), |
91 | GFP_ATOMIC, node); | ||
92 | else | ||
93 | ptr = alloc_bootmem_node(NODE_DATA(node), | ||
94 | nr * sizeof(*desc->kstat_irqs)); | ||
91 | 95 | ||
92 | /* | 96 | /* |
93 | * don't overwite if can not get new one | 97 | * don't overwite if can not get new one |
94 | * init_copy_kstat_irqs() could still use old one | 98 | * init_copy_kstat_irqs() could still use old one |
95 | */ | 99 | */ |
96 | if (ptr) { | 100 | if (ptr) { |
97 | printk(KERN_DEBUG " alloc kstat_irqs on cpu %d node %d\n", | 101 | printk(KERN_DEBUG " alloc kstat_irqs on node %d\n", node); |
98 | cpu, node); | ||
99 | desc->kstat_irqs = ptr; | 102 | desc->kstat_irqs = ptr; |
100 | } | 103 | } |
101 | } | 104 | } |
102 | 105 | ||
103 | static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) | 106 | static void init_one_irq_desc(int irq, struct irq_desc *desc, int node) |
104 | { | 107 | { |
105 | memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); | 108 | memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); |
106 | 109 | ||
107 | spin_lock_init(&desc->lock); | 110 | spin_lock_init(&desc->lock); |
108 | desc->irq = irq; | 111 | desc->irq = irq; |
109 | #ifdef CONFIG_SMP | 112 | #ifdef CONFIG_SMP |
110 | desc->cpu = cpu; | 113 | desc->node = node; |
111 | #endif | 114 | #endif |
112 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); | 115 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); |
113 | init_kstat_irqs(desc, cpu, nr_cpu_ids); | 116 | init_kstat_irqs(desc, node, nr_cpu_ids); |
114 | if (!desc->kstat_irqs) { | 117 | if (!desc->kstat_irqs) { |
115 | printk(KERN_ERR "can not alloc kstat_irqs\n"); | 118 | printk(KERN_ERR "can not alloc kstat_irqs\n"); |
116 | BUG_ON(1); | 119 | BUG_ON(1); |
117 | } | 120 | } |
118 | if (!init_alloc_desc_masks(desc, cpu, false)) { | 121 | if (!alloc_desc_masks(desc, node, false)) { |
119 | printk(KERN_ERR "can not alloc irq_desc cpumasks\n"); | 122 | printk(KERN_ERR "can not alloc irq_desc cpumasks\n"); |
120 | BUG_ON(1); | 123 | BUG_ON(1); |
121 | } | 124 | } |
122 | arch_init_chip_data(desc, cpu); | 125 | init_desc_masks(desc); |
126 | arch_init_chip_data(desc, node); | ||
123 | } | 127 | } |
124 | 128 | ||
125 | /* | 129 | /* |
@@ -169,7 +173,8 @@ int __init early_irq_init(void) | |||
169 | desc[i].irq = i; | 173 | desc[i].irq = i; |
170 | desc[i].kstat_irqs = kstat_irqs_legacy + i * nr_cpu_ids; | 174 | desc[i].kstat_irqs = kstat_irqs_legacy + i * nr_cpu_ids; |
171 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); | 175 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); |
172 | init_alloc_desc_masks(&desc[i], 0, true); | 176 | alloc_desc_masks(&desc[i], 0, true); |
177 | init_desc_masks(&desc[i]); | ||
173 | irq_desc_ptrs[i] = desc + i; | 178 | irq_desc_ptrs[i] = desc + i; |
174 | } | 179 | } |
175 | 180 | ||
@@ -187,11 +192,10 @@ struct irq_desc *irq_to_desc(unsigned int irq) | |||
187 | return NULL; | 192 | return NULL; |
188 | } | 193 | } |
189 | 194 | ||
190 | struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) | 195 | struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node) |
191 | { | 196 | { |
192 | struct irq_desc *desc; | 197 | struct irq_desc *desc; |
193 | unsigned long flags; | 198 | unsigned long flags; |
194 | int node; | ||
195 | 199 | ||
196 | if (irq >= nr_irqs) { | 200 | if (irq >= nr_irqs) { |
197 | WARN(1, "irq (%d) >= nr_irqs (%d) in irq_to_desc_alloc\n", | 201 | WARN(1, "irq (%d) >= nr_irqs (%d) in irq_to_desc_alloc\n", |
@@ -210,15 +214,17 @@ struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) | |||
210 | if (desc) | 214 | if (desc) |
211 | goto out_unlock; | 215 | goto out_unlock; |
212 | 216 | ||
213 | node = cpu_to_node(cpu); | 217 | if (slab_is_available()) |
214 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); | 218 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); |
215 | printk(KERN_DEBUG " alloc irq_desc for %d on cpu %d node %d\n", | 219 | else |
216 | irq, cpu, node); | 220 | desc = alloc_bootmem_node(NODE_DATA(node), sizeof(*desc)); |
221 | |||
222 | printk(KERN_DEBUG " alloc irq_desc for %d on node %d\n", irq, node); | ||
217 | if (!desc) { | 223 | if (!desc) { |
218 | printk(KERN_ERR "can not alloc irq_desc\n"); | 224 | printk(KERN_ERR "can not alloc irq_desc\n"); |
219 | BUG_ON(1); | 225 | BUG_ON(1); |
220 | } | 226 | } |
221 | init_one_irq_desc(irq, desc, cpu); | 227 | init_one_irq_desc(irq, desc, node); |
222 | 228 | ||
223 | irq_desc_ptrs[irq] = desc; | 229 | irq_desc_ptrs[irq] = desc; |
224 | 230 | ||
@@ -256,7 +262,8 @@ int __init early_irq_init(void) | |||
256 | 262 | ||
257 | for (i = 0; i < count; i++) { | 263 | for (i = 0; i < count; i++) { |
258 | desc[i].irq = i; | 264 | desc[i].irq = i; |
259 | init_alloc_desc_masks(&desc[i], 0, true); | 265 | alloc_desc_masks(&desc[i], 0, true); |
266 | init_desc_masks(&desc[i]); | ||
260 | desc[i].kstat_irqs = kstat_irqs_all[i]; | 267 | desc[i].kstat_irqs = kstat_irqs_all[i]; |
261 | } | 268 | } |
262 | return arch_early_irq_init(); | 269 | return arch_early_irq_init(); |
@@ -267,7 +274,7 @@ struct irq_desc *irq_to_desc(unsigned int irq) | |||
267 | return (irq < NR_IRQS) ? irq_desc + irq : NULL; | 274 | return (irq < NR_IRQS) ? irq_desc + irq : NULL; |
268 | } | 275 | } |
269 | 276 | ||
270 | struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) | 277 | struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node) |
271 | { | 278 | { |
272 | return irq_to_desc(irq); | 279 | return irq_to_desc(irq); |
273 | } | 280 | } |
@@ -453,11 +460,8 @@ unsigned int __do_IRQ(unsigned int irq) | |||
453 | /* | 460 | /* |
454 | * No locking required for CPU-local interrupts: | 461 | * No locking required for CPU-local interrupts: |
455 | */ | 462 | */ |
456 | if (desc->chip->ack) { | 463 | if (desc->chip->ack) |
457 | desc->chip->ack(irq); | 464 | desc->chip->ack(irq); |
458 | /* get new one */ | ||
459 | desc = irq_remap_to_desc(irq, desc); | ||
460 | } | ||
461 | if (likely(!(desc->status & IRQ_DISABLED))) { | 465 | if (likely(!(desc->status & IRQ_DISABLED))) { |
462 | action_ret = handle_IRQ_event(irq, desc->action); | 466 | action_ret = handle_IRQ_event(irq, desc->action); |
463 | if (!noirqdebug) | 467 | if (!noirqdebug) |
@@ -468,10 +472,8 @@ unsigned int __do_IRQ(unsigned int irq) | |||
468 | } | 472 | } |
469 | 473 | ||
470 | spin_lock(&desc->lock); | 474 | spin_lock(&desc->lock); |
471 | if (desc->chip->ack) { | 475 | if (desc->chip->ack) |
472 | desc->chip->ack(irq); | 476 | desc->chip->ack(irq); |
473 | desc = irq_remap_to_desc(irq, desc); | ||
474 | } | ||
475 | /* | 477 | /* |
476 | * REPLAY is when Linux resends an IRQ that was dropped earlier | 478 | * REPLAY is when Linux resends an IRQ that was dropped earlier |
477 | * WAITING is used by probe to mark irqs that are being tested | 479 | * WAITING is used by probe to mark irqs that are being tested |
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 01ce20eab38f..73468253143b 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
@@ -16,7 +16,7 @@ extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp); | |||
16 | extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); | 16 | extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); |
17 | 17 | ||
18 | extern struct lock_class_key irq_desc_lock_class; | 18 | extern struct lock_class_key irq_desc_lock_class; |
19 | extern void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr); | 19 | extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr); |
20 | extern void clear_kstat_irqs(struct irq_desc *desc); | 20 | extern void clear_kstat_irqs(struct irq_desc *desc); |
21 | extern spinlock_t sparse_irq_lock; | 21 | extern spinlock_t sparse_irq_lock; |
22 | 22 | ||
@@ -42,6 +42,9 @@ static inline void unregister_handler_proc(unsigned int irq, | |||
42 | 42 | ||
43 | extern int irq_select_affinity_usr(unsigned int irq); | 43 | extern int irq_select_affinity_usr(unsigned int irq); |
44 | 44 | ||
45 | extern void | ||
46 | irq_set_thread_affinity(struct irq_desc *desc, const struct cpumask *cpumask); | ||
47 | |||
45 | /* | 48 | /* |
46 | * Debugging printout: | 49 | * Debugging printout: |
47 | */ | 50 | */ |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 2734eca59243..aaf5c9d05770 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -80,7 +80,7 @@ int irq_can_set_affinity(unsigned int irq) | |||
80 | return 1; | 80 | return 1; |
81 | } | 81 | } |
82 | 82 | ||
83 | static void | 83 | void |
84 | irq_set_thread_affinity(struct irq_desc *desc, const struct cpumask *cpumask) | 84 | irq_set_thread_affinity(struct irq_desc *desc, const struct cpumask *cpumask) |
85 | { | 85 | { |
86 | struct irqaction *action = desc->action; | 86 | struct irqaction *action = desc->action; |
@@ -109,17 +109,22 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
109 | spin_lock_irqsave(&desc->lock, flags); | 109 | spin_lock_irqsave(&desc->lock, flags); |
110 | 110 | ||
111 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 111 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
112 | if (desc->status & IRQ_MOVE_PCNTXT) | 112 | if (desc->status & IRQ_MOVE_PCNTXT) { |
113 | desc->chip->set_affinity(irq, cpumask); | 113 | if (!desc->chip->set_affinity(irq, cpumask)) { |
114 | cpumask_copy(desc->affinity, cpumask); | ||
115 | irq_set_thread_affinity(desc, cpumask); | ||
116 | } | ||
117 | } | ||
114 | else { | 118 | else { |
115 | desc->status |= IRQ_MOVE_PENDING; | 119 | desc->status |= IRQ_MOVE_PENDING; |
116 | cpumask_copy(desc->pending_mask, cpumask); | 120 | cpumask_copy(desc->pending_mask, cpumask); |
117 | } | 121 | } |
118 | #else | 122 | #else |
119 | cpumask_copy(desc->affinity, cpumask); | 123 | if (!desc->chip->set_affinity(irq, cpumask)) { |
120 | desc->chip->set_affinity(irq, cpumask); | 124 | cpumask_copy(desc->affinity, cpumask); |
125 | irq_set_thread_affinity(desc, cpumask); | ||
126 | } | ||
121 | #endif | 127 | #endif |
122 | irq_set_thread_affinity(desc, cpumask); | ||
123 | desc->status |= IRQ_AFFINITY_SET; | 128 | desc->status |= IRQ_AFFINITY_SET; |
124 | spin_unlock_irqrestore(&desc->lock, flags); | 129 | spin_unlock_irqrestore(&desc->lock, flags); |
125 | return 0; | 130 | return 0; |
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index e05ad9be43b7..cfe767ca1545 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
@@ -1,5 +1,8 @@ | |||
1 | 1 | ||
2 | #include <linux/irq.h> | 2 | #include <linux/irq.h> |
3 | #include <linux/interrupt.h> | ||
4 | |||
5 | #include "internals.h" | ||
3 | 6 | ||
4 | void move_masked_irq(int irq) | 7 | void move_masked_irq(int irq) |
5 | { | 8 | { |
@@ -39,11 +42,12 @@ void move_masked_irq(int irq) | |||
39 | * masking the irqs. | 42 | * masking the irqs. |
40 | */ | 43 | */ |
41 | if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) | 44 | if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) |
42 | < nr_cpu_ids)) { | 45 | < nr_cpu_ids)) |
43 | cpumask_and(desc->affinity, | 46 | if (!desc->chip->set_affinity(irq, desc->pending_mask)) { |
44 | desc->pending_mask, cpu_online_mask); | 47 | cpumask_copy(desc->affinity, desc->pending_mask); |
45 | desc->chip->set_affinity(irq, desc->affinity); | 48 | irq_set_thread_affinity(desc, desc->pending_mask); |
46 | } | 49 | } |
50 | |||
47 | cpumask_clear(desc->pending_mask); | 51 | cpumask_clear(desc->pending_mask); |
48 | } | 52 | } |
49 | 53 | ||
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index 44bbdcbaf8d2..2f69bee57bf2 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
@@ -15,9 +15,9 @@ | |||
15 | 15 | ||
16 | static void init_copy_kstat_irqs(struct irq_desc *old_desc, | 16 | static void init_copy_kstat_irqs(struct irq_desc *old_desc, |
17 | struct irq_desc *desc, | 17 | struct irq_desc *desc, |
18 | int cpu, int nr) | 18 | int node, int nr) |
19 | { | 19 | { |
20 | init_kstat_irqs(desc, cpu, nr); | 20 | init_kstat_irqs(desc, node, nr); |
21 | 21 | ||
22 | if (desc->kstat_irqs != old_desc->kstat_irqs) | 22 | if (desc->kstat_irqs != old_desc->kstat_irqs) |
23 | memcpy(desc->kstat_irqs, old_desc->kstat_irqs, | 23 | memcpy(desc->kstat_irqs, old_desc->kstat_irqs, |
@@ -34,20 +34,20 @@ static void free_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc) | |||
34 | } | 34 | } |
35 | 35 | ||
36 | static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, | 36 | static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, |
37 | struct irq_desc *desc, int cpu) | 37 | struct irq_desc *desc, int node) |
38 | { | 38 | { |
39 | memcpy(desc, old_desc, sizeof(struct irq_desc)); | 39 | memcpy(desc, old_desc, sizeof(struct irq_desc)); |
40 | if (!init_alloc_desc_masks(desc, cpu, false)) { | 40 | if (!alloc_desc_masks(desc, node, false)) { |
41 | printk(KERN_ERR "irq %d: can not get new irq_desc cpumask " | 41 | printk(KERN_ERR "irq %d: can not get new irq_desc cpumask " |
42 | "for migration.\n", irq); | 42 | "for migration.\n", irq); |
43 | return false; | 43 | return false; |
44 | } | 44 | } |
45 | spin_lock_init(&desc->lock); | 45 | spin_lock_init(&desc->lock); |
46 | desc->cpu = cpu; | 46 | desc->node = node; |
47 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); | 47 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); |
48 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); | 48 | init_copy_kstat_irqs(old_desc, desc, node, nr_cpu_ids); |
49 | init_copy_desc_masks(old_desc, desc); | 49 | init_copy_desc_masks(old_desc, desc); |
50 | arch_init_copy_chip_data(old_desc, desc, cpu); | 50 | arch_init_copy_chip_data(old_desc, desc, node); |
51 | return true; | 51 | return true; |
52 | } | 52 | } |
53 | 53 | ||
@@ -59,12 +59,11 @@ static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) | |||
59 | } | 59 | } |
60 | 60 | ||
61 | static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | 61 | static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, |
62 | int cpu) | 62 | int node) |
63 | { | 63 | { |
64 | struct irq_desc *desc; | 64 | struct irq_desc *desc; |
65 | unsigned int irq; | 65 | unsigned int irq; |
66 | unsigned long flags; | 66 | unsigned long flags; |
67 | int node; | ||
68 | 67 | ||
69 | irq = old_desc->irq; | 68 | irq = old_desc->irq; |
70 | 69 | ||
@@ -76,7 +75,6 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
76 | if (desc && old_desc != desc) | 75 | if (desc && old_desc != desc) |
77 | goto out_unlock; | 76 | goto out_unlock; |
78 | 77 | ||
79 | node = cpu_to_node(cpu); | ||
80 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); | 78 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); |
81 | if (!desc) { | 79 | if (!desc) { |
82 | printk(KERN_ERR "irq %d: can not get new irq_desc " | 80 | printk(KERN_ERR "irq %d: can not get new irq_desc " |
@@ -85,7 +83,7 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
85 | desc = old_desc; | 83 | desc = old_desc; |
86 | goto out_unlock; | 84 | goto out_unlock; |
87 | } | 85 | } |
88 | if (!init_copy_one_irq_desc(irq, old_desc, desc, cpu)) { | 86 | if (!init_copy_one_irq_desc(irq, old_desc, desc, node)) { |
89 | /* still use old one */ | 87 | /* still use old one */ |
90 | kfree(desc); | 88 | kfree(desc); |
91 | desc = old_desc; | 89 | desc = old_desc; |
@@ -97,9 +95,7 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
97 | 95 | ||
98 | /* free the old one */ | 96 | /* free the old one */ |
99 | free_one_irq_desc(old_desc, desc); | 97 | free_one_irq_desc(old_desc, desc); |
100 | spin_unlock(&old_desc->lock); | ||
101 | kfree(old_desc); | 98 | kfree(old_desc); |
102 | spin_lock(&desc->lock); | ||
103 | 99 | ||
104 | return desc; | 100 | return desc; |
105 | 101 | ||
@@ -109,24 +105,14 @@ out_unlock: | |||
109 | return desc; | 105 | return desc; |
110 | } | 106 | } |
111 | 107 | ||
112 | struct irq_desc *move_irq_desc(struct irq_desc *desc, int cpu) | 108 | struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) |
113 | { | 109 | { |
114 | int old_cpu; | ||
115 | int node, old_node; | ||
116 | |||
117 | /* those all static, do move them */ | 110 | /* those all static, do move them */ |
118 | if (desc->irq < NR_IRQS_LEGACY) | 111 | if (desc->irq < NR_IRQS_LEGACY) |
119 | return desc; | 112 | return desc; |
120 | 113 | ||
121 | old_cpu = desc->cpu; | 114 | if (desc->node != node) |
122 | if (old_cpu != cpu) { | 115 | desc = __real_move_irq_desc(desc, node); |
123 | node = cpu_to_node(cpu); | ||
124 | old_node = cpu_to_node(old_cpu); | ||
125 | if (old_node != node) | ||
126 | desc = __real_move_irq_desc(desc, cpu); | ||
127 | else | ||
128 | desc->cpu = cpu; | ||
129 | } | ||
130 | 116 | ||
131 | return desc; | 117 | return desc; |
132 | } | 118 | } |
diff --git a/kernel/softirq.c b/kernel/softirq.c index b525dd348511..f674f332a024 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -828,7 +828,7 @@ int __init __weak arch_early_irq_init(void) | |||
828 | return 0; | 828 | return 0; |
829 | } | 829 | } |
830 | 830 | ||
831 | int __weak arch_init_chip_data(struct irq_desc *desc, int cpu) | 831 | int __weak arch_init_chip_data(struct irq_desc *desc, int node) |
832 | { | 832 | { |
833 | return 0; | 833 | return 0; |
834 | } | 834 | } |
diff --git a/mm/filemap.c b/mm/filemap.c index 379ff0bcbf6e..1b60f30cebfa 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -121,7 +121,6 @@ void __remove_from_page_cache(struct page *page) | |||
121 | mapping->nrpages--; | 121 | mapping->nrpages--; |
122 | __dec_zone_page_state(page, NR_FILE_PAGES); | 122 | __dec_zone_page_state(page, NR_FILE_PAGES); |
123 | BUG_ON(page_mapped(page)); | 123 | BUG_ON(page_mapped(page)); |
124 | mem_cgroup_uncharge_cache_page(page); | ||
125 | 124 | ||
126 | /* | 125 | /* |
127 | * Some filesystems seem to re-dirty the page even after | 126 | * Some filesystems seem to re-dirty the page even after |
@@ -145,6 +144,7 @@ void remove_from_page_cache(struct page *page) | |||
145 | spin_lock_irq(&mapping->tree_lock); | 144 | spin_lock_irq(&mapping->tree_lock); |
146 | __remove_from_page_cache(page); | 145 | __remove_from_page_cache(page); |
147 | spin_unlock_irq(&mapping->tree_lock); | 146 | spin_unlock_irq(&mapping->tree_lock); |
147 | mem_cgroup_uncharge_cache_page(page); | ||
148 | } | 148 | } |
149 | 149 | ||
150 | static int sync_page(void *word) | 150 | static int sync_page(void *word) |
@@ -476,13 +476,13 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping, | |||
476 | if (likely(!error)) { | 476 | if (likely(!error)) { |
477 | mapping->nrpages++; | 477 | mapping->nrpages++; |
478 | __inc_zone_page_state(page, NR_FILE_PAGES); | 478 | __inc_zone_page_state(page, NR_FILE_PAGES); |
479 | spin_unlock_irq(&mapping->tree_lock); | ||
479 | } else { | 480 | } else { |
480 | page->mapping = NULL; | 481 | page->mapping = NULL; |
482 | spin_unlock_irq(&mapping->tree_lock); | ||
481 | mem_cgroup_uncharge_cache_page(page); | 483 | mem_cgroup_uncharge_cache_page(page); |
482 | page_cache_release(page); | 484 | page_cache_release(page); |
483 | } | 485 | } |
484 | |||
485 | spin_unlock_irq(&mapping->tree_lock); | ||
486 | radix_tree_preload_end(); | 486 | radix_tree_preload_end(); |
487 | } else | 487 | } else |
488 | mem_cgroup_uncharge_cache_page(page); | 488 | mem_cgroup_uncharge_cache_page(page); |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 28c655ba9353..e83ad2c9228c 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -316,7 +316,7 @@ static void resv_map_release(struct kref *ref) | |||
316 | static struct resv_map *vma_resv_map(struct vm_area_struct *vma) | 316 | static struct resv_map *vma_resv_map(struct vm_area_struct *vma) |
317 | { | 317 | { |
318 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); | 318 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); |
319 | if (!(vma->vm_flags & VM_SHARED)) | 319 | if (!(vma->vm_flags & VM_MAYSHARE)) |
320 | return (struct resv_map *)(get_vma_private_data(vma) & | 320 | return (struct resv_map *)(get_vma_private_data(vma) & |
321 | ~HPAGE_RESV_MASK); | 321 | ~HPAGE_RESV_MASK); |
322 | return NULL; | 322 | return NULL; |
@@ -325,7 +325,7 @@ static struct resv_map *vma_resv_map(struct vm_area_struct *vma) | |||
325 | static void set_vma_resv_map(struct vm_area_struct *vma, struct resv_map *map) | 325 | static void set_vma_resv_map(struct vm_area_struct *vma, struct resv_map *map) |
326 | { | 326 | { |
327 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); | 327 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); |
328 | VM_BUG_ON(vma->vm_flags & VM_SHARED); | 328 | VM_BUG_ON(vma->vm_flags & VM_MAYSHARE); |
329 | 329 | ||
330 | set_vma_private_data(vma, (get_vma_private_data(vma) & | 330 | set_vma_private_data(vma, (get_vma_private_data(vma) & |
331 | HPAGE_RESV_MASK) | (unsigned long)map); | 331 | HPAGE_RESV_MASK) | (unsigned long)map); |
@@ -334,7 +334,7 @@ static void set_vma_resv_map(struct vm_area_struct *vma, struct resv_map *map) | |||
334 | static void set_vma_resv_flags(struct vm_area_struct *vma, unsigned long flags) | 334 | static void set_vma_resv_flags(struct vm_area_struct *vma, unsigned long flags) |
335 | { | 335 | { |
336 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); | 336 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); |
337 | VM_BUG_ON(vma->vm_flags & VM_SHARED); | 337 | VM_BUG_ON(vma->vm_flags & VM_MAYSHARE); |
338 | 338 | ||
339 | set_vma_private_data(vma, get_vma_private_data(vma) | flags); | 339 | set_vma_private_data(vma, get_vma_private_data(vma) | flags); |
340 | } | 340 | } |
@@ -353,7 +353,7 @@ static void decrement_hugepage_resv_vma(struct hstate *h, | |||
353 | if (vma->vm_flags & VM_NORESERVE) | 353 | if (vma->vm_flags & VM_NORESERVE) |
354 | return; | 354 | return; |
355 | 355 | ||
356 | if (vma->vm_flags & VM_SHARED) { | 356 | if (vma->vm_flags & VM_MAYSHARE) { |
357 | /* Shared mappings always use reserves */ | 357 | /* Shared mappings always use reserves */ |
358 | h->resv_huge_pages--; | 358 | h->resv_huge_pages--; |
359 | } else if (is_vma_resv_set(vma, HPAGE_RESV_OWNER)) { | 359 | } else if (is_vma_resv_set(vma, HPAGE_RESV_OWNER)) { |
@@ -369,14 +369,14 @@ static void decrement_hugepage_resv_vma(struct hstate *h, | |||
369 | void reset_vma_resv_huge_pages(struct vm_area_struct *vma) | 369 | void reset_vma_resv_huge_pages(struct vm_area_struct *vma) |
370 | { | 370 | { |
371 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); | 371 | VM_BUG_ON(!is_vm_hugetlb_page(vma)); |
372 | if (!(vma->vm_flags & VM_SHARED)) | 372 | if (!(vma->vm_flags & VM_MAYSHARE)) |
373 | vma->vm_private_data = (void *)0; | 373 | vma->vm_private_data = (void *)0; |
374 | } | 374 | } |
375 | 375 | ||
376 | /* Returns true if the VMA has associated reserve pages */ | 376 | /* Returns true if the VMA has associated reserve pages */ |
377 | static int vma_has_reserves(struct vm_area_struct *vma) | 377 | static int vma_has_reserves(struct vm_area_struct *vma) |
378 | { | 378 | { |
379 | if (vma->vm_flags & VM_SHARED) | 379 | if (vma->vm_flags & VM_MAYSHARE) |
380 | return 1; | 380 | return 1; |
381 | if (is_vma_resv_set(vma, HPAGE_RESV_OWNER)) | 381 | if (is_vma_resv_set(vma, HPAGE_RESV_OWNER)) |
382 | return 1; | 382 | return 1; |
@@ -924,7 +924,7 @@ static long vma_needs_reservation(struct hstate *h, | |||
924 | struct address_space *mapping = vma->vm_file->f_mapping; | 924 | struct address_space *mapping = vma->vm_file->f_mapping; |
925 | struct inode *inode = mapping->host; | 925 | struct inode *inode = mapping->host; |
926 | 926 | ||
927 | if (vma->vm_flags & VM_SHARED) { | 927 | if (vma->vm_flags & VM_MAYSHARE) { |
928 | pgoff_t idx = vma_hugecache_offset(h, vma, addr); | 928 | pgoff_t idx = vma_hugecache_offset(h, vma, addr); |
929 | return region_chg(&inode->i_mapping->private_list, | 929 | return region_chg(&inode->i_mapping->private_list, |
930 | idx, idx + 1); | 930 | idx, idx + 1); |
@@ -949,7 +949,7 @@ static void vma_commit_reservation(struct hstate *h, | |||
949 | struct address_space *mapping = vma->vm_file->f_mapping; | 949 | struct address_space *mapping = vma->vm_file->f_mapping; |
950 | struct inode *inode = mapping->host; | 950 | struct inode *inode = mapping->host; |
951 | 951 | ||
952 | if (vma->vm_flags & VM_SHARED) { | 952 | if (vma->vm_flags & VM_MAYSHARE) { |
953 | pgoff_t idx = vma_hugecache_offset(h, vma, addr); | 953 | pgoff_t idx = vma_hugecache_offset(h, vma, addr); |
954 | region_add(&inode->i_mapping->private_list, idx, idx + 1); | 954 | region_add(&inode->i_mapping->private_list, idx, idx + 1); |
955 | 955 | ||
@@ -1893,7 +1893,7 @@ retry_avoidcopy: | |||
1893 | * at the time of fork() could consume its reserves on COW instead | 1893 | * at the time of fork() could consume its reserves on COW instead |
1894 | * of the full address range. | 1894 | * of the full address range. |
1895 | */ | 1895 | */ |
1896 | if (!(vma->vm_flags & VM_SHARED) && | 1896 | if (!(vma->vm_flags & VM_MAYSHARE) && |
1897 | is_vma_resv_set(vma, HPAGE_RESV_OWNER) && | 1897 | is_vma_resv_set(vma, HPAGE_RESV_OWNER) && |
1898 | old_page != pagecache_page) | 1898 | old_page != pagecache_page) |
1899 | outside_reserve = 1; | 1899 | outside_reserve = 1; |
@@ -2000,7 +2000,7 @@ retry: | |||
2000 | clear_huge_page(page, address, huge_page_size(h)); | 2000 | clear_huge_page(page, address, huge_page_size(h)); |
2001 | __SetPageUptodate(page); | 2001 | __SetPageUptodate(page); |
2002 | 2002 | ||
2003 | if (vma->vm_flags & VM_SHARED) { | 2003 | if (vma->vm_flags & VM_MAYSHARE) { |
2004 | int err; | 2004 | int err; |
2005 | struct inode *inode = mapping->host; | 2005 | struct inode *inode = mapping->host; |
2006 | 2006 | ||
@@ -2104,7 +2104,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2104 | goto out_mutex; | 2104 | goto out_mutex; |
2105 | } | 2105 | } |
2106 | 2106 | ||
2107 | if (!(vma->vm_flags & VM_SHARED)) | 2107 | if (!(vma->vm_flags & VM_MAYSHARE)) |
2108 | pagecache_page = hugetlbfs_pagecache_page(h, | 2108 | pagecache_page = hugetlbfs_pagecache_page(h, |
2109 | vma, address); | 2109 | vma, address); |
2110 | } | 2110 | } |
@@ -2289,7 +2289,7 @@ int hugetlb_reserve_pages(struct inode *inode, | |||
2289 | * to reserve the full area even if read-only as mprotect() may be | 2289 | * to reserve the full area even if read-only as mprotect() may be |
2290 | * called to make the mapping read-write. Assume !vma is a shm mapping | 2290 | * called to make the mapping read-write. Assume !vma is a shm mapping |
2291 | */ | 2291 | */ |
2292 | if (!vma || vma->vm_flags & VM_SHARED) | 2292 | if (!vma || vma->vm_flags & VM_MAYSHARE) |
2293 | chg = region_chg(&inode->i_mapping->private_list, from, to); | 2293 | chg = region_chg(&inode->i_mapping->private_list, from, to); |
2294 | else { | 2294 | else { |
2295 | struct resv_map *resv_map = resv_map_alloc(); | 2295 | struct resv_map *resv_map = resv_map_alloc(); |
@@ -2330,7 +2330,7 @@ int hugetlb_reserve_pages(struct inode *inode, | |||
2330 | * consumed reservations are stored in the map. Hence, nothing | 2330 | * consumed reservations are stored in the map. Hence, nothing |
2331 | * else has to be done for private mappings here | 2331 | * else has to be done for private mappings here |
2332 | */ | 2332 | */ |
2333 | if (!vma || vma->vm_flags & VM_SHARED) | 2333 | if (!vma || vma->vm_flags & VM_MAYSHARE) |
2334 | region_add(&inode->i_mapping->private_list, from, to); | 2334 | region_add(&inode->i_mapping->private_list, from, to); |
2335 | return 0; | 2335 | return 0; |
2336 | } | 2336 | } |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 01c2d8f14685..78eb8552818b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -314,14 +314,6 @@ static struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm) | |||
314 | return mem; | 314 | return mem; |
315 | } | 315 | } |
316 | 316 | ||
317 | static bool mem_cgroup_is_obsolete(struct mem_cgroup *mem) | ||
318 | { | ||
319 | if (!mem) | ||
320 | return true; | ||
321 | return css_is_removed(&mem->css); | ||
322 | } | ||
323 | |||
324 | |||
325 | /* | 317 | /* |
326 | * Call callback function against all cgroup under hierarchy tree. | 318 | * Call callback function against all cgroup under hierarchy tree. |
327 | */ | 319 | */ |
@@ -932,7 +924,7 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, | |||
932 | if (unlikely(!mem)) | 924 | if (unlikely(!mem)) |
933 | return 0; | 925 | return 0; |
934 | 926 | ||
935 | VM_BUG_ON(!mem || mem_cgroup_is_obsolete(mem)); | 927 | VM_BUG_ON(css_is_removed(&mem->css)); |
936 | 928 | ||
937 | while (1) { | 929 | while (1) { |
938 | int ret; | 930 | int ret; |
@@ -1488,8 +1480,9 @@ void mem_cgroup_uncharge_cache_page(struct page *page) | |||
1488 | __mem_cgroup_uncharge_common(page, MEM_CGROUP_CHARGE_TYPE_CACHE); | 1480 | __mem_cgroup_uncharge_common(page, MEM_CGROUP_CHARGE_TYPE_CACHE); |
1489 | } | 1481 | } |
1490 | 1482 | ||
1483 | #ifdef CONFIG_SWAP | ||
1491 | /* | 1484 | /* |
1492 | * called from __delete_from_swap_cache() and drop "page" account. | 1485 | * called after __delete_from_swap_cache() and drop "page" account. |
1493 | * memcg information is recorded to swap_cgroup of "ent" | 1486 | * memcg information is recorded to swap_cgroup of "ent" |
1494 | */ | 1487 | */ |
1495 | void mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent) | 1488 | void mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent) |
@@ -1506,6 +1499,7 @@ void mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent) | |||
1506 | if (memcg) | 1499 | if (memcg) |
1507 | css_put(&memcg->css); | 1500 | css_put(&memcg->css); |
1508 | } | 1501 | } |
1502 | #endif | ||
1509 | 1503 | ||
1510 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 1504 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP |
1511 | /* | 1505 | /* |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 92bcf1db16b2..a7b2460e922b 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -284,22 +284,28 @@ static void dump_tasks(const struct mem_cgroup *mem) | |||
284 | printk(KERN_INFO "[ pid ] uid tgid total_vm rss cpu oom_adj " | 284 | printk(KERN_INFO "[ pid ] uid tgid total_vm rss cpu oom_adj " |
285 | "name\n"); | 285 | "name\n"); |
286 | do_each_thread(g, p) { | 286 | do_each_thread(g, p) { |
287 | /* | 287 | struct mm_struct *mm; |
288 | * total_vm and rss sizes do not exist for tasks with a | 288 | |
289 | * detached mm so there's no need to report them. | ||
290 | */ | ||
291 | if (!p->mm) | ||
292 | continue; | ||
293 | if (mem && !task_in_mem_cgroup(p, mem)) | 289 | if (mem && !task_in_mem_cgroup(p, mem)) |
294 | continue; | 290 | continue; |
295 | if (!thread_group_leader(p)) | 291 | if (!thread_group_leader(p)) |
296 | continue; | 292 | continue; |
297 | 293 | ||
298 | task_lock(p); | 294 | task_lock(p); |
295 | mm = p->mm; | ||
296 | if (!mm) { | ||
297 | /* | ||
298 | * total_vm and rss sizes do not exist for tasks with no | ||
299 | * mm so there's no need to report them; they can't be | ||
300 | * oom killed anyway. | ||
301 | */ | ||
302 | task_unlock(p); | ||
303 | continue; | ||
304 | } | ||
299 | printk(KERN_INFO "[%5d] %5d %5d %8lu %8lu %3d %3d %s\n", | 305 | printk(KERN_INFO "[%5d] %5d %5d %8lu %8lu %3d %3d %s\n", |
300 | p->pid, __task_cred(p)->uid, p->tgid, | 306 | p->pid, __task_cred(p)->uid, p->tgid, mm->total_vm, |
301 | p->mm->total_vm, get_mm_rss(p->mm), (int)task_cpu(p), | 307 | get_mm_rss(mm), (int)task_cpu(p), p->oomkilladj, |
302 | p->oomkilladj, p->comm); | 308 | p->comm); |
303 | task_unlock(p); | 309 | task_unlock(p); |
304 | } while_each_thread(g, p); | 310 | } while_each_thread(g, p); |
305 | } | 311 | } |
diff --git a/mm/swap_state.c b/mm/swap_state.c index 3ecea98ecb45..1416e7e9e02d 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -109,8 +109,6 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) | |||
109 | */ | 109 | */ |
110 | void __delete_from_swap_cache(struct page *page) | 110 | void __delete_from_swap_cache(struct page *page) |
111 | { | 111 | { |
112 | swp_entry_t ent = {.val = page_private(page)}; | ||
113 | |||
114 | VM_BUG_ON(!PageLocked(page)); | 112 | VM_BUG_ON(!PageLocked(page)); |
115 | VM_BUG_ON(!PageSwapCache(page)); | 113 | VM_BUG_ON(!PageSwapCache(page)); |
116 | VM_BUG_ON(PageWriteback(page)); | 114 | VM_BUG_ON(PageWriteback(page)); |
@@ -121,7 +119,6 @@ void __delete_from_swap_cache(struct page *page) | |||
121 | total_swapcache_pages--; | 119 | total_swapcache_pages--; |
122 | __dec_zone_page_state(page, NR_FILE_PAGES); | 120 | __dec_zone_page_state(page, NR_FILE_PAGES); |
123 | INC_CACHE_INFO(del_total); | 121 | INC_CACHE_INFO(del_total); |
124 | mem_cgroup_uncharge_swapcache(page, ent); | ||
125 | } | 122 | } |
126 | 123 | ||
127 | /** | 124 | /** |
@@ -191,6 +188,7 @@ void delete_from_swap_cache(struct page *page) | |||
191 | __delete_from_swap_cache(page); | 188 | __delete_from_swap_cache(page); |
192 | spin_unlock_irq(&swapper_space.tree_lock); | 189 | spin_unlock_irq(&swapper_space.tree_lock); |
193 | 190 | ||
191 | mem_cgroup_uncharge_swapcache(page, entry); | ||
194 | swap_free(entry); | 192 | swap_free(entry); |
195 | page_cache_release(page); | 193 | page_cache_release(page); |
196 | } | 194 | } |
diff --git a/mm/truncate.c b/mm/truncate.c index 55206fab7b99..12e1579f9165 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -359,6 +359,7 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page) | |||
359 | BUG_ON(page_has_private(page)); | 359 | BUG_ON(page_has_private(page)); |
360 | __remove_from_page_cache(page); | 360 | __remove_from_page_cache(page); |
361 | spin_unlock_irq(&mapping->tree_lock); | 361 | spin_unlock_irq(&mapping->tree_lock); |
362 | mem_cgroup_uncharge_cache_page(page); | ||
362 | page_cache_release(page); /* pagecache ref */ | 363 | page_cache_release(page); /* pagecache ref */ |
363 | return 1; | 364 | return 1; |
364 | failed: | 365 | failed: |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 5fa3eda1f03f..d254306562cd 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -470,10 +470,12 @@ static int __remove_mapping(struct address_space *mapping, struct page *page) | |||
470 | swp_entry_t swap = { .val = page_private(page) }; | 470 | swp_entry_t swap = { .val = page_private(page) }; |
471 | __delete_from_swap_cache(page); | 471 | __delete_from_swap_cache(page); |
472 | spin_unlock_irq(&mapping->tree_lock); | 472 | spin_unlock_irq(&mapping->tree_lock); |
473 | mem_cgroup_uncharge_swapcache(page, swap); | ||
473 | swap_free(swap); | 474 | swap_free(swap); |
474 | } else { | 475 | } else { |
475 | __remove_from_page_cache(page); | 476 | __remove_from_page_cache(page); |
476 | spin_unlock_irq(&mapping->tree_lock); | 477 | spin_unlock_irq(&mapping->tree_lock); |
478 | mem_cgroup_uncharge_cache_page(page); | ||
477 | } | 479 | } |
478 | 480 | ||
479 | return 1; | 481 | return 1; |
diff --git a/net/netfilter/nf_conntrack_proto_dccp.c b/net/netfilter/nf_conntrack_proto_dccp.c index 8e757dd53396..aee0d6bea309 100644 --- a/net/netfilter/nf_conntrack_proto_dccp.c +++ b/net/netfilter/nf_conntrack_proto_dccp.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/netfilter/nfnetlink_conntrack.h> | 22 | #include <linux/netfilter/nfnetlink_conntrack.h> |
23 | #include <net/netfilter/nf_conntrack.h> | 23 | #include <net/netfilter/nf_conntrack.h> |
24 | #include <net/netfilter/nf_conntrack_l4proto.h> | 24 | #include <net/netfilter/nf_conntrack_l4proto.h> |
25 | #include <net/netfilter/nf_conntrack_ecache.h> | ||
25 | #include <net/netfilter/nf_log.h> | 26 | #include <net/netfilter/nf_log.h> |
26 | 27 | ||
27 | static DEFINE_RWLOCK(dccp_lock); | 28 | static DEFINE_RWLOCK(dccp_lock); |
@@ -553,6 +554,9 @@ static int dccp_packet(struct nf_conn *ct, const struct sk_buff *skb, | |||
553 | ct->proto.dccp.state = new_state; | 554 | ct->proto.dccp.state = new_state; |
554 | write_unlock_bh(&dccp_lock); | 555 | write_unlock_bh(&dccp_lock); |
555 | 556 | ||
557 | if (new_state != old_state) | ||
558 | nf_conntrack_event_cache(IPCT_PROTOINFO, ct); | ||
559 | |||
556 | dn = dccp_pernet(net); | 560 | dn = dccp_pernet(net); |
557 | nf_ct_refresh_acct(ct, ctinfo, skb, dn->dccp_timeout[new_state]); | 561 | nf_ct_refresh_acct(ct, ctinfo, skb, dn->dccp_timeout[new_state]); |
558 | 562 | ||
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index b5ccf2b4b2e7..97a6e93d742e 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
@@ -634,6 +634,14 @@ static bool tcp_in_window(const struct nf_conn *ct, | |||
634 | sender->td_end = end; | 634 | sender->td_end = end; |
635 | sender->flags |= IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED; | 635 | sender->flags |= IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED; |
636 | } | 636 | } |
637 | if (tcph->ack) { | ||
638 | if (!(sender->flags & IP_CT_TCP_FLAG_MAXACK_SET)) { | ||
639 | sender->td_maxack = ack; | ||
640 | sender->flags |= IP_CT_TCP_FLAG_MAXACK_SET; | ||
641 | } else if (after(ack, sender->td_maxack)) | ||
642 | sender->td_maxack = ack; | ||
643 | } | ||
644 | |||
637 | /* | 645 | /* |
638 | * Update receiver data. | 646 | * Update receiver data. |
639 | */ | 647 | */ |
@@ -919,6 +927,16 @@ static int tcp_packet(struct nf_conn *ct, | |||
919 | return -NF_ACCEPT; | 927 | return -NF_ACCEPT; |
920 | case TCP_CONNTRACK_CLOSE: | 928 | case TCP_CONNTRACK_CLOSE: |
921 | if (index == TCP_RST_SET | 929 | if (index == TCP_RST_SET |
930 | && (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET) | ||
931 | && before(ntohl(th->seq), ct->proto.tcp.seen[!dir].td_maxack)) { | ||
932 | /* Invalid RST */ | ||
933 | write_unlock_bh(&tcp_lock); | ||
934 | if (LOG_INVALID(net, IPPROTO_TCP)) | ||
935 | nf_log_packet(pf, 0, skb, NULL, NULL, NULL, | ||
936 | "nf_ct_tcp: invalid RST "); | ||
937 | return -NF_ACCEPT; | ||
938 | } | ||
939 | if (index == TCP_RST_SET | ||
922 | && ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) | 940 | && ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) |
923 | && ct->proto.tcp.last_index == TCP_SYN_SET) | 941 | && ct->proto.tcp.last_index == TCP_SYN_SET) |
924 | || (!test_bit(IPS_ASSURED_BIT, &ct->status) | 942 | || (!test_bit(IPS_ASSURED_BIT, &ct->status) |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index fd326ac27ec8..66a6dd5c519a 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -581,6 +581,12 @@ nfulnl_log_packet(u_int8_t pf, | |||
581 | + nla_total_size(sizeof(struct nfulnl_msg_packet_hw)) | 581 | + nla_total_size(sizeof(struct nfulnl_msg_packet_hw)) |
582 | + nla_total_size(sizeof(struct nfulnl_msg_packet_timestamp)); | 582 | + nla_total_size(sizeof(struct nfulnl_msg_packet_timestamp)); |
583 | 583 | ||
584 | if (in && skb_mac_header_was_set(skb)) { | ||
585 | size += nla_total_size(skb->dev->hard_header_len) | ||
586 | + nla_total_size(sizeof(u_int16_t)) /* hwtype */ | ||
587 | + nla_total_size(sizeof(u_int16_t)); /* hwlen */ | ||
588 | } | ||
589 | |||
584 | spin_lock_bh(&inst->lock); | 590 | spin_lock_bh(&inst->lock); |
585 | 591 | ||
586 | if (inst->flags & NFULNL_CFG_F_SEQ) | 592 | if (inst->flags & NFULNL_CFG_F_SEQ) |
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index a5b5369c30f9..219dcdbe388c 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c | |||
@@ -926,7 +926,7 @@ static int dl_seq_show(struct seq_file *s, void *v) | |||
926 | if (!hlist_empty(&htable->hash[*bucket])) { | 926 | if (!hlist_empty(&htable->hash[*bucket])) { |
927 | hlist_for_each_entry(ent, pos, &htable->hash[*bucket], node) | 927 | hlist_for_each_entry(ent, pos, &htable->hash[*bucket], node) |
928 | if (dl_seq_real_show(ent, htable->family, s)) | 928 | if (dl_seq_real_show(ent, htable->family, s)) |
929 | return 1; | 929 | return -1; |
930 | } | 930 | } |
931 | return 0; | 931 | return 0; |
932 | } | 932 | } |
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index 91a3db4a76f8..cc29b44b1500 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c | |||
@@ -104,8 +104,7 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp, | |||
104 | struct tcf_result *res) | 104 | struct tcf_result *res) |
105 | { | 105 | { |
106 | struct cls_cgroup_head *head = tp->root; | 106 | struct cls_cgroup_head *head = tp->root; |
107 | struct cgroup_cls_state *cs; | 107 | u32 classid; |
108 | int ret = 0; | ||
109 | 108 | ||
110 | /* | 109 | /* |
111 | * Due to the nature of the classifier it is required to ignore all | 110 | * Due to the nature of the classifier it is required to ignore all |
@@ -121,17 +120,18 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp, | |||
121 | return -1; | 120 | return -1; |
122 | 121 | ||
123 | rcu_read_lock(); | 122 | rcu_read_lock(); |
124 | cs = task_cls_state(current); | 123 | classid = task_cls_state(current)->classid; |
125 | if (cs->classid && tcf_em_tree_match(skb, &head->ematches, NULL)) { | ||
126 | res->classid = cs->classid; | ||
127 | res->class = 0; | ||
128 | ret = tcf_exts_exec(skb, &head->exts, res); | ||
129 | } else | ||
130 | ret = -1; | ||
131 | |||
132 | rcu_read_unlock(); | 124 | rcu_read_unlock(); |
133 | 125 | ||
134 | return ret; | 126 | if (!classid) |
127 | return -1; | ||
128 | |||
129 | if (!tcf_em_tree_match(skb, &head->ematches, NULL)) | ||
130 | return -1; | ||
131 | |||
132 | res->classid = classid; | ||
133 | res->class = 0; | ||
134 | return tcf_exts_exec(skb, &head->exts, res); | ||
135 | } | 135 | } |
136 | 136 | ||
137 | static unsigned long cls_cgroup_get(struct tcf_proto *tp, u32 handle) | 137 | static unsigned long cls_cgroup_get(struct tcf_proto *tp, u32 handle) |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index af3198814c15..9d504234af4a 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -345,6 +345,7 @@ static void svc_sock_setbufsize(struct socket *sock, unsigned int snd, | |||
345 | lock_sock(sock->sk); | 345 | lock_sock(sock->sk); |
346 | sock->sk->sk_sndbuf = snd * 2; | 346 | sock->sk->sk_sndbuf = snd * 2; |
347 | sock->sk->sk_rcvbuf = rcv * 2; | 347 | sock->sk->sk_rcvbuf = rcv * 2; |
348 | sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK|SOCK_RCVBUF_LOCK; | ||
348 | release_sock(sock->sk); | 349 | release_sock(sock->sk); |
349 | #endif | 350 | #endif |
350 | } | 351 | } |
@@ -796,6 +797,23 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
796 | test_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags), | 797 | test_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags), |
797 | test_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags)); | 798 | test_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags)); |
798 | 799 | ||
800 | if (test_and_clear_bit(XPT_CHNGBUF, &svsk->sk_xprt.xpt_flags)) | ||
801 | /* sndbuf needs to have room for one request | ||
802 | * per thread, otherwise we can stall even when the | ||
803 | * network isn't a bottleneck. | ||
804 | * | ||
805 | * We count all threads rather than threads in a | ||
806 | * particular pool, which provides an upper bound | ||
807 | * on the number of threads which will access the socket. | ||
808 | * | ||
809 | * rcvbuf just needs to be able to hold a few requests. | ||
810 | * Normally they will be removed from the queue | ||
811 | * as soon a a complete request arrives. | ||
812 | */ | ||
813 | svc_sock_setbufsize(svsk->sk_sock, | ||
814 | (serv->sv_nrthreads+3) * serv->sv_max_mesg, | ||
815 | 3 * serv->sv_max_mesg); | ||
816 | |||
799 | clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); | 817 | clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); |
800 | 818 | ||
801 | /* Receive data. If we haven't got the record length yet, get | 819 | /* Receive data. If we haven't got the record length yet, get |
@@ -1043,6 +1061,15 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv) | |||
1043 | 1061 | ||
1044 | tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF; | 1062 | tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF; |
1045 | 1063 | ||
1064 | /* initialise setting must have enough space to | ||
1065 | * receive and respond to one request. | ||
1066 | * svc_tcp_recvfrom will re-adjust if necessary | ||
1067 | */ | ||
1068 | svc_sock_setbufsize(svsk->sk_sock, | ||
1069 | 3 * svsk->sk_xprt.xpt_server->sv_max_mesg, | ||
1070 | 3 * svsk->sk_xprt.xpt_server->sv_max_mesg); | ||
1071 | |||
1072 | set_bit(XPT_CHNGBUF, &svsk->sk_xprt.xpt_flags); | ||
1046 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); | 1073 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); |
1047 | if (sk->sk_state != TCP_ESTABLISHED) | 1074 | if (sk->sk_state != TCP_ESTABLISHED) |
1048 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); | 1075 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); |
@@ -1112,14 +1139,8 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv, | |||
1112 | /* Initialize the socket */ | 1139 | /* Initialize the socket */ |
1113 | if (sock->type == SOCK_DGRAM) | 1140 | if (sock->type == SOCK_DGRAM) |
1114 | svc_udp_init(svsk, serv); | 1141 | svc_udp_init(svsk, serv); |
1115 | else { | 1142 | else |
1116 | /* initialise setting must have enough space to | ||
1117 | * receive and respond to one request. | ||
1118 | */ | ||
1119 | svc_sock_setbufsize(svsk->sk_sock, 4 * serv->sv_max_mesg, | ||
1120 | 4 * serv->sv_max_mesg); | ||
1121 | svc_tcp_init(svsk, serv); | 1143 | svc_tcp_init(svsk, serv); |
1122 | } | ||
1123 | 1144 | ||
1124 | dprintk("svc: svc_setup_socket created %p (inet %p)\n", | 1145 | dprintk("svc: svc_setup_socket created %p (inet %p)\n", |
1125 | svsk, svsk->sk_sk); | 1146 | svsk, svsk->sk_sk); |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c index 8b510c5e8777..f11be72a1a80 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c +++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c | |||
@@ -128,7 +128,8 @@ static int fast_reg_xdr(struct svcxprt_rdma *xprt, | |||
128 | page_bytes -= sge_bytes; | 128 | page_bytes -= sge_bytes; |
129 | 129 | ||
130 | frmr->page_list->page_list[page_no] = | 130 | frmr->page_list->page_list[page_no] = |
131 | ib_dma_map_page(xprt->sc_cm_id->device, page, 0, | 131 | ib_dma_map_single(xprt->sc_cm_id->device, |
132 | page_address(page), | ||
132 | PAGE_SIZE, DMA_TO_DEVICE); | 133 | PAGE_SIZE, DMA_TO_DEVICE); |
133 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, | 134 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, |
134 | frmr->page_list->page_list[page_no])) | 135 | frmr->page_list->page_list[page_no])) |
@@ -532,18 +533,17 @@ static int send_reply(struct svcxprt_rdma *rdma, | |||
532 | clear_bit(RDMACTXT_F_FAST_UNREG, &ctxt->flags); | 533 | clear_bit(RDMACTXT_F_FAST_UNREG, &ctxt->flags); |
533 | 534 | ||
534 | /* Prepare the SGE for the RPCRDMA Header */ | 535 | /* Prepare the SGE for the RPCRDMA Header */ |
536 | ctxt->sge[0].lkey = rdma->sc_dma_lkey; | ||
537 | ctxt->sge[0].length = svc_rdma_xdr_get_reply_hdr_len(rdma_resp); | ||
535 | ctxt->sge[0].addr = | 538 | ctxt->sge[0].addr = |
536 | ib_dma_map_page(rdma->sc_cm_id->device, | 539 | ib_dma_map_single(rdma->sc_cm_id->device, page_address(page), |
537 | page, 0, PAGE_SIZE, DMA_TO_DEVICE); | 540 | ctxt->sge[0].length, DMA_TO_DEVICE); |
538 | if (ib_dma_mapping_error(rdma->sc_cm_id->device, ctxt->sge[0].addr)) | 541 | if (ib_dma_mapping_error(rdma->sc_cm_id->device, ctxt->sge[0].addr)) |
539 | goto err; | 542 | goto err; |
540 | atomic_inc(&rdma->sc_dma_used); | 543 | atomic_inc(&rdma->sc_dma_used); |
541 | 544 | ||
542 | ctxt->direction = DMA_TO_DEVICE; | 545 | ctxt->direction = DMA_TO_DEVICE; |
543 | 546 | ||
544 | ctxt->sge[0].length = svc_rdma_xdr_get_reply_hdr_len(rdma_resp); | ||
545 | ctxt->sge[0].lkey = rdma->sc_dma_lkey; | ||
546 | |||
547 | /* Determine how many of our SGE are to be transmitted */ | 547 | /* Determine how many of our SGE are to be transmitted */ |
548 | for (sge_no = 1; byte_count && sge_no < vec->count; sge_no++) { | 548 | for (sge_no = 1; byte_count && sge_no < vec->count; sge_no++) { |
549 | sge_bytes = min_t(size_t, vec->sge[sge_no].iov_len, byte_count); | 549 | sge_bytes = min_t(size_t, vec->sge[sge_no].iov_len, byte_count); |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 4b0c2fa15e0b..5151f9f6c573 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | |||
@@ -500,8 +500,8 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt) | |||
500 | BUG_ON(sge_no >= xprt->sc_max_sge); | 500 | BUG_ON(sge_no >= xprt->sc_max_sge); |
501 | page = svc_rdma_get_page(); | 501 | page = svc_rdma_get_page(); |
502 | ctxt->pages[sge_no] = page; | 502 | ctxt->pages[sge_no] = page; |
503 | pa = ib_dma_map_page(xprt->sc_cm_id->device, | 503 | pa = ib_dma_map_single(xprt->sc_cm_id->device, |
504 | page, 0, PAGE_SIZE, | 504 | page_address(page), PAGE_SIZE, |
505 | DMA_FROM_DEVICE); | 505 | DMA_FROM_DEVICE); |
506 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, pa)) | 506 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, pa)) |
507 | goto err_put_ctxt; | 507 | goto err_put_ctxt; |
@@ -1315,8 +1315,8 @@ void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, | |||
1315 | length = svc_rdma_xdr_encode_error(xprt, rmsgp, err, va); | 1315 | length = svc_rdma_xdr_encode_error(xprt, rmsgp, err, va); |
1316 | 1316 | ||
1317 | /* Prepare SGE for local address */ | 1317 | /* Prepare SGE for local address */ |
1318 | sge.addr = ib_dma_map_page(xprt->sc_cm_id->device, | 1318 | sge.addr = ib_dma_map_single(xprt->sc_cm_id->device, |
1319 | p, 0, PAGE_SIZE, DMA_FROM_DEVICE); | 1319 | page_address(p), PAGE_SIZE, DMA_FROM_DEVICE); |
1320 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, sge.addr)) { | 1320 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, sge.addr)) { |
1321 | put_page(p); | 1321 | put_page(p); |
1322 | return; | 1322 | return; |
@@ -1343,7 +1343,7 @@ void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, | |||
1343 | if (ret) { | 1343 | if (ret) { |
1344 | dprintk("svcrdma: Error %d posting send for protocol error\n", | 1344 | dprintk("svcrdma: Error %d posting send for protocol error\n", |
1345 | ret); | 1345 | ret); |
1346 | ib_dma_unmap_page(xprt->sc_cm_id->device, | 1346 | ib_dma_unmap_single(xprt->sc_cm_id->device, |
1347 | sge.addr, PAGE_SIZE, | 1347 | sge.addr, PAGE_SIZE, |
1348 | DMA_FROM_DEVICE); | 1348 | DMA_FROM_DEVICE); |
1349 | svc_rdma_put_context(ctxt, 1); | 1349 | svc_rdma_put_context(ctxt, 1); |
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index a2a792c18c40..d659995ac3ac 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c | |||
@@ -249,6 +249,11 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) | |||
249 | new_hw_ptr = hw_base + pos; | 249 | new_hw_ptr = hw_base + pos; |
250 | } | 250 | } |
251 | } | 251 | } |
252 | |||
253 | /* Do jiffies check only in xrun_debug mode */ | ||
254 | if (!xrun_debug(substream)) | ||
255 | goto no_jiffies_check; | ||
256 | |||
252 | /* Skip the jiffies check for hardwares with BATCH flag. | 257 | /* Skip the jiffies check for hardwares with BATCH flag. |
253 | * Such hardware usually just increases the position at each IRQ, | 258 | * Such hardware usually just increases the position at each IRQ, |
254 | * thus it can't give any strange position. | 259 | * thus it can't give any strange position. |
@@ -336,7 +341,9 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) | |||
336 | hw_base = 0; | 341 | hw_base = 0; |
337 | new_hw_ptr = hw_base + pos; | 342 | new_hw_ptr = hw_base + pos; |
338 | } | 343 | } |
339 | if (((delta * HZ) / runtime->rate) > jdelta + HZ/100) { | 344 | /* Do jiffies check only in xrun_debug mode */ |
345 | if (xrun_debug(substream) && | ||
346 | ((delta * HZ) / runtime->rate) > jdelta + HZ/100) { | ||
340 | hw_ptr_error(substream, | 347 | hw_ptr_error(substream, |
341 | "hw_ptr skipping! " | 348 | "hw_ptr skipping! " |
342 | "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n", | 349 | "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n", |
@@ -1478,7 +1485,6 @@ static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream, | |||
1478 | runtime->status->hw_ptr %= runtime->buffer_size; | 1485 | runtime->status->hw_ptr %= runtime->buffer_size; |
1479 | else | 1486 | else |
1480 | runtime->status->hw_ptr = 0; | 1487 | runtime->status->hw_ptr = 0; |
1481 | runtime->hw_ptr_jiffies = jiffies; | ||
1482 | snd_pcm_stream_unlock_irqrestore(substream, flags); | 1488 | snd_pcm_stream_unlock_irqrestore(substream, flags); |
1483 | return 0; | 1489 | return 0; |
1484 | } | 1490 | } |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index fc6f98e257df..b5da656d1ece 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -848,6 +848,7 @@ static void snd_pcm_post_start(struct snd_pcm_substream *substream, int state) | |||
848 | { | 848 | { |
849 | struct snd_pcm_runtime *runtime = substream->runtime; | 849 | struct snd_pcm_runtime *runtime = substream->runtime; |
850 | snd_pcm_trigger_tstamp(substream); | 850 | snd_pcm_trigger_tstamp(substream); |
851 | runtime->hw_ptr_jiffies = jiffies; | ||
851 | runtime->status->state = state; | 852 | runtime->status->state = state; |
852 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && | 853 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && |
853 | runtime->silence_size > 0) | 854 | runtime->silence_size > 0) |
@@ -961,6 +962,11 @@ static int snd_pcm_do_pause(struct snd_pcm_substream *substream, int push) | |||
961 | { | 962 | { |
962 | if (substream->runtime->trigger_master != substream) | 963 | if (substream->runtime->trigger_master != substream) |
963 | return 0; | 964 | return 0; |
965 | /* The jiffies check in snd_pcm_update_hw_ptr*() is done by | ||
966 | * a delta betwen the current jiffies, this gives a large enough | ||
967 | * delta, effectively to skip the check once. | ||
968 | */ | ||
969 | substream->runtime->hw_ptr_jiffies = jiffies - HZ * 1000; | ||
964 | return substream->ops->trigger(substream, | 970 | return substream->ops->trigger(substream, |
965 | push ? SNDRV_PCM_TRIGGER_PAUSE_PUSH : | 971 | push ? SNDRV_PCM_TRIGGER_PAUSE_PUSH : |
966 | SNDRV_PCM_TRIGGER_PAUSE_RELEASE); | 972 | SNDRV_PCM_TRIGGER_PAUSE_RELEASE); |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 56ce19e68cb5..4fcbe21829ab 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -1848,6 +1848,7 @@ static const char *cxt5051_models[CXT5051_MODELS] = { | |||
1848 | 1848 | ||
1849 | static struct snd_pci_quirk cxt5051_cfg_tbl[] = { | 1849 | static struct snd_pci_quirk cxt5051_cfg_tbl[] = { |
1850 | SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), | 1850 | SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), |
1851 | SND_PCI_QUIRK(0x103c, 0x360b, "Compaq Presario CQ60", CXT5051_HP), | ||
1851 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", | 1852 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", |
1852 | CXT5051_LAPTOP), | 1853 | CXT5051_LAPTOP), |
1853 | SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), | 1854 | SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), |
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 823296d7d578..a6b88482637b 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -3347,7 +3347,7 @@ static int snd_usb_create_quirk(struct snd_usb_audio *chip, | |||
3347 | [QUIRK_MIDI_YAMAHA] = snd_usb_create_midi_interface, | 3347 | [QUIRK_MIDI_YAMAHA] = snd_usb_create_midi_interface, |
3348 | [QUIRK_MIDI_MIDIMAN] = snd_usb_create_midi_interface, | 3348 | [QUIRK_MIDI_MIDIMAN] = snd_usb_create_midi_interface, |
3349 | [QUIRK_MIDI_NOVATION] = snd_usb_create_midi_interface, | 3349 | [QUIRK_MIDI_NOVATION] = snd_usb_create_midi_interface, |
3350 | [QUIRK_MIDI_RAW] = snd_usb_create_midi_interface, | 3350 | [QUIRK_MIDI_FASTLANE] = snd_usb_create_midi_interface, |
3351 | [QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface, | 3351 | [QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface, |
3352 | [QUIRK_MIDI_CME] = snd_usb_create_midi_interface, | 3352 | [QUIRK_MIDI_CME] = snd_usb_create_midi_interface, |
3353 | [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk, | 3353 | [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk, |
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 36e4f7a29adc..8e7f78941ba6 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h | |||
@@ -153,7 +153,7 @@ enum quirk_type { | |||
153 | QUIRK_MIDI_YAMAHA, | 153 | QUIRK_MIDI_YAMAHA, |
154 | QUIRK_MIDI_MIDIMAN, | 154 | QUIRK_MIDI_MIDIMAN, |
155 | QUIRK_MIDI_NOVATION, | 155 | QUIRK_MIDI_NOVATION, |
156 | QUIRK_MIDI_RAW, | 156 | QUIRK_MIDI_FASTLANE, |
157 | QUIRK_MIDI_EMAGIC, | 157 | QUIRK_MIDI_EMAGIC, |
158 | QUIRK_MIDI_CME, | 158 | QUIRK_MIDI_CME, |
159 | QUIRK_MIDI_US122L, | 159 | QUIRK_MIDI_US122L, |
diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 26bad373fe65..2fb35cc22a30 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c | |||
@@ -1778,8 +1778,18 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip, | |||
1778 | umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; | 1778 | umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; |
1779 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); | 1779 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); |
1780 | break; | 1780 | break; |
1781 | case QUIRK_MIDI_RAW: | 1781 | case QUIRK_MIDI_FASTLANE: |
1782 | umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; | 1782 | umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; |
1783 | /* | ||
1784 | * Interface 1 contains isochronous endpoints, but with the same | ||
1785 | * numbers as in interface 0. Since it is interface 1 that the | ||
1786 | * USB core has most recently seen, these descriptors are now | ||
1787 | * associated with the endpoint numbers. This will foul up our | ||
1788 | * attempts to submit bulk/interrupt URBs to the endpoints in | ||
1789 | * interface 0, so we have to make sure that the USB core looks | ||
1790 | * again at interface 0 by calling usb_set_interface() on it. | ||
1791 | */ | ||
1792 | usb_set_interface(umidi->chip->dev, 0, 0); | ||
1783 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); | 1793 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); |
1784 | break; | 1794 | break; |
1785 | case QUIRK_MIDI_EMAGIC: | 1795 | case QUIRK_MIDI_EMAGIC: |
diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h index 647ef5029651..5d955aaad85f 100644 --- a/sound/usb/usbquirks.h +++ b/sound/usb/usbquirks.h | |||
@@ -1868,7 +1868,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
1868 | .data = & (const struct snd_usb_audio_quirk[]) { | 1868 | .data = & (const struct snd_usb_audio_quirk[]) { |
1869 | { | 1869 | { |
1870 | .ifnum = 0, | 1870 | .ifnum = 0, |
1871 | .type = QUIRK_MIDI_RAW | 1871 | .type = QUIRK_MIDI_FASTLANE |
1872 | }, | 1872 | }, |
1873 | { | 1873 | { |
1874 | .ifnum = 1, | 1874 | .ifnum = 1, |