mirror of https://gitee.com/openkylin/linux.git
drm/i915/guc: Redefine guc_log_level modparam values
We used value -1 to indicate "disabled" and values 0..3 to indicate "enabled", but most of our other modparams are using -1 for "auto" mode and 0 for "disable". For consistency let's change our log level values to: -1: auto (depends on platform and Kconfig.debug settings) 0: disabled 1: enabled (severity level 0 = min) 2: enabled (severity level 1) 3: enabled (severity level 2) 4: enabled (severity level 3 = max) v2: fix commit message (Sagar) display sanitized modparam value (Sagar) unify sanitize messages (Sagar/Michal) Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Link: https://patchwork.freedesktop.org/patch/msgid/20180111152441.21676-1-michal.wajdeczko@intel.com Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
e9af4ea2b9
commit
0ed8795353
|
@ -155,7 +155,8 @@ i915_param_named_unsafe(enable_guc, int, 0400,
|
||||||
"(-1=auto, 0=disable [default], 1=GuC submission, 2=HuC load)");
|
"(-1=auto, 0=disable [default], 1=GuC submission, 2=HuC load)");
|
||||||
|
|
||||||
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. Requires GuC to be loaded. "
|
||||||
|
"(-1=auto [default], 0=disable, 1..4=enable with verbosity min..max)");
|
||||||
|
|
||||||
i915_param_named_unsafe(guc_firmware_path, charp, 0400,
|
i915_param_named_unsafe(guc_firmware_path, charp, 0400,
|
||||||
"GuC firmware path to use instead of the default one");
|
"GuC firmware path to use instead of the default one");
|
||||||
|
|
|
@ -215,6 +215,19 @@ static u32 get_core_family(struct drm_i915_private *dev_priv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 get_log_verbosity_flags(void)
|
||||||
|
{
|
||||||
|
if (i915_modparams.guc_log_level > 0) {
|
||||||
|
u32 verbosity = i915_modparams.guc_log_level - 1;
|
||||||
|
|
||||||
|
GEM_BUG_ON(verbosity > GUC_LOG_VERBOSITY_MAX);
|
||||||
|
return verbosity << GUC_LOG_VERBOSITY_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
GEM_BUG_ON(i915_modparams.enable_guc < 0);
|
||||||
|
return GUC_LOG_DISABLED;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise the GuC parameter block before starting the firmware
|
* Initialise the GuC parameter block before starting the firmware
|
||||||
* transfer. These parameters are read by the firmware on startup
|
* transfer. These parameters are read by the firmware on startup
|
||||||
|
@ -247,12 +260,7 @@ void intel_guc_init_params(struct intel_guc *guc)
|
||||||
|
|
||||||
params[GUC_CTL_LOG_PARAMS] = guc->log.flags;
|
params[GUC_CTL_LOG_PARAMS] = guc->log.flags;
|
||||||
|
|
||||||
if (i915_modparams.guc_log_level >= 0) {
|
params[GUC_CTL_DEBUG] = get_log_verbosity_flags();
|
||||||
params[GUC_CTL_DEBUG] =
|
|
||||||
i915_modparams.guc_log_level << GUC_LOG_VERBOSITY_SHIFT;
|
|
||||||
} else {
|
|
||||||
params[GUC_CTL_DEBUG] = GUC_LOG_DISABLED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If GuC submission is enabled, set up additional parameters here */
|
/* If GuC submission is enabled, set up additional parameters here */
|
||||||
if (USES_GUC_SUBMISSION(dev_priv)) {
|
if (USES_GUC_SUBMISSION(dev_priv)) {
|
||||||
|
@ -445,7 +453,7 @@ int intel_guc_resume(struct drm_i915_private *dev_priv)
|
||||||
if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
|
if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (i915_modparams.guc_log_level >= 0)
|
if (i915_modparams.guc_log_level)
|
||||||
gen9_enable_guc_interrupts(dev_priv);
|
gen9_enable_guc_interrupts(dev_priv);
|
||||||
|
|
||||||
data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
|
data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
|
||||||
|
|
|
@ -33,11 +33,10 @@ static void guc_log_capture_logs(struct intel_guc *guc);
|
||||||
/**
|
/**
|
||||||
* DOC: GuC firmware log
|
* DOC: GuC firmware log
|
||||||
*
|
*
|
||||||
* Firmware log is enabled by setting i915.guc_log_level to non-negative level.
|
* Firmware log is enabled by setting i915.guc_log_level to the positive level.
|
||||||
* Log data is printed out via reading debugfs i915_guc_log_dump. Reading from
|
* Log data is printed out via reading debugfs i915_guc_log_dump. Reading from
|
||||||
* i915_guc_load_status will print out firmware loading status and scratch
|
* i915_guc_load_status will print out firmware loading status and scratch
|
||||||
* registers value.
|
* registers value.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int guc_log_flush_complete(struct intel_guc *guc)
|
static int guc_log_flush_complete(struct intel_guc *guc)
|
||||||
|
@ -147,7 +146,7 @@ static int guc_log_relay_file_create(struct intel_guc *guc)
|
||||||
struct dentry *log_dir;
|
struct dentry *log_dir;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (i915_modparams.guc_log_level < 0)
|
if (!i915_modparams.guc_log_level)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* For now create the log file in /sys/kernel/debug/dri/0 dir */
|
/* For now create the log file in /sys/kernel/debug/dri/0 dir */
|
||||||
|
@ -423,8 +422,8 @@ static void guc_log_runtime_destroy(struct intel_guc *guc)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* It's possible that the runtime stuff was never allocated because
|
* It's possible that the runtime stuff was never allocated because
|
||||||
* guc_log_level was < 0 at the time
|
* GuC log was disabled at the boot time.
|
||||||
**/
|
*/
|
||||||
if (!guc_log_has_runtime(guc))
|
if (!guc_log_has_runtime(guc))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -441,9 +440,10 @@ static int guc_log_late_setup(struct intel_guc *guc)
|
||||||
lockdep_assert_held(&dev_priv->drm.struct_mutex);
|
lockdep_assert_held(&dev_priv->drm.struct_mutex);
|
||||||
|
|
||||||
if (!guc_log_has_runtime(guc)) {
|
if (!guc_log_has_runtime(guc)) {
|
||||||
/* If log_level was set as -1 at boot time, then setup needed to
|
/*
|
||||||
* handle log buffer flush interrupts would not have been done yet,
|
* If log was disabled at boot time, then setup needed to handle
|
||||||
* so do that now.
|
* log buffer flush interrupts would not have been done yet, so
|
||||||
|
* do that now.
|
||||||
*/
|
*/
|
||||||
ret = guc_log_runtime_create(guc);
|
ret = guc_log_runtime_create(guc);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -460,7 +460,7 @@ static int guc_log_late_setup(struct intel_guc *guc)
|
||||||
guc_log_runtime_destroy(guc);
|
guc_log_runtime_destroy(guc);
|
||||||
err:
|
err:
|
||||||
/* logging will remain off */
|
/* logging will remain off */
|
||||||
i915_modparams.guc_log_level = -1;
|
i915_modparams.guc_log_level = 0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,8 +482,7 @@ static void guc_flush_logs(struct intel_guc *guc)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = guc_to_i915(guc);
|
struct drm_i915_private *dev_priv = guc_to_i915(guc);
|
||||||
|
|
||||||
if (!USES_GUC_SUBMISSION(dev_priv) ||
|
if (!USES_GUC_SUBMISSION(dev_priv) || !i915_modparams.guc_log_level)
|
||||||
(i915_modparams.guc_log_level < 0))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* First disable the interrupts, will be renabled afterwards */
|
/* First disable the interrupts, will be renabled afterwards */
|
||||||
|
@ -511,9 +510,6 @@ int intel_guc_log_create(struct intel_guc *guc)
|
||||||
|
|
||||||
GEM_BUG_ON(guc->log.vma);
|
GEM_BUG_ON(guc->log.vma);
|
||||||
|
|
||||||
if (i915_modparams.guc_log_level > GUC_LOG_VERBOSITY_MAX)
|
|
||||||
i915_modparams.guc_log_level = GUC_LOG_VERBOSITY_MAX;
|
|
||||||
|
|
||||||
/* The first page is to save log buffer state. Allocate one
|
/* The first page is to save log buffer state. Allocate one
|
||||||
* extra page for others in case for overlap */
|
* extra page for others in case for overlap */
|
||||||
size = (1 + GUC_LOG_DPC_PAGES + 1 +
|
size = (1 + GUC_LOG_DPC_PAGES + 1 +
|
||||||
|
@ -537,7 +533,7 @@ int intel_guc_log_create(struct intel_guc *guc)
|
||||||
|
|
||||||
guc->log.vma = vma;
|
guc->log.vma = vma;
|
||||||
|
|
||||||
if (i915_modparams.guc_log_level >= 0) {
|
if (i915_modparams.guc_log_level) {
|
||||||
ret = guc_log_runtime_create(guc);
|
ret = guc_log_runtime_create(guc);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err_vma;
|
goto err_vma;
|
||||||
|
@ -558,7 +554,7 @@ int intel_guc_log_create(struct intel_guc *guc)
|
||||||
i915_vma_unpin_and_release(&guc->log.vma);
|
i915_vma_unpin_and_release(&guc->log.vma);
|
||||||
err:
|
err:
|
||||||
/* logging will be off */
|
/* logging will be off */
|
||||||
i915_modparams.guc_log_level = -1;
|
i915_modparams.guc_log_level = 0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -582,7 +578,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* This combination doesn't make sense & won't have any effect */
|
/* This combination doesn't make sense & won't have any effect */
|
||||||
if (!log_param.logging_enabled && (i915_modparams.guc_log_level < 0))
|
if (!log_param.logging_enabled && !i915_modparams.guc_log_level)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = guc_log_control(guc, log_param.value);
|
ret = guc_log_control(guc, log_param.value);
|
||||||
|
@ -592,11 +588,12 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_param.logging_enabled) {
|
if (log_param.logging_enabled) {
|
||||||
i915_modparams.guc_log_level = log_param.verbosity;
|
i915_modparams.guc_log_level = 1 + log_param.verbosity;
|
||||||
|
|
||||||
/* If log_level was set as -1 at boot time, then the relay channel file
|
/*
|
||||||
* wouldn't have been created by now and interrupts also would not have
|
* If log was disabled at boot time, then the relay channel file
|
||||||
* been enabled. Try again now, just in case.
|
* wouldn't have been created by now and interrupts also would
|
||||||
|
* not have been enabled. Try again now, just in case.
|
||||||
*/
|
*/
|
||||||
ret = guc_log_late_setup(guc);
|
ret = guc_log_late_setup(guc);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -607,7 +604,8 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
|
||||||
/* GuC logging is currently the only user of Guc2Host interrupts */
|
/* GuC logging is currently the only user of Guc2Host interrupts */
|
||||||
gen9_enable_guc_interrupts(dev_priv);
|
gen9_enable_guc_interrupts(dev_priv);
|
||||||
} else {
|
} else {
|
||||||
/* Once logging is disabled, GuC won't generate logs & send an
|
/*
|
||||||
|
* Once logging is disabled, GuC won't generate logs & send an
|
||||||
* interrupt. But there could be some data in the log buffer
|
* interrupt. But there could be some data in the log buffer
|
||||||
* which is yet to be captured. So request GuC to update the log
|
* which is yet to be captured. So request GuC to update the log
|
||||||
* buffer state and then collect the left over logs.
|
* buffer state and then collect the left over logs.
|
||||||
|
@ -615,7 +613,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
|
||||||
guc_flush_logs(guc);
|
guc_flush_logs(guc);
|
||||||
|
|
||||||
/* As logging is disabled, update log level to reflect that */
|
/* As logging is disabled, update log level to reflect that */
|
||||||
i915_modparams.guc_log_level = -1;
|
i915_modparams.guc_log_level = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -623,8 +621,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
|
||||||
|
|
||||||
void i915_guc_log_register(struct drm_i915_private *dev_priv)
|
void i915_guc_log_register(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
if (!USES_GUC_SUBMISSION(dev_priv) ||
|
if (!USES_GUC_SUBMISSION(dev_priv) || !i915_modparams.guc_log_level)
|
||||||
(i915_modparams.guc_log_level < 0))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||||
|
|
|
@ -65,6 +65,21 @@ static int __get_platform_enable_guc(struct drm_i915_private *dev_priv)
|
||||||
return enable_guc;
|
return enable_guc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __get_default_guc_log_level(struct drm_i915_private *dev_priv)
|
||||||
|
{
|
||||||
|
int guc_log_level = 0; /* disabled */
|
||||||
|
|
||||||
|
/* Enable if we're running on platform with GuC and debug config */
|
||||||
|
if (HAS_GUC(dev_priv) && intel_uc_is_using_guc() &&
|
||||||
|
(IS_ENABLED(CONFIG_DRM_I915_DEBUG) ||
|
||||||
|
IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)))
|
||||||
|
guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX;
|
||||||
|
|
||||||
|
/* Any platform specific fine-tuning can be done here */
|
||||||
|
|
||||||
|
return guc_log_level;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* intel_uc_sanitize_options - sanitize uC related modparam options
|
* intel_uc_sanitize_options - sanitize uC related modparam options
|
||||||
* @dev_priv: device private
|
* @dev_priv: device private
|
||||||
|
@ -74,6 +89,13 @@ static int __get_platform_enable_guc(struct drm_i915_private *dev_priv)
|
||||||
* modparam varies between platforms and it is hardcoded in driver code.
|
* modparam varies between platforms and it is hardcoded in driver code.
|
||||||
* Any other modparam value is only monitored against availability of the
|
* Any other modparam value is only monitored against availability of the
|
||||||
* related hardware or firmware definitions.
|
* related hardware or firmware definitions.
|
||||||
|
*
|
||||||
|
* In case of "guc_log_level" option this function will attempt to modify
|
||||||
|
* it only if it was initially set to "auto(-1)" or if initial value was
|
||||||
|
* "enable(1..4)" on platforms without the GuC. Default value for this
|
||||||
|
* modparam varies between platforms and is usually set to "disable(0)"
|
||||||
|
* unless GuC is enabled on given platform and the driver is compiled with
|
||||||
|
* debug config when this modparam will default to "enable(1..4)".
|
||||||
*/
|
*/
|
||||||
void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
|
void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
|
@ -91,22 +113,48 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
|
||||||
|
|
||||||
/* Verify GuC firmware availability */
|
/* Verify GuC firmware availability */
|
||||||
if (intel_uc_is_using_guc() && !intel_uc_fw_is_selected(guc_fw)) {
|
if (intel_uc_is_using_guc() && !intel_uc_fw_is_selected(guc_fw)) {
|
||||||
DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
|
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
|
||||||
i915_modparams.enable_guc,
|
"enable_guc", i915_modparams.enable_guc,
|
||||||
!HAS_GUC(dev_priv) ? "no GuC hardware" :
|
!HAS_GUC(dev_priv) ? "no GuC hardware" :
|
||||||
"no GuC firmware");
|
"no GuC firmware");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify HuC firmware availability */
|
/* Verify HuC firmware availability */
|
||||||
if (intel_uc_is_using_huc() && !intel_uc_fw_is_selected(huc_fw)) {
|
if (intel_uc_is_using_huc() && !intel_uc_fw_is_selected(huc_fw)) {
|
||||||
DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
|
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
|
||||||
i915_modparams.enable_guc,
|
"enable_guc", i915_modparams.enable_guc,
|
||||||
!HAS_HUC(dev_priv) ? "no HuC hardware" :
|
!HAS_HUC(dev_priv) ? "no HuC hardware" :
|
||||||
"no HuC firmware");
|
"no HuC firmware");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A negative value means "use platform/config default" */
|
||||||
|
if (i915_modparams.guc_log_level < 0)
|
||||||
|
i915_modparams.guc_log_level =
|
||||||
|
__get_default_guc_log_level(dev_priv);
|
||||||
|
|
||||||
|
if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc()) {
|
||||||
|
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
|
||||||
|
"guc_log_level", i915_modparams.guc_log_level,
|
||||||
|
!HAS_GUC(dev_priv) ? "no GuC hardware" :
|
||||||
|
"GuC not enabled");
|
||||||
|
i915_modparams.guc_log_level = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i915_modparams.guc_log_level > 1 + GUC_LOG_VERBOSITY_MAX) {
|
||||||
|
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
|
||||||
|
"guc_log_level", i915_modparams.guc_log_level,
|
||||||
|
"verbosity too high");
|
||||||
|
i915_modparams.guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n",
|
||||||
|
i915_modparams.guc_log_level,
|
||||||
|
yesno(i915_modparams.guc_log_level),
|
||||||
|
i915_modparams.guc_log_level - 1);
|
||||||
|
|
||||||
/* Make sure that sanitization was done */
|
/* Make sure that sanitization was done */
|
||||||
GEM_BUG_ON(i915_modparams.enable_guc < 0);
|
GEM_BUG_ON(i915_modparams.enable_guc < 0);
|
||||||
|
GEM_BUG_ON(i915_modparams.guc_log_level < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void intel_uc_init_early(struct drm_i915_private *dev_priv)
|
void intel_uc_init_early(struct drm_i915_private *dev_priv)
|
||||||
|
@ -152,7 +200,7 @@ void intel_uc_init_mmio(struct drm_i915_private *dev_priv)
|
||||||
|
|
||||||
static void guc_capture_load_err_log(struct intel_guc *guc)
|
static void guc_capture_load_err_log(struct intel_guc *guc)
|
||||||
{
|
{
|
||||||
if (!guc->log.vma || i915_modparams.guc_log_level < 0)
|
if (!guc->log.vma || !i915_modparams.guc_log_level)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!guc->load_err_log)
|
if (!guc->load_err_log)
|
||||||
|
@ -322,7 +370,7 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USES_GUC_SUBMISSION(dev_priv)) {
|
if (USES_GUC_SUBMISSION(dev_priv)) {
|
||||||
if (i915_modparams.guc_log_level >= 0)
|
if (i915_modparams.guc_log_level)
|
||||||
gen9_enable_guc_interrupts(dev_priv);
|
gen9_enable_guc_interrupts(dev_priv);
|
||||||
|
|
||||||
ret = intel_guc_submission_enable(guc);
|
ret = intel_guc_submission_enable(guc);
|
||||||
|
|
Loading…
Reference in New Issue