xref: /linux/drivers/accel/amdxdna/amdxdna_mailbox_helper.c (revision 2c1ed907520c50326b8f604907a8478b27881a2e)
1b87f920bSLizhi Hou // SPDX-License-Identifier: GPL-2.0
2b87f920bSLizhi Hou /*
3b87f920bSLizhi Hou  * Copyright (C) 2024, Advanced Micro Devices, Inc.
4b87f920bSLizhi Hou  */
5b87f920bSLizhi Hou 
6*aac24309SLizhi Hou #include <drm/amdxdna_accel.h>
7b87f920bSLizhi Hou #include <drm/drm_device.h>
8b87f920bSLizhi Hou #include <drm/drm_print.h>
9*aac24309SLizhi Hou #include <drm/drm_gem.h>
10*aac24309SLizhi Hou #include <drm/drm_gem_shmem_helper.h>
11*aac24309SLizhi Hou #include <drm/gpu_scheduler.h>
12b87f920bSLizhi Hou #include <linux/completion.h>
13b87f920bSLizhi Hou 
14*aac24309SLizhi Hou #include "amdxdna_gem.h"
15b87f920bSLizhi Hou #include "amdxdna_mailbox.h"
16b87f920bSLizhi Hou #include "amdxdna_mailbox_helper.h"
17b87f920bSLizhi Hou #include "amdxdna_pci_drv.h"
18b87f920bSLizhi Hou 
xdna_msg_cb(void * handle,const u32 * data,size_t size)19b87f920bSLizhi Hou int xdna_msg_cb(void *handle, const u32 *data, size_t size)
20b87f920bSLizhi Hou {
21b87f920bSLizhi Hou 	struct xdna_notify *cb_arg = handle;
22b87f920bSLizhi Hou 	int ret;
23b87f920bSLizhi Hou 
24b87f920bSLizhi Hou 	if (unlikely(!data))
25b87f920bSLizhi Hou 		goto out;
26b87f920bSLizhi Hou 
27b87f920bSLizhi Hou 	if (unlikely(cb_arg->size != size)) {
28b87f920bSLizhi Hou 		cb_arg->error = -EINVAL;
29b87f920bSLizhi Hou 		goto out;
30b87f920bSLizhi Hou 	}
31b87f920bSLizhi Hou 
32b87f920bSLizhi Hou 	print_hex_dump_debug("resp data: ", DUMP_PREFIX_OFFSET,
33b87f920bSLizhi Hou 			     16, 4, data, cb_arg->size, true);
34b87f920bSLizhi Hou 	memcpy(cb_arg->data, data, cb_arg->size);
35b87f920bSLizhi Hou out:
36b87f920bSLizhi Hou 	ret = cb_arg->error;
37b87f920bSLizhi Hou 	complete(&cb_arg->comp);
38b87f920bSLizhi Hou 	return ret;
39b87f920bSLizhi Hou }
40b87f920bSLizhi Hou 
xdna_send_msg_wait(struct amdxdna_dev * xdna,struct mailbox_channel * chann,struct xdna_mailbox_msg * msg)41b87f920bSLizhi Hou int xdna_send_msg_wait(struct amdxdna_dev *xdna, struct mailbox_channel *chann,
42b87f920bSLizhi Hou 		       struct xdna_mailbox_msg *msg)
43b87f920bSLizhi Hou {
44b87f920bSLizhi Hou 	struct xdna_notify *hdl = msg->handle;
45b87f920bSLizhi Hou 	int ret;
46b87f920bSLizhi Hou 
47b87f920bSLizhi Hou 	ret = xdna_mailbox_send_msg(chann, msg, TX_TIMEOUT);
48b87f920bSLizhi Hou 	if (ret) {
49b87f920bSLizhi Hou 		XDNA_ERR(xdna, "Send message failed, ret %d", ret);
50b87f920bSLizhi Hou 		return ret;
51b87f920bSLizhi Hou 	}
52b87f920bSLizhi Hou 
53b87f920bSLizhi Hou 	ret = wait_for_completion_timeout(&hdl->comp,
54b87f920bSLizhi Hou 					  msecs_to_jiffies(RX_TIMEOUT));
55b87f920bSLizhi Hou 	if (!ret) {
56b87f920bSLizhi Hou 		XDNA_ERR(xdna, "Wait for completion timeout");
57b87f920bSLizhi Hou 		return -ETIME;
58b87f920bSLizhi Hou 	}
59b87f920bSLizhi Hou 
60b87f920bSLizhi Hou 	return hdl->error;
61b87f920bSLizhi Hou }
62