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 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 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