diff options
Diffstat (limited to 'drivers/pci/dwc/pcie-designware-host.c')
-rw-r--r-- | drivers/pci/dwc/pcie-designware-host.c | 20 |
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 | ||
84 | void dw_pcie_msi_init(struct pcie_port *pp) | 81 | void 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); |