|
Patrik Jakobsson |
401dd6 |
From 887a193b4fb13e886d34bea4a1d8711fd775c7cf Mon Sep 17 00:00:00 2001
|
|
Patrik Jakobsson |
401dd6 |
From: Tomas Winkler <tomas.winkler@intel.com>
|
|
Patrik Jakobsson |
401dd6 |
Date: Tue, 27 Sep 2022 17:41:39 -0700
|
|
Patrik Jakobsson |
401dd6 |
Subject: drm/i915/pxp: add huc authentication and loading command
|
|
Patrik Jakobsson |
401dd6 |
Git-commit: 887a193b4fb13e886d34bea4a1d8711fd775c7cf
|
|
Patrik Jakobsson |
401dd6 |
Patch-mainline: v6.2-rc1
|
|
Patrik Jakobsson |
401dd6 |
References: jsc#PED-1218
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
Add support for loading HuC via a pxp stream command.
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
V4:
|
|
Patrik Jakobsson |
401dd6 |
1. Remove unnecessary include in intel_pxp_huc.h (Jani)
|
|
Patrik Jakobsson |
401dd6 |
2. Adjust copyright year to 2022
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
|
|
Patrik Jakobsson |
401dd6 |
Signed-off-by: Vitaly Lubart <vitaly.lubart@intel.com>
|
|
Patrik Jakobsson |
401dd6 |
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
|
|
Patrik Jakobsson |
401dd6 |
Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
|
|
Patrik Jakobsson |
401dd6 |
Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
|
|
Patrik Jakobsson |
401dd6 |
Link: https://patchwork.freedesktop.org/patch/msgid/20220928004145.745803-10-daniele.ceraolospurio@intel.com
|
|
Patrik Jakobsson |
401dd6 |
Acked-by: Patrik Jakobsson <pjakobsson@suse.de>
|
|
Patrik Jakobsson |
401dd6 |
---
|
|
Patrik Jakobsson |
401dd6 |
drivers/gpu/drm/i915/Makefile | 3 +-
|
|
Patrik Jakobsson |
401dd6 |
drivers/gpu/drm/i915/pxp/intel_pxp_huc.c | 69 +++++++++++++++++++
|
|
Patrik Jakobsson |
401dd6 |
drivers/gpu/drm/i915/pxp/intel_pxp_huc.h | 13 ++++
|
|
Patrik Jakobsson |
401dd6 |
.../drm/i915/pxp/intel_pxp_tee_interface.h | 23 ++++++-
|
|
Patrik Jakobsson |
401dd6 |
4 files changed, 106 insertions(+), 2 deletions(-)
|
|
Patrik Jakobsson |
401dd6 |
create mode 100644 drivers/gpu/drm/i915/pxp/intel_pxp_huc.c
|
|
Patrik Jakobsson |
401dd6 |
create mode 100644 drivers/gpu/drm/i915/pxp/intel_pxp_huc.h
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
|
|
Patrik Jakobsson |
401dd6 |
index 26fc2f23c4e0..f8cc1eb52626 100644
|
|
Patrik Jakobsson |
401dd6 |
--- a/drivers/gpu/drm/i915/Makefile
|
|
Patrik Jakobsson |
401dd6 |
+++ b/drivers/gpu/drm/i915/Makefile
|
|
Patrik Jakobsson |
401dd6 |
@@ -312,7 +312,8 @@ i915-y += i915_perf.o
|
|
Patrik Jakobsson |
401dd6 |
# Protected execution platform (PXP) support. Base support is required for HuC
|
|
Patrik Jakobsson |
401dd6 |
i915-y += \
|
|
Patrik Jakobsson |
401dd6 |
pxp/intel_pxp.o \
|
|
Patrik Jakobsson |
401dd6 |
- pxp/intel_pxp_tee.o
|
|
Patrik Jakobsson |
401dd6 |
+ pxp/intel_pxp_tee.o \
|
|
Patrik Jakobsson |
401dd6 |
+ pxp/intel_pxp_huc.o
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
i915-$(CONFIG_DRM_I915_PXP) += \
|
|
Patrik Jakobsson |
401dd6 |
pxp/intel_pxp_cmd.o \
|
|
Patrik Jakobsson |
401dd6 |
diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_huc.c b/drivers/gpu/drm/i915/pxp/intel_pxp_huc.c
|
|
Patrik Jakobsson |
401dd6 |
new file mode 100644
|
|
Patrik Jakobsson |
401dd6 |
index 000000000000..7ec36d94e758
|
|
Patrik Jakobsson |
401dd6 |
--- /dev/null
|
|
Patrik Jakobsson |
401dd6 |
+++ b/drivers/gpu/drm/i915/pxp/intel_pxp_huc.c
|
|
Patrik Jakobsson |
401dd6 |
@@ -0,0 +1,69 @@
|
|
Patrik Jakobsson |
401dd6 |
+// SPDX-License-Identifier: MIT
|
|
Patrik Jakobsson |
401dd6 |
+/*
|
|
Patrik Jakobsson |
401dd6 |
+ * Copyright(c) 2021-2022, Intel Corporation. All rights reserved.
|
|
Patrik Jakobsson |
401dd6 |
+ */
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+#include "drm/i915_drm.h"
|
|
Patrik Jakobsson |
401dd6 |
+#include "i915_drv.h"
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+#include "gem/i915_gem_region.h"
|
|
Patrik Jakobsson |
401dd6 |
+#include "gt/intel_gt.h"
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+#include "intel_pxp.h"
|
|
Patrik Jakobsson |
401dd6 |
+#include "intel_pxp_huc.h"
|
|
Patrik Jakobsson |
401dd6 |
+#include "intel_pxp_tee.h"
|
|
Patrik Jakobsson |
401dd6 |
+#include "intel_pxp_types.h"
|
|
Patrik Jakobsson |
401dd6 |
+#include "intel_pxp_tee_interface.h"
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+int intel_pxp_huc_load_and_auth(struct intel_pxp *pxp)
|
|
Patrik Jakobsson |
401dd6 |
+{
|
|
Patrik Jakobsson |
401dd6 |
+ struct intel_gt *gt = pxp_to_gt(pxp);
|
|
Patrik Jakobsson |
401dd6 |
+ struct intel_huc *huc = >->uc.huc;
|
|
Patrik Jakobsson |
401dd6 |
+ struct pxp_tee_start_huc_auth_in huc_in = {0};
|
|
Patrik Jakobsson |
401dd6 |
+ struct pxp_tee_start_huc_auth_out huc_out = {0};
|
|
Patrik Jakobsson |
401dd6 |
+ dma_addr_t huc_phys_addr;
|
|
Patrik Jakobsson |
401dd6 |
+ u8 client_id = 0;
|
|
Patrik Jakobsson |
401dd6 |
+ u8 fence_id = 0;
|
|
Patrik Jakobsson |
401dd6 |
+ int err;
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+ if (!pxp->pxp_component)
|
|
Patrik Jakobsson |
401dd6 |
+ return -ENODEV;
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+ huc_phys_addr = i915_gem_object_get_dma_address(huc->fw.obj, 0);
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+ /* write the PXP message into the lmem (the sg list) */
|
|
Patrik Jakobsson |
401dd6 |
+ huc_in.header.api_version = PXP_TEE_43_APIVER;
|
|
Patrik Jakobsson |
401dd6 |
+ huc_in.header.command_id = PXP_TEE_43_START_HUC_AUTH;
|
|
Patrik Jakobsson |
401dd6 |
+ huc_in.header.status = 0;
|
|
Patrik Jakobsson |
401dd6 |
+ huc_in.header.buffer_len = sizeof(huc_in.huc_base_address);
|
|
Patrik Jakobsson |
401dd6 |
+ huc_in.huc_base_address = huc_phys_addr;
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+ err = intel_pxp_tee_stream_message(pxp, client_id, fence_id,
|
|
Patrik Jakobsson |
401dd6 |
+ &huc_in, sizeof(huc_in),
|
|
Patrik Jakobsson |
401dd6 |
+ &huc_out, sizeof(huc_out));
|
|
Patrik Jakobsson |
401dd6 |
+ if (err < 0) {
|
|
Patrik Jakobsson |
401dd6 |
+ drm_err(>->i915->drm,
|
|
Patrik Jakobsson |
401dd6 |
+ "Failed to send HuC load and auth command to GSC [%d]!\n",
|
|
Patrik Jakobsson |
401dd6 |
+ err);
|
|
Patrik Jakobsson |
401dd6 |
+ return err;
|
|
Patrik Jakobsson |
401dd6 |
+ }
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+ /*
|
|
Patrik Jakobsson |
401dd6 |
+ * HuC does sometimes survive suspend/resume (it depends on how "deep"
|
|
Patrik Jakobsson |
401dd6 |
+ * a sleep state the device reaches) so we can end up here on resume
|
|
Patrik Jakobsson |
401dd6 |
+ * with HuC already loaded, in which case the GSC will return
|
|
Patrik Jakobsson |
401dd6 |
+ * PXP_STATUS_OP_NOT_PERMITTED. We can therefore consider the GuC
|
|
Patrik Jakobsson |
401dd6 |
+ * correctly transferred in this scenario; if the same error is ever
|
|
Patrik Jakobsson |
401dd6 |
+ * returned with HuC not loaded we'll still catch it when we check the
|
|
Patrik Jakobsson |
401dd6 |
+ * authentication bit later.
|
|
Patrik Jakobsson |
401dd6 |
+ */
|
|
Patrik Jakobsson |
401dd6 |
+ if (huc_out.header.status != PXP_STATUS_SUCCESS &&
|
|
Patrik Jakobsson |
401dd6 |
+ huc_out.header.status != PXP_STATUS_OP_NOT_PERMITTED) {
|
|
Patrik Jakobsson |
401dd6 |
+ drm_err(>->i915->drm,
|
|
Patrik Jakobsson |
401dd6 |
+ "HuC load failed with GSC error = 0x%x\n",
|
|
Patrik Jakobsson |
401dd6 |
+ huc_out.header.status);
|
|
Patrik Jakobsson |
401dd6 |
+ return -EPROTO;
|
|
Patrik Jakobsson |
401dd6 |
+ }
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+ return 0;
|
|
Patrik Jakobsson |
401dd6 |
+}
|
|
Patrik Jakobsson |
401dd6 |
diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_huc.h b/drivers/gpu/drm/i915/pxp/intel_pxp_huc.h
|
|
Patrik Jakobsson |
401dd6 |
new file mode 100644
|
|
Patrik Jakobsson |
401dd6 |
index 000000000000..e40847a91c39
|
|
Patrik Jakobsson |
401dd6 |
--- /dev/null
|
|
Patrik Jakobsson |
401dd6 |
+++ b/drivers/gpu/drm/i915/pxp/intel_pxp_huc.h
|
|
Patrik Jakobsson |
401dd6 |
@@ -0,0 +1,13 @@
|
|
Patrik Jakobsson |
401dd6 |
+/* SPDX-License-Identifier: MIT */
|
|
Patrik Jakobsson |
401dd6 |
+/*
|
|
Patrik Jakobsson |
401dd6 |
+ * Copyright(c) 2021-2022, Intel Corporation. All rights reserved.
|
|
Patrik Jakobsson |
401dd6 |
+ */
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+#ifndef __INTEL_PXP_HUC_H__
|
|
Patrik Jakobsson |
401dd6 |
+#define __INTEL_PXP_HUC_H__
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+struct intel_pxp;
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+int intel_pxp_huc_load_and_auth(struct intel_pxp *pxp);
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+#endif /* __INTEL_PXP_HUC_H__ */
|
|
Patrik Jakobsson |
401dd6 |
diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_tee_interface.h b/drivers/gpu/drm/i915/pxp/intel_pxp_tee_interface.h
|
|
Patrik Jakobsson |
401dd6 |
index 36e9b0868f5c..7edc1760f142 100644
|
|
Patrik Jakobsson |
401dd6 |
--- a/drivers/gpu/drm/i915/pxp/intel_pxp_tee_interface.h
|
|
Patrik Jakobsson |
401dd6 |
+++ b/drivers/gpu/drm/i915/pxp/intel_pxp_tee_interface.h
|
|
Patrik Jakobsson |
401dd6 |
@@ -1,6 +1,6 @@
|
|
Patrik Jakobsson |
401dd6 |
/* SPDX-License-Identifier: MIT */
|
|
Patrik Jakobsson |
401dd6 |
/*
|
|
Patrik Jakobsson |
401dd6 |
- * Copyright(c) 2020, Intel Corporation. All rights reserved.
|
|
Patrik Jakobsson |
401dd6 |
+ * Copyright(c) 2020-2022, Intel Corporation. All rights reserved.
|
|
Patrik Jakobsson |
401dd6 |
*/
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
#ifndef __INTEL_PXP_TEE_INTERFACE_H__
|
|
Patrik Jakobsson |
401dd6 |
@@ -9,8 +9,20 @@
|
|
Patrik Jakobsson |
401dd6 |
#include <linux/types.h>
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
#define PXP_TEE_APIVER 0x40002
|
|
Patrik Jakobsson |
401dd6 |
+#define PXP_TEE_43_APIVER 0x00040003
|
|
Patrik Jakobsson |
401dd6 |
#define PXP_TEE_ARB_CMDID 0x1e
|
|
Patrik Jakobsson |
401dd6 |
#define PXP_TEE_ARB_PROTECTION_MODE 0x2
|
|
Patrik Jakobsson |
401dd6 |
+#define PXP_TEE_43_START_HUC_AUTH 0x0000003A
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+/*
|
|
Patrik Jakobsson |
401dd6 |
+ * there are a lot of status codes for PXP, but we only define the ones we
|
|
Patrik Jakobsson |
401dd6 |
+ * actually can handle in the driver. other failure codes will be printed to
|
|
Patrik Jakobsson |
401dd6 |
+ * error msg for debug.
|
|
Patrik Jakobsson |
401dd6 |
+ */
|
|
Patrik Jakobsson |
401dd6 |
+enum pxp_status {
|
|
Patrik Jakobsson |
401dd6 |
+ PXP_STATUS_SUCCESS = 0x0,
|
|
Patrik Jakobsson |
401dd6 |
+ PXP_STATUS_OP_NOT_PERMITTED = 0x4013
|
|
Patrik Jakobsson |
401dd6 |
+};
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
/* PXP TEE message header */
|
|
Patrik Jakobsson |
401dd6 |
struct pxp_tee_cmd_header {
|
|
Patrik Jakobsson |
401dd6 |
@@ -33,4 +45,13 @@ struct pxp_tee_create_arb_out {
|
|
Patrik Jakobsson |
401dd6 |
struct pxp_tee_cmd_header header;
|
|
Patrik Jakobsson |
401dd6 |
} __packed;
|
|
Patrik Jakobsson |
401dd6 |
|
|
Patrik Jakobsson |
401dd6 |
+struct pxp_tee_start_huc_auth_in {
|
|
Patrik Jakobsson |
401dd6 |
+ struct pxp_tee_cmd_header header;
|
|
Patrik Jakobsson |
401dd6 |
+ __le64 huc_base_address;
|
|
Patrik Jakobsson |
401dd6 |
+};
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
+struct pxp_tee_start_huc_auth_out {
|
|
Patrik Jakobsson |
401dd6 |
+ struct pxp_tee_cmd_header header;
|
|
Patrik Jakobsson |
401dd6 |
+};
|
|
Patrik Jakobsson |
401dd6 |
+
|
|
Patrik Jakobsson |
401dd6 |
#endif /* __INTEL_PXP_TEE_INTERFACE_H__ */
|
|
Patrik Jakobsson |
401dd6 |
--
|
|
Patrik Jakobsson |
401dd6 |
2.39.0
|
|
Patrik Jakobsson |
401dd6 |
|