Commit 3e7abf81 authored by Andi Shyti's avatar Andi Shyti Committed by Chris Wilson

drm/i915: Extract GT render power state management

i915_irq.c is large. One reason for this is that has a large chunk of
the GT render power management stashed away in it. Extract that logic
out of i915_irq.c and intel_pm.c and put it under one roof.

Based on a patch by Chris Wilson.
Signed-off-by: default avatarAndi Shyti <andi.shyti@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191024211642.7688-1-chris@chris-wilson.co.uk
parent 35865aef
...@@ -95,6 +95,7 @@ gt-y += \ ...@@ -95,6 +95,7 @@ gt-y += \
gt/intel_reset.o \ gt/intel_reset.o \
gt/intel_ring.o \ gt/intel_ring.o \
gt/intel_ring_submission.o \ gt/intel_ring_submission.o \
gt/intel_rps.o \
gt/intel_sseu.o \ gt/intel_sseu.o \
gt/intel_timeline.o \ gt/intel_timeline.o \
gt/intel_workarounds.o gt/intel_workarounds.o
......
...@@ -55,6 +55,8 @@ ...@@ -55,6 +55,8 @@
#include "display/intel_tv.h" #include "display/intel_tv.h"
#include "display/intel_vdsc.h" #include "display/intel_vdsc.h"
#include "gt/intel_rps.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_trace.h" #include "i915_trace.h"
#include "intel_acpi.h" #include "intel_acpi.h"
...@@ -14944,7 +14946,7 @@ static int do_rps_boost(struct wait_queue_entry *_wait, ...@@ -14944,7 +14946,7 @@ static int do_rps_boost(struct wait_queue_entry *_wait,
* vblank without our intervention, so leave RPS alone. * vblank without our intervention, so leave RPS alone.
*/ */
if (!i915_request_started(rq)) if (!i915_request_started(rq))
gen6_rps_boost(rq); intel_rps_boost(rq);
i915_request_put(rq); i915_request_put(rq);
drm_crtc_vblank_put(wait->crtc); drm_crtc_vblank_put(wait->crtc);
...@@ -15138,7 +15140,7 @@ intel_prepare_plane_fb(struct drm_plane *plane, ...@@ -15138,7 +15140,7 @@ intel_prepare_plane_fb(struct drm_plane *plane,
* maximum clocks following a vblank miss (see do_rps_boost()). * maximum clocks following a vblank miss (see do_rps_boost()).
*/ */
if (!intel_state->rps_interactive) { if (!intel_state->rps_interactive) {
intel_rps_mark_interactive(dev_priv, true); intel_rps_mark_interactive(&dev_priv->gt.rps, true);
intel_state->rps_interactive = true; intel_state->rps_interactive = true;
} }
...@@ -15163,7 +15165,7 @@ intel_cleanup_plane_fb(struct drm_plane *plane, ...@@ -15163,7 +15165,7 @@ intel_cleanup_plane_fb(struct drm_plane *plane,
struct drm_i915_private *dev_priv = to_i915(plane->dev); struct drm_i915_private *dev_priv = to_i915(plane->dev);
if (intel_state->rps_interactive) { if (intel_state->rps_interactive) {
intel_rps_mark_interactive(dev_priv, false); intel_rps_mark_interactive(&dev_priv->gt.rps, false);
intel_state->rps_interactive = false; intel_state->rps_interactive = false;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "intel_gt_requests.h" #include "intel_gt_requests.h"
#include "intel_mocs.h" #include "intel_mocs.h"
#include "intel_rc6.h" #include "intel_rc6.h"
#include "intel_rps.h"
#include "intel_uncore.h" #include "intel_uncore.h"
#include "intel_pm.h" #include "intel_pm.h"
...@@ -31,9 +32,6 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915) ...@@ -31,9 +32,6 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
void intel_gt_init_hw_early(struct drm_i915_private *i915) void intel_gt_init_hw_early(struct drm_i915_private *i915)
{ {
i915->gt.ggtt = &i915->ggtt; i915->gt.ggtt = &i915->ggtt;
/* BIOS often leaves RC6 enabled, but disable it for hw init */
intel_gt_pm_disable(&i915->gt);
} }
static void init_unused_ring(struct intel_gt *gt, u32 base) static void init_unused_ring(struct intel_gt *gt, u32 base)
...@@ -320,8 +318,7 @@ void intel_gt_chipset_flush(struct intel_gt *gt) ...@@ -320,8 +318,7 @@ void intel_gt_chipset_flush(struct intel_gt *gt)
void intel_gt_driver_register(struct intel_gt *gt) void intel_gt_driver_register(struct intel_gt *gt)
{ {
if (IS_GEN(gt->i915, 5)) intel_rps_driver_register(&gt->rps);
intel_gpu_ips_init(gt->i915);
} }
static int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size) static int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size)
...@@ -379,20 +376,16 @@ int intel_gt_init(struct intel_gt *gt) ...@@ -379,20 +376,16 @@ int intel_gt_init(struct intel_gt *gt)
void intel_gt_driver_remove(struct intel_gt *gt) void intel_gt_driver_remove(struct intel_gt *gt)
{ {
GEM_BUG_ON(gt->awake); GEM_BUG_ON(gt->awake);
intel_gt_pm_disable(gt);
} }
void intel_gt_driver_unregister(struct intel_gt *gt) void intel_gt_driver_unregister(struct intel_gt *gt)
{ {
intel_gpu_ips_teardown(); intel_rps_driver_unregister(&gt->rps);
} }
void intel_gt_driver_release(struct intel_gt *gt) void intel_gt_driver_release(struct intel_gt *gt)
{ {
/* Paranoia: make sure we have disabled everything before we exit. */
intel_gt_pm_disable(gt);
intel_gt_pm_fini(gt); intel_gt_pm_fini(gt);
intel_gt_fini_scratch(gt); intel_gt_fini_scratch(gt);
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "intel_gt.h" #include "intel_gt.h"
#include "intel_gt_irq.h" #include "intel_gt_irq.h"
#include "intel_uncore.h" #include "intel_uncore.h"
#include "intel_rps.h"
static void guc_irq_handler(struct intel_guc *guc, u16 iir) static void guc_irq_handler(struct intel_guc *guc, u16 iir)
{ {
...@@ -77,7 +78,7 @@ gen11_other_irq_handler(struct intel_gt *gt, const u8 instance, ...@@ -77,7 +78,7 @@ gen11_other_irq_handler(struct intel_gt *gt, const u8 instance,
return guc_irq_handler(&gt->uc.guc, iir); return guc_irq_handler(&gt->uc.guc, iir);
if (instance == OTHER_GTPM_INSTANCE) if (instance == OTHER_GTPM_INSTANCE)
return gen11_rps_irq_handler(gt, iir); return gen11_rps_irq_handler(&gt->rps, iir);
WARN_ONCE(1, "unhandled other interrupt instance=0x%x, iir=0x%x\n", WARN_ONCE(1, "unhandled other interrupt instance=0x%x, iir=0x%x\n",
instance, iir); instance, iir);
...@@ -336,7 +337,7 @@ void gen8_gt_irq_handler(struct intel_gt *gt, u32 master_ctl, u32 gt_iir[4]) ...@@ -336,7 +337,7 @@ void gen8_gt_irq_handler(struct intel_gt *gt, u32 master_ctl, u32 gt_iir[4])
} }
if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) { if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
gen6_rps_irq_handler(gt->i915, gt_iir[2]); gen6_rps_irq_handler(&gt->rps, gt_iir[2]);
guc_irq_handler(&gt->uc.guc, gt_iir[2] >> 16); guc_irq_handler(&gt->uc.guc, gt_iir[2] >> 16);
} }
} }
......
...@@ -12,8 +12,10 @@ ...@@ -12,8 +12,10 @@
#include "intel_gt.h" #include "intel_gt.h"
#include "intel_gt_pm.h" #include "intel_gt_pm.h"
#include "intel_gt_requests.h" #include "intel_gt_requests.h"
#include "intel_llc.h"
#include "intel_pm.h" #include "intel_pm.h"
#include "intel_rc6.h" #include "intel_rc6.h"
#include "intel_rps.h"
#include "intel_wakeref.h" #include "intel_wakeref.h"
static int __gt_unpark(struct intel_wakeref *wf) static int __gt_unpark(struct intel_wakeref *wf)
...@@ -39,12 +41,7 @@ static int __gt_unpark(struct intel_wakeref *wf) ...@@ -39,12 +41,7 @@ static int __gt_unpark(struct intel_wakeref *wf)
gt->awake = intel_display_power_get(i915, POWER_DOMAIN_GT_IRQ); gt->awake = intel_display_power_get(i915, POWER_DOMAIN_GT_IRQ);
GEM_BUG_ON(!gt->awake); GEM_BUG_ON(!gt->awake);
intel_enable_gt_powersave(i915); intel_rps_unpark(&gt->rps);
i915_update_gfx_val(i915);
if (INTEL_GEN(i915) >= 6)
gen6_rps_busy(i915);
i915_pmu_gt_unparked(i915); i915_pmu_gt_unparked(i915);
intel_gt_unpark_requests(gt); intel_gt_unpark_requests(gt);
...@@ -64,8 +61,7 @@ static int __gt_park(struct intel_wakeref *wf) ...@@ -64,8 +61,7 @@ static int __gt_park(struct intel_wakeref *wf)
i915_vma_parked(gt); i915_vma_parked(gt);
i915_pmu_gt_parked(i915); i915_pmu_gt_parked(i915);
if (INTEL_GEN(i915) >= 6) intel_rps_park(&gt->rps);
gen6_rps_idle(i915);
/* Everything switched off, flush any residual interrupt just in case */ /* Everything switched off, flush any residual interrupt just in case */
intel_synchronize_irq(i915); intel_synchronize_irq(i915);
...@@ -97,6 +93,7 @@ void intel_gt_pm_init(struct intel_gt *gt) ...@@ -97,6 +93,7 @@ void intel_gt_pm_init(struct intel_gt *gt)
* user. * user.
*/ */
intel_rc6_init(&gt->rc6); intel_rc6_init(&gt->rc6);
intel_rps_init(&gt->rps);
} }
static bool reset_engines(struct intel_gt *gt) static bool reset_engines(struct intel_gt *gt)
...@@ -140,12 +137,6 @@ void intel_gt_sanitize(struct intel_gt *gt, bool force) ...@@ -140,12 +137,6 @@ void intel_gt_sanitize(struct intel_gt *gt, bool force)
engine->reset.finish(engine); engine->reset.finish(engine);
} }
void intel_gt_pm_disable(struct intel_gt *gt)
{
if (!is_mock_gt(gt))
intel_sanitize_gt_powersave(gt->i915);
}
void intel_gt_pm_fini(struct intel_gt *gt) void intel_gt_pm_fini(struct intel_gt *gt)
{ {
intel_rc6_fini(&gt->rc6); intel_rc6_fini(&gt->rc6);
...@@ -164,9 +155,13 @@ int intel_gt_resume(struct intel_gt *gt) ...@@ -164,9 +155,13 @@ int intel_gt_resume(struct intel_gt *gt)
* allowing us to fixup the user contexts on their first pin. * allowing us to fixup the user contexts on their first pin.
*/ */
intel_gt_pm_get(gt); intel_gt_pm_get(gt);
intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL); intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL);
intel_rc6_sanitize(&gt->rc6); intel_rc6_sanitize(&gt->rc6);
intel_rps_enable(&gt->rps);
intel_llc_enable(&gt->llc);
for_each_engine(engine, gt, id) { for_each_engine(engine, gt, id) {
struct intel_context *ce; struct intel_context *ce;
...@@ -217,8 +212,11 @@ void intel_gt_suspend(struct intel_gt *gt) ...@@ -217,8 +212,11 @@ void intel_gt_suspend(struct intel_gt *gt)
/* We expect to be idle already; but also want to be independent */ /* We expect to be idle already; but also want to be independent */
wait_for_idle(gt); wait_for_idle(gt);
with_intel_runtime_pm(gt->uncore->rpm, wakeref) with_intel_runtime_pm(gt->uncore->rpm, wakeref) {
intel_rps_disable(&gt->rps);
intel_rc6_disable(&gt->rc6); intel_rc6_disable(&gt->rc6);
intel_llc_disable(&gt->llc);
}
} }
void intel_gt_runtime_suspend(struct intel_gt *gt) void intel_gt_runtime_suspend(struct intel_gt *gt)
......
...@@ -39,7 +39,6 @@ static inline int intel_gt_pm_wait_for_idle(struct intel_gt *gt) ...@@ -39,7 +39,6 @@ static inline int intel_gt_pm_wait_for_idle(struct intel_gt *gt)
void intel_gt_pm_init_early(struct intel_gt *gt); void intel_gt_pm_init_early(struct intel_gt *gt);
void intel_gt_pm_init(struct intel_gt *gt); void intel_gt_pm_init(struct intel_gt *gt);
void intel_gt_pm_disable(struct intel_gt *gt);
void intel_gt_pm_fini(struct intel_gt *gt); void intel_gt_pm_fini(struct intel_gt *gt);
void intel_gt_sanitize(struct intel_gt *gt, bool force); void intel_gt_sanitize(struct intel_gt *gt, bool force);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "intel_llc_types.h" #include "intel_llc_types.h"
#include "intel_reset_types.h" #include "intel_reset_types.h"
#include "intel_rc6_types.h" #include "intel_rc6_types.h"
#include "intel_rps_types.h"
#include "intel_wakeref.h" #include "intel_wakeref.h"
struct drm_i915_private; struct drm_i915_private;
...@@ -73,6 +74,7 @@ struct intel_gt { ...@@ -73,6 +74,7 @@ struct intel_gt {
struct intel_llc llc; struct intel_llc llc;
struct intel_rc6 rc6; struct intel_rc6 rc6;
struct intel_rps rps;
ktime_t last_init_time; ktime_t last_init_time;
......
...@@ -48,7 +48,7 @@ static bool get_ia_constants(struct intel_llc *llc, ...@@ -48,7 +48,7 @@ static bool get_ia_constants(struct intel_llc *llc,
struct ia_constants *consts) struct ia_constants *consts)
{ {
struct drm_i915_private *i915 = llc_to_gt(llc)->i915; struct drm_i915_private *i915 = llc_to_gt(llc)->i915;
struct intel_rps *rps = &i915->gt_pm.rps; struct intel_rps *rps = &llc_to_gt(llc)->rps;
if (rps->max_freq <= rps->min_freq) if (rps->max_freq <= rps->min_freq)
return false; return false;
......
This diff is collapsed.
/*
* SPDX-License-Identifier: MIT
*
* Copyright © 2019 Intel Corporation
*/
#ifndef INTEL_RPS_H
#define INTEL_RPS_H
#include "intel_rps_types.h"
struct i915_request;
void intel_rps_init(struct intel_rps *rps);
void intel_rps_driver_register(struct intel_rps *rps);
void intel_rps_driver_unregister(struct intel_rps *rps);
void intel_rps_enable(struct intel_rps *rps);
void intel_rps_disable(struct intel_rps *rps);
void intel_rps_park(struct intel_rps *rps);
void intel_rps_unpark(struct intel_rps *rps);
void intel_rps_boost(struct i915_request *rq);
int intel_rps_set(struct intel_rps *rps, u8 val);
void intel_rps_mark_interactive(struct intel_rps *rps, bool interactive);
int intel_gpu_freq(struct intel_rps *rps, int val);
int intel_freq_opcode(struct intel_rps *rps, int val);
u32 intel_get_cagf(struct intel_rps *rps, u32 rpstat1);
void gen5_rps_irq_handler(struct intel_rps *rps);
void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir);
void gen11_rps_irq_handler(struct intel_rps *rps, u32 pm_iir);
#endif /* INTEL_RPS_H */
/*
* SPDX-License-Identifier: MIT
*
* Copyright © 2019 Intel Corporation
*/
#ifndef INTEL_RPS_TYPES_H
#define INTEL_RPS_TYPES_H
#include <linux/atomic.h>
#include <linux/ktime.h>
#include <linux/mutex.h>
#include <linux/types.h>
#include <linux/workqueue.h>
struct intel_ips {
u64 last_count1;
unsigned long last_time1;
unsigned long chipset_power;
u64 last_count2;
u64 last_time2;
unsigned long gfx_power;
u8 corr;
int c, m;
};
struct intel_rps_ei {
ktime_t ktime;
u32 render_c0;
u32 media_c0;
};
struct intel_rps {
struct mutex lock; /* protects enabling and the worker */
/*
* work, interrupts_enabled and pm_iir are protected by
* dev_priv->irq_lock
*/
struct work_struct work;
bool enabled;
bool active;
u32 pm_iir;
/* PM interrupt bits that should never be masked */
u32 pm_intrmsk_mbz;
u32 pm_events;
/* Frequencies are stored in potentially platform dependent multiples.
* In other words, *_freq needs to be multiplied by X to be interesting.
* Soft limits are those which are used for the dynamic reclocking done
* by the driver (raise frequencies under heavy loads, and lower for
* lighter loads). Hard limits are those imposed by the hardware.
*
* A distinction is made for overclocking, which is never enabled by
* default, and is considered to be above the hard limit if it's
* possible at all.
*/
u8 cur_freq; /* Current frequency (cached, may not == HW) */
u8 last_freq; /* Last SWREQ frequency */
u8 min_freq_softlimit; /* Minimum frequency permitted by the driver */
u8 max_freq_softlimit; /* Max frequency permitted by the driver */
u8 max_freq; /* Maximum frequency, RP0 if not overclocking */
u8 min_freq; /* AKA RPn. Minimum frequency */
u8 boost_freq; /* Frequency to request when wait boosting */
u8 idle_freq; /* Frequency to request when we are idle */
u8 efficient_freq; /* AKA RPe. Pre-determined balanced frequency */
u8 rp1_freq; /* "less than" RP0 power/freqency */
u8 rp0_freq; /* Non-overclocked max frequency. */
u16 gpll_ref_freq; /* vlv/chv GPLL reference frequency */
int last_adj;
struct {
struct mutex mutex;
enum { LOW_POWER, BETWEEN, HIGH_POWER } mode;
unsigned int interactive;
u8 up_threshold; /* Current %busy required to uplock */
u8 down_threshold; /* Current %busy required to downclock */
} power;
atomic_t num_waiters;
atomic_t boosts;
/* manual wa residency calculations */
struct intel_rps_ei ei;
struct intel_ips ips;
};
#endif /* INTEL_RPS_TYPES_H */
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "intel_pm.h" /* intel_gpu_freq() */ #include "intel_pm.h" /* intel_gpu_freq() */
#include "selftest_llc.h" #include "selftest_llc.h"
#include "intel_rps.h"
static int gen6_verify_ring_freq(struct intel_llc *llc) static int gen6_verify_ring_freq(struct intel_llc *llc)
{ {
...@@ -25,6 +26,8 @@ static int gen6_verify_ring_freq(struct intel_llc *llc) ...@@ -25,6 +26,8 @@ static int gen6_verify_ring_freq(struct intel_llc *llc)
for (gpu_freq = consts.min_gpu_freq; for (gpu_freq = consts.min_gpu_freq;
gpu_freq <= consts.max_gpu_freq; gpu_freq <= consts.max_gpu_freq;
gpu_freq++) { gpu_freq++) {
struct intel_rps *rps = &llc_to_gt(llc)->rps;
unsigned int ia_freq, ring_freq, found; unsigned int ia_freq, ring_freq, found;
u32 val; u32 val;
...@@ -44,7 +47,7 @@ static int gen6_verify_ring_freq(struct intel_llc *llc) ...@@ -44,7 +47,7 @@ static int gen6_verify_ring_freq(struct intel_llc *llc)
if (found != ia_freq) { if (found != ia_freq) {
pr_err("Min freq table(%d/[%d, %d]):%dMHz did not match expected CPU freq, found %d, expected %d\n", pr_err("Min freq table(%d/[%d, %d]):%dMHz did not match expected CPU freq, found %d, expected %d\n",
gpu_freq, consts.min_gpu_freq, consts.max_gpu_freq, gpu_freq, consts.min_gpu_freq, consts.max_gpu_freq,
intel_gpu_freq(i915, gpu_freq * (INTEL_GEN(i915) >= 9 ? GEN9_FREQ_SCALER : 1)), intel_gpu_freq(rps, gpu_freq * (INTEL_GEN(i915) >= 9 ? GEN9_FREQ_SCALER : 1)),
found, ia_freq); found, ia_freq);
err = -EINVAL; err = -EINVAL;
break; break;
...@@ -54,7 +57,7 @@ static int gen6_verify_ring_freq(struct intel_llc *llc) ...@@ -54,7 +57,7 @@ static int gen6_verify_ring_freq(struct intel_llc *llc)
if (found != ring_freq) { if (found != ring_freq) {
pr_err("Min freq table(%d/[%d, %d]):%dMHz did not match expected ring freq, found %d, expected %d\n", pr_err("Min freq table(%d/[%d, %d]):%dMHz did not match expected ring freq, found %d, expected %d\n",
gpu_freq, consts.min_gpu_freq, consts.max_gpu_freq, gpu_freq, consts.min_gpu_freq, consts.max_gpu_freq,
intel_gpu_freq(i915, gpu_freq * (INTEL_GEN(i915) >= 9 ? GEN9_FREQ_SCALER : 1)), intel_gpu_freq(rps, gpu_freq * (INTEL_GEN(i915) >= 9 ? GEN9_FREQ_SCALER : 1)),
found, ring_freq); found, ring_freq);
err = -EINVAL; err = -EINVAL;
break; break;
......
...@@ -1011,7 +1011,7 @@ void intel_guc_submission_fini(struct intel_guc *guc) ...@@ -1011,7 +1011,7 @@ void intel_guc_submission_fini(struct intel_guc *guc)
static void guc_interrupts_capture(struct intel_gt *gt) static void guc_interrupts_capture(struct intel_gt *gt)
{ {
struct intel_rps *rps = &gt->i915->gt_pm.rps; struct intel_rps *rps = &gt->rps;
struct intel_uncore *uncore = gt->uncore; struct intel_uncore *uncore = gt->uncore;
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id; enum intel_engine_id id;
...@@ -1057,7 +1057,7 @@ static void guc_interrupts_capture(struct intel_gt *gt) ...@@ -1057,7 +1057,7 @@ static void guc_interrupts_capture(struct intel_gt *gt)
static void guc_interrupts_release(struct intel_gt *gt) static void guc_interrupts_release(struct intel_gt *gt)
{ {
struct intel_rps *rps = &gt->i915->gt_pm.rps; struct intel_rps *rps = &gt->rps;
struct intel_uncore *uncore = gt->uncore; struct intel_uncore *uncore = gt->uncore;
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id; enum intel_engine_id id;
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "gt/intel_gt_requests.h" #include "gt/intel_gt_requests.h"
#include "gt/intel_reset.h" #include "gt/intel_reset.h"
#include "gt/intel_rc6.h" #include "gt/intel_rc6.h"
#include "gt/intel_rps.h"
#include "gt/uc/intel_guc_submission.h" #include "gt/uc/intel_guc_submission.h"
#include "i915_debugfs.h" #include "i915_debugfs.h"
...@@ -791,7 +792,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused) ...@@ -791,7 +792,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_uncore *uncore = &dev_priv->uncore; struct intel_uncore *uncore = &dev_priv->uncore;
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int ret = 0; int ret = 0;
...@@ -827,23 +828,23 @@ static int i915_frequency_info(struct seq_file *m, void *unused) ...@@ -827,23 +828,23 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
seq_printf(m, "DDR freq: %d MHz\n", dev_priv->mem_freq); seq_printf(m, "DDR freq: %d MHz\n", dev_priv->mem_freq);
seq_printf(m, "actual GPU freq: %d MHz\n", seq_printf(m, "actual GPU freq: %d MHz\n",
intel_gpu_freq(dev_priv, (freq_sts >> 8) & 0xff)); intel_gpu_freq(rps, (freq_sts >> 8) & 0xff));
seq_printf(m, "current GPU freq: %d MHz\n", seq_printf(m, "current GPU freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->cur_freq)); intel_gpu_freq(rps, rps->cur_freq));
seq_printf(m, "max GPU freq: %d MHz\n", seq_printf(m, "max GPU freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->max_freq)); intel_gpu_freq(rps, rps->max_freq));
seq_printf(m, "min GPU freq: %d MHz\n", seq_printf(m, "min GPU freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->min_freq)); intel_gpu_freq(rps, rps->min_freq));
seq_printf(m, "idle GPU freq: %d MHz\n", seq_printf(m, "idle GPU freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->idle_freq)); intel_gpu_freq(rps, rps->idle_freq));
seq_printf(m, seq_printf(m,
"efficient (RPe) frequency: %d MHz\n", "efficient (RPe) frequency: %d MHz\n",
intel_gpu_freq(dev_priv, rps->efficient_freq)); intel_gpu_freq(rps, rps->efficient_freq));
} else if (INTEL_GEN(dev_priv) >= 6) { } else if (INTEL_GEN(dev_priv) >= 6) {
u32 rp_state_limits; u32 rp_state_limits;
u32 gt_perf_status; u32 gt_perf_status;
...@@ -877,7 +878,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused) ...@@ -877,7 +878,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
else else
reqf >>= 25; reqf >>= 25;
} }
reqf = intel_gpu_freq(dev_priv, reqf); reqf = intel_gpu_freq(rps, reqf);
rpmodectl = I915_READ(GEN6_RP_CONTROL); rpmodectl = I915_READ(GEN6_RP_CONTROL);
rpinclimit = I915_READ(GEN6_RP_UP_THRESHOLD); rpinclimit = I915_READ(GEN6_RP_UP_THRESHOLD);
...@@ -890,8 +891,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused) ...@@ -890,8 +891,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK; rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK;
rpcurdown = I915_READ(GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK; rpcurdown = I915_READ(GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK;
rpprevdown = I915_READ(GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK; rpprevdown = I915_READ(GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK;
cagf = intel_gpu_freq(dev_priv, cagf = intel_gpu_freq(rps, intel_get_cagf(rps, rpstat));
intel_get_cagf(dev_priv, rpstat));
intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL); intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
...@@ -968,37 +968,37 @@ static int i915_frequency_info(struct seq_file *m, void *unused) ...@@ -968,37 +968,37 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
max_freq *= (IS_GEN9_BC(dev_priv) || max_freq *= (IS_GEN9_BC(dev_priv) ||
INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1); INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
intel_gpu_freq(dev_priv, max_freq)); intel_gpu_freq(rps, max_freq));
max_freq = (rp_state_cap & 0xff00) >> 8; max_freq = (rp_state_cap & 0xff00) >> 8;
max_freq *= (IS_GEN9_BC(dev_priv) || max_freq *= (IS_GEN9_BC(dev_priv) ||
INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1); INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
seq_printf(m, "Nominal (RP1) frequency: %dMHz\n", seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
intel_gpu_freq(dev_priv, max_freq)); intel_gpu_freq(rps, max_freq));
max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 16 : max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 16 :
rp_state_cap >> 0) & 0xff; rp_state_cap >> 0) & 0xff;
max_freq *= (IS_GEN9_BC(dev_priv) || max_freq *= (IS_GEN9_BC(dev_priv) ||
INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1); INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
intel_gpu_freq(dev_priv, max_freq)); intel_gpu_freq(rps, max_freq));
seq_printf(m, "Max overclocked frequency: %dMHz\n", seq_printf(m, "Max overclocked frequency: %dMHz\n",
intel_gpu_freq(dev_priv, rps->max_freq)); intel_gpu_freq(rps, rps->max_freq));
seq_printf(m, "Current freq: %d MHz\n", seq_printf(m, "Current freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->cur_freq)); intel_gpu_freq(rps, rps->cur_freq));
seq_printf(m, "Actual freq: %d MHz\n", cagf); seq_printf(m, "Actual freq: %d MHz\n", cagf);
seq_printf(m, "Idle freq: %d MHz\n", seq_printf(m, "Idle freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->idle_freq)); intel_gpu_freq(rps, rps->idle_freq));
seq_printf(m, "Min freq: %d MHz\n", seq_printf(m, "Min freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->min_freq)); intel_gpu_freq(rps, rps->min_freq));
seq_printf(m, "Boost freq: %d MHz\n", seq_printf(m, "Boost freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->boost_freq)); intel_gpu_freq(rps, rps->boost_freq));
seq_printf(m, "Max freq: %d MHz\n", seq_printf(m, "Max freq: %d MHz\n",
intel_gpu_freq(dev_priv, rps->max_freq)); intel_gpu_freq(rps, rps->max_freq));
seq_printf(m, seq_printf(m,
"efficient (RPe) frequency: %d MHz\n", "efficient (RPe) frequency: %d MHz\n",
intel_gpu_freq(dev_priv, rps->efficient_freq)); intel_gpu_freq(rps, rps->efficient_freq));
} else { } else {
seq_puts(m, "no P-state info available\n"); seq_puts(m, "no P-state info available\n");
} }
...@@ -1375,7 +1375,7 @@ static int i915_sr_status(struct seq_file *m, void *unused) ...@@ -1375,7 +1375,7 @@ static int i915_sr_status(struct seq_file *m, void *unused)
static int i915_ring_freq_table(struct seq_file *m, void *unused) static int i915_ring_freq_table(struct seq_file *m, void *unused)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
unsigned int max_gpu_freq, min_gpu_freq; unsigned int max_gpu_freq, min_gpu_freq;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int gpu_freq, ia_freq; int gpu_freq, ia_freq;
...@@ -1400,10 +1400,11 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused) ...@@ -1400,10 +1400,11 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
GEN6_PCODE_READ_MIN_FREQ_TABLE, GEN6_PCODE_READ_MIN_FREQ_TABLE,
&ia_freq, NULL); &ia_freq, NULL);
seq_printf(m, "%d\t\t%d\t\t\t\t%d\n", seq_printf(m, "%d\t\t%d\t\t\t\t%d\n",
intel_gpu_freq(dev_priv, (gpu_freq * intel_gpu_freq(rps,
(IS_GEN9_BC(dev_priv) || (gpu_freq *
INTEL_GEN(dev_priv) >= 10 ? (IS_GEN9_BC(dev_priv) ||
GEN9_FREQ_SCALER : 1))), INTEL_GEN(dev_priv) >= 10 ?
GEN9_FREQ_SCALER : 1))),
((ia_freq >> 0) & 0xff) * 100, ((ia_freq >> 0) & 0xff) * 100,
((ia_freq >> 8) & 0xff) * 100); ((ia_freq >> 8) & 0xff) * 100);
} }
...@@ -1631,7 +1632,7 @@ static const char *rps_power_to_str(unsigned int power) ...@@ -1631,7 +1632,7 @@ static const char *rps_power_to_str(unsigned int power)
static int i915_rps_boost_info(struct seq_file *m, void *data) static int i915_rps_boost_info(struct seq_file *m, void *data)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
u32 act_freq = rps->cur_freq; u32 act_freq = rps->cur_freq;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
...@@ -1643,7 +1644,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) ...@@ -1643,7 +1644,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
vlv_punit_put(dev_priv); vlv_punit_put(dev_priv);
act_freq = (act_freq >> 8) & 0xff; act_freq = (act_freq >> 8) & 0xff;
} else { } else {
act_freq = intel_get_cagf(dev_priv, act_freq = intel_get_cagf(rps,
I915_READ(GEN6_RPSTAT1)); I915_READ(GEN6_RPSTAT1));
} }
} }
...@@ -1654,17 +1655,17 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) ...@@ -1654,17 +1655,17 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
atomic_read(&rps->num_waiters)); atomic_read(&rps->num_waiters));
seq_printf(m, "Interactive? %d\n", READ_ONCE(rps->power.interactive)); seq_printf(m, "Interactive? %d\n", READ_ONCE(rps->power.interactive));
seq_printf(m, "Frequency requested %d, actual %d\n", seq_printf(m, "Frequency requested %d, actual %d\n",
intel_gpu_freq(dev_priv, rps->cur_freq), intel_gpu_freq(rps, rps->cur_freq),
intel_gpu_freq(dev_priv, act_freq)); intel_gpu_freq(rps, act_freq));
seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n", seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n",
intel_gpu_freq(dev_priv, rps->min_freq), intel_gpu_freq(rps, rps->min_freq),
intel_gpu_freq(dev_priv, rps->min_freq_softlimit), intel_gpu_freq(rps, rps->min_freq_softlimit),
intel_gpu_freq(dev_priv, rps->max_freq_softlimit), intel_gpu_freq(rps, rps->max_freq_softlimit),
intel_gpu_freq(dev_priv, rps->max_freq)); intel_gpu_freq(rps, rps->max_freq));
seq_printf(m, " idle:%d, efficient:%d, boost:%d\n", seq_printf(m, " idle:%d, efficient:%d, boost:%d\n",
intel_gpu_freq(dev_priv, rps->idle_freq), intel_gpu_freq(rps, rps->idle_freq),
intel_gpu_freq(dev_priv, rps->efficient_freq), intel_gpu_freq(rps, rps->efficient_freq),
intel_gpu_freq(dev_priv, rps->boost_freq)); intel_gpu_freq(rps, rps->boost_freq));
seq_printf(m, "Wait boosts: %d\n", atomic_read(&rps->boosts)); seq_printf(m, "Wait boosts: %d\n", atomic_read(&rps->boosts));
......
...@@ -1794,7 +1794,6 @@ static int i915_drm_resume(struct drm_device *dev) ...@@ -1794,7 +1794,6 @@ static int i915_drm_resume(struct drm_device *dev)
int ret; int ret;
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm); disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
intel_gt_pm_disable(&dev_priv->gt);
i915_gem_sanitize(dev_priv); i915_gem_sanitize(dev_priv);
...@@ -1925,8 +1924,6 @@ static int i915_drm_resume_early(struct drm_device *dev) ...@@ -1925,8 +1924,6 @@ static int i915_drm_resume_early(struct drm_device *dev)
intel_display_power_resume_early(dev_priv); intel_display_power_resume_early(dev_priv);
intel_gt_pm_disable(&dev_priv->gt);
intel_power_domains_resume(dev_priv); intel_power_domains_resume(dev_priv);
intel_gt_sanitize(&dev_priv->gt, true); intel_gt_sanitize(&dev_priv->gt, true);
......
...@@ -545,94 +545,6 @@ struct i915_suspend_saved_registers { ...@@ -545,94 +545,6 @@ struct i915_suspend_saved_registers {
struct vlv_s0ix_state; struct vlv_s0ix_state;
struct intel_rps_ei {
ktime_t ktime;
u32 render_c0;
u32 media_c0;
};
struct intel_rps {
struct mutex lock; /* protects enabling and the worker */
/*
* work, interrupts_enabled and pm_iir are protected by
* dev_priv->irq_lock
*/
struct work_struct work;
bool interrupts_enabled;
u32 pm_iir;
/* PM interrupt bits that should never be masked */
u32 pm_intrmsk_mbz;
/* Frequencies are stored in potentially platform dependent multiples.
* In other words, *_freq needs to be multiplied by X to be interesting.
* Soft limits are those which are used for the dynamic reclocking done
* by the driver (raise frequencies under heavy loads, and lower for
* lighter loads). Hard limits are those imposed by the hardware.
*
* A distinction is made for overclocking, which is never enabled by
* default, and is considered to be above the hard limit if it's
* possible at all.
*/
u8 cur_freq; /* Current frequency (cached, may not == HW) */
u8 min_freq_softlimit; /* Minimum frequency permitted by the driver */
u8 max_freq_softlimit; /* Max frequency permitted by the driver */
u8 max_freq; /* Maximum frequency, RP0 if not overclocking */
u8 min_freq; /* AKA RPn. Minimum frequency */
u8 boost_freq; /* Frequency to request when wait boosting */
u8 idle_freq; /* Frequency to request when we are idle */
u8 efficient_freq; /* AKA RPe. Pre-determined balanced frequency */
u8 rp1_freq; /* "less than" RP0 power/freqency */
u8 rp0_freq; /* Non-overclocked max frequency. */
u16 gpll_ref_freq; /* vlv/chv GPLL reference frequency */
int last_adj;
struct {
struct mutex mutex;
enum { LOW_POWER, BETWEEN, HIGH_POWER } mode;
unsigned int interactive;
u8 up_threshold; /* Current %busy required to uplock */
u8 down_threshold; /* Current %busy required to downclock */
} power;
bool enabled;
atomic_t num_waiters;
atomic_t boosts;
/* manual wa residency calculations */
struct intel_rps_ei ei;
};
struct intel_gen6_power_mgmt {
struct intel_rps rps;
};
/* defined intel_pm.c */
extern spinlock_t mchdev_lock;
struct intel_ilk_power_mgmt {
u8 cur_delay;
u8 min_delay;
u8 max_delay;
u8 fmax;
u8 fstart;
u64 last_count1;
unsigned long last_time1;
unsigned long chipset_power;
u64 last_count2;
u64 last_time2;
unsigned long gfx_power;
u8 corr;
int c_m;
int r_t;
};
#define MAX_L3_SLICES 2 #define MAX_L3_SLICES 2
struct intel_l3_parity { struct intel_l3_parity {
u32 *remap_info[MAX_L3_SLICES]; u32 *remap_info[MAX_L3_SLICES];
...@@ -1069,7 +981,6 @@ struct drm_i915_private { ...@@ -1069,7 +981,6 @@ struct drm_i915_private {
u32 irq_mask; u32 irq_mask;
u32 de_irq_mask[I915_MAX_PIPES]; u32 de_irq_mask[I915_MAX_PIPES];
}; };
u32 pm_rps_events;
u32 pipestat_irq_mask[I915_MAX_PIPES]; u32 pipestat_irq_mask[I915_MAX_PIPES];
struct i915_hotplug hotplug; struct i915_hotplug hotplug;
...@@ -1209,13 +1120,6 @@ struct drm_i915_private { ...@@ -1209,13 +1120,6 @@ struct drm_i915_private {
*/ */
u32 edram_size_mb; u32 edram_size_mb;
/* gen6+ GT PM state */
struct intel_gen6_power_mgmt gt_pm;
/* ilk-only ips/rps state. Everything in here is protected by the global
* mchdev_lock in intel_pm.c */
struct intel_ilk_power_mgmt ips;
struct i915_power_domains power_domains; struct i915_power_domains power_domains;
struct i915_psr psr; struct i915_psr psr;
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "gt/intel_mocs.h" #include "gt/intel_mocs.h"
#include "gt/intel_reset.h" #include "gt/intel_reset.h"
#include "gt/intel_renderstate.h" #include "gt/intel_renderstate.h"
#include "gt/intel_rps.h"
#include "gt/intel_workarounds.h" #include "gt/intel_workarounds.h"
#include "i915_drv.h" #include "i915_drv.h"
...@@ -1269,8 +1270,6 @@ int i915_gem_init(struct drm_i915_private *dev_priv) ...@@ -1269,8 +1270,6 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
goto err_context; goto err_context;
} }
intel_init_gt_powersave(dev_priv);
intel_uc_init(&dev_priv->gt.uc); intel_uc_init(&dev_priv->gt.uc);
ret = intel_gt_init_hw(&dev_priv->gt); ret = intel_gt_init_hw(&dev_priv->gt);
......
This diff is collapsed.
...@@ -22,9 +22,6 @@ struct intel_gt; ...@@ -22,9 +22,6 @@ struct intel_gt;
struct intel_guc; struct intel_guc;
struct intel_uncore; struct intel_uncore;
void gen11_rps_irq_handler(struct intel_gt *gt, u32 pm_iir);
void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir);
void intel_irq_init(struct drm_i915_private *dev_priv); void intel_irq_init(struct drm_i915_private *dev_priv);
void intel_irq_fini(struct drm_i915_private *dev_priv); void intel_irq_fini(struct drm_i915_private *dev_priv);
int intel_irq_install(struct drm_i915_private *dev_priv); int intel_irq_install(struct drm_i915_private *dev_priv);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "gt/intel_engine_user.h" #include "gt/intel_engine_user.h"
#include "gt/intel_gt_pm.h" #include "gt/intel_gt_pm.h"
#include "gt/intel_rc6.h" #include "gt/intel_rc6.h"
#include "gt/intel_rps.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_pmu.h" #include "i915_pmu.h"
...@@ -358,25 +359,26 @@ frequency_sample(struct intel_gt *gt, unsigned int period_ns) ...@@ -358,25 +359,26 @@ frequency_sample(struct intel_gt *gt, unsigned int period_ns)
struct drm_i915_private *i915 = gt->i915; struct drm_i915_private *i915 = gt->i915;
struct intel_uncore *uncore = gt->uncore; struct intel_uncore *uncore = gt->uncore;
struct i915_pmu *pmu = &i915->pmu; struct i915_pmu *pmu = &i915->pmu;
struct intel_rps *rps = &gt->rps;
if (pmu->enable & config_enabled_mask(I915_PMU_ACTUAL_FREQUENCY)) { if (pmu->enable & config_enabled_mask(I915_PMU_ACTUAL_FREQUENCY)) {
u32 val; u32 val;
val = i915->gt_pm.rps.cur_freq; val = rps->cur_freq;
if (intel_gt_pm_get_if_awake(gt)) { if (intel_gt_pm_get_if_awake(gt)) {
val = intel_uncore_read_notrace(uncore, GEN6_RPSTAT1); val = intel_uncore_read_notrace(uncore, GEN6_RPSTAT1);
val = intel_get_cagf(i915, val); val = intel_get_cagf(rps, val);
intel_gt_pm_put(gt); intel_gt_pm_put(gt);
} }
add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_ACT], add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_ACT],
intel_gpu_freq(i915, val), intel_gpu_freq(rps, val),
period_ns / 1000); period_ns / 1000);
} }
if (pmu->enable & config_enabled_mask(I915_PMU_REQUESTED_FREQUENCY)) { if (pmu->enable & config_enabled_mask(I915_PMU_REQUESTED_FREQUENCY)) {
add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_REQ], add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_REQ],
intel_gpu_freq(i915, i915->gt_pm.rps.cur_freq), intel_gpu_freq(rps, rps->cur_freq),
period_ns / 1000); period_ns / 1000);
} }
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "gem/i915_gem_context.h" #include "gem/i915_gem_context.h"
#include "gt/intel_context.h" #include "gt/intel_context.h"
#include "gt/intel_ring.h" #include "gt/intel_ring.h"
#include "gt/intel_rps.h"
#include "i915_active.h" #include "i915_active.h"
#include "i915_drv.h" #include "i915_drv.h"
...@@ -258,8 +259,8 @@ bool i915_request_retire(struct i915_request *rq) ...@@ -258,8 +259,8 @@ bool i915_request_retire(struct i915_request *rq)
if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &rq->fence.flags)) if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &rq->fence.flags))
i915_request_cancel_breadcrumb(rq); i915_request_cancel_breadcrumb(rq);
if (i915_request_has_waitboost(rq)) { if (i915_request_has_waitboost(rq)) {
GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters)); GEM_BUG_ON(!atomic_read(&rq->engine->gt->rps.num_waiters));
atomic_dec(&rq->i915->gt_pm.rps.num_waiters); atomic_dec(&rq->engine->gt->rps.num_waiters);
} }
if (!test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags)) { if (!test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags)) {
set_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags); set_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags);
...@@ -1467,7 +1468,7 @@ long i915_request_wait(struct i915_request *rq, ...@@ -1467,7 +1468,7 @@ long i915_request_wait(struct i915_request *rq,
*/ */
if (flags & I915_WAIT_PRIORITY) { if (flags & I915_WAIT_PRIORITY) {
if (!i915_request_started(rq) && INTEL_GEN(rq->i915) >= 6) if (!i915_request_started(rq) && INTEL_GEN(rq->i915) >= 6)
gen6_rps_boost(rq); intel_rps_boost(rq);
i915_schedule_bump_priority(rq, I915_PRIORITY_WAIT); i915_schedule_bump_priority(rq, I915_PRIORITY_WAIT);
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include "gt/intel_rc6.h" #include "gt/intel_rc6.h"
#include "gt/intel_rps.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_sysfs.h" #include "i915_sysfs.h"
...@@ -259,6 +260,7 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev, ...@@ -259,6 +260,7 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt.rps;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
u32 freq; u32 freq;
...@@ -271,31 +273,31 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev, ...@@ -271,31 +273,31 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev,
freq = (freq >> 8) & 0xff; freq = (freq >> 8) & 0xff;
} else { } else {
freq = intel_get_cagf(dev_priv, I915_READ(GEN6_RPSTAT1)); freq = intel_get_cagf(rps, I915_READ(GEN6_RPSTAT1));
} }
intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref); intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
return snprintf(buf, PAGE_SIZE, "%d\n", intel_gpu_freq(dev_priv, freq)); return snprintf(buf, PAGE_SIZE, "%d\n", intel_gpu_freq(rps, freq));
} }
static ssize_t gt_cur_freq_mhz_show(struct device *kdev, static ssize_t gt_cur_freq_mhz_show(struct device *kdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt.rps;
return snprintf(buf, PAGE_SIZE, "%d\n", return snprintf(buf, PAGE_SIZE, "%d\n",
intel_gpu_freq(dev_priv, intel_gpu_freq(rps, rps->cur_freq));
dev_priv->gt_pm.rps.cur_freq));
} }
static ssize_t gt_boost_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) static ssize_t gt_boost_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt.rps;
return snprintf(buf, PAGE_SIZE, "%d\n", return snprintf(buf, PAGE_SIZE, "%d\n",
intel_gpu_freq(dev_priv, intel_gpu_freq(rps, rps->boost_freq));
dev_priv->gt_pm.rps.boost_freq));
} }
static ssize_t gt_boost_freq_mhz_store(struct device *kdev, static ssize_t gt_boost_freq_mhz_store(struct device *kdev,
...@@ -303,7 +305,7 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev, ...@@ -303,7 +305,7 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
bool boost = false; bool boost = false;
ssize_t ret; ssize_t ret;
u32 val; u32 val;
...@@ -313,7 +315,7 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev, ...@@ -313,7 +315,7 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev,
return ret; return ret;
/* Validate against (static) hardware limits */ /* Validate against (static) hardware limits */
val = intel_freq_opcode(dev_priv, val); val = intel_freq_opcode(rps, val);
if (val < rps->min_freq || val > rps->max_freq) if (val < rps->min_freq || val > rps->max_freq)
return -EINVAL; return -EINVAL;
...@@ -333,19 +335,19 @@ static ssize_t vlv_rpe_freq_mhz_show(struct device *kdev, ...@@ -333,19 +335,19 @@ static ssize_t vlv_rpe_freq_mhz_show(struct device *kdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt.rps;
return snprintf(buf, PAGE_SIZE, "%d\n", return snprintf(buf, PAGE_SIZE, "%d\n",
intel_gpu_freq(dev_priv, intel_gpu_freq(rps, rps->efficient_freq));
dev_priv->gt_pm.rps.efficient_freq));
} }
static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) 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 drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt.rps;
return snprintf(buf, PAGE_SIZE, "%d\n", return snprintf(buf, PAGE_SIZE, "%d\n",
intel_gpu_freq(dev_priv, intel_gpu_freq(rps, rps->max_freq_softlimit));
dev_priv->gt_pm.rps.max_freq_softlimit));
} }
static ssize_t gt_max_freq_mhz_store(struct device *kdev, static ssize_t gt_max_freq_mhz_store(struct device *kdev,
...@@ -353,19 +355,17 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, ...@@ -353,19 +355,17 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
intel_wakeref_t wakeref;
u32 val;
ssize_t ret; ssize_t ret;
u32 val;
ret = kstrtou32(buf, 0, &val); ret = kstrtou32(buf, 0, &val);
if (ret) if (ret)
return ret; return ret;
wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
mutex_lock(&rps->lock); mutex_lock(&rps->lock);
val = intel_freq_opcode(dev_priv, val); val = intel_freq_opcode(rps, val);
if (val < rps->min_freq || if (val < rps->min_freq ||
val > rps->max_freq || val > rps->max_freq ||
val < rps->min_freq_softlimit) { val < rps->min_freq_softlimit) {
...@@ -375,7 +375,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, ...@@ -375,7 +375,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
if (val > rps->rp0_freq) if (val > rps->rp0_freq)
DRM_DEBUG("User requested overclocking to %d\n", DRM_DEBUG("User requested overclocking to %d\n",
intel_gpu_freq(dev_priv, val)); intel_gpu_freq(rps, val));
rps->max_freq_softlimit = val; rps->max_freq_softlimit = val;
...@@ -383,14 +383,15 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, ...@@ -383,14 +383,15 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
rps->min_freq_softlimit, rps->min_freq_softlimit,
rps->max_freq_softlimit); rps->max_freq_softlimit);
/* We still need *_set_rps to process the new max_delay and /*
* We still need *_set_rps to process the new max_delay and
* update the interrupt limits and PMINTRMSK even though * update the interrupt limits and PMINTRMSK even though
* frequency request may be unchanged. */ * frequency request may be unchanged.
ret = intel_set_rps(dev_priv, val); */
intel_rps_set(rps, val);
unlock: unlock:
mutex_unlock(&rps->lock); mutex_unlock(&rps->lock);
intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
return ret ?: count; return ret ?: count;
} }
...@@ -398,10 +399,10 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev, ...@@ -398,10 +399,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) 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 drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt.rps;
return snprintf(buf, PAGE_SIZE, "%d\n", return snprintf(buf, PAGE_SIZE, "%d\n",
intel_gpu_freq(dev_priv, intel_gpu_freq(rps, rps->min_freq_softlimit));
dev_priv->gt_pm.rps.min_freq_softlimit));
} }
static ssize_t gt_min_freq_mhz_store(struct device *kdev, static ssize_t gt_min_freq_mhz_store(struct device *kdev,
...@@ -409,19 +410,17 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev, ...@@ -409,19 +410,17 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
intel_wakeref_t wakeref;
u32 val;
ssize_t ret; ssize_t ret;
u32 val;
ret = kstrtou32(buf, 0, &val); ret = kstrtou32(buf, 0, &val);
if (ret) if (ret)
return ret; return ret;
wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
mutex_lock(&rps->lock); mutex_lock(&rps->lock);
val = intel_freq_opcode(dev_priv, val); val = intel_freq_opcode(rps, val);
if (val < rps->min_freq || if (val < rps->min_freq ||
val > rps->max_freq || val > rps->max_freq ||
val > rps->max_freq_softlimit) { val > rps->max_freq_softlimit) {
...@@ -435,14 +434,15 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev, ...@@ -435,14 +434,15 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
rps->min_freq_softlimit, rps->min_freq_softlimit,
rps->max_freq_softlimit); rps->max_freq_softlimit);
/* We still need *_set_rps to process the new min_delay and /*
* We still need *_set_rps to process the new min_delay and
* update the interrupt limits and PMINTRMSK even though * update the interrupt limits and PMINTRMSK even though
* frequency request may be unchanged. */ * frequency request may be unchanged.
ret = intel_set_rps(dev_priv, val); */
intel_rps_set(rps, val);
unlock: unlock:
mutex_unlock(&rps->lock); mutex_unlock(&rps->lock);
intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
return ret ?: count; return ret ?: count;
} }
...@@ -464,15 +464,15 @@ static DEVICE_ATTR(gt_RPn_freq_mhz, S_IRUGO, gt_rp_mhz_show, NULL); ...@@ -464,15 +464,15 @@ static DEVICE_ATTR(gt_RPn_freq_mhz, S_IRUGO, gt_rp_mhz_show, NULL);
static ssize_t gt_rp_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf) static ssize_t gt_rp_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf)
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt.rps;
u32 val; u32 val;
if (attr == &dev_attr_gt_RP0_freq_mhz) if (attr == &dev_attr_gt_RP0_freq_mhz)
val = intel_gpu_freq(dev_priv, rps->rp0_freq); val = intel_gpu_freq(rps, rps->rp0_freq);
else if (attr == &dev_attr_gt_RP1_freq_mhz) else if (attr == &dev_attr_gt_RP1_freq_mhz)
val = intel_gpu_freq(dev_priv, rps->rp1_freq); val = intel_gpu_freq(rps, rps->rp1_freq);
else if (attr == &dev_attr_gt_RPn_freq_mhz) else if (attr == &dev_attr_gt_RPn_freq_mhz)
val = intel_gpu_freq(dev_priv, rps->min_freq); val = intel_gpu_freq(rps, rps->min_freq);
else else
BUG(); BUG();
......
This diff is collapsed.
...@@ -29,15 +29,6 @@ void intel_update_watermarks(struct intel_crtc *crtc); ...@@ -29,15 +29,6 @@ void intel_update_watermarks(struct intel_crtc *crtc);
void intel_init_pm(struct drm_i915_private *dev_priv); void intel_init_pm(struct drm_i915_private *dev_priv);
void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv); void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv);
void intel_pm_setup(struct drm_i915_private *dev_priv); void intel_pm_setup(struct drm_i915_private *dev_priv);
void intel_gpu_ips_init(struct drm_i915_private *dev_priv);
void intel_gpu_ips_teardown(void);
void intel_init_gt_powersave(struct drm_i915_private *dev_priv);
void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv);
void intel_enable_gt_powersave(struct drm_i915_private *dev_priv);
void intel_disable_gt_powersave(struct drm_i915_private *dev_priv);
void gen6_rps_busy(struct drm_i915_private *dev_priv);
void gen6_rps_idle(struct drm_i915_private *dev_priv);
void gen6_rps_boost(struct i915_request *rq);
void g4x_wm_get_hw_state(struct drm_i915_private *dev_priv); void g4x_wm_get_hw_state(struct drm_i915_private *dev_priv);
void vlv_wm_get_hw_state(struct drm_i915_private *dev_priv); void vlv_wm_get_hw_state(struct drm_i915_private *dev_priv);
void ilk_wm_get_hw_state(struct drm_i915_private *dev_priv); void ilk_wm_get_hw_state(struct drm_i915_private *dev_priv);
...@@ -67,19 +58,6 @@ bool ilk_disable_lp_wm(struct drm_device *dev); ...@@ -67,19 +58,6 @@ bool ilk_disable_lp_wm(struct drm_device *dev);
void intel_init_ipc(struct drm_i915_private *dev_priv); void intel_init_ipc(struct drm_i915_private *dev_priv);
void intel_enable_ipc(struct drm_i915_private *dev_priv); void intel_enable_ipc(struct drm_i915_private *dev_priv);
int intel_gpu_freq(struct drm_i915_private *dev_priv, int val);
int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
u32 intel_get_cagf(struct drm_i915_private *dev_priv, u32 rpstat1);
unsigned long i915_chipset_val(struct drm_i915_private *dev_priv);
unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
void i915_update_gfx_val(struct drm_i915_private *dev_priv);
bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val);
int intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
void intel_rps_mark_interactive(struct drm_i915_private *i915, bool interactive);
bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable); bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable);
#endif /* __INTEL_PM_H__ */ #endif /* __INTEL_PM_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment