1// SPDX-License-Identifier: MIT
2/*
3 * Copyright �� 2016-2019 Intel Corporation
4 */
5
6#include <linux/circ_buf.h>
7#include <linux/ktime.h>
8#include <linux/time64.h>
9#include <linux/string_helpers.h>
10#include <linux/timekeeping.h>
11
12#include "i915_drv.h"
13#include "intel_guc_ct.h"
14#include "intel_guc_print.h"
15
16#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GUC)
17enum {
18	CT_DEAD_ALIVE = 0,
19	CT_DEAD_SETUP,
20	CT_DEAD_WRITE,
21	CT_DEAD_DEADLOCK,
22	CT_DEAD_H2G_HAS_ROOM,
23	CT_DEAD_READ,
24	CT_DEAD_PROCESS_FAILED,
25};
26
27static void ct_dead_ct_worker_func(struct work_struct *w);
28
29#define CT_DEAD(ct, reason)	\
30	do { \
31		if (!(ct)->dead_ct_reported) { \
32			(ct)->dead_ct_reason |= 1 << CT_DEAD_##reason; \
33			queue_work(system_unbound_wq, &(ct)->dead_ct_worker); \
34		} \
35	} while (0)
36#else
37#define CT_DEAD(ct, reason)	do { } while (0)
38#endif
39
40static inline struct intel_guc *ct_to_guc(struct intel_guc_ct *ct)
41{
42	return container_of(ct, struct intel_guc, ct);
43}
44
45#define CT_ERROR(_ct, _fmt, ...) \
46	guc_err(ct_to_guc(_ct), "CT: " _fmt, ##__VA_ARGS__)
47#ifdef CONFIG_DRM_I915_DEBUG_GUC
48#define CT_DEBUG(_ct, _fmt, ...) \
49	guc_dbg(ct_to_guc(_ct), "CT: " _fmt, ##__VA_ARGS__)
50#else
51#define CT_DEBUG(...)	do { } while (0)
52#endif
53#define CT_PROBE_ERROR(_ct, _fmt, ...) \
54	guc_probe_error(ct_to_guc(ct), "CT: " _fmt, ##__VA_ARGS__)
55
56/**
57 * DOC: CTB Blob
58 *
59 * We allocate single blob to hold both CTB descriptors and buffers:
60 *
61 *      +--------+-----------------------------------------------+------+
62 *      | offset | contents                                      | size |
63 *      +========+===============================================+======+
64 *      | 0x0000 | H2G `CTB Descriptor`_ (send)                  |      |
65 *      +--------+-----------------------------------------------+  4K  |
66 *      | 0x0800 | G2H `CTB Descriptor`_ (recv)                  |      |
67 *      +--------+-----------------------------------------------+------+
68 *      | 0x1000 | H2G `CT Buffer`_ (send)                       | n*4K |
69 *      |        |                                               |      |
70 *      +--------+-----------------------------------------------+------+
71 *      | 0x1000 | G2H `CT Buffer`_ (recv)                       | m*4K |
72 *      | + n*4K |                                               |      |
73 *      +--------+-----------------------------------------------+------+
74 *
75 * Size of each `CT Buffer`_ must be multiple of 4K.
76 * We don't expect too many messages in flight at any time, unless we are
77 * using the GuC submission. In that case each request requires a minimum
78 * 2 dwords which gives us a maximum 256 queue'd requests. Hopefully this
79 * enough space to avoid backpressure on the driver. We increase the size
80 * of the receive buffer (relative to the send) to ensure a G2H response
81 * CTB has a landing spot.
82 */
83#define CTB_DESC_SIZE		ALIGN(sizeof(struct guc_ct_buffer_desc), SZ_2K)
84#define CTB_H2G_BUFFER_SIZE	(SZ_4K)
85#define CTB_G2H_BUFFER_SIZE	(4 * CTB_H2G_BUFFER_SIZE)
86#define G2H_ROOM_BUFFER_SIZE	(CTB_G2H_BUFFER_SIZE / 4)
87
88struct ct_request {
89	struct list_head link;
90	u32 fence;
91	u32 status;
92	u32 response_len;
93	u32 *response_buf;
94};
95
96struct ct_incoming_msg {
97	struct list_head link;
98	u32 size;
99	u32 msg[] __counted_by(size);
100};
101
102enum { CTB_SEND = 0, CTB_RECV = 1 };
103
104enum { CTB_OWNER_HOST = 0 };
105
106/*
107 * Some H2G commands involve a synchronous response that the driver needs
108 * to wait for. In such cases, a timeout is required to prevent the driver
109 * from waiting forever in the case of an error (either no error response
110 * is defined in the protocol or something has died and requires a reset).
111 * The specific command may be defined as having a time bound response but
112 * the CT is a queue and that time guarantee only starts from the point
113 * when the command reaches the head of the queue and is processed by GuC.
114 *
115 * Ideally there would be a helper to report the progress of a given
116 * command through the CT. However, that would require a significant
117 * amount of work in the CT layer. In the meantime, provide a reasonable
118 * estimation of the worst case latency it should take for the entire
119 * queue to drain. And therefore, how long a caller should wait before
120 * giving up on their request. The current estimate is based on empirical
121 * measurement of a test that fills the buffer with context creation and
122 * destruction requests as they seem to be the slowest operation.
123 */
124long intel_guc_ct_max_queue_time_jiffies(void)
125{
126	/*
127	 * A 4KB buffer full of context destroy commands takes a little
128	 * over a second to process so bump that to 2s to be super safe.
129	 */
130	return (CTB_H2G_BUFFER_SIZE * HZ) / SZ_2K;
131}
132
133static void ct_receive_tasklet_func(struct tasklet_struct *t);
134static void ct_incoming_request_worker_func(struct work_struct *w);
135
136/**
137 * intel_guc_ct_init_early - Initialize CT state without requiring device access
138 * @ct: pointer to CT struct
139 */
140void intel_guc_ct_init_early(struct intel_guc_ct *ct)
141{
142	spin_lock_init(&ct->ctbs.send.lock);
143	spin_lock_init(&ct->ctbs.recv.lock);
144	spin_lock_init(&ct->requests.lock);
145	INIT_LIST_HEAD(&ct->requests.pending);
146	INIT_LIST_HEAD(&ct->requests.incoming);
147#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GUC)
148	INIT_WORK(&ct->dead_ct_worker, ct_dead_ct_worker_func);
149#endif
150	INIT_WORK(&ct->requests.worker, ct_incoming_request_worker_func);
151	tasklet_setup(&ct->receive_tasklet, ct_receive_tasklet_func);
152	init_waitqueue_head(&ct->wq);
153}
154
155static void guc_ct_buffer_desc_init(struct guc_ct_buffer_desc *desc)
156{
157	memset(desc, 0, sizeof(*desc));
158}
159
160static void guc_ct_buffer_reset(struct intel_guc_ct_buffer *ctb)
161{
162	u32 space;
163
164	ctb->broken = false;
165	ctb->tail = 0;
166	ctb->head = 0;
167	space = CIRC_SPACE(ctb->tail, ctb->head, ctb->size) - ctb->resv_space;
168	atomic_set(&ctb->space, space);
169
170	guc_ct_buffer_desc_init(ctb->desc);
171}
172
173static void guc_ct_buffer_init(struct intel_guc_ct_buffer *ctb,
174			       struct guc_ct_buffer_desc *desc,
175			       u32 *cmds, u32 size_in_bytes, u32 resv_space)
176{
177	GEM_BUG_ON(size_in_bytes % 4);
178
179	ctb->desc = desc;
180	ctb->cmds = cmds;
181	ctb->size = size_in_bytes / 4;
182	ctb->resv_space = resv_space / 4;
183
184	guc_ct_buffer_reset(ctb);
185}
186
187static int guc_action_control_ctb(struct intel_guc *guc, u32 control)
188{
189	u32 request[HOST2GUC_CONTROL_CTB_REQUEST_MSG_LEN] = {
190		FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) |
191		FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) |
192		FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, GUC_ACTION_HOST2GUC_CONTROL_CTB),
193		FIELD_PREP(HOST2GUC_CONTROL_CTB_REQUEST_MSG_1_CONTROL, control),
194	};
195	int ret;
196
197	GEM_BUG_ON(control != GUC_CTB_CONTROL_DISABLE && control != GUC_CTB_CONTROL_ENABLE);
198
199	/* CT control must go over MMIO */
200	ret = intel_guc_send_mmio(guc, request, ARRAY_SIZE(request), NULL, 0);
201
202	return ret > 0 ? -EPROTO : ret;
203}
204
205static int ct_control_enable(struct intel_guc_ct *ct, bool enable)
206{
207	int err;
208
209	err = guc_action_control_ctb(ct_to_guc(ct), enable ?
210				     GUC_CTB_CONTROL_ENABLE : GUC_CTB_CONTROL_DISABLE);
211	if (unlikely(err))
212		CT_PROBE_ERROR(ct, "Failed to control/%s CTB (%pe)\n",
213			       str_enable_disable(enable), ERR_PTR(err));
214
215	return err;
216}
217
218static int ct_register_buffer(struct intel_guc_ct *ct, bool send,
219			      u32 desc_addr, u32 buff_addr, u32 size)
220{
221	int err;
222
223	err = intel_guc_self_cfg64(ct_to_guc(ct), send ?
224				   GUC_KLV_SELF_CFG_H2G_CTB_DESCRIPTOR_ADDR_KEY :
225				   GUC_KLV_SELF_CFG_G2H_CTB_DESCRIPTOR_ADDR_KEY,
226				   desc_addr);
227	if (unlikely(err))
228		goto failed;
229
230	err = intel_guc_self_cfg64(ct_to_guc(ct), send ?
231				   GUC_KLV_SELF_CFG_H2G_CTB_ADDR_KEY :
232				   GUC_KLV_SELF_CFG_G2H_CTB_ADDR_KEY,
233				   buff_addr);
234	if (unlikely(err))
235		goto failed;
236
237	err = intel_guc_self_cfg32(ct_to_guc(ct), send ?
238				   GUC_KLV_SELF_CFG_H2G_CTB_SIZE_KEY :
239				   GUC_KLV_SELF_CFG_G2H_CTB_SIZE_KEY,
240				   size);
241	if (unlikely(err))
242failed:
243		CT_PROBE_ERROR(ct, "Failed to register %s buffer (%pe)\n",
244			       send ? "SEND" : "RECV", ERR_PTR(err));
245
246	return err;
247}
248
249/**
250 * intel_guc_ct_init - Init buffer-based communication
251 * @ct: pointer to CT struct
252 *
253 * Allocate memory required for buffer-based communication.
254 *
255 * Return: 0 on success, a negative errno code on failure.
256 */
257int intel_guc_ct_init(struct intel_guc_ct *ct)
258{
259	struct intel_guc *guc = ct_to_guc(ct);
260	struct guc_ct_buffer_desc *desc;
261	u32 blob_size;
262	u32 cmds_size;
263	u32 resv_space;
264	void *blob;
265	u32 *cmds;
266	int err;
267
268	err = i915_inject_probe_error(guc_to_i915(guc), -ENXIO);
269	if (err)
270		return err;
271
272	GEM_BUG_ON(ct->vma);
273
274	blob_size = 2 * CTB_DESC_SIZE + CTB_H2G_BUFFER_SIZE + CTB_G2H_BUFFER_SIZE;
275	err = intel_guc_allocate_and_map_vma(guc, blob_size, &ct->vma, &blob);
276	if (unlikely(err)) {
277		CT_PROBE_ERROR(ct, "Failed to allocate %u for CTB data (%pe)\n",
278			       blob_size, ERR_PTR(err));
279		return err;
280	}
281
282	CT_DEBUG(ct, "base=%#x size=%u\n", intel_guc_ggtt_offset(guc, ct->vma), blob_size);
283
284	/* store pointers to desc and cmds for send ctb */
285	desc = blob;
286	cmds = blob + 2 * CTB_DESC_SIZE;
287	cmds_size = CTB_H2G_BUFFER_SIZE;
288	resv_space = 0;
289	CT_DEBUG(ct, "%s desc %#tx cmds %#tx size %u/%u\n", "send",
290		 ptrdiff(desc, blob), ptrdiff(cmds, blob), cmds_size,
291		 resv_space);
292
293	guc_ct_buffer_init(&ct->ctbs.send, desc, cmds, cmds_size, resv_space);
294
295	/* store pointers to desc and cmds for recv ctb */
296	desc = blob + CTB_DESC_SIZE;
297	cmds = blob + 2 * CTB_DESC_SIZE + CTB_H2G_BUFFER_SIZE;
298	cmds_size = CTB_G2H_BUFFER_SIZE;
299	resv_space = G2H_ROOM_BUFFER_SIZE;
300	CT_DEBUG(ct, "%s desc %#tx cmds %#tx size %u/%u\n", "recv",
301		 ptrdiff(desc, blob), ptrdiff(cmds, blob), cmds_size,
302		 resv_space);
303
304	guc_ct_buffer_init(&ct->ctbs.recv, desc, cmds, cmds_size, resv_space);
305
306	return 0;
307}
308
309/**
310 * intel_guc_ct_fini - Fini buffer-based communication
311 * @ct: pointer to CT struct
312 *
313 * Deallocate memory required for buffer-based communication.
314 */
315void intel_guc_ct_fini(struct intel_guc_ct *ct)
316{
317	GEM_BUG_ON(ct->enabled);
318
319	tasklet_kill(&ct->receive_tasklet);
320	i915_vma_unpin_and_release(&ct->vma, I915_VMA_RELEASE_MAP);
321	memset(ct, 0, sizeof(*ct));
322}
323
324/**
325 * intel_guc_ct_enable - Enable buffer based command transport.
326 * @ct: pointer to CT struct
327 *
328 * Return: 0 on success, a negative errno code on failure.
329 */
330int intel_guc_ct_enable(struct intel_guc_ct *ct)
331{
332	struct intel_guc *guc = ct_to_guc(ct);
333	u32 base, desc, cmds, size;
334	void *blob;
335	int err;
336
337	GEM_BUG_ON(ct->enabled);
338
339	/* vma should be already allocated and map'ed */
340	GEM_BUG_ON(!ct->vma);
341	GEM_BUG_ON(!i915_gem_object_has_pinned_pages(ct->vma->obj));
342	base = intel_guc_ggtt_offset(guc, ct->vma);
343
344	/* blob should start with send descriptor */
345	blob = __px_vaddr(ct->vma->obj);
346	GEM_BUG_ON(blob != ct->ctbs.send.desc);
347
348	/* (re)initialize descriptors */
349	guc_ct_buffer_reset(&ct->ctbs.send);
350	guc_ct_buffer_reset(&ct->ctbs.recv);
351
352	/*
353	 * Register both CT buffers starting with RECV buffer.
354	 * Descriptors are in first half of the blob.
355	 */
356	desc = base + ptrdiff(ct->ctbs.recv.desc, blob);
357	cmds = base + ptrdiff(ct->ctbs.recv.cmds, blob);
358	size = ct->ctbs.recv.size * 4;
359	err = ct_register_buffer(ct, false, desc, cmds, size);
360	if (unlikely(err))
361		goto err_out;
362
363	desc = base + ptrdiff(ct->ctbs.send.desc, blob);
364	cmds = base + ptrdiff(ct->ctbs.send.cmds, blob);
365	size = ct->ctbs.send.size * 4;
366	err = ct_register_buffer(ct, true, desc, cmds, size);
367	if (unlikely(err))
368		goto err_out;
369
370	err = ct_control_enable(ct, true);
371	if (unlikely(err))
372		goto err_out;
373
374	ct->enabled = true;
375	ct->stall_time = KTIME_MAX;
376#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GUC)
377	ct->dead_ct_reported = false;
378	ct->dead_ct_reason = CT_DEAD_ALIVE;
379#endif
380
381	return 0;
382
383err_out:
384	CT_PROBE_ERROR(ct, "Failed to enable CTB (%pe)\n", ERR_PTR(err));
385	CT_DEAD(ct, SETUP);
386	return err;
387}
388
389/**
390 * intel_guc_ct_disable - Disable buffer based command transport.
391 * @ct: pointer to CT struct
392 */
393void intel_guc_ct_disable(struct intel_guc_ct *ct)
394{
395	struct intel_guc *guc = ct_to_guc(ct);
396
397	GEM_BUG_ON(!ct->enabled);
398
399	ct->enabled = false;
400
401	if (intel_guc_is_fw_running(guc)) {
402		ct_control_enable(ct, false);
403	}
404}
405
406#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
407static void ct_track_lost_and_found(struct intel_guc_ct *ct, u32 fence, u32 action)
408{
409	unsigned int lost = fence % ARRAY_SIZE(ct->requests.lost_and_found);
410#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GUC)
411	unsigned long entries[SZ_32];
412	unsigned int n;
413
414	n = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
415
416	/* May be called under spinlock, so avoid sleeping */
417	ct->requests.lost_and_found[lost].stack = stack_depot_save(entries, n, GFP_NOWAIT);
418#endif
419	ct->requests.lost_and_found[lost].fence = fence;
420	ct->requests.lost_and_found[lost].action = action;
421}
422#endif
423
424static u32 ct_get_next_fence(struct intel_guc_ct *ct)
425{
426	/* For now it's trivial */
427	return ++ct->requests.last_fence;
428}
429
430static int ct_write(struct intel_guc_ct *ct,
431		    const u32 *action,
432		    u32 len /* in dwords */,
433		    u32 fence, u32 flags)
434{
435	struct intel_guc_ct_buffer *ctb = &ct->ctbs.send;
436	struct guc_ct_buffer_desc *desc = ctb->desc;
437	u32 tail = ctb->tail;
438	u32 size = ctb->size;
439	u32 header;
440	u32 hxg;
441	u32 type;
442	u32 *cmds = ctb->cmds;
443	unsigned int i;
444
445	if (unlikely(desc->status))
446		goto corrupted;
447
448	GEM_BUG_ON(tail > size);
449
450#ifdef CONFIG_DRM_I915_DEBUG_GUC
451	if (unlikely(tail != READ_ONCE(desc->tail))) {
452		CT_ERROR(ct, "Tail was modified %u != %u\n",
453			 desc->tail, tail);
454		desc->status |= GUC_CTB_STATUS_MISMATCH;
455		goto corrupted;
456	}
457	if (unlikely(READ_ONCE(desc->head) >= size)) {
458		CT_ERROR(ct, "Invalid head offset %u >= %u)\n",
459			 desc->head, size);
460		desc->status |= GUC_CTB_STATUS_OVERFLOW;
461		goto corrupted;
462	}
463#endif
464
465	/*
466	 * dw0: CT header (including fence)
467	 * dw1: HXG header (including action code)
468	 * dw2+: action data
469	 */
470	header = FIELD_PREP(GUC_CTB_MSG_0_FORMAT, GUC_CTB_FORMAT_HXG) |
471		 FIELD_PREP(GUC_CTB_MSG_0_NUM_DWORDS, len) |
472		 FIELD_PREP(GUC_CTB_MSG_0_FENCE, fence);
473
474	type = (flags & INTEL_GUC_CT_SEND_NB) ? GUC_HXG_TYPE_FAST_REQUEST :
475		GUC_HXG_TYPE_REQUEST;
476	hxg = FIELD_PREP(GUC_HXG_MSG_0_TYPE, type) |
477		FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION |
478			   GUC_HXG_REQUEST_MSG_0_DATA0, action[0]);
479
480	CT_DEBUG(ct, "writing (tail %u) %*ph %*ph %*ph\n",
481		 tail, 4, &header, 4, &hxg, 4 * (len - 1), &action[1]);
482
483	cmds[tail] = header;
484	tail = (tail + 1) % size;
485
486	cmds[tail] = hxg;
487	tail = (tail + 1) % size;
488
489	for (i = 1; i < len; i++) {
490		cmds[tail] = action[i];
491		tail = (tail + 1) % size;
492	}
493	GEM_BUG_ON(tail > size);
494
495#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
496	ct_track_lost_and_found(ct, fence,
497				FIELD_GET(GUC_HXG_EVENT_MSG_0_ACTION, action[0]));
498#endif
499
500	/*
501	 * make sure H2G buffer update and LRC tail update (if this triggering a
502	 * submission) are visible before updating the descriptor tail
503	 */
504	intel_guc_write_barrier(ct_to_guc(ct));
505
506	/* update local copies */
507	ctb->tail = tail;
508	GEM_BUG_ON(atomic_read(&ctb->space) < len + GUC_CTB_HDR_LEN);
509	atomic_sub(len + GUC_CTB_HDR_LEN, &ctb->space);
510
511	/* now update descriptor */
512	WRITE_ONCE(desc->tail, tail);
513
514	return 0;
515
516corrupted:
517	CT_ERROR(ct, "Corrupted descriptor head=%u tail=%u status=%#x\n",
518		 desc->head, desc->tail, desc->status);
519	CT_DEAD(ct, WRITE);
520	ctb->broken = true;
521	return -EPIPE;
522}
523
524/**
525 * wait_for_ct_request_update - Wait for CT request state update.
526 * @ct:		pointer to CT
527 * @req:	pointer to pending request
528 * @status:	placeholder for status
529 *
530 * For each sent request, GuC shall send back CT response message.
531 * Our message handler will update status of tracked request once
532 * response message with given fence is received. Wait here and
533 * check for valid response status value.
534 *
535 * Return:
536 * *	0 response received (status is valid)
537 * *	-ETIMEDOUT no response within hardcoded timeout
538 */
539static int wait_for_ct_request_update(struct intel_guc_ct *ct, struct ct_request *req, u32 *status)
540{
541	int err;
542	bool ct_enabled;
543
544	/*
545	 * Fast commands should complete in less than 10us, so sample quickly
546	 * up to that length of time, then switch to a slower sleep-wait loop.
547	 * No GuC command should ever take longer than 10ms but many GuC
548	 * commands can be inflight at time, so use a 1s timeout on the slower
549	 * sleep-wait loop.
550	 */
551#define GUC_CTB_RESPONSE_TIMEOUT_SHORT_MS 10
552#define GUC_CTB_RESPONSE_TIMEOUT_LONG_MS 1000
553#define done \
554	(!(ct_enabled = intel_guc_ct_enabled(ct)) || \
555	 FIELD_GET(GUC_HXG_MSG_0_ORIGIN, READ_ONCE(req->status)) == \
556	 GUC_HXG_ORIGIN_GUC)
557	err = wait_for_us(done, GUC_CTB_RESPONSE_TIMEOUT_SHORT_MS);
558	if (err)
559		err = wait_for(done, GUC_CTB_RESPONSE_TIMEOUT_LONG_MS);
560#undef done
561	if (!ct_enabled)
562		err = -ENODEV;
563
564	*status = req->status;
565	return err;
566}
567
568#define GUC_CTB_TIMEOUT_MS	1500
569static inline bool ct_deadlocked(struct intel_guc_ct *ct)
570{
571	long timeout = GUC_CTB_TIMEOUT_MS;
572	bool ret = ktime_ms_delta(ktime_get(), ct->stall_time) > timeout;
573
574	if (unlikely(ret)) {
575		struct guc_ct_buffer_desc *send = ct->ctbs.send.desc;
576		struct guc_ct_buffer_desc *recv = ct->ctbs.send.desc;
577
578		CT_ERROR(ct, "Communication stalled for %lld ms, desc status=%#x,%#x\n",
579			 ktime_ms_delta(ktime_get(), ct->stall_time),
580			 send->status, recv->status);
581		CT_ERROR(ct, "H2G Space: %u (Bytes)\n",
582			 atomic_read(&ct->ctbs.send.space) * 4);
583		CT_ERROR(ct, "Head: %u (Dwords)\n", ct->ctbs.send.desc->head);
584		CT_ERROR(ct, "Tail: %u (Dwords)\n", ct->ctbs.send.desc->tail);
585		CT_ERROR(ct, "G2H Space: %u (Bytes)\n",
586			 atomic_read(&ct->ctbs.recv.space) * 4);
587		CT_ERROR(ct, "Head: %u\n (Dwords)", ct->ctbs.recv.desc->head);
588		CT_ERROR(ct, "Tail: %u\n (Dwords)", ct->ctbs.recv.desc->tail);
589
590		CT_DEAD(ct, DEADLOCK);
591		ct->ctbs.send.broken = true;
592	}
593
594	return ret;
595}
596
597static inline bool g2h_has_room(struct intel_guc_ct *ct, u32 g2h_len_dw)
598{
599	struct intel_guc_ct_buffer *ctb = &ct->ctbs.recv;
600
601	/*
602	 * We leave a certain amount of space in the G2H CTB buffer for
603	 * unexpected G2H CTBs (e.g. logging, engine hang, etc...)
604	 */
605	return !g2h_len_dw || atomic_read(&ctb->space) >= g2h_len_dw;
606}
607
608static inline void g2h_reserve_space(struct intel_guc_ct *ct, u32 g2h_len_dw)
609{
610	lockdep_assert_held(&ct->ctbs.send.lock);
611
612	GEM_BUG_ON(!g2h_has_room(ct, g2h_len_dw));
613
614	if (g2h_len_dw)
615		atomic_sub(g2h_len_dw, &ct->ctbs.recv.space);
616}
617
618static inline void g2h_release_space(struct intel_guc_ct *ct, u32 g2h_len_dw)
619{
620	atomic_add(g2h_len_dw, &ct->ctbs.recv.space);
621}
622
623static inline bool h2g_has_room(struct intel_guc_ct *ct, u32 len_dw)
624{
625	struct intel_guc_ct_buffer *ctb = &ct->ctbs.send;
626	struct guc_ct_buffer_desc *desc = ctb->desc;
627	u32 head;
628	u32 space;
629
630	if (atomic_read(&ctb->space) >= len_dw)
631		return true;
632
633	head = READ_ONCE(desc->head);
634	if (unlikely(head > ctb->size)) {
635		CT_ERROR(ct, "Invalid head offset %u >= %u)\n",
636			 head, ctb->size);
637		desc->status |= GUC_CTB_STATUS_OVERFLOW;
638		ctb->broken = true;
639		CT_DEAD(ct, H2G_HAS_ROOM);
640		return false;
641	}
642
643	space = CIRC_SPACE(ctb->tail, head, ctb->size);
644	atomic_set(&ctb->space, space);
645
646	return space >= len_dw;
647}
648
649static int has_room_nb(struct intel_guc_ct *ct, u32 h2g_dw, u32 g2h_dw)
650{
651	bool h2g = h2g_has_room(ct, h2g_dw);
652	bool g2h = g2h_has_room(ct, g2h_dw);
653
654	lockdep_assert_held(&ct->ctbs.send.lock);
655
656	if (unlikely(!h2g || !g2h)) {
657		if (ct->stall_time == KTIME_MAX)
658			ct->stall_time = ktime_get();
659
660		/* Be paranoid and kick G2H tasklet to free credits */
661		if (!g2h)
662			tasklet_hi_schedule(&ct->receive_tasklet);
663
664		if (unlikely(ct_deadlocked(ct)))
665			return -EPIPE;
666		else
667			return -EBUSY;
668	}
669
670	ct->stall_time = KTIME_MAX;
671	return 0;
672}
673
674#define G2H_LEN_DW(f) ({ \
675	typeof(f) f_ = (f); \
676	FIELD_GET(INTEL_GUC_CT_SEND_G2H_DW_MASK, f_) ? \
677	FIELD_GET(INTEL_GUC_CT_SEND_G2H_DW_MASK, f_) + \
678	GUC_CTB_HXG_MSG_MIN_LEN : 0; \
679})
680static int ct_send_nb(struct intel_guc_ct *ct,
681		      const u32 *action,
682		      u32 len,
683		      u32 flags)
684{
685	struct intel_guc_ct_buffer *ctb = &ct->ctbs.send;
686	unsigned long spin_flags;
687	u32 g2h_len_dw = G2H_LEN_DW(flags);
688	u32 fence;
689	int ret;
690
691	spin_lock_irqsave(&ctb->lock, spin_flags);
692
693	ret = has_room_nb(ct, len + GUC_CTB_HDR_LEN, g2h_len_dw);
694	if (unlikely(ret))
695		goto out;
696
697	fence = ct_get_next_fence(ct);
698	ret = ct_write(ct, action, len, fence, flags);
699	if (unlikely(ret))
700		goto out;
701
702	g2h_reserve_space(ct, g2h_len_dw);
703	intel_guc_notify(ct_to_guc(ct));
704
705out:
706	spin_unlock_irqrestore(&ctb->lock, spin_flags);
707
708	return ret;
709}
710
711static int ct_send(struct intel_guc_ct *ct,
712		   const u32 *action,
713		   u32 len,
714		   u32 *response_buf,
715		   u32 response_buf_size,
716		   u32 *status)
717{
718	struct intel_guc_ct_buffer *ctb = &ct->ctbs.send;
719	struct ct_request request;
720	unsigned long flags;
721	unsigned int sleep_period_ms = 1;
722	bool send_again;
723	u32 fence;
724	int err;
725
726	GEM_BUG_ON(!ct->enabled);
727	GEM_BUG_ON(!len);
728	GEM_BUG_ON(len > GUC_CTB_HXG_MSG_MAX_LEN - GUC_CTB_HDR_LEN);
729	GEM_BUG_ON(!response_buf && response_buf_size);
730	might_sleep();
731
732resend:
733	send_again = false;
734
735	/*
736	 * We use a lazy spin wait loop here as we believe that if the CT
737	 * buffers are sized correctly the flow control condition should be
738	 * rare. Reserving the maximum size in the G2H credits as we don't know
739	 * how big the response is going to be.
740	 */
741retry:
742	spin_lock_irqsave(&ctb->lock, flags);
743	if (unlikely(!h2g_has_room(ct, len + GUC_CTB_HDR_LEN) ||
744		     !g2h_has_room(ct, GUC_CTB_HXG_MSG_MAX_LEN))) {
745		if (ct->stall_time == KTIME_MAX)
746			ct->stall_time = ktime_get();
747		spin_unlock_irqrestore(&ctb->lock, flags);
748
749		if (unlikely(ct_deadlocked(ct)))
750			return -EPIPE;
751
752		if (msleep_interruptible(sleep_period_ms))
753			return -EINTR;
754		sleep_period_ms = sleep_period_ms << 1;
755
756		goto retry;
757	}
758
759	ct->stall_time = KTIME_MAX;
760
761	fence = ct_get_next_fence(ct);
762	request.fence = fence;
763	request.status = 0;
764	request.response_len = response_buf_size;
765	request.response_buf = response_buf;
766
767	spin_lock(&ct->requests.lock);
768	list_add_tail(&request.link, &ct->requests.pending);
769	spin_unlock(&ct->requests.lock);
770
771	err = ct_write(ct, action, len, fence, 0);
772	g2h_reserve_space(ct, GUC_CTB_HXG_MSG_MAX_LEN);
773
774	spin_unlock_irqrestore(&ctb->lock, flags);
775
776	if (unlikely(err))
777		goto unlink;
778
779	intel_guc_notify(ct_to_guc(ct));
780
781	err = wait_for_ct_request_update(ct, &request, status);
782	g2h_release_space(ct, GUC_CTB_HXG_MSG_MAX_LEN);
783	if (unlikely(err)) {
784		if (err == -ENODEV)
785			/* wait_for_ct_request_update returns -ENODEV on reset/suspend in progress.
786			 * In this case, output is debug rather than error info
787			 */
788			CT_DEBUG(ct, "Request %#x (fence %u) cancelled as CTB is disabled\n",
789				 action[0], request.fence);
790		else
791			CT_ERROR(ct, "No response for request %#x (fence %u)\n",
792				 action[0], request.fence);
793		goto unlink;
794	}
795
796	if (FIELD_GET(GUC_HXG_MSG_0_TYPE, *status) == GUC_HXG_TYPE_NO_RESPONSE_RETRY) {
797		CT_DEBUG(ct, "retrying request %#x (%u)\n", *action,
798			 FIELD_GET(GUC_HXG_RETRY_MSG_0_REASON, *status));
799		send_again = true;
800		goto unlink;
801	}
802
803	if (FIELD_GET(GUC_HXG_MSG_0_TYPE, *status) != GUC_HXG_TYPE_RESPONSE_SUCCESS) {
804		err = -EIO;
805		goto unlink;
806	}
807
808	if (response_buf) {
809		/* There shall be no data in the status */
810		WARN_ON(FIELD_GET(GUC_HXG_RESPONSE_MSG_0_DATA0, request.status));
811		/* Return actual response len */
812		err = request.response_len;
813	} else {
814		/* There shall be no response payload */
815		WARN_ON(request.response_len);
816		/* Return data decoded from the status dword */
817		err = FIELD_GET(GUC_HXG_RESPONSE_MSG_0_DATA0, *status);
818	}
819
820unlink:
821	spin_lock_irqsave(&ct->requests.lock, flags);
822	list_del(&request.link);
823	spin_unlock_irqrestore(&ct->requests.lock, flags);
824
825	if (unlikely(send_again))
826		goto resend;
827
828	return err;
829}
830
831/*
832 * Command Transport (CT) buffer based GuC send function.
833 */
834int intel_guc_ct_send(struct intel_guc_ct *ct, const u32 *action, u32 len,
835		      u32 *response_buf, u32 response_buf_size, u32 flags)
836{
837	u32 status = ~0; /* undefined */
838	int ret;
839
840	if (unlikely(!ct->enabled)) {
841		struct intel_guc *guc = ct_to_guc(ct);
842		struct intel_uc *uc = container_of(guc, struct intel_uc, guc);
843
844		WARN(!uc->reset_in_progress, "Unexpected send: action=%#x\n", *action);
845		return -ENODEV;
846	}
847
848	if (unlikely(ct->ctbs.send.broken))
849		return -EPIPE;
850
851	if (flags & INTEL_GUC_CT_SEND_NB)
852		return ct_send_nb(ct, action, len, flags);
853
854	ret = ct_send(ct, action, len, response_buf, response_buf_size, &status);
855	if (unlikely(ret < 0)) {
856		if (ret != -ENODEV)
857			CT_ERROR(ct, "Sending action %#x failed (%pe) status=%#X\n",
858				 action[0], ERR_PTR(ret), status);
859	} else if (unlikely(ret)) {
860		CT_DEBUG(ct, "send action %#x returned %d (%#x)\n",
861			 action[0], ret, ret);
862	}
863
864	return ret;
865}
866
867static struct ct_incoming_msg *ct_alloc_msg(u32 num_dwords)
868{
869	struct ct_incoming_msg *msg;
870
871	msg = kmalloc(struct_size(msg, msg, num_dwords), GFP_ATOMIC);
872	if (msg)
873		msg->size = num_dwords;
874	return msg;
875}
876
877static void ct_free_msg(struct ct_incoming_msg *msg)
878{
879	kfree(msg);
880}
881
882/*
883 * Return: number available remaining dwords to read (0 if empty)
884 *         or a negative error code on failure
885 */
886static int ct_read(struct intel_guc_ct *ct, struct ct_incoming_msg **msg)
887{
888	struct intel_guc_ct_buffer *ctb = &ct->ctbs.recv;
889	struct guc_ct_buffer_desc *desc = ctb->desc;
890	u32 head = ctb->head;
891	u32 tail = READ_ONCE(desc->tail);
892	u32 size = ctb->size;
893	u32 *cmds = ctb->cmds;
894	s32 available;
895	unsigned int len;
896	unsigned int i;
897	u32 header;
898
899	if (unlikely(ctb->broken))
900		return -EPIPE;
901
902	if (unlikely(desc->status)) {
903		u32 status = desc->status;
904
905		if (status & GUC_CTB_STATUS_UNUSED) {
906			/*
907			 * Potentially valid if a CLIENT_RESET request resulted in
908			 * contexts/engines being reset. But should never happen as
909			 * no contexts should be active when CLIENT_RESET is sent.
910			 */
911			CT_ERROR(ct, "Unexpected G2H after GuC has stopped!\n");
912			status &= ~GUC_CTB_STATUS_UNUSED;
913		}
914
915		if (status)
916			goto corrupted;
917	}
918
919	GEM_BUG_ON(head > size);
920
921#ifdef CONFIG_DRM_I915_DEBUG_GUC
922	if (unlikely(head != READ_ONCE(desc->head))) {
923		CT_ERROR(ct, "Head was modified %u != %u\n",
924			 desc->head, head);
925		desc->status |= GUC_CTB_STATUS_MISMATCH;
926		goto corrupted;
927	}
928#endif
929	if (unlikely(tail >= size)) {
930		CT_ERROR(ct, "Invalid tail offset %u >= %u)\n",
931			 tail, size);
932		desc->status |= GUC_CTB_STATUS_OVERFLOW;
933		goto corrupted;
934	}
935
936	/* tail == head condition indicates empty */
937	available = tail - head;
938	if (unlikely(available == 0)) {
939		*msg = NULL;
940		return 0;
941	}
942
943	/* beware of buffer wrap case */
944	if (unlikely(available < 0))
945		available += size;
946	CT_DEBUG(ct, "available %d (%u:%u:%u)\n", available, head, tail, size);
947	GEM_BUG_ON(available < 0);
948
949	header = cmds[head];
950	head = (head + 1) % size;
951
952	/* message len with header */
953	len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, header) + GUC_CTB_MSG_MIN_LEN;
954	if (unlikely(len > (u32)available)) {
955		CT_ERROR(ct, "Incomplete message %*ph %*ph %*ph\n",
956			 4, &header,
957			 4 * (head + available - 1 > size ?
958			      size - head : available - 1), &cmds[head],
959			 4 * (head + available - 1 > size ?
960			      available - 1 - size + head : 0), &cmds[0]);
961		desc->status |= GUC_CTB_STATUS_UNDERFLOW;
962		goto corrupted;
963	}
964
965	*msg = ct_alloc_msg(len);
966	if (!*msg) {
967		CT_ERROR(ct, "No memory for message %*ph %*ph %*ph\n",
968			 4, &header,
969			 4 * (head + available - 1 > size ?
970			      size - head : available - 1), &cmds[head],
971			 4 * (head + available - 1 > size ?
972			      available - 1 - size + head : 0), &cmds[0]);
973		return available;
974	}
975
976	(*msg)->msg[0] = header;
977
978	for (i = 1; i < len; i++) {
979		(*msg)->msg[i] = cmds[head];
980		head = (head + 1) % size;
981	}
982	CT_DEBUG(ct, "received %*ph\n", 4 * len, (*msg)->msg);
983
984	/* update local copies */
985	ctb->head = head;
986
987	/* now update descriptor */
988	WRITE_ONCE(desc->head, head);
989
990	intel_guc_write_barrier(ct_to_guc(ct));
991
992	return available - len;
993
994corrupted:
995	CT_ERROR(ct, "Corrupted descriptor head=%u tail=%u status=%#x\n",
996		 desc->head, desc->tail, desc->status);
997	ctb->broken = true;
998	CT_DEAD(ct, READ);
999	return -EPIPE;
1000}
1001
1002#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
1003static bool ct_check_lost_and_found(struct intel_guc_ct *ct, u32 fence)
1004{
1005	unsigned int n;
1006	char *buf = NULL;
1007	bool found = false;
1008
1009	lockdep_assert_held(&ct->requests.lock);
1010
1011	for (n = 0; n < ARRAY_SIZE(ct->requests.lost_and_found); n++) {
1012		if (ct->requests.lost_and_found[n].fence != fence)
1013			continue;
1014		found = true;
1015
1016#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GUC)
1017		buf = kmalloc(SZ_4K, GFP_NOWAIT);
1018		if (buf && stack_depot_snprint(ct->requests.lost_and_found[n].stack,
1019					       buf, SZ_4K, 0)) {
1020			CT_ERROR(ct, "Fence %u was used by action %#04x sent at\n%s",
1021				 fence, ct->requests.lost_and_found[n].action, buf);
1022			break;
1023		}
1024#endif
1025		CT_ERROR(ct, "Fence %u was used by action %#04x\n",
1026			 fence, ct->requests.lost_and_found[n].action);
1027		break;
1028	}
1029	kfree(buf);
1030	return found;
1031}
1032#else
1033static bool ct_check_lost_and_found(struct intel_guc_ct *ct, u32 fence)
1034{
1035	return false;
1036}
1037#endif
1038
1039static int ct_handle_response(struct intel_guc_ct *ct, struct ct_incoming_msg *response)
1040{
1041	u32 len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, response->msg[0]);
1042	u32 fence = FIELD_GET(GUC_CTB_MSG_0_FENCE, response->msg[0]);
1043	const u32 *hxg = &response->msg[GUC_CTB_MSG_MIN_LEN];
1044	const u32 *data = &hxg[GUC_HXG_MSG_MIN_LEN];
1045	u32 datalen = len - GUC_HXG_MSG_MIN_LEN;
1046	struct ct_request *req;
1047	unsigned long flags;
1048	bool found = false;
1049	int err = 0;
1050
1051	GEM_BUG_ON(len < GUC_HXG_MSG_MIN_LEN);
1052	GEM_BUG_ON(FIELD_GET(GUC_HXG_MSG_0_ORIGIN, hxg[0]) != GUC_HXG_ORIGIN_GUC);
1053	GEM_BUG_ON(FIELD_GET(GUC_HXG_MSG_0_TYPE, hxg[0]) != GUC_HXG_TYPE_RESPONSE_SUCCESS &&
1054		   FIELD_GET(GUC_HXG_MSG_0_TYPE, hxg[0]) != GUC_HXG_TYPE_NO_RESPONSE_RETRY &&
1055		   FIELD_GET(GUC_HXG_MSG_0_TYPE, hxg[0]) != GUC_HXG_TYPE_RESPONSE_FAILURE);
1056
1057	CT_DEBUG(ct, "response fence %u status %#x\n", fence, hxg[0]);
1058
1059	spin_lock_irqsave(&ct->requests.lock, flags);
1060	list_for_each_entry(req, &ct->requests.pending, link) {
1061		if (unlikely(fence != req->fence)) {
1062			CT_DEBUG(ct, "request %u awaits response\n",
1063				 req->fence);
1064			continue;
1065		}
1066		if (unlikely(datalen > req->response_len)) {
1067			CT_ERROR(ct, "Response %u too long (datalen %u > %u)\n",
1068				 req->fence, datalen, req->response_len);
1069			datalen = min(datalen, req->response_len);
1070			err = -EMSGSIZE;
1071		}
1072		if (datalen)
1073			memcpy(req->response_buf, data, 4 * datalen);
1074		req->response_len = datalen;
1075		WRITE_ONCE(req->status, hxg[0]);
1076		found = true;
1077		break;
1078	}
1079
1080#ifdef CONFIG_DRM_I915_SELFTEST
1081	if (!found && ct_to_guc(ct)->fast_response_selftest) {
1082		CT_DEBUG(ct, "Assuming unsolicited response due to FAST_REQUEST selftest\n");
1083		ct_to_guc(ct)->fast_response_selftest++;
1084		found = true;
1085	}
1086#endif
1087
1088	if (!found) {
1089		CT_ERROR(ct, "Unsolicited response message: len %u, data %#x (fence %u, last %u)\n",
1090			 len, hxg[0], fence, ct->requests.last_fence);
1091		if (!ct_check_lost_and_found(ct, fence)) {
1092			list_for_each_entry(req, &ct->requests.pending, link)
1093				CT_ERROR(ct, "request %u awaits response\n",
1094					 req->fence);
1095		}
1096		err = -ENOKEY;
1097	}
1098	spin_unlock_irqrestore(&ct->requests.lock, flags);
1099
1100	if (unlikely(err))
1101		return err;
1102
1103	ct_free_msg(response);
1104	return 0;
1105}
1106
1107static int ct_process_request(struct intel_guc_ct *ct, struct ct_incoming_msg *request)
1108{
1109	struct intel_guc *guc = ct_to_guc(ct);
1110	const u32 *hxg;
1111	const u32 *payload;
1112	u32 hxg_len, action, len;
1113	int ret;
1114
1115	hxg = &request->msg[GUC_CTB_MSG_MIN_LEN];
1116	hxg_len = request->size - GUC_CTB_MSG_MIN_LEN;
1117	payload = &hxg[GUC_HXG_MSG_MIN_LEN];
1118	action = FIELD_GET(GUC_HXG_EVENT_MSG_0_ACTION, hxg[0]);
1119	len = hxg_len - GUC_HXG_MSG_MIN_LEN;
1120
1121	CT_DEBUG(ct, "request %x %*ph\n", action, 4 * len, payload);
1122
1123	switch (action) {
1124	case INTEL_GUC_ACTION_DEFAULT:
1125		ret = intel_guc_to_host_process_recv_msg(guc, payload, len);
1126		break;
1127	case INTEL_GUC_ACTION_DEREGISTER_CONTEXT_DONE:
1128		ret = intel_guc_deregister_done_process_msg(guc, payload,
1129							    len);
1130		break;
1131	case INTEL_GUC_ACTION_SCHED_CONTEXT_MODE_DONE:
1132		ret = intel_guc_sched_done_process_msg(guc, payload, len);
1133		break;
1134	case INTEL_GUC_ACTION_CONTEXT_RESET_NOTIFICATION:
1135		ret = intel_guc_context_reset_process_msg(guc, payload, len);
1136		break;
1137	case INTEL_GUC_ACTION_STATE_CAPTURE_NOTIFICATION:
1138		ret = intel_guc_error_capture_process_msg(guc, payload, len);
1139		if (unlikely(ret))
1140			CT_ERROR(ct, "error capture notification failed %x %*ph\n",
1141				 action, 4 * len, payload);
1142		break;
1143	case INTEL_GUC_ACTION_ENGINE_FAILURE_NOTIFICATION:
1144		ret = intel_guc_engine_failure_process_msg(guc, payload, len);
1145		break;
1146	case INTEL_GUC_ACTION_NOTIFY_FLUSH_LOG_BUFFER_TO_FILE:
1147		intel_guc_log_handle_flush_event(&guc->log);
1148		ret = 0;
1149		break;
1150	case INTEL_GUC_ACTION_NOTIFY_CRASH_DUMP_POSTED:
1151	case INTEL_GUC_ACTION_NOTIFY_EXCEPTION:
1152		ret = intel_guc_crash_process_msg(guc, action);
1153		break;
1154	case INTEL_GUC_ACTION_TLB_INVALIDATION_DONE:
1155		ret = intel_guc_tlb_invalidation_done(guc, payload, len);
1156		break;
1157	default:
1158		ret = -EOPNOTSUPP;
1159		break;
1160	}
1161
1162	if (unlikely(ret)) {
1163		CT_ERROR(ct, "Failed to process request %04x (%pe)\n",
1164			 action, ERR_PTR(ret));
1165		return ret;
1166	}
1167
1168	ct_free_msg(request);
1169	return 0;
1170}
1171
1172static bool ct_process_incoming_requests(struct intel_guc_ct *ct)
1173{
1174	unsigned long flags;
1175	struct ct_incoming_msg *request;
1176	bool done;
1177	int err;
1178
1179	spin_lock_irqsave(&ct->requests.lock, flags);
1180	request = list_first_entry_or_null(&ct->requests.incoming,
1181					   struct ct_incoming_msg, link);
1182	if (request)
1183		list_del(&request->link);
1184	done = !!list_empty(&ct->requests.incoming);
1185	spin_unlock_irqrestore(&ct->requests.lock, flags);
1186
1187	if (!request)
1188		return true;
1189
1190	err = ct_process_request(ct, request);
1191	if (unlikely(err)) {
1192		CT_ERROR(ct, "Failed to process CT message (%pe) %*ph\n",
1193			 ERR_PTR(err), 4 * request->size, request->msg);
1194		CT_DEAD(ct, PROCESS_FAILED);
1195		ct_free_msg(request);
1196	}
1197
1198	return done;
1199}
1200
1201static void ct_incoming_request_worker_func(struct work_struct *w)
1202{
1203	struct intel_guc_ct *ct =
1204		container_of(w, struct intel_guc_ct, requests.worker);
1205	bool done;
1206
1207	do {
1208		done = ct_process_incoming_requests(ct);
1209	} while (!done);
1210}
1211
1212static int ct_handle_event(struct intel_guc_ct *ct, struct ct_incoming_msg *request)
1213{
1214	const u32 *hxg = &request->msg[GUC_CTB_MSG_MIN_LEN];
1215	u32 action = FIELD_GET(GUC_HXG_EVENT_MSG_0_ACTION, hxg[0]);
1216	unsigned long flags;
1217
1218	GEM_BUG_ON(FIELD_GET(GUC_HXG_MSG_0_TYPE, hxg[0]) != GUC_HXG_TYPE_EVENT);
1219
1220	/*
1221	 * Adjusting the space must be done in IRQ or deadlock can occur as the
1222	 * CTB processing in the below workqueue can send CTBs which creates a
1223	 * circular dependency if the space was returned there.
1224	 */
1225	switch (action) {
1226	case INTEL_GUC_ACTION_SCHED_CONTEXT_MODE_DONE:
1227	case INTEL_GUC_ACTION_DEREGISTER_CONTEXT_DONE:
1228	case INTEL_GUC_ACTION_TLB_INVALIDATION_DONE:
1229		g2h_release_space(ct, request->size);
1230	}
1231
1232	/*
1233	 * TLB invalidation responses must be handled immediately as processing
1234	 * of other G2H notifications may be blocked by an invalidation request.
1235	 */
1236	if (action == INTEL_GUC_ACTION_TLB_INVALIDATION_DONE)
1237		return ct_process_request(ct, request);
1238
1239	spin_lock_irqsave(&ct->requests.lock, flags);
1240	list_add_tail(&request->link, &ct->requests.incoming);
1241	spin_unlock_irqrestore(&ct->requests.lock, flags);
1242
1243	queue_work(system_unbound_wq, &ct->requests.worker);
1244	return 0;
1245}
1246
1247static int ct_handle_hxg(struct intel_guc_ct *ct, struct ct_incoming_msg *msg)
1248{
1249	u32 origin, type;
1250	u32 *hxg;
1251	int err;
1252
1253	if (unlikely(msg->size < GUC_CTB_HXG_MSG_MIN_LEN))
1254		return -EBADMSG;
1255
1256	hxg = &msg->msg[GUC_CTB_MSG_MIN_LEN];
1257
1258	origin = FIELD_GET(GUC_HXG_MSG_0_ORIGIN, hxg[0]);
1259	if (unlikely(origin != GUC_HXG_ORIGIN_GUC)) {
1260		err = -EPROTO;
1261		goto failed;
1262	}
1263
1264	type = FIELD_GET(GUC_HXG_MSG_0_TYPE, hxg[0]);
1265	switch (type) {
1266	case GUC_HXG_TYPE_EVENT:
1267		err = ct_handle_event(ct, msg);
1268		break;
1269	case GUC_HXG_TYPE_RESPONSE_SUCCESS:
1270	case GUC_HXG_TYPE_RESPONSE_FAILURE:
1271	case GUC_HXG_TYPE_NO_RESPONSE_RETRY:
1272		err = ct_handle_response(ct, msg);
1273		break;
1274	default:
1275		err = -EOPNOTSUPP;
1276	}
1277
1278	if (unlikely(err)) {
1279failed:
1280		CT_ERROR(ct, "Failed to handle HXG message (%pe) %*ph\n",
1281			 ERR_PTR(err), 4 * GUC_HXG_MSG_MIN_LEN, hxg);
1282	}
1283	return err;
1284}
1285
1286static void ct_handle_msg(struct intel_guc_ct *ct, struct ct_incoming_msg *msg)
1287{
1288	u32 format = FIELD_GET(GUC_CTB_MSG_0_FORMAT, msg->msg[0]);
1289	int err;
1290
1291	if (format == GUC_CTB_FORMAT_HXG)
1292		err = ct_handle_hxg(ct, msg);
1293	else
1294		err = -EOPNOTSUPP;
1295
1296	if (unlikely(err)) {
1297		CT_ERROR(ct, "Failed to process CT message (%pe) %*ph\n",
1298			 ERR_PTR(err), 4 * msg->size, msg->msg);
1299		ct_free_msg(msg);
1300	}
1301}
1302
1303/*
1304 * Return: number available remaining dwords to read (0 if empty)
1305 *         or a negative error code on failure
1306 */
1307static int ct_receive(struct intel_guc_ct *ct)
1308{
1309	struct ct_incoming_msg *msg = NULL;
1310	unsigned long flags;
1311	int ret;
1312
1313	spin_lock_irqsave(&ct->ctbs.recv.lock, flags);
1314	ret = ct_read(ct, &msg);
1315	spin_unlock_irqrestore(&ct->ctbs.recv.lock, flags);
1316	if (ret < 0)
1317		return ret;
1318
1319	if (msg)
1320		ct_handle_msg(ct, msg);
1321
1322	return ret;
1323}
1324
1325static void ct_try_receive_message(struct intel_guc_ct *ct)
1326{
1327	int ret;
1328
1329	if (GEM_WARN_ON(!ct->enabled))
1330		return;
1331
1332	ret = ct_receive(ct);
1333	if (ret > 0)
1334		tasklet_hi_schedule(&ct->receive_tasklet);
1335}
1336
1337static void ct_receive_tasklet_func(struct tasklet_struct *t)
1338{
1339	struct intel_guc_ct *ct = from_tasklet(ct, t, receive_tasklet);
1340
1341	ct_try_receive_message(ct);
1342}
1343
1344/*
1345 * When we're communicating with the GuC over CT, GuC uses events
1346 * to notify us about new messages being posted on the RECV buffer.
1347 */
1348void intel_guc_ct_event_handler(struct intel_guc_ct *ct)
1349{
1350	if (unlikely(!ct->enabled)) {
1351		WARN(1, "Unexpected GuC event received while CT disabled!\n");
1352		return;
1353	}
1354
1355	ct_try_receive_message(ct);
1356}
1357
1358void intel_guc_ct_print_info(struct intel_guc_ct *ct,
1359			     struct drm_printer *p)
1360{
1361	drm_printf(p, "CT %s\n", str_enabled_disabled(ct->enabled));
1362
1363	if (!ct->enabled)
1364		return;
1365
1366	drm_printf(p, "H2G Space: %u\n",
1367		   atomic_read(&ct->ctbs.send.space) * 4);
1368	drm_printf(p, "Head: %u\n",
1369		   ct->ctbs.send.desc->head);
1370	drm_printf(p, "Tail: %u\n",
1371		   ct->ctbs.send.desc->tail);
1372	drm_printf(p, "G2H Space: %u\n",
1373		   atomic_read(&ct->ctbs.recv.space) * 4);
1374	drm_printf(p, "Head: %u\n",
1375		   ct->ctbs.recv.desc->head);
1376	drm_printf(p, "Tail: %u\n",
1377		   ct->ctbs.recv.desc->tail);
1378}
1379
1380#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GUC)
1381static void ct_dead_ct_worker_func(struct work_struct *w)
1382{
1383	struct intel_guc_ct *ct = container_of(w, struct intel_guc_ct, dead_ct_worker);
1384	struct intel_guc *guc = ct_to_guc(ct);
1385
1386	if (ct->dead_ct_reported)
1387		return;
1388
1389	ct->dead_ct_reported = true;
1390
1391	guc_info(guc, "CTB is dead - reason=0x%X\n", ct->dead_ct_reason);
1392	intel_klog_error_capture(guc_to_gt(guc), (intel_engine_mask_t)~0U);
1393}
1394#endif
1395