diff options
Diffstat (limited to 'arch/alpha')
-rw-r--r-- | arch/alpha/include/asm/Kbuild | 1 | ||||
-rw-r--r-- | arch/alpha/include/asm/atomic.h | 9 | ||||
-rw-r--r-- | arch/alpha/include/asm/byteorder.h | 42 | ||||
-rw-r--r-- | arch/alpha/include/asm/swab.h | 42 | ||||
-rw-r--r-- | arch/alpha/kernel/pci.c | 18 | ||||
-rw-r--r-- | arch/alpha/kernel/pci_impl.h | 13 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_dp264.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_eiger.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_miata.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_noritake.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_ruffian.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_sable.c | 2 |
12 files changed, 55 insertions, 82 deletions
diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild index b7c8f188b313..4dad27360576 100644 --- a/arch/alpha/include/asm/Kbuild +++ b/arch/alpha/include/asm/Kbuild | |||
@@ -9,3 +9,4 @@ unifdef-y += console.h | |||
9 | unifdef-y += fpu.h | 9 | unifdef-y += fpu.h |
10 | unifdef-y += sysinfo.h | 10 | unifdef-y += sysinfo.h |
11 | unifdef-y += compiler.h | 11 | unifdef-y += compiler.h |
12 | unifdef-y += swab.h | ||
diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h index ca88e54dec93..62b363584b2b 100644 --- a/arch/alpha/include/asm/atomic.h +++ b/arch/alpha/include/asm/atomic.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef _ALPHA_ATOMIC_H | 1 | #ifndef _ALPHA_ATOMIC_H |
2 | #define _ALPHA_ATOMIC_H | 2 | #define _ALPHA_ATOMIC_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
4 | #include <asm/barrier.h> | 5 | #include <asm/barrier.h> |
5 | #include <asm/system.h> | 6 | #include <asm/system.h> |
6 | 7 | ||
@@ -13,14 +14,6 @@ | |||
13 | */ | 14 | */ |
14 | 15 | ||
15 | 16 | ||
16 | /* | ||
17 | * Counter is volatile to make sure gcc doesn't try to be clever | ||
18 | * and move things around on us. We need to use _exactly_ the address | ||
19 | * the user gave us, not some alias that contains the same information. | ||
20 | */ | ||
21 | typedef struct { volatile int counter; } atomic_t; | ||
22 | typedef struct { volatile long counter; } atomic64_t; | ||
23 | |||
24 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) | 17 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) |
25 | #define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } ) | 18 | #define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } ) |
26 | 19 | ||
diff --git a/arch/alpha/include/asm/byteorder.h b/arch/alpha/include/asm/byteorder.h index 58e958fc7f1b..6772f3168701 100644 --- a/arch/alpha/include/asm/byteorder.h +++ b/arch/alpha/include/asm/byteorder.h | |||
@@ -1,47 +1,7 @@ | |||
1 | #ifndef _ALPHA_BYTEORDER_H | 1 | #ifndef _ALPHA_BYTEORDER_H |
2 | #define _ALPHA_BYTEORDER_H | 2 | #define _ALPHA_BYTEORDER_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm/swab.h> |
5 | #include <linux/compiler.h> | ||
6 | #include <asm/compiler.h> | ||
7 | |||
8 | #ifdef __GNUC__ | ||
9 | |||
10 | static inline __attribute_const__ __u32 __arch__swab32(__u32 x) | ||
11 | { | ||
12 | /* | ||
13 | * Unfortunately, we can't use the 6 instruction sequence | ||
14 | * on ev6 since the latency of the UNPKBW is 3, which is | ||
15 | * pretty hard to hide. Just in case a future implementation | ||
16 | * has a lower latency, here's the sequence (also by Mike Burrows) | ||
17 | * | ||
18 | * UNPKBW a0, v0 v0: 00AA00BB00CC00DD | ||
19 | * SLL v0, 24, a0 a0: BB00CC00DD000000 | ||
20 | * BIS v0, a0, a0 a0: BBAACCBBDDCC00DD | ||
21 | * EXTWL a0, 6, v0 v0: 000000000000BBAA | ||
22 | * ZAP a0, 0xf3, a0 a0: 00000000DDCC0000 | ||
23 | * ADDL a0, v0, v0 v0: ssssssssDDCCBBAA | ||
24 | */ | ||
25 | |||
26 | __u64 t0, t1, t2, t3; | ||
27 | |||
28 | t0 = __kernel_inslh(x, 7); /* t0 : 0000000000AABBCC */ | ||
29 | t1 = __kernel_inswl(x, 3); /* t1 : 000000CCDD000000 */ | ||
30 | t1 |= t0; /* t1 : 000000CCDDAABBCC */ | ||
31 | t2 = t1 >> 16; /* t2 : 0000000000CCDDAA */ | ||
32 | t0 = t1 & 0xFF00FF00; /* t0 : 00000000DD00BB00 */ | ||
33 | t3 = t2 & 0x00FF00FF; /* t3 : 0000000000CC00AA */ | ||
34 | t1 = t0 + t3; /* t1 : ssssssssDDCCBBAA */ | ||
35 | |||
36 | return t1; | ||
37 | } | ||
38 | |||
39 | #define __arch__swab32 __arch__swab32 | ||
40 | |||
41 | #endif /* __GNUC__ */ | ||
42 | |||
43 | #define __BYTEORDER_HAS_U64__ | ||
44 | |||
45 | #include <linux/byteorder/little_endian.h> | 5 | #include <linux/byteorder/little_endian.h> |
46 | 6 | ||
47 | #endif /* _ALPHA_BYTEORDER_H */ | 7 | #endif /* _ALPHA_BYTEORDER_H */ |
diff --git a/arch/alpha/include/asm/swab.h b/arch/alpha/include/asm/swab.h new file mode 100644 index 000000000000..68e7089e02d5 --- /dev/null +++ b/arch/alpha/include/asm/swab.h | |||
@@ -0,0 +1,42 @@ | |||
1 | #ifndef _ALPHA_SWAB_H | ||
2 | #define _ALPHA_SWAB_H | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | #include <linux/compiler.h> | ||
6 | #include <asm/compiler.h> | ||
7 | |||
8 | #ifdef __GNUC__ | ||
9 | |||
10 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | ||
11 | { | ||
12 | /* | ||
13 | * Unfortunately, we can't use the 6 instruction sequence | ||
14 | * on ev6 since the latency of the UNPKBW is 3, which is | ||
15 | * pretty hard to hide. Just in case a future implementation | ||
16 | * has a lower latency, here's the sequence (also by Mike Burrows) | ||
17 | * | ||
18 | * UNPKBW a0, v0 v0: 00AA00BB00CC00DD | ||
19 | * SLL v0, 24, a0 a0: BB00CC00DD000000 | ||
20 | * BIS v0, a0, a0 a0: BBAACCBBDDCC00DD | ||
21 | * EXTWL a0, 6, v0 v0: 000000000000BBAA | ||
22 | * ZAP a0, 0xf3, a0 a0: 00000000DDCC0000 | ||
23 | * ADDL a0, v0, v0 v0: ssssssssDDCCBBAA | ||
24 | */ | ||
25 | |||
26 | __u64 t0, t1, t2, t3; | ||
27 | |||
28 | t0 = __kernel_inslh(x, 7); /* t0 : 0000000000AABBCC */ | ||
29 | t1 = __kernel_inswl(x, 3); /* t1 : 000000CCDD000000 */ | ||
30 | t1 |= t0; /* t1 : 000000CCDDAABBCC */ | ||
31 | t2 = t1 >> 16; /* t2 : 0000000000CCDDAA */ | ||
32 | t0 = t1 & 0xFF00FF00; /* t0 : 00000000DD00BB00 */ | ||
33 | t3 = t2 & 0x00FF00FF; /* t3 : 0000000000CC00AA */ | ||
34 | t1 = t0 + t3; /* t1 : ssssssssDDCCBBAA */ | ||
35 | |||
36 | return t1; | ||
37 | } | ||
38 | #define __arch_swab32 __arch_swab32 | ||
39 | |||
40 | #endif /* __GNUC__ */ | ||
41 | |||
42 | #endif /* _ALPHA_SWAB_H */ | ||
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index ff8cb638472e..a3b938811400 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -320,24 +320,6 @@ pcibios_update_irq(struct pci_dev *dev, int irq) | |||
320 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 320 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
321 | } | 321 | } |
322 | 322 | ||
323 | /* Most Alphas have straight-forward swizzling needs. */ | ||
324 | |||
325 | u8 __init | ||
326 | common_swizzle(struct pci_dev *dev, u8 *pinp) | ||
327 | { | ||
328 | u8 pin = *pinp; | ||
329 | |||
330 | while (dev->bus->parent) { | ||
331 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | ||
332 | /* Move up the chain of bridges. */ | ||
333 | dev = dev->bus->self; | ||
334 | } | ||
335 | *pinp = pin; | ||
336 | |||
337 | /* The slot is the slot of the last bridge. */ | ||
338 | return PCI_SLOT(dev->devfn); | ||
339 | } | ||
340 | |||
341 | void | 323 | void |
342 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | 324 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, |
343 | struct resource *res) | 325 | struct resource *res) |
diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index f8b74995a002..00edd04b585e 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h | |||
@@ -106,16 +106,11 @@ struct pci_iommu_arena; | |||
106 | * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A. | 106 | * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A. |
107 | * Thus, each swizzle is ((pin-1) + (device#-4)) % 4 | 107 | * Thus, each swizzle is ((pin-1) + (device#-4)) % 4 |
108 | * | 108 | * |
109 | * The following code swizzles for exactly one bridge. The routine | 109 | * pci_swizzle_interrupt_pin() swizzles for exactly one bridge. The routine |
110 | * common_swizzle below handles multiple bridges. But there are a | 110 | * pci_common_swizzle() handles multiple bridges. But there are a |
111 | * couple boards that do strange things, so we define this here. | 111 | * couple boards that do strange things. |
112 | */ | 112 | */ |
113 | 113 | ||
114 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
115 | { | ||
116 | return (((pin-1) + slot) % 4) + 1; | ||
117 | } | ||
118 | |||
119 | 114 | ||
120 | /* The following macro is used to implement the table-based irq mapping | 115 | /* The following macro is used to implement the table-based irq mapping |
121 | function for all single-bus Alphas. */ | 116 | function for all single-bus Alphas. */ |
@@ -184,7 +179,7 @@ extern int pci_probe_only; | |||
184 | extern unsigned long alpha_agpgart_size; | 179 | extern unsigned long alpha_agpgart_size; |
185 | 180 | ||
186 | extern void common_init_pci(void); | 181 | extern void common_init_pci(void); |
187 | extern u8 common_swizzle(struct pci_dev *, u8 *); | 182 | #define common_swizzle pci_common_swizzle |
188 | extern struct pci_controller *alloc_pci_controller(void); | 183 | extern struct pci_controller *alloc_pci_controller(void); |
189 | extern struct resource *alloc_resource(void); | 184 | extern struct resource *alloc_resource(void); |
190 | 185 | ||
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index ab44c164d9d4..9c9d1fd4155f 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -481,7 +481,7 @@ monet_swizzle(struct pci_dev *dev, u8 *pinp) | |||
481 | slot = PCI_SLOT(dev->devfn); | 481 | slot = PCI_SLOT(dev->devfn); |
482 | break; | 482 | break; |
483 | } | 483 | } |
484 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; | 484 | pin = pci_swizzle_interrupt_pin(dev, pin); |
485 | 485 | ||
486 | /* Move up the chain of bridges. */ | 486 | /* Move up the chain of bridges. */ |
487 | dev = dev->bus->self; | 487 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 7ef3b6fb3700..baf60f36cbd7 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
@@ -204,7 +204,7 @@ eiger_swizzle(struct pci_dev *dev, u8 *pinp) | |||
204 | break; | 204 | break; |
205 | } | 205 | } |
206 | /* Must be a card-based bridge. */ | 206 | /* Must be a card-based bridge. */ |
207 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 207 | pin = pci_swizzle_interrupt_pin(dev, pin); |
208 | 208 | ||
209 | /* Move up the chain of bridges. */ | 209 | /* Move up the chain of bridges. */ |
210 | dev = dev->bus->self; | 210 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index 910b43cd63e8..61ccd95579ec 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c | |||
@@ -219,7 +219,7 @@ miata_swizzle(struct pci_dev *dev, u8 *pinp) | |||
219 | slot = PCI_SLOT(dev->devfn) + 9; | 219 | slot = PCI_SLOT(dev->devfn) + 9; |
220 | break; | 220 | break; |
221 | } | 221 | } |
222 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 222 | pin = pci_swizzle_interrupt_pin(dev, pin); |
223 | 223 | ||
224 | /* Move up the chain of bridges. */ | 224 | /* Move up the chain of bridges. */ |
225 | dev = dev->bus->self; | 225 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index eb2a1d63f484..538876b62449 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
@@ -257,7 +257,7 @@ noritake_swizzle(struct pci_dev *dev, u8 *pinp) | |||
257 | slot = PCI_SLOT(dev->devfn) + 15; | 257 | slot = PCI_SLOT(dev->devfn) + 15; |
258 | break; | 258 | break; |
259 | } | 259 | } |
260 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; | 260 | pin = pci_swizzle_interrupt_pin(dev, pin); |
261 | 261 | ||
262 | /* Move up the chain of bridges. */ | 262 | /* Move up the chain of bridges. */ |
263 | dev = dev->bus->self; | 263 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 5b99cf3cd69c..f15a329b6011 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c | |||
@@ -160,7 +160,7 @@ ruffian_swizzle(struct pci_dev *dev, u8 *pinp) | |||
160 | slot = PCI_SLOT(dev->devfn) + 10; | 160 | slot = PCI_SLOT(dev->devfn) + 10; |
161 | break; | 161 | break; |
162 | } | 162 | } |
163 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | 163 | pin = pci_swizzle_interrupt_pin(dev, pin); |
164 | 164 | ||
165 | /* Move up the chain of bridges. */ | 165 | /* Move up the chain of bridges. */ |
166 | dev = dev->bus->self; | 166 | dev = dev->bus->self; |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index a4555f497639..d232e42be018 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
@@ -425,7 +425,7 @@ lynx_swizzle(struct pci_dev *dev, u8 *pinp) | |||
425 | slot = PCI_SLOT(dev->devfn) + 11; | 425 | slot = PCI_SLOT(dev->devfn) + 11; |
426 | break; | 426 | break; |
427 | } | 427 | } |
428 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; | 428 | pin = pci_swizzle_interrupt_pin(dev, pin); |
429 | 429 | ||
430 | /* Move up the chain of bridges. */ | 430 | /* Move up the chain of bridges. */ |
431 | dev = dev->bus->self; | 431 | dev = dev->bus->self; |