Message ID | 20180726195429.31960-9-borntraeger@de.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio-ap: guest dedicated crypto adapters | expand |
On Thu, 26 Jul 2018 21:54:15 +0200 Christian Borntraeger <borntraeger@de.ibm.com> wrote: > From: Tony Krowiak <akrowiak@linux.ibm.com> > > Introduces a new AP device driver. This device driver > is built on the VFIO mediated device framework. The framework > provides sysfs interfaces that facilitate passthrough > access by guests to devices installed on the linux host. > > The VFIO AP device driver will serve two purposes: > > 1. Provide the interfaces to reserve AP devices for exclusive > use by KVM guests. This is accomplished by unbinding the > devices to be reserved for guest usage from the default AP > device driver and binding them to the VFIO AP device driver. > > 2. Implements the functions, callbacks and sysfs attribute > interfaces required to create one or more VFIO mediated > devices each of which will be used to configure the AP > matrix for a guest and serve as a file descriptor > for facilitating communication between QEMU and the > VFIO AP device driver. > > When the VFIO AP device driver is initialized: > > * It registers with the AP bus for control of type 10 (CEX4 > and newer) AP queue devices. This limitation was imposed > due to: > > 1. A desire to keep the code as simple as possible; > > 2. Some older models are no longer supported by the kernel > and others are getting close to end of service. > > The probe and remove callbacks will be provided to support > the binding/unbinding of AP queue devices to/from the VFIO > AP device driver. > > * Creates a virtual misc device, /sys/devices/virtual/misc/vfio_ap, > device to serve as the parent of the mediated devices created, one > for each guest, and to hold the APQNs of the AP devices bound to > the VFIO AP device driver. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > Reviewed-by: Halil Pasic <pasic@linux.ibm.com> > Tested-by: Michael Mueller <mimu@linux.ibm.com> > Tested-by: Farhan Ali <alifm@linux.ibm.com> > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > MAINTAINERS | 10 +++ > arch/s390/Kconfig | 11 +++ > drivers/s390/crypto/Makefile | 4 + > drivers/s390/crypto/vfio_ap_drv.c | 112 ++++++++++++++++++++++++++ > drivers/s390/crypto/vfio_ap_private.h | 30 +++++++ > include/uapi/linux/vfio.h | 2 + > 6 files changed, 169 insertions(+) > create mode 100644 drivers/s390/crypto/vfio_ap_drv.c > create mode 100644 drivers/s390/crypto/vfio_ap_private.h > > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > index 1aa7b82e8169..f378b9802d8b 100644 > --- a/include/uapi/linux/vfio.h > +++ b/include/uapi/linux/vfio.h > @@ -200,6 +200,7 @@ struct vfio_device_info { > #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ > #define VFIO_DEVICE_FLAGS_AMBA (1 << 3) /* vfio-amba device */ > #define VFIO_DEVICE_FLAGS_CCW (1 << 4) /* vfio-ccw device */ > +#define VFIO_DEVICE_FLAGS_AP (1 << 5) /* vfio-ap device */ > __u32 num_regions; /* Max region index + 1 */ > __u32 num_irqs; /* Max IRQ index + 1 */ > }; > @@ -215,6 +216,7 @@ struct vfio_device_info { > #define VFIO_DEVICE_API_PLATFORM_STRING "vfio-platform" > #define VFIO_DEVICE_API_AMBA_STRING "vfio-amba" > #define VFIO_DEVICE_API_CCW_STRING "vfio-ccw" > +#define VFIO_DEVICE_API_AP_STRING "vfio-ap" > > /** > * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8, Should this hunk go into the next patch?
On 07/27/2018 11:21 AM, Cornelia Huck wrote: > On Thu, 26 Jul 2018 21:54:15 +0200 > Christian Borntraeger <borntraeger@de.ibm.com> wrote: > >> From: Tony Krowiak <akrowiak@linux.ibm.com> >> >> Introduces a new AP device driver. This device driver >> is built on the VFIO mediated device framework. The framework >> provides sysfs interfaces that facilitate passthrough >> access by guests to devices installed on the linux host. >> >> The VFIO AP device driver will serve two purposes: >> >> 1. Provide the interfaces to reserve AP devices for exclusive >> use by KVM guests. This is accomplished by unbinding the >> devices to be reserved for guest usage from the default AP >> device driver and binding them to the VFIO AP device driver. >> >> 2. Implements the functions, callbacks and sysfs attribute >> interfaces required to create one or more VFIO mediated >> devices each of which will be used to configure the AP >> matrix for a guest and serve as a file descriptor >> for facilitating communication between QEMU and the >> VFIO AP device driver. >> >> When the VFIO AP device driver is initialized: >> >> * It registers with the AP bus for control of type 10 (CEX4 >> and newer) AP queue devices. This limitation was imposed >> due to: >> >> 1. A desire to keep the code as simple as possible; >> >> 2. Some older models are no longer supported by the kernel >> and others are getting close to end of service. >> >> The probe and remove callbacks will be provided to support >> the binding/unbinding of AP queue devices to/from the VFIO >> AP device driver. >> >> * Creates a virtual misc device, /sys/devices/virtual/misc/vfio_ap, >> device to serve as the parent of the mediated devices created, one >> for each guest, and to hold the APQNs of the AP devices bound to >> the VFIO AP device driver. >> >> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >> Reviewed-by: Halil Pasic <pasic@linux.ibm.com> >> Tested-by: Michael Mueller <mimu@linux.ibm.com> >> Tested-by: Farhan Ali <alifm@linux.ibm.com> >> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> >> --- >> MAINTAINERS | 10 +++ >> arch/s390/Kconfig | 11 +++ >> drivers/s390/crypto/Makefile | 4 + >> drivers/s390/crypto/vfio_ap_drv.c | 112 ++++++++++++++++++++++++++ >> drivers/s390/crypto/vfio_ap_private.h | 30 +++++++ >> include/uapi/linux/vfio.h | 2 + >> 6 files changed, 169 insertions(+) >> create mode 100644 drivers/s390/crypto/vfio_ap_drv.c >> create mode 100644 drivers/s390/crypto/vfio_ap_private.h >> > >> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h >> index 1aa7b82e8169..f378b9802d8b 100644 >> --- a/include/uapi/linux/vfio.h >> +++ b/include/uapi/linux/vfio.h >> @@ -200,6 +200,7 @@ struct vfio_device_info { >> #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ >> #define VFIO_DEVICE_FLAGS_AMBA (1 << 3) /* vfio-amba device */ >> #define VFIO_DEVICE_FLAGS_CCW (1 << 4) /* vfio-ccw device */ >> +#define VFIO_DEVICE_FLAGS_AP (1 << 5) /* vfio-ap device */ And this one is also unused for now I guess. >> __u32 num_regions; /* Max region index + 1 */ >> __u32 num_irqs; /* Max IRQ index + 1 */ >> }; >> @@ -215,6 +216,7 @@ struct vfio_device_info { >> #define VFIO_DEVICE_API_PLATFORM_STRING "vfio-platform" >> #define VFIO_DEVICE_API_AMBA_STRING "vfio-amba" >> #define VFIO_DEVICE_API_CCW_STRING "vfio-ccw" >> +#define VFIO_DEVICE_API_AP_STRING "vfio-ap" >> >> /** >> * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8, > > Should this hunk go into the next patch? > Yes.
diff --git a/MAINTAINERS b/MAINTAINERS index 0fe4228f78cb..035bf608186c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -12416,6 +12416,16 @@ W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported F: drivers/s390/crypto/ +S390 VFIO AP DRIVER +M: Tony Krowiak <akrowiak@linux.ibm.com> +M: Pierre Morel <pmorel@linux.ibm.com> +M: Halil Pasic <pasic@linux.ibm.com> +L: linux-s390@vger.kernel.org +W: http://www.ibm.com/developerworks/linux/linux390/ +S: Supported +F: drivers/s390/crypto/vfio_ap_drv.c +F: drivers/s390/crypto/vfio_ap_private.h + S390 ZFCP DRIVER M: Steffen Maier <maier@linux.ibm.com> M: Benjamin Block <bblock@linux.ibm.com> diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 8a1863d9ed53..35e9640d35b9 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -779,6 +779,17 @@ config VFIO_CCW To compile this driver as a module, choose M here: the module will be called vfio_ccw. +config VFIO_AP + def_tristate n + prompt "VFIO support for AP devices" + depends on ZCRYPT && VFIO_MDEV_DEVICE && KVM + help + This driver grants access to Adjunct Processor (AP) devices + via the VFIO mediated device interface. + + To compile this driver as a module, choose M here: the module + will be called vfio_ap. + endmenu menu "Dump support" diff --git a/drivers/s390/crypto/Makefile b/drivers/s390/crypto/Makefile index b59af548ed1c..48e466eb19cf 100644 --- a/drivers/s390/crypto/Makefile +++ b/drivers/s390/crypto/Makefile @@ -15,3 +15,7 @@ obj-$(CONFIG_ZCRYPT) += zcrypt_pcixcc.o zcrypt_cex2a.o zcrypt_cex4.o # pkey kernel module pkey-objs := pkey_api.o obj-$(CONFIG_PKEY) += pkey.o + +# adjunct processor matrix +vfio_ap-objs := vfio_ap_drv.o +obj-$(CONFIG_VFIO_AP) += vfio_ap.o diff --git a/drivers/s390/crypto/vfio_ap_drv.c b/drivers/s390/crypto/vfio_ap_drv.c new file mode 100644 index 000000000000..ff2b05d2aef1 --- /dev/null +++ b/drivers/s390/crypto/vfio_ap_drv.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * VFIO based AP device driver + * + * Copyright IBM Corp. 2018 + */ + +#include <linux/module.h> +#include <linux/mod_devicetable.h> +#include <linux/slab.h> +#include <linux/string.h> +#include "vfio_ap_private.h" + +#define VFIO_AP_ROOT_NAME "vfio_ap" +#define VFIO_AP_DEV_TYPE_NAME "ap_matrix" +#define VFIO_AP_DEV_NAME "vfio_ap" + +MODULE_AUTHOR("IBM Corporation"); +MODULE_DESCRIPTION("VFIO AP device driver, Copyright IBM Corp. 2018"); +MODULE_LICENSE("GPL v2"); + +static struct ap_driver vfio_ap_drv; + +static struct device_type vfio_ap_dev_type = { + .name = VFIO_AP_DEV_TYPE_NAME, +}; + +struct ap_matrix_dev matrix_dev = { + /* + * We may add some fops later to implement a more program friendly + * management interface for vfio_ap_mdev devices. + */ + .misc_dev = { + MISC_DYNAMIC_MINOR, + VFIO_AP_DEV_NAME, + } +}; + +/* Only type 10 adapters (CEX4 and later) are supported + * by the AP matrix device driver + */ +static struct ap_device_id ap_queue_ids[] = { + { .dev_type = AP_DEVICE_TYPE_CEX4, + .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, + { .dev_type = AP_DEVICE_TYPE_CEX5, + .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, + { .dev_type = AP_DEVICE_TYPE_CEX6, + .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, + { /* end of sibling */ }, +}; + +MODULE_DEVICE_TABLE(vfio_ap, ap_queue_ids); + +static int vfio_ap_queue_dev_probe(struct ap_device *apdev) +{ + return 0; +} + +static void vfio_ap_queue_dev_remove(struct ap_device *apdev) +{ + /* Nothing to do yet */ +} + +static int vfio_ap_matrix_dev_create(void) +{ + int ret; + + ret = misc_register(&matrix_dev.misc_dev); + if (ret) + return ret; + + to_device(&matrix_dev)->type = &vfio_ap_dev_type; + to_device(&matrix_dev)->driver = &vfio_ap_drv.driver; + + return ret; +} + +static void vfio_ap_matrix_dev_destroy(void) +{ + misc_deregister(&matrix_dev.misc_dev); +} + +int __init vfio_ap_init(void) +{ + int ret; + + ret = vfio_ap_matrix_dev_create(); + if (ret) + return ret; + + memset(&vfio_ap_drv, 0, sizeof(vfio_ap_drv)); + vfio_ap_drv.probe = vfio_ap_queue_dev_probe; + vfio_ap_drv.remove = vfio_ap_queue_dev_remove; + vfio_ap_drv.ids = ap_queue_ids; + + ret = ap_driver_register(&vfio_ap_drv, THIS_MODULE, VFIO_AP_DRV_NAME); + if (ret) { + vfio_ap_matrix_dev_destroy(); + return ret; + } + + return 0; +} + +void __exit vfio_ap_exit(void) +{ + ap_driver_unregister(&vfio_ap_drv); + vfio_ap_matrix_dev_destroy(); +} + +module_init(vfio_ap_init); +module_exit(vfio_ap_exit); diff --git a/drivers/s390/crypto/vfio_ap_private.h b/drivers/s390/crypto/vfio_ap_private.h new file mode 100644 index 000000000000..02c878cbd011 --- /dev/null +++ b/drivers/s390/crypto/vfio_ap_private.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Private data and functions for adjunct processor VFIO matrix driver. + * + * Copyright IBM Corp. 2018 + */ + +#ifndef _VFIO_AP_PRIVATE_H_ +#define _VFIO_AP_PRIVATE_H_ + +#include <linux/types.h> +#include <linux/miscdevice.h> + +#include "ap_bus.h" + +#define VFIO_AP_MODULE_NAME "vfio_ap" +#define VFIO_AP_DRV_NAME "vfio_ap" + +struct ap_matrix_dev { + struct miscdevice misc_dev; +}; + +extern struct ap_matrix_dev matrix_dev; + +static inline struct device *to_device(struct ap_matrix_dev *matrix_dev) +{ + return matrix_dev->misc_dev.this_device; +} + +#endif /* _VFIO_AP_PRIVATE_H_ */ diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 1aa7b82e8169..f378b9802d8b 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -200,6 +200,7 @@ struct vfio_device_info { #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2) /* vfio-platform device */ #define VFIO_DEVICE_FLAGS_AMBA (1 << 3) /* vfio-amba device */ #define VFIO_DEVICE_FLAGS_CCW (1 << 4) /* vfio-ccw device */ +#define VFIO_DEVICE_FLAGS_AP (1 << 5) /* vfio-ap device */ __u32 num_regions; /* Max region index + 1 */ __u32 num_irqs; /* Max IRQ index + 1 */ }; @@ -215,6 +216,7 @@ struct vfio_device_info { #define VFIO_DEVICE_API_PLATFORM_STRING "vfio-platform" #define VFIO_DEVICE_API_AMBA_STRING "vfio-amba" #define VFIO_DEVICE_API_CCW_STRING "vfio-ccw" +#define VFIO_DEVICE_API_AP_STRING "vfio-ap" /** * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8,