[PATCH 1/3] remoteproc: virtio: add vdev_to_rsc() helper

From: Francesco Valla

Date: Sat Oct 10 2026 - 11:42:26 EST


Instead of repeating the table+offset math in every function that needs
to access the resource linked to a vdev, add a simple helper function
for that to simplify the code a bit.

No functional changes.

Signed-off-by: Francesco Valla <francesco@xxxxxxxx>
---
drivers/remoteproc/remoteproc_virtio.c | 54 +++++++++++++---------------------
1 file changed, 20 insertions(+), 34 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index d5e9ff045a28..dcafdfa7eab6 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -61,6 +61,16 @@ static struct rproc *vdev_to_rproc(struct virtio_device *vdev)
return rvdev->rproc;
}

+static struct fw_rsc_vdev *vdev_to_rsc(struct virtio_device *vdev)
+{
+ struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
+ struct fw_rsc_vdev *rsc;
+
+ rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
+
+ return rsc;
+}
+
/* kick the remote processor, and let it know which virtqueue to poke at */
static bool rproc_virtio_notify(struct virtqueue *vq)
{
@@ -107,10 +117,10 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
{
struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
struct rproc *rproc = vdev_to_rproc(vdev);
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);
struct device *dev = &rproc->dev;
struct rproc_mem_entry *mem;
struct rproc_vring *rvring;
- struct fw_rsc_vdev *rsc;
struct virtqueue *vq;
void *addr;
int num, size;
@@ -157,7 +167,6 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
vq->priv = rvring;

/* Update vring in resource table */
- rsc = (void *)rproc->table_ptr + rvdev->rsc_offset;
rsc->vring[id].da = mem->da;

return vq;
@@ -212,20 +221,14 @@ static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,

static u8 rproc_virtio_get_status(struct virtio_device *vdev)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);

return rsc->status;
}

static void rproc_virtio_set_status(struct virtio_device *vdev, u8 status)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);

rsc->status = status;
dev_dbg(&vdev->dev, "status: %d\n", status);
@@ -233,10 +236,7 @@ static void rproc_virtio_set_status(struct virtio_device *vdev, u8 status)

static void rproc_virtio_reset(struct virtio_device *vdev)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);

rsc->status = 0;
dev_dbg(&vdev->dev, "reset !\n");
@@ -245,10 +245,7 @@ static void rproc_virtio_reset(struct virtio_device *vdev)
/* provide the vdev features as retrieved from the firmware */
static u64 rproc_virtio_get_features(struct virtio_device *vdev)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);

return rsc->dfeatures;
}
@@ -265,10 +262,7 @@ static void rproc_transport_features(struct virtio_device *vdev)

static int rproc_virtio_finalize_features(struct virtio_device *vdev)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);

/* Give virtio_ring a chance to accept features */
vring_transport_features(vdev);
@@ -291,12 +285,8 @@ static int rproc_virtio_finalize_features(struct virtio_device *vdev)
static void rproc_virtio_get(struct virtio_device *vdev, unsigned int offset,
void *buf, unsigned int len)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
- void *cfg;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
- cfg = &rsc->vring[rsc->num_of_vrings];
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);
+ void *cfg = &rsc->vring[rsc->num_of_vrings];

if (offset + len > rsc->config_len || offset + len < len) {
dev_err(&vdev->dev, "rproc_virtio_get: access out of bounds\n");
@@ -309,12 +299,8 @@ static void rproc_virtio_get(struct virtio_device *vdev, unsigned int offset,
static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
const void *buf, unsigned int len)
{
- struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
- struct fw_rsc_vdev *rsc;
- void *cfg;
-
- rsc = (void *)rvdev->rproc->table_ptr + rvdev->rsc_offset;
- cfg = &rsc->vring[rsc->num_of_vrings];
+ struct fw_rsc_vdev *rsc = vdev_to_rsc(vdev);
+ void *cfg = &rsc->vring[rsc->num_of_vrings];

if (offset + len > rsc->config_len || offset + len < len) {
dev_err(&vdev->dev, "rproc_virtio_set: access out of bounds\n");

--
2.56.0