/* we use a single object for both input and output */
bo = xe_managed_bo_create_pin_map(xe, gt_to_tile(gt),
PXP43_HUC_AUTH_INOUT_SIZE * 2,
XE_BO_FLAG_SYSTEM |
XE_BO_FLAG_GGTT); if (IS_ERR(bo)) return PTR_ERR(bo);
/* On platforms with a media GT the HuC is only available there */ if (tile->media_gt && (gt != tile->media_gt)) {
xe_uc_fw_change_status(&huc->fw, XE_UC_FIRMWARE_NOT_SUPPORTED); return 0;
}
ret = xe_uc_fw_init(&huc->fw); if (ret) goto out;
if (!xe_uc_fw_is_enabled(&huc->fw)) return 0;
if (IS_SRIOV_VF(xe)) return 0;
if (huc->fw.has_gsc_headers) {
ret = huc_alloc_gsc_pkt(huc); if (ret) goto out;
}
/* * The GSC will return PXP_STATUS_OP_NOT_PERMITTED if the HuC is already * authenticated. If the same error is ever returned with HuC not loaded * we'll still catch it when we check the authentication bit later.
*/
out_status = huc_auth_msg_rd(xe, &pkt->vmap, rd_offset, header.status); if (out_status != PXP_STATUS_SUCCESS && out_status != PXP_STATUS_OP_NOT_PERMITTED) {
xe_gt_err(gt, "HuC: authentication failed with GSC error = %#x\n", out_status); return -EIO;
}
int xe_huc_auth(struct xe_huc *huc, enum xe_huc_auth_types type)
{ struct xe_gt *gt = huc_to_gt(huc); struct xe_guc *guc = huc_to_guc(huc); int ret;
if (!xe_uc_fw_is_loadable(&huc->fw)) return 0;
/* On newer platforms the HuC survives reset, so no need to re-auth */ if (xe_huc_is_authenticated(huc, type)) {
xe_uc_fw_change_status(&huc->fw, XE_UC_FIRMWARE_RUNNING); return 0;
}
if (!xe_uc_fw_is_loaded(&huc->fw)) return -ENOEXEC;
switch (type) { case XE_HUC_AUTH_VIA_GUC:
ret = xe_guc_auth_huc(guc, xe_bo_ggtt_addr(huc->fw.bo) +
xe_uc_fw_rsa_offset(&huc->fw)); break; case XE_HUC_AUTH_VIA_GSC:
ret = huc_auth_via_gsccs(huc); break; default:
XE_WARN_ON(type); return -EINVAL;
} if (ret) {
xe_gt_err(gt, "HuC: failed to trigger auth via %s: %pe\n",
huc_auth_modes[type].name, ERR_PTR(ret)); goto fail;
}
ret = xe_mmio_wait32(>->mmio, huc_auth_modes[type].reg, huc_auth_modes[type].val,
huc_auth_modes[type].val, 100000, NULL, false); if (ret) {
xe_gt_err(gt, "HuC: firmware not verified: %pe\n", ERR_PTR(ret)); goto fail;
}
xe_uc_fw_change_status(&huc->fw, XE_UC_FIRMWARE_RUNNING);
xe_gt_dbg(gt, "HuC: authenticated via %s\n", huc_auth_modes[type].name);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.