@@ -322,6 +322,62 @@ int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
322322 return ret ;
323323}
324324
325+ ssize_t smu_v13_0_12_get_xcp_metrics (struct smu_context * smu , struct amdgpu_xcp * xcp , void * table , void * smu_metrics )
326+ {
327+ const u8 num_jpeg_rings = NUM_JPEG_RINGS_FW ;
328+ struct amdgpu_partition_metrics_v1_0 * xcp_metrics ;
329+ struct amdgpu_device * adev = smu -> adev ;
330+ MetricsTable_t * metrics ;
331+ int inst , j , k , idx ;
332+ u32 inst_mask ;
333+
334+ metrics = (MetricsTable_t * )smu_metrics ;
335+ xcp_metrics = (struct amdgpu_partition_metrics_v1_0 * ) table ;
336+ smu_cmn_init_partition_metrics (xcp_metrics , 1 , 0 );
337+ amdgpu_xcp_get_inst_details (xcp , AMDGPU_XCP_VCN , & inst_mask );
338+ idx = 0 ;
339+ for_each_inst (k , inst_mask ) {
340+ /* Both JPEG and VCN has same instance */
341+ inst = GET_INST (VCN , k );
342+ for (j = 0 ; j < num_jpeg_rings ; ++ j ) {
343+ xcp_metrics -> jpeg_busy [(idx * num_jpeg_rings ) + j ] =
344+ SMUQ10_ROUND (metrics ->
345+ JpegBusy [(inst * num_jpeg_rings ) + j ]);
346+ }
347+ xcp_metrics -> vcn_busy [idx ] =
348+ SMUQ10_ROUND (metrics -> VcnBusy [inst ]);
349+ xcp_metrics -> current_vclk0 [idx ] = SMUQ10_ROUND (
350+ metrics -> VclkFrequency [inst ]);
351+ xcp_metrics -> current_dclk0 [idx ] = SMUQ10_ROUND (
352+ metrics -> DclkFrequency [inst ]);
353+ xcp_metrics -> current_socclk [idx ] = SMUQ10_ROUND (
354+ metrics -> SocclkFrequency [inst ]);
355+
356+ idx ++ ;
357+ }
358+
359+ xcp_metrics -> current_uclk =
360+ SMUQ10_ROUND (metrics -> UclkFrequency );
361+
362+ amdgpu_xcp_get_inst_details (xcp , AMDGPU_XCP_GFX , & inst_mask );
363+ idx = 0 ;
364+ for_each_inst (k , inst_mask ) {
365+ inst = GET_INST (GC , k );
366+ xcp_metrics -> current_gfxclk [idx ] = SMUQ10_ROUND (metrics -> GfxclkFrequency [inst ]);
367+ xcp_metrics -> gfx_busy_inst [idx ] = SMUQ10_ROUND (metrics -> GfxBusy [inst ]);
368+ xcp_metrics -> gfx_busy_acc [idx ] = SMUQ10_ROUND (metrics -> GfxBusyAcc [inst ]);
369+ if (smu_v13_0_6_cap_supported (smu , SMU_CAP (HST_LIMIT_METRICS ))) {
370+ xcp_metrics -> gfx_below_host_limit_ppt_acc [idx ] = SMUQ10_ROUND (metrics -> GfxclkBelowHostLimitPptAcc [inst ]);
371+ xcp_metrics -> gfx_below_host_limit_thm_acc [idx ] = SMUQ10_ROUND (metrics -> GfxclkBelowHostLimitThmAcc [inst ]);
372+ xcp_metrics -> gfx_low_utilization_acc [idx ] = SMUQ10_ROUND (metrics -> GfxclkLowUtilizationAcc [inst ]);
373+ xcp_metrics -> gfx_below_host_limit_total_acc [idx ] = SMUQ10_ROUND (metrics -> GfxclkBelowHostLimitTotalAcc [inst ]);
374+ }
375+ idx ++ ;
376+ }
377+
378+ return sizeof (* xcp_metrics );
379+ }
380+
325381ssize_t smu_v13_0_12_get_gpu_metrics (struct smu_context * smu , void * * table )
326382{
327383 struct smu_table_context * smu_table = & smu -> smu_table ;
0 commit comments