aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/dwc/pcie-designware-host.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/dwc/pcie-designware-host.c')
-rw-r--r--drivers/pci/dwc/pcie-designware-host.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c
index 81e2157a7cfb..8de2d5c69b1d 100644
--- a/drivers/pci/dwc/pcie-designware-host.c
+++ b/drivers/pci/dwc/pcie-designware-host.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0
1/* 2/*
2 * Synopsys DesignWare PCIe host controller driver 3 * Synopsys DesignWare PCIe host controller driver
3 * 4 *
@@ -5,10 +6,6 @@
5 * http://www.samsung.com 6 * http://www.samsung.com
6 * 7 *
7 * Author: Jingoo Han <jg1.han@samsung.com> 8 * Author: Jingoo Han <jg1.han@samsung.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */ 9 */
13 10
14#include <linux/irqdomain.h> 11#include <linux/irqdomain.h>
@@ -83,10 +80,19 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
83 80
84void dw_pcie_msi_init(struct pcie_port *pp) 81void dw_pcie_msi_init(struct pcie_port *pp)
85{ 82{
83 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
84 struct device *dev = pci->dev;
85 struct page *page;
86 u64 msi_target; 86 u64 msi_target;
87 87
88 pp->msi_data = __get_free_pages(GFP_KERNEL, 0); 88 page = alloc_page(GFP_KERNEL);
89 msi_target = virt_to_phys((void *)pp->msi_data); 89 pp->msi_data = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE);
90 if (dma_mapping_error(dev, pp->msi_data)) {
91 dev_err(dev, "failed to map MSI data\n");
92 __free_page(page);
93 return;
94 }
95 msi_target = (u64)pp->msi_data;
90 96
91 /* program the msi_data */ 97 /* program the msi_data */
92 dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_LO, 4, 98 dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_LO, 4,
@@ -187,7 +193,7 @@ static void dw_msi_setup_msg(struct pcie_port *pp, unsigned int irq, u32 pos)
187 if (pp->ops->get_msi_addr) 193 if (pp->ops->get_msi_addr)
188 msi_target = pp->ops->get_msi_addr(pp); 194 msi_target = pp->ops->get_msi_addr(pp);
189 else 195 else
190 msi_target = virt_to_phys((void *)pp->msi_data); 196 msi_target = (u64)pp->msi_data;
191 197
192 msg.address_lo = (u32)(msi_target & 0xffffffff); 198 msg.address_lo = (u32)(msi_target & 0xffffffff);
193 msg.address_hi = (u32)(msi_target >> 32 & 0xffffffff); 199 msg.address_hi = (u32)(msi_target >> 32 & 0xffffffff);