xref: /openbsd-src/sys/dev/pci/drm/i915/gt/uc/intel_huc.h (revision f005ef32267c16bdb134f0e9fa4477dbe07c263a)
1c349dbc7Sjsg /* SPDX-License-Identifier: MIT */
2c349dbc7Sjsg /*
3c349dbc7Sjsg  * Copyright © 2014-2019 Intel Corporation
4c349dbc7Sjsg  */
5c349dbc7Sjsg 
6c349dbc7Sjsg #ifndef _INTEL_HUC_H_
7c349dbc7Sjsg #define _INTEL_HUC_H_
8c349dbc7Sjsg 
91bb76ff1Sjsg #include "i915_reg_defs.h"
10*f005ef32Sjsg #include "i915_sw_fence.h"
11c349dbc7Sjsg #include "intel_uc_fw.h"
12c349dbc7Sjsg #include "intel_huc_fw.h"
13c349dbc7Sjsg 
14*f005ef32Sjsg #include <linux/notifier.h>
15*f005ef32Sjsg #include <linux/hrtimer.h>
16*f005ef32Sjsg 
17*f005ef32Sjsg struct bus_type;
18*f005ef32Sjsg struct i915_vma;
19*f005ef32Sjsg 
20*f005ef32Sjsg enum intel_huc_delayed_load_status {
21*f005ef32Sjsg 	INTEL_HUC_WAITING_ON_GSC = 0,
22*f005ef32Sjsg 	INTEL_HUC_WAITING_ON_PXP,
23*f005ef32Sjsg 	INTEL_HUC_DELAYED_LOAD_ERROR,
24*f005ef32Sjsg };
25*f005ef32Sjsg 
26*f005ef32Sjsg enum intel_huc_authentication_type {
27*f005ef32Sjsg 	INTEL_HUC_AUTH_BY_GUC = 0,
28*f005ef32Sjsg 	INTEL_HUC_AUTH_BY_GSC,
29*f005ef32Sjsg 	INTEL_HUC_AUTH_MAX_MODES
30*f005ef32Sjsg };
31*f005ef32Sjsg 
32c349dbc7Sjsg struct intel_huc {
33c349dbc7Sjsg 	/* Generic uC firmware management */
34c349dbc7Sjsg 	struct intel_uc_fw fw;
35c349dbc7Sjsg 
36c349dbc7Sjsg 	/* HuC-specific additions */
37c349dbc7Sjsg 	struct {
38c349dbc7Sjsg 		i915_reg_t reg;
39c349dbc7Sjsg 		u32 mask;
40c349dbc7Sjsg 		u32 value;
41*f005ef32Sjsg 	} status[INTEL_HUC_AUTH_MAX_MODES];
42*f005ef32Sjsg 
43*f005ef32Sjsg 	struct {
44*f005ef32Sjsg 		struct i915_sw_fence fence;
45*f005ef32Sjsg 		struct timeout timer;
46*f005ef32Sjsg 		struct notifier_block nb;
47*f005ef32Sjsg 		enum intel_huc_delayed_load_status status;
48*f005ef32Sjsg 	} delayed_load;
49*f005ef32Sjsg 
50*f005ef32Sjsg 	/* for load via GSCCS */
51*f005ef32Sjsg 	struct i915_vma *heci_pkt;
52*f005ef32Sjsg 
53*f005ef32Sjsg 	bool loaded_via_gsc;
54c349dbc7Sjsg };
55c349dbc7Sjsg 
56*f005ef32Sjsg int intel_huc_sanitize(struct intel_huc *huc);
57c349dbc7Sjsg void intel_huc_init_early(struct intel_huc *huc);
58c349dbc7Sjsg int intel_huc_init(struct intel_huc *huc);
59c349dbc7Sjsg void intel_huc_fini(struct intel_huc *huc);
60*f005ef32Sjsg void intel_huc_suspend(struct intel_huc *huc);
61*f005ef32Sjsg int intel_huc_auth(struct intel_huc *huc, enum intel_huc_authentication_type type);
62*f005ef32Sjsg int intel_huc_wait_for_auth_complete(struct intel_huc *huc,
63*f005ef32Sjsg 				     enum intel_huc_authentication_type type);
64*f005ef32Sjsg bool intel_huc_is_authenticated(struct intel_huc *huc,
65*f005ef32Sjsg 				enum intel_huc_authentication_type type);
66c349dbc7Sjsg int intel_huc_check_status(struct intel_huc *huc);
671bb76ff1Sjsg void intel_huc_update_auth_status(struct intel_huc *huc);
68c349dbc7Sjsg 
69*f005ef32Sjsg void intel_huc_register_gsc_notifier(struct intel_huc *huc, const struct bus_type *bus);
70*f005ef32Sjsg void intel_huc_unregister_gsc_notifier(struct intel_huc *huc, const struct bus_type *bus);
71c349dbc7Sjsg 
intel_huc_is_supported(struct intel_huc * huc)72c349dbc7Sjsg static inline bool intel_huc_is_supported(struct intel_huc *huc)
73c349dbc7Sjsg {
74c349dbc7Sjsg 	return intel_uc_fw_is_supported(&huc->fw);
75c349dbc7Sjsg }
76c349dbc7Sjsg 
intel_huc_is_wanted(struct intel_huc * huc)77c349dbc7Sjsg static inline bool intel_huc_is_wanted(struct intel_huc *huc)
78c349dbc7Sjsg {
79c349dbc7Sjsg 	return intel_uc_fw_is_enabled(&huc->fw);
80c349dbc7Sjsg }
81c349dbc7Sjsg 
intel_huc_is_used(struct intel_huc * huc)82c349dbc7Sjsg static inline bool intel_huc_is_used(struct intel_huc *huc)
83c349dbc7Sjsg {
84c349dbc7Sjsg 	GEM_BUG_ON(__intel_uc_fw_status(&huc->fw) == INTEL_UC_FIRMWARE_SELECTED);
85c349dbc7Sjsg 	return intel_uc_fw_is_available(&huc->fw);
86c349dbc7Sjsg }
87c349dbc7Sjsg 
intel_huc_is_loaded_by_gsc(const struct intel_huc * huc)881bb76ff1Sjsg static inline bool intel_huc_is_loaded_by_gsc(const struct intel_huc *huc)
89c349dbc7Sjsg {
90*f005ef32Sjsg 	return huc->loaded_via_gsc;
91*f005ef32Sjsg }
92*f005ef32Sjsg 
intel_huc_wait_required(struct intel_huc * huc)93*f005ef32Sjsg static inline bool intel_huc_wait_required(struct intel_huc *huc)
94*f005ef32Sjsg {
95*f005ef32Sjsg 	return intel_huc_is_used(huc) && intel_huc_is_loaded_by_gsc(huc) &&
96*f005ef32Sjsg 	       !intel_huc_is_authenticated(huc, INTEL_HUC_AUTH_BY_GSC);
97c349dbc7Sjsg }
98c349dbc7Sjsg 
99ad8b1aafSjsg void intel_huc_load_status(struct intel_huc *huc, struct drm_printer *p);
100ad8b1aafSjsg 
101c349dbc7Sjsg #endif
102