Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 121981fa authored by Michal Wajdeczko's avatar Michal Wajdeczko Committed by Chris Wilson
Browse files

drm/i915/guc: Combine enable_guc_loading|submission modparams



We currently have two module parameters that control GuC:
"enable_guc_loading" and "enable_guc_submission". Whenever
we need submission=1, we also need loading=1. We also need
loading=1 when we want to want to load and verify the HuC.

Lets combine above module parameters into one "enable_guc"
modparam. New supported bit values are:

 0=disable GuC (no GuC submission, no HuC)
 1=enable GuC submission
 2=enable HuC load

Special value "-1" can be used to let driver decide what
option should be enabled for given platform based on
hardware/firmware availability or preference.

Explicit enabling any of the GuC features makes GuC load
a required step, fallback to non-GuC mode will not be
supported.

v2: Don't use -EIO
v3: define modparam bits (Chris)
v4: rely on implicit cast (Chris)

Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com>
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/20171206135316.32556-6-michal.wajdeczko@intel.com
parent 8620eb1d
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -3240,8 +3240,9 @@ intel_info(const struct drm_i915_private *dev_priv)
#define HAS_HUC_UCODE(dev_priv)	(HAS_GUC(dev_priv))
#define HAS_HUC_UCODE(dev_priv)	(HAS_GUC(dev_priv))


/* Having a GuC is not the same as using a GuC */
/* Having a GuC is not the same as using a GuC */
#define USES_GUC(dev_priv)		(i915_modparams.enable_guc_loading)
#define USES_GUC(dev_priv)		intel_uc_is_using_guc()
#define USES_GUC_SUBMISSION(dev_priv)	(i915_modparams.enable_guc_submission)
#define USES_GUC_SUBMISSION(dev_priv)	intel_uc_is_using_guc_submission()
#define USES_HUC(dev_priv)		intel_uc_is_using_huc()


#define HAS_RESOURCE_STREAMER(dev_priv) ((dev_priv)->info.has_resource_streamer)
#define HAS_RESOURCE_STREAMER(dev_priv) ((dev_priv)->info.has_resource_streamer)


+4 −7
Original line number Original line Diff line number Diff line
@@ -147,13 +147,10 @@ i915_param_named_unsafe(edp_vswing, int, 0400,
	"(0=use value from vbt [default], 1=low power swing(200mV),"
	"(0=use value from vbt [default], 1=low power swing(200mV),"
	"2=default swing(400mV))");
	"2=default swing(400mV))");


i915_param_named_unsafe(enable_guc_loading, int, 0400,
i915_param_named_unsafe(enable_guc, int, 0400,
	"Enable GuC firmware loading "
	"Enable GuC load for GuC submission and/or HuC load. "
	"(-1=auto, 0=never [default], 1=if available, 2=required)");
	"Required functionality can be selected using bitmask values. "

	"(-1=auto, 0=disable [default], 1=GuC submission, 2=HuC load)");
i915_param_named_unsafe(enable_guc_submission, int, 0400,
	"Enable GuC submission "
	"(-1=auto, 0=never [default], 1=if available, 2=required)");


i915_param_named(guc_log_level, int, 0400,
i915_param_named(guc_log_level, int, 0400,
	"GuC firmware logging level (-1:disabled (default), 0-3:enabled)");
	"GuC firmware logging level (-1:disabled (default), 0-3:enabled)");
+5 −2
Original line number Original line Diff line number Diff line
@@ -25,8 +25,12 @@
#ifndef _I915_PARAMS_H_
#ifndef _I915_PARAMS_H_
#define _I915_PARAMS_H_
#define _I915_PARAMS_H_


#include <linux/bitops.h>
#include <linux/cache.h> /* for __read_mostly */
#include <linux/cache.h> /* for __read_mostly */


#define ENABLE_GUC_SUBMISSION		BIT(0)
#define ENABLE_GUC_LOAD_HUC		BIT(1)

#define I915_PARAMS_FOR_EACH(param) \
#define I915_PARAMS_FOR_EACH(param) \
	param(char *, vbt_firmware, NULL) \
	param(char *, vbt_firmware, NULL) \
	param(int, modeset, -1) \
	param(int, modeset, -1) \
