|
@@ -385,6 +385,7 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
|
|
|
{
|
|
{
|
|
|
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
|
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
|
|
struct pci_epc *epc = ep->epc;
|
|
struct pci_epc *epc = ep->epc;
|
|
|
|
|
+ unsigned int aligned_offset;
|
|
|
u16 msg_ctrl, msg_data;
|
|
u16 msg_ctrl, msg_data;
|
|
|
u32 msg_addr_lower, msg_addr_upper, reg;
|
|
u32 msg_addr_lower, msg_addr_upper, reg;
|
|
|
u64 msg_addr;
|
|
u64 msg_addr;
|
|
@@ -410,13 +411,15 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
|
|
|
reg = ep->msi_cap + PCI_MSI_DATA_32;
|
|
reg = ep->msi_cap + PCI_MSI_DATA_32;
|
|
|
msg_data = dw_pcie_readw_dbi(pci, reg);
|
|
msg_data = dw_pcie_readw_dbi(pci, reg);
|
|
|
}
|
|
}
|
|
|
- msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower;
|
|
|
|
|
|
|
+ aligned_offset = msg_addr_lower & (epc->mem->page_size - 1);
|
|
|
|
|
+ msg_addr = ((u64)msg_addr_upper) << 32 |
|
|
|
|
|
+ (msg_addr_lower & ~aligned_offset);
|
|
|
ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
|
|
ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
|
|
|
epc->mem->page_size);
|
|
epc->mem->page_size);
|
|
|
if (ret)
|
|
if (ret)
|
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
- writel(msg_data | (interrupt_num - 1), ep->msi_mem);
|
|
|
|
|
|
|
+ writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
|
|
|
|
|
|
|
|
dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
|
|
dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
|
|
|
|
|
|