Skip to content

Commit 423511e

Browse files
Will McVickerLorenzo Pieralisi
authored andcommitted
PCI: dwc: Drop dependency on ZONE_DMA32
Re-work the msi_msg DMA allocation logic to use dmam_alloc_coherent() which uses the coherent DMA mask to try to return an allocation within the DMA mask limits. With that, we now can drop the msi_page parameter in struct dw_pcie_rp. This allows kernel configurations that disable ZONE_DMA32 to continue supporting a 32-bit DMA mask. Without this patch, the PCIe host device will fail to probe when ZONE_DMA32 is disabled. Link: https://lore.kernel.org/r/20220825235404.4132818-2-willmcvicker@google.com Fixes: 35797e6 ("PCI: dwc: Fix MSI msi_msg DMA mapping") Reported-by: Isaac J. Manjarres <isaacmanjarres@google.com> Signed-off-by: Will McVicker <willmcvicker@google.com> Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org> Reviewed-by: Rob Herring <robh@kernel.org> Acked-by: Jingoo Han <jingoohan1@gmail.com>
1 parent 568035b commit 423511e

File tree

2 files changed

+7
-22
lines changed

2 files changed

+7
-22
lines changed

drivers/pci/controller/dwc/pcie-designware-host.c

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,6 @@ static void dw_pcie_free_msi(struct dw_pcie_rp *pp)
267267

268268
irq_domain_remove(pp->msi_domain);
269269
irq_domain_remove(pp->irq_domain);
270-
271-
if (pp->msi_data) {
272-
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
273-
struct device *dev = pci->dev;
274-
275-
dma_unmap_page(dev, pp->msi_data, PAGE_SIZE, DMA_FROM_DEVICE);
276-
if (pp->msi_page)
277-
__free_page(pp->msi_page);
278-
}
279270
}
280271

281272
static void dw_pcie_msi_init(struct dw_pcie_rp *pp)
@@ -336,6 +327,7 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
336327
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
337328
struct device *dev = pci->dev;
338329
struct platform_device *pdev = to_platform_device(dev);
330+
u64 *msi_vaddr;
339331
int ret;
340332
u32 ctrl, num_ctrls;
341333

@@ -375,22 +367,16 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
375367
dw_chained_msi_isr, pp);
376368
}
377369

378-
ret = dma_set_mask(dev, DMA_BIT_MASK(32));
370+
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
379371
if (ret)
380372
dev_warn(dev, "Failed to set DMA mask to 32-bit. Devices with only 32-bit MSI support may not work properly\n");
381373

382-
pp->msi_page = alloc_page(GFP_DMA32);
383-
pp->msi_data = dma_map_page(dev, pp->msi_page, 0,
384-
PAGE_SIZE, DMA_FROM_DEVICE);
385-
ret = dma_mapping_error(dev, pp->msi_data);
386-
if (ret) {
387-
dev_err(pci->dev, "Failed to map MSI data\n");
388-
__free_page(pp->msi_page);
389-
pp->msi_page = NULL;
390-
pp->msi_data = 0;
374+
msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data,
375+
GFP_KERNEL);
376+
if (!msi_vaddr) {
377+
dev_err(dev, "Failed to alloc and map MSI data\n");
391378
dw_pcie_free_msi(pp);
392-
393-
return ret;
379+
return -ENOMEM;
394380
}
395381

396382
return 0;

drivers/pci/controller/dwc/pcie-designware.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ struct dw_pcie_rp {
243243
struct irq_domain *irq_domain;
244244
struct irq_domain *msi_domain;
245245
dma_addr_t msi_data;
246-
struct page *msi_page;
247246
struct irq_chip *msi_irq_chip;
248247
u32 num_vectors;
249248
u32 irq_mask[MAX_MSI_CTRLS];

0 commit comments

Comments
 (0)