@@ -41,8 +45,7 @@
	param(int, disable_power_well, -1) \
	param(int, disable_power_well, -1) \
	param(int, enable_ips, 1) \
	param(int, enable_ips, 1) \
	param(int, invert_brightness, 0) \
	param(int, invert_brightness, 0) \
	param(int, enable_guc_loading, 0) \
	param(int, enable_guc, 0) \
	param(int, enable_guc_submission, 0) \
	param(int, guc_log_level, -1) \
	param(int, guc_log_level, -1) \
	param(char *, guc_firmware_path, NULL) \
	param(char *, guc_firmware_path, NULL) \
	param(char *, huc_firmware_path, NULL) \
	param(char *, huc_firmware_path, NULL) \
+65 −44
Original line number Original line Diff line number Diff line
@@ -47,35 +47,65 @@ static int __intel_uc_reset_hw(struct drm_i915_private *dev_priv)
	return ret;
	return ret;
}
}


void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
static int __get_platform_enable_guc(struct drm_i915_private *dev_priv)
{
{
	if (!HAS_GUC(dev_priv)) {
	struct intel_uc_fw *guc_fw = &dev_priv->guc.fw;
		if (i915_modparams.enable_guc_loading > 0 ||
	struct intel_uc_fw *huc_fw = &dev_priv->huc.fw;
		    i915_modparams.enable_guc_submission > 0)
	int enable_guc = 0;
			DRM_INFO("Ignoring GuC options, no hardware\n");


		i915_modparams.enable_guc_loading = 0;
	/* Default is to enable GuC/HuC if we know their firmwares */
		i915_modparams.enable_guc_submission = 0;
	if (intel_uc_fw_is_selected(guc_fw))
		return;
		enable_guc |= ENABLE_GUC_SUBMISSION;
	}
	if (intel_uc_fw_is_selected(huc_fw))
		enable_guc |= ENABLE_GUC_LOAD_HUC;


	/* A negative value means "use platform default" */
	/* Any platform specific fine-tuning can be done here */
	if (i915_modparams.enable_guc_loading < 0)
		i915_modparams.enable_guc_loading = HAS_GUC_UCODE(dev_priv);


	/* Verify firmware version */
	return enable_guc;
	if (i915_modparams.enable_guc_loading) {
		if (!intel_uc_fw_is_selected(&dev_priv->guc.fw))
			i915_modparams.enable_guc_loading = 0;
}
}


	/* Can't enable guc submission without guc loaded */
/**
	if (!i915_modparams.enable_guc_loading)
 * intel_uc_sanitize_options - sanitize uC related modparam options
		i915_modparams.enable_guc_submission = 0;
 * @dev_priv: device private
 *
 * In case of "enable_guc" option this function will attempt to modify
 * it only if it was initially set to "auto(-1)". Default value for this
 * modparam varies between platforms and it is hardcoded in driver code.
 * Any other modparam value is only monitored against availability of the
 * related hardware or firmware definitions.
 */
void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
{
	struct intel_uc_fw *guc_fw = &dev_priv->guc.fw;
	struct intel_uc_fw *huc_fw = &dev_priv->huc.fw;


	/* A negative value means "use platform default" */
	/* A negative value means "use platform default" */
	if (i915_modparams.enable_guc_submission < 0)
	if (i915_modparams.enable_guc < 0)
		i915_modparams.enable_guc_submission = HAS_GUC_SCHED(dev_priv);
		i915_modparams.enable_guc = __get_platform_enable_guc(dev_priv);

	DRM_DEBUG_DRIVER("enable_guc=%d (submission:%s huc:%s)\n",
			 i915_modparams.enable_guc,
			 yesno(intel_uc_is_using_guc_submission()),
			 yesno(intel_uc_is_using_huc()));

	/* Verify GuC firmware availability */
	if (intel_uc_is_using_guc() && !intel_uc_fw_is_selected(guc_fw)) {
		DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
			 i915_modparams.enable_guc,
			 !HAS_GUC(dev_priv) ? "no GuC hardware" :
					      "no GuC firmware");
	}

	/* Verify HuC firmware availability */
	if (intel_uc_is_using_huc() && !intel_uc_fw_is_selected(huc_fw)) {
		DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
			 i915_modparams.enable_guc,
			 !HAS_HUC(dev_priv) ? "no HuC hardware" :
					      "no HuC firmware");
	}

	/* Make sure that sanitization was done */
	GEM_BUG_ON(i915_modparams.enable_guc < 0);
}
}


