// SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
 #define QCN9274_DEVICE_ID              0x1109
 #define WCN7850_DEVICE_ID              0x1107
 
+#define PCIE_LOCAL_REG_QRTR_NODE_ID    0x1E03164
+#define DOMAIN_NUMBER_MASK             GENMASK(7, 4)
+#define BUS_NUMBER_MASK                        GENMASK(3, 0)
+
 static const struct pci_device_id ath12k_pci_id_table[] = {
        { PCI_VDEVICE(QCOM, QCN9274_DEVICE_ID) },
        { PCI_VDEVICE(QCOM, WCN7850_DEVICE_ID) },
 {
        struct ath12k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg;
 
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
+       struct pci_bus *bus = ab_pci->pdev->bus;
+
        cfg->tgt_ce = ab->hw_params->target_ce_config;
        cfg->tgt_ce_len = ab->hw_params->target_ce_count;
 
        cfg->svc_to_ce_map = ab->hw_params->svc_to_ce_map;
        cfg->svc_to_ce_map_len = ab->hw_params->svc_to_ce_map_len;
        ab->qmi.service_ins_id = ab->hw_params->qmi_service_ins_id;
+
+       if (test_bit(ATH12K_FW_FEATURE_MULTI_QRTR_ID, ab->fw.fw_features)) {
+               ab_pci->qmi_instance =
+                       u32_encode_bits(pci_domain_nr(bus), DOMAIN_NUMBER_MASK) |
+                       u32_encode_bits(bus->number, BUS_NUMBER_MASK);
+               ab->qmi.service_ins_id += ab_pci->qmi_instance;
+       }
 }
 
 static void ath12k_pci_ce_irqs_enable(struct ath12k_base *ab)
        set_bit(ATH12K_PCI_ASPM_RESTORE, &ab_pci->flags);
 }
 
+static void ath12k_pci_update_qrtr_node_id(struct ath12k_base *ab)
+{
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
+       u32 reg;
+
+       /* On platforms with two or more identical mhi devices, qmi service run
+        * with identical qrtr-node-id. Because of this identical ID qrtr-lookup
+        * cannot register more than one qmi service with identical node ID.
+        *
+        * This generates a unique instance ID from PCIe domain number and bus number,
+        * writes to the given register, it is available for firmware when the QMI service
+        * is spawned.
+        */
+       reg = PCIE_LOCAL_REG_QRTR_NODE_ID & WINDOW_RANGE_MASK;
+       ath12k_pci_write32(ab, reg, ab_pci->qmi_instance);
+
+       ath12k_dbg(ab, ATH12K_DBG_PCI, "pci reg 0x%x instance 0x%x read val 0x%x\n",
+                  reg, ab_pci->qmi_instance, ath12k_pci_read32(ab, reg));
+}
+
 static void ath12k_pci_aspm_restore(struct ath12k_pci *ab_pci)
 {
        if (test_and_clear_bit(ATH12K_PCI_ASPM_RESTORE, &ab_pci->flags))
 
        ath12k_pci_msi_enable(ab_pci);
 
+       if (test_bit(ATH12K_FW_FEATURE_MULTI_QRTR_ID, ab->fw.fw_features))
+               ath12k_pci_update_qrtr_node_id(ab);
+
        ret = ath12k_mhi_start(ab_pci);
        if (ret) {
                ath12k_err(ab, "failed to start mhi: %d\n", ret);