module_param(mhi_timeout_ms, uint, 0600);
 MODULE_PARM_DESC(mhi_timeout_ms, "MHI controller timeout value");
 
+static const char *fw_image_paths[FAMILY_MAX] = {
+       [FAMILY_AIC100] = "qcom/aic100/sbl.bin",
+       [FAMILY_AIC200] = "qcom/aic200/sbl.bin",
+};
+
 static const struct mhi_channel_config aic100_channels[] = {
        {
                .name = "QAIC_LOOPBACK",
        },
 };
 
+static const struct mhi_channel_config aic200_channels[] = {
+       {
+               .name = "QAIC_LOOPBACK",
+               .num = 0,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_LOOPBACK",
+               .num = 1,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_SAHARA",
+               .num = 2,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_SBL,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_SAHARA",
+               .num = 3,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_SBL,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_SSR",
+               .num = 6,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_SSR",
+               .num = 7,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_CONTROL",
+               .num = 10,
+               .num_elements = 128,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_CONTROL",
+               .num = 11,
+               .num_elements = 128,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_LOGGING",
+               .num = 12,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_SBL,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_LOGGING",
+               .num = 13,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_SBL,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_STATUS",
+               .num = 14,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_STATUS",
+               .num = 15,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_TELEMETRY",
+               .num = 16,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_TELEMETRY",
+               .num = 17,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_TIMESYNC_PERIODIC",
+               .num = 22,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "QAIC_TIMESYNC_PERIODIC",
+               .num = 23,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "IPCR",
+               .num = 24,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_TO_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = false,
+               .wake_capable = false,
+       },
+       {
+               .name = "IPCR",
+               .num = 25,
+               .num_elements = 32,
+               .local_elements = 0,
+               .event_ring = 0,
+               .dir = DMA_FROM_DEVICE,
+               .ee_mask = MHI_CH_EE_AMSS,
+               .pollcfg = 0,
+               .doorbell = MHI_DB_BRST_DISABLE,
+               .lpm_notify = false,
+               .offload_channel = false,
+               .doorbell_mode_switch = false,
+               .auto_queue = true,
+               .wake_capable = false,
+       },
+};
+
 static struct mhi_event_config aic100_events[] = {
        {
                .num_elements = 32,
        },
 };
 
-static struct mhi_controller_config aic100_config = {
-       .max_channels = 128,
-       .timeout_ms = 0, /* controlled by mhi_timeout */
-       .buf_len = 0,
-       .num_channels = ARRAY_SIZE(aic100_channels),
-       .ch_cfg = aic100_channels,
-       .num_events = ARRAY_SIZE(aic100_events),
-       .event_cfg = aic100_events,
-       .use_bounce_buf = false,
-       .m2_no_db = false,
+static struct mhi_event_config aic200_events[] = {
+       {
+               .num_elements = 32,
+               .irq_moderation_ms = 0,
+               .irq = 0,
+               .channel = U32_MAX,
+               .priority = 1,
+               .mode = MHI_DB_BRST_DISABLE,
+               .data_type = MHI_ER_CTRL,
+               .hardware_event = false,
+               .client_managed = false,
+               .offload_channel = false,
+       },
+};
+
+static struct mhi_controller_config mhi_cntrl_configs[] = {
+       [FAMILY_AIC100] = {
+               .max_channels = 128,
+               .timeout_ms = 0, /* controlled by mhi_timeout */
+               .buf_len = 0,
+               .num_channels = ARRAY_SIZE(aic100_channels),
+               .ch_cfg = aic100_channels,
+               .num_events = ARRAY_SIZE(aic100_events),
+               .event_cfg = aic100_events,
+               .use_bounce_buf = false,
+               .m2_no_db = false,
+       },
+       [FAMILY_AIC200] = {
+               .max_channels = 128,
+               .timeout_ms = 0, /* controlled by mhi_timeout */
+               .buf_len = 0,
+               .num_channels = ARRAY_SIZE(aic200_channels),
+               .ch_cfg = aic200_channels,
+               .num_events = ARRAY_SIZE(aic200_events),
+               .event_cfg = aic200_events,
+               .use_bounce_buf = false,
+               .m2_no_db = false,
+       },
 };
 
 static int mhi_read_reg(struct mhi_controller *mhi_cntrl, void __iomem *addr, u32 *out)
 }
 
 struct mhi_controller *qaic_mhi_register_controller(struct pci_dev *pci_dev, void __iomem *mhi_bar,
-                                                   int mhi_irq, bool shared_msi)
+                                                   int mhi_irq, bool shared_msi, int family)
 {
+       struct mhi_controller_config mhi_config = mhi_cntrl_configs[family];
        struct mhi_controller *mhi_cntrl;
        int ret;
 
        if (shared_msi) /* MSI shared with data path, no IRQF_NO_SUSPEND */
                mhi_cntrl->irq_flags = IRQF_SHARED;
 
-       mhi_cntrl->fw_image = "qcom/aic100/sbl.bin";
+       mhi_cntrl->fw_image = fw_image_paths[family];
+
+       if (family == FAMILY_AIC200) {
+               mhi_cntrl->name = "AIC200";
+               mhi_cntrl->seg_len = SZ_512K;
+       } else {
+               mhi_cntrl->name = "AIC100";
+       }
 
        /* use latest configured timeout */
-       aic100_config.timeout_ms = mhi_timeout_ms;
-       ret = mhi_register_controller(mhi_cntrl, &aic100_config);
+       mhi_config.timeout_ms = mhi_timeout_ms;
+       ret = mhi_register_controller(mhi_cntrl, &mhi_config);
        if (ret) {
                pci_err(pci_dev, "mhi_register_controller failed %d\n", ret);
                return ERR_PTR(ret);
 
        [10] = "qcom/aic100/fw10.bin",
 };
 
+static const char * const aic200_image_table[] = {
+       [5]  = "qcom/aic200/uefi.elf",
+       [12] = "qcom/aic200/aic200-nsp.bin",
+       [23] = "qcom/aic200/aop.mbn",
+       [32] = "qcom/aic200/tz.mbn",
+       [33] = "qcom/aic200/hypvm.mbn",
+       [39] = "qcom/aic200/aic200_abl.elf",
+       [40] = "qcom/aic200/apdp.mbn",
+       [41] = "qcom/aic200/devcfg.mbn",
+       [42] = "qcom/aic200/sec.elf",
+       [43] = "qcom/aic200/aic200-hlos.elf",
+       [49] = "qcom/aic200/shrm.elf",
+       [50] = "qcom/aic200/cpucp.elf",
+       [51] = "qcom/aic200/aop_devcfg.mbn",
+       [57] = "qcom/aic200/cpucp_dtbs.elf",
+       [62] = "qcom/aic200/uefi_dtbs.elf",
+       [63] = "qcom/aic200/xbl_ac_config.mbn",
+       [64] = "qcom/aic200/tz_ac_config.mbn",
+       [65] = "qcom/aic200/hyp_ac_config.mbn",
+       [66] = "qcom/aic200/pdp.elf",
+       [67] = "qcom/aic200/pdp_cdb.elf",
+       [68] = "qcom/aic200/sdi.mbn",
+       [69] = "qcom/aic200/dcd.mbn",
+       [73] = "qcom/aic200/gearvm.mbn",
+       [74] = "qcom/aic200/sti.bin",
+       [75] = "qcom/aic200/pvs.bin",
+};
+
 static int sahara_find_image(struct sahara_context *context, u32 image_id)
 {
        int ret;
        context->mhi_dev = mhi_dev;
        INIT_WORK(&context->fw_work, sahara_processing);
        INIT_WORK(&context->dump_work, sahara_dump_processing);
-       context->image_table = aic100_image_table;
-       context->table_size = ARRAY_SIZE(aic100_image_table);
+
+       if (!strcmp(mhi_dev->mhi_cntrl->name, "AIC200")) {
+               context->image_table = aic200_image_table;
+               context->table_size = ARRAY_SIZE(aic200_image_table);
+       } else {
+               context->image_table = aic100_image_table;
+               context->table_size = ARRAY_SIZE(aic100_image_table);
+       }
+
        context->active_image_id = SAHARA_IMAGE_ID_NONE;
        dev_set_drvdata(&mhi_dev->dev, context);