Commit 07db5bd2 authored by Alan Previn's avatar Alan Previn Committed by Daniele Ceraolo Spurio

drm/i915/pxp: Separate PXP FW interface structures for both v42 and 43

Previously, we only used PXP FW interface version-42 structures for
PXP arbitration session on ADL/TGL products and version-43 for HuC
authentication on DG2. That worked fine despite not differentiating such
versioning of the PXP firmware interaction structures. This was okay
back then because the only commands used via version 42 was not
used via version 43 and vice versa.

With MTL, we'll need both these versions side by side for the same
commands (PXP-session) with the older platform feature support. That
said, let's create separate files to define the structures and definitions
for both version-42 and 43 of PXP FW interfaces.
Signed-off-by: default avatarAlan Previn <alan.previn.teres.alexis@intel.com>
Reviewed-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221108045628.4187260-2-alan.previn.teres.alexis@intel.com
parent 5524b5e5
/* SPDX-License-Identifier: MIT */
/*
* Copyright(c) 2020, Intel Corporation. All rights reserved.
*/
#ifndef __INTEL_PXP_FW_INTERFACE_42_H__
#define __INTEL_PXP_FW_INTERFACE_42_H__
#include <linux/types.h>
#include "intel_pxp_cmd_interface_cmn.h"
/* PXP-Opcode for Init Session */
#define PXP42_CMDID_INIT_SESSION 0x1e
/* PXP-Input-Packet: Init Session (Arb-Session) */
struct pxp42_create_arb_in {
struct pxp_cmd_header header;
u32 protection_mode;
#define PXP42_ARB_SESSION_MODE_HEAVY 0x2
u32 session_id;
} __packed;
/* PXP-Output-Packet: Init Session */
struct pxp42_create_arb_out {
struct pxp_cmd_header header;
} __packed;
#endif /* __INTEL_PXP_FW_INTERFACE_42_H__ */
/* SPDX-License-Identifier: MIT */
/*
* Copyright(c) 2022, Intel Corporation. All rights reserved.
*/
#ifndef __INTEL_PXP_FW_INTERFACE_43_H__
#define __INTEL_PXP_FW_INTERFACE_43_H__
#include <linux/types.h>
#include "intel_pxp_cmd_interface_cmn.h"
/* PXP-Cmd-Op definitions */
#define PXP43_CMDID_START_HUC_AUTH 0x0000003A
/* PXP-Input-Packet: HUC-Authentication */
struct pxp43_start_huc_auth_in {
struct pxp_cmd_header header;
__le64 huc_base_address;
} __packed;
/* PXP-Output-Packet: HUC-Authentication */
struct pxp43_start_huc_auth_out {
struct pxp_cmd_header header;
} __packed;
#endif /* __INTEL_PXP_FW_INTERFACE_43_H__ */
/* SPDX-License-Identifier: MIT */
/*
* Copyright(c) 2022, Intel Corporation. All rights reserved.
*/
#ifndef __INTEL_PXP_FW_INTERFACE_CMN_H__
#define __INTEL_PXP_FW_INTERFACE_CMN_H__
#include <linux/types.h>
#define PXP_APIVER(x, y) (((x) & 0xFFFF) << 16 | ((y) & 0xFFFF))
/*
* there are a lot of status codes for PXP, but we only define the cross-API
* common ones that we actually can handle in the kernel driver. Other failure
* codes should be printed to error msg for debug.
*/
enum pxp_status {
PXP_STATUS_SUCCESS = 0x0,
PXP_STATUS_OP_NOT_PERMITTED = 0x4013
};
/* Common PXP FW message header */
struct pxp_cmd_header {
u32 api_version;
u32 command_id;
union {
u32 status; /* out */
u32 stream_id; /* in */
};
/* Length of the message (excluding the header) */
u32 buffer_len;
} __packed;
#endif /* __INTEL_PXP_FW_INTERFACE_CMN_H__ */
......@@ -14,14 +14,14 @@
#include "intel_pxp_huc.h"
#include "intel_pxp_tee.h"
#include "intel_pxp_types.h"
#include "intel_pxp_tee_interface.h"
#include "intel_pxp_cmd_interface_43.h"
int intel_pxp_huc_load_and_auth(struct intel_pxp *pxp)
{
struct intel_gt *gt = pxp_to_gt(pxp);
struct intel_huc *huc = &gt->uc.huc;
struct pxp_tee_start_huc_auth_in huc_in = {0};
struct pxp_tee_start_huc_auth_out huc_out = {0};
struct pxp43_start_huc_auth_in huc_in = {0};
struct pxp43_start_huc_auth_out huc_out = {0};
dma_addr_t huc_phys_addr;
u8 client_id = 0;
u8 fence_id = 0;
......@@ -33,8 +33,8 @@ int intel_pxp_huc_load_and_auth(struct intel_pxp *pxp)
huc_phys_addr = i915_gem_object_get_dma_address(huc->fw.obj, 0);
/* write the PXP message into the lmem (the sg list) */
huc_in.header.api_version = PXP_TEE_43_APIVER;
huc_in.header.command_id = PXP_TEE_43_START_HUC_AUTH;
huc_in.header.api_version = PXP_APIVER(4, 3);
huc_in.header.command_id = PXP43_CMDID_START_HUC_AUTH;
huc_in.header.status = 0;
huc_in.header.buffer_len = sizeof(huc_in.huc_base_address);
huc_in.huc_base_address = huc_phys_addr;
......
......@@ -14,7 +14,7 @@
#include "intel_pxp.h"
#include "intel_pxp_session.h"
#include "intel_pxp_tee.h"
#include "intel_pxp_tee_interface.h"
#include "intel_pxp_cmd_interface_42.h"
#include "intel_pxp_huc.h"
static inline struct intel_pxp *i915_dev_to_pxp(struct device *i915_kdev)
......@@ -286,14 +286,14 @@ int intel_pxp_tee_cmd_create_arb_session(struct intel_pxp *pxp,
int arb_session_id)
{
struct drm_i915_private *i915 = pxp_to_gt(pxp)->i915;
struct pxp_tee_create_arb_in msg_in = {0};
struct pxp_tee_create_arb_out msg_out = {0};
struct pxp42_create_arb_in msg_in = {0};
struct pxp42_create_arb_out msg_out = {0};
int ret;
msg_in.header.api_version = PXP_TEE_APIVER;
msg_in.header.command_id = PXP_TEE_ARB_CMDID;
msg_in.header.api_version = PXP_APIVER(4, 2);
msg_in.header.command_id = PXP42_CMDID_INIT_SESSION;
msg_in.header.buffer_len = sizeof(msg_in) - sizeof(msg_in.header);
msg_in.protection_mode = PXP_TEE_ARB_PROTECTION_MODE;
msg_in.protection_mode = PXP42_ARB_SESSION_MODE_HEAVY;
msg_in.session_id = arb_session_id;
ret = intel_pxp_tee_io_message(pxp,
......
/* SPDX-License-Identifier: MIT */
/*
* Copyright(c) 2020-2022, Intel Corporation. All rights reserved.
*/
#ifndef __INTEL_PXP_TEE_INTERFACE_H__
#define __INTEL_PXP_TEE_INTERFACE_H__
#include <linux/types.h>
#define PXP_TEE_APIVER 0x40002
#define PXP_TEE_43_APIVER 0x00040003
#define PXP_TEE_ARB_CMDID 0x1e
#define PXP_TEE_ARB_PROTECTION_MODE 0x2
#define PXP_TEE_43_START_HUC_AUTH 0x0000003A
/*
* there are a lot of status codes for PXP, but we only define the ones we
* actually can handle in the driver. other failure codes will be printed to
* error msg for debug.
*/
enum pxp_status {
PXP_STATUS_SUCCESS = 0x0,
PXP_STATUS_OP_NOT_PERMITTED = 0x4013
};
/* PXP TEE message header */
struct pxp_tee_cmd_header {
u32 api_version;
u32 command_id;
u32 status;
/* Length of the message (excluding the header) */
u32 buffer_len;
} __packed;
/* PXP TEE message input to create a arbitrary session */
struct pxp_tee_create_arb_in {
struct pxp_tee_cmd_header header;
u32 protection_mode;
u32 session_id;
} __packed;
/* PXP TEE message output to create a arbitrary session */
struct pxp_tee_create_arb_out {
struct pxp_tee_cmd_header header;
} __packed;
struct pxp_tee_start_huc_auth_in {
struct pxp_tee_cmd_header header;
__le64 huc_base_address;
};
struct pxp_tee_start_huc_auth_out {
struct pxp_tee_cmd_header header;
};
#endif /* __INTEL_PXP_TEE_INTERFACE_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment