Commit 42014f69 authored by Andi Shyti's avatar Andi Shyti Committed by Chris Wilson
Browse files

drm/i915: Hook up GT power management



Refactor the GT power management interface to work through the GT now
that it is under the control of gt/

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>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190905111403.10071-1-andi.shyti@intel.com
parent 5bf05dc5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -137,6 +137,7 @@ static bool switch_to_kernel_context_sync(struct intel_gt *gt)

bool i915_gem_load_power_context(struct drm_i915_private *i915)
{
	intel_gt_pm_enable(&i915->gt);
	return switch_to_kernel_context_sync(&i915->gt);
}

+43 −2
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include "intel_gt.h"
#include "intel_gt_pm.h"
#include "intel_uncore.h"
#include "intel_pm.h"

void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
{
@@ -27,6 +28,9 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
void intel_gt_init_hw(struct drm_i915_private *i915)
{
	i915->gt.ggtt = &i915->ggtt;

	/* BIOS often leaves RC6 enabled, but disable it for hw init */
	intel_gt_pm_disable(&i915->gt);
}

static void rmw_set(struct intel_uncore *uncore, i915_reg_t reg, u32 set)
@@ -222,7 +226,13 @@ void intel_gt_chipset_flush(struct intel_gt *gt)
		intel_gtt_chipset_flush();
}

int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size)
void intel_gt_driver_register(struct intel_gt *gt)
{
	if (IS_GEN(gt->i915, 5))
		intel_gpu_ips_init(gt->i915);
}

static int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size)
{
	struct drm_i915_private *i915 = gt->i915;
	struct drm_i915_gem_object *obj;
@@ -256,11 +266,42 @@ err_unref:
	return ret;
}

void intel_gt_fini_scratch(struct intel_gt *gt)
static void intel_gt_fini_scratch(struct intel_gt *gt)
{
	i915_vma_unpin_and_release(&gt->scratch, 0);
}

int intel_gt_init(struct intel_gt *gt)
{
	int err;

	err = intel_gt_init_scratch(gt, IS_GEN(gt->i915, 2) ? SZ_256K : SZ_4K);
	if (err)
		return err;

	return 0;
}

void intel_gt_driver_remove(struct intel_gt *gt)
{
	GEM_BUG_ON(gt->awake);
	intel_gt_pm_disable(gt);
}

void intel_gt_driver_unregister(struct intel_gt *gt)
{
	intel_gpu_ips_teardown();
}

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_cleanup_gt_powersave(gt->i915);
	intel_gt_fini_scratch(gt);
}

void intel_gt_driver_late_release(struct intel_gt *gt)
{
	intel_uc_driver_late_release(&gt->uc);
+6 −3
Original line number Diff line number Diff line
@@ -29,6 +29,12 @@ static inline struct intel_gt *huc_to_gt(struct intel_huc *huc)

void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915);
void intel_gt_init_hw(struct drm_i915_private *i915);
int intel_gt_init(struct intel_gt *gt);
void intel_gt_driver_register(struct intel_gt *gt);

void intel_gt_driver_unregister(struct intel_gt *gt);
void intel_gt_driver_remove(struct intel_gt *gt);
void intel_gt_driver_release(struct intel_gt *gt);

void intel_gt_driver_late_release(struct intel_gt *gt);

@@ -41,9 +47,6 @@ void intel_gt_chipset_flush(struct intel_gt *gt);

void intel_gt_init_hangcheck(struct intel_gt *gt);

int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size);
void intel_gt_fini_scratch(struct intel_gt *gt);

static inline u32 intel_gt_scratch_offset(const struct intel_gt *gt,
					  enum intel_gt_scratch_field field)
{
+36 −0
Original line number Diff line number Diff line
@@ -124,6 +124,42 @@ void intel_gt_sanitize(struct intel_gt *gt, bool force)
		__intel_engine_reset(engine, false);
}

static bool is_mock_device(const struct intel_gt *gt)
{
	return I915_SELFTEST_ONLY(gt->awake == -1);
}

void intel_gt_pm_enable(struct intel_gt *gt)
{
	struct intel_engine_cs *engine;
	enum intel_engine_id id;

	/* Powersaving is controlled by the host when inside a VM */
	if (intel_vgpu_active(gt->i915))
		return;

	if (is_mock_device(gt))
		return;

	intel_gt_pm_get(gt);

	for_each_engine(engine, gt->i915, id) {
		intel_engine_pm_get(engine);
		engine->serial++; /* force kernel context reload */
		intel_engine_pm_put(engine);
	}

	intel_gt_pm_put(gt);
}

void intel_gt_pm_disable(struct intel_gt *gt)
{
	if (is_mock_device(gt))
		return;

	intel_sanitize_gt_powersave(gt->i915);
}

int intel_gt_resume(struct intel_gt *gt)
{
	struct intel_engine_cs *engine;
+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ 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_enable(struct intel_gt *gt);
void intel_gt_pm_disable(struct intel_gt *gt);

void intel_gt_sanitize(struct intel_gt *gt, bool force);
int intel_gt_resume(struct intel_gt *gt);
Loading