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