lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 604/862] mailbox: mpfs: account for mbox offsets while sending
    Date
    From: Conor Dooley <conor.dooley@microchip.com>

    [ Upstream commit 0d1aadfe10ba17ebdeb96abb9638eb0f623f9b55 ]

    The mailbox offset is not only used for receiving messages, but it is
    also used by messages sent to the system controller by Linux that have a
    payload, such as the "digital signature service". It is also overloaded
    by certain other services (reprogramming of the FPGA fabric, see Link:)
    to have a meaning other than the offset the system controller should
    read from.
    When the driver was written, no such services of the latter type were
    in use & those of the former used an offset of zero so this has gone
    un-noticed.

    Link: https://www.microsemi.com/document-portal/doc_download/1245815-polarfire-fpga-and-polarfire-soc-fpga-system-services-user-guide # Section 5.2
    Fixes: 83d7b1560810 ("mbox: add polarfire soc system controller mailbox")
    Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
    Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/mailbox/mailbox-mpfs.c | 7 +++----
    1 file changed, 3 insertions(+), 4 deletions(-)

    diff --git a/drivers/mailbox/mailbox-mpfs.c b/drivers/mailbox/mailbox-mpfs.c
    index e432a8f0d148..cfacb3f320a6 100644
    --- a/drivers/mailbox/mailbox-mpfs.c
    +++ b/drivers/mailbox/mailbox-mpfs.c
    @@ -100,21 +100,20 @@ static int mpfs_mbox_send_data(struct mbox_chan *chan, void *data)

    for (index = 0; index < (msg->cmd_data_size / 4); index++)
    writel_relaxed(word_buf[index],
    - mbox->mbox_base + index * 0x4);
    + mbox->mbox_base + msg->mbox_offset + index * 0x4);
    if (extra_bits) {
    u8 i;
    u8 byte_off = ALIGN_DOWN(msg->cmd_data_size, 4);
    u8 *byte_buf = msg->cmd_data + byte_off;

    - val = readl_relaxed(mbox->mbox_base + index * 0x4);
    + val = readl_relaxed(mbox->mbox_base + msg->mbox_offset + index * 0x4);

    for (i = 0u; i < extra_bits; i++) {
    val &= ~(0xffu << (i * 8u));
    val |= (byte_buf[i] << (i * 8u));
    }

    - writel_relaxed(val,
    - mbox->mbox_base + index * 0x4);
    + writel_relaxed(val, mbox->mbox_base + msg->mbox_offset + index * 0x4);
    }
    }

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:21    [W:2.282 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site