Skip to content

Commit 3aa3792

Browse files
Lijo Lazaralexdeucher
authored andcommitted
drm/amdgpu: Use compatible NPS mode info
Compatible NPS modes for a partition mode are exposed through xcp_config interface. To determine if a compute partition mode is valid, check if the current NPS mode is part of compatible NPS modes. Signed-off-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 9a343a6 commit 3aa3792

File tree

1 file changed

+60
-43
lines changed

1 file changed

+60
-43
lines changed

drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)