void intel_uc_init_early(struct drm_i915_private *dev_priv)
void intel_uc_init_early(struct drm_i915_private *dev_priv)
@@ -161,6 +191,11 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv)
	if (!USES_GUC(dev_priv))
	if (!USES_GUC(dev_priv))
		return 0;
		return 0;


	if (!HAS_GUC(dev_priv)) {
		ret = -ENODEV;
		goto err_out;
	}

	guc_disable_communication(guc);
	guc_disable_communication(guc);
	gen9_reset_guc_interrupts(dev_priv);
	gen9_reset_guc_interrupts(dev_priv);


@@ -235,12 +270,6 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv)


	/*
	/*
	 * We've failed to load the firmware :(
	 * We've failed to load the firmware :(
	 *
	 * Decide whether to disable GuC submission and fall back to
	 * execlist mode, and whether to hide the error by returning
	 * zero or to return -EIO, which the caller will treat as a
	 * nonfatal error (i.e. it doesn't prevent driver load, but
	 * marks the GPU as wedged until reset).
	 */
	 */
err_interrupts:
err_interrupts:
	guc_disable_communication(guc);
	guc_disable_communication(guc);
@@ -252,23 +281,15 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv)
		intel_guc_submission_fini(guc);
		intel_guc_submission_fini(guc);
err_guc:
err_guc:
	i915_ggtt_disable_guc(dev_priv);
	i915_ggtt_disable_guc(dev_priv);
err_out:
	/*
	 * Note that there is no fallback as either user explicitly asked for
	 * the GuC or driver default option was to run with the GuC enabled.
	 */
	if (GEM_WARN_ON(ret == -EIO))
		ret = -EINVAL;


	if (i915_modparams.enable_guc_loading > 1 ||
	dev_err(dev_priv->drm.dev, "GuC initialization failed %d\n", ret);
	    i915_modparams.enable_guc_submission > 1) {
		DRM_ERROR("GuC init failed. Firmware loading disabled.\n");
		ret = -EIO;
	} else {
		DRM_NOTE("GuC init failed. Firmware loading disabled.\n");
		ret = 0;
	}

	if (USES_GUC_SUBMISSION(dev_priv)) {
		i915_modparams.enable_guc_submission = 0;
		DRM_NOTE("Falling back from GuC submission to execlist mode\n");
	}

	i915_modparams.enable_guc_loading = 0;

	return ret;
	return ret;
}
}


+19 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@


#include "intel_guc.h"
#include "intel_guc.h"
#include "intel_huc.h"
#include "intel_huc.h"
#include "i915_params.h"


void intel_uc_sanitize_options(struct drm_i915_private *dev_priv);
void intel_uc_sanitize_options(struct drm_i915_private *dev_priv);
void intel_uc_init_early(struct drm_i915_private *dev_priv);
void intel_uc_init_early(struct drm_i915_private *dev_priv);
@@ -35,4 +36,22 @@ void intel_uc_fini_fw(struct drm_i915_private *dev_priv);
int intel_uc_init_hw(struct drm_i915_private *dev_priv);
int intel_uc_init_hw(struct drm_i915_private *dev_priv);
void intel_uc_fini_hw(struct drm_i915_private *dev_priv);
void intel_uc_fini_hw(struct drm_i915_private *dev_priv);


static inline bool intel_uc_is_using_guc(void)
{
	GEM_BUG_ON(i915_modparams.enable_guc < 0);
	return i915_modparams.enable_guc > 0;
}

static inline bool intel_uc_is_using_guc_submission(void)
{
	GEM_BUG_ON(i915_modparams.enable_guc < 0);
	return i915_modparams.enable_guc & ENABLE_GUC_SUBMISSION;
}

static inline bool intel_uc_is_using_huc(void)
{
	GEM_BUG_ON(i915_modparams.enable_guc < 0);
	return i915_modparams.enable_guc & ENABLE_GUC_LOAD_HUC;
}

#endif
#endif