[PATCH] platforms/powernv: Fix update of NVLink DMA mask

Alistair Popple alistair at popple.id.au
Fri Jan 8 11:35:09 AEDT 2016


The emulated NVLink PCI devices share the same IODA2 TCE tables but
only support a single TVT (instead of the normal two for PCI
devices). This requires the kernel to manually replace windows with
either the bypass or non-bypass window depending on what the driver
has requested.

Unfortunately an incorrect optimisation was made in
pnv_pci_ioda_dma_set_mask() which caused updating of some NPU device
PEs to be skipped in certain configurations due to an incorrect
assumption that a NULL peer PE in the array indicated there were no
more peers present. This patch fixes the problem by ensuring all peer
PEs are updated.

Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
 arch/powerpc/platforms/powernv/pci-ioda.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 323e1e5..458133f 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1612,7 +1612,10 @@ static int pnv_pci_ioda_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
 
 	/* Update peer npu devices */
 	if (pe->flags & PNV_IODA_PE_PEER)
-		for (i = 0; pe->peers[i]; i++) {
+		for (i = 0; i < PNV_IODA_MAX_PEER_PES; i++) {
+			if (!pe->peers[i])
+				continue;
+
 			linked_npu_dev = pe->peers[i]->pdev;
 			if (dma_get_mask(&linked_npu_dev->dev) != dma_mask)
 				dma_set_mask(&linked_npu_dev->dev, dma_mask);
-- 
2.1.4



More information about the Linuxppc-dev mailing list