On Wed, Feb 22, 2017 at 04:30:49PM +0100, Arkadiusz Hiler wrote: > On Wed, Feb 22, 2017 at 12:53:47PM +0000, Chris Wilson wrote: > > On Wed, Feb 22, 2017 at 01:41:25PM +0100, Arkadiusz Hiler wrote: > > > Currently fw->path values can represent one of three possible states: > > > > > > 1) NULL - device without the uC > > > 2) '\0' - device with the uC but have no firmware > > > 3) else - device with the uC and we have firmware > > > > > > Second case is used only to WARN at a later stage. > > > > > > We can WARN right away and merge cases 1 and 2. > > > > > > Code can be even further simplified and common (HuC/GuC logic) happening > > > right before the fetch can be offloaded to the common function. > > > > > > v2: fewer temporary variables, more straightforward flow (M. Wajdeczko) > > > v3: DRM_ERROR instead of WARN (M. Wajdeczko) > > > > > > Cc: Anusha Srivatsa <anusha.srivatsa@xxxxxxxxx> > > > Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > > > Cc: Michal Winiarski <michal.winiarski@xxxxxxxxx> > > > Cc: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx> > > > Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@xxxxxxxxx> > > > --- > > > drivers/gpu/drm/i915/intel_guc_loader.c | 39 +++++++++++---------------------- > > > drivers/gpu/drm/i915/intel_huc.c | 20 +++++------------ > > > drivers/gpu/drm/i915/intel_uc.c | 5 +++-- > > > 3 files changed, 22 insertions(+), 42 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c > > > index 549a254..336e97d 100644 > > > --- a/drivers/gpu/drm/i915/intel_guc_loader.c > > > +++ b/drivers/gpu/drm/i915/intel_guc_loader.c > > > @@ -433,12 +433,8 @@ int intel_guc_init_hw(struct drm_i915_private *dev_priv) > > > intel_uc_fw_status_repr(guc_fw->load_status)); > > > > > > if (fw_path == NULL) { > > > - /* Device is known to have no uCode (e.g. no GuC) */ > > > + /* We do not have uCode for the device */ > > > return -ENXIO; > > > - } else if (*fw_path == '\0') { > > > - /* Device has a GuC but we don't know what f/w to load? */ > > > - WARN(1, "No GuC firmware known for this platform!\n"); > > > - return -ENODEV; > > > } > > > > > > /* Fetch failed, or already fetched but failed to load? */ > > > @@ -474,7 +470,6 @@ int intel_guc_init_hw(struct drm_i915_private *dev_priv) > > > return 0; > > > } > > > > > > - > > > /** > > > * intel_guc_fetch_fw() - determine and fetch firmware > > > * @guc: intel_guc struct > > > @@ -487,39 +482,31 @@ int intel_guc_init_hw(struct drm_i915_private *dev_priv) > > > void intel_guc_fetch_fw(struct intel_guc *guc) > > > { > > > struct drm_i915_private *dev_priv = guc_to_i915(guc); > > > - const char *fw_path; > > > > > > - if (!HAS_GUC_UCODE(dev_priv)) { > > > - fw_path = NULL; > > > - } else if (IS_SKYLAKE(dev_priv)) { > > > - fw_path = I915_SKL_GUC_UCODE; > > > + guc->fw.path = NULL; > > > + guc->fw.fetch_status = INTEL_UC_FIRMWARE_NONE; > > > + guc->fw.load_status = INTEL_UC_FIRMWARE_NONE; > > > + guc->fw.fw = INTEL_UC_FW_TYPE_GUC; > > > + > > > + if (IS_SKYLAKE(dev_priv)) { > > > + guc->fw.path = I915_SKL_GUC_UCODE; > > > guc->fw.major_ver_wanted = SKL_FW_MAJOR; > > > guc->fw.minor_ver_wanted = SKL_FW_MINOR; > > > } else if (IS_BROXTON(dev_priv)) { > > > - fw_path = I915_BXT_GUC_UCODE; > > > + guc->fw.path = I915_BXT_GUC_UCODE; > > > guc->fw.major_ver_wanted = BXT_FW_MAJOR; > > > guc->fw.minor_ver_wanted = BXT_FW_MINOR; > > > } else if (IS_KABYLAKE(dev_priv)) { > > > - fw_path = I915_KBL_GUC_UCODE; > > > + guc->fw.path = I915_KBL_GUC_UCODE; > > > guc->fw.major_ver_wanted = KBL_FW_MAJOR; > > > guc->fw.minor_ver_wanted = KBL_FW_MINOR; > > > } else { > > > - fw_path = ""; /* unknown device */ > > > + DRM_ERROR("No GuC firmware known for platform with GuC!\n"); > > > + i915.enable_guc_loading = 0; > > > + return; > > > > Now plan for having fw_path overriden by a i915_param.guc_firmware. > > > > Perhaps something like > > if (i915_param.guc_firmware) { > > guc->fw.path = i915_param.guc_firmware; /* needs 0400! */ > > guc->fw.major_ver_wanted = -1; > > guc->fw.minor_ver_wanted = -1; > > } else if (IS_SKYLAKE.... > > works? > > Sorry, I do not quite understand the comment. Can you elaborate? Nevermind, got it. LGTM, but for it to fully work we need to make uc_fetch_fw (or however it will end up being named) aware that -1 have special meaning. Now the version cross-check looks like that: if (uc_fw->major_ver_found != uc_fw->major_ver_wanted || uc_fw->minor_ver_found < uc_fw->minor_ver_wanted) { -- Cheers, Arek _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx