From 722bc5b5d901eafb96e8530cc7cf3036bff398a4 Mon Sep 17 00:00:00 2001 From: Anastasiia Lukianenko Date: Thu, 6 Aug 2020 12:42:55 +0300 Subject: xen: pvblock: Add initial support for para-virtualized block driver Add initial infrastructure for Xen para-virtualized block device. This includes compile-time configuration and the skeleton for the future driver implementation. Add new class UCLASS_PVBLOCK which is going to be a parent for virtual block devices. Add new interface type IF_TYPE_PVBLOCK. Implement basic driver setup by reading XenStore configuration. Signed-off-by: Andrii Anisov Signed-off-by: Anastasiia Lukianenko Signed-off-by: Oleksandr Andrushchenko --- drivers/xen/Kconfig | 10 +++++ drivers/xen/Makefile | 2 + drivers/xen/pvblock.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 drivers/xen/Kconfig create mode 100644 drivers/xen/pvblock.c (limited to 'drivers/xen') diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig new file mode 100644 index 00000000000..6ad2a936682 --- /dev/null +++ b/drivers/xen/Kconfig @@ -0,0 +1,10 @@ +config PVBLOCK + bool "Xen para-virtualized block device" + depends on DM + select BLK + select HAVE_BLOCK_DEVICE + help + This driver implements the front-end of the Xen virtual + block device driver. It communicates with a back-end driver + in another domain which drives the actual block device. + diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index 243b13277ac..87157df69b8 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile @@ -6,3 +6,5 @@ obj-y += hypervisor.o obj-y += events.o obj-y += xenbus.o obj-y += gnttab.o + +obj-$(CONFIG_PVBLOCK) += pvblock.o diff --git a/drivers/xen/pvblock.c b/drivers/xen/pvblock.c new file mode 100644 index 00000000000..d2b616bb63b --- /dev/null +++ b/drivers/xen/pvblock.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2020 EPAM Systems Inc. + */ +#include +#include +#include +#include + +#define DRV_NAME "pvblock" +#define DRV_NAME_BLK "pvblock_blk" + +struct blkfront_dev { + char dummy; +}; + +static int init_blkfront(unsigned int devid, struct blkfront_dev *dev) +{ + return 0; +} + +static void shutdown_blkfront(struct blkfront_dev *dev) +{ +} + +ulong pvblock_blk_read(struct udevice *udev, lbaint_t blknr, lbaint_t blkcnt, + void *buffer) +{ + return 0; +} + +ulong pvblock_blk_write(struct udevice *udev, lbaint_t blknr, lbaint_t blkcnt, + const void *buffer) +{ + return 0; +} + +static int pvblock_blk_bind(struct udevice *udev) +{ + return 0; +} + +static int pvblock_blk_probe(struct udevice *udev) +{ + struct blkfront_dev *blk_dev = dev_get_priv(udev); + int ret; + + ret = init_blkfront(0, blk_dev); + if (ret < 0) + return ret; + return 0; +} + +static int pvblock_blk_remove(struct udevice *udev) +{ + struct blkfront_dev *blk_dev = dev_get_priv(udev); + + shutdown_blkfront(blk_dev); + return 0; +} + +static const struct blk_ops pvblock_blk_ops = { + .read = pvblock_blk_read, + .write = pvblock_blk_write, +}; + +U_BOOT_DRIVER(pvblock_blk) = { + .name = DRV_NAME_BLK, + .id = UCLASS_BLK, + .ops = &pvblock_blk_ops, + .bind = pvblock_blk_bind, + .probe = pvblock_blk_probe, + .remove = pvblock_blk_remove, + .priv_auto_alloc_size = sizeof(struct blkfront_dev), + .flags = DM_FLAG_OS_PREPARE, +}; + +/******************************************************************************* + * Para-virtual block device class + *******************************************************************************/ + +void pvblock_init(void) +{ + struct driver_info info; + struct udevice *udev; + struct uclass *uc; + int ret; + + /* + * At this point Xen drivers have already initialized, + * so we can instantiate the class driver and enumerate + * virtual block devices. + */ + info.name = DRV_NAME; + ret = device_bind_by_name(gd->dm_root, false, &info, &udev); + if (ret < 0) + printf("Failed to bind " DRV_NAME ", ret: %d\n", ret); + + /* Bootstrap virtual block devices class driver */ + ret = uclass_get(UCLASS_PVBLOCK, &uc); + if (ret) + return; + uclass_foreach_dev_probe(UCLASS_PVBLOCK, udev); +} + +static int pvblock_probe(struct udevice *udev) +{ + return 0; +} + +U_BOOT_DRIVER(pvblock_drv) = { + .name = DRV_NAME, + .id = UCLASS_PVBLOCK, + .probe = pvblock_probe, +}; + +UCLASS_DRIVER(pvblock) = { + .name = DRV_NAME, + .id = UCLASS_PVBLOCK, +}; -- cgit v1.2.3