Message ID | 20220908-if-ladder-v1-2-9949a713ca08@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: A couple of if/else ladder refactors | expand |
Hi, Lucas. On Thu, Sep 08, 2022 at 01:08:15PM -0700, Lucas De Marchi wrote: > Instead of calling read_clock_frequency() to walk the if/else ladder > per platform, move the ladder to intel_gt_init_clock_frequency() and > use one function per branch. I think the split of current code into separate functions looks good. However, maybe the correct place to do that would be inside read_clock_frequency() instead of intel_gt_init_clock_frequency(), since read_clock_frequency() is used inside intel_gt_check_clock_frequency(). > > With the new logic, it's now clear the call to > gen9_get_crystal_clock_freq() was just dead code, as gen9 is handled by > another function and there is no version 10. Remove that function and > the caller. > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> > > diff --git a/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c b/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c > index 93608c9349fd..ebddbf7542bc 100644 > --- a/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c > +++ b/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c > @@ -26,26 +26,6 @@ static u32 read_reference_ts_freq(struct intel_uncore *uncore) > return base_freq + frac_freq; > } > > -static u32 gen9_get_crystal_clock_freq(struct intel_uncore *uncore, > - u32 rpm_config_reg) > -{ > - u32 f19_2_mhz = 19200000; > - u32 f24_mhz = 24000000; > - u32 crystal_clock = > - (rpm_config_reg & GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> > - GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; > - > - switch (crystal_clock) { > - case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ: > - return f19_2_mhz; > - case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ: > - return f24_mhz; > - default: > - MISSING_CASE(crystal_clock); > - return 0; > - } > -} > - > static u32 gen11_get_crystal_clock_freq(struct intel_uncore *uncore, > u32 rpm_config_reg) > { > @@ -72,95 +52,101 @@ static u32 gen11_get_crystal_clock_freq(struct intel_uncore *uncore, > } > } > > -static u32 read_clock_frequency(struct intel_uncore *uncore) > +static u32 gen11_read_clock_frequency(struct intel_uncore *uncore) > { > - u32 f12_5_mhz = 12500000; > - u32 f19_2_mhz = 19200000; > - u32 f24_mhz = 24000000; > + u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); > + u32 freq = 0; > > - if (GRAPHICS_VER(uncore->i915) >= 11) { > - u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); > - u32 freq = 0; > + /* > + * Note that on gen11+, the clock frequency may be reconfigured. > + * We do not, and we assume nobody else does. > + * > + * First figure out the reference frequency. There are 2 ways > + * we can compute the frequency, either through the > + * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE > + * tells us which one we should use. > + */ > + if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { > + freq = read_reference_ts_freq(uncore); > + } else { > + u32 c0 = intel_uncore_read(uncore, RPM_CONFIG0); > + > + freq = gen11_get_crystal_clock_freq(uncore, c0); > > /* > - * First figure out the reference frequency. There are 2 ways > - * we can compute the frequency, either through the > - * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE > - * tells us which one we should use. > - */ > - if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { > - freq = read_reference_ts_freq(uncore); > - } else { > - u32 c0 = intel_uncore_read(uncore, RPM_CONFIG0); > - > - if (GRAPHICS_VER(uncore->i915) >= 11) > - freq = gen11_get_crystal_clock_freq(uncore, c0); > - else > - freq = gen9_get_crystal_clock_freq(uncore, c0); > - > - /* > - * Now figure out how the command stream's timestamp > - * register increments from this frequency (it might > - * increment only every few clock cycle). > - */ > - freq >>= 3 - ((c0 & GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> > - GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT); > - } > - > - return freq; > - } else if (GRAPHICS_VER(uncore->i915) >= 9) { > - u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); > - u32 freq = 0; > - > - if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { > - freq = read_reference_ts_freq(uncore); > - } else { > - freq = IS_GEN9_LP(uncore->i915) ? f19_2_mhz : f24_mhz; > - > - /* > - * Now figure out how the command stream's timestamp > - * register increments from this frequency (it might > - * increment only every few clock cycle). > - */ > - freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >> > - CTC_SHIFT_PARAMETER_SHIFT); > - } > - > - return freq; > - } else if (GRAPHICS_VER(uncore->i915) >= 5) { > - /* > - * PRMs say: > - * > - * "The PCU TSC counts 10ns increments; this timestamp > - * reflects bits 38:3 of the TSC (i.e. 80ns granularity, > - * rolling over every 1.5 hours). > + * Now figure out how the command stream's timestamp > + * register increments from this frequency (it might > + * increment only every few clock cycle). > */ > - return f12_5_mhz; > + freq >>= 3 - ((c0 & GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> > + GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT); > + } > + > + return freq; > +} > + > +static u32 gen9_read_clock_frequency(struct intel_uncore *uncore) > +{ > + u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); > + u32 freq = 0; > + > + if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { > + freq = read_reference_ts_freq(uncore); > } else { > + freq = IS_GEN9_LP(uncore->i915) ? 19200000 : 24000000; > + > /* > - * PRMs say: > - * > - * "The value in this register increments once every 16 > - * hclks." (through the “Clocking Configuration” > - * (“CLKCFG”) MCHBAR register) > + * Now figure out how the command stream's timestamp > + * register increments from this frequency (it might > + * increment only every few clock cycle). > */ > - return RUNTIME_INFO(uncore->i915)->rawclk_freq * 1000 / 16; > + freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >> > + CTC_SHIFT_PARAMETER_SHIFT); > } > + > + return freq; > } > > -void intel_gt_init_clock_frequency(struct intel_gt *gt) > +static u32 gen5_read_clock_frequency(struct intel_uncore *uncore) > { > /* > - * Note that on gen11+, the clock frequency may be reconfigured. > - * We do not, and we assume nobody else does. > + * PRMs say: > + * > + * "The PCU TSC counts 10ns increments; this timestamp > + * reflects bits 38:3 of the TSC (i.e. 80ns granularity, > + * rolling over every 1.5 hours). > */ > - gt->clock_frequency = read_clock_frequency(gt->uncore); > - if (gt->clock_frequency) > - gt->clock_period_ns = intel_gt_clock_interval_to_ns(gt, 1); > + return 12500000; > +} > + > +static u32 read_clock_frequency(struct intel_uncore *uncore) > +{ > + /* > + * PRMs say: > + * > + * "The value in this register increments once every 16 > + * hclks." (through the “Clocking Configuration” > + * (“CLKCFG”) MCHBAR register) > + */ > + return RUNTIME_INFO(uncore->i915)->rawclk_freq * 1000 / 16; > +} > + > +void intel_gt_init_clock_frequency(struct intel_gt *gt) > +{ > + if (GRAPHICS_VER(gt->i915) >= 11) > + gt->clock_frequency = gen11_read_clock_frequency(gt->uncore); > + else if (GRAPHICS_VER(gt->i915) >= 9) > + gt->clock_frequency = gen9_read_clock_frequency(gt->uncore); > + else if (GRAPHICS_VER(gt->i915) >= 5) > + gt->clock_frequency = gen5_read_clock_frequency(gt->uncore); > + else > + gt->clock_frequency = read_clock_frequency(gt->uncore); > > /* Icelake appears to use another fixed frequency for CTX_TIMESTAMP */ > if (GRAPHICS_VER(gt->i915) == 11) > gt->clock_period_ns = NSEC_PER_SEC / 13750000; > + else if (gt->clock_frequency) > + gt->clock_period_ns = intel_gt_clock_interval_to_ns(gt, 1); > > GT_TRACE(gt, > "Using clock frequency: %dkHz, period: %dns, wrap: %lldms\n", > > -- > b4 0.10.0-dev-df873
On Tue, Sep 13, 2022 at 08:17:02AM -0300, Gustavo Sousa wrote: >Hi, Lucas. > >On Thu, Sep 08, 2022 at 01:08:15PM -0700, Lucas De Marchi wrote: >> Instead of calling read_clock_frequency() to walk the if/else ladder >> per platform, move the ladder to intel_gt_init_clock_frequency() and >> use one function per branch. > >I think the split of current code into separate functions looks good. However, >maybe the correct place to do that would be inside read_clock_frequency() >instead of intel_gt_init_clock_frequency(), since read_clock_frequency() is used >inside intel_gt_check_clock_frequency(). indeed, good catch. I forgot about the debug thing reading it again later. thanks Lucas De Marchi
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c b/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c index 93608c9349fd..ebddbf7542bc 100644 --- a/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c +++ b/drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c @@ -26,26 +26,6 @@ static u32 read_reference_ts_freq(struct intel_uncore *uncore) return base_freq + frac_freq; } -static u32 gen9_get_crystal_clock_freq(struct intel_uncore *uncore, - u32 rpm_config_reg) -{ - u32 f19_2_mhz = 19200000; - u32 f24_mhz = 24000000; - u32 crystal_clock = - (rpm_config_reg & GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> - GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; - - switch (crystal_clock) { - case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ: - return f19_2_mhz; - case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ: - return f24_mhz; - default: - MISSING_CASE(crystal_clock); - return 0; - } -} - static u32 gen11_get_crystal_clock_freq(struct intel_uncore *uncore, u32 rpm_config_reg) { @@ -72,95 +52,101 @@ static u32 gen11_get_crystal_clock_freq(struct intel_uncore *uncore, } } -static u32 read_clock_frequency(struct intel_uncore *uncore) +static u32 gen11_read_clock_frequency(struct intel_uncore *uncore) { - u32 f12_5_mhz = 12500000; - u32 f19_2_mhz = 19200000; - u32 f24_mhz = 24000000; + u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); + u32 freq = 0; - if (GRAPHICS_VER(uncore->i915) >= 11) { - u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); - u32 freq = 0; + /* + * Note that on gen11+, the clock frequency may be reconfigured. + * We do not, and we assume nobody else does. + * + * First figure out the reference frequency. There are 2 ways + * we can compute the frequency, either through the + * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE + * tells us which one we should use. + */ + if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { + freq = read_reference_ts_freq(uncore); + } else { + u32 c0 = intel_uncore_read(uncore, RPM_CONFIG0); + + freq = gen11_get_crystal_clock_freq(uncore, c0); /* - * First figure out the reference frequency. There are 2 ways - * we can compute the frequency, either through the - * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE - * tells us which one we should use. - */ - if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { - freq = read_reference_ts_freq(uncore); - } else { - u32 c0 = intel_uncore_read(uncore, RPM_CONFIG0); - - if (GRAPHICS_VER(uncore->i915) >= 11) - freq = gen11_get_crystal_clock_freq(uncore, c0); - else - freq = gen9_get_crystal_clock_freq(uncore, c0); - - /* - * Now figure out how the command stream's timestamp - * register increments from this frequency (it might - * increment only every few clock cycle). - */ - freq >>= 3 - ((c0 & GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> - GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT); - } - - return freq; - } else if (GRAPHICS_VER(uncore->i915) >= 9) { - u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); - u32 freq = 0; - - if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { - freq = read_reference_ts_freq(uncore); - } else { - freq = IS_GEN9_LP(uncore->i915) ? f19_2_mhz : f24_mhz; - - /* - * Now figure out how the command stream's timestamp - * register increments from this frequency (it might - * increment only every few clock cycle). - */ - freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >> - CTC_SHIFT_PARAMETER_SHIFT); - } - - return freq; - } else if (GRAPHICS_VER(uncore->i915) >= 5) { - /* - * PRMs say: - * - * "The PCU TSC counts 10ns increments; this timestamp - * reflects bits 38:3 of the TSC (i.e. 80ns granularity, - * rolling over every 1.5 hours). + * Now figure out how the command stream's timestamp + * register increments from this frequency (it might + * increment only every few clock cycle). */ - return f12_5_mhz; + freq >>= 3 - ((c0 & GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> + GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT); + } + + return freq; +} + +static u32 gen9_read_clock_frequency(struct intel_uncore *uncore) +{ + u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE); + u32 freq = 0; + + if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { + freq = read_reference_ts_freq(uncore); } else { + freq = IS_GEN9_LP(uncore->i915) ? 19200000 : 24000000; + /* - * PRMs say: - * - * "The value in this register increments once every 16 - * hclks." (through the “Clocking Configuration” - * (“CLKCFG”) MCHBAR register) + * Now figure out how the command stream's timestamp + * register increments from this frequency (it might + * increment only every few clock cycle). */ - return RUNTIME_INFO(uncore->i915)->rawclk_freq * 1000 / 16; + freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >> + CTC_SHIFT_PARAMETER_SHIFT); } + + return freq; } -void intel_gt_init_clock_frequency(struct intel_gt *gt) +static u32 gen5_read_clock_frequency(struct intel_uncore *uncore) { /* - * Note that on gen11+, the clock frequency may be reconfigured. - * We do not, and we assume nobody else does. + * PRMs say: + * + * "The PCU TSC counts 10ns increments; this timestamp + * reflects bits 38:3 of the TSC (i.e. 80ns granularity, + * rolling over every 1.5 hours). */ - gt->clock_frequency = read_clock_frequency(gt->uncore); - if (gt->clock_frequency) - gt->clock_period_ns = intel_gt_clock_interval_to_ns(gt, 1); + return 12500000; +} + +static u32 read_clock_frequency(struct intel_uncore *uncore) +{ + /* + * PRMs say: + * + * "The value in this register increments once every 16 + * hclks." (through the “Clocking Configuration” + * (“CLKCFG”) MCHBAR register) + */ + return RUNTIME_INFO(uncore->i915)->rawclk_freq * 1000 / 16; +} + +void intel_gt_init_clock_frequency(struct intel_gt *gt) +{ + if (GRAPHICS_VER(gt->i915) >= 11) + gt->clock_frequency = gen11_read_clock_frequency(gt->uncore); + else if (GRAPHICS_VER(gt->i915) >= 9) + gt->clock_frequency = gen9_read_clock_frequency(gt->uncore); + else if (GRAPHICS_VER(gt->i915) >= 5) + gt->clock_frequency = gen5_read_clock_frequency(gt->uncore); + else + gt->clock_frequency = read_clock_frequency(gt->uncore); /* Icelake appears to use another fixed frequency for CTX_TIMESTAMP */ if (GRAPHICS_VER(gt->i915) == 11) gt->clock_period_ns = NSEC_PER_SEC / 13750000; + else if (gt->clock_frequency) + gt->clock_period_ns = intel_gt_clock_interval_to_ns(gt, 1); GT_TRACE(gt, "Using clock frequency: %dkHz, period: %dns, wrap: %lldms\n",
Instead of calling read_clock_frequency() to walk the if/else ladder per platform, move the ladder to intel_gt_init_clock_frequency() and use one function per branch. With the new logic, it's now clear the call to gen9_get_crystal_clock_freq() was just dead code, as gen9 is handled by another function and there is no version 10. Remove that function and the caller. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>