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(&rps->lock);
+       if (val != rps->boost_freq) {
+               rps->boost_freq = val;
+               boost = atomic_read(&rps->num_waiters);
+       }
+       mutex_unlock(&rps->lock);
+       if (boost)
+               schedule_work(&rps->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;
 
 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);
 
        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(&slpc->lock);
+
+       if (slpc->boost_freq != val) {
+               /* Apply only if there are active waiters */
+               if (atomic_read(&slpc->num_waiters)) {
+                       ret = slpc_force_min_freq(slpc, val);
+                       if (ret) {
+                               ret = -EIO;
+                               goto done;
+                       }
+               }
+
+               slpc->boost_freq = val;
+       }
+
+done:
+       mutex_unlock(&slpc->lock);
+       return ret;
+}
+
 void intel_guc_slpc_dec_waiters(struct intel_guc_slpc *slpc)
 {
        /*
                                   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);
                }
        }
 
 
 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);
 
        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->boost_freq));
+       return sysfs_emit(buf, "%d\n", intel_rps_get_boost_frequency(rps));
 }
 
 static ssize_t gt_boost_freq_mhz_store(struct device *kdev,
 {
        struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
        struct intel_rps *rps = &dev_priv->gt.rps;
-       bool boost = false;
        ssize_t ret;
        u32 val;
 
        if (ret)
                return ret;
 
-       /* Validate against (static) hardware limits */
-       val = intel_freq_opcode(rps, val);
-       if (val < rps->min_freq || val > rps->max_freq)
-               return -EINVAL;
-
-       mutex_lock(&rps->lock);
-       if (val != rps->boost_freq) {
-               rps->boost_freq = val;
-               boost = atomic_read(&rps->num_waiters);
-       }
-       mutex_unlock(&rps->lock);
-       if (boost)
-               schedule_work(&rps->work);
+       ret = intel_rps_set_boost_frequency(rps, val);
 
-       return count;
+       return ret ?: count;
 }
 
 static ssize_t vlv_rpe_freq_mhz_show(struct device *kdev,