int intel_uc_init(struct drm_i915_private *i915) { struct intel_guc *guc = &i915->guc; struct intel_huc *huc = &i915->huc; int ret; if (!USES_GUC(i915)) return 0; if (!HAS_GUC(i915)) return -ENODEV; /* XXX: GuC submission is unavailable for now */ GEM_BUG_ON(USES_GUC_SUBMISSION(i915)); ret = intel_guc_init(guc); if (ret) return ret; if (USES_HUC(i915)) { ret = intel_huc_init(huc); if (ret) goto err_guc; } if (USES_GUC_SUBMISSION(i915)) { /* * This is stuff we need to have available at fw load time * if we are planning to enable submission later */ ret = intel_guc_submission_init(guc); if (ret) goto err_huc; } return 0; err_huc: if (USES_HUC(i915)) intel_huc_fini(huc); err_guc: intel_guc_fini(guc); return ret; }
int intel_guc_live_selftest(struct drm_i915_private *dev_priv) { static const struct i915_subtest tests[] = { SUBTEST(igt_guc_clients), SUBTEST(igt_guc_doorbells), }; if (!USES_GUC_SUBMISSION(dev_priv)) return 0; return i915_subtests(tests, dev_priv); }
void intel_uc_fini_hw(struct drm_i915_private *i915) { struct intel_guc *guc = &i915->guc; if (!intel_guc_is_loaded(guc)) return; GEM_BUG_ON(!HAS_GUC(i915)); if (USES_GUC_SUBMISSION(i915)) intel_guc_submission_disable(guc); guc_disable_communication(guc); __uc_sanitize(i915); }
void intel_uc_fini(struct drm_i915_private *i915) { struct intel_guc *guc = &i915->guc; if (!USES_GUC(i915)) return; GEM_BUG_ON(!HAS_GUC(i915)); if (USES_GUC_SUBMISSION(i915)) intel_guc_submission_fini(guc); if (USES_HUC(i915)) intel_huc_fini(&i915->huc); intel_guc_fini(guc); }
/** * intel_gvt_init - initialize GVT components * @dev_priv: drm i915 private data * * This function is called at the initialization stage to create a GVT device. * * Returns: * Zero on success, negative error code if failed. * */ int intel_gvt_init(struct drm_i915_private *dev_priv) { int ret; if (i915_inject_load_failure()) return -ENODEV; if (!i915_modparams.enable_gvt) { DRM_DEBUG_DRIVER("GVT-g is disabled by kernel params\n"); return 0; } if (USES_GUC_SUBMISSION(dev_priv)) { DRM_ERROR("i915 GVT-g loading failed due to Graphics virtualization is not yet supported with GuC submission\n"); return -EIO; } /* * We're not in host or fail to find a MPT module, disable GVT-g */ ret = intel_gvt_init_host(); if (ret) { DRM_DEBUG_DRIVER("Not in host or MPT modules not found\n"); goto bail; } ret = intel_gvt_init_device(dev_priv); if (ret) { DRM_DEBUG_DRIVER("Fail to init GVT device\n"); goto bail; } return 0; bail: i915_modparams.enable_gvt = 0; return 0; }
int intel_uc_init_hw(struct drm_i915_private *i915) { struct intel_guc *guc = &i915->guc; struct intel_huc *huc = &i915->huc; int ret, attempts; if (!USES_GUC(i915)) return 0; GEM_BUG_ON(!HAS_GUC(i915)); guc_reset_interrupts(guc); /* WaEnableuKernelHeaderValidFix:skl */ /* WaEnableGuCBootHashCheckNotSet:skl,bxt,kbl */ if (IS_GEN(i915, 9)) attempts = 3; else attempts = 1; while (attempts--) { /* * Always reset the GuC just before (re)loading, so * that the state and timing are fairly predictable */ ret = __intel_uc_reset_hw(i915); if (ret) goto err_out; if (USES_HUC(i915)) { ret = intel_huc_fw_upload(huc); if (ret) goto err_out; } intel_guc_ads_reset(guc); intel_guc_init_params(guc); ret = intel_guc_fw_upload(guc); if (ret == 0) break; DRM_DEBUG_DRIVER("GuC fw load failed: %d; will reset and " "retry %d more time(s)\n", ret, attempts); } /* Did we succeded or run out of retries? */ if (ret) goto err_log_capture; ret = guc_enable_communication(guc); if (ret) goto err_log_capture; if (USES_HUC(i915)) { ret = intel_huc_auth(huc); if (ret) goto err_communication; } ret = intel_guc_sample_forcewake(guc); if (ret) goto err_communication; if (USES_GUC_SUBMISSION(i915)) { ret = intel_guc_submission_enable(guc); if (ret) goto err_communication; } dev_info(i915->drm.dev, "GuC firmware version %u.%u\n", guc->fw.major_ver_found, guc->fw.minor_ver_found); dev_info(i915->drm.dev, "GuC submission %s\n", enableddisabled(USES_GUC_SUBMISSION(i915))); dev_info(i915->drm.dev, "HuC %s\n", enableddisabled(USES_HUC(i915))); return 0; /* * We've failed to load the firmware :( */ err_communication: guc_disable_communication(guc); err_log_capture: guc_capture_load_err_log(guc); err_out: __uc_sanitize(i915); /* * Note that there is no fallback as either user explicitly asked for * the GuC or driver default option was to run with the GuC enabled. */ if (GEM_WARN_ON(ret == -EIO)) ret = -EINVAL; dev_err(i915->drm.dev, "GuC initialization failed %d\n", ret); return ret; }