Re: [Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-11-03 Thread Dixit, Ashutosh
On Mon, 01 Nov 2021 18:26:08 -0700, Vinay Belgaumkar wrote:
>
> Add a helper to sort through the SLPC/RPS paths of get/set methods.
> Boost frequency will be modified as long as it is within the constraints
> of RP0 and if it is different from the existing one. We will set min
> freq to boost only if there is at least one active waiter.
>
> v2: Add num_boosts to guc_slpc_info and changes for worker function
> v3: Review comments (Ashutosh)

Reviewed-by: Ashutosh Dixit 


Re: [Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-11-03 Thread Dixit, Ashutosh
On Mon, 01 Nov 2021 13:28:14 -0700, Dixit, Ashutosh wrote:
>
> On Sun, 31 Oct 2021 21:39:37 -0700, Belgaumkar, Vinay wrote:
> >
> > +static int set_boost_freq(struct intel_rps *rps, u32 val)
>
> Since this is legacy rps code path maybe change function name to
> rps_set_boost_freq?

Not being able to find v3 of this patch so giving a R-b on v2 but the R-b
applies to v3:

Reviewed-by: Ashutosh Dixit 


[Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-11-01 Thread Vinay Belgaumkar
Add a helper to sort through the SLPC/RPS paths of get/set methods.
Boost frequency will be modified as long as it is within the constraints
of RP0 and if it is different from the existing one. We will set min
freq to boost only if there is at least one active waiter.

v2: Add num_boosts to guc_slpc_info and changes for worker function
v3: Review comments (Ashutosh)

Cc: Ashutosh Dixit 
Signed-off-by: Vinay Belgaumkar 
---
 drivers/gpu/drm/i915/gt/intel_rps.c | 47 +
 drivers/gpu/drm/i915/gt/intel_rps.h |  2 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c | 29 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h |  1 +
 drivers/gpu/drm/i915/i915_sysfs.c   | 19 ++---
 5 files changed, 82 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c 
b/drivers/gpu/drm/i915/gt/intel_rps.c
index 6f310c9d9765..07ff7ba7b2b7 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -936,6 +936,53 @@ void intel_rps_park(struct intel_rps *rps)
GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq);
 }
 
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps)
+{
+   struct intel_guc_slpc *slpc;
+
+   if (rps_uses_slpc(rps)) {
+   slpc = rps_to_slpc(rps);
+
+   return slpc->boost_freq;
+   } else {
+   return intel_gpu_freq(rps, rps->boost_freq);
+   }
+}
+
+static int rps_set_boost_freq(struct intel_rps *rps, u32 val)
+{
+   bool boost = false;
+
+   /* Validate against (static) hardware limits */
+   val = intel_freq_opcode(rps, val);
+   if (val < rps->min_freq || val > rps->max_freq)
+   return -EINVAL;
+
+   mutex_lock(>lock);
+   if (val != rps->boost_freq) {
+   rps->boost_freq = val;
+   boost = atomic_read(>num_waiters);
+   }
+   mutex_unlock(>lock);
+   if (boost)
+   schedule_work(>work);
+
+   return 0;
+}
+
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq)
+{
+   struct intel_guc_slpc *slpc;
+
+   if (rps_uses_slpc(rps)) {
+   slpc = rps_to_slpc(rps);
+
+   return intel_guc_slpc_set_boost_freq(slpc, freq);
+   } else {
+   return rps_set_boost_freq(rps, freq);
+   }
+}
+
 void intel_rps_dec_waiters(struct intel_rps *rps)
 {
struct intel_guc_slpc *slpc;
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h 
b/drivers/gpu/drm/i915/gt/intel_rps.h
index 407e878d5006..aee12f37d38a 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.h
+++ b/drivers/gpu/drm/i915/gt/intel_rps.h
@@ -24,6 +24,8 @@ void intel_rps_park(struct intel_rps *rps);
 void intel_rps_unpark(struct intel_rps *rps);
 void intel_rps_boost(struct i915_request *rq);
 void intel_rps_dec_waiters(struct intel_rps *rps);
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps);
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq);
 
 int intel_rps_set(struct intel_rps *rps, u8 val);
 void intel_rps_mark_interactive(struct intel_rps *rps, bool interactive);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
