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 = &gt->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(&gt->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(&gt->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