@@ -554,7 +554,7 @@ static void init_mqd_hiq_v9_4_3(struct mqd_manager *mm, void **mqd,
554554 m -> cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK |
555555 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT |
556556 1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT ;
557- if (amdgpu_sriov_vf (mm -> dev -> adev ))
557+ if (amdgpu_sriov_multi_vf_mode (mm -> dev -> adev ))
558558 m -> cp_hqd_pq_doorbell_control |= 1 <<
559559 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT ;
560560 m -> cp_mqd_stride_size = kfd_hiq_mqd_stride (mm -> dev );
@@ -667,7 +667,9 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
667667 get_xcc_mqd (mqd_mem_obj , & xcc_mqd_mem_obj , offset * xcc );
668668
669669 init_mqd (mm , (void * * )& m , & xcc_mqd_mem_obj , & xcc_gart_addr , q );
670-
670+ if (amdgpu_sriov_multi_vf_mode (mm -> dev -> adev ))
671+ m -> cp_hqd_pq_doorbell_control |= 1 <<
672+ CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT ;
671673 m -> cp_mqd_stride_size = offset ;
672674
673675 /*
@@ -727,6 +729,9 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
727729 m = get_mqd (mqd + size * xcc );
728730 update_mqd (mm , m , q , minfo );
729731
732+ if (amdgpu_sriov_multi_vf_mode (mm -> dev -> adev ))
733+ m -> cp_hqd_pq_doorbell_control |= 1 <<
734+ CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT ;
730735 update_cu_mask (mm , m , minfo , xcc );
731736
732737 if (q -> format == KFD_QUEUE_FORMAT_AQL ) {
@@ -749,6 +754,21 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
749754 }
750755}
751756
757+ static void restore_mqd_v9_4_3 (struct mqd_manager * mm , void * * mqd ,
758+ struct kfd_mem_obj * mqd_mem_obj , uint64_t * gart_addr ,
759+ struct queue_properties * qp ,
760+ const void * mqd_src ,
761+ const void * ctl_stack_src , u32 ctl_stack_size )
762+ {
763+ restore_mqd (mm , mqd , mqd_mem_obj , gart_addr , qp , mqd_src , ctl_stack_src , ctl_stack_size );
764+ if (amdgpu_sriov_multi_vf_mode (mm -> dev -> adev )) {
765+ struct v9_mqd * m ;
766+
767+ m = (struct v9_mqd * ) mqd_mem_obj -> cpu_ptr ;
768+ m -> cp_hqd_pq_doorbell_control |= 1 <<
769+ CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT ;
770+ }
771+ }
752772static int destroy_mqd_v9_4_3 (struct mqd_manager * mm , void * mqd ,
753773 enum kfd_preempt_type type , unsigned int timeout ,
754774 uint32_t pipe_id , uint32_t queue_id )
@@ -883,7 +903,6 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
883903 mqd -> is_occupied = kfd_is_occupied_cp ;
884904 mqd -> get_checkpoint_info = get_checkpoint_info ;
885905 mqd -> checkpoint_mqd = checkpoint_mqd ;
886- mqd -> restore_mqd = restore_mqd ;
887906 mqd -> mqd_size = sizeof (struct v9_mqd );
888907 mqd -> mqd_stride = mqd_stride_v9 ;
889908#if defined(CONFIG_DEBUG_FS )
@@ -895,12 +914,14 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
895914 mqd -> init_mqd = init_mqd_v9_4_3 ;
896915 mqd -> load_mqd = load_mqd_v9_4_3 ;
897916 mqd -> update_mqd = update_mqd_v9_4_3 ;
917+ mqd -> restore_mqd = restore_mqd_v9_4_3 ;
898918 mqd -> destroy_mqd = destroy_mqd_v9_4_3 ;
899919 mqd -> get_wave_state = get_wave_state_v9_4_3 ;
900920 } else {
901921 mqd -> init_mqd = init_mqd ;
902922 mqd -> load_mqd = load_mqd ;
903923 mqd -> update_mqd = update_mqd ;
924+ mqd -> restore_mqd = restore_mqd ;
904925 mqd -> destroy_mqd = kfd_destroy_mqd_cp ;
905926 mqd -> get_wave_state = get_wave_state ;
906927 }
0 commit comments