[Intel-gfx] [PATCH v2 1/2] drm/i915/guc: Redefine guc_log_level modparam values
Sagar Arun Kamble
sagar.a.kamble at intel.com
Fri Jan 12 05:30:37 UTC 2018
On 1/11/2018 8:54 PM, Michal Wajdeczko wrote:
> 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 at intel.com>
> Cc: Sagar Arun Kamble <sagar.a.kamble at intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
Reviewed-by: Sagar Arun Kamble <sagar.a.kamble at intel.com>
> ---
> drivers/gpu/drm/i915/i915_params.c | 3 +-
> drivers/gpu/drm/i915/intel_guc.c | 21 ++++++++-----
> drivers/gpu/drm/i915/intel_guc_log.c | 47 +++++++++++++---------------
> drivers/gpu/drm/i915/intel_uc.c | 60 ++++++++++++++++++++++++++++++++----
> 4 files changed, 92 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
> index b5f3eb4..0b553a8 100644
> --- a/drivers/gpu/drm/i915/i915_params.c
> +++ b/drivers/gpu/drm/i915/i915_params.c
> @@ -155,7 +155,8 @@ struct i915_params i915_modparams __read_mostly = {
> "(-1=auto, 0=disable [default], 1=GuC submission, 2=HuC load)");
>
> 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,
> "GuC firmware path to use instead of the default one");
> diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c
> index 50b4725..4681537 100644
> --- a/drivers/gpu/drm/i915/intel_guc.c
> +++ b/drivers/gpu/drm/i915/intel_guc.c
> @@ -215,6 +215,18 @@ 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
> * transfer. These parameters are read by the firmware on startup
> @@ -247,12 +259,7 @@ void intel_guc_init_params(struct intel_guc *guc)
>
> params[GUC_CTL_LOG_PARAMS] = guc->log.flags;
>
> - if (i915_modparams.guc_log_level >= 0) {
> - params[GUC_CTL_DEBUG] =
> - i915_modparams.guc_log_level << GUC_LOG_VERBOSITY_SHIFT;
> - } else {
> - params[GUC_CTL_DEBUG] = GUC_LOG_DISABLED;
> - }
> + params[GUC_CTL_DEBUG] = get_log_verbosity_flags();
>
> /* If GuC submission is enabled, set up additional parameters here */
> if (USES_GUC_SUBMISSION(dev_priv)) {
> @@ -445,7 +452,7 @@ int intel_guc_resume(struct drm_i915_private *dev_priv)
> if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
> return 0;
>
> - if (i915_modparams.guc_log_level >= 0)
> + if (i915_modparams.guc_log_level)
> gen9_enable_guc_interrupts(dev_priv);
>
> data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
> diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
> index eaedd63..e6d59bf 100644
> --- a/drivers/gpu/drm/i915/intel_guc_log.c
> +++ b/drivers/gpu/drm/i915/intel_guc_log.c
> @@ -33,11 +33,10 @@
> /**
> * 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
> * i915_guc_load_status will print out firmware loading status and scratch
> * registers value.
> - *
> */
>
> 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;
> int ret;
>
> - if (i915_modparams.guc_log_level < 0)
> + if (!i915_modparams.guc_log_level)
> return 0;
>
> /* 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
> - * guc_log_level was < 0 at the time
> - **/
> + * GuC log was disabled at the boot time.
> + */
> if (!guc_log_has_runtime(guc))
> return;
>
> @@ -441,9 +440,10 @@ static int guc_log_late_setup(struct intel_guc *guc)
> lockdep_assert_held(&dev_priv->drm.struct_mutex);
>
> 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,
> - * so do that now.
> + /*
> + * If log was disabled at boot time, then setup needed to handle
> + * log buffer flush interrupts would not have been done yet, so
> + * do that now.
> */
> ret = guc_log_runtime_create(guc);
> if (ret)
> @@ -460,7 +460,7 @@ static int guc_log_late_setup(struct intel_guc *guc)
> guc_log_runtime_destroy(guc);
> err:
> /* logging will remain off */
> - i915_modparams.guc_log_level = -1;
> + i915_modparams.guc_log_level = 0;
> 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);
>
> - if (!USES_GUC_SUBMISSION(dev_priv) ||
> - (i915_modparams.guc_log_level < 0))
> + if (!USES_GUC_SUBMISSION(dev_priv) || !i915_modparams.guc_log_level)
> return;
>
> /* 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);
>
> - 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
> * extra page for others in case for overlap */
> size = (1 + GUC_LOG_DPC_PAGES + 1 +
> @@ -537,7 +533,7 @@ int intel_guc_log_create(struct intel_guc *guc)
>
> guc->log.vma = vma;
>
> - if (i915_modparams.guc_log_level >= 0) {
> + if (i915_modparams.guc_log_level) {
> ret = guc_log_runtime_create(guc);
> if (ret < 0)
> goto err_vma;
> @@ -558,7 +554,7 @@ int intel_guc_log_create(struct intel_guc *guc)
> i915_vma_unpin_and_release(&guc->log.vma);
> err:
> /* logging will be off */
> - i915_modparams.guc_log_level = -1;
> + i915_modparams.guc_log_level = 0;
> return ret;
> }
>
> @@ -582,7 +578,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
> return -EINVAL;
>
> /* 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;
>
> 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) {
> - 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
> - * been enabled. Try again now, just in case.
> + /*
> + * If log was disabled at boot time, then the relay channel file
> + * 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);
> 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 */
> gen9_enable_guc_interrupts(dev_priv);
> } 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
> * which is yet to be captured. So request GuC to update the log
> * 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);
>
> /* As logging is disabled, update log level to reflect that */
> - i915_modparams.guc_log_level = -1;
> + i915_modparams.guc_log_level = 0;
> }
>
> 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)
> {
> - if (!USES_GUC_SUBMISSION(dev_priv) ||
> - (i915_modparams.guc_log_level < 0))
> + if (!USES_GUC_SUBMISSION(dev_priv) || !i915_modparams.guc_log_level)
> return;
>
> mutex_lock(&dev_priv->drm.struct_mutex);
> diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
> index d82ca0f..f78a17b 100644
> --- a/drivers/gpu/drm/i915/intel_uc.c
> +++ b/drivers/gpu/drm/i915/intel_uc.c
> @@ -65,6 +65,21 @@ static int __get_platform_enable_guc(struct drm_i915_private *dev_priv)
> 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
> * @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.
> * Any other modparam value is only monitored against availability of the
> * 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)
> {
> @@ -91,22 +113,48 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
>
> /* 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,
> + DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
> + "enable_guc", 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,
> + DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
> + "enable_guc", i915_modparams.enable_guc,
> !HAS_HUC(dev_priv) ? "no HuC hardware" :
> "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 */
> 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)
> @@ -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)
> {
> - if (!guc->log.vma || i915_modparams.guc_log_level < 0)
> + if (!guc->log.vma || !i915_modparams.guc_log_level)
> return;
>
> 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 (i915_modparams.guc_log_level >= 0)
> + if (i915_modparams.guc_log_level)
> gen9_enable_guc_interrupts(dev_priv);
>
> ret = intel_guc_submission_enable(guc);
More information about the Intel-gfx
mailing list