Commit 3de16839 authored by Michael Tretter's avatar Michael Tretter Committed by Mauro Carvalho Chehab

media: allegro: add explicit mail encoding and decoding

The message format in the mailboxes differ between firmware versions.
Therefore, it is necessary to decouple the mailbox format of the driver
from the message format of the firmware. This allows to keep a
consistent message format in the driver while still supporting various
firmware versions.

Add an intermediate step to encode and decode message before writing the
mails to the mailboxes.

On the other hand, this allows to handle optional fields in the
messages, which is required for advanced features of the encoder and was
not possible until now.
Signed-off-by: default avatarMichael Tretter <m.tretter@pengutronix.de>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent e561f8e2
...@@ -705,11 +705,20 @@ static ssize_t allegro_mbox_read(struct allegro_mbox *mbox, ...@@ -705,11 +705,20 @@ static ssize_t allegro_mbox_read(struct allegro_mbox *mbox,
static int allegro_mbox_send(struct allegro_mbox *mbox, void *msg) static int allegro_mbox_send(struct allegro_mbox *mbox, void *msg)
{ {
struct allegro_dev *dev = mbox->dev; struct allegro_dev *dev = mbox->dev;
struct mcu_msg_header *header = msg; ssize_t size;
ssize_t size = sizeof(*header) + header->length;
int err; int err;
u32 *tmp;
tmp = kzalloc(mbox->size, GFP_KERNEL);
if (!tmp) {
err = -ENOMEM;
goto out;
}
size = allegro_encode_mail(tmp, msg);
err = allegro_mbox_write(mbox, msg, size); err = allegro_mbox_write(mbox, tmp, size);
kfree(tmp);
if (err) if (err)
goto out; goto out;
...@@ -728,18 +737,29 @@ static void allegro_mbox_notify(struct allegro_mbox *mbox) ...@@ -728,18 +737,29 @@ static void allegro_mbox_notify(struct allegro_mbox *mbox)
struct allegro_dev *dev = mbox->dev; struct allegro_dev *dev = mbox->dev;
union mcu_msg_response *msg; union mcu_msg_response *msg;
ssize_t size; ssize_t size;
u32 *tmp;
int err;
msg = kmalloc(sizeof(*msg), GFP_KERNEL); msg = kmalloc(sizeof(*msg), GFP_KERNEL);
if (!msg) if (!msg)
return; return;
size = allegro_mbox_read(mbox, (u32 *)msg, sizeof(*msg)); tmp = kmalloc(mbox->size, GFP_KERNEL);
if (!tmp)
goto out;
size = allegro_mbox_read(mbox, tmp, mbox->size);
if (size < 0) if (size < 0)
goto out; goto out;
err = allegro_decode_mail(msg, tmp);
if (err)
goto out;
allegro_handle_message(dev, msg); allegro_handle_message(dev, msg);
out: out:
kfree(tmp);
kfree(msg); kfree(msg);
} }
......
...@@ -264,4 +264,7 @@ union mcu_msg_response { ...@@ -264,4 +264,7 @@ union mcu_msg_response {
struct mcu_msg_encode_frame_response encode_frame; struct mcu_msg_encode_frame_response encode_frame;
}; };
int allegro_decode_mail(void *msg, u32 *src);
ssize_t allegro_encode_mail(u32 *dst, void *msg);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment