[Intel-gfx] [PATCH v3 6/8] drm/i915/guc: Combine enable_guc_loading|submission modparams
Chris Wilson
chris at chris-wilson.co.uk
Wed Dec 6 12:19:42 UTC 2017
Quoting Michal Wajdeczko (2017-12-06 12:10:15)
> On Tue, 05 Dec 2017 23:47:21 +0100, Chris Wilson
> <chris at chris-wilson.co.uk> wrote:
>
> > Quoting Michal Wajdeczko (2017-12-05 16:38:42)
> >> -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)) {
> >> - if (i915_modparams.enable_guc_loading > 0 ||
> >> - i915_modparams.enable_guc_submission > 0)
> >> - DRM_INFO("Ignoring GuC options, no hardware\n");
> >> + struct intel_uc_fw *guc_fw = &dev_priv->guc.fw;
> >> + struct intel_uc_fw *huc_fw = &dev_priv->huc.fw;
> >> + int enable_guc = 0;
> >>
> >> - i915_modparams.enable_guc_loading = 0;
> >> - i915_modparams.enable_guc_submission = 0;
> >> - return;
> >> - }
> >> + /* 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;
> >>
> >> - /* A negative value means "use platform default" */
> >> - if (i915_modparams.enable_guc_loading < 0)
> >> - i915_modparams.enable_guc_loading =
> >> HAS_GUC_UCODE(dev_priv);
> >> + /* Any platform specific fine-tuning can be done here */
> >>
> >> - /* Verify firmware version */
> >> - if (i915_modparams.enable_guc_loading) {
> >> - if (!intel_uc_fw_is_selected(&dev_priv->guc.fw))
> >> - i915_modparams.enable_guc_loading = 0;
> >> - }
> >> + return enable_guc;
> >> +}
> >>
> >> - /* Can't enable guc submission without guc loaded */
> >> - if (!i915_modparams.enable_guc_loading)
> >> - i915_modparams.enable_guc_submission = 0;
> >> +/**
> >> + * 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)
> >> +{
> >> + 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" */
> >> - if (i915_modparams.enable_guc_submission < 0)
> >> - i915_modparams.enable_guc_submission =
> >> HAS_GUC_SCHED(dev_priv);
> >> + if (i915_modparams.enable_guc < 0)
> >> + 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");
> >> + }
> >
> > With the intent that after the warning, the uc load will fail and the
> > module load will then abort? Just to be clear.
> >
>
> Yes. As I'm not sure that we should ignore explicit user options and
> pretend that nothing really happen and continue with some fallback.
>
> But I must admit that with this patch we can upset users when module is
> loaded with enable_guc=-1(auto) and driver has corresponding GuC/HuC fw
> definitions but firmware blobs are not present on the target machine.
>
> Then we can wrongly read these options as explicit and abort module load
> due to fw upload failure.
>
> But impact of this issue can be minimized if we try to fetch GuC/HuC
> firmwares much earlier (init_early). Then we can quickly update our
> "preferred" auto options into "available". However, if we fail on any
> later stage, after we decided to enable GuC/Huc, there still will be
> no fallback and we will abort driver load.
That worries me. But not enough to not give a r-b
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
I have nightmares of users bricking their computers just because an
update goes wrong. Or more likely a kernel is updated without the
accompanying linux-firmware. I think we should definitely be testing
module-load with incorrect firmware and ensure we don't leave a system
with a blank-screen-of-doom.
-Chris
More information about the Intel-gfx
mailing list