index db418396a145..4e1d3cd29164 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
@@ -650,6 +650,33 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc)
return 0;
 }
 
+int intel_guc_slpc_set_boost_freq(struct intel_guc_slpc *slpc, u32 val)
+{
+   int ret = 0;
+
+   if (val < slpc->min_freq || val > slpc->rp0_freq)
+   return -EINVAL;
+
+   mutex_lock(>lock);
+
+   if (slpc->boost_freq != val) {
+   /* Apply only if there are active waiters */
+   if (atomic_read(>num_waiters)) {
+   ret = slpc_force_min_freq(slpc, val);
+   if (ret) {
+   ret = -EIO;
+   goto done;
+   }
+   }
+
+   slpc->boost_freq = val;
+   }
+
+done:
+   mutex_unlock(>lock);
+   return ret;
+}
+
 void intel_guc_slpc_dec_waiters(struct intel_guc_slpc *slpc)
 {
/*
@@ -687,6 +714,8 @@ int intel_guc_slpc_print_info(struct intel_guc_slpc *slpc, 
struct drm_printer *p
   slpc_decode_max_freq(slpc));
drm_printf(p, "\tMin freq: %u MHz\n",
   slpc_decode_min_freq(slpc));
+   drm_printf(p, "\twaitboosts: %u\n",
+  slpc->num_boosts);
}
}
 
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
index d74d6d749bdc..0caa8fee3c04 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
@@ -34,6 +34,7 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc);
 void 

Re: [Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-11-01 Thread Dixit, Ashutosh
On Sun, 31 Oct 2021 21:39:37 -0700, Belgaumkar, Vinay wrote:
>
> +static int set_boost_freq(struct intel_rps *rps, u32 val)

Since this is legacy rps code path maybe change function name to 
rps_set_boost_freq?


[Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-10-31 Thread Vinay Belgaumkar
Add a helper to sort through the SLPC/RPS paths of get/set methods.
Boost frequency will be modified as long as it is within the constraints
of RP0 and if it is different from the existing one. We will set min
freq to boost only if there is at least one active waiter.

v2: Add num_boosts to guc_slpc_info and changes for worker function

Cc: Ashutosh Dixit 
Signed-off-by: Vinay Belgaumkar 
---
 drivers/gpu/drm/i915/gt/intel_rps.c | 47 +
 drivers/gpu/drm/i915/gt/intel_rps.h |  2 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c | 29 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h |  1 +
 drivers/gpu/drm/i915/i915_sysfs.c   | 19 ++---
 5 files changed, 82 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c 
b/drivers/gpu/drm/i915/gt/intel_rps.c
index b2d5b1747086..21f60fba864f 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -936,6 +936,53 @@ void intel_rps_park(struct intel_rps *rps)
GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq);
 }
 
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps)
+{
+   struct intel_guc_slpc *slpc;
+
+   if (rps_uses_slpc(rps)) {
+   slpc = rps_to_slpc(rps);
+
+   return slpc->boost_freq;
+   } else {
+   return intel_gpu_freq(rps, rps->boost_freq);
+   }
+}
+
+static int set_boost_freq(struct intel_rps *rps, u32 val)
+{
+   bool boost = false;
+
+   /* Validate against (static) hardware limits */
+   val = intel_freq_opcode(rps, val);
+   if (val < rps->min_freq || val > rps->max_freq)
+   return -EINVAL;
+
+   mutex_lock(>lock);
+   if (val != rps->boost_freq) {
+   rps->boost_freq = val;
+   boost = atomic_read(>num_waiters);
+   }
+   mutex_unlock(>lock);
+   if (boost)
+   schedule_work(>work);
+
+   return 0;
+}
+
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq)
+{
+   struct intel_guc_slpc *slpc;
+
+   if (rps_uses_slpc(rps)) {
+   slpc = rps_to_slpc(rps);
+
+   return intel_guc_slpc_set_boost_freq(slpc, freq);
+   } else {
+   return set_boost_freq(rps, freq);
+   }
+}
+
 void intel_rps_dec_waiters(struct intel_rps *rps)
 {
struct intel_guc_slpc *slpc;
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h 
b/drivers/gpu/drm/i915/gt/intel_rps.h
index 407e878d5006..aee12f37d38a 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.h
+++ b/drivers/gpu/drm/i915/gt/intel_rps.h
@@ -24,6 +24,8 @@ void intel_rps_park(struct intel_rps *rps);
 void intel_rps_unpark(struct intel_rps *rps);
 void intel_rps_boost(struct i915_request *rq);
 void intel_rps_dec_waiters(struct intel_rps *rps);
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps);
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq);
 
 int intel_rps_set(struct intel_rps *rps, u8 val);
 void intel_rps_mark_interactive(struct intel_rps *rps, bool interactive);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
