@@ -734,6 +734,7 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
734
734
{
735
735
struct core_freesync * core_freesync = NULL ;
736
736
unsigned long long nominal_field_rate_in_uhz = 0 ;
737
+ unsigned long long rounded_nominal_in_uhz = 0 ;
737
738
unsigned int refresh_range = 0 ;
738
739
unsigned long long min_refresh_in_uhz = 0 ;
739
740
unsigned long long max_refresh_in_uhz = 0 ;
@@ -750,17 +751,20 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
750
751
min_refresh_in_uhz = in_config -> min_refresh_in_uhz ;
751
752
max_refresh_in_uhz = in_config -> max_refresh_in_uhz ;
752
753
753
- // Don't allow min > max
754
- if (min_refresh_in_uhz > max_refresh_in_uhz )
755
- min_refresh_in_uhz = max_refresh_in_uhz ;
756
-
757
754
// Full range may be larger than current video timing, so cap at nominal
758
755
if (max_refresh_in_uhz > nominal_field_rate_in_uhz )
759
756
max_refresh_in_uhz = nominal_field_rate_in_uhz ;
760
757
761
758
// Full range may be larger than current video timing, so cap at nominal
762
- if (min_refresh_in_uhz > nominal_field_rate_in_uhz )
763
- min_refresh_in_uhz = nominal_field_rate_in_uhz ;
759
+ if (min_refresh_in_uhz > max_refresh_in_uhz )
760
+ min_refresh_in_uhz = max_refresh_in_uhz ;
761
+
762
+ // If a monitor reports exactly max refresh of 2x of min, enforce it on nominal
763
+ rounded_nominal_in_uhz =
764
+ div_u64 (nominal_field_rate_in_uhz + 50000 , 100000 ) * 100000 ;
765
+ if (in_config -> max_refresh_in_uhz == (2 * in_config -> min_refresh_in_uhz ) &&
766
+ in_config -> max_refresh_in_uhz == rounded_nominal_in_uhz )
767
+ min_refresh_in_uhz = div_u64 (nominal_field_rate_in_uhz , 2 );
764
768
765
769
if (!vrr_settings_require_update (core_freesync ,
766
770
in_config , (unsigned int )min_refresh_in_uhz , (unsigned int )max_refresh_in_uhz ,
@@ -792,21 +796,21 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
792
796
refresh_range = in_out_vrr -> max_refresh_in_uhz -
793
797
in_out_vrr -> min_refresh_in_uhz ;
794
798
795
- in_out_vrr -> btr .margin_in_us = in_out_vrr -> max_duration_in_us -
796
- 2 * in_out_vrr -> min_duration_in_us ;
797
- if (in_out_vrr -> btr .margin_in_us > BTR_MAX_MARGIN )
798
- in_out_vrr -> btr .margin_in_us = BTR_MAX_MARGIN ;
799
-
800
799
in_out_vrr -> supported = true;
801
800
}
802
801
803
802
in_out_vrr -> fixed .ramping_active = in_config -> ramping ;
804
803
805
804
in_out_vrr -> btr .btr_enabled = in_config -> btr ;
806
805
807
- if (in_out_vrr -> max_refresh_in_uhz <
808
- 2 * in_out_vrr -> min_refresh_in_uhz )
806
+ if (in_out_vrr -> max_refresh_in_uhz < (2 * in_out_vrr -> min_refresh_in_uhz ))
809
807
in_out_vrr -> btr .btr_enabled = false;
808
+ else {
809
+ in_out_vrr -> btr .margin_in_us = in_out_vrr -> max_duration_in_us -
810
+ 2 * in_out_vrr -> min_duration_in_us ;
811
+ if (in_out_vrr -> btr .margin_in_us > BTR_MAX_MARGIN )
812
+ in_out_vrr -> btr .margin_in_us = BTR_MAX_MARGIN ;
813
+ }
810
814
811
815
in_out_vrr -> btr .btr_active = false;
812
816
in_out_vrr -> btr .inserted_duration_in_us = 0 ;
@@ -1008,8 +1012,8 @@ unsigned long long mod_freesync_calc_nominal_field_rate(
1008
1012
unsigned int total = stream -> timing .h_total * stream -> timing .v_total ;
1009
1013
1010
1014
/* Calculate nominal field rate for stream, rounded up to nearest integer */
1011
- nominal_field_rate_in_uhz = stream -> timing .pix_clk_100hz / 10 ;
1012
- nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL ;
1015
+ nominal_field_rate_in_uhz = stream -> timing .pix_clk_100hz ;
1016
+ nominal_field_rate_in_uhz *= 100000000ULL ;
1013
1017
1014
1018
nominal_field_rate_in_uhz = div_u64 (nominal_field_rate_in_uhz , total );
1015
1019
0 commit comments