@@ -448,53 +448,69 @@ static int __aqua_vanjaram_get_xcp_ip_info(struct amdgpu_xcp_mgr *xcp_mgr, int x
448448 return 0 ;
449449}
450450
451- static int aqua_vanjaram_get_xcp_res_info (struct amdgpu_xcp_mgr * xcp_mgr ,
452- int mode ,
453- struct amdgpu_xcp_cfg * xcp_cfg )
451+ static int __aqua_vanjaram_get_px_mode_info (struct amdgpu_xcp_mgr * xcp_mgr ,
452+ int px_mode , int * num_xcp ,
453+ uint16_t * nps_modes )
454454{
455455 struct amdgpu_device * adev = xcp_mgr -> adev ;
456- int max_res [AMDGPU_XCP_RES_MAX ] = {};
457- bool res_lt_xcp ;
458- int num_xcp , i ;
459- u16 nps_modes ;
460456
461- if (!(xcp_mgr -> supp_xcp_modes & BIT (mode )))
457+ if (!num_xcp || ! nps_modes || ! (xcp_mgr -> supp_xcp_modes & BIT (px_mode )))
462458 return - EINVAL ;
463459
464- max_res [AMDGPU_XCP_RES_XCC ] = NUM_XCC (adev -> gfx .xcc_mask );
465- max_res [AMDGPU_XCP_RES_DMA ] = adev -> sdma .num_instances ;
466- max_res [AMDGPU_XCP_RES_DEC ] = adev -> vcn .num_vcn_inst ;
467- max_res [AMDGPU_XCP_RES_JPEG ] = adev -> jpeg .num_jpeg_inst ;
468-
469- switch (mode ) {
460+ switch (px_mode ) {
470461 case AMDGPU_SPX_PARTITION_MODE :
471- num_xcp = 1 ;
472- nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE );
462+ * num_xcp = 1 ;
463+ * nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE );
473464 break ;
474465 case AMDGPU_DPX_PARTITION_MODE :
475- num_xcp = 2 ;
476- nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
477- BIT (AMDGPU_NPS2_PARTITION_MODE );
466+ * num_xcp = 2 ;
467+ * nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
468+ BIT (AMDGPU_NPS2_PARTITION_MODE );
478469 break ;
479470 case AMDGPU_TPX_PARTITION_MODE :
480- num_xcp = 3 ;
481- nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
482- BIT (AMDGPU_NPS4_PARTITION_MODE );
471+ * num_xcp = 3 ;
472+ * nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
473+ BIT (AMDGPU_NPS4_PARTITION_MODE );
483474 break ;
484475 case AMDGPU_QPX_PARTITION_MODE :
485- num_xcp = 4 ;
486- nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
487- BIT (AMDGPU_NPS4_PARTITION_MODE );
476+ * num_xcp = 4 ;
477+ * nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
478+ BIT (AMDGPU_NPS4_PARTITION_MODE );
488479 break ;
489480 case AMDGPU_CPX_PARTITION_MODE :
490- num_xcp = NUM_XCC (adev -> gfx .xcc_mask );
491- nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
492- BIT (AMDGPU_NPS4_PARTITION_MODE );
481+ * num_xcp = NUM_XCC (adev -> gfx .xcc_mask );
482+ * nps_modes = BIT (AMDGPU_NPS1_PARTITION_MODE ) |
483+ BIT (AMDGPU_NPS4_PARTITION_MODE );
493484 break ;
494485 default :
495486 return - EINVAL ;
496487 }
497488
489+ return 0 ;
490+ }
491+
492+ static int aqua_vanjaram_get_xcp_res_info (struct amdgpu_xcp_mgr * xcp_mgr ,
493+ int mode ,
494+ struct amdgpu_xcp_cfg * xcp_cfg )
495+ {
496+ struct amdgpu_device * adev = xcp_mgr -> adev ;
497+ int max_res [AMDGPU_XCP_RES_MAX ] = {};
498+ bool res_lt_xcp ;
499+ int num_xcp , i , r ;
500+ u16 nps_modes ;
501+
502+ if (!(xcp_mgr -> supp_xcp_modes & BIT (mode )))
503+ return - EINVAL ;
504+
505+ max_res [AMDGPU_XCP_RES_XCC ] = NUM_XCC (adev -> gfx .xcc_mask );
506+ max_res [AMDGPU_XCP_RES_DMA ] = adev -> sdma .num_instances ;
507+ max_res [AMDGPU_XCP_RES_DEC ] = adev -> vcn .num_vcn_inst ;
508+ max_res [AMDGPU_XCP_RES_JPEG ] = adev -> jpeg .num_jpeg_inst ;
509+
510+ r = __aqua_vanjaram_get_px_mode_info (xcp_mgr , mode , & num_xcp , & nps_modes );
511+ if (r )
512+ return r ;
513+
498514 xcp_cfg -> compatible_nps_modes =
499515 (adev -> gmc .supported_nps_modes & nps_modes );
500516 xcp_cfg -> num_res = ARRAY_SIZE (max_res );
@@ -543,30 +559,31 @@ static bool __aqua_vanjaram_is_valid_mode(struct amdgpu_xcp_mgr *xcp_mgr,
543559 enum amdgpu_gfx_partition mode )
544560{
545561 struct amdgpu_device * adev = xcp_mgr -> adev ;
546- int num_xcc , num_xccs_per_xcp ;
562+ int num_xcc , num_xccs_per_xcp , r ;
563+ int num_xcp , nps_mode ;
564+ u16 supp_nps_modes ;
565+ bool comp_mode ;
566+
567+ nps_mode = adev -> gmc .gmc_funcs -> query_mem_partition_mode (adev );
568+ r = __aqua_vanjaram_get_px_mode_info (xcp_mgr , mode , & num_xcp ,
569+ & supp_nps_modes );
570+ if (r )
571+ return false;
547572
573+ comp_mode = !!(BIT (nps_mode ) & supp_nps_modes );
548574 num_xcc = NUM_XCC (adev -> gfx .xcc_mask );
549575 switch (mode ) {
550576 case AMDGPU_SPX_PARTITION_MODE :
551- return adev -> gmc . num_mem_partitions == 1 && num_xcc > 0 ;
577+ return comp_mode && num_xcc > 0 ;
552578 case AMDGPU_DPX_PARTITION_MODE :
553- return adev -> gmc . num_mem_partitions <= 2 && (num_xcc % 4 ) == 0 ;
579+ return comp_mode && (num_xcc % 4 ) == 0 ;
554580 case AMDGPU_TPX_PARTITION_MODE :
555- return (adev -> gmc .num_mem_partitions == 1 ||
556- adev -> gmc .num_mem_partitions == 3 ) &&
557- ((num_xcc % 3 ) == 0 );
581+ return comp_mode && ((num_xcc % 3 ) == 0 );
558582 case AMDGPU_QPX_PARTITION_MODE :
559583 num_xccs_per_xcp = num_xcc / 4 ;
560- return (adev -> gmc .num_mem_partitions == 1 ||
561- adev -> gmc .num_mem_partitions == 4 ) &&
562- (num_xccs_per_xcp >= 2 );
584+ return comp_mode && (num_xccs_per_xcp >= 2 );
563585 case AMDGPU_CPX_PARTITION_MODE :
564- /* (num_xcc > 1) because 1 XCC is considered SPX, not CPX.
565- * (num_xcc % adev->gmc.num_mem_partitions) == 0 because
566- * num_compute_partitions can't be less than num_mem_partitions
567- */
568- return ((num_xcc > 1 ) &&
569- (num_xcc % adev -> gmc .num_mem_partitions ) == 0 );
586+ return comp_mode && (num_xcc > 1 );
570587 default :
571588 return false;
572589 }
0 commit comments