mirror of
https://github.com/torvalds/linux.git
synced 2026-03-07 23:04:33 +01:00
The management channel used for firmware control command submission is
currently created after the firmware is started. If channel creation
fails (for example, due to memory allocation failure or workqueue
creation interruption), the firmware remains in a pending state and is
unable to receive any control commands.
To avoid leaving the firmware in this inconsistent state, split
xdna_mailbox_create_channel() into two separate functions so that
resource allocation can be completed before interacting with the
hardware.
xdna_mailbox_alloc_channel()
Allocates memory and initializes the workqueue. This can be called
earlier, before interacting with the hardware.
xdna_mailbox_start_channel()
Performs the hardware interaction required to start the channel.
Rename xdna_mailbox_destroy_channel() to xdna_mailbox_free_channel().
Ensure that xdna_mailbox_stop_channel() and xdna_mailbox_free_channel()
properly unwind the corresponding start and allocation steps, respectively.
Fixes: b87f920b93 ("accel/amdxdna: Support hardware mailbox")
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
Signed-off-by: Lizhi Hou <lizhi.hou@amd.com>
Link: https://patch.msgid.link/20260305062041.3954024-1-lizhi.hou@amd.com
127 lines
3.5 KiB
C
127 lines
3.5 KiB
C
/* 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_ */
|