summaryrefslogtreecommitdiffstats
path: root/drivers/mailbox/mailbox-mpfs.c
diff options
context:
space:
mode:
authorConor Dooley <conor.dooley@microchip.com>2022-08-24 09:08:12 +0200
committerJassi Brar <jaswinder.singh@linaro.org>2022-10-06 04:48:38 +0200
commit0d1aadfe10ba17ebdeb96abb9638eb0f623f9b55 (patch)
tree2d5f187c2be5a7d9fc1e1eb47e28b4330e5e0674 /drivers/mailbox/mailbox-mpfs.c
parentmailbox: mpfs: fix handling of the reg property (diff)
downloadlinux-0d1aadfe10ba17ebdeb96abb9638eb0f623f9b55.tar.xz
linux-0d1aadfe10ba17ebdeb96abb9638eb0f623f9b55.zip
mailbox: mpfs: account for mbox offsets while sending
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>
Diffstat (limited to 'drivers/mailbox/mailbox-mpfs.c')
-rw-r--r--drivers/mailbox/mailbox-mpfs.c7
1 files 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);
}
}