mqd_mgr = dqm->mqd_mgrs[type];
        if (!mqd_mgr) {
-               mqd_mgr = mqd_manager_init(type, dqm->dev);
+               mqd_mgr = dqm->asic_ops.mqd_manager_init(type, dqm->dev);
                if (!mqd_mgr)
                        pr_err("mqd manager is NULL");
                dqm->mqd_mgrs[type] = mqd_mgr;
 
        void    (*init_sdma_vm)(struct device_queue_manager *dqm,
                                struct queue *q,
                                struct qcm_process_device *qpd);
+       struct mqd_manager *    (*mqd_manager_init)(enum KFD_MQD_TYPE type,
+                                struct kfd_dev *dev);
 };
 
 /**
 
        asic_ops->set_cache_memory_policy = set_cache_memory_policy_cik;
        asic_ops->update_qpd = update_qpd_cik;
        asic_ops->init_sdma_vm = init_sdma_vm;
+       asic_ops->mqd_manager_init = mqd_manager_init_cik;
 }
 
 void device_queue_manager_init_cik_hawaii(
        asic_ops->set_cache_memory_policy = set_cache_memory_policy_cik;
        asic_ops->update_qpd = update_qpd_cik_hawaii;
        asic_ops->init_sdma_vm = init_sdma_vm_hawaii;
+       asic_ops->mqd_manager_init = mqd_manager_init_cik_hawaii;
 }
 
 static uint32_t compute_sh_mem_bases_64bit(unsigned int top_address_nybble)
 
 {
        asic_ops->update_qpd = update_qpd_v9;
        asic_ops->init_sdma_vm = init_sdma_vm_v9;
+       asic_ops->mqd_manager_init = mqd_manager_init_v9;
 }
 
 static uint32_t compute_sh_mem_bases_64bit(struct kfd_process_device *pdd)
 
        asic_ops->set_cache_memory_policy = set_cache_memory_policy_vi;
        asic_ops->update_qpd = update_qpd_vi;
        asic_ops->init_sdma_vm = init_sdma_vm;
+       asic_ops->mqd_manager_init = mqd_manager_init_vi;
 }
 
 void device_queue_manager_init_vi_tonga(
        asic_ops->set_cache_memory_policy = set_cache_memory_policy_vi_tonga;
        asic_ops->update_qpd = update_qpd_vi_tonga;
        asic_ops->init_sdma_vm = init_sdma_vm_tonga;
+       asic_ops->mqd_manager_init = mqd_manager_init_vi_tonga;
 }
 
 static uint32_t compute_sh_mem_bases_64bit(unsigned int top_address_nybble)
 
 #include "kfd_mqd_manager.h"
 #include "amdgpu_amdkfd.h"
 
-struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type,
-                                       struct kfd_dev *dev)
-{
-       switch (dev->device_info->asic_family) {
-       case CHIP_KAVERI:
-               return mqd_manager_init_cik(type, dev);
-       case CHIP_HAWAII:
-               return mqd_manager_init_cik_hawaii(type, dev);
-       case CHIP_CARRIZO:
-               return mqd_manager_init_vi(type, dev);
-       case CHIP_TONGA:
-       case CHIP_FIJI:
-       case CHIP_POLARIS10:
-       case CHIP_POLARIS11:
-       case CHIP_POLARIS12:
-               return mqd_manager_init_vi_tonga(type, dev);
-       case CHIP_VEGA10:
-       case CHIP_VEGA12:
-       case CHIP_VEGA20:
-       case CHIP_RAVEN:
-               return mqd_manager_init_v9(type, dev);
-       default:
-               WARN(1, "Unexpected ASIC family %u",
-                    dev->device_info->asic_family);
-       }
-
-       return NULL;
-}
-
 void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
                const uint32_t *cu_mask, uint32_t cu_mask_count,
                uint32_t *se_mask)
 
 void print_queue_properties(struct queue_properties *q);
 void print_queue(struct queue *q);
 
-struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type,
-                                       struct kfd_dev *dev);
 struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
                struct kfd_dev *dev);
 struct mqd_manager *mqd_manager_init_cik_hawaii(enum KFD_MQD_TYPE type,