diff options
Diffstat (limited to 'arch/ia64/sn')
-rw-r--r-- | arch/ia64/sn/kernel/io_init.c | 29 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/irq.c | 21 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/tiocx.c | 10 | ||||
-rw-r--r-- | arch/ia64/sn/pci/pcibr/pcibr_provider.c | 17 |
4 files changed, 55 insertions, 22 deletions
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index dfb3f2902379..5101ac462643 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -13,6 +13,8 @@ | |||
13 | #include <asm/sn/sn_feature_sets.h> | 13 | #include <asm/sn/sn_feature_sets.h> |
14 | #include <asm/sn/geo.h> | 14 | #include <asm/sn/geo.h> |
15 | #include <asm/sn/io.h> | 15 | #include <asm/sn/io.h> |
16 | #include <asm/sn/l1.h> | ||
17 | #include <asm/sn/module.h> | ||
16 | #include <asm/sn/pcibr_provider.h> | 18 | #include <asm/sn/pcibr_provider.h> |
17 | #include <asm/sn/pcibus_provider_defs.h> | 19 | #include <asm/sn/pcibus_provider_defs.h> |
18 | #include <asm/sn/pcidev.h> | 20 | #include <asm/sn/pcidev.h> |
@@ -710,9 +712,36 @@ cnodeid_get_geoid(cnodeid_t cnode) | |||
710 | return hubdev->hdi_geoid; | 712 | return hubdev->hdi_geoid; |
711 | } | 713 | } |
712 | 714 | ||
715 | void sn_generate_path(struct pci_bus *pci_bus, char *address) | ||
716 | { | ||
717 | nasid_t nasid; | ||
718 | cnodeid_t cnode; | ||
719 | geoid_t geoid; | ||
720 | moduleid_t moduleid; | ||
721 | u16 bricktype; | ||
722 | |||
723 | nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base); | ||
724 | cnode = nasid_to_cnodeid(nasid); | ||
725 | geoid = cnodeid_get_geoid(cnode); | ||
726 | moduleid = geo_module(geoid); | ||
727 | |||
728 | sprintf(address, "module_%c%c%c%c%.2d", | ||
729 | '0'+RACK_GET_CLASS(MODULE_GET_RACK(moduleid)), | ||
730 | '0'+RACK_GET_GROUP(MODULE_GET_RACK(moduleid)), | ||
731 | '0'+RACK_GET_NUM(MODULE_GET_RACK(moduleid)), | ||
732 | MODULE_GET_BTCHAR(moduleid), MODULE_GET_BPOS(moduleid)); | ||
733 | |||
734 | /* Tollhouse requires slot id to be displayed */ | ||
735 | bricktype = MODULE_GET_BTYPE(moduleid); | ||
736 | if ((bricktype == L1_BRICKTYPE_191010) || | ||
737 | (bricktype == L1_BRICKTYPE_1932)) | ||
738 | sprintf(address, "%s^%d", address, geo_slot(geoid)); | ||
739 | } | ||
740 | |||
713 | subsys_initcall(sn_pci_init); | 741 | subsys_initcall(sn_pci_init); |
714 | EXPORT_SYMBOL(sn_pci_fixup_slot); | 742 | EXPORT_SYMBOL(sn_pci_fixup_slot); |
715 | EXPORT_SYMBOL(sn_pci_unfixup_slot); | 743 | EXPORT_SYMBOL(sn_pci_unfixup_slot); |
716 | EXPORT_SYMBOL(sn_pci_controller_fixup); | 744 | EXPORT_SYMBOL(sn_pci_controller_fixup); |
717 | EXPORT_SYMBOL(sn_bus_store_sysdata); | 745 | EXPORT_SYMBOL(sn_bus_store_sysdata); |
718 | EXPORT_SYMBOL(sn_bus_free_sysdata); | 746 | EXPORT_SYMBOL(sn_bus_free_sysdata); |
747 | EXPORT_SYMBOL(sn_generate_path); | ||
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index c373113d073a..c265e02f5036 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c | |||
@@ -350,9 +350,6 @@ static void force_interrupt(int irq) | |||
350 | static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info) | 350 | static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info) |
351 | { | 351 | { |
352 | u64 regval; | 352 | u64 regval; |
353 | int irr_reg_num; | ||
354 | int irr_bit; | ||
355 | u64 irr_reg; | ||
356 | struct pcidev_info *pcidev_info; | 353 | struct pcidev_info *pcidev_info; |
357 | struct pcibus_info *pcibus_info; | 354 | struct pcibus_info *pcibus_info; |
358 | 355 | ||
@@ -373,23 +370,7 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info) | |||
373 | pdi_pcibus_info; | 370 | pdi_pcibus_info; |
374 | regval = pcireg_intr_status_get(pcibus_info); | 371 | regval = pcireg_intr_status_get(pcibus_info); |
375 | 372 | ||
376 | irr_reg_num = irq_to_vector(irq) / 64; | 373 | if (!ia64_get_irr(irq_to_vector(irq))) { |
377 | irr_bit = irq_to_vector(irq) % 64; | ||
378 | switch (irr_reg_num) { | ||
379 | case 0: | ||
380 | irr_reg = ia64_getreg(_IA64_REG_CR_IRR0); | ||
381 | break; | ||
382 | case 1: | ||
383 | irr_reg = ia64_getreg(_IA64_REG_CR_IRR1); | ||
384 | break; | ||
385 | case 2: | ||
386 | irr_reg = ia64_getreg(_IA64_REG_CR_IRR2); | ||
387 | break; | ||
388 | case 3: | ||
389 | irr_reg = ia64_getreg(_IA64_REG_CR_IRR3); | ||
390 | break; | ||
391 | } | ||
392 | if (!test_bit(irr_bit, &irr_reg)) { | ||
393 | if (!test_bit(irq, pda->sn_in_service_ivecs)) { | 374 | if (!test_bit(irq, pda->sn_in_service_ivecs)) { |
394 | regval &= 0xff; | 375 | regval &= 0xff; |
395 | if (sn_irq_info->irq_int_bit & regval & | 376 | if (sn_irq_info->irq_int_bit & regval & |
diff --git a/arch/ia64/sn/kernel/tiocx.c b/arch/ia64/sn/kernel/tiocx.c index 99cb28e74295..feaf1a6e8101 100644 --- a/arch/ia64/sn/kernel/tiocx.c +++ b/arch/ia64/sn/kernel/tiocx.c | |||
@@ -369,9 +369,15 @@ static void tio_corelet_reset(nasid_t nasid, int corelet) | |||
369 | 369 | ||
370 | static int is_fpga_tio(int nasid, int *bt) | 370 | static int is_fpga_tio(int nasid, int *bt) |
371 | { | 371 | { |
372 | int ioboard_type; | 372 | u16 ioboard_type; |
373 | s64 rc; | ||
373 | 374 | ||
374 | ioboard_type = ia64_sn_sysctl_ioboard_get(nasid); | 375 | rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard_type); |
376 | if (rc) { | ||
377 | printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n", | ||
378 | rc); | ||
379 | return 0; | ||
380 | } | ||
375 | 381 | ||
376 | switch (ioboard_type) { | 382 | switch (ioboard_type) { |
377 | case L1_BRICKTYPE_SA: | 383 | case L1_BRICKTYPE_SA: |
diff --git a/arch/ia64/sn/pci/pcibr/pcibr_provider.c b/arch/ia64/sn/pci/pcibr/pcibr_provider.c index 98f716bd92f0..ab1211ef0176 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_provider.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_provider.c | |||
@@ -74,6 +74,22 @@ static int sal_pcibr_error_interrupt(struct pcibus_info *soft) | |||
74 | return (int)ret_stuff.v0; | 74 | return (int)ret_stuff.v0; |
75 | } | 75 | } |
76 | 76 | ||
77 | u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus) | ||
78 | { | ||
79 | s64 rc; | ||
80 | u16 ioboard; | ||
81 | nasid_t nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base); | ||
82 | |||
83 | rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard); | ||
84 | if (rc) { | ||
85 | printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n", | ||
86 | rc); | ||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | return ioboard; | ||
91 | } | ||
92 | |||
77 | /* | 93 | /* |
78 | * PCI Bridge Error interrupt handler. Gets invoked whenever a PCI | 94 | * PCI Bridge Error interrupt handler. Gets invoked whenever a PCI |
79 | * bridge sends an error interrupt. | 95 | * bridge sends an error interrupt. |
@@ -255,3 +271,4 @@ pcibr_init_provider(void) | |||
255 | 271 | ||
256 | EXPORT_SYMBOL_GPL(sal_pcibr_slot_enable); | 272 | EXPORT_SYMBOL_GPL(sal_pcibr_slot_enable); |
257 | EXPORT_SYMBOL_GPL(sal_pcibr_slot_disable); | 273 | EXPORT_SYMBOL_GPL(sal_pcibr_slot_disable); |
274 | EXPORT_SYMBOL_GPL(sn_ioboard_to_pci_bus); | ||