Re: [PATCH V7 4/6] mdev: introduce virtio device and its device ops
On 2019/11/5 下午12:39, Alex Williamson wrote: On Tue, 5 Nov 2019 11:52:41 +0800 Jason Wang wrote: On 2019/11/5 上午5:50, Alex Williamson wrote: On Mon, 4 Nov 2019 20:39:50 +0800 Jason Wang wrote: This patch implements basic support for mdev driver that supports virtio transport for kernel virtio driver. Signed-off-by: Jason Wang --- drivers/vfio/mdev/mdev_core.c| 20 drivers/vfio/mdev/mdev_private.h | 2 + include/linux/mdev.h | 6 ++ include/linux/mdev_virtio_ops.h | 166 +++ 4 files changed, 194 insertions(+) create mode 100644 include/linux/mdev_virtio_ops.h diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 8d579d7ed82f..95ee4126ff9c 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -76,6 +76,26 @@ const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *mdev) } EXPORT_SYMBOL(mdev_get_vfio_ops); +/* Specify the virtio device ops for the mdev device, this + * must be called during create() callback for virtio mdev device. + */ Comment style. Will fix. +void mdev_set_virtio_ops(struct mdev_device *mdev, +const struct mdev_virtio_device_ops *virtio_ops) +{ + mdev_set_class(mdev, MDEV_CLASS_ID_VIRTIO); + mdev->virtio_ops = virtio_ops; +} +EXPORT_SYMBOL(mdev_set_virtio_ops); + +/* Get the virtio device ops for the mdev device. */ +const struct mdev_virtio_device_ops * +mdev_get_virtio_ops(struct mdev_device *mdev) +{ + WARN_ON(mdev->class_id != MDEV_CLASS_ID_VIRTIO); + return mdev->virtio_ops; +} +EXPORT_SYMBOL(mdev_get_virtio_ops); + struct device *mdev_dev(struct mdev_device *mdev) { return >dev; diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h index 411227373625..2c74dd032409 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -11,6 +11,7 @@ #define MDEV_PRIVATE_H #include +#include int mdev_bus_register(void); void mdev_bus_unregister(void); @@ -38,6 +39,7 @@ struct mdev_device { u16 class_id; union { const struct mdev_vfio_device_ops *vfio_ops; + const struct mdev_virtio_device_ops *virtio_ops; }; }; diff --git a/include/linux/mdev.h b/include/linux/mdev.h index 9e37506d1987..f3d75a60c2b5 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -17,6 +17,7 @@ struct mdev_device; struct mdev_vfio_device_ops; +struct mdev_virtio_device_ops; /* * Called by the parent device driver to set the device which represents @@ -112,6 +113,10 @@ void mdev_set_class(struct mdev_device *mdev, u16 id); void mdev_set_vfio_ops(struct mdev_device *mdev, const struct mdev_vfio_device_ops *vfio_ops); const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *mdev); +void mdev_set_virtio_ops(struct mdev_device *mdev, +const struct mdev_virtio_device_ops *virtio_ops); +const struct mdev_virtio_device_ops * +mdev_get_virtio_ops(struct mdev_device *mdev); extern struct bus_type mdev_bus_type; @@ -127,6 +132,7 @@ struct mdev_device *mdev_from_dev(struct device *dev); enum { MDEV_CLASS_ID_VFIO = 1, + MDEV_CLASS_ID_VIRTIO = 2, /* New entries must be added here */ }; diff --git a/include/linux/mdev_virtio_ops.h b/include/linux/mdev_virtio_ops.h new file mode 100644 index ..0dcae7fa31e5 --- /dev/null +++ b/include/linux/mdev_virtio_ops.h @@ -0,0 +1,166 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Virtio mediated device driver + * + * Copyright 2019, Red Hat Corp. + * Author: Jason Wang + */ +#ifndef MDEV_VIRTIO_OPS_H +#define MDEV_VIRTIO_OPS_H + +#include +#include +#include + +#define VIRTIO_MDEV_DEVICE_API_STRING "virtio-mdev" +#define VIRTIO_MDEV_F_VERSION_1 0x1 + +struct virtio_mdev_callback { + irqreturn_t (*callback)(void *data); + void *private; +}; + +/** + * struct mdev_virtio_device_ops - Structure to be registered for each + * mdev device to register the device for virtio/vhost drivers. + * + * The device ops that is supported by VIRTIO_MDEV_F_VERSION_1, the + * callbacks are mandatory unless explicity mentioned. + * + * @get_mdev_features: Get a set of bits that demonstrate + * the capability of the mdev device. New + * feature bits must be added when + * introducing new device ops. This + * allows the device ops to be extended + * (one feature could have N new ops). + * @mdev: mediated device + * Returns the mdev features (API) support by + * the device. I still don't see the point of
Re: [PATCH V7 4/6] mdev: introduce virtio device and its device ops
On Tue, 5 Nov 2019 11:52:41 +0800 Jason Wang wrote: > On 2019/11/5 上午5:50, Alex Williamson wrote: > > On Mon, 4 Nov 2019 20:39:50 +0800 > > Jason Wang wrote: > > > >> This patch implements basic support for mdev driver that supports > >> virtio transport for kernel virtio driver. > >> > >> Signed-off-by: Jason Wang > >> --- > >> drivers/vfio/mdev/mdev_core.c| 20 > >> drivers/vfio/mdev/mdev_private.h | 2 + > >> include/linux/mdev.h | 6 ++ > >> include/linux/mdev_virtio_ops.h | 166 +++ > >> 4 files changed, 194 insertions(+) > >> create mode 100644 include/linux/mdev_virtio_ops.h > >> > >> diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c > >> index 8d579d7ed82f..95ee4126ff9c 100644 > >> --- a/drivers/vfio/mdev/mdev_core.c > >> +++ b/drivers/vfio/mdev/mdev_core.c > >> @@ -76,6 +76,26 @@ const struct mdev_vfio_device_ops > >> *mdev_get_vfio_ops(struct mdev_device *mdev) > >> } > >> EXPORT_SYMBOL(mdev_get_vfio_ops); > >> > >> +/* Specify the virtio device ops for the mdev device, this > >> + * must be called during create() callback for virtio mdev device. > >> + */ > > Comment style. > > > Will fix. > > > > > >> +void mdev_set_virtio_ops(struct mdev_device *mdev, > >> + const struct mdev_virtio_device_ops *virtio_ops) > >> +{ > >> + mdev_set_class(mdev, MDEV_CLASS_ID_VIRTIO); > >> + mdev->virtio_ops = virtio_ops; > >> +} > >> +EXPORT_SYMBOL(mdev_set_virtio_ops); > >> + > >> +/* Get the virtio device ops for the mdev device. */ > >> +const struct mdev_virtio_device_ops * > >> +mdev_get_virtio_ops(struct mdev_device *mdev) > >> +{ > >> + WARN_ON(mdev->class_id != MDEV_CLASS_ID_VIRTIO); > >> + return mdev->virtio_ops; > >> +} > >> +EXPORT_SYMBOL(mdev_get_virtio_ops); > >> + > >> struct device *mdev_dev(struct mdev_device *mdev) > >> { > >>return >dev; > >> diff --git a/drivers/vfio/mdev/mdev_private.h > >> b/drivers/vfio/mdev/mdev_private.h > >> index 411227373625..2c74dd032409 100644 > >> --- a/drivers/vfio/mdev/mdev_private.h > >> +++ b/drivers/vfio/mdev/mdev_private.h > >> @@ -11,6 +11,7 @@ > >> #define MDEV_PRIVATE_H > >> > >> #include > >> +#include > >> > >> int mdev_bus_register(void); > >> void mdev_bus_unregister(void); > >> @@ -38,6 +39,7 @@ struct mdev_device { > >>u16 class_id; > >>union { > >>const struct mdev_vfio_device_ops *vfio_ops; > >> + const struct mdev_virtio_device_ops *virtio_ops; > >>}; > >> }; > >> > >> diff --git a/include/linux/mdev.h b/include/linux/mdev.h > >> index 9e37506d1987..f3d75a60c2b5 100644 > >> --- a/include/linux/mdev.h > >> +++ b/include/linux/mdev.h > >> @@ -17,6 +17,7 @@ > >> > >> struct mdev_device; > >> struct mdev_vfio_device_ops; > >> +struct mdev_virtio_device_ops; > >> > >> /* > >>* Called by the parent device driver to set the device which represents > >> @@ -112,6 +113,10 @@ void mdev_set_class(struct mdev_device *mdev, u16 id); > >> void mdev_set_vfio_ops(struct mdev_device *mdev, > >> const struct mdev_vfio_device_ops *vfio_ops); > >> const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device > >> *mdev); > >> +void mdev_set_virtio_ops(struct mdev_device *mdev, > >> + const struct mdev_virtio_device_ops *virtio_ops); > >> +const struct mdev_virtio_device_ops * > >> +mdev_get_virtio_ops(struct mdev_device *mdev); > >> > >> extern struct bus_type mdev_bus_type; > >> > >> @@ -127,6 +132,7 @@ struct mdev_device *mdev_from_dev(struct device *dev); > >> > >> enum { > >>MDEV_CLASS_ID_VFIO = 1, > >> + MDEV_CLASS_ID_VIRTIO = 2, > >>/* New entries must be added here */ > >> }; > >> > >> diff --git a/include/linux/mdev_virtio_ops.h > >> b/include/linux/mdev_virtio_ops.h > >> new file mode 100644 > >> index ..0dcae7fa31e5 > >> --- /dev/null > >> +++ b/include/linux/mdev_virtio_ops.h > >> @@ -0,0 +1,166 @@ > >> +/* SPDX-License-Identifier: GPL-2.0-only */ > >> +/* > >> + * Virtio mediated device driver > >> + * > >> + * Copyright 2019, Red Hat Corp. > >> + * Author: Jason Wang > >> + */ > >> +#ifndef MDEV_VIRTIO_OPS_H > >> +#define MDEV_VIRTIO_OPS_H > >> + > >> +#include > >> +#include > >> +#include > >> + > >> +#define VIRTIO_MDEV_DEVICE_API_STRING "virtio-mdev" > >> +#define VIRTIO_MDEV_F_VERSION_1 0x1 > >> + > >> +struct virtio_mdev_callback { > >> + irqreturn_t (*callback)(void *data); > >> + void *private; > >> +}; > >> + > >> +/** > >> + * struct mdev_virtio_device_ops - Structure to be registered for each > >> + * mdev device to register the device for virtio/vhost drivers. > >> + * > >> + * The device ops that is supported by VIRTIO_MDEV_F_VERSION_1, the > >> + * callbacks are mandatory unless explicity mentioned. > >> + * > >> + * @get_mdev_features:Get a set of bits that demonstrate > >> + *
Re: [PATCH V7 4/6] mdev: introduce virtio device and its device ops
On 2019/11/5 上午5:50, Alex Williamson wrote: On Mon, 4 Nov 2019 20:39:50 +0800 Jason Wang wrote: This patch implements basic support for mdev driver that supports virtio transport for kernel virtio driver. Signed-off-by: Jason Wang --- drivers/vfio/mdev/mdev_core.c| 20 drivers/vfio/mdev/mdev_private.h | 2 + include/linux/mdev.h | 6 ++ include/linux/mdev_virtio_ops.h | 166 +++ 4 files changed, 194 insertions(+) create mode 100644 include/linux/mdev_virtio_ops.h diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 8d579d7ed82f..95ee4126ff9c 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -76,6 +76,26 @@ const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *mdev) } EXPORT_SYMBOL(mdev_get_vfio_ops); +/* Specify the virtio device ops for the mdev device, this + * must be called during create() callback for virtio mdev device. + */ Comment style. Will fix. +void mdev_set_virtio_ops(struct mdev_device *mdev, +const struct mdev_virtio_device_ops *virtio_ops) +{ + mdev_set_class(mdev, MDEV_CLASS_ID_VIRTIO); + mdev->virtio_ops = virtio_ops; +} +EXPORT_SYMBOL(mdev_set_virtio_ops); + +/* Get the virtio device ops for the mdev device. */ +const struct mdev_virtio_device_ops * +mdev_get_virtio_ops(struct mdev_device *mdev) +{ + WARN_ON(mdev->class_id != MDEV_CLASS_ID_VIRTIO); + return mdev->virtio_ops; +} +EXPORT_SYMBOL(mdev_get_virtio_ops); + struct device *mdev_dev(struct mdev_device *mdev) { return >dev; diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h index 411227373625..2c74dd032409 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -11,6 +11,7 @@ #define MDEV_PRIVATE_H #include +#include int mdev_bus_register(void); void mdev_bus_unregister(void); @@ -38,6 +39,7 @@ struct mdev_device { u16 class_id; union { const struct mdev_vfio_device_ops *vfio_ops; + const struct mdev_virtio_device_ops *virtio_ops; }; }; diff --git a/include/linux/mdev.h b/include/linux/mdev.h index 9e37506d1987..f3d75a60c2b5 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -17,6 +17,7 @@ struct mdev_device; struct mdev_vfio_device_ops; +struct mdev_virtio_device_ops; /* * Called by the parent device driver to set the device which represents @@ -112,6 +113,10 @@ void mdev_set_class(struct mdev_device *mdev, u16 id); void mdev_set_vfio_ops(struct mdev_device *mdev, const struct mdev_vfio_device_ops *vfio_ops); const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *mdev); +void mdev_set_virtio_ops(struct mdev_device *mdev, +const struct mdev_virtio_device_ops *virtio_ops); +const struct mdev_virtio_device_ops * +mdev_get_virtio_ops(struct mdev_device *mdev); extern struct bus_type mdev_bus_type; @@ -127,6 +132,7 @@ struct mdev_device *mdev_from_dev(struct device *dev); enum { MDEV_CLASS_ID_VFIO = 1, + MDEV_CLASS_ID_VIRTIO = 2, /* New entries must be added here */ }; diff --git a/include/linux/mdev_virtio_ops.h b/include/linux/mdev_virtio_ops.h new file mode 100644 index ..0dcae7fa31e5 --- /dev/null +++ b/include/linux/mdev_virtio_ops.h @@ -0,0 +1,166 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Virtio mediated device driver + * + * Copyright 2019, Red Hat Corp. + * Author: Jason Wang + */ +#ifndef MDEV_VIRTIO_OPS_H +#define MDEV_VIRTIO_OPS_H + +#include +#include +#include + +#define VIRTIO_MDEV_DEVICE_API_STRING "virtio-mdev" +#define VIRTIO_MDEV_F_VERSION_1 0x1 + +struct virtio_mdev_callback { + irqreturn_t (*callback)(void *data); + void *private; +}; + +/** + * struct mdev_virtio_device_ops - Structure to be registered for each + * mdev device to register the device for virtio/vhost drivers. + * + * The device ops that is supported by VIRTIO_MDEV_F_VERSION_1, the + * callbacks are mandatory unless explicity mentioned. + * + * @get_mdev_features: Get a set of bits that demonstrate + * the capability of the mdev device. New + * feature bits must be added when + * introducing new device ops. This + * allows the device ops to be extended + * (one feature could have N new ops). + * @mdev: mediated device + * Returns the mdev features (API) support by + * the device. I still don't see the point of VIRTIO_MDEV_F_VERSION_1. In what case would it not be set? It's a must for current driver implementation. What would it indicate to the caller if it
Re: [PATCH V7 4/6] mdev: introduce virtio device and its device ops
On Mon, 4 Nov 2019 20:39:50 +0800 Jason Wang wrote: > This patch implements basic support for mdev driver that supports > virtio transport for kernel virtio driver. > > Signed-off-by: Jason Wang > --- > drivers/vfio/mdev/mdev_core.c| 20 > drivers/vfio/mdev/mdev_private.h | 2 + > include/linux/mdev.h | 6 ++ > include/linux/mdev_virtio_ops.h | 166 +++ > 4 files changed, 194 insertions(+) > create mode 100644 include/linux/mdev_virtio_ops.h > > diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c > index 8d579d7ed82f..95ee4126ff9c 100644 > --- a/drivers/vfio/mdev/mdev_core.c > +++ b/drivers/vfio/mdev/mdev_core.c > @@ -76,6 +76,26 @@ const struct mdev_vfio_device_ops > *mdev_get_vfio_ops(struct mdev_device *mdev) > } > EXPORT_SYMBOL(mdev_get_vfio_ops); > > +/* Specify the virtio device ops for the mdev device, this > + * must be called during create() callback for virtio mdev device. > + */ Comment style. > +void mdev_set_virtio_ops(struct mdev_device *mdev, > + const struct mdev_virtio_device_ops *virtio_ops) > +{ > + mdev_set_class(mdev, MDEV_CLASS_ID_VIRTIO); > + mdev->virtio_ops = virtio_ops; > +} > +EXPORT_SYMBOL(mdev_set_virtio_ops); > + > +/* Get the virtio device ops for the mdev device. */ > +const struct mdev_virtio_device_ops * > +mdev_get_virtio_ops(struct mdev_device *mdev) > +{ > + WARN_ON(mdev->class_id != MDEV_CLASS_ID_VIRTIO); > + return mdev->virtio_ops; > +} > +EXPORT_SYMBOL(mdev_get_virtio_ops); > + > struct device *mdev_dev(struct mdev_device *mdev) > { > return >dev; > diff --git a/drivers/vfio/mdev/mdev_private.h > b/drivers/vfio/mdev/mdev_private.h > index 411227373625..2c74dd032409 100644 > --- a/drivers/vfio/mdev/mdev_private.h > +++ b/drivers/vfio/mdev/mdev_private.h > @@ -11,6 +11,7 @@ > #define MDEV_PRIVATE_H > > #include > +#include > > int mdev_bus_register(void); > void mdev_bus_unregister(void); > @@ -38,6 +39,7 @@ struct mdev_device { > u16 class_id; > union { > const struct mdev_vfio_device_ops *vfio_ops; > + const struct mdev_virtio_device_ops *virtio_ops; > }; > }; > > diff --git a/include/linux/mdev.h b/include/linux/mdev.h > index 9e37506d1987..f3d75a60c2b5 100644 > --- a/include/linux/mdev.h > +++ b/include/linux/mdev.h > @@ -17,6 +17,7 @@ > > struct mdev_device; > struct mdev_vfio_device_ops; > +struct mdev_virtio_device_ops; > > /* > * Called by the parent device driver to set the device which represents > @@ -112,6 +113,10 @@ void mdev_set_class(struct mdev_device *mdev, u16 id); > void mdev_set_vfio_ops(struct mdev_device *mdev, > const struct mdev_vfio_device_ops *vfio_ops); > const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device > *mdev); > +void mdev_set_virtio_ops(struct mdev_device *mdev, > + const struct mdev_virtio_device_ops *virtio_ops); > +const struct mdev_virtio_device_ops * > +mdev_get_virtio_ops(struct mdev_device *mdev); > > extern struct bus_type mdev_bus_type; > > @@ -127,6 +132,7 @@ struct mdev_device *mdev_from_dev(struct device *dev); > > enum { > MDEV_CLASS_ID_VFIO = 1, > + MDEV_CLASS_ID_VIRTIO = 2, > /* New entries must be added here */ > }; > > diff --git a/include/linux/mdev_virtio_ops.h b/include/linux/mdev_virtio_ops.h > new file mode 100644 > index ..0dcae7fa31e5 > --- /dev/null > +++ b/include/linux/mdev_virtio_ops.h > @@ -0,0 +1,166 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Virtio mediated device driver > + * > + * Copyright 2019, Red Hat Corp. > + * Author: Jason Wang > + */ > +#ifndef MDEV_VIRTIO_OPS_H > +#define MDEV_VIRTIO_OPS_H > + > +#include > +#include > +#include > + > +#define VIRTIO_MDEV_DEVICE_API_STRING"virtio-mdev" > +#define VIRTIO_MDEV_F_VERSION_1 0x1 > + > +struct virtio_mdev_callback { > + irqreturn_t (*callback)(void *data); > + void *private; > +}; > + > +/** > + * struct mdev_virtio_device_ops - Structure to be registered for each > + * mdev device to register the device for virtio/vhost drivers. > + * > + * The device ops that is supported by VIRTIO_MDEV_F_VERSION_1, the > + * callbacks are mandatory unless explicity mentioned. > + * > + * @get_mdev_features: Get a set of bits that demonstrate > + * the capability of the mdev device. New > + * feature bits must be added when > + * introducing new device ops. This > + * allows the device ops to be extended > + * (one feature could have N new ops). > + * @mdev: mediated device > + * Returns the mdev features (API) support by > + * the device. I still don't see the point of
[PATCH V7 4/6] mdev: introduce virtio device and its device ops
This patch implements basic support for mdev driver that supports virtio transport for kernel virtio driver. Signed-off-by: Jason Wang --- drivers/vfio/mdev/mdev_core.c| 20 drivers/vfio/mdev/mdev_private.h | 2 + include/linux/mdev.h | 6 ++ include/linux/mdev_virtio_ops.h | 166 +++ 4 files changed, 194 insertions(+) create mode 100644 include/linux/mdev_virtio_ops.h diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 8d579d7ed82f..95ee4126ff9c 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -76,6 +76,26 @@ const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *mdev) } EXPORT_SYMBOL(mdev_get_vfio_ops); +/* Specify the virtio device ops for the mdev device, this + * must be called during create() callback for virtio mdev device. + */ +void mdev_set_virtio_ops(struct mdev_device *mdev, +const struct mdev_virtio_device_ops *virtio_ops) +{ + mdev_set_class(mdev, MDEV_CLASS_ID_VIRTIO); + mdev->virtio_ops = virtio_ops; +} +EXPORT_SYMBOL(mdev_set_virtio_ops); + +/* Get the virtio device ops for the mdev device. */ +const struct mdev_virtio_device_ops * +mdev_get_virtio_ops(struct mdev_device *mdev) +{ + WARN_ON(mdev->class_id != MDEV_CLASS_ID_VIRTIO); + return mdev->virtio_ops; +} +EXPORT_SYMBOL(mdev_get_virtio_ops); + struct device *mdev_dev(struct mdev_device *mdev) { return >dev; diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h index 411227373625..2c74dd032409 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -11,6 +11,7 @@ #define MDEV_PRIVATE_H #include +#include int mdev_bus_register(void); void mdev_bus_unregister(void); @@ -38,6 +39,7 @@ struct mdev_device { u16 class_id; union { const struct mdev_vfio_device_ops *vfio_ops; + const struct mdev_virtio_device_ops *virtio_ops; }; }; diff --git a/include/linux/mdev.h b/include/linux/mdev.h index 9e37506d1987..f3d75a60c2b5 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -17,6 +17,7 @@ struct mdev_device; struct mdev_vfio_device_ops; +struct mdev_virtio_device_ops; /* * Called by the parent device driver to set the device which represents @@ -112,6 +113,10 @@ void mdev_set_class(struct mdev_device *mdev, u16 id); void mdev_set_vfio_ops(struct mdev_device *mdev, const struct mdev_vfio_device_ops *vfio_ops); const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *mdev); +void mdev_set_virtio_ops(struct mdev_device *mdev, +const struct mdev_virtio_device_ops *virtio_ops); +const struct mdev_virtio_device_ops * +mdev_get_virtio_ops(struct mdev_device *mdev); extern struct bus_type mdev_bus_type; @@ -127,6 +132,7 @@ struct mdev_device *mdev_from_dev(struct device *dev); enum { MDEV_CLASS_ID_VFIO = 1, + MDEV_CLASS_ID_VIRTIO = 2, /* New entries must be added here */ }; diff --git a/include/linux/mdev_virtio_ops.h b/include/linux/mdev_virtio_ops.h new file mode 100644 index ..0dcae7fa31e5 --- /dev/null +++ b/include/linux/mdev_virtio_ops.h @@ -0,0 +1,166 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Virtio mediated device driver + * + * Copyright 2019, Red Hat Corp. + * Author: Jason Wang + */ +#ifndef MDEV_VIRTIO_OPS_H +#define MDEV_VIRTIO_OPS_H + +#include +#include +#include + +#define VIRTIO_MDEV_DEVICE_API_STRING "virtio-mdev" +#define VIRTIO_MDEV_F_VERSION_1 0x1 + +struct virtio_mdev_callback { + irqreturn_t (*callback)(void *data); + void *private; +}; + +/** + * struct mdev_virtio_device_ops - Structure to be registered for each + * mdev device to register the device for virtio/vhost drivers. + * + * The device ops that is supported by VIRTIO_MDEV_F_VERSION_1, the + * callbacks are mandatory unless explicity mentioned. + * + * @get_mdev_features: Get a set of bits that demonstrate + * the capability of the mdev device. New + * feature bits must be added when + * introducing new device ops. This + * allows the device ops to be extended + * (one feature could have N new ops). + * @mdev: mediated device + * Returns the mdev features (API) support by + * the device. + * @get_mdev_features: Set a set of features that will be + * used by the driver. + * @features: features used by the driver + * Returns bollean: whether the features + * is accepted by the device. + * @set_vq_address:Set the address