1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5 
6 #ifndef _XE_GUC_CT_TYPES_H_
7 #define _XE_GUC_CT_TYPES_H_
8 
9 #include <linux/interrupt.h>
10 #include <linux/iosys-map.h>
11 #include <linux/spinlock_types.h>
12 #include <linux/stackdepot.h>
13 #include <linux/wait.h>
14 #include <linux/xarray.h>
15 
16 #include "abi/guc_communication_ctb_abi.h"
17 
18 struct xe_bo;
19 
20 /**
21  * struct guc_ctb_info - GuC command transport buffer (CTB) info
22  */
23 struct guc_ctb_info {
24 	/** @size: size of CTB commands (DW) */
25 	u32 size;
26 	/** @resv_space: reserved space of CTB commands (DW) */
27 	u32 resv_space;
28 	/** @head: head of CTB commands (DW) */
29 	u32 head;
30 	/** @tail: tail of CTB commands (DW) */
31 	u32 tail;
32 	/** @space: space in CTB commands (DW) */
33 	u32 space;
34 	/** @broken: channel broken */
35 	bool broken;
36 };
37 
38 /**
39  * struct guc_ctb - GuC command transport buffer (CTB)
40  */
41 struct guc_ctb {
42 	/** @desc: dma buffer map for CTB descriptor */
43 	struct iosys_map desc;
44 	/** @cmds: dma buffer map for CTB commands */
45 	struct iosys_map cmds;
46 	/** @info: CTB info */
47 	struct guc_ctb_info info;
48 };
49 
50 /**
51  * struct guc_ctb_snapshot - GuC command transport buffer (CTB) snapshot
52  */
53 struct guc_ctb_snapshot {
54 	/** @desc: snapshot of the CTB descriptor */
55 	struct guc_ct_buffer_desc desc;
56 	/** @info: snapshot of the CTB info */
57 	struct guc_ctb_info info;
58 };
59 
60 /**
61  * struct xe_guc_ct_snapshot - GuC command transport (CT) snapshot
62  */
63 struct xe_guc_ct_snapshot {
64 	/** @ct_enabled: CT enabled info at capture time. */
65 	bool ct_enabled;
66 	/** @g2h_outstanding: G2H outstanding info at the capture time */
67 	u32 g2h_outstanding;
68 	/** @g2h: G2H CTB snapshot */
69 	struct guc_ctb_snapshot g2h;
70 	/** @h2g: H2G CTB snapshot */
71 	struct guc_ctb_snapshot h2g;
72 	/** @ctb_size: size of the snapshot of the CTB */
73 	size_t ctb_size;
74 	/** @ctb: snapshot of the entire CTB */
75 	u32 *ctb;
76 };
77 
78 /**
79  * enum xe_guc_ct_state - CT state
80  * @XE_GUC_CT_STATE_NOT_INITIALIZED: CT not initialized, messages not expected in this state
81  * @XE_GUC_CT_STATE_DISABLED: CT disabled, messages not expected in this state
82  * @XE_GUC_CT_STATE_STOPPED: CT stopped, drop messages without errors
83  * @XE_GUC_CT_STATE_ENABLED: CT enabled, messages sent / received in this state
84  */
85 enum xe_guc_ct_state {
86 	XE_GUC_CT_STATE_NOT_INITIALIZED = 0,
87 	XE_GUC_CT_STATE_DISABLED,
88 	XE_GUC_CT_STATE_STOPPED,
89 	XE_GUC_CT_STATE_ENABLED,
90 };
91 
92 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG)
93 /** struct xe_dead_ct - Information for debugging a dead CT */
94 struct xe_dead_ct {
95 	/** @lock: protects memory allocation/free operations, and @reason updates */
96 	spinlock_t lock;
97 	/** @reason: bit mask of CT_DEAD_* reason codes */
98 	unsigned int reason;
99 	/** @reported: for preventing multiple dumps per error sequence */
100 	bool reported;
101 	/** @worker: worker thread to get out of interrupt context before dumping */
102 	struct work_struct worker;
103 	/** snapshot_ct: copy of CT state and CTB content at point of error */
104 	struct xe_guc_ct_snapshot *snapshot_ct;
105 	/** snapshot_log: copy of GuC log at point of error */
106 	struct xe_guc_log_snapshot *snapshot_log;
107 };
108 
109 /** struct xe_fast_req_fence - Used to track FAST_REQ messages by fence to match error responses */
110 struct xe_fast_req_fence {
111 	/** @fence: sequence number sent in H2G and return in G2H error */
112 	u16 fence;
113 	/** @action: H2G action code */
114 	u16 action;
115 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_GUC)
116 	/** @stack: call stack from when the H2G was sent */
117 	depot_stack_handle_t stack;
118 #endif
119 };
120 #endif
121 
122 /**
123  * struct xe_guc_ct - GuC command transport (CT) layer
124  *
125  * Includes a pair of CT buffers for bi-directional communication and tracking
126  * for the H2G and G2H requests sent and received through the buffers.
127  */
128 struct xe_guc_ct {
129 	/** @bo: XE BO for CT */
130 	struct xe_bo *bo;
131 	/** @lock: protects everything in CT layer */
132 	struct mutex lock;
133 	/** @fast_lock: protects G2H channel and credits */
134 	spinlock_t fast_lock;
135 	/** @ctbs: buffers for sending and receiving commands */
136 	struct {
137 		/** @ctbs.send: Host to GuC (H2G, send) channel */
138 		struct guc_ctb h2g;
139 		/** @ctbs.recv: GuC to Host (G2H, receive) channel */
140 		struct guc_ctb g2h;
141 	} ctbs;
142 	/** @g2h_outstanding: number of outstanding G2H */
143 	u32 g2h_outstanding;
144 	/** @g2h_worker: worker to process G2H messages */
145 	struct work_struct g2h_worker;
146 	/** @safe_mode_worker: worker to check G2H messages with IRQ disabled */
147 	struct delayed_work safe_mode_worker;
148 	/** @state: CT state */
149 	enum xe_guc_ct_state state;
150 	/** @fence_seqno: G2H fence seqno - 16 bits used by CT */
151 	u32 fence_seqno;
152 	/** @fence_lookup: G2H fence lookup */
153 	struct xarray fence_lookup;
154 	/** @wq: wait queue used for reliable CT sends and freeing G2H credits */
155 	wait_queue_head_t wq;
156 	/** @g2h_fence_wq: wait queue used for G2H fencing */
157 	wait_queue_head_t g2h_fence_wq;
158 	/** @g2h_wq: used to process G2H */
159 	struct workqueue_struct *g2h_wq;
160 	/** @msg: Message buffer */
161 	u32 msg[GUC_CTB_MSG_MAX_LEN];
162 	/** @fast_msg: Message buffer */
163 	u32 fast_msg[GUC_CTB_MSG_MAX_LEN];
164 
165 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG)
166 	/** @dead: information for debugging dead CTs */
167 	struct xe_dead_ct dead;
168 	/** @fast_req: history of FAST_REQ messages for matching with G2H error responses */
169 	struct xe_fast_req_fence fast_req[SZ_32];
170 #endif
171 };
172 
173 #endif
174