1/* SPDX-License-Identifier: MIT */
2/*
3 * Copyright(c) 2020, Intel Corporation. All rights reserved.
4 */
5
6#ifndef __INTEL_PXP_TYPES_H__
7#define __INTEL_PXP_TYPES_H__
8
9#include <linux/completion.h>
10#include <linux/mutex.h>
11#include <linux/types.h>
12#include <linux/workqueue.h>
13
14struct intel_context;
15struct intel_gt;
16struct i915_pxp_component;
17struct drm_i915_private;
18
19/**
20 * struct intel_pxp - pxp state
21 */
22struct intel_pxp {
23 /**
24 * @ctrl_gt: poiner to the tile that owns the controls for PXP subsystem assets that
25 * the VDBOX, the KCR engine (and GSC CS depending on the platform)
26 */
27 struct intel_gt *ctrl_gt;
28
29 /**
30 * @platform_cfg_is_bad: used to track if any prior arb session creation resulted
31 * in a failure that was caused by a platform configuration issue, meaning that
32 * failure will not get resolved without a change to the platform (not kernel)
33 * such as BIOS configuration, firwmware update, etc. This bool gets reflected when
34 * GET_PARAM:I915_PARAM_PXP_STATUS is called.
35 */
36 bool platform_cfg_is_bad;
37
38 /**
39 * @kcr_base: base mmio offset for the KCR engine which is different on legacy platforms
40 * vs newer platforms where the KCR is inside the media-tile.
41 */
42 u32 kcr_base;
43
44 /**
45 * @gsccs_res: resources for request submission for platforms that have a GSC engine.
46 */
47 struct gsccs_session_resources {
48 u64 host_session_handle; /* used by firmware to link commands to sessions */
49 struct intel_context *ce; /* context for gsc command submission */
50
51 struct i915_vma *pkt_vma; /* GSC FW cmd packet vma */
52 void *pkt_vaddr; /* GSC FW cmd packet virt pointer */
53
54 struct i915_vma *bb_vma; /* HECI_PKT batch buffer vma */
55 void *bb_vaddr; /* HECI_PKT batch buffer virt pointer */
56 } gsccs_res;
57
58 /**
59 * @pxp_component: i915_pxp_component struct of the bound mei_pxp
60 * module. Only set and cleared inside component bind/unbind functions,
61 * which are protected by &tee_mutex.
62 */
63 struct i915_pxp_component *pxp_component;
64
65 /**
66 * @dev_link: Enforce module relationship for power management ordering.
67 */
68 struct device_link *dev_link;
69 /**
70 * @pxp_component_added: track if the pxp component has been added.
71 * Set and cleared in tee init and fini functions respectively.
72 */
73 bool pxp_component_added;
74
75 /** @ce: kernel-owned context used for PXP operations */
76 struct intel_context *ce;
77
78 /** @arb_mutex: protects arb session start */
79 struct mutex arb_mutex;
80 /**
81 * @arb_is_valid: tracks arb session status.
82 * After a teardown, the arb session can still be in play on the HW
83 * even if the keys are gone, so we can't rely on the HW state of the
84 * session to know if it's valid and need to track the status in SW.
85 */
86 bool arb_is_valid;
87
88 /**
89 * @key_instance: tracks which key instance we're on, so we can use it
90 * to determine if an object was created using the current key or a
91 * previous one.
92 */
93 u32 key_instance;
94
95 /** @tee_mutex: protects the tee channel binding and messaging. */
96 struct mutex tee_mutex;
97
98 /** @stream_cmd: LMEM obj used to send stream PXP commands to the GSC */
99 struct {
100 struct drm_i915_gem_object *obj; /* contains PXP command memory */
101 void *vaddr; /* virtual memory for PXP command */
102 } stream_cmd;
103
104 /**
105 * @hw_state_invalidated: if the HW perceives an attack on the integrity
106 * of the encryption it will invalidate the keys and expect SW to
107 * re-initialize the session. We keep track of this state to make sure
108 * we only re-start the arb session when required.
109 */
110 bool hw_state_invalidated;
111
112 /** @irq_enabled: tracks the status of the kcr irqs */
113 bool irq_enabled;
114 /**
115 * @termination: tracks the status of a pending termination. Only
116 * re-initialized under gt->irq_lock and completed in &session_work.
117 */
118 struct completion termination;
119
120 /** @session_work: worker that manages session events. */
121 struct work_struct session_work;
122 /** @session_events: pending session events, protected with gt->irq_lock. */
123 u32 session_events;
124#define PXP_TERMINATION_REQUEST BIT(0)
125#define PXP_TERMINATION_COMPLETE BIT(1)
126#define PXP_INVAL_REQUIRED BIT(2)
127#define PXP_EVENT_TYPE_IRQ BIT(3)
128};
129
130#endif /* __INTEL_PXP_TYPES_H__ */
131

source code of linux/drivers/gpu/drm/i915/pxp/intel_pxp_types.h