index 65da454b6693..285133ae47b0 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
@@ -649,6 +649,33 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc)
return 0;
 }
 
+int intel_guc_slpc_set_boost_freq(struct intel_guc_slpc *slpc, u32 val)
+{
+   int ret = 0;
+
+   if (val < slpc->min_freq || val > slpc->rp0_freq)
+   return -EINVAL;
+
+   mutex_lock(>lock);
+
+   if (slpc->boost_freq != val) {
+   /* Apply only if there are active waiters */
+   if (atomic_read(>num_waiters)) {
+   ret = slpc_force_min_freq(slpc, val);
+   if (ret) {
+   ret = -EIO;
+   goto done;
+   }
+   }
+
+   slpc->boost_freq = val;
+   }
+
+done:
+   mutex_unlock(>lock);
+   return ret;
+}
+
 void intel_guc_slpc_dec_waiters(struct intel_guc_slpc *slpc)
 {
/* Return min back to the softlimit.
@@ -685,6 +712,8 @@ int intel_guc_slpc_print_info(struct intel_guc_slpc *slpc, 
struct drm_printer *p
   slpc_decode_max_freq(slpc));
drm_printf(p, "\tMin freq: %u MHz\n",
   slpc_decode_min_freq(slpc));
+   drm_printf(p, "\twaitboosts: %u\n",
+  slpc->num_boosts);
}
}
 
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
index d74d6d749bdc..0caa8fee3c04 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
@@ -34,6 +34,7 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc);
 void 

Re: [Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-10-21 Thread Nilawar, Badal

Please fix code style related warnings and errors from checkpatch result.

On 21-10-2021 01:22, Vinay Belgaumkar wrote:

Add a helper to sort through the SLPC/RPS cases of get/set methods.
Boost frequency will be modified as long as it is within the constraints
of RP0 and if it is different from the existing one. We will set min
freq to boost only if there is an active waiter.

Signed-off-by: Vinay Belgaumkar 
---
  drivers/gpu/drm/i915/gt/intel_rps.c | 44 +
  drivers/gpu/drm/i915/gt/intel_rps.h |  2 +
  drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c | 18 +
  drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h |  1 +
  drivers/gpu/drm/i915/i915_sysfs.c   | 21 ++
  5 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c 
b/drivers/gpu/drm/i915/gt/intel_rps.c
index 023e9c0b9f4a..19c57aac9553 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -935,6 +935,50 @@ void intel_rps_park(struct intel_rps *rps)
GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq);
  }
  
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps)

+{
+   struct intel_guc_slpc *slpc = rps_to_slpc(rps);
+
+   if (rps_uses_slpc(rps))
+   return slpc->boost_freq;
+   else
+   return intel_gpu_freq(rps, rps->boost_freq);
+}
+
+static int set_boost_freq(struct intel_rps *rps, u32 val)
+{
+   bool boost = false;
+
+   /* Validate against (static) hardware limits */
+   val = intel_freq_opcode(rps, val);
+   if (val < rps->min_freq || val > rps->max_freq)
+   return -EINVAL;
+
+   mutex_lock(>lock);
+   if (val != rps->boost_freq) {
+   rps->boost_freq = val;
+   boost = atomic_read(>num_waiters);
+   }
+   mutex_unlock(>lock);
+   if (boost)
+   schedule_work(>work);
+
+   return 0;
+}
+
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq)
+{
+   struct intel_guc_slpc *slpc;
+
+   if (rps_uses_slpc(rps)) {
+   slpc = rps_to_slpc(rps);
+
+   return intel_guc_slpc_set_boost_freq(slpc, freq);
+   } else {
+   return set_boost_freq(rps, freq);
+   }
+}
+
  void intel_rps_update_waiters(struct intel_rps *rps)
  {
struct intel_guc_slpc *slpc = rps_to_slpc(rps);
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h 
b/drivers/gpu/drm/i915/gt/intel_rps.h
index 4ca9924cb5ed..ce81094cf58e 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.h
+++ b/drivers/gpu/drm/i915/gt/intel_rps.h
@@ -24,6 +24,8 @@ void intel_rps_park(struct intel_rps *rps);
  void intel_rps_unpark(struct intel_rps *rps);
  void intel_rps_boost(struct i915_request *rq);
  void intel_rps_update_waiters(struct intel_rps *rps);
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps);
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq);
  
  int intel_rps_set(struct intel_rps *rps, u8 val);

  void intel_rps_mark_interactive(struct intel_rps *rps, bool interactive);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
