diff options
author | David S. Miller <davem@davemloft.net> | 2008-09-10 07:13:10 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-09-11 02:14:46 -0400 |
commit | 87395fc6781ff269bad7f972b8abf2312a8ccdf6 (patch) | |
tree | 8b47f5a0b948cb3aac1f19f1d63d90e9be478909 /arch/sparc64/kernel/pci_sabre.c | |
parent | e6e003720fd7123482f77dcec19e930d272937fe (diff) |
sparc64: Kill hand-crafted I/O accessors in PCI controller drivers.
Use existing upa_{read,write}q() interfaces instead.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/pci_sabre.c')
-rw-r--r-- | arch/sparc64/kernel/pci_sabre.c | 61 |
1 files changed, 22 insertions, 39 deletions
diff --git a/arch/sparc64/kernel/pci_sabre.c b/arch/sparc64/kernel/pci_sabre.c index f8089aa84f64..713257b6963c 100644 --- a/arch/sparc64/kernel/pci_sabre.c +++ b/arch/sparc64/kernel/pci_sabre.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/iommu.h> | 17 | #include <asm/iommu.h> |
18 | #include <asm/irq.h> | 18 | #include <asm/irq.h> |
19 | #include <asm/prom.h> | 19 | #include <asm/prom.h> |
20 | #include <asm/upa.h> | ||
20 | 21 | ||
21 | #include "pci_impl.h" | 22 | #include "pci_impl.h" |
22 | #include "iommu_common.h" | 23 | #include "iommu_common.h" |
@@ -25,25 +26,6 @@ | |||
25 | #define DRIVER_NAME "sabre" | 26 | #define DRIVER_NAME "sabre" |
26 | #define PFX DRIVER_NAME ": " | 27 | #define PFX DRIVER_NAME ": " |
27 | 28 | ||
28 | /* All SABRE registers are 64-bits. The following accessor | ||
29 | * routines are how they are accessed. The REG parameter | ||
30 | * is a physical address. | ||
31 | */ | ||
32 | #define sabre_read(__reg) \ | ||
33 | ({ u64 __ret; \ | ||
34 | __asm__ __volatile__("ldxa [%1] %2, %0" \ | ||
35 | : "=r" (__ret) \ | ||
36 | : "r" (__reg), "i" (ASI_PHYS_BYPASS_EC_E) \ | ||
37 | : "memory"); \ | ||
38 | __ret; \ | ||
39 | }) | ||
40 | #define sabre_write(__reg, __val) \ | ||
41 | __asm__ __volatile__("stxa %0, [%1] %2" \ | ||
42 | : /* no outputs */ \ | ||
43 | : "r" (__val), "r" (__reg), \ | ||
44 | "i" (ASI_PHYS_BYPASS_EC_E) \ | ||
45 | : "memory") | ||
46 | |||
47 | /* SABRE PCI controller register offsets and definitions. */ | 29 | /* SABRE PCI controller register offsets and definitions. */ |
48 | #define SABRE_UE_AFSR 0x0030UL | 30 | #define SABRE_UE_AFSR 0x0030UL |
49 | #define SABRE_UEAFSR_PDRD 0x4000000000000000UL /* Primary PCI DMA Read */ | 31 | #define SABRE_UEAFSR_PDRD 0x4000000000000000UL /* Primary PCI DMA Read */ |
@@ -219,8 +201,8 @@ static irqreturn_t sabre_ue_intr(int irq, void *dev_id) | |||
219 | int reported; | 201 | int reported; |
220 | 202 | ||
221 | /* Latch uncorrectable error status. */ | 203 | /* Latch uncorrectable error status. */ |
222 | afar = sabre_read(afar_reg); | 204 | afar = upa_readq(afar_reg); |
223 | afsr = sabre_read(afsr_reg); | 205 | afsr = upa_readq(afsr_reg); |
224 | 206 | ||
225 | /* Clear the primary/secondary error status bits. */ | 207 | /* Clear the primary/secondary error status bits. */ |
226 | error_bits = afsr & | 208 | error_bits = afsr & |
@@ -229,7 +211,7 @@ static irqreturn_t sabre_ue_intr(int irq, void *dev_id) | |||
229 | SABRE_UEAFSR_SDTE | SABRE_UEAFSR_PDTE); | 211 | SABRE_UEAFSR_SDTE | SABRE_UEAFSR_PDTE); |
230 | if (!error_bits) | 212 | if (!error_bits) |
231 | return IRQ_NONE; | 213 | return IRQ_NONE; |
232 | sabre_write(afsr_reg, error_bits); | 214 | upa_writeq(error_bits, afsr_reg); |
233 | 215 | ||
234 | /* Log the error. */ | 216 | /* Log the error. */ |
235 | printk("%s: Uncorrectable Error, primary error type[%s%s]\n", | 217 | printk("%s: Uncorrectable Error, primary error type[%s%s]\n", |
@@ -279,8 +261,8 @@ static irqreturn_t sabre_ce_intr(int irq, void *dev_id) | |||
279 | int reported; | 261 | int reported; |
280 | 262 | ||
281 | /* Latch error status. */ | 263 | /* Latch error status. */ |
282 | afar = sabre_read(afar_reg); | 264 | afar = upa_readq(afar_reg); |
283 | afsr = sabre_read(afsr_reg); | 265 | afsr = upa_readq(afsr_reg); |
284 | 266 | ||
285 | /* Clear primary/secondary error status bits. */ | 267 | /* Clear primary/secondary error status bits. */ |
286 | error_bits = afsr & | 268 | error_bits = afsr & |
@@ -288,7 +270,7 @@ static irqreturn_t sabre_ce_intr(int irq, void *dev_id) | |||
288 | SABRE_CEAFSR_SDRD | SABRE_CEAFSR_SDWR); | 270 | SABRE_CEAFSR_SDRD | SABRE_CEAFSR_SDWR); |
289 | if (!error_bits) | 271 | if (!error_bits) |
290 | return IRQ_NONE; | 272 | return IRQ_NONE; |
291 | sabre_write(afsr_reg, error_bits); | 273 | upa_writeq(error_bits, afsr_reg); |
292 | 274 | ||
293 | /* Log the error. */ | 275 | /* Log the error. */ |
294 | printk("%s: Correctable Error, primary error type[%s]\n", | 276 | printk("%s: Correctable Error, primary error type[%s]\n", |
@@ -354,19 +336,20 @@ static void sabre_register_error_handlers(struct pci_pbm_info *pbm) | |||
354 | * registering the handler so that we don't get spurious | 336 | * registering the handler so that we don't get spurious |
355 | * interrupts. | 337 | * interrupts. |
356 | */ | 338 | */ |
357 | sabre_write(base + SABRE_UE_AFSR, | 339 | upa_writeq((SABRE_UEAFSR_PDRD | SABRE_UEAFSR_PDWR | |
358 | (SABRE_UEAFSR_PDRD | SABRE_UEAFSR_PDWR | | 340 | SABRE_UEAFSR_SDRD | SABRE_UEAFSR_SDWR | |
359 | SABRE_UEAFSR_SDRD | SABRE_UEAFSR_SDWR | | 341 | SABRE_UEAFSR_SDTE | SABRE_UEAFSR_PDTE), |
360 | SABRE_UEAFSR_SDTE | SABRE_UEAFSR_PDTE)); | 342 | base + SABRE_UE_AFSR); |
361 | 343 | ||
362 | err = request_irq(op->irqs[1], sabre_ue_intr, 0, "SABRE_UE", pbm); | 344 | err = request_irq(op->irqs[1], sabre_ue_intr, 0, "SABRE_UE", pbm); |
363 | if (err) | 345 | if (err) |
364 | printk(KERN_WARNING "%s: Couldn't register UE, err=%d.\n", | 346 | printk(KERN_WARNING "%s: Couldn't register UE, err=%d.\n", |
365 | pbm->name, err); | 347 | pbm->name, err); |
366 | 348 | ||
367 | sabre_write(base + SABRE_CE_AFSR, | 349 | upa_writeq((SABRE_CEAFSR_PDRD | SABRE_CEAFSR_PDWR | |
368 | (SABRE_CEAFSR_PDRD | SABRE_CEAFSR_PDWR | | 350 | SABRE_CEAFSR_SDRD | SABRE_CEAFSR_SDWR), |
369 | SABRE_CEAFSR_SDRD | SABRE_CEAFSR_SDWR)); | 351 | base + SABRE_CE_AFSR); |
352 | |||
370 | 353 | ||
371 | err = request_irq(op->irqs[2], sabre_ce_intr, 0, "SABRE_CE", pbm); | 354 | err = request_irq(op->irqs[2], sabre_ce_intr, 0, "SABRE_CE", pbm); |
372 | if (err) | 355 | if (err) |
@@ -378,9 +361,9 @@ static void sabre_register_error_handlers(struct pci_pbm_info *pbm) | |||
378 | printk(KERN_WARNING "%s: Couldn't register PCIERR, err=%d.\n", | 361 | printk(KERN_WARNING "%s: Couldn't register PCIERR, err=%d.\n", |
379 | pbm->name, err); | 362 | pbm->name, err); |
380 | 363 | ||
381 | tmp = sabre_read(base + SABRE_PCICTRL); | 364 | tmp = upa_readq(base + SABRE_PCICTRL); |
382 | tmp |= SABRE_PCICTRL_ERREN; | 365 | tmp |= SABRE_PCICTRL_ERREN; |
383 | sabre_write(base + SABRE_PCICTRL, tmp); | 366 | upa_writeq(tmp, base + SABRE_PCICTRL); |
384 | } | 367 | } |
385 | 368 | ||
386 | static void apb_init(struct pci_bus *sabre_bus) | 369 | static void apb_init(struct pci_bus *sabre_bus) |
@@ -533,16 +516,16 @@ static int __devinit sabre_probe(struct of_device *op, | |||
533 | 516 | ||
534 | /* PCI first */ | 517 | /* PCI first */ |
535 | for (clear_irq = SABRE_ICLR_A_SLOT0; clear_irq < SABRE_ICLR_B_SLOT0 + 0x80; clear_irq += 8) | 518 | for (clear_irq = SABRE_ICLR_A_SLOT0; clear_irq < SABRE_ICLR_B_SLOT0 + 0x80; clear_irq += 8) |
536 | sabre_write(pbm->controller_regs + clear_irq, 0x0UL); | 519 | upa_writeq(0x0UL, pbm->controller_regs + clear_irq); |
537 | 520 | ||
538 | /* Then OBIO */ | 521 | /* Then OBIO */ |
539 | for (clear_irq = SABRE_ICLR_SCSI; clear_irq < SABRE_ICLR_SCSI + 0x80; clear_irq += 8) | 522 | for (clear_irq = SABRE_ICLR_SCSI; clear_irq < SABRE_ICLR_SCSI + 0x80; clear_irq += 8) |
540 | sabre_write(pbm->controller_regs + clear_irq, 0x0UL); | 523 | upa_writeq(0x0UL, pbm->controller_regs + clear_irq); |
541 | 524 | ||
542 | /* Error interrupts are enabled later after the bus scan. */ | 525 | /* Error interrupts are enabled later after the bus scan. */ |
543 | sabre_write(pbm->controller_regs + SABRE_PCICTRL, | 526 | upa_writeq((SABRE_PCICTRL_MRLEN | SABRE_PCICTRL_SERR | |
544 | (SABRE_PCICTRL_MRLEN | SABRE_PCICTRL_SERR | | 527 | SABRE_PCICTRL_ARBPARK | SABRE_PCICTRL_AEN), |
545 | SABRE_PCICTRL_ARBPARK | SABRE_PCICTRL_AEN)); | 528 | pbm->controller_regs + SABRE_PCICTRL); |
546 | 529 | ||
547 | /* Now map in PCI config space for entire SABRE. */ | 530 | /* Now map in PCI config space for entire SABRE. */ |
548 | pbm->config_space = pbm->controller_regs + SABRE_CONFIGSPACE; | 531 | pbm->config_space = pbm->controller_regs + SABRE_CONFIGSPACE; |