Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

accel/amdxdna: Fix tail-pointer polling in mailbox_get_msg()

In mailbox_get_msg(), mailbox_reg_read_non_zero() is called to poll for a
non-zero tail pointer. This assumed that a zero value indicates an error.
However, certain corner cases legitimately produce a zero tail pointer.
To handle these cases, remove mailbox_reg_read_non_zero(). The zero tail
pointer will be treated as a valid rewind event.

Reviewed-by: Maciej Falkowski <maciej.falkowski@linux.intel.com>
Signed-off-by: Lizhi Hou <lizhi.hou@amd.com>
Link: https://patch.msgid.link/20251204181603.793824-1-lizhi.hou@amd.com

Lizhi Hou cd77d5a4 646013f5

+1 -18
+1 -18
drivers/accel/amdxdna/amdxdna_mailbox.c
··· 112 112 return readl(ringbuf_addr); 113 113 } 114 114 115 - static int mailbox_reg_read_non_zero(struct mailbox_channel *mb_chann, u32 mbox_reg, u32 *val) 116 - { 117 - struct xdna_mailbox_res *mb_res = &mb_chann->mb->res; 118 - void __iomem *ringbuf_addr = mb_res->mbox_base + mbox_reg; 119 - int ret, value; 120 - 121 - /* Poll till value is not zero */ 122 - ret = readx_poll_timeout(readl, ringbuf_addr, value, 123 - value, 1 /* us */, 100); 124 - if (ret < 0) 125 - return ret; 126 - 127 - *val = value; 128 - return 0; 129 - } 130 - 131 115 static inline void 132 116 mailbox_set_headptr(struct mailbox_channel *mb_chann, u32 headptr_val) 133 117 { ··· 270 286 u32 start_addr; 271 287 int ret; 272 288 273 - if (mailbox_reg_read_non_zero(mb_chann, mb_chann->res[CHAN_RES_I2X].mb_tail_ptr_reg, &tail)) 274 - return -EINVAL; 289 + tail = mailbox_get_tailptr(mb_chann, CHAN_RES_I2X); 275 290 head = mb_chann->i2x_head; 276 291 ringbuf_size = mailbox_get_ringbuf_size(mb_chann, CHAN_RES_I2X); 277 292 start_addr = mb_chann->res[CHAN_RES_I2X].rb_start_addr;