diff options
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-designware-ep.c | 7 |
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 | ||
