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 <daniele.ceraolospurio@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Julia Filipchuk <julia.filipchuk@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Julia Filipchuk <julia.filipchuk@intel.com>
Link: https://patch.msgid.link/20260108011340.2562349-6-daniele.ceraolospurio@intel.com
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;
}
/*
- * 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;
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);
return 0;
}
- err = request_firmware(&fw, uc_fw->path, dev);
+ err = firmware_request_nowarn(&fw, uc_fw->path, dev);
if (err)
goto 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);