Skip to content

Commit 40f14e8

Browse files
committed
virtio: Add return code to get_features
Update the get_features function to return an error code instead of directly returning the features. This prepares the codebase for additional functionality that requires error handling. Signed-off-by: Anirudh Srinivasan <asrinivasan@tenstorrent.com>
1 parent 855ab4a commit 40f14e8

8 files changed

Lines changed: 29 additions & 22 deletions

File tree

drivers/virtio/virtio.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,9 @@ static int virtio_dev_probe(struct device *_d)
280280
virtio_add_status(dev, VIRTIO_CONFIG_S_DRIVER);
281281

282282
/* Figure out what features the device supports. */
283-
virtio_get_features(dev, device_features);
283+
err = virtio_get_features(dev, device_features);
284+
if (err)
285+
goto err;
284286

285287
/* Figure out what features the driver supports. */
286288
virtio_features_zero(driver_features);

drivers/virtio/virtio_mmio.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,18 @@ struct virtio_mmio_device {
9191

9292
/* Configuration interface */
9393

94-
static u64 vm_get_features(struct virtio_device *vdev)
94+
static int vm_get_features(struct virtio_device *vdev, u64 *features_out)
9595
{
9696
struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
97-
u64 features;
9897

9998
writel(1, vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES_SEL);
100-
features = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES);
101-
features <<= 32;
99+
*features_out = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES);
100+
*features_out <<= 32;
102101

103102
writel(0, vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES_SEL);
104-
features |= readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES);
103+
*features_out |= readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES);
105104

106-
return features;
105+
return 0;
107106
}
108107

109108
static int vm_finalize_features(struct virtio_device *vdev)

drivers/virtio/virtio_pci_legacy.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818
#include "virtio_pci_common.h"
1919

2020
/* virtio config->get_features() implementation */
21-
static u64 vp_get_features(struct virtio_device *vdev)
21+
static int vp_get_features(struct virtio_device *vdev, u64 *features)
2222
{
2323
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
2424

2525
/* When someone needs more than 32 feature bits, we'll need to
2626
* steal a bit to indicate that the rest are somewhere else. */
27-
return vp_legacy_get_features(&vp_dev->ldev);
27+
*features = vp_legacy_get_features(&vp_dev->ldev);
28+
29+
return 0;
2830
}
2931

3032
/* virtio config->finalize_features() implementation */

drivers/virtio/virtio_pci_modern.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222

2323
#define VIRTIO_AVQ_SGS_MAX 4
2424

25-
static void vp_get_features(struct virtio_device *vdev, u64 *features)
25+
static int vp_get_features(struct virtio_device *vdev, u64 *features)
2626
{
2727
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
2828

29-
vp_modern_get_extended_features(&vp_dev->mdev, features);
29+
return vp_modern_get_extended_features(&vp_dev->mdev, features);
3030
}
3131

3232
static int vp_avq_index(struct virtio_device *vdev, u16 *index, u16 *num)

drivers/virtio/virtio_pci_modern_dev.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ EXPORT_SYMBOL_GPL(vp_modern_remove);
394394
*
395395
* Fill the specified features array with the features read from the device
396396
*/
397-
void vp_modern_get_extended_features(struct virtio_pci_modern_device *mdev,
397+
int vp_modern_get_extended_features(struct virtio_pci_modern_device *mdev,
398398
u64 *features)
399399
{
400400
struct virtio_pci_common_cfg __iomem *cfg = mdev->common;
@@ -408,6 +408,8 @@ void vp_modern_get_extended_features(struct virtio_pci_modern_device *mdev,
408408
cur = vp_ioread32(&cfg->device_feature);
409409
features[i >> 1] |= cur << (32 * (i & 1));
410410
}
411+
412+
return 0;
411413
}
412414
EXPORT_SYMBOL_GPL(vp_modern_get_extended_features);
413415

drivers/virtio/virtio_vdpa.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,12 +378,14 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
378378
return err;
379379
}
380380

381-
static u64 virtio_vdpa_get_features(struct virtio_device *vdev)
381+
static int virtio_vdpa_get_features(struct virtio_device *vdev, u64 *features)
382382
{
383383
struct vdpa_device *vdpa = vd_get_vdpa(vdev);
384384
const struct vdpa_config_ops *ops = vdpa->config;
385385

386-
return ops->get_device_features(vdpa);
386+
*features = ops->get_device_features(vdpa);
387+
388+
return 0;
387389
}
388390

389391
static int virtio_vdpa_finalize_features(struct virtio_device *vdev)

include/linux/virtio_config.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ struct virtio_config_ops {
124124
struct irq_affinity *desc);
125125
void (*del_vqs)(struct virtio_device *);
126126
void (*synchronize_cbs)(struct virtio_device *);
127-
u64 (*get_features)(struct virtio_device *vdev);
128-
void (*get_extended_features)(struct virtio_device *vdev,
127+
int (*get_features)(struct virtio_device *vdev, u64 *features);
128+
int (*get_extended_features)(struct virtio_device *vdev,
129129
u64 *features);
130130
int (*finalize_features)(struct virtio_device *vdev);
131131
const char *(*bus_name)(struct virtio_device *vdev);
@@ -264,16 +264,16 @@ static inline bool virtio_has_feature(const struct virtio_device *vdev,
264264
return __virtio_test_bit(vdev, fbit);
265265
}
266266

267-
static inline void virtio_get_features(struct virtio_device *vdev,
267+
static inline int virtio_get_features(struct virtio_device *vdev,
268268
u64 *features_out)
269269
{
270+
virtio_features_zero(features_out);
271+
270272
if (vdev->config->get_extended_features) {
271-
vdev->config->get_extended_features(vdev, features_out);
272-
return;
273+
return vdev->config->get_extended_features(vdev, features_out);
273274
}
274275

275-
virtio_features_from_u64(features_out,
276-
vdev->config->get_features(vdev));
276+
return vdev->config->get_features(vdev, features_out);
277277
}
278278

279279
/**

include/linux/virtio_pci_modern.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ static inline void vp_iowrite64_twopart(u64 val,
9999
void
100100
vp_modern_get_driver_extended_features(struct virtio_pci_modern_device *mdev,
101101
u64 *features);
102-
void vp_modern_get_extended_features(struct virtio_pci_modern_device *mdev,
102+
int vp_modern_get_extended_features(struct virtio_pci_modern_device *mdev,
103103
u64 *features);
104104
void vp_modern_set_extended_features(struct virtio_pci_modern_device *mdev,
105105
const u64 *features);

0 commit comments

Comments
 (0)