Skip to content

Commit

Permalink
rpmsg: glink: Allow unaligned data access
Browse files Browse the repository at this point in the history
Glink protocol requires that each message is aligned on a 8 byte offset.
This is purely a restriction from glink, so in order to support clients
which do not adher to this, allow data packets of any size, but align
the head index accordingly, effectively removing the alignment
restriction.

Acked-by: Arun Kumar Neelakantam <[email protected]>
Signed-off-by: Sricharan R <[email protected]>
Signed-off-by: Bjorn Andersson <[email protected]>
  • Loading branch information
andersson committed Aug 29, 2017
1 parent 835764d commit 7339859
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
6 changes: 0 additions & 6 deletions drivers/rpmsg/qcom_glink_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,6 @@ static int qcom_glink_tx(struct qcom_glink *glink,
if (tlen >= glink->tx_pipe->length)
return -EINVAL;

if (WARN(tlen % 8, "Unaligned TX request"))
return -EINVAL;

ret = mutex_lock_interruptible(&glink->tx_lock);
if (ret)
return ret;
Expand Down Expand Up @@ -695,9 +692,6 @@ static int __qcom_glink_send(struct glink_channel *channel,
__le32 left_size;
} __packed req;

if (WARN(len % 8, "RPM GLINK expects 8 byte aligned messages\n"))
return -EINVAL;

req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA);
req.msg.param1 = cpu_to_le16(channel->lcid);
req.msg.param2 = cpu_to_le32(channel->rcid);
Expand Down
22 changes: 21 additions & 1 deletion drivers/rpmsg/qcom_glink_rpm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down

0 comments on commit 7339859

Please sign in to comment.