@@ -373,7 +373,7 @@ static void get_checkpoint_info(struct mqd_manager *mm, void *mqd, u32 *ctl_stac
373
373
{
374
374
struct v9_mqd * m = get_mqd (mqd );
375
375
376
- * ctl_stack_size = m -> cp_hqd_cntl_stack_size ;
376
+ * ctl_stack_size = m -> cp_hqd_cntl_stack_size * NUM_XCC ( mm -> dev -> xcc_mask ) ;
377
377
}
378
378
379
379
static void checkpoint_mqd (struct mqd_manager * mm , void * mqd , void * mqd_dst , void * ctl_stack_dst )
@@ -388,6 +388,24 @@ static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, voi
388
388
memcpy (ctl_stack_dst , ctl_stack , m -> cp_hqd_cntl_stack_size );
389
389
}
390
390
391
+ static void checkpoint_mqd_v9_4_3 (struct mqd_manager * mm ,
392
+ void * mqd ,
393
+ void * mqd_dst ,
394
+ void * ctl_stack_dst )
395
+ {
396
+ struct v9_mqd * m ;
397
+ int xcc ;
398
+ uint64_t size = get_mqd (mqd )-> cp_mqd_stride_size ;
399
+
400
+ for (xcc = 0 ; xcc < NUM_XCC (mm -> dev -> xcc_mask ); xcc ++ ) {
401
+ m = get_mqd (mqd + size * xcc );
402
+
403
+ checkpoint_mqd (mm , m ,
404
+ (uint8_t * )mqd_dst + sizeof (* m ) * xcc ,
405
+ (uint8_t * )ctl_stack_dst + m -> cp_hqd_cntl_stack_size * xcc );
406
+ }
407
+ }
408
+
391
409
static void restore_mqd (struct mqd_manager * mm , void * * mqd ,
392
410
struct kfd_mem_obj * mqd_mem_obj , uint64_t * gart_addr ,
393
411
struct queue_properties * qp ,
@@ -764,13 +782,35 @@ static void restore_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
764
782
const void * mqd_src ,
765
783
const void * ctl_stack_src , u32 ctl_stack_size )
766
784
{
767
- restore_mqd (mm , mqd , mqd_mem_obj , gart_addr , qp , mqd_src , ctl_stack_src , ctl_stack_size );
768
- if (amdgpu_sriov_multi_vf_mode (mm -> dev -> adev )) {
769
- struct v9_mqd * m ;
785
+ struct kfd_mem_obj xcc_mqd_mem_obj ;
786
+ u32 mqd_ctl_stack_size ;
787
+ struct v9_mqd * m ;
788
+ u32 num_xcc ;
789
+ int xcc ;
770
790
771
- m = (struct v9_mqd * ) mqd_mem_obj -> cpu_ptr ;
772
- m -> cp_hqd_pq_doorbell_control |= 1 <<
773
- CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT ;
791
+ uint64_t offset = mm -> mqd_stride (mm , qp );
792
+
793
+ mm -> dev -> dqm -> current_logical_xcc_start ++ ;
794
+
795
+ num_xcc = NUM_XCC (mm -> dev -> xcc_mask );
796
+ mqd_ctl_stack_size = ctl_stack_size / num_xcc ;
797
+
798
+ memset (& xcc_mqd_mem_obj , 0x0 , sizeof (struct kfd_mem_obj ));
799
+
800
+ /* Set the MQD pointer and gart address to XCC0 MQD */
801
+ * mqd = mqd_mem_obj -> cpu_ptr ;
802
+ if (gart_addr )
803
+ * gart_addr = mqd_mem_obj -> gpu_addr ;
804
+
805
+ for (xcc = 0 ; xcc < num_xcc ; xcc ++ ) {
806
+ get_xcc_mqd (mqd_mem_obj , & xcc_mqd_mem_obj , offset * xcc );
807
+ restore_mqd (mm , (void * * )& m ,
808
+ & xcc_mqd_mem_obj ,
809
+ NULL ,
810
+ qp ,
811
+ (uint8_t * )mqd_src + xcc * sizeof (* m ),
812
+ (uint8_t * )ctl_stack_src + xcc * mqd_ctl_stack_size ,
813
+ mqd_ctl_stack_size );
774
814
}
775
815
}
776
816
static int destroy_mqd_v9_4_3 (struct mqd_manager * mm , void * mqd ,
@@ -906,7 +946,6 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
906
946
mqd -> free_mqd = kfd_free_mqd_cp ;
907
947
mqd -> is_occupied = kfd_is_occupied_cp ;
908
948
mqd -> get_checkpoint_info = get_checkpoint_info ;
909
- mqd -> checkpoint_mqd = checkpoint_mqd ;
910
949
mqd -> mqd_size = sizeof (struct v9_mqd );
911
950
mqd -> mqd_stride = mqd_stride_v9 ;
912
951
#if defined(CONFIG_DEBUG_FS )
@@ -918,16 +957,18 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
918
957
mqd -> init_mqd = init_mqd_v9_4_3 ;
919
958
mqd -> load_mqd = load_mqd_v9_4_3 ;
920
959
mqd -> update_mqd = update_mqd_v9_4_3 ;
921
- mqd -> restore_mqd = restore_mqd_v9_4_3 ;
922
960
mqd -> destroy_mqd = destroy_mqd_v9_4_3 ;
923
961
mqd -> get_wave_state = get_wave_state_v9_4_3 ;
962
+ mqd -> checkpoint_mqd = checkpoint_mqd_v9_4_3 ;
963
+ mqd -> restore_mqd = restore_mqd_v9_4_3 ;
924
964
} else {
925
965
mqd -> init_mqd = init_mqd ;
926
966
mqd -> load_mqd = load_mqd ;
927
967
mqd -> update_mqd = update_mqd ;
928
- mqd -> restore_mqd = restore_mqd ;
929
968
mqd -> destroy_mqd = kfd_destroy_mqd_cp ;
930
969
mqd -> get_wave_state = get_wave_state ;
970
+ mqd -> checkpoint_mqd = checkpoint_mqd ;
971
+ mqd -> restore_mqd = restore_mqd ;
931
972
}
932
973
break ;
933
974
case KFD_MQD_TYPE_HIQ :
0 commit comments