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: Michal 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: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Link: https://patchwork.freedesktop.org/patch/msgid/20171206135316.32556-6-michal.wajdeczko@intel.com
This commit is contained in:
parent
8620eb1dbb
commit
121981fafe
@ -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)
|
||||||
|
|
||||||
|
@ -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)");
|
||||||
|
@ -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) \
|
||||||
|
@ -47,35 +47,65 @@ static int __intel_uc_reset_hw(struct drm_i915_private *dev_priv)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __get_platform_enable_guc(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;
|
||||||
|
int enable_guc = 0;
|
||||||
|
|
||||||
|
/* Default is to enable GuC/HuC if we know their firmwares */
|
||||||
|
if (intel_uc_fw_is_selected(guc_fw))
|
||||||
|
enable_guc |= ENABLE_GUC_SUBMISSION;
|
||||||
|
if (intel_uc_fw_is_selected(huc_fw))
|
||||||
|
enable_guc |= ENABLE_GUC_LOAD_HUC;
|
||||||
|
|
||||||
|
/* Any platform specific fine-tuning can be done here */
|
||||||
|
|
||||||
|
return enable_guc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* intel_uc_sanitize_options - sanitize uC related modparam options
|
||||||
|
* @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)
|
void intel_uc_sanitize_options(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)
|
|
||||||
DRM_INFO("Ignoring GuC options, no hardware\n");
|
|
||||||
|
|
||||||
i915_modparams.enable_guc_loading = 0;
|
|
||||||
i915_modparams.enable_guc_submission = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A negative value means "use platform default" */
|
/* A negative value means "use platform default" */
|
||||||
if (i915_modparams.enable_guc_loading < 0)
|
if (i915_modparams.enable_guc < 0)
|
||||||
i915_modparams.enable_guc_loading = HAS_GUC_UCODE(dev_priv);
|
i915_modparams.enable_guc = __get_platform_enable_guc(dev_priv);
|
||||||
|
|
||||||
/* Verify firmware version */
|
DRM_DEBUG_DRIVER("enable_guc=%d (submission:%s huc:%s)\n",
|
||||||
if (i915_modparams.enable_guc_loading) {
|
i915_modparams.enable_guc,
|
||||||
if (!intel_uc_fw_is_selected(&dev_priv->guc.fw))
|
yesno(intel_uc_is_using_guc_submission()),
|
||||||
i915_modparams.enable_guc_loading = 0;
|
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can't enable guc submission without guc loaded */
|
/* Verify HuC firmware availability */
|
||||||
if (!i915_modparams.enable_guc_loading)
|
if (intel_uc_is_using_huc() && !intel_uc_fw_is_selected(huc_fw)) {
|
||||||
i915_modparams.enable_guc_submission = 0;
|
DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
|
||||||
|
i915_modparams.enable_guc,
|
||||||
|
!HAS_HUC(dev_priv) ? "no HuC hardware" :
|
||||||
|
"no HuC firmware");
|
||||||
|
}
|
||||||
|
|
||||||
/* A negative value means "use platform default" */
|
/* Make sure that sanitization was done */
|
||||||
if (i915_modparams.enable_guc_submission < 0)
|
GEM_BUG_ON(i915_modparams.enable_guc < 0);
|
||||||
i915_modparams.enable_guc_submission = HAS_GUC_SCHED(dev_priv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@ err_submission:
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user