Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[IA64] SGI Altix : fix pcibr_dmamap_ate32() bug

On a SGI Altix TIOCP based PCI bus we need to include the ATE_PIO attribute
bit if we're mapping a 32bit MSI address.

Signed-off-by: Mike Habeck <habeck@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>

authored by

Mike Habeck and committed by
Tony Luck
2e0d232b 8a3a78d1

+9 -4
+6 -2
arch/ia64/sn/pci/pcibr/pcibr_dma.c
··· 96 96 } 97 97 98 98 /* 99 - * If we're mapping for MSI, set the MSI bit in the ATE 99 + * If we're mapping for MSI, set the MSI bit in the ATE. If it's a 100 + * TIOCP based pci bus, we also need to set the PIO bit in the ATE. 100 101 */ 101 - if (dma_flags & SN_DMA_MSI) 102 + if (dma_flags & SN_DMA_MSI) { 102 103 ate |= PCI32_ATE_MSI; 104 + if (IS_TIOCP_SOFT(pcibus_info)) 105 + ate |= PCI32_ATE_PIO; 106 + } 103 107 104 108 ate_write(pcibus_info, ate_index, ate_count, ate); 105 109
+3 -2
include/asm-ia64/sn/pcibr_provider.h
··· 21 21 #define IS_PCI_BRIDGE_ASIC(asic) (asic == PCIIO_ASIC_TYPE_PIC || \ 22 22 asic == PCIIO_ASIC_TYPE_TIOCP) 23 23 #define IS_PIC_SOFT(ps) (ps->pbi_bridge_type == PCIBR_BRIDGETYPE_PIC) 24 + #define IS_TIOCP_SOFT(ps) (ps->pbi_bridge_type == PCIBR_BRIDGETYPE_TIOCP) 24 25 25 26 26 27 /* ··· 54 53 * Bridge PMU Address Transaltion Entry Attibutes 55 54 */ 56 55 #define PCI32_ATE_V (0x1 << 0) 57 - #define PCI32_ATE_CO (0x1 << 1) 58 - #define PCI32_ATE_PREC (0x1 << 2) 56 + #define PCI32_ATE_CO (0x1 << 1) /* PIC ASIC ONLY */ 57 + #define PCI32_ATE_PIO (0x1 << 1) /* TIOCP ASIC ONLY */ 59 58 #define PCI32_ATE_MSI (0x1 << 2) 60 59 #define PCI32_ATE_PREF (0x1 << 3) 61 60 #define PCI32_ATE_BAR (0x1 << 4)