diff options
-rw-r--r-- | drivers/gpu/drm/xe/xe_module.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_module.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_uc_fw.c | 30 |
3 files changed, 41 insertions, 1 deletions
diff --git a/drivers/gpu/drm/xe/xe_module.c b/drivers/gpu/drm/xe/xe_module.c index d76fabe056d0..82817a46f887 100644 --- a/drivers/gpu/drm/xe/xe_module.c +++ b/drivers/gpu/drm/xe/xe_module.c @@ -27,6 +27,16 @@ int xe_guc_log_level = 5; module_param_named(guc_log_level, xe_guc_log_level, int, 0600); MODULE_PARM_DESC(guc_log_level, "GuC firmware logging level (0=disable, 1..5=enable with verbosity min..max)"); +char *xe_guc_firmware_path; +module_param_named_unsafe(guc_firmware_path, xe_guc_firmware_path, charp, 0400); +MODULE_PARM_DESC(guc_firmware_path, + "GuC firmware path to use instead of the default one"); + +char *xe_huc_firmware_path; +module_param_named_unsafe(huc_firmware_path, xe_huc_firmware_path, charp, 0400); +MODULE_PARM_DESC(huc_firmware_path, + "HuC firmware path to use instead of the default one - empty string disables"); + char *xe_param_force_probe = CONFIG_DRM_XE_FORCE_PROBE; module_param_named_unsafe(force_probe, xe_param_force_probe, charp, 0400); MODULE_PARM_DESC(force_probe, diff --git a/drivers/gpu/drm/xe/xe_module.h b/drivers/gpu/drm/xe/xe_module.h index 2c1f9199f909..e1da1e9ca5cb 100644 --- a/drivers/gpu/drm/xe/xe_module.h +++ b/drivers/gpu/drm/xe/xe_module.h @@ -10,4 +10,6 @@ extern bool force_execlist; extern bool enable_display; extern u32 xe_force_vram_bar_size; extern int xe_guc_log_level; +extern char *xe_guc_firmware_path; +extern char *xe_huc_firmware_path; extern char *xe_param_force_probe; diff --git a/drivers/gpu/drm/xe/xe_uc_fw.c b/drivers/gpu/drm/xe/xe_uc_fw.c index a890ece72f34..2ba0466bc45a 100644 --- a/drivers/gpu/drm/xe/xe_uc_fw.c +++ b/drivers/gpu/drm/xe/xe_uc_fw.c @@ -15,6 +15,7 @@ #include "xe_gt.h" #include "xe_map.h" #include "xe_mmio.h" +#include "xe_module.h" #include "xe_uc_fw.h" /* @@ -210,6 +211,30 @@ uc_fw_auto_select(struct xe_device *xe, struct xe_uc_fw *uc_fw) } } +static void +uc_fw_override(struct xe_uc_fw *uc_fw) +{ + char *path_override = NULL; + + /* empty string disables, but it's not allowed for GuC */ + switch (uc_fw->type) { + case XE_UC_FW_TYPE_GUC: + if (xe_guc_firmware_path && *xe_guc_firmware_path) + path_override = xe_guc_firmware_path; + break; + case XE_UC_FW_TYPE_HUC: + path_override = xe_huc_firmware_path; + break; + default: + break; + } + + if (path_override) { + uc_fw->path = path_override; + uc_fw->user_overridden = true; + } +} + /** * xe_uc_fw_copy_rsa - copy fw RSA to buffer * @@ -347,7 +372,10 @@ int xe_uc_fw_init(struct xe_uc_fw *uc_fw) if (!xe_uc_fw_is_supported(uc_fw)) return 0; - if (!xe_device_uc_enabled(xe)) { + uc_fw_override(uc_fw); + + /* an empty path means the firmware is disabled */ + if (!xe_device_uc_enabled(xe) || !(*uc_fw->path)) { xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_DISABLED); drm_dbg(&xe->drm, "%s disabled", xe_uc_fw_type_repr(uc_fw->type)); return 0; |