Message ID | 20210710012026.19705-15-vinay.belgaumkar@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Enable GuC based power management features | expand |
Hi Vinay, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next drm-exynos/exynos-drm-next tegra-drm/drm/tegra/for-next drm/drm-next v5.13 next-20210709] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Vinay-Belgaumkar/Enable-GuC-based-power-management-features/20210710-092520 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: x86_64-randconfig-a014-20210709 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 8d69635ed9ecf36fd0ca85906bfde17949671cbe) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # https://github.com/0day-ci/linux/commit/8388422991b4e0e4da460328634a7ec1d278de6a git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Vinay-Belgaumkar/Enable-GuC-based-power-management-features/20210710-092520 git checkout 8388422991b4e0e4da460328634a7ec1d278de6a # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/gpu/drm/i915/gt/intel_rps.c:1969:5: warning: no previous prototype for function 'intel_rps_read_punit_req' [-Wmissing-prototypes] u32 intel_rps_read_punit_req(struct intel_rps *rps) ^ drivers/gpu/drm/i915/gt/intel_rps.c:1969:1: note: declare 'static' if the function is not intended to be used outside of this translation unit u32 intel_rps_read_punit_req(struct intel_rps *rps) ^ static >> drivers/gpu/drm/i915/gt/intel_rps.c:1978:5: warning: no previous prototype for function 'intel_rps_get_req' [-Wmissing-prototypes] u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) ^ drivers/gpu/drm/i915/gt/intel_rps.c:1978:1: note: declare 'static' if the function is not intended to be used outside of this translation unit u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) ^ static >> drivers/gpu/drm/i915/gt/intel_rps.c:1985:5: warning: no previous prototype for function 'intel_rps_read_punit_req_frequency' [-Wmissing-prototypes] u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) ^ drivers/gpu/drm/i915/gt/intel_rps.c:1985:1: note: declare 'static' if the function is not intended to be used outside of this translation unit u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) ^ static 3 warnings generated. vim +/intel_rps_read_punit_req +1969 drivers/gpu/drm/i915/gt/intel_rps.c 1968 > 1969 u32 intel_rps_read_punit_req(struct intel_rps *rps) 1970 { 1971 struct intel_uncore *uncore = rps_to_uncore(rps); 1972 1973 u32 pureq = intel_uncore_read(uncore, GEN6_RPNSWREQ); 1974 1975 return pureq; 1976 } 1977 > 1978 u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) 1979 { 1980 u32 req = pureq >> GEN9_SW_REQ_UNSLICE_RATIO_SHIFT; 1981 1982 return req; 1983 } 1984 > 1985 u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) 1986 { 1987 u32 freq = intel_rps_get_req(rps, intel_rps_read_punit_req(rps)); 1988 1989 return intel_gpu_freq(rps, freq); 1990 } 1991 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Vinay,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-tip/drm-tip]
[cannot apply to drm-intel/for-linux-next drm-exynos/exynos-drm-next tegra-drm/drm/tegra/for-next drm/drm-next v5.13 next-20210709]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Vinay-Belgaumkar/Enable-GuC-based-power-management-features/20210710-092520
base: git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: x86_64-randconfig-s021-20210709 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-341-g8af24329-dirty
# https://github.com/0day-ci/linux/commit/8388422991b4e0e4da460328634a7ec1d278de6a
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Vinay-Belgaumkar/Enable-GuC-based-power-management-features/20210710-092520
git checkout 8388422991b4e0e4da460328634a7ec1d278de6a
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/gpu/drm/i915/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
>> drivers/gpu/drm/i915/gt/intel_rps.c:1978:5: sparse: sparse: symbol 'intel_rps_get_req' was not declared. Should it be static?
Please review and possibly fold the followup patch.
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Vinay, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next drm-exynos/exynos-drm-next tegra-drm/drm/tegra/for-next drm/drm-next v5.13 next-20210709] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Vinay-Belgaumkar/Enable-GuC-based-power-management-features/20210710-092520 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: x86_64-randconfig-a004-20210709 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://github.com/0day-ci/linux/commit/8388422991b4e0e4da460328634a7ec1d278de6a git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Vinay-Belgaumkar/Enable-GuC-based-power-management-features/20210710-092520 git checkout 8388422991b4e0e4da460328634a7ec1d278de6a # save the attached .config to linux build tree make W=1 ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/gpu/drm/i915/gt/intel_rps.c:1969:5: warning: no previous prototype for 'intel_rps_read_punit_req' [-Wmissing-prototypes] 1969 | u32 intel_rps_read_punit_req(struct intel_rps *rps) | ^~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/gpu/drm/i915/gt/intel_rps.c:1978:5: warning: no previous prototype for 'intel_rps_get_req' [-Wmissing-prototypes] 1978 | u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) | ^~~~~~~~~~~~~~~~~ >> drivers/gpu/drm/i915/gt/intel_rps.c:1985:5: warning: no previous prototype for 'intel_rps_read_punit_req_frequency' [-Wmissing-prototypes] 1985 | u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vim +/intel_rps_read_punit_req +1969 drivers/gpu/drm/i915/gt/intel_rps.c 1968 > 1969 u32 intel_rps_read_punit_req(struct intel_rps *rps) 1970 { 1971 struct intel_uncore *uncore = rps_to_uncore(rps); 1972 1973 u32 pureq = intel_uncore_read(uncore, GEN6_RPNSWREQ); 1974 1975 return pureq; 1976 } 1977 > 1978 u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) 1979 { 1980 u32 req = pureq >> GEN9_SW_REQ_UNSLICE_RATIO_SHIFT; 1981 1982 return req; 1983 } 1984 > 1985 u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) 1986 { 1987 u32 freq = intel_rps_get_req(rps, intel_rps_read_punit_req(rps)); 1988 1989 return intel_gpu_freq(rps, freq); 1990 } 1991 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On 10.07.2021 03:20, Vinay Belgaumkar wrote: > Update the get/set min/max freq hooks to work for > slpc case as well. Consolidate helpers for requested/min/max > frequency get/set to intel_rps where the proper action can > be taken depending on whether slpc is enabled. 2x s/slpc/SLPC > > Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com> > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> > Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> > --- > drivers/gpu/drm/i915/gt/intel_rps.c | 135 ++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/gt/intel_rps.h | 5 ++ > drivers/gpu/drm/i915/i915_pmu.c | 2 +- > drivers/gpu/drm/i915/i915_reg.h | 2 + > drivers/gpu/drm/i915/i915_sysfs.c | 71 +++------------ > 5 files changed, 154 insertions(+), 61 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c > index e858eeb2c59d..88ffc5d90730 100644 > --- a/drivers/gpu/drm/i915/gt/intel_rps.c > +++ b/drivers/gpu/drm/i915/gt/intel_rps.c > @@ -37,6 +37,12 @@ static struct intel_uncore *rps_to_uncore(struct intel_rps *rps) > return rps_to_gt(rps)->uncore; > } > > +static struct intel_guc_slpc *rps_to_slpc(struct intel_rps *rps) > +{ > + struct intel_gt *gt = rps_to_gt(rps); > + return >->uc.guc.slpc; either add empty line between decl/code or make it one-liner > +} > + > static bool rps_uses_slpc(struct intel_rps *rps) > { > struct intel_gt *gt = rps_to_gt(rps); > @@ -1960,6 +1966,135 @@ u32 intel_rps_read_actual_frequency(struct intel_rps *rps) > return freq; > } > > +u32 intel_rps_read_punit_req(struct intel_rps *rps) > +{ > + struct intel_uncore *uncore = rps_to_uncore(rps); > + drop empty line > + u32 pureq = intel_uncore_read(uncore, GEN6_RPNSWREQ); > + > + return pureq; > +} > + > +u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) > +{ > + u32 req = pureq >> GEN9_SW_REQ_UNSLICE_RATIO_SHIFT; > + > + return req; > +} > + > +u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) > +{ > + u32 freq = intel_rps_get_req(rps, intel_rps_read_punit_req(rps)); > + > + return intel_gpu_freq(rps, freq); > +} > + > +u32 intel_rps_get_requested_frequency(struct intel_rps *rps) > +{ > + if (rps_uses_slpc(rps)) > + return intel_rps_read_punit_req_frequency(rps); > + else > + return intel_gpu_freq(rps, rps->cur_freq); > +} > + > +u32 intel_rps_get_max_frequency(struct intel_rps *rps) > +{ > + struct intel_guc_slpc *slpc = rps_to_slpc(rps); > + > + if (rps_uses_slpc(rps)) > + return slpc->max_freq_softlimit; > + else > + return intel_gpu_freq(rps, rps->max_freq_softlimit); > +} > + > +int intel_rps_set_max_frequency(struct intel_rps *rps, u32 val) > +{ > + struct intel_guc_slpc *slpc = rps_to_slpc(rps); > + int ret; > + > + if (rps_uses_slpc(rps)) > + return intel_guc_slpc_set_max_freq(slpc, val); > + > + mutex_lock(&rps->lock); > + > + val = intel_freq_opcode(rps, val); > + if (val < rps->min_freq || > + val > rps->max_freq || > + val < rps->min_freq_softlimit) { > + ret = -EINVAL; > + goto unlock; > + } > + > + if (val > rps->rp0_freq) > + DRM_DEBUG("User requested overclocking to %d\n", use drm_dbg Michal > + intel_gpu_freq(rps, val)); > + > + rps->max_freq_softlimit = val; > + > + val = clamp_t(int, rps->cur_freq, > + rps->min_freq_softlimit, > + rps->max_freq_softlimit); > + > + /* > + * We still need *_set_rps to process the new max_delay and > + * update the interrupt limits and PMINTRMSK even though > + * frequency request may be unchanged. > + */ > + intel_rps_set(rps, val); > + > +unlock: > + mutex_unlock(&rps->lock); > + > + return ret; > +} > + > +u32 intel_rps_get_min_frequency(struct intel_rps *rps) > +{ > + struct intel_guc_slpc *slpc = rps_to_slpc(rps); > + > + if (rps_uses_slpc(rps)) > + return slpc->min_freq_softlimit; > + else > + return intel_gpu_freq(rps, rps->min_freq_softlimit); > +} > + > +int intel_rps_set_min_frequency(struct intel_rps *rps, u32 val) > +{ > + struct intel_guc_slpc *slpc = rps_to_slpc(rps); > + int ret; > + > + if (rps_uses_slpc(rps)) > + return intel_guc_slpc_set_min_freq(slpc, val); > + > + mutex_lock(&rps->lock); > + > + val = intel_freq_opcode(rps, val); > + if (val < rps->min_freq || > + val > rps->max_freq || > + val > rps->max_freq_softlimit) { > + ret = -EINVAL; > + goto unlock; > + } > + > + rps->min_freq_softlimit = val; > + > + val = clamp_t(int, rps->cur_freq, > + rps->min_freq_softlimit, > + rps->max_freq_softlimit); > + > + /* > + * We still need *_set_rps to process the new min_delay and > + * update the interrupt limits and PMINTRMSK even though > + * frequency request may be unchanged. > + */ > + intel_rps_set(rps, val); > + > +unlock: > + mutex_unlock(&rps->lock); > + > + return ret; > +} > + > /* External interface for intel_ips.ko */ > > static struct drm_i915_private __rcu *ips_mchdev; > diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h b/drivers/gpu/drm/i915/gt/intel_rps.h > index 1d2cfc98b510..9a09ff5ebf64 100644 > --- a/drivers/gpu/drm/i915/gt/intel_rps.h > +++ b/drivers/gpu/drm/i915/gt/intel_rps.h > @@ -31,6 +31,11 @@ int intel_gpu_freq(struct intel_rps *rps, int val); > int intel_freq_opcode(struct intel_rps *rps, int val); > u32 intel_rps_get_cagf(struct intel_rps *rps, u32 rpstat1); > u32 intel_rps_read_actual_frequency(struct intel_rps *rps); > +u32 intel_rps_get_requested_frequency(struct intel_rps *rps); > +u32 intel_rps_get_min_frequency(struct intel_rps *rps); > +int intel_rps_set_min_frequency(struct intel_rps *rps, u32 val); > +u32 intel_rps_get_max_frequency(struct intel_rps *rps); > +int intel_rps_set_max_frequency(struct intel_rps *rps, u32 val); > > void gen5_rps_irq_handler(struct intel_rps *rps); > void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir); > diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c > index 34d37d46a126..a896bec18255 100644 > --- a/drivers/gpu/drm/i915/i915_pmu.c > +++ b/drivers/gpu/drm/i915/i915_pmu.c > @@ -407,7 +407,7 @@ frequency_sample(struct intel_gt *gt, unsigned int period_ns) > > if (pmu->enable & config_mask(I915_PMU_REQUESTED_FREQUENCY)) { > add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_REQ], > - intel_gpu_freq(rps, rps->cur_freq), > + intel_rps_get_requested_frequency(rps), > period_ns / 1000); > } > > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index 7d9e90aa3ec0..8ab3c2f8f8e4 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -9195,6 +9195,8 @@ enum { > #define GEN9_FREQUENCY(x) ((x) << 23) > #define GEN6_OFFSET(x) ((x) << 19) > #define GEN6_AGGRESSIVE_TURBO (0 << 15) > +#define GEN9_SW_REQ_UNSLICE_RATIO_SHIFT 23 > + > #define GEN6_RC_VIDEO_FREQ _MMIO(0xA00C) > #define GEN6_RC_CONTROL _MMIO(0xA090) > #define GEN6_RC_CTL_RC6pp_ENABLE (1 << 16) > diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c > index 873bf996ceb5..f2eee8491b19 100644 > --- a/drivers/gpu/drm/i915/i915_sysfs.c > +++ b/drivers/gpu/drm/i915/i915_sysfs.c > @@ -272,7 +272,7 @@ static ssize_t gt_cur_freq_mhz_show(struct device *kdev, > struct drm_i915_private *i915 = kdev_minor_to_i915(kdev); > struct intel_rps *rps = &i915->gt.rps; > > - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->cur_freq)); > + return sysfs_emit(buf, "%d\n", intel_rps_get_requested_frequency(rps)); > } > > static ssize_t gt_boost_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) > @@ -326,9 +326,10 @@ static ssize_t vlv_rpe_freq_mhz_show(struct device *kdev, > static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) > { > struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); > - struct intel_rps *rps = &dev_priv->gt.rps; > + struct intel_gt *gt = &dev_priv->gt; > + struct intel_rps *rps = >->rps; > > - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->max_freq_softlimit)); > + return sysfs_emit(buf, "%d\n", intel_rps_get_max_frequency(rps)); > } > > static ssize_t gt_max_freq_mhz_store(struct device *kdev, > @@ -336,7 +337,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, > const char *buf, size_t count) > { > struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); > - struct intel_rps *rps = &dev_priv->gt.rps; > + struct intel_gt *gt = &dev_priv->gt; > + struct intel_rps *rps = >->rps; > ssize_t ret; > u32 val; > > @@ -344,35 +346,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, > if (ret) > return ret; > > - mutex_lock(&rps->lock); > - > - val = intel_freq_opcode(rps, val); > - if (val < rps->min_freq || > - val > rps->max_freq || > - val < rps->min_freq_softlimit) { > - ret = -EINVAL; > - goto unlock; > - } > - > - if (val > rps->rp0_freq) > - DRM_DEBUG("User requested overclocking to %d\n", > - intel_gpu_freq(rps, val)); > - > - rps->max_freq_softlimit = val; > - > - val = clamp_t(int, rps->cur_freq, > - rps->min_freq_softlimit, > - rps->max_freq_softlimit); > - > - /* > - * We still need *_set_rps to process the new max_delay and > - * update the interrupt limits and PMINTRMSK even though > - * frequency request may be unchanged. > - */ > - intel_rps_set(rps, val); > - > -unlock: > - mutex_unlock(&rps->lock); > + ret = intel_rps_set_max_frequency(rps, val); > > return ret ?: count; > } > @@ -380,9 +354,10 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, > static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) > { > struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); > - struct intel_rps *rps = &dev_priv->gt.rps; > + struct intel_gt *gt = &dev_priv->gt; > + struct intel_rps *rps = >->rps; > > - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->min_freq_softlimit)); > + return sysfs_emit(buf, "%d\n", intel_rps_get_min_frequency(rps)); > } > > static ssize_t gt_min_freq_mhz_store(struct device *kdev, > @@ -398,31 +373,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev, > if (ret) > return ret; > > - mutex_lock(&rps->lock); > - > - val = intel_freq_opcode(rps, val); > - if (val < rps->min_freq || > - val > rps->max_freq || > - val > rps->max_freq_softlimit) { > - ret = -EINVAL; > - goto unlock; > - } > - > - rps->min_freq_softlimit = val; > - > - val = clamp_t(int, rps->cur_freq, > - rps->min_freq_softlimit, > - rps->max_freq_softlimit); > - > - /* > - * We still need *_set_rps to process the new min_delay and > - * update the interrupt limits and PMINTRMSK even though > - * frequency request may be unchanged. > - */ > - intel_rps_set(rps, val); > - > -unlock: > - mutex_unlock(&rps->lock); > + ret = intel_rps_set_min_frequency(rps, val); > > return ret ?: count; > } >
On 7/10/2021 11:20 AM, Michal Wajdeczko wrote: > > > On 10.07.2021 03:20, Vinay Belgaumkar wrote: >> Update the get/set min/max freq hooks to work for >> slpc case as well. Consolidate helpers for requested/min/max >> frequency get/set to intel_rps where the proper action can >> be taken depending on whether slpc is enabled. > > 2x s/slpc/SLPC done. > >> >> Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com> >> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> >> Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> >> --- >> drivers/gpu/drm/i915/gt/intel_rps.c | 135 ++++++++++++++++++++++++++++ >> drivers/gpu/drm/i915/gt/intel_rps.h | 5 ++ >> drivers/gpu/drm/i915/i915_pmu.c | 2 +- >> drivers/gpu/drm/i915/i915_reg.h | 2 + >> drivers/gpu/drm/i915/i915_sysfs.c | 71 +++------------ >> 5 files changed, 154 insertions(+), 61 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c >> index e858eeb2c59d..88ffc5d90730 100644 >> --- a/drivers/gpu/drm/i915/gt/intel_rps.c >> +++ b/drivers/gpu/drm/i915/gt/intel_rps.c >> @@ -37,6 +37,12 @@ static struct intel_uncore *rps_to_uncore(struct intel_rps *rps) >> return rps_to_gt(rps)->uncore; >> } >> >> +static struct intel_guc_slpc *rps_to_slpc(struct intel_rps *rps) >> +{ >> + struct intel_gt *gt = rps_to_gt(rps); >> + return >->uc.guc.slpc; > > either add empty line between decl/code or make it one-liner done. > >> +} >> + >> static bool rps_uses_slpc(struct intel_rps *rps) >> { >> struct intel_gt *gt = rps_to_gt(rps); >> @@ -1960,6 +1966,135 @@ u32 intel_rps_read_actual_frequency(struct intel_rps *rps) >> return freq; >> } >> >> +u32 intel_rps_read_punit_req(struct intel_rps *rps) >> +{ >> + struct intel_uncore *uncore = rps_to_uncore(rps); >> + > > drop empty line done. > >> + u32 pureq = intel_uncore_read(uncore, GEN6_RPNSWREQ); >> + >> + return pureq; >> +} >> + >> +u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) >> +{ >> + u32 req = pureq >> GEN9_SW_REQ_UNSLICE_RATIO_SHIFT; >> + >> + return req; >> +} >> + >> +u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) >> +{ >> + u32 freq = intel_rps_get_req(rps, intel_rps_read_punit_req(rps)); >> + >> + return intel_gpu_freq(rps, freq); >> +} >> + >> +u32 intel_rps_get_requested_frequency(struct intel_rps *rps) >> +{ >> + if (rps_uses_slpc(rps)) >> + return intel_rps_read_punit_req_frequency(rps); >> + else >> + return intel_gpu_freq(rps, rps->cur_freq); >> +} >> + >> +u32 intel_rps_get_max_frequency(struct intel_rps *rps) >> +{ >> + struct intel_guc_slpc *slpc = rps_to_slpc(rps); >> + >> + if (rps_uses_slpc(rps)) >> + return slpc->max_freq_softlimit; >> + else >> + return intel_gpu_freq(rps, rps->max_freq_softlimit); >> +} >> + >> +int intel_rps_set_max_frequency(struct intel_rps *rps, u32 val) >> +{ >> + struct intel_guc_slpc *slpc = rps_to_slpc(rps); >> + int ret; >> + >> + if (rps_uses_slpc(rps)) >> + return intel_guc_slpc_set_max_freq(slpc, val); >> + >> + mutex_lock(&rps->lock); >> + >> + val = intel_freq_opcode(rps, val); >> + if (val < rps->min_freq || >> + val > rps->max_freq || >> + val < rps->min_freq_softlimit) { >> + ret = -EINVAL; >> + goto unlock; >> + } >> + >> + if (val > rps->rp0_freq) >> + DRM_DEBUG("User requested overclocking to %d\n", > > use drm_dbg Done. Thanks, Vinay. > > Michal > >> + intel_gpu_freq(rps, val)); >> + >> + rps->max_freq_softlimit = val; >> + >> + val = clamp_t(int, rps->cur_freq, >> + rps->min_freq_softlimit, >> + rps->max_freq_softlimit); >> + >> + /* >> + * We still need *_set_rps to process the new max_delay and >> + * update the interrupt limits and PMINTRMSK even though >> + * frequency request may be unchanged. >> + */ >> + intel_rps_set(rps, val); >> + >> +unlock: >> + mutex_unlock(&rps->lock); >> + >> + return ret; >> +} >> + >> +u32 intel_rps_get_min_frequency(struct intel_rps *rps) >> +{ >> + struct intel_guc_slpc *slpc = rps_to_slpc(rps); >> + >> + if (rps_uses_slpc(rps)) >> + return slpc->min_freq_softlimit; >> + else >> + return intel_gpu_freq(rps, rps->min_freq_softlimit); >> +} >> + >> +int intel_rps_set_min_frequency(struct intel_rps *rps, u32 val) >> +{ >> + struct intel_guc_slpc *slpc = rps_to_slpc(rps); >> + int ret; >> + >> + if (rps_uses_slpc(rps)) >> + return intel_guc_slpc_set_min_freq(slpc, val); >> + >> + mutex_lock(&rps->lock); >> + >> + val = intel_freq_opcode(rps, val); >> + if (val < rps->min_freq || >> + val > rps->max_freq || >> + val > rps->max_freq_softlimit) { >> + ret = -EINVAL; >> + goto unlock; >> + } >> + >> + rps->min_freq_softlimit = val; >> + >> + val = clamp_t(int, rps->cur_freq, >> + rps->min_freq_softlimit, >> + rps->max_freq_softlimit); >> + >> + /* >> + * We still need *_set_rps to process the new min_delay and >> + * update the interrupt limits and PMINTRMSK even though >> + * frequency request may be unchanged. >> + */ >> + intel_rps_set(rps, val); >> + >> +unlock: >> + mutex_unlock(&rps->lock); >> + >> + return ret; >> +} >> + >> /* External interface for intel_ips.ko */ >> >> static struct drm_i915_private __rcu *ips_mchdev; >> diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h b/drivers/gpu/drm/i915/gt/intel_rps.h >> index 1d2cfc98b510..9a09ff5ebf64 100644 >> --- a/drivers/gpu/drm/i915/gt/intel_rps.h >> +++ b/drivers/gpu/drm/i915/gt/intel_rps.h >> @@ -31,6 +31,11 @@ int intel_gpu_freq(struct intel_rps *rps, int val); >> int intel_freq_opcode(struct intel_rps *rps, int val); >> u32 intel_rps_get_cagf(struct intel_rps *rps, u32 rpstat1); >> u32 intel_rps_read_actual_frequency(struct intel_rps *rps); >> +u32 intel_rps_get_requested_frequency(struct intel_rps *rps); >> +u32 intel_rps_get_min_frequency(struct intel_rps *rps); >> +int intel_rps_set_min_frequency(struct intel_rps *rps, u32 val); >> +u32 intel_rps_get_max_frequency(struct intel_rps *rps); >> +int intel_rps_set_max_frequency(struct intel_rps *rps, u32 val); >> >> void gen5_rps_irq_handler(struct intel_rps *rps); >> void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir); >> diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c >> index 34d37d46a126..a896bec18255 100644 >> --- a/drivers/gpu/drm/i915/i915_pmu.c >> +++ b/drivers/gpu/drm/i915/i915_pmu.c >> @@ -407,7 +407,7 @@ frequency_sample(struct intel_gt *gt, unsigned int period_ns) >> >> if (pmu->enable & config_mask(I915_PMU_REQUESTED_FREQUENCY)) { >> add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_REQ], >> - intel_gpu_freq(rps, rps->cur_freq), >> + intel_rps_get_requested_frequency(rps), >> period_ns / 1000); >> } >> >> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h >> index 7d9e90aa3ec0..8ab3c2f8f8e4 100644 >> --- a/drivers/gpu/drm/i915/i915_reg.h >> +++ b/drivers/gpu/drm/i915/i915_reg.h >> @@ -9195,6 +9195,8 @@ enum { >> #define GEN9_FREQUENCY(x) ((x) << 23) >> #define GEN6_OFFSET(x) ((x) << 19) >> #define GEN6_AGGRESSIVE_TURBO (0 << 15) >> +#define GEN9_SW_REQ_UNSLICE_RATIO_SHIFT 23 >> + >> #define GEN6_RC_VIDEO_FREQ _MMIO(0xA00C) >> #define GEN6_RC_CONTROL _MMIO(0xA090) >> #define GEN6_RC_CTL_RC6pp_ENABLE (1 << 16) >> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c >> index 873bf996ceb5..f2eee8491b19 100644 >> --- a/drivers/gpu/drm/i915/i915_sysfs.c >> +++ b/drivers/gpu/drm/i915/i915_sysfs.c >> @@ -272,7 +272,7 @@ static ssize_t gt_cur_freq_mhz_show(struct device *kdev, >> struct drm_i915_private *i915 = kdev_minor_to_i915(kdev); >> struct intel_rps *rps = &i915->gt.rps; >> >> - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->cur_freq)); >> + return sysfs_emit(buf, "%d\n", intel_rps_get_requested_frequency(rps)); >> } >> >> static ssize_t gt_boost_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) >> @@ -326,9 +326,10 @@ static ssize_t vlv_rpe_freq_mhz_show(struct device *kdev, >> static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) >> { >> struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); >> - struct intel_rps *rps = &dev_priv->gt.rps; >> + struct intel_gt *gt = &dev_priv->gt; >> + struct intel_rps *rps = >->rps; >> >> - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->max_freq_softlimit)); >> + return sysfs_emit(buf, "%d\n", intel_rps_get_max_frequency(rps)); >> } >> >> static ssize_t gt_max_freq_mhz_store(struct device *kdev, >> @@ -336,7 +337,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, >> const char *buf, size_t count) >> { >> struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); >> - struct intel_rps *rps = &dev_priv->gt.rps; >> + struct intel_gt *gt = &dev_priv->gt; >> + struct intel_rps *rps = >->rps; >> ssize_t ret; >> u32 val; >> >> @@ -344,35 +346,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, >> if (ret) >> return ret; >> >> - mutex_lock(&rps->lock); >> - >> - val = intel_freq_opcode(rps, val); >> - if (val < rps->min_freq || >> - val > rps->max_freq || >> - val < rps->min_freq_softlimit) { >> - ret = -EINVAL; >> - goto unlock; >> - } >> - >> - if (val > rps->rp0_freq) >> - DRM_DEBUG("User requested overclocking to %d\n", >> - intel_gpu_freq(rps, val)); >> - >> - rps->max_freq_softlimit = val; >> - >> - val = clamp_t(int, rps->cur_freq, >> - rps->min_freq_softlimit, >> - rps->max_freq_softlimit); >> - >> - /* >> - * We still need *_set_rps to process the new max_delay and >> - * update the interrupt limits and PMINTRMSK even though >> - * frequency request may be unchanged. >> - */ >> - intel_rps_set(rps, val); >> - >> -unlock: >> - mutex_unlock(&rps->lock); >> + ret = intel_rps_set_max_frequency(rps, val); >> >> return ret ?: count; >> } >> @@ -380,9 +354,10 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, >> static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) >> { >> struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); >> - struct intel_rps *rps = &dev_priv->gt.rps; >> + struct intel_gt *gt = &dev_priv->gt; >> + struct intel_rps *rps = >->rps; >> >> - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->min_freq_softlimit)); >> + return sysfs_emit(buf, "%d\n", intel_rps_get_min_frequency(rps)); >> } >> >> static ssize_t gt_min_freq_mhz_store(struct device *kdev, >> @@ -398,31 +373,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev, >> if (ret) >> return ret; >> >> - mutex_lock(&rps->lock); >> - >> - val = intel_freq_opcode(rps, val); >> - if (val < rps->min_freq || >> - val > rps->max_freq || >> - val > rps->max_freq_softlimit) { >> - ret = -EINVAL; >> - goto unlock; >> - } >> - >> - rps->min_freq_softlimit = val; >> - >> - val = clamp_t(int, rps->cur_freq, >> - rps->min_freq_softlimit, >> - rps->max_freq_softlimit); >> - >> - /* >> - * We still need *_set_rps to process the new min_delay and >> - * update the interrupt limits and PMINTRMSK even though >> - * frequency request may be unchanged. >> - */ >> - intel_rps_set(rps, val); >> - >> -unlock: >> - mutex_unlock(&rps->lock); >> + ret = intel_rps_set_min_frequency(rps, val); >> >> return ret ?: count; >> } >>
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c index e858eeb2c59d..88ffc5d90730 100644 --- a/drivers/gpu/drm/i915/gt/intel_rps.c +++ b/drivers/gpu/drm/i915/gt/intel_rps.c @@ -37,6 +37,12 @@ static struct intel_uncore *rps_to_uncore(struct intel_rps *rps) return rps_to_gt(rps)->uncore; } +static struct intel_guc_slpc *rps_to_slpc(struct intel_rps *rps) +{ + struct intel_gt *gt = rps_to_gt(rps); + return >->uc.guc.slpc; +} + static bool rps_uses_slpc(struct intel_rps *rps) { struct intel_gt *gt = rps_to_gt(rps); @@ -1960,6 +1966,135 @@ u32 intel_rps_read_actual_frequency(struct intel_rps *rps) return freq; } +u32 intel_rps_read_punit_req(struct intel_rps *rps) +{ + struct intel_uncore *uncore = rps_to_uncore(rps); + + u32 pureq = intel_uncore_read(uncore, GEN6_RPNSWREQ); + + return pureq; +} + +u32 intel_rps_get_req(struct intel_rps *rps, u32 pureq) +{ + u32 req = pureq >> GEN9_SW_REQ_UNSLICE_RATIO_SHIFT; + + return req; +} + +u32 intel_rps_read_punit_req_frequency(struct intel_rps *rps) +{ + u32 freq = intel_rps_get_req(rps, intel_rps_read_punit_req(rps)); + + return intel_gpu_freq(rps, freq); +} + +u32 intel_rps_get_requested_frequency(struct intel_rps *rps) +{ + if (rps_uses_slpc(rps)) + return intel_rps_read_punit_req_frequency(rps); + else + return intel_gpu_freq(rps, rps->cur_freq); +} + +u32 intel_rps_get_max_frequency(struct intel_rps *rps) +{ + struct intel_guc_slpc *slpc = rps_to_slpc(rps); + + if (rps_uses_slpc(rps)) + return slpc->max_freq_softlimit; + else + return intel_gpu_freq(rps, rps->max_freq_softlimit); +} + +int intel_rps_set_max_frequency(struct intel_rps *rps, u32 val) +{ + struct intel_guc_slpc *slpc = rps_to_slpc(rps); + int ret; + + if (rps_uses_slpc(rps)) + return intel_guc_slpc_set_max_freq(slpc, val); + + mutex_lock(&rps->lock); + + val = intel_freq_opcode(rps, val); + if (val < rps->min_freq || + val > rps->max_freq || + val < rps->min_freq_softlimit) { + ret = -EINVAL; + goto unlock; + } + + if (val > rps->rp0_freq) + DRM_DEBUG("User requested overclocking to %d\n", + intel_gpu_freq(rps, val)); + + rps->max_freq_softlimit = val; + + val = clamp_t(int, rps->cur_freq, + rps->min_freq_softlimit, + rps->max_freq_softlimit); + + /* + * We still need *_set_rps to process the new max_delay and + * update the interrupt limits and PMINTRMSK even though + * frequency request may be unchanged. + */ + intel_rps_set(rps, val); + +unlock: + mutex_unlock(&rps->lock); + + return ret; +} + +u32 intel_rps_get_min_frequency(struct intel_rps *rps) +{ + struct intel_guc_slpc *slpc = rps_to_slpc(rps); + + if (rps_uses_slpc(rps)) + return slpc->min_freq_softlimit; + else + return intel_gpu_freq(rps, rps->min_freq_softlimit); +} + +int intel_rps_set_min_frequency(struct intel_rps *rps, u32 val) +{ + struct intel_guc_slpc *slpc = rps_to_slpc(rps); + int ret; + + if (rps_uses_slpc(rps)) + return intel_guc_slpc_set_min_freq(slpc, val); + + mutex_lock(&rps->lock); + + val = intel_freq_opcode(rps, val); + if (val < rps->min_freq || + val > rps->max_freq || + val > rps->max_freq_softlimit) { + ret = -EINVAL; + goto unlock; + } + + rps->min_freq_softlimit = val; + + val = clamp_t(int, rps->cur_freq, + rps->min_freq_softlimit, + rps->max_freq_softlimit); + + /* + * We still need *_set_rps to process the new min_delay and + * update the interrupt limits and PMINTRMSK even though + * frequency request may be unchanged. + */ + intel_rps_set(rps, val); + +unlock: + mutex_unlock(&rps->lock); + + return ret; +} + /* External interface for intel_ips.ko */ static struct drm_i915_private __rcu *ips_mchdev; diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h b/drivers/gpu/drm/i915/gt/intel_rps.h index 1d2cfc98b510..9a09ff5ebf64 100644 --- a/drivers/gpu/drm/i915/gt/intel_rps.h +++ b/drivers/gpu/drm/i915/gt/intel_rps.h @@ -31,6 +31,11 @@ int intel_gpu_freq(struct intel_rps *rps, int val); int intel_freq_opcode(struct intel_rps *rps, int val); u32 intel_rps_get_cagf(struct intel_rps *rps, u32 rpstat1); u32 intel_rps_read_actual_frequency(struct intel_rps *rps); +u32 intel_rps_get_requested_frequency(struct intel_rps *rps); +u32 intel_rps_get_min_frequency(struct intel_rps *rps); +int intel_rps_set_min_frequency(struct intel_rps *rps, u32 val); +u32 intel_rps_get_max_frequency(struct intel_rps *rps); +int intel_rps_set_max_frequency(struct intel_rps *rps, u32 val); void gen5_rps_irq_handler(struct intel_rps *rps); void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir); diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c index 34d37d46a126..a896bec18255 100644 --- a/drivers/gpu/drm/i915/i915_pmu.c +++ b/drivers/gpu/drm/i915/i915_pmu.c @@ -407,7 +407,7 @@ frequency_sample(struct intel_gt *gt, unsigned int period_ns) if (pmu->enable & config_mask(I915_PMU_REQUESTED_FREQUENCY)) { add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_REQ], - intel_gpu_freq(rps, rps->cur_freq), + intel_rps_get_requested_frequency(rps), period_ns / 1000); } diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 7d9e90aa3ec0..8ab3c2f8f8e4 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -9195,6 +9195,8 @@ enum { #define GEN9_FREQUENCY(x) ((x) << 23) #define GEN6_OFFSET(x) ((x) << 19) #define GEN6_AGGRESSIVE_TURBO (0 << 15) +#define GEN9_SW_REQ_UNSLICE_RATIO_SHIFT 23 + #define GEN6_RC_VIDEO_FREQ _MMIO(0xA00C) #define GEN6_RC_CONTROL _MMIO(0xA090) #define GEN6_RC_CTL_RC6pp_ENABLE (1 << 16) diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c index 873bf996ceb5..f2eee8491b19 100644 --- a/drivers/gpu/drm/i915/i915_sysfs.c +++ b/drivers/gpu/drm/i915/i915_sysfs.c @@ -272,7 +272,7 @@ static ssize_t gt_cur_freq_mhz_show(struct device *kdev, struct drm_i915_private *i915 = kdev_minor_to_i915(kdev); struct intel_rps *rps = &i915->gt.rps; - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->cur_freq)); + return sysfs_emit(buf, "%d\n", intel_rps_get_requested_frequency(rps)); } static ssize_t gt_boost_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) @@ -326,9 +326,10 @@ static ssize_t vlv_rpe_freq_mhz_show(struct device *kdev, static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) { struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); - struct intel_rps *rps = &dev_priv->gt.rps; + struct intel_gt *gt = &dev_priv->gt; + struct intel_rps *rps = >->rps; - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->max_freq_softlimit)); + return sysfs_emit(buf, "%d\n", intel_rps_get_max_frequency(rps)); } static ssize_t gt_max_freq_mhz_store(struct device *kdev, @@ -336,7 +337,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, const char *buf, size_t count) { struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); - struct intel_rps *rps = &dev_priv->gt.rps; + struct intel_gt *gt = &dev_priv->gt; + struct intel_rps *rps = >->rps; ssize_t ret; u32 val; @@ -344,35 +346,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, if (ret) return ret; - mutex_lock(&rps->lock); - - val = intel_freq_opcode(rps, val); - if (val < rps->min_freq || - val > rps->max_freq || - val < rps->min_freq_softlimit) { - ret = -EINVAL; - goto unlock; - } - - if (val > rps->rp0_freq) - DRM_DEBUG("User requested overclocking to %d\n", - intel_gpu_freq(rps, val)); - - rps->max_freq_softlimit = val; - - val = clamp_t(int, rps->cur_freq, - rps->min_freq_softlimit, - rps->max_freq_softlimit); - - /* - * We still need *_set_rps to process the new max_delay and - * update the interrupt limits and PMINTRMSK even though - * frequency request may be unchanged. - */ - intel_rps_set(rps, val); - -unlock: - mutex_unlock(&rps->lock); + ret = intel_rps_set_max_frequency(rps, val); return ret ?: count; } @@ -380,9 +354,10 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) { struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); - struct intel_rps *rps = &dev_priv->gt.rps; + struct intel_gt *gt = &dev_priv->gt; + struct intel_rps *rps = >->rps; - return sysfs_emit(buf, "%d\n", intel_gpu_freq(rps, rps->min_freq_softlimit)); + return sysfs_emit(buf, "%d\n", intel_rps_get_min_frequency(rps)); } static ssize_t gt_min_freq_mhz_store(struct device *kdev, @@ -398,31 +373,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev, if (ret) return ret; - mutex_lock(&rps->lock); - - val = intel_freq_opcode(rps, val); - if (val < rps->min_freq || - val > rps->max_freq || - val > rps->max_freq_softlimit) { - ret = -EINVAL; - goto unlock; - } - - rps->min_freq_softlimit = val; - - val = clamp_t(int, rps->cur_freq, - rps->min_freq_softlimit, - rps->max_freq_softlimit); - - /* - * We still need *_set_rps to process the new min_delay and - * update the interrupt limits and PMINTRMSK even though - * frequency request may be unchanged. - */ - intel_rps_set(rps, val); - -unlock: - mutex_unlock(&rps->lock); + ret = intel_rps_set_min_frequency(rps, val); return ret ?: count; }