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 14 struct intel_context; 15 struct intel_gt; 16 struct i915_pxp_component; 17 struct drm_i915_private; 18 19 /** 20 * struct intel_pxp - pxp state 21 */ 22 struct 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