struct msi_msg *msg)
 {
        struct fsl_msi *msi_data = fsl_msi;
+       struct pci_controller *hose = pci_bus_to_host(pdev->bus);
+       u32 base = 0;
 
-       msg->address_lo = msi_data->msi_addr_lo;
+       pci_bus_read_config_dword(hose->bus,
+               PCI_DEVFN(0, 0), PCI_BASE_ADDRESS_0, &base);
+
+       msg->address_lo = msi_data->msi_addr_lo + base;
        msg->address_hi = msi_data->msi_addr_hi;
        msg->data = hwirq;
 
        msi->irqhost->host_data = msi;
 
        msi->msi_addr_hi = 0x0;
-       msi->msi_addr_lo = res.start + features->msiir_offset;
+       msi->msi_addr_lo = features->msiir_offset + (res.start & 0xfffff);
 
        rc = fsl_msi_init_allocator(msi);
        if (rc) {