blob: 835f36da3d07039151ba505d554b68c042f2ace8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
From 77765c2a47ce43911b8fe7b09f037c9bc13008ca Mon Sep 17 00:00:00 2001
From: Jeff Kubascik <jeff.kubascik@dornerworks.com>
Date: Tue, 30 Jul 2019 08:49:56 -0400
Subject: [PATCH 3/4] Fix PCIe in dom0 for RPi4
There is an issue where the Broadcom PCIe driver and Xen swiotlb layer
invoke each other's dma alloc function recursively until the stack blows
up. The cause appears to be due to arch_setup_dma_ops being called
more than once for the device, possibly through of_dma_configure, and
screwing up the dma_ops pointers. This patch adds a check to make sure
that the xen_dma_ops are applied only once for a device.
---
arch/arm64/mm/dma-mapping.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index d3a5bb16f..243a3b9be 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -895,7 +895,7 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
__iommu_setup_dma_ops(dev, dma_base, size, iommu);
#ifdef CONFIG_XEN
- if (xen_initial_domain()) {
+ if (!dev->archdata.dev_dma_ops && xen_initial_domain()) {
dev->archdata.dev_dma_ops = dev->dma_ops;
dev->dma_ops = xen_dma_ops;
}
--
2.17.1
|