|
@@ -156,11 +156,31 @@ static void glink_rpm_tx_write(struct qcom_glink_pipe *glink_pipe,
|
|
|
const void *data, size_t dlen)
|
|
|
{
|
|
|
struct glink_rpm_pipe *pipe = to_rpm_pipe(glink_pipe);
|
|
|
+ size_t tlen = hlen + dlen;
|
|
|
+ size_t aligned_dlen;
|
|
|
unsigned int head;
|
|
|
+ char padding[8] = {0};
|
|
|
+ size_t pad;
|
|
|
+
|
|
|
+ /* Header length comes from glink native and is always 4 byte aligned */
|
|
|
+ if (WARN(hlen % 4, "Glink Header length must be 4 bytes aligned\n"))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Move the unaligned tail of the message to the padding chunk, to
|
|
|
+ * ensure word aligned accesses
|
|
|
+ */
|
|
|
+ aligned_dlen = ALIGN_DOWN(dlen, 4);
|
|
|
+ if (aligned_dlen != dlen)
|
|
|
+ memcpy(padding, data + aligned_dlen, dlen - aligned_dlen);
|
|
|
|
|
|
head = readl(pipe->head);
|
|
|
head = glink_rpm_tx_write_one(pipe, head, hdr, hlen);
|
|
|
- head = glink_rpm_tx_write_one(pipe, head, data, dlen);
|
|
|
+ head = glink_rpm_tx_write_one(pipe, head, data, aligned_dlen);
|
|
|
+
|
|
|
+ pad = ALIGN(tlen, 8) - ALIGN_DOWN(tlen, 4);
|
|
|
+ if (pad)
|
|
|
+ head = glink_rpm_tx_write_one(pipe, head, padding, pad);
|
|
|
writel(head, pipe->head);
|
|
|
}
|
|
|
|