@@ -452,13 +452,16 @@ static int tpmi_get_pbf_info(struct isst_id *id, int level,
452452 return _pbf_get_coremask_info (id , level , pbf_info );
453453}
454454
455+ #define FEATURE_ENABLE_WAIT_US 1000
456+ #define FEATURE_ENABLE_RETRIES 5
457+
455458static int tpmi_set_pbf_fact_status (struct isst_id * id , int pbf , int enable )
456459{
457460 struct isst_pkg_ctdp pkg_dev ;
458461 struct isst_pkg_ctdp_level_info ctdp_level ;
459462 int current_level ;
460463 struct isst_perf_feature_control info ;
461- int ret ;
464+ int ret , i ;
462465
463466 ret = isst_get_ctdp_levels (id , & pkg_dev );
464467 if (ret )
@@ -503,6 +506,30 @@ static int tpmi_set_pbf_fact_status(struct isst_id *id, int pbf, int enable)
503506 if (ret == -1 )
504507 return ret ;
505508
509+ for (i = 0 ; i < FEATURE_ENABLE_RETRIES ; ++ i ) {
510+
511+ usleep (FEATURE_ENABLE_WAIT_US );
512+
513+ /* Check status */
514+ ret = isst_get_ctdp_control (id , current_level , & ctdp_level );
515+ if (ret )
516+ return ret ;
517+
518+ debug_printf ("pbf_enabled:%d fact_enabled:%d\n" ,
519+ ctdp_level .pbf_enabled , ctdp_level .fact_enabled );
520+
521+ if (pbf ) {
522+ if (ctdp_level .pbf_enabled == enable )
523+ break ;
524+ } else {
525+ if (ctdp_level .fact_enabled == enable )
526+ break ;
527+ }
528+ }
529+
530+ if (i == FEATURE_ENABLE_RETRIES )
531+ return -1 ;
532+
506533 return 0 ;
507534}
508535
@@ -513,6 +540,7 @@ static int tpmi_get_fact_info(struct isst_id *id, int level, int fact_bucket,
513540 int i , j ;
514541 int ret ;
515542
543+ memset (& info , 0 , sizeof (info ));
516544 info .socket_id = id -> pkg ;
517545 info .power_domain_id = id -> punit ;
518546 info .level = level ;
@@ -659,7 +687,8 @@ static int tpmi_pm_qos_config(struct isst_id *id, int enable_clos,
659687 int priority_type )
660688{
661689 struct isst_core_power info ;
662- int i , ret , saved_punit ;
690+ int cp_state = 0 , cp_cap = 0 ;
691+ int i , j , ret , saved_punit ;
663692
664693 info .get_set = 1 ;
665694 info .socket_id = id -> pkg ;
@@ -679,6 +708,19 @@ static int tpmi_pm_qos_config(struct isst_id *id, int enable_clos,
679708 id -> punit = saved_punit ;
680709 return ret ;
681710 }
711+ /* Get status */
712+ for (j = 0 ; j < FEATURE_ENABLE_RETRIES ; ++ j ) {
713+ usleep (FEATURE_ENABLE_WAIT_US );
714+ ret = tpmi_read_pm_config (id , & cp_state , & cp_cap );
715+ debug_printf ("ret:%d cp_state:%d enable_clos:%d\n" , ret ,
716+ cp_state , enable_clos );
717+ if (ret || cp_state == enable_clos )
718+ break ;
719+ }
720+ if (j == FEATURE_ENABLE_RETRIES ) {
721+ id -> punit = saved_punit ;
722+ return -1 ;
723+ }
682724 }
683725 }
684726
0 commit comments