aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/controller/dwc/pcie-designware-ep.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
index 0c208b9bda43..2bf5a35c0570 100644
--- a/drivers/pci/controller/dwc/pcie-designware-ep.c
+++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
@@ -397,6 +397,7 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
397{ 397{
398 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); 398 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
399 struct pci_epc *epc = ep->epc; 399 struct pci_epc *epc = ep->epc;
400 unsigned int aligned_offset;
400 u16 msg_ctrl, msg_data; 401 u16 msg_ctrl, msg_data;
401 u32 msg_addr_lower, msg_addr_upper, reg; 402 u32 msg_addr_lower, msg_addr_upper, reg;
402 u64 msg_addr; 403 u64 msg_addr;
@@ -422,13 +423,15 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
422 reg = ep->msi_cap + PCI_MSI_DATA_32; 423 reg = ep->msi_cap + PCI_MSI_DATA_32;
423 msg_data = dw_pcie_readw_dbi(pci, reg); 424 msg_data = dw_pcie_readw_dbi(pci, reg);
424 } 425 }
425 msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower; 426 aligned_offset = msg_addr_lower & (epc->mem->page_size - 1);
427 msg_addr = ((u64)msg_addr_upper) << 32 |
428 (msg_addr_lower & ~aligned_offset);
426 ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr, 429 ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
427 epc->mem->page_size); 430 epc->mem->page_size);
428 if (ret) 431 if (ret)
429 return ret; 432 return ret;
430 433
431 writel(msg_data | (interrupt_num - 1), ep->msi_mem); 434 writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
432 435
433 dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys); 436 dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
434 437