return ret;
 }
 
+static u32 ufs_mtk_mcq_get_irq(struct ufs_hba *hba, unsigned int cpu)
+{
+       struct ufs_mtk_host *host = ufshcd_get_variant(hba);
+       struct blk_mq_tag_set *tag_set = &hba->host->tag_set;
+       struct blk_mq_queue_map *map = &tag_set->map[HCTX_TYPE_DEFAULT];
+       unsigned int nr = map->nr_queues;
+       unsigned int q_index;
+
+       q_index = map->mq_map[cpu];
+       if (q_index > nr) {
+               dev_err(hba->dev, "hwq index %d exceed %d\n",
+                       q_index, nr);
+               return MTK_MCQ_INVALID_IRQ;
+       }
+
+       return host->mcq_intr_info[q_index].irq;
+}
+
+static void ufs_mtk_mcq_set_irq_affinity(struct ufs_hba *hba, unsigned int cpu)
+{
+       unsigned int irq, _cpu;
+       int ret;
+
+       irq = ufs_mtk_mcq_get_irq(hba, cpu);
+       if (irq == MTK_MCQ_INVALID_IRQ) {
+               dev_err(hba->dev, "invalid irq. unable to bind irq to cpu%d", cpu);
+               return;
+       }
+
+       /* force migrate irq of cpu0 to cpu3 */
+       _cpu = (cpu == 0) ? 3 : cpu;
+       ret = irq_set_affinity(irq, cpumask_of(_cpu));
+       if (ret) {
+               dev_err(hba->dev, "set irq %d affinity to CPU %d failed\n",
+                       irq, _cpu);
+               return;
+       }
+       dev_info(hba->dev, "set irq %d affinity to CPU: %d\n", irq, _cpu);
+}
+
 static void ufs_mtk_get_controller_version(struct ufs_hba *hba)
 {
        struct ufs_mtk_host *host = ufshcd_get_variant(hba);
 {
        struct ufs_dev_info *dev_info = &hba->dev_info;
        u16 mid = dev_info->wmanufacturerid;
+       unsigned int cpu;
+
+       if (hba->mcq_enabled) {
+               /* Iterate all cpus to set affinity for mcq irqs */
+               for (cpu = 0; cpu < nr_cpu_ids; cpu++)
+                       ufs_mtk_mcq_set_irq_affinity(hba, cpu);
+       }
 
        if (mid == UFS_VENDOR_SAMSUNG) {
                ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 6);