1b87f920bSLizhi Hou /* SPDX-License-Identifier: GPL-2.0 */ 2b87f920bSLizhi Hou /* 3b87f920bSLizhi Hou * Copyright (C) 2022-2024, Advanced Micro Devices, Inc. 4b87f920bSLizhi Hou */ 5b87f920bSLizhi Hou 6b87f920bSLizhi Hou #ifndef _AIE2_MAILBOX_H_ 7b87f920bSLizhi Hou #define _AIE2_MAILBOX_H_ 8b87f920bSLizhi Hou 9b87f920bSLizhi Hou struct mailbox; 10b87f920bSLizhi Hou struct mailbox_channel; 11b87f920bSLizhi Hou 12b87f920bSLizhi Hou /* 13b87f920bSLizhi Hou * xdna_mailbox_msg - message struct 14b87f920bSLizhi Hou * 15b87f920bSLizhi Hou * @opcode: opcode for firmware 16b87f920bSLizhi Hou * @handle: handle used for the notify callback 17b87f920bSLizhi Hou * @notify_cb: callback function to notify the sender when there is response 18b87f920bSLizhi Hou * @send_data: pointing to sending data 19b87f920bSLizhi Hou * @send_size: size of the sending data 20b87f920bSLizhi Hou * 21b87f920bSLizhi Hou * The mailbox will split the sending data in to multiple firmware message if 22b87f920bSLizhi Hou * the size of the data is too big. This is transparent to the sender. The 23b87f920bSLizhi Hou * sender will receive one notification. 24b87f920bSLizhi Hou */ 25b87f920bSLizhi Hou struct xdna_mailbox_msg { 26b87f920bSLizhi Hou u32 opcode; 27b87f920bSLizhi Hou void *handle; 28*41257629SLizhi Hou int (*notify_cb)(void *handle, void __iomem *data, size_t size); 29b87f920bSLizhi Hou u8 *send_data; 30b87f920bSLizhi Hou size_t send_size; 31b87f920bSLizhi Hou }; 32b87f920bSLizhi Hou 33b87f920bSLizhi Hou /* 34b87f920bSLizhi Hou * xdna_mailbox_res - mailbox hardware resource 35b87f920bSLizhi Hou * 36b87f920bSLizhi Hou * @ringbuf_base: ring buffer base address 37b87f920bSLizhi Hou * @ringbuf_size: ring buffer size 38b87f920bSLizhi Hou * @mbox_base: mailbox base address 39b87f920bSLizhi Hou * @mbox_size: mailbox size 40b87f920bSLizhi Hou */ 41b87f920bSLizhi Hou struct xdna_mailbox_res { 423c8cfec3SLizhi Hou void __iomem *ringbuf_base; 43b87f920bSLizhi Hou size_t ringbuf_size; 443c8cfec3SLizhi Hou void __iomem *mbox_base; 45b87f920bSLizhi Hou size_t mbox_size; 46b87f920bSLizhi Hou const char *name; 47b87f920bSLizhi Hou }; 48b87f920bSLizhi Hou 49b87f920bSLizhi Hou /* 50b87f920bSLizhi Hou * xdna_mailbox_chann_res - resources 51b87f920bSLizhi Hou * 52b87f920bSLizhi Hou * @rb_start_addr: ring buffer start address 53b87f920bSLizhi Hou * @rb_size: ring buffer size 54b87f920bSLizhi Hou * @mb_head_ptr_reg: mailbox head pointer register 55b87f920bSLizhi Hou * @mb_tail_ptr_reg: mailbox tail pointer register 56b87f920bSLizhi Hou */ 57b87f920bSLizhi Hou struct xdna_mailbox_chann_res { 58b87f920bSLizhi Hou u32 rb_start_addr; 59b87f920bSLizhi Hou u32 rb_size; 60b87f920bSLizhi Hou u32 mb_head_ptr_reg; 61b87f920bSLizhi Hou u32 mb_tail_ptr_reg; 62b87f920bSLizhi Hou }; 63b87f920bSLizhi Hou 64b87f920bSLizhi Hou /* 65b87f920bSLizhi Hou * xdna_mailbox_create() -- create mailbox subsystem and initialize 66b87f920bSLizhi Hou * 67b87f920bSLizhi Hou * @ddev: device pointer 68b87f920bSLizhi Hou * @res: SRAM and mailbox resources 69b87f920bSLizhi Hou * 70b87f920bSLizhi Hou * Return: If success, return a handle of mailbox subsystem. 71b87f920bSLizhi Hou * Otherwise, return NULL pointer. 72b87f920bSLizhi Hou */ 73b87f920bSLizhi Hou struct mailbox *xdnam_mailbox_create(struct drm_device *ddev, 74b87f920bSLizhi Hou const struct xdna_mailbox_res *res); 75b87f920bSLizhi Hou 76b87f920bSLizhi Hou /* 77b87f920bSLizhi Hou * xdna_mailbox_create_channel() -- Create a mailbox channel instance 78b87f920bSLizhi Hou * 79b87f920bSLizhi Hou * @mailbox: the handle return from xdna_mailbox_create() 80b87f920bSLizhi Hou * @x2i: host to firmware mailbox resources 81b87f920bSLizhi Hou * @i2x: firmware to host mailbox resources 82b87f920bSLizhi Hou * @xdna_mailbox_intr_reg: register addr of MSI-X interrupt 83b87f920bSLizhi Hou * @mb_irq: Linux IRQ number associated with mailbox MSI-X interrupt vector index 84b87f920bSLizhi Hou * 85b87f920bSLizhi Hou * Return: If success, return a handle of mailbox channel. Otherwise, return NULL. 86b87f920bSLizhi Hou */ 87b87f920bSLizhi Hou struct mailbox_channel * 88b87f920bSLizhi Hou xdna_mailbox_create_channel(struct mailbox *mailbox, 89b87f920bSLizhi Hou const struct xdna_mailbox_chann_res *x2i, 90b87f920bSLizhi Hou const struct xdna_mailbox_chann_res *i2x, 91b87f920bSLizhi Hou u32 xdna_mailbox_intr_reg, 92b87f920bSLizhi Hou int mb_irq); 93b87f920bSLizhi Hou 94b87f920bSLizhi Hou /* 95b87f920bSLizhi Hou * xdna_mailbox_destroy_channel() -- destroy mailbox channel 96b87f920bSLizhi Hou * 97b87f920bSLizhi Hou * @mailbox_chann: the handle return from xdna_mailbox_create_channel() 98b87f920bSLizhi Hou * 99b87f920bSLizhi Hou * Return: if success, return 0. otherwise return error code 100b87f920bSLizhi Hou */ 101b87f920bSLizhi Hou int xdna_mailbox_destroy_channel(struct mailbox_channel *mailbox_chann); 102b87f920bSLizhi Hou 103b87f920bSLizhi Hou /* 104b87f920bSLizhi Hou * xdna_mailbox_stop_channel() -- stop mailbox channel 105b87f920bSLizhi Hou * 106b87f920bSLizhi Hou * @mailbox_chann: the handle return from xdna_mailbox_create_channel() 107b87f920bSLizhi Hou * 108b87f920bSLizhi Hou * Return: if success, return 0. otherwise return error code 109b87f920bSLizhi Hou */ 110b87f920bSLizhi Hou void xdna_mailbox_stop_channel(struct mailbox_channel *mailbox_chann); 111b87f920bSLizhi Hou 112b87f920bSLizhi Hou /* 113b87f920bSLizhi Hou * xdna_mailbox_send_msg() -- Send a message 114b87f920bSLizhi Hou * 115b87f920bSLizhi Hou * @mailbox_chann: Mailbox channel handle 116b87f920bSLizhi Hou * @msg: message struct for message information 117b87f920bSLizhi Hou * @tx_timeout: the timeout value for sending the message in ms. 118b87f920bSLizhi Hou * 119b87f920bSLizhi Hou * Return: If success return 0, otherwise, return error code 120b87f920bSLizhi Hou */ 121b87f920bSLizhi Hou int xdna_mailbox_send_msg(struct mailbox_channel *mailbox_chann, 122b87f920bSLizhi Hou const struct xdna_mailbox_msg *msg, u64 tx_timeout); 123b87f920bSLizhi Hou 124b87f920bSLizhi Hou #endif /* _AIE2_MAILBOX_ */ 125