index a104371a8b79..7881bc1a5af8 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
@@ -613,6 +613,24 @@ void intel_guc_slpc_boost(struct intel_guc_slpc *slpc)
slpc->num_waiters++;
  }
  
+int intel_guc_slpc_set_boost_freq(struct intel_guc_slpc *slpc, u32 val)

+{
+   if (val < slpc->min_freq || val > slpc->rp0_freq)
+   return -EINVAL;
+
+   if (val != slpc->boost_freq) {
+   slpc->boost_freq = val;
+
+   /* Apply only if there are active waiters */
+   if (slpc->num_waiters)
+   return slpc_set_param(slpc,
+ 
SLPC_PARAM_GLOBAL_MIN_GT_UNSLICE_FREQ_MHZ,
+ slpc->boost_freq);


As per comments from some other ML wakeref may be needed here.

CC: jon.ew...@intel.com, ashutosh.di...@intel.com


+   }
+
+   return 0;
+}
+
  void intel_guc_slpc_update_waiters(struct intel_guc_slpc *slpc)
  {
/* Return min back to the softlimit.
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
index 25093dfdea0b..d8191f2b965b 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
@@ -34,6 +34,7 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc);
  void intel_guc_slpc_fini(struct intel_guc_slpc *slpc);
  int intel_guc_slpc_set_max_freq(struct intel_guc_slpc *slpc, u32 val);
  int intel_guc_slpc_set_min_freq(struct intel_guc_slpc *slpc, u32 val);
+int intel_guc_slpc_set_boost_freq(struct intel_guc_slpc *slpc, u32 val);
  int intel_guc_slpc_get_max_freq(struct intel_guc_slpc *slpc, u32 *val);
  int intel_guc_slpc_get_min_freq(struct intel_guc_slpc *slpc, 

[Intel-gfx] [PATCH 3/3] drm/i915/guc/slpc: Update boost sysfs hooks for SLPC

2021-10-20 Thread Vinay Belgaumkar
Add a helper to sort through the SLPC/RPS cases of get/set methods.
Boost frequency will be modified as long as it is within the constraints
of RP0 and if it is different from the existing one. We will set min
freq to boost only if there is an active waiter.

Signed-off-by: Vinay Belgaumkar 
---
 drivers/gpu/drm/i915/gt/intel_rps.c | 44 +
 drivers/gpu/drm/i915/gt/intel_rps.h |  2 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c | 18 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h |  1 +
 drivers/gpu/drm/i915/i915_sysfs.c   | 21 ++
 5 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c 
b/drivers/gpu/drm/i915/gt/intel_rps.c
index 023e9c0b9f4a..19c57aac9553 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -935,6 +935,50 @@ void intel_rps_park(struct intel_rps *rps)
GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq);
 }
 
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps)
+{
+   struct intel_guc_slpc *slpc = rps_to_slpc(rps);
+
+   if (rps_uses_slpc(rps))
+   return slpc->boost_freq;
+   else
+   return intel_gpu_freq(rps, rps->boost_freq);
+}
+
+static int set_boost_freq(struct intel_rps *rps, u32 val)
+{
+   bool boost = false;
+
+   /* Validate against (static) hardware limits */
+   val = intel_freq_opcode(rps, val);
+   if (val < rps->min_freq || val > rps->max_freq)
+   return -EINVAL;
+
+   mutex_lock(>lock);
+   if (val != rps->boost_freq) {
+   rps->boost_freq = val;
+   boost = atomic_read(>num_waiters);
+   }
+   mutex_unlock(>lock);
+   if (boost)
+   schedule_work(>work);
+
+   return 0;
+}
+
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq)
+{
+   struct intel_guc_slpc *slpc;
+
+   if (rps_uses_slpc(rps)) {
+   slpc = rps_to_slpc(rps);
+
+   return intel_guc_slpc_set_boost_freq(slpc, freq);
+   } else {
+   return set_boost_freq(rps, freq);
+   }
+}
+
 void intel_rps_update_waiters(struct intel_rps *rps)
 {
struct intel_guc_slpc *slpc = rps_to_slpc(rps);
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h 
b/drivers/gpu/drm/i915/gt/intel_rps.h
index 4ca9924cb5ed..ce81094cf58e 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.h
+++ b/drivers/gpu/drm/i915/gt/intel_rps.h
@@ -24,6 +24,8 @@ void intel_rps_park(struct intel_rps *rps);
 void intel_rps_unpark(struct intel_rps *rps);
 void intel_rps_boost(struct i915_request *rq);
 void intel_rps_update_waiters(struct intel_rps *rps);
+u32 intel_rps_get_boost_frequency(struct intel_rps *rps);
+int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq);
 
 int intel_rps_set(struct intel_rps *rps, u8 val);
 void intel_rps_mark_interactive(struct intel_rps *rps, bool interactive);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
index a104371a8b79..7881bc1a5af8 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c
@@ -613,6 +613,24 @@ void intel_guc_slpc_boost(struct intel_guc_slpc *slpc)
slpc->num_waiters++;
 }
 
+int intel_guc_slpc_set_boost_freq(struct intel_guc_slpc *slpc, u32 val)
+{
+   if (val < slpc->min_freq || val > slpc->rp0_freq)
+   return -EINVAL;
+
+   if (val != slpc->boost_freq) {
+   slpc->boost_freq = val;
+
+   /* Apply only if there are active waiters */
+   if (slpc->num_waiters)
+   return slpc_set_param(slpc,
+ 
SLPC_PARAM_GLOBAL_MIN_GT_UNSLICE_FREQ_MHZ,
+ slpc->boost_freq);
+   }
+
+   return 0;
+}
+
 void intel_guc_slpc_update_waiters(struct intel_guc_slpc *slpc)
 {
/* Return min back to the softlimit.
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
index 25093dfdea0b..d8191f2b965b 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
@@ -34,6 +34,7 @@ int intel_guc_slpc_enable(struct intel_guc_slpc *slpc);
 void intel_guc_slpc_fini(struct intel_guc_slpc *slpc);
 int intel_guc_slpc_set_max_freq(struct intel_guc_slpc *slpc, u32 val);
 int intel_guc_slpc_set_min_freq(struct intel_guc_slpc *slpc, u32 val);
+int intel_guc_slpc_set_boost_freq(struct intel_guc_slpc *slpc, u32 val);
 int intel_guc_slpc_get_max_freq(struct intel_guc_slpc *slpc, u32 *val);
 int intel_guc_slpc_get_min_freq(struct intel_guc_slpc *slpc, u32 *val);
 int intel_guc_slpc_print_info(struct intel_guc_slpc *slpc, struct drm_printer 
*p);
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c 
b/drivers/gpu/drm/i915/i915_sysfs.c
index cdf0e9c6fd73..c62eb0c8eb45 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++