Message ID | 20180110160524.28068-1-michal.wajdeczko@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 1/10/2018 9:35 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 USES_GUC and DRM_I915_DEBUG) "depends on HAS_GUC, USES_GUC, DRM_I915_DEBUG and DRM_I915_DEBUG_GEM" s/intel_uc_is_using_guc()/USES_GUC seeing some more intel_uc_is_using_* instead of macro usage USES_* > 0: disabled > 1: enabled (severity level 0 = min) > 2: enabled (severity level 1) > 3: enabled (severity level 2) > 4: enabled (severity level 3 = max) > > 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> > --- > 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 | 51 ++++++++++++++++++++++++++++++++++-- > 4 files changed, 87 insertions(+), 35 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..2227236 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) > +{ making this inline would be good i guess. > + 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 > 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 <snip> > > @@ -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; reading the log level from i915_guc_log_control_get debugfs should decrement guc_log_level by 1. > > - /* 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..fd39c06 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) > { > @@ -105,8 +127,33 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv) > "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); > + > + DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n", > + i915_modparams.guc_log_level, > + yesno(i915_modparams.guc_log_level > 0), > + i915_modparams.guc_log_level - 1); > + I think this DRM_DEBUG_DRIVER should be moved after all sanitization. > + if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc()) { > + DRM_WARN("Incompatible option ignored: guc_log_level=%d, %s!\n", > + 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 ignored: guc_log_level=%d, %s!\n", "Incompatible option overridden"? as we are letting this through with max verbosity which I think is not ignoring :) > + i915_modparams.guc_log_level, "verbosity too high"); > + i915_modparams.guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX; > + } > + > /* 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 +199,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 +369,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); Thanks Sagar
On Thu, 11 Jan 2018 06:52:18 +0100, Sagar Arun Kamble <sagar.a.kamble@intel.com> wrote: > > > On 1/10/2018 9:35 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 USES_GUC and DRM_I915_DEBUG) > "depends on HAS_GUC, USES_GUC, DRM_I915_DEBUG and DRM_I915_DEBUG_GEM" I should write "(depends on platform and Kconfig.debug settings)" as actual condition may change in the near feature. > s/intel_uc_is_using_guc()/USES_GUC > seeing some more intel_uc_is_using_* instead of macro usage USES_* It was by design, as in intel_uc_sanitize_options() function we are using only HAS_xxx macros and instead of USES_xxx we call intel_uc_is_xxx helpers directly. >> 0: disabled >> 1: enabled (severity level 0 = min) >> 2: enabled (severity level 1) >> 3: enabled (severity level 2) >> 4: enabled (severity level 3 = max) >> >> 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> >> --- >> 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 | 51 >> ++++++++++++++++++++++++++++++++++-- >> 4 files changed, 87 insertions(+), 35 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..2227236 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) >> +{ > making this inline would be good i guess. No need to do so. Compiler will take care of it as needed (as this function is already marked as static) >> + 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 > 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 > <snip> >> @@ -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; > reading the log level from i915_guc_log_control_get debugfs should > decrement guc_log_level by 1. That's the other story. If I read our code right, we were using different format for get: (0=level 0, 1=level 1, ... 3=level 3) and set: (0=disabled, 1=enabled level 0, 9=enabled level 1, 11=enabled level 2... I think we can change that to use always (0, 1..4) and hide internal layout of the GuC command from the user. >> - /* 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..fd39c06 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) >> { >> @@ -105,8 +127,33 @@ void intel_uc_sanitize_options(struct >> drm_i915_private *dev_priv) >> "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); >> + >> + DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n", >> + i915_modparams.guc_log_level, >> + yesno(i915_modparams.guc_log_level > 0), >> + i915_modparams.guc_log_level - 1); >> + > I think this DRM_DEBUG_DRIVER should be moved after all sanitization. Yes. I copied that from above enable_guc sanitization but forget that in above code there is no override :) >> + if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc()) { >> + DRM_WARN("Incompatible option ignored: guc_log_level=%d, %s!\n", >> + 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 ignored: guc_log_level=%d, %s!\n", > "Incompatible option overridden"? as we are letting this through with > max verbosity which I think is not ignoring :) sure >> + i915_modparams.guc_log_level, "verbosity too high"); >> + i915_modparams.guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX; >> + } >> + >> /* 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 +199,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 +369,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); > > Thanks > Sagar Thanks, Michal
On 1/11/2018 2:54 PM, Michal Wajdeczko wrote: > On Thu, 11 Jan 2018 06:52:18 +0100, Sagar Arun Kamble > <sagar.a.kamble@intel.com> wrote: > >> >> >> On 1/10/2018 9:35 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 USES_GUC and DRM_I915_DEBUG) >> "depends on HAS_GUC, USES_GUC, DRM_I915_DEBUG and DRM_I915_DEBUG_GEM" > > I should write "(depends on platform and Kconfig.debug settings)" as > actual condition may change in the near feature. > Yes >> s/intel_uc_is_using_guc()/USES_GUC >> seeing some more intel_uc_is_using_* instead of macro usage USES_* > > It was by design, as in intel_uc_sanitize_options() function we are > using only HAS_xxx macros and instead of USES_xxx we call intel_uc_is_xxx > helpers directly. > Got it >>> 0: disabled >>> 1: enabled (severity level 0 = min) >>> 2: enabled (severity level 1) >>> 3: enabled (severity level 2) >>> 4: enabled (severity level 3 = max) >>> >>> 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> >>> --- >>> 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 | 51 >>> ++++++++++++++++++++++++++++++++++-- >>> 4 files changed, 87 insertions(+), 35 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..2227236 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) >>> +{ >> making this inline would be good i guess. > > No need to do so. Compiler will take care of it as needed (as this > function is already marked as static) > >>> + 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 > 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 >> <snip> >>> @@ -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; >> reading the log level from i915_guc_log_control_get debugfs should >> decrement guc_log_level by 1. > > That's the other story. > If I read our code right, we were using different format for get: > (0=level 0, 1=level 1, ... 3=level 3) > and set: > (0=disabled, 1=enabled level 0, 9=enabled level 1, 11=enabled level 2... > > I think we can change that to use always (0, 1..4) and hide internal > layout of the GuC command from the user. > Yes. makes sense to hide internals. will then need to update intel_guc_logger as well. > >>> - /* 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..fd39c06 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) >>> { >>> @@ -105,8 +127,33 @@ void intel_uc_sanitize_options(struct >>> drm_i915_private *dev_priv) >>> "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); >>> + >>> + DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n", >>> + i915_modparams.guc_log_level, >>> + yesno(i915_modparams.guc_log_level > 0), >>> + i915_modparams.guc_log_level - 1); >>> + >> I think this DRM_DEBUG_DRIVER should be moved after all sanitization. > > Yes. I copied that from above enable_guc sanitization but forget that > in above code there is no override :) > >>> + if (i915_modparams.guc_log_level > 0 && >>> !intel_uc_is_using_guc()) { >>> + DRM_WARN("Incompatible option ignored: guc_log_level=%d, >>> %s!\n", >>> + 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 ignored: guc_log_level=%d, >>> %s!\n", >> "Incompatible option overridden"? as we are letting this through with >> max verbosity which I think is not ignoring :) > > sure > >>> + i915_modparams.guc_log_level, "verbosity too high"); >>> + i915_modparams.guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX; >>> + } >>> + >>> /* 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 +199,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 +369,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); >> >> Thanks >> Sagar > > Thanks, > Michal Thanks Sagar
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..2227236 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 > 0) 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..fd39c06 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) { @@ -105,8 +127,33 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv) "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); + + DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n", + i915_modparams.guc_log_level, + yesno(i915_modparams.guc_log_level > 0), + i915_modparams.guc_log_level - 1); + + if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc()) { + DRM_WARN("Incompatible option ignored: guc_log_level=%d, %s!\n", + 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 ignored: guc_log_level=%d, %s!\n", + i915_modparams.guc_log_level, "verbosity too high"); + i915_modparams.guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX; + } + /* 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 +199,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 +369,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);
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 USES_GUC and DRM_I915_DEBUG) 0: disabled 1: enabled (severity level 0 = min) 2: enabled (severity level 1) 3: enabled (severity level 2) 4: enabled (severity level 3 = max) 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> --- 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 | 51 ++++++++++++++++++++++++++++++++++-- 4 files changed, 87 insertions(+), 35 deletions(-)