void intel_uc_sanitize_options(struct drm_i915_private *dev_priv) { if (!HAS_GUC(dev_priv)) { if (i915.enable_guc_loading > 0 || i915.enable_guc_submission > 0) DRM_INFO("Ignoring GuC options, no hardware\n"); i915.enable_guc_loading = 0; i915.enable_guc_submission = 0; return; } /* A negative value means "use platform default" */ if (i915.enable_guc_loading < 0) i915.enable_guc_loading = HAS_GUC_UCODE(dev_priv); /* Verify firmware version */ if (i915.enable_guc_loading) { if (HAS_HUC_UCODE(dev_priv)) intel_huc_select_fw(&dev_priv->huc); if (intel_guc_select_fw(&dev_priv->guc)) i915.enable_guc_loading = 0; } /* Can't enable guc submission without guc loaded */ if (!i915.enable_guc_loading) i915.enable_guc_submission = 0; /* A negative value means "use platform default" */ if (i915.enable_guc_submission < 0) i915.enable_guc_submission = HAS_GUC_SCHED(dev_priv); }
static void guc_fw_select(struct intel_uc_fw *guc_fw) { struct intel_guc *guc = container_of(guc_fw, struct intel_guc, fw); struct drm_i915_private *dev_priv = guc_to_i915(guc); GEM_BUG_ON(guc_fw->type != INTEL_UC_FW_TYPE_GUC); if (!HAS_GUC(dev_priv)) return; if (i915_modparams.guc_firmware_path) { guc_fw->path = i915_modparams.guc_firmware_path; guc_fw->major_ver_wanted = 0; guc_fw->minor_ver_wanted = 0; } else 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)) { 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) || IS_COFFEELAKE(dev_priv)) { guc_fw->path = I915_KBL_GUC_UCODE; guc_fw->major_ver_wanted = KBL_FW_MAJOR; guc_fw->minor_ver_wanted = KBL_FW_MINOR; } else { DRM_WARN("%s: No firmware known for this platform!\n", intel_uc_fw_type_repr(guc_fw->type)); } }
static void __uc_sanitize(struct drm_i915_private *i915) { struct intel_guc *guc = &i915->guc; struct intel_huc *huc = &i915->huc; GEM_BUG_ON(!HAS_GUC(i915)); intel_huc_sanitize(huc); intel_guc_sanitize(guc); __intel_uc_reset_hw(i915); }
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); }
static int __get_default_guc_log_level(struct drm_i915_private *i915) { int guc_log_level; if (!HAS_GUC(i915) || !intel_uc_is_using_guc(i915)) guc_log_level = GUC_LOG_LEVEL_DISABLED; else if (IS_ENABLED(CONFIG_DRM_I915_DEBUG) || IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) guc_log_level = GUC_LOG_LEVEL_MAX; else guc_log_level = GUC_LOG_LEVEL_NON_VERBOSE; /* Any platform specific fine-tuning can be done here */ return guc_log_level; }
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); }
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; }
static void guc_fw_select(struct intel_uc_fw *guc_fw) { struct intel_guc *guc = container_of(guc_fw, struct intel_guc, fw); struct drm_i915_private *i915 = guc_to_i915(guc); GEM_BUG_ON(guc_fw->type != INTEL_UC_FW_TYPE_GUC); if (!HAS_GUC(i915)) return; if (i915_modparams.guc_firmware_path) { guc_fw->path = i915_modparams.guc_firmware_path; guc_fw->major_ver_wanted = 0; guc_fw->minor_ver_wanted = 0; } else if (IS_ICELAKE(i915)) { guc_fw->path = ICL_GUC_FIRMWARE_PATH; guc_fw->major_ver_wanted = ICL_GUC_FW_MAJOR; guc_fw->minor_ver_wanted = ICL_GUC_FW_MINOR; } else if (IS_GEMINILAKE(i915)) { guc_fw->path = GLK_GUC_FIRMWARE_PATH; guc_fw->major_ver_wanted = GLK_GUC_FW_MAJOR; guc_fw->minor_ver_wanted = GLK_GUC_FW_MINOR; } else if (IS_KABYLAKE(i915) || IS_COFFEELAKE(i915)) { guc_fw->path = KBL_GUC_FIRMWARE_PATH; guc_fw->major_ver_wanted = KBL_GUC_FW_MAJOR; guc_fw->minor_ver_wanted = KBL_GUC_FW_MINOR; } else if (IS_BROXTON(i915)) { guc_fw->path = BXT_GUC_FIRMWARE_PATH; guc_fw->major_ver_wanted = BXT_GUC_FW_MAJOR; guc_fw->minor_ver_wanted = BXT_GUC_FW_MINOR; } else if (IS_SKYLAKE(i915)) { guc_fw->path = SKL_GUC_FIRMWARE_PATH; guc_fw->major_ver_wanted = SKL_GUC_FW_MAJOR; guc_fw->minor_ver_wanted = SKL_GUC_FW_MINOR; } }
/* * Create as many clients as number of doorbells. Note that there's already * client(s)/doorbell(s) created during driver load, but this test creates * its own and do not interact with the existing ones. */ static int igt_guc_doorbells(void *arg) { struct drm_i915_private *dev_priv = arg; struct intel_guc *guc; int i, err = 0; u16 db_id; GEM_BUG_ON(!HAS_GUC(dev_priv)); mutex_lock(&dev_priv->drm.struct_mutex); intel_runtime_pm_get(dev_priv); guc = &dev_priv->guc; if (!guc) { pr_err("No guc object!\n"); err = -EINVAL; goto unlock; } err = check_all_doorbells(guc); if (err) goto unlock; for (i = 0; i < ATTEMPTS; i++) { clients[i] = guc_client_alloc(dev_priv, INTEL_INFO(dev_priv)->ring_mask, i % GUC_CLIENT_PRIORITY_NUM, dev_priv->kernel_context); if (!clients[i]) { pr_err("[%d] No guc client\n", i); err = -EINVAL; goto out; } if (IS_ERR(clients[i])) { if (PTR_ERR(clients[i]) != -ENOSPC) { pr_err("[%d] unexpected error\n", i); err = PTR_ERR(clients[i]); goto out; } if (available_dbs(guc, i % GUC_CLIENT_PRIORITY_NUM)) { pr_err("[%d] non-db related alloc fail\n", i); err = -EINVAL; goto out; } /* expected, ran out of dbs for this client type */ continue; } /* * The check below is only valid because we keep a doorbell * assigned during the whole life of the client. */ if (clients[i]->stage_id >= GUC_NUM_DOORBELLS) { pr_err("[%d] more clients than doorbells (%d >= %d)\n", i, clients[i]->stage_id, GUC_NUM_DOORBELLS); err = -EINVAL; goto out; } err = validate_client(clients[i], i % GUC_CLIENT_PRIORITY_NUM, false); if (err) { pr_err("[%d] client_alloc sanity check failed!\n", i); err = -EINVAL; goto out; } db_id = clients[i]->doorbell_id; err = __guc_client_enable(clients[i]); if (err) { pr_err("[%d] Failed to create a doorbell\n", i); goto out; } /* doorbell id shouldn't change, we are holding the mutex */ if (db_id != clients[i]->doorbell_id) { pr_err("[%d] doorbell id changed (%d != %d)\n", i, db_id, clients[i]->doorbell_id); err = -EINVAL; goto out; } err = check_all_doorbells(guc); if (err) goto out; err = ring_doorbell_nop(clients[i]); if (err) goto out; } out: for (i = 0; i < ATTEMPTS; i++) if (!IS_ERR_OR_NULL(clients[i])) { __guc_client_disable(clients[i]); guc_client_free(clients[i]); } unlock: intel_runtime_pm_put(dev_priv); mutex_unlock(&dev_priv->drm.struct_mutex); return err; }
/* * Check that we're able to synchronize guc_clients with their doorbells * * We're creating clients and reserving doorbells once, at module load. During * module lifetime, GuC, doorbell HW, and i915 state may go out of sync due to * GuC being reset. In other words - GuC clients are still around, but the * status of their doorbells may be incorrect. This is the reason behind * validating that the doorbells status expected by the driver matches what the * GuC/HW have. */ static int igt_guc_clients(void *args) { struct drm_i915_private *dev_priv = args; struct intel_guc *guc; int err = 0; GEM_BUG_ON(!HAS_GUC(dev_priv)); mutex_lock(&dev_priv->drm.struct_mutex); intel_runtime_pm_get(dev_priv); guc = &dev_priv->guc; if (!guc) { pr_err("No guc object!\n"); err = -EINVAL; goto unlock; } err = check_all_doorbells(guc); if (err) goto unlock; /* * Get rid of clients created during driver load because the test will * recreate them. */ guc_clients_disable(guc); guc_clients_destroy(guc); if (guc->execbuf_client || guc->preempt_client) { pr_err("guc_clients_destroy lied!\n"); err = -EINVAL; goto unlock; } err = guc_clients_create(guc); if (err) { pr_err("Failed to create clients\n"); goto unlock; } GEM_BUG_ON(!guc->execbuf_client); err = validate_client(guc->execbuf_client, GUC_CLIENT_PRIORITY_KMD_NORMAL, false); if (err) { pr_err("execbug client validation failed\n"); goto out; } if (guc->preempt_client) { err = validate_client(guc->preempt_client, GUC_CLIENT_PRIORITY_KMD_HIGH, true); if (err) { pr_err("preempt client validation failed\n"); goto out; } } /* each client should now have reserved a doorbell */ if (!has_doorbell(guc->execbuf_client) || (guc->preempt_client && !has_doorbell(guc->preempt_client))) { pr_err("guc_clients_create didn't reserve doorbells\n"); err = -EINVAL; goto out; } /* Now enable the clients */ guc_clients_enable(guc); /* each client should now have received a doorbell */ if (!client_doorbell_in_sync(guc->execbuf_client) || !client_doorbell_in_sync(guc->preempt_client)) { pr_err("failed to initialize the doorbells\n"); err = -EINVAL; goto out; } /* * Basic test - an attempt to reallocate a valid doorbell to the * client it is currently assigned should not cause a failure. */ err = create_doorbell(guc->execbuf_client); out: /* * Leave clean state for other test, plus the driver always destroy the * clients during unload. */ guc_clients_disable(guc); guc_clients_destroy(guc); guc_clients_create(guc); guc_clients_enable(guc); unlock: intel_runtime_pm_put(dev_priv); mutex_unlock(&dev_priv->drm.struct_mutex); return err; }
/* * Check that we're able to synchronize guc_clients with their doorbells * * We're creating clients and reserving doorbells once, at module load. During * module lifetime, GuC, doorbell HW, and i915 state may go out of sync due to * GuC being reset. In other words - GuC clients are still around, but the * status of their doorbells may be incorrect. This is the reason behind * validating that the doorbells status expected by the driver matches what the * GuC/HW have. */ static int igt_guc_clients(void *args) { struct drm_i915_private *dev_priv = args; struct intel_guc *guc; int err = 0; GEM_BUG_ON(!HAS_GUC(dev_priv)); mutex_lock(&dev_priv->drm.struct_mutex); guc = &dev_priv->guc; if (!guc) { pr_err("No guc object!\n"); err = -EINVAL; goto unlock; } err = check_all_doorbells(guc); if (err) goto unlock; /* * Get rid of clients created during driver load because the test will * recreate them. */ guc_clients_destroy(guc); if (guc->execbuf_client || guc->preempt_client) { pr_err("guc_clients_destroy lied!\n"); err = -EINVAL; goto unlock; } err = guc_clients_create(guc); if (err) { pr_err("Failed to create clients\n"); goto unlock; } GEM_BUG_ON(!guc->execbuf_client); GEM_BUG_ON(!guc->preempt_client); err = validate_client(guc->execbuf_client, GUC_CLIENT_PRIORITY_KMD_NORMAL, false); if (err) { pr_err("execbug client validation failed\n"); goto out; } err = validate_client(guc->preempt_client, GUC_CLIENT_PRIORITY_KMD_HIGH, true); if (err) { pr_err("preempt client validation failed\n"); goto out; } /* each client should now have reserved a doorbell */ if (!has_doorbell(guc->execbuf_client) || !has_doorbell(guc->preempt_client)) { pr_err("guc_clients_create didn't reserve doorbells\n"); err = -EINVAL; goto out; } /* Now create the doorbells */ guc_clients_doorbell_init(guc); /* each client should now have received a doorbell */ if (!client_doorbell_in_sync(guc->execbuf_client) || !client_doorbell_in_sync(guc->preempt_client)) { pr_err("failed to initialize the doorbells\n"); err = -EINVAL; goto out; } /* * Basic test - an attempt to reallocate a valid doorbell to the * client it is currently assigned should not cause a failure. */ err = guc_clients_doorbell_init(guc); if (err) goto out; /* * Negative test - a client with no doorbell (invalid db id). * After destroying the doorbell, the db id is changed to * GUC_DOORBELL_INVALID and the firmware will reject any attempt to * allocate a doorbell with an invalid id (db has to be reserved before * allocation). */ destroy_doorbell(guc->execbuf_client); if (client_doorbell_in_sync(guc->execbuf_client)) { pr_err("destroy db did not work\n"); err = -EINVAL; goto out; } unreserve_doorbell(guc->execbuf_client); err = guc_clients_doorbell_init(guc); if (err != -EIO) { pr_err("unexpected (err = %d)", err); goto out; } if (!available_dbs(guc, guc->execbuf_client->priority)) { pr_err("doorbell not available when it should\n"); err = -EIO; goto out; } /* clean after test */ err = reserve_doorbell(guc->execbuf_client); if (err) { pr_err("failed to reserve back the doorbell back\n"); } err = create_doorbell(guc->execbuf_client); if (err) { pr_err("recreate doorbell failed\n"); goto out; } out: /* * Leave clean state for other test, plus the driver always destroy the * clients during unload. */ destroy_doorbell(guc->execbuf_client); destroy_doorbell(guc->preempt_client); guc_clients_destroy(guc); guc_clients_create(guc); guc_clients_doorbell_init(guc); unlock: mutex_unlock(&dev_priv->drm.struct_mutex); return err; }
static struct i915_gem_context * __create_hw_context(struct drm_i915_private *dev_priv, struct drm_i915_file_private *file_priv) { struct i915_gem_context *ctx; int ret; ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); if (ctx == NULL) return ERR_PTR(-ENOMEM); ret = assign_hw_id(dev_priv, &ctx->hw_id); if (ret) { kfree(ctx); return ERR_PTR(ret); } kref_init(&ctx->ref); list_add_tail(&ctx->link, &dev_priv->context_list); ctx->i915 = dev_priv; if (dev_priv->hw_context_size) { struct drm_i915_gem_object *obj; struct i915_vma *vma; obj = alloc_context_obj(dev_priv, dev_priv->hw_context_size); if (IS_ERR(obj)) { ret = PTR_ERR(obj); goto err_out; } vma = i915_vma_instance(obj, &dev_priv->ggtt.base, NULL); if (IS_ERR(vma)) { i915_gem_object_put(obj); ret = PTR_ERR(vma); goto err_out; } ctx->engine[RCS].state = vma; } /* Default context will never have a file_priv */ ret = DEFAULT_CONTEXT_HANDLE; if (file_priv) { ret = idr_alloc(&file_priv->context_idr, ctx, DEFAULT_CONTEXT_HANDLE, 0, GFP_KERNEL); if (ret < 0) goto err_out; } ctx->user_handle = ret; ctx->file_priv = file_priv; if (file_priv) { ctx->pid = get_task_pid(current, PIDTYPE_PID); ctx->name = kasprintf(GFP_KERNEL, "%s[%d]/%x", current->comm, pid_nr(ctx->pid), ctx->user_handle); if (!ctx->name) { ret = -ENOMEM; goto err_pid; } } /* NB: Mark all slices as needing a remap so that when the context first * loads it will restore whatever remap state already exists. If there * is no remap info, it will be a NOP. */ ctx->remap_slice = ALL_L3_SLICES(dev_priv); i915_gem_context_set_bannable(ctx); ctx->ring_size = 4 * PAGE_SIZE; ctx->desc_template = default_desc_template(dev_priv, dev_priv->mm.aliasing_ppgtt); /* GuC requires the ring to be placed above GUC_WOPCM_TOP. If GuC is not * present or not in use we still need a small bias as ring wraparound * at offset 0 sometimes hangs. No idea why. */ if (HAS_GUC(dev_priv) && i915.enable_guc_loading) ctx->ggtt_offset_bias = GUC_WOPCM_TOP; else ctx->ggtt_offset_bias = I915_GTT_PAGE_SIZE; return ctx; err_pid: put_pid(ctx->pid); idr_remove(&file_priv->context_idr, ctx->user_handle); err_out: context_close(ctx); return ERR_PTR(ret); }
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; }
/** * sanitize_options_early - sanitize uC related modparam options * @i915: 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. * * 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)". */ static void sanitize_options_early(struct drm_i915_private *i915) { struct intel_uc_fw *guc_fw = &i915->guc.fw; struct intel_uc_fw *huc_fw = &i915->huc.fw; /* A negative value means "use platform default" */ if (i915_modparams.enable_guc < 0) i915_modparams.enable_guc = __get_platform_enable_guc(i915); DRM_DEBUG_DRIVER("enable_guc=%d (submission:%s huc:%s)\n", i915_modparams.enable_guc, yesno(intel_uc_is_using_guc_submission(i915)), yesno(intel_uc_is_using_huc(i915))); /* Verify GuC firmware availability */ if (intel_uc_is_using_guc(i915) && !intel_uc_fw_is_selected(guc_fw)) { DRM_WARN("Incompatible option detected: %s=%d, %s!\n", "enable_guc", i915_modparams.enable_guc, !HAS_GUC(i915) ? "no GuC hardware" : "no GuC firmware"); } /* Verify HuC firmware availability */ if (intel_uc_is_using_huc(i915) && !intel_uc_fw_is_selected(huc_fw)) { DRM_WARN("Incompatible option detected: %s=%d, %s!\n", "enable_guc", i915_modparams.enable_guc, !HAS_HUC(i915) ? "no HuC hardware" : "no HuC firmware"); } /* XXX: GuC submission is unavailable for now */ if (intel_uc_is_using_guc_submission(i915)) { DRM_INFO("Incompatible option detected: %s=%d, %s!\n", "enable_guc", i915_modparams.enable_guc, "GuC submission not supported"); DRM_INFO("Switching to non-GuC submission mode!\n"); i915_modparams.enable_guc &= ~ENABLE_GUC_SUBMISSION; } /* 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(i915); if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc(i915)) { DRM_WARN("Incompatible option detected: %s=%d, %s!\n", "guc_log_level", i915_modparams.guc_log_level, !HAS_GUC(i915) ? "no GuC hardware" : "GuC not enabled"); i915_modparams.guc_log_level = 0; } if (i915_modparams.guc_log_level > GUC_LOG_LEVEL_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 = GUC_LOG_LEVEL_MAX; } DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s, verbose:%s, verbosity:%d)\n", i915_modparams.guc_log_level, yesno(i915_modparams.guc_log_level), yesno(GUC_LOG_LEVEL_IS_VERBOSE(i915_modparams.guc_log_level)), GUC_LOG_LEVEL_TO_VERBOSITY(i915_modparams.guc_log_level)); /* Make sure that sanitization was done */ GEM_BUG_ON(i915_modparams.enable_guc < 0); GEM_BUG_ON(i915_modparams.guc_log_level < 0); }