mailbox: mpfs: account for mbox offsets while sending
[ 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>
This commit is contained in:
parent
ba22643595
commit
b8fcd9ab0f
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user