xref: /linux/drivers/gpu/drm/xe/xe_guc_relay.c (revision 7f71507851fc7764b36a3221839607d3a45c2025)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2023 Intel Corporation
4  */
5 
6 #include <linux/bitfield.h>
7 #include <linux/delay.h>
8 #include <linux/fault-inject.h>
9 
10 #include <drm/drm_managed.h>
11 
12 #include <kunit/static_stub.h>
13 #include <kunit/test-bug.h>
14 
15 #include "abi/guc_actions_sriov_abi.h"
16 #include "abi/guc_relay_actions_abi.h"
17 #include "abi/guc_relay_communication_abi.h"
18 
19 #include "xe_assert.h"
20 #include "xe_device.h"
21 #include "xe_gt.h"
22 #include "xe_gt_sriov_printk.h"
23 #include "xe_gt_sriov_pf_service.h"
24 #include "xe_guc.h"
25 #include "xe_guc_ct.h"
26 #include "xe_guc_hxg_helpers.h"
27 #include "xe_guc_relay.h"
28 #include "xe_guc_relay_types.h"
29 #include "xe_sriov.h"
30 
31 /*
32  * How long should we wait for the response?
33  * XXX this value is subject for the profiling.
34  */
35 #define RELAY_TIMEOUT_MSEC	(2500)
36 
37 static void relays_worker_fn(struct work_struct *w);
38 
39 static struct xe_guc *relay_to_guc(struct xe_guc_relay *relay)
40 {
41 	return container_of(relay, struct xe_guc, relay);
42 }
43 
44 static struct xe_guc_ct *relay_to_ct(struct xe_guc_relay *relay)
45 {
46 	return &relay_to_guc(relay)->ct;
47 }
48 
49 static struct xe_gt *relay_to_gt(struct xe_guc_relay *relay)
50 {
51 	return guc_to_gt(relay_to_guc(relay));
52 }
53 
54 static struct xe_device *relay_to_xe(struct xe_guc_relay *relay)
55 {
56 	return gt_to_xe(relay_to_gt(relay));
57 }
58 
59 #define relay_assert(relay, condition)	xe_gt_assert(relay_to_gt(relay), condition)
60 #define relay_notice(relay, msg...)	xe_gt_sriov_notice(relay_to_gt(relay), "relay: " msg)
61 #define relay_debug(relay, msg...)	xe_gt_sriov_dbg_verbose(relay_to_gt(relay), "relay: " msg)
62 
63 static int relay_get_totalvfs(struct xe_guc_relay *relay)
64 {
65 	struct xe_device *xe = relay_to_xe(relay);
66 	struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
67 
68 	KUNIT_STATIC_STUB_REDIRECT(relay_get_totalvfs, relay);
69 	return IS_SRIOV_VF(xe) ? 0 : pci_sriov_get_totalvfs(pdev);
70 }
71 
72 static bool relay_is_ready(struct xe_guc_relay *relay)
73 {
74 	return mempool_initialized(&relay->pool);
75 }
76 
77 static u32 relay_get_next_rid(struct xe_guc_relay *relay)
78 {
79 	u32 rid;
80 
81 	spin_lock(&relay->lock);
82 	rid = ++relay->last_rid;
83 	spin_unlock(&relay->lock);
84 
85 	return rid;
86 }
87 
88 /**
89  * struct relay_transaction - internal data used to handle transactions
90  *
91  * Relation between struct relay_transaction members::
92  *
93  *                 <-------------------- GUC_CTB_MAX_DWORDS -------------->
94  *                                  <-------- GUC_RELAY_MSG_MAX_LEN --->
95  *                 <--- offset ---> <--- request_len ------->
96  *                +----------------+-------------------------+----------+--+
97  *                |                |                         |          |  |
98  *                +----------------+-------------------------+----------+--+
99  *                ^                ^
100  *               /                /
101  *    request_buf          request
102  *
103  *                 <-------------------- GUC_CTB_MAX_DWORDS -------------->
104  *                                  <-------- GUC_RELAY_MSG_MAX_LEN --->
105  *                 <--- offset ---> <--- response_len --->
106  *                +----------------+----------------------+-------------+--+
107  *                |                |                      |             |  |
108  *                +----------------+----------------------+-------------+--+
109  *                ^                ^
110  *               /                /
111  *   response_buf         response
112  */
113 struct relay_transaction {
114 	/**
115 	 * @incoming: indicates whether this transaction represents an incoming
116 	 *            request from the remote VF/PF or this transaction
117 	 *            represents outgoing request to the remote VF/PF.
118 	 */
119 	bool incoming;
120 
121 	/**
122 	 * @remote: PF/VF identifier of the origin (or target) of the relay
123 	 *          request message.
124 	 */
125 	u32 remote;
126 
127 	/** @rid: identifier of the VF/PF relay message. */
128 	u32 rid;
129 
130 	/**
131 	 * @request: points to the inner VF/PF request message, copied to the
132 	 *           #response_buf starting at #offset.
133 	 */
134 	u32 *request;
135 
136 	/** @request_len: length of the inner VF/PF request message. */
137 	u32 request_len;
138 
139 	/**
140 	 * @response: points to the placeholder buffer where inner VF/PF
141 	 *            response will be located, for outgoing transaction
142 	 *            this could be caller's buffer (if provided) otherwise
143 	 *            it points to the #response_buf starting at #offset.
144 	 */
145 	u32 *response;
146 
147 	/**
148 	 * @response_len: length of the inner VF/PF response message (only
149 	 *                if #status is 0), initially set to the size of the
150 	 *                placeholder buffer where response message will be
151 	 *                copied.
152 	 */
153 	u32 response_len;
154 
155 	/**
156 	 * @offset: offset to the start of the inner VF/PF relay message inside
157 	 *          buffers; this offset is equal the length of the outer GuC
158 	 *          relay header message.
159 	 */
160 	u32 offset;
161 
162 	/**
163 	 * @request_buf: buffer with VF/PF request message including outer
164 	 *               transport message.
165 	 */
166 	u32 request_buf[GUC_CTB_MAX_DWORDS];
167 
168 	/**
169 	 * @response_buf: buffer with VF/PF response message including outer
170 	 *                transport message.
171 	 */
172 	u32 response_buf[GUC_CTB_MAX_DWORDS];
173 
174 	/**
175 	 * @reply: status of the reply, 0 means that data pointed by the
176 	 *         #response is valid.
177 	 */
178 	int reply;
179 
180 	/** @done: completion of the outgoing transaction. */
181 	struct completion done;
182 
183 	/** @link: transaction list link */
184 	struct list_head link;
185 };
186 
187 static u32 prepare_pf2guc(u32 *msg, u32 target, u32 rid)
188 {
189 	msg[0] = FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) |
190 		 FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) |
191 		 FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, XE_GUC_ACTION_PF2GUC_RELAY_TO_VF);
192 	msg[1] = FIELD_PREP(PF2GUC_RELAY_TO_VF_REQUEST_MSG_1_VFID, target);
193 	msg[2] = FIELD_PREP(PF2GUC_RELAY_TO_VF_REQUEST_MSG_2_RELAY_ID, rid);
194 
195 	return PF2GUC_RELAY_TO_VF_REQUEST_MSG_MIN_LEN;
196 }
197 
198 static u32 prepare_vf2guc(u32 *msg, u32 rid)
199 {
200 	msg[0] = FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) |
201 		 FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) |
202 		 FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, XE_GUC_ACTION_VF2GUC_RELAY_TO_PF);
203 	msg[1] = FIELD_PREP(VF2GUC_RELAY_TO_PF_REQUEST_MSG_1_RELAY_ID, rid);
204 
205 	return VF2GUC_RELAY_TO_PF_REQUEST_MSG_MIN_LEN;
206 }
207 
208 static struct relay_transaction *
209 __relay_get_transaction(struct xe_guc_relay *relay, bool incoming, u32 remote, u32 rid,
210 			const u32 *action, u32 action_len, u32 *resp, u32 resp_size)
211 {
212 	struct relay_transaction *txn;
213 
214 	relay_assert(relay, action_len >= GUC_RELAY_MSG_MIN_LEN);
215 	relay_assert(relay, action_len <= GUC_RELAY_MSG_MAX_LEN);
216 	relay_assert(relay, !(!!resp ^ !!resp_size));
217 	relay_assert(relay, resp_size <= GUC_RELAY_MSG_MAX_LEN);
218 	relay_assert(relay, resp_size == 0 || resp_size >= GUC_RELAY_MSG_MIN_LEN);
219 
220 	if (unlikely(!relay_is_ready(relay)))
221 		return ERR_PTR(-ENODEV);
222 
223 	/*
224 	 * For incoming requests we can't use GFP_KERNEL as those are delivered
225 	 * with CTB lock held which is marked as used in the reclaim path.
226 	 * Btw, that's one of the reason why we use mempool here!
227 	 */
228 	txn = mempool_alloc(&relay->pool, incoming ? GFP_ATOMIC : GFP_KERNEL);
229 	if (!txn)
230 		return ERR_PTR(-ENOMEM);
231 
232 	txn->incoming = incoming;
233 	txn->remote = remote;
234 	txn->rid = rid;
235 	txn->offset = remote ?
236 		prepare_pf2guc(incoming ? txn->response_buf : txn->request_buf, remote, rid) :
237 		prepare_vf2guc(incoming ? txn->response_buf : txn->request_buf, rid);
238 
239 	relay_assert(relay, txn->offset);
240 	relay_assert(relay, txn->offset + GUC_RELAY_MSG_MAX_LEN <= ARRAY_SIZE(txn->request_buf));
241 	relay_assert(relay, txn->offset + GUC_RELAY_MSG_MAX_LEN <= ARRAY_SIZE(txn->response_buf));
242 
243 	txn->request = txn->request_buf + txn->offset;
244 	memcpy(&txn->request_buf[txn->offset], action, sizeof(u32) * action_len);
245 	txn->request_len = action_len;
246 
247 	txn->response = resp ?: txn->response_buf + txn->offset;
248 	txn->response_len = resp_size ?: GUC_RELAY_MSG_MAX_LEN;
249 	txn->reply = -ENOMSG;
250 	INIT_LIST_HEAD(&txn->link);
251 	init_completion(&txn->done);
252 
253 	return txn;
254 }
255 
256 static struct relay_transaction *
257 relay_new_transaction(struct xe_guc_relay *relay, u32 target, const u32 *action, u32 len,
258 		      u32 *resp, u32 resp_size)
259 {
260 	u32 rid = relay_get_next_rid(relay);
261 
262 	return __relay_get_transaction(relay, false, target, rid, action, len, resp, resp_size);
263 }
264 
265 static struct relay_transaction *
266 relay_new_incoming_transaction(struct xe_guc_relay *relay, u32 origin, u32 rid,
267 			       const u32 *action, u32 len)
268 {
269 	return __relay_get_transaction(relay, true, origin, rid, action, len, NULL, 0);
270 }
271 
272 static void relay_release_transaction(struct xe_guc_relay *relay, struct relay_transaction *txn)
273 {
274 	relay_assert(relay, list_empty(&txn->link));
275 
276 	txn->offset = 0;
277 	txn->response = NULL;
278 	txn->reply = -ESTALE;
279 	mempool_free(txn, &relay->pool);
280 }
281 
282 static int relay_send_transaction(struct xe_guc_relay *relay, struct relay_transaction *txn)
283 {
284 	u32 len = txn->incoming ? txn->response_len : txn->request_len;
285 	u32 *buf = txn->incoming ? txn->response_buf : txn->request_buf;
286 	u32 *msg = buf + txn->offset;
287 	int ret;
288 
289 	relay_assert(relay, txn->offset);
290 	relay_assert(relay, txn->offset + len <= GUC_CTB_MAX_DWORDS);
291 	relay_assert(relay, len >= GUC_RELAY_MSG_MIN_LEN);
292 	relay_assert(relay, len <= GUC_RELAY_MSG_MAX_LEN);
293 
294 	relay_debug(relay, "sending %s.%u to %u = %*ph\n",
295 		    guc_hxg_type_to_string(FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0])),
296 		    txn->rid, txn->remote, (int)sizeof(u32) * len, msg);
297 
298 	ret = xe_guc_ct_send_block(relay_to_ct(relay), buf, len + txn->offset);
299 
300 	if (unlikely(ret > 0)) {
301 		relay_notice(relay, "Unexpected data=%d from GuC, wrong ABI?\n", ret);
302 		ret = -EPROTO;
303 	}
304 	if (unlikely(ret < 0)) {
305 		relay_notice(relay, "Failed to send %s.%x to GuC (%pe) %*ph ...\n",
306 			     guc_hxg_type_to_string(FIELD_GET(GUC_HXG_MSG_0_TYPE, buf[0])),
307 			     FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, buf[0]),
308 			     ERR_PTR(ret), (int)sizeof(u32) * txn->offset, buf);
309 		relay_notice(relay, "Failed to send %s.%u to %u (%pe) %*ph\n",
310 			     guc_hxg_type_to_string(FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0])),
311 			     txn->rid, txn->remote, ERR_PTR(ret), (int)sizeof(u32) * len, msg);
312 	}
313 
314 	return ret;
315 }
316 
317 static void __fini_relay(struct drm_device *drm, void *arg)
318 {
319 	struct xe_guc_relay *relay = arg;
320 
321 	mempool_exit(&relay->pool);
322 }
323 
324 /**
325  * xe_guc_relay_init - Initialize a &xe_guc_relay
326  * @relay: the &xe_guc_relay to initialize
327  *
328  * Initialize remaining members of &xe_guc_relay that may depend
329  * on the SR-IOV mode.
330  *
331  * Return: 0 on success or a negative error code on failure.
332  */
333 int xe_guc_relay_init(struct xe_guc_relay *relay)
334 {
335 	const int XE_RELAY_MEMPOOL_MIN_NUM = 1;
336 	struct xe_device *xe = relay_to_xe(relay);
337 	int err;
338 
339 	relay_assert(relay, !relay_is_ready(relay));
340 
341 	if (!IS_SRIOV(xe))
342 		return 0;
343 
344 	spin_lock_init(&relay->lock);
345 	INIT_WORK(&relay->worker, relays_worker_fn);
346 	INIT_LIST_HEAD(&relay->pending_relays);
347 	INIT_LIST_HEAD(&relay->incoming_actions);
348 
349 	err = mempool_init_kmalloc_pool(&relay->pool, XE_RELAY_MEMPOOL_MIN_NUM +
350 					relay_get_totalvfs(relay),
351 					sizeof(struct relay_transaction));
352 	if (err)
353 		return err;
354 
355 	relay_debug(relay, "using mempool with %d elements\n", relay->pool.min_nr);
356 
357 	return drmm_add_action_or_reset(&xe->drm, __fini_relay, relay);
358 }
359 ALLOW_ERROR_INJECTION(xe_guc_relay_init, ERRNO); /* See xe_pci_probe() */
360 
361 static u32 to_relay_error(int err)
362 {
363 	/* XXX: assume that relay errors match errno codes */
364 	return err < 0 ? -err : GUC_RELAY_ERROR_UNDISCLOSED;
365 }
366 
367 static int from_relay_error(u32 error)
368 {
369 	/* XXX: assume that relay errors match errno codes */
370 	return error ? -error : -ENODATA;
371 }
372 
373 static u32 sanitize_relay_error(u32 error)
374 {
375 	/* XXX TBD if generic error codes will be allowed */
376 	if (!IS_ENABLED(CONFIG_DRM_XE_DEBUG))
377 		error = GUC_RELAY_ERROR_UNDISCLOSED;
378 	return error;
379 }
380 
381 static u32 sanitize_relay_error_hint(u32 hint)
382 {
383 	/* XXX TBD if generic error codes will be allowed */
384 	if (!IS_ENABLED(CONFIG_DRM_XE_DEBUG))
385 		hint = 0;
386 	return hint;
387 }
388 
389 static u32 prepare_error_reply(u32 *msg, u32 error, u32 hint)
390 {
391 	msg[0] = FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) |
392 		 FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_RESPONSE_FAILURE) |
393 		 FIELD_PREP(GUC_HXG_FAILURE_MSG_0_HINT, hint) |
394 		 FIELD_PREP(GUC_HXG_FAILURE_MSG_0_ERROR, error);
395 
396 	XE_WARN_ON(!FIELD_FIT(GUC_HXG_FAILURE_MSG_0_ERROR, error));
397 	XE_WARN_ON(!FIELD_FIT(GUC_HXG_FAILURE_MSG_0_HINT, hint));
398 
399 	return GUC_HXG_FAILURE_MSG_LEN;
400 }
401 
402 static void relay_testonly_nop(struct xe_guc_relay *relay)
403 {
404 	KUNIT_STATIC_STUB_REDIRECT(relay_testonly_nop, relay);
405 }
406 
407 static int relay_send_message_and_wait(struct xe_guc_relay *relay,
408 				       struct relay_transaction *txn,
409 				       u32 *buf, u32 buf_size)
410 {
411 	unsigned long timeout = msecs_to_jiffies(RELAY_TIMEOUT_MSEC);
412 	u32 *msg = &txn->request_buf[txn->offset];
413 	u32 len = txn->request_len;
414 	u32 type, action, data0;
415 	int ret;
416 	long n;
417 
418 	type = FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0]);
419 	action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
420 	data0 = FIELD_GET(GUC_HXG_REQUEST_MSG_0_DATA0, msg[0]);
421 
422 	relay_debug(relay, "%s.%u to %u action %#x:%u\n",
423 		    guc_hxg_type_to_string(type),
424 		    txn->rid, txn->remote, action, data0);
425 
426 	/* list ordering does not need to match RID ordering */
427 	spin_lock(&relay->lock);
428 	list_add_tail(&txn->link, &relay->pending_relays);
429 	spin_unlock(&relay->lock);
430 
431 resend:
432 	ret = relay_send_transaction(relay, txn);
433 	if (unlikely(ret < 0))
434 		goto unlink;
435 
436 wait:
437 	n = wait_for_completion_timeout(&txn->done, timeout);
438 	if (unlikely(n == 0 && txn->reply)) {
439 		ret = -ETIME;
440 		goto unlink;
441 	}
442 
443 	relay_debug(relay, "%u.%u reply %d after %u msec\n",
444 		    txn->remote, txn->rid, txn->reply, jiffies_to_msecs(timeout - n));
445 	if (unlikely(txn->reply)) {
446 		reinit_completion(&txn->done);
447 		if (txn->reply == -EAGAIN)
448 			goto resend;
449 		if (txn->reply == -EBUSY) {
450 			relay_testonly_nop(relay);
451 			goto wait;
452 		}
453 		if (txn->reply > 0)
454 			ret = from_relay_error(txn->reply);
455 		else
456 			ret = txn->reply;
457 		goto unlink;
458 	}
459 
460 	relay_debug(relay, "%u.%u response %*ph\n", txn->remote, txn->rid,
461 		    (int)sizeof(u32) * txn->response_len, txn->response);
462 	relay_assert(relay, txn->response_len >= GUC_RELAY_MSG_MIN_LEN);
463 	ret = txn->response_len;
464 
465 unlink:
466 	spin_lock(&relay->lock);
467 	list_del_init(&txn->link);
468 	spin_unlock(&relay->lock);
469 
470 	if (unlikely(ret < 0)) {
471 		relay_notice(relay, "Unsuccessful %s.%u %#x:%u to %u (%pe) %*ph\n",
472 			     guc_hxg_type_to_string(type), txn->rid,
473 			     action, data0, txn->remote, ERR_PTR(ret),
474 			     (int)sizeof(u32) * len, msg);
475 	}
476 
477 	return ret;
478 }
479 
480 static int relay_send_to(struct xe_guc_relay *relay, u32 target,
481 			 const u32 *msg, u32 len, u32 *buf, u32 buf_size)
482 {
483 	struct relay_transaction *txn;
484 	int ret;
485 
486 	relay_assert(relay, len >= GUC_RELAY_MSG_MIN_LEN);
487 	relay_assert(relay, len <= GUC_RELAY_MSG_MAX_LEN);
488 	relay_assert(relay, FIELD_GET(GUC_HXG_MSG_0_ORIGIN, msg[0]) == GUC_HXG_ORIGIN_HOST);
489 	relay_assert(relay, guc_hxg_type_is_action(FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0])));
490 
491 	if (unlikely(!relay_is_ready(relay)))
492 		return -ENODEV;
493 
494 	txn = relay_new_transaction(relay, target, msg, len, buf, buf_size);
495 	if (IS_ERR(txn))
496 		return PTR_ERR(txn);
497 
498 	switch (FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0])) {
499 	case GUC_HXG_TYPE_REQUEST:
500 		ret = relay_send_message_and_wait(relay, txn, buf, buf_size);
501 		break;
502 	case GUC_HXG_TYPE_FAST_REQUEST:
503 		relay_assert(relay, !GUC_HXG_TYPE_FAST_REQUEST);
504 		fallthrough;
505 	case GUC_HXG_TYPE_EVENT:
506 		ret = relay_send_transaction(relay, txn);
507 		break;
508 	default:
509 		ret = -EINVAL;
510 		break;
511 	}
512 
513 	relay_release_transaction(relay, txn);
514 	return ret;
515 }
516 
517 #ifdef CONFIG_PCI_IOV
518 /**
519  * xe_guc_relay_send_to_vf - Send a message to the VF.
520  * @relay: the &xe_guc_relay which will send the message
521  * @target: target VF number
522  * @msg: request message to be sent
523  * @len: length of the request message (in dwords, can't be 0)
524  * @buf: placeholder for the response message
525  * @buf_size: size of the response message placeholder (in dwords)
526  *
527  * This function can only be used by the driver running in the SR-IOV PF mode.
528  *
529  * Return: Non-negative response length (in dwords) or
530  *         a negative error code on failure.
531  */
532 int xe_guc_relay_send_to_vf(struct xe_guc_relay *relay, u32 target,
533 			    const u32 *msg, u32 len, u32 *buf, u32 buf_size)
534 {
535 	relay_assert(relay, IS_SRIOV_PF(relay_to_xe(relay)));
536 
537 	return relay_send_to(relay, target, msg, len, buf, buf_size);
538 }
539 #endif
540 
541 /**
542  * xe_guc_relay_send_to_pf - Send a message to the PF.
543  * @relay: the &xe_guc_relay which will send the message
544  * @msg: request message to be sent
545  * @len: length of the message (in dwords, can't be 0)
546  * @buf: placeholder for the response message
547  * @buf_size: size of the response message placeholder (in dwords)
548  *
549  * This function can only be used by driver running in SR-IOV VF mode.
550  *
551  * Return: Non-negative response length (in dwords) or
552  *         a negative error code on failure.
553  */
554 int xe_guc_relay_send_to_pf(struct xe_guc_relay *relay,
555 			    const u32 *msg, u32 len, u32 *buf, u32 buf_size)
556 {
557 	relay_assert(relay, IS_SRIOV_VF(relay_to_xe(relay)));
558 
559 	return relay_send_to(relay, PFID, msg, len, buf, buf_size);
560 }
561 
562 static int relay_handle_reply(struct xe_guc_relay *relay, u32 origin,
563 			      u32 rid, int reply, const u32 *msg, u32 len)
564 {
565 	struct relay_transaction *pending;
566 	int err = -ESRCH;
567 
568 	spin_lock(&relay->lock);
569 	list_for_each_entry(pending, &relay->pending_relays, link) {
570 		if (pending->remote != origin || pending->rid != rid) {
571 			relay_debug(relay, "%u.%u still awaits response\n",
572 				    pending->remote, pending->rid);
573 			continue;
574 		}
575 		err = 0; /* found! */
576 		if (reply == 0) {
577 			if (len > pending->response_len) {
578 				reply = -ENOBUFS;
579 				err = -ENOBUFS;
580 			} else {
581 				memcpy(pending->response, msg, 4 * len);
582 				pending->response_len = len;
583 			}
584 		}
585 		pending->reply = reply;
586 		complete_all(&pending->done);
587 		break;
588 	}
589 	spin_unlock(&relay->lock);
590 
591 	return err;
592 }
593 
594 static int relay_handle_failure(struct xe_guc_relay *relay, u32 origin,
595 				u32 rid, const u32 *msg, u32 len)
596 {
597 	int error = FIELD_GET(GUC_HXG_FAILURE_MSG_0_ERROR, msg[0]);
598 	u32 hint __maybe_unused = FIELD_GET(GUC_HXG_FAILURE_MSG_0_HINT, msg[0]);
599 
600 	relay_assert(relay, len);
601 	relay_debug(relay, "%u.%u error %#x (%pe) hint %u debug %*ph\n",
602 		    origin, rid, error, ERR_PTR(-error), hint, 4 * (len - 1), msg + 1);
603 
604 	return relay_handle_reply(relay, origin, rid, error ?: -EREMOTEIO, NULL, 0);
605 }
606 
607 static int relay_testloop_action_handler(struct xe_guc_relay *relay, u32 origin,
608 					 const u32 *msg, u32 len, u32 *response, u32 size)
609 {
610 	static ktime_t last_reply = 0;
611 	u32 type = FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0]);
612 	u32 action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
613 	u32 opcode = FIELD_GET(GUC_HXG_REQUEST_MSG_0_DATA0, msg[0]);
614 	ktime_t now = ktime_get();
615 	bool busy;
616 	int ret;
617 
618 	relay_assert(relay, guc_hxg_type_is_action(type));
619 	relay_assert(relay, action == GUC_RELAY_ACTION_VFXPF_TESTLOOP);
620 
621 	if (!IS_ENABLED(CONFIG_DRM_XE_DEBUG_SRIOV))
622 		return -ECONNREFUSED;
623 
624 	if (!last_reply)
625 		last_reply = now;
626 	busy = ktime_before(now, ktime_add_ms(last_reply, 2 * RELAY_TIMEOUT_MSEC));
627 	if (!busy)
628 		last_reply = now;
629 
630 	switch (opcode) {
631 	case VFXPF_TESTLOOP_OPCODE_NOP:
632 		if (type == GUC_HXG_TYPE_EVENT)
633 			return 0;
634 		return guc_hxg_msg_encode_success(response, 0);
635 	case VFXPF_TESTLOOP_OPCODE_BUSY:
636 		if (type == GUC_HXG_TYPE_EVENT)
637 			return -EPROTO;
638 		msleep(RELAY_TIMEOUT_MSEC / 8);
639 		if (busy)
640 			return -EINPROGRESS;
641 		return guc_hxg_msg_encode_success(response, 0);
642 	case VFXPF_TESTLOOP_OPCODE_RETRY:
643 		if (type == GUC_HXG_TYPE_EVENT)
644 			return -EPROTO;
645 		msleep(RELAY_TIMEOUT_MSEC / 8);
646 		if (busy)
647 			return guc_hxg_msg_encode_retry(response, 0);
648 		return guc_hxg_msg_encode_success(response, 0);
649 	case VFXPF_TESTLOOP_OPCODE_ECHO:
650 		if (type == GUC_HXG_TYPE_EVENT)
651 			return -EPROTO;
652 		if (size < len)
653 			return -ENOBUFS;
654 		ret = guc_hxg_msg_encode_success(response, len);
655 		memcpy(response + ret, msg + ret, (len - ret) * sizeof(u32));
656 		return len;
657 	case VFXPF_TESTLOOP_OPCODE_FAIL:
658 		return -EHWPOISON;
659 	default:
660 		break;
661 	}
662 
663 	relay_notice(relay, "Unexpected action %#x opcode %#x\n", action, opcode);
664 	return -EBADRQC;
665 }
666 
667 static int relay_action_handler(struct xe_guc_relay *relay, u32 origin,
668 				const u32 *msg, u32 len, u32 *response, u32 size)
669 {
670 	struct xe_gt *gt = relay_to_gt(relay);
671 	u32 type;
672 	int ret;
673 
674 	relay_assert(relay, len >= GUC_HXG_MSG_MIN_LEN);
675 
676 	if (FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]) == GUC_RELAY_ACTION_VFXPF_TESTLOOP)
677 		return relay_testloop_action_handler(relay, origin, msg, len, response, size);
678 
679 	type = FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0]);
680 
681 	if (IS_SRIOV_PF(relay_to_xe(relay)))
682 		ret = xe_gt_sriov_pf_service_process_request(gt, origin, msg, len, response, size);
683 	else
684 		ret = -EOPNOTSUPP;
685 
686 	if (type == GUC_HXG_TYPE_EVENT)
687 		relay_assert(relay, ret <= 0);
688 
689 	return ret;
690 }
691 
692 static struct relay_transaction *relay_dequeue_transaction(struct xe_guc_relay *relay)
693 {
694 	struct relay_transaction *txn;
695 
696 	spin_lock(&relay->lock);
697 	txn = list_first_entry_or_null(&relay->incoming_actions, struct relay_transaction, link);
698 	if (txn)
699 		list_del_init(&txn->link);
700 	spin_unlock(&relay->lock);
701 
702 	return txn;
703 }
704 
705 static void relay_process_incoming_action(struct xe_guc_relay *relay)
706 {
707 	struct relay_transaction *txn;
708 	bool again = false;
709 	u32 type;
710 	int ret;
711 
712 	txn = relay_dequeue_transaction(relay);
713 	if (!txn)
714 		return;
715 
716 	type = FIELD_GET(GUC_HXG_MSG_0_TYPE, txn->request_buf[txn->offset]);
717 
718 	ret = relay_action_handler(relay, txn->remote,
719 				   txn->request_buf + txn->offset, txn->request_len,
720 				   txn->response_buf + txn->offset,
721 				   ARRAY_SIZE(txn->response_buf) - txn->offset);
722 
723 	if (ret == -EINPROGRESS) {
724 		again = true;
725 		ret = guc_hxg_msg_encode_busy(txn->response_buf + txn->offset, 0);
726 	}
727 
728 	if (ret > 0) {
729 		txn->response_len = ret;
730 		ret = relay_send_transaction(relay, txn);
731 	}
732 
733 	if (ret < 0) {
734 		u32 error = to_relay_error(ret);
735 
736 		relay_notice(relay, "Failed to handle %s.%u from %u (%pe) %*ph\n",
737 			     guc_hxg_type_to_string(type), txn->rid, txn->remote,
738 			     ERR_PTR(ret), 4 * txn->request_len, txn->request_buf + txn->offset);
739 
740 		txn->response_len = prepare_error_reply(txn->response_buf + txn->offset,
741 							txn->remote ?
742 							sanitize_relay_error(error) : error,
743 							txn->remote ?
744 							sanitize_relay_error_hint(-ret) : -ret);
745 		ret = relay_send_transaction(relay, txn);
746 		again = false;
747 	}
748 
749 	if (again) {
750 		spin_lock(&relay->lock);
751 		list_add(&txn->link, &relay->incoming_actions);
752 		spin_unlock(&relay->lock);
753 		return;
754 	}
755 
756 	if (unlikely(ret < 0))
757 		relay_notice(relay, "Failed to process action.%u (%pe) %*ph\n",
758 			     txn->rid, ERR_PTR(ret), 4 * txn->request_len,
759 			     txn->request_buf + txn->offset);
760 
761 	relay_release_transaction(relay, txn);
762 }
763 
764 static bool relay_needs_worker(struct xe_guc_relay *relay)
765 {
766 	bool is_empty;
767 
768 	spin_lock(&relay->lock);
769 	is_empty = list_empty(&relay->incoming_actions);
770 	spin_unlock(&relay->lock);
771 
772 	return !is_empty;
773 
774 }
775 
776 static void relay_kick_worker(struct xe_guc_relay *relay)
777 {
778 	KUNIT_STATIC_STUB_REDIRECT(relay_kick_worker, relay);
779 	queue_work(relay_to_xe(relay)->sriov.wq, &relay->worker);
780 }
781 
782 static void relays_worker_fn(struct work_struct *w)
783 {
784 	struct xe_guc_relay *relay = container_of(w, struct xe_guc_relay, worker);
785 
786 	relay_process_incoming_action(relay);
787 
788 	if (relay_needs_worker(relay))
789 		relay_kick_worker(relay);
790 }
791 
792 static int relay_queue_action_msg(struct xe_guc_relay *relay, u32 origin, u32 rid,
793 				  const u32 *msg, u32 len)
794 {
795 	struct relay_transaction *txn;
796 
797 	txn = relay_new_incoming_transaction(relay, origin, rid, msg, len);
798 	if (IS_ERR(txn))
799 		return PTR_ERR(txn);
800 
801 	spin_lock(&relay->lock);
802 	list_add_tail(&txn->link, &relay->incoming_actions);
803 	spin_unlock(&relay->lock);
804 
805 	relay_kick_worker(relay);
806 	return 0;
807 }
808 
809 static int relay_process_msg(struct xe_guc_relay *relay, u32 origin, u32 rid,
810 			     const u32 *msg, u32 len)
811 {
812 	u32 type;
813 	int err;
814 
815 	if (unlikely(len < GUC_HXG_MSG_MIN_LEN))
816 		return -EPROTO;
817 
818 	if (FIELD_GET(GUC_HXG_MSG_0_ORIGIN, msg[0]) != GUC_HXG_ORIGIN_HOST)
819 		return -EPROTO;
820 
821 	type = FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0]);
822 	relay_debug(relay, "received %s.%u from %u = %*ph\n",
823 		    guc_hxg_type_to_string(type), rid, origin, 4 * len, msg);
824 
825 	switch (type) {
826 	case GUC_HXG_TYPE_REQUEST:
827 	case GUC_HXG_TYPE_FAST_REQUEST:
828 	case GUC_HXG_TYPE_EVENT:
829 		err = relay_queue_action_msg(relay, origin, rid, msg, len);
830 		break;
831 	case GUC_HXG_TYPE_RESPONSE_SUCCESS:
832 		err = relay_handle_reply(relay, origin, rid, 0, msg, len);
833 		break;
834 	case GUC_HXG_TYPE_NO_RESPONSE_BUSY:
835 		err = relay_handle_reply(relay, origin, rid, -EBUSY, NULL, 0);
836 		break;
837 	case GUC_HXG_TYPE_NO_RESPONSE_RETRY:
838 		err = relay_handle_reply(relay, origin, rid, -EAGAIN, NULL, 0);
839 		break;
840 	case GUC_HXG_TYPE_RESPONSE_FAILURE:
841 		err = relay_handle_failure(relay, origin, rid, msg, len);
842 		break;
843 	default:
844 		err = -EBADRQC;
845 	}
846 
847 	if (unlikely(err))
848 		relay_notice(relay, "Failed to process %s.%u from %u (%pe) %*ph\n",
849 			     guc_hxg_type_to_string(type), rid, origin,
850 			     ERR_PTR(err), 4 * len, msg);
851 
852 	return err;
853 }
854 
855 /**
856  * xe_guc_relay_process_guc2vf - Handle relay notification message from the GuC.
857  * @relay: the &xe_guc_relay which will handle the message
858  * @msg: message to be handled
859  * @len: length of the message (in dwords)
860  *
861  * This function will handle relay messages received from the GuC.
862  *
863  * This function is can only be used if driver is running in SR-IOV mode.
864  *
865  * Return: 0 on success or a negative error code on failure.
866  */
867 int xe_guc_relay_process_guc2vf(struct xe_guc_relay *relay, const u32 *msg, u32 len)
868 {
869 	u32 rid;
870 
871 	relay_assert(relay, len >= GUC_HXG_MSG_MIN_LEN);
872 	relay_assert(relay, FIELD_GET(GUC_HXG_MSG_0_ORIGIN, msg[0]) == GUC_HXG_ORIGIN_GUC);
873 	relay_assert(relay, FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0]) == GUC_HXG_TYPE_EVENT);
874 	relay_assert(relay, FIELD_GET(GUC_HXG_EVENT_MSG_0_ACTION, msg[0]) ==
875 		     XE_GUC_ACTION_GUC2VF_RELAY_FROM_PF);
876 
877 	if (unlikely(!IS_SRIOV_VF(relay_to_xe(relay)) && !kunit_get_current_test()))
878 		return -EPERM;
879 
880 	if (unlikely(!relay_is_ready(relay)))
881 		return -ENODEV;
882 
883 	if (unlikely(len < GUC2VF_RELAY_FROM_PF_EVENT_MSG_MIN_LEN))
884 		return -EPROTO;
885 
886 	if (unlikely(len > GUC2VF_RELAY_FROM_PF_EVENT_MSG_MAX_LEN))
887 		return -EMSGSIZE;
888 
889 	if (unlikely(FIELD_GET(GUC_HXG_EVENT_MSG_0_DATA0, msg[0])))
890 		return -EPFNOSUPPORT;
891 
892 	rid = FIELD_GET(GUC2VF_RELAY_FROM_PF_EVENT_MSG_1_RELAY_ID, msg[1]);
893 
894 	return relay_process_msg(relay, PFID, rid,
895 				 msg + GUC2VF_RELAY_FROM_PF_EVENT_MSG_MIN_LEN,
896 				 len - GUC2VF_RELAY_FROM_PF_EVENT_MSG_MIN_LEN);
897 }
898 
899 #ifdef CONFIG_PCI_IOV
900 /**
901  * xe_guc_relay_process_guc2pf - Handle relay notification message from the GuC.
902  * @relay: the &xe_guc_relay which will handle the message
903  * @msg: message to be handled
904  * @len: length of the message (in dwords)
905  *
906  * This function will handle relay messages received from the GuC.
907  *
908  * This function can only be used if driver is running in SR-IOV PF mode.
909  *
910  * Return: 0 on success or a negative error code on failure.
911  */
912 int xe_guc_relay_process_guc2pf(struct xe_guc_relay *relay, const u32 *msg, u32 len)
913 {
914 	u32 origin, rid;
915 	int err;
916 
917 	relay_assert(relay, len >= GUC_HXG_EVENT_MSG_MIN_LEN);
918 	relay_assert(relay, FIELD_GET(GUC_HXG_MSG_0_ORIGIN, msg[0]) == GUC_HXG_ORIGIN_GUC);
919 	relay_assert(relay, FIELD_GET(GUC_HXG_MSG_0_TYPE, msg[0]) == GUC_HXG_TYPE_EVENT);
920 	relay_assert(relay, FIELD_GET(GUC_HXG_EVENT_MSG_0_ACTION, msg[0]) ==
921 		     XE_GUC_ACTION_GUC2PF_RELAY_FROM_VF);
922 
923 	if (unlikely(!IS_SRIOV_PF(relay_to_xe(relay)) && !kunit_get_current_test()))
924 		return -EPERM;
925 
926 	if (unlikely(!relay_is_ready(relay)))
927 		return -ENODEV;
928 
929 	if (unlikely(len < GUC2PF_RELAY_FROM_VF_EVENT_MSG_MIN_LEN))
930 		return -EPROTO;
931 
932 	if (unlikely(len > GUC2PF_RELAY_FROM_VF_EVENT_MSG_MAX_LEN))
933 		return -EMSGSIZE;
934 
935 	if (unlikely(FIELD_GET(GUC_HXG_EVENT_MSG_0_DATA0, msg[0])))
936 		return -EPFNOSUPPORT;
937 
938 	origin = FIELD_GET(GUC2PF_RELAY_FROM_VF_EVENT_MSG_1_VFID, msg[1]);
939 	rid = FIELD_GET(GUC2PF_RELAY_FROM_VF_EVENT_MSG_2_RELAY_ID, msg[2]);
940 
941 	if (unlikely(origin > relay_get_totalvfs(relay)))
942 		return -ENOENT;
943 
944 	err = relay_process_msg(relay, origin, rid,
945 				msg + GUC2PF_RELAY_FROM_VF_EVENT_MSG_MIN_LEN,
946 				len - GUC2PF_RELAY_FROM_VF_EVENT_MSG_MIN_LEN);
947 
948 	return err;
949 }
950 #endif
951 
952 #if IS_BUILTIN(CONFIG_DRM_XE_KUNIT_TEST)
953 #include "tests/xe_guc_relay_test.c"
954 #endif
955