mailbox: mpfs: account for mbox offsets while sending
authorConor Dooley <conor.dooley@microchip.com>
Wed, 24 Aug 2022 07:08:12 +0000 (08:08 +0100)
committerJassi Brar <jaswinder.singh@linaro.org>
Thu, 6 Oct 2022 02:48:38 +0000 (21:48 -0500)
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
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>
drivers/mailbox/mailbox-mpfs.c

index e432a8f0d14851d2b3b42c12da15628475a3726c..cfacb3f320a6438cba4717c135317f492cc455a8 100644 (file)
@@ -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);
                }
        }