mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-27 21:14:44 +08:00
octeontx2-af: Sync hw mbox with bounce buffer.
If mailbox client has a bounce buffer or a intermediate buffer where mbox messages are framed then copy them from there to HW buffer. If 'mbase' and 'hw_mbase' are not same then assume 'mbase' points to bounce buffer. This patch also adds msg_size field to mbox header to copy only valid data instead of whole buffer. Signed-off-by: Geetha sowjanya <gakula@marvell.com> Signed-off-by: Sunil Goutham <sgoutham@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a36740f614
commit
fdb9029814
@ -19,17 +19,20 @@ static const u16 msgs_offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
|
||||
|
||||
void otx2_mbox_reset(struct otx2_mbox *mbox, int devid)
|
||||
{
|
||||
void *hw_mbase = mbox->hwbase + (devid * MBOX_SIZE);
|
||||
struct otx2_mbox_dev *mdev = &mbox->dev[devid];
|
||||
struct mbox_hdr *tx_hdr, *rx_hdr;
|
||||
|
||||
tx_hdr = mdev->mbase + mbox->tx_start;
|
||||
rx_hdr = mdev->mbase + mbox->rx_start;
|
||||
tx_hdr = hw_mbase + mbox->tx_start;
|
||||
rx_hdr = hw_mbase + mbox->rx_start;
|
||||
|
||||
spin_lock(&mdev->mbox_lock);
|
||||
mdev->msg_size = 0;
|
||||
mdev->rsp_size = 0;
|
||||
tx_hdr->num_msgs = 0;
|
||||
tx_hdr->msg_size = 0;
|
||||
rx_hdr->num_msgs = 0;
|
||||
rx_hdr->msg_size = 0;
|
||||
spin_unlock(&mdev->mbox_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_mbox_reset);
|
||||
@ -133,16 +136,17 @@ EXPORT_SYMBOL(otx2_mbox_init);
|
||||
|
||||
int otx2_mbox_wait_for_rsp(struct otx2_mbox *mbox, int devid)
|
||||
{
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(MBOX_RSP_TIMEOUT);
|
||||
struct otx2_mbox_dev *mdev = &mbox->dev[devid];
|
||||
int timeout = 0, sleep = 1;
|
||||
struct device *sender = &mbox->pdev->dev;
|
||||
|
||||
while (mdev->num_msgs != mdev->msgs_acked) {
|
||||
msleep(sleep);
|
||||
timeout += sleep;
|
||||
if (timeout >= MBOX_RSP_TIMEOUT)
|
||||
return -EIO;
|
||||
while (!time_after(jiffies, timeout)) {
|
||||
if (mdev->num_msgs == mdev->msgs_acked)
|
||||
return 0;
|
||||
usleep_range(800, 1000);
|
||||
}
|
||||
return 0;
|
||||
dev_dbg(sender, "timed out while waiting for rsp\n");
|
||||
return -EIO;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_mbox_wait_for_rsp);
|
||||
|
||||
@ -162,13 +166,25 @@ EXPORT_SYMBOL(otx2_mbox_busy_poll_for_rsp);
|
||||
|
||||
void otx2_mbox_msg_send(struct otx2_mbox *mbox, int devid)
|
||||
{
|
||||
void *hw_mbase = mbox->hwbase + (devid * MBOX_SIZE);
|
||||
struct otx2_mbox_dev *mdev = &mbox->dev[devid];
|
||||
struct mbox_hdr *tx_hdr, *rx_hdr;
|
||||
|
||||
tx_hdr = mdev->mbase + mbox->tx_start;
|
||||
rx_hdr = mdev->mbase + mbox->rx_start;
|
||||
tx_hdr = hw_mbase + mbox->tx_start;
|
||||
rx_hdr = hw_mbase + mbox->rx_start;
|
||||
|
||||
/* If bounce buffer is implemented copy mbox messages from
|
||||
* bounce buffer to hw mbox memory.
|
||||
*/
|
||||
if (mdev->mbase != hw_mbase)
|
||||
memcpy(hw_mbase + mbox->tx_start + msgs_offset,
|
||||
mdev->mbase + mbox->tx_start + msgs_offset,
|
||||
mdev->msg_size);
|
||||
|
||||
spin_lock(&mdev->mbox_lock);
|
||||
|
||||
tx_hdr->msg_size = mdev->msg_size;
|
||||
|
||||
/* Reset header for next messages */
|
||||
mdev->msg_size = 0;
|
||||
mdev->rsp_size = 0;
|
||||
@ -215,7 +231,7 @@ struct mbox_msghdr *otx2_mbox_alloc_msg_rsp(struct otx2_mbox *mbox, int devid,
|
||||
msghdr = mdev->mbase + mbox->tx_start + msgs_offset + mdev->msg_size;
|
||||
|
||||
/* Clear the whole msg region */
|
||||
memset(msghdr, 0, sizeof(*msghdr) + size);
|
||||
memset(msghdr, 0, size);
|
||||
/* Init message header with reset values */
|
||||
msghdr->ver = OTX2_MBOX_VERSION;
|
||||
mdev->msg_size += size;
|
||||
|
@ -36,7 +36,7 @@
|
||||
|
||||
#define INTR_MASK(pfvfs) ((pfvfs < 64) ? (BIT_ULL(pfvfs) - 1) : (~0ull))
|
||||
|
||||
#define MBOX_RSP_TIMEOUT 1000 /* in ms, Time to wait for mbox response */
|
||||
#define MBOX_RSP_TIMEOUT 2000 /* Time(ms) to wait for mbox response */
|
||||
|
||||
#define MBOX_MSG_ALIGN 16 /* Align mbox msg start to 16bytes */
|
||||
|
||||
@ -75,6 +75,7 @@ struct otx2_mbox {
|
||||
|
||||
/* Header which preceeds all mbox messages */
|
||||
struct mbox_hdr {
|
||||
u64 msg_size; /* Total msgs size embedded */
|
||||
u16 num_msgs; /* No of msgs embedded */
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user