From: Daniele Ceraolo Spurio Date: Thu, 8 Jan 2026 01:13:42 +0000 (-0800) Subject: drm/xe/gsc: Make GSC FW load optional for newer platforms X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65b65ffcf669c37e120bcfd3d9cef62ac961bc60;p=thirdparty%2Fkernel%2Flinux.git drm/xe/gsc: Make GSC FW load optional for newer platforms On newer platforms GSC FW is only required for content protection features, so the core driver features work perfectly fine without it (and we did in fact not enable it to start with on PTL). Therefore, we can selectively enable the GSC only if the FW is found on disk, without failing if it is not found. Note that this means that the FW can now be enabled (i.e., we're looking for it) but not available (i.e., we haven't found it), so checks on FW support should use the latter state to decide whether to go on or not. As part of the rework, the message for FW not found has been cleaned up to be more readable. While at it, drop the comment about xe_uc_fw_init() since the code has been reworked and the statement no longer applies. Signed-off-by: Daniele Ceraolo Spurio Cc: Rodrigo Vivi Cc: Julia Filipchuk Reviewed-by: Rodrigo Vivi Reviewed-by: Julia Filipchuk Link: https://patch.msgid.link/20260108011340.2562349-6-daniele.ceraolospurio@intel.com --- diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c index 07acae121aa7..ed1f65f5ef4d 100644 --- a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c +++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c @@ -39,7 +39,7 @@ static bool intel_hdcp_gsc_check_status(struct drm_device *drm) struct xe_gt *gt = tile->media_gt; struct xe_gsc *gsc = >->uc.gsc; - if (!gsc || !xe_uc_fw_is_enabled(&gsc->fw)) { + if (!gsc || !xe_uc_fw_is_available(&gsc->fw)) { drm_dbg_kms(&xe->drm, "GSC Components not ready for HDCP2.x\n"); return false; diff --git a/drivers/gpu/drm/xe/xe_gsc.c b/drivers/gpu/drm/xe/xe_gsc.c index a3157b0fe791..e5c234f3d795 100644 --- a/drivers/gpu/drm/xe/xe_gsc.c +++ b/drivers/gpu/drm/xe/xe_gsc.c @@ -414,15 +414,16 @@ int xe_gsc_init(struct xe_gsc *gsc) } /* - * Some platforms can have GuC but not GSC. That would cause - * xe_uc_fw_init(gsc) to return a "not supported" failure code and abort - * all firmware loading. So check for GSC being enabled before - * propagating the failure back up. That way the higher level will keep - * going and load GuC as appropriate. + * Starting from BMG the GSC is no longer needed for MC6 entry, so the + * only missing features if the FW is lacking would be the content + * protection ones. This is acceptable, so we allow the driver load to + * continue if the GSC FW is missing. */ ret = xe_uc_fw_init(&gsc->fw); if (!xe_uc_fw_is_enabled(&gsc->fw)) return 0; + else if (gt_to_xe(gt)->info.platform >= XE_BATTLEMAGE && !xe_uc_fw_is_available(&gsc->fw)) + return 0; else if (ret) goto out; @@ -614,7 +615,7 @@ void xe_gsc_print_info(struct xe_gsc *gsc, struct drm_printer *p) drm_printf(p, "\tfound security version %u\n", gsc->security_version); - if (!xe_uc_fw_is_enabled(&gsc->fw)) + if (!xe_uc_fw_is_available(&gsc->fw)) return; CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GSC); diff --git a/drivers/gpu/drm/xe/xe_uc_fw.c b/drivers/gpu/drm/xe/xe_uc_fw.c index 85544c214274..5d10a6c34604 100644 --- a/drivers/gpu/drm/xe/xe_uc_fw.c +++ b/drivers/gpu/drm/xe/xe_uc_fw.c @@ -739,7 +739,7 @@ static int uc_fw_request(struct xe_uc_fw *uc_fw, const struct firmware **firmwar return 0; } - err = request_firmware(&fw, uc_fw->path, dev); + err = firmware_request_nowarn(&fw, uc_fw->path, dev); if (err) goto fail; @@ -768,8 +768,12 @@ fail: XE_UC_FIRMWARE_MISSING : XE_UC_FIRMWARE_ERROR); - xe_gt_notice(gt, "%s firmware %s: fetch failed with error %pe\n", - xe_uc_fw_type_repr(uc_fw->type), uc_fw->path, ERR_PTR(err)); + if (err == -ENOENT) + xe_gt_info(gt, "%s firmware %s not found\n", + xe_uc_fw_type_repr(uc_fw->type), uc_fw->path); + else + xe_gt_notice(gt, "%s firmware %s: fetch failed with error %pe\n", + xe_uc_fw_type_repr(uc_fw->type), uc_fw->path, ERR_PTR(err)); xe_gt_info(gt, "%s firmware(s) can be downloaded from %s\n", xe_uc_fw_type_repr(uc_fw->type), XE_UC_FIRMWARE_URL);