| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
- */
- #ifndef _AIE2_MAILBOX_H_
- #define _AIE2_MAILBOX_H_
- struct mailbox;
- struct mailbox_channel;
- /*
- * xdna_mailbox_msg - message struct
- *
- * @opcode: opcode for firmware
- * @handle: handle used for the notify callback
- * @notify_cb: callback function to notify the sender when there is response
- * @send_data: pointing to sending data
- * @send_size: size of the sending data
- *
- * The mailbox will split the sending data in to multiple firmware message if
- * the size of the data is too big. This is transparent to the sender. The
- * sender will receive one notification.
- */
- struct xdna_mailbox_msg {
- u32 opcode;
- void *handle;
- int (*notify_cb)(void *handle, void __iomem *data, size_t size);
- u8 *send_data;
- size_t send_size;
- };
- /*
- * xdna_mailbox_res - mailbox hardware resource
- *
- * @ringbuf_base: ring buffer base address
- * @ringbuf_size: ring buffer size
- * @mbox_base: mailbox base address
- * @mbox_size: mailbox size
- */
- struct xdna_mailbox_res {
- void __iomem *ringbuf_base;
- size_t ringbuf_size;
- void __iomem *mbox_base;
- size_t mbox_size;
- const char *name;
- };
- /*
- * xdna_mailbox_chann_res - resources
- *
- * @rb_start_addr: ring buffer start address
- * @rb_size: ring buffer size
- * @mb_head_ptr_reg: mailbox head pointer register
- * @mb_tail_ptr_reg: mailbox tail pointer register
- */
- struct xdna_mailbox_chann_res {
- u32 rb_start_addr;
- u32 rb_size;
- u32 mb_head_ptr_reg;
- u32 mb_tail_ptr_reg;
- };
- /*
- * xdna_mailbox_create() -- create mailbox subsystem and initialize
- *
- * @ddev: device pointer
- * @res: SRAM and mailbox resources
- *
- * Return: If success, return a handle of mailbox subsystem.
- * Otherwise, return NULL pointer.
- */
- struct mailbox *xdnam_mailbox_create(struct drm_device *ddev,
- const struct xdna_mailbox_res *res);
- /*
- * xdna_mailbox_alloc_channel() -- alloc a mailbox channel
- *
- * @mb: mailbox handle
- */
- struct mailbox_channel *xdna_mailbox_alloc_channel(struct mailbox *mb);
- /*
- * xdna_mailbox_start_channel() -- start a mailbox channel instance
- *
- * @mb_chann: the handle return from xdna_mailbox_alloc_channel()
- * @x2i: host to firmware mailbox resources
- * @i2x: firmware to host mailbox resources
- * @xdna_mailbox_intr_reg: register addr of MSI-X interrupt
- * @mb_irq: Linux IRQ number associated with mailbox MSI-X interrupt vector index
- *
- * Return: If success, return a handle of mailbox channel. Otherwise, return NULL.
- */
- int
- xdna_mailbox_start_channel(struct mailbox_channel *mb_chann,
- const struct xdna_mailbox_chann_res *x2i,
- const struct xdna_mailbox_chann_res *i2x,
- u32 xdna_mailbox_intr_reg,
- int mb_irq);
- /*
- * xdna_mailbox_free_channel() -- free mailbox channel
- *
- * @mailbox_chann: the handle return from xdna_mailbox_create_channel()
- */
- void xdna_mailbox_free_channel(struct mailbox_channel *mailbox_chann);
- /*
- * xdna_mailbox_stop_channel() -- stop mailbox channel
- *
- * @mailbox_chann: the handle return from xdna_mailbox_create_channel()
- */
- void xdna_mailbox_stop_channel(struct mailbox_channel *mailbox_chann);
- /*
- * xdna_mailbox_send_msg() -- Send a message
- *
- * @mailbox_chann: Mailbox channel handle
- * @msg: message struct for message information
- * @tx_timeout: the timeout value for sending the message in ms.
- *
- * Return: If success return 0, otherwise, return error code
- */
- int xdna_mailbox_send_msg(struct mailbox_channel *mailbox_chann,
- const struct xdna_mailbox_msg *msg, u64 tx_timeout);
- #endif /* _AIE2_MAILBOX_ */
|