Hi Viresh,
On 24 Jul 2025, at 11:41, Viresh Kumar viresh.kumar@linaro.org wrote:
On 22-07-25, 10:38, Bertrand Marquis wrote:
+static void virtio_msg_get(struct virtio_device *vdev, unsigned int offset,
- void *buf, unsigned int len)
+{
- struct virtio_msg_device *vmdev = to_virtio_msg_device(vdev);
- struct get_config *req_payload = virtio_msg_payload(vmdev->request);
- struct get_config_resp *res_payload = virtio_msg_payload(vmdev->response);
- BUG_ON(len > 8);
So you only allow to retrieve 64bit at a time here. Why is that ?
This was copied from mmio which accepts on 8 bytes at a time. Modified as:
Sounds good yes, same should apply to set I would say.
Cheers Bertrand
diff --git a/drivers/virtio/virtio_msg.c b/drivers/virtio/virtio_msg.c index 207fa1f18bf9..8508a90551a6 100644 --- a/drivers/virtio/virtio_msg.c +++ b/drivers/virtio/virtio_msg.c @@ -170,8 +170,7 @@ static void virtio_msg_get(struct virtio_device *vdev, unsigned int offset, struct virtio_msg_device *vmdev = to_virtio_msg_device(vdev); struct get_config *req_payload = virtio_msg_payload(vmdev->request); struct get_config_resp *res_payload = virtio_msg_payload(vmdev->response);
BUG_ON(len > 8);
u32 i = 0, max; if (offset + len > vmdev->config_size) { dev_err(&vmdev->vdev.dev,
@@ -180,16 +179,25 @@ static void virtio_msg_get(struct virtio_device *vdev, unsigned int offset, return; }
/* Max buffer size available in the response */
max = vmdev->msg_size - sizeof(*vmdev->response) - sizeof(*res_payload);
transport_msg_prepare(vmdev, VIRTIO_MSG_GET_CONFIG, sizeof(*req_payload));
req_payload->offset = cpu_to_le32(offset);
req_payload->size = cpu_to_le32(len);
if (virtio_msg_xfer(vmdev))
return;
while (i != len) {
u32 size = min(max, len - i);
req_payload->offset = cpu_to_le32(offset + i);
req_payload->size = cpu_to_le32(size);
if (virtio_msg_xfer(vmdev))
return;
/* Buffer holds the data in little endian */
memcpy(buf + i, res_payload->config, size);
i += size;
}
/* Buffer holds the data in little endian */
if (buf)
memcpy(buf, res_payload->config, len); vmdev->generation_count = le32_to_cpu(res_payload->generation);
}
-- viresh
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.