
On 7/1/20 6:29 PM, Anastasiia Lukianenko wrote:
From: Anastasiia Lukianenko anastasiia_lukianenko@epam.com
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.
We already have virtual block devices: virtio_blk, efi_blk.
They work fine using the exising UCLASS_BLK. Why do we need a new uclass?
Add new interface type IF_TYPE_PVBLOCK.
Implement basic driver setup by reading XenStore configuration.
Signed-off-by: Andrii Anisov andrii_anisov@epam.com Signed-off-by: Anastasiia Lukianenko anastasiia_lukianenko@epam.com Signed-off-by: Oleksandr Andrushchenko oleksandr_andrushchenko@epam.com
cmd/Kconfig | 7 ++ cmd/Makefile | 1 + cmd/pvblock.c | 31 ++++++++ common/board_r.c | 14 ++++ configs/xenguest_arm64_defconfig | 4 + disk/part.c | 4 + drivers/Kconfig | 2 + drivers/block/blk-uclass.c | 2 + drivers/xen/Kconfig | 10 +++ drivers/xen/Makefile | 2 + drivers/xen/pvblock.c | 121 +++++++++++++++++++++++++++++++ include/blk.h | 1 + include/configs/xenguest_arm64.h | 8 ++ include/dm/uclass-id.h | 1 + include/pvblock.h | 12 +++ 15 files changed, 220 insertions(+) create mode 100644 cmd/pvblock.c create mode 100644 drivers/xen/Kconfig create mode 100644 drivers/xen/pvblock.c create mode 100644 include/pvblock.h
diff --git a/cmd/Kconfig b/cmd/Kconfig index 192b3b262f..f28576947b 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1335,6 +1335,13 @@ config CMD_USB_MASS_STORAGE help USB mass storage support
+config CMD_PVBLOCK
- bool "Xen para-virtualized block device"
- depends on XEN
- select PVBLOCK
- help
Xen para-virtualized block device support
config CMD_VIRTIO bool "virtio" depends on VIRTIO diff --git a/cmd/Makefile b/cmd/Makefile index 974ad48b0a..117284a28c 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -169,6 +169,7 @@ obj-$(CONFIG_CMD_DFU) += dfu.o obj-$(CONFIG_CMD_GPT) += gpt.o obj-$(CONFIG_CMD_ETHSW) += ethsw.o obj-$(CONFIG_CMD_AXI) += axi.o +obj-$(CONFIG_CMD_PVBLOCK) += pvblock.o
# Power obj-$(CONFIG_CMD_PMIC) += pmic.o diff --git a/cmd/pvblock.c b/cmd/pvblock.c new file mode 100644 index 0000000000..7dbb243a74 --- /dev/null +++ b/cmd/pvblock.c @@ -0,0 +1,31 @@ +/*
- SPDX-License-Identifier: GPL-2.0+
Please, correct the formatting.
https://www.kernel.org/doc/html/latest/process/license-rules.html#license-id...
- (C) Copyright 2020 EPAM Systems Inc.
- XEN para-virtualized block device support
- */
+#include <blk.h> +#include <common.h> +#include <command.h>
+/* Current I/O Device */ +static int pvblock_curr_device;
+int do_pvblock(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{
- return blk_common_cmd(argc, argv, IF_TYPE_PVBLOCK,
&pvblock_curr_device);
+}
+U_BOOT_CMD(pvblock, 5, 1, do_pvblock,
"Xen para-virtualized block device",
"info - show available block devices\n"
"pvblock device [dev] - show or set current device\n"
"pvblock part [dev] - print partition table of one or all devices\n"
"pvblock read addr blk# cnt\n"
"pvblock write addr blk# cnt - read/write `cnt'"
" blocks starting at block `blk#'\n"
" to/from memory address `addr'");
diff --git a/common/board_r.c b/common/board_r.c index fd36edb4e5..40cd0e5d3c 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -49,6 +49,7 @@ #include <nand.h> #include <of_live.h> #include <onenand_uboot.h> +#include <pvblock.h> #include <scsi.h> #include <serial.h> #include <status_led.h> @@ -470,6 +471,16 @@ static int initr_xen(void) return 0; } #endif
+#ifdef CONFIG_PVBLOCK +static int initr_pvblock(void) +{
- puts("PVBLOCK: ");
- pvblock_init();
- return 0;
+} +#endif
/*
- Tell if it's OK to load the environment early in boot.
@@ -780,6 +791,9 @@ static init_fnc_t init_sequence_r[] = { #endif #ifdef CONFIG_XEN initr_xen, +#endif +#ifdef CONFIG_PVBLOCK
- initr_pvblock,
#endif initr_env, #ifdef CONFIG_SYS_BOOTPARAMS_LEN diff --git a/configs/xenguest_arm64_defconfig b/configs/xenguest_arm64_defconfig index 45559a161b..46473c251d 100644 --- a/configs/xenguest_arm64_defconfig +++ b/configs/xenguest_arm64_defconfig @@ -14,6 +14,8 @@ CONFIG_CMD_BOOTD=n CONFIG_CMD_BOOTEFI=n CONFIG_CMD_BOOTEFI_HELLO_COMPILE=n CONFIG_CMD_ELF=n +CONFIG_CMD_EXT4=y +CONFIG_CMD_FAT=y CONFIG_CMD_GO=n CONFIG_CMD_RUN=n CONFIG_CMD_IMI=n @@ -41,6 +43,8 @@ CONFIG_CMD_LZMADEC=n CONFIG_CMD_SAVEENV=n CONFIG_CMD_UMS=n
+CONFIG_CMD_PVBLOCK=y
#CONFIG_USB=n # CONFIG_ISO_PARTITION is not set
diff --git a/disk/part.c b/disk/part.c index f6a31025dc..b69fd345f3 100644 --- a/disk/part.c +++ b/disk/part.c @@ -149,6 +149,7 @@ void dev_print (struct blk_desc *dev_desc) case IF_TYPE_MMC: case IF_TYPE_USB: case IF_TYPE_NVME:
- case IF_TYPE_PVBLOCK: printf ("Vendor: %s Rev: %s Prod: %s\n", dev_desc->vendor, dev_desc->revision,
@@ -288,6 +289,9 @@ static void print_part_header(const char *type, struct blk_desc *dev_desc) case IF_TYPE_NVME: puts ("NVMe"); break;
- case IF_TYPE_PVBLOCK:
puts("PV BLOCK");
case IF_TYPE_VIRTIO: puts("VirtIO"); break;break;
diff --git a/drivers/Kconfig b/drivers/Kconfig index e34a22708c..65076aab03 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -132,6 +132,8 @@ source "drivers/w1-eeprom/Kconfig"
source "drivers/watchdog/Kconfig"
+source "drivers/xen/Kconfig"
config PHYS_TO_BUS bool "Custom physical to bus address mapping" help diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c index b19375cbc8..6cfabbca24 100644 --- a/drivers/block/blk-uclass.c +++ b/drivers/block/blk-uclass.c @@ -28,6 +28,7 @@ static const char *if_typename_str[IF_TYPE_COUNT] = { [IF_TYPE_NVME] = "nvme", [IF_TYPE_EFI] = "efi", [IF_TYPE_VIRTIO] = "virtio",
- [IF_TYPE_PVBLOCK] = "pvblock",
};
static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = { @@ -43,6 +44,7 @@ static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = { [IF_TYPE_NVME] = UCLASS_NVME, [IF_TYPE_EFI] = UCLASS_EFI, [IF_TYPE_VIRTIO] = UCLASS_VIRTIO,
- [IF_TYPE_PVBLOCK] = UCLASS_PVBLOCK,
};
static enum if_type if_typename_to_iftype(const char *if_typename) diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig new file mode 100644 index 0000000000..6ad2a93668 --- /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 243b13277a..87157df69b 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 0000000000..057add9753 --- /dev/null +++ b/drivers/xen/pvblock.c @@ -0,0 +1,121 @@ +/*
- SPDX-License-Identifier: GPL-2.0+
See above.
- (C) Copyright 2020 EPAM Systems Inc.
- */
+#include <blk.h> +#include <common.h> +#include <dm.h> +#include <dm/device-internal.h>
+#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,
+}; diff --git a/include/blk.h b/include/blk.h index abcd4bedbb..9ee10fb80e 100644 --- a/include/blk.h +++ b/include/blk.h @@ -33,6 +33,7 @@ enum if_type { IF_TYPE_HOST, IF_TYPE_NVME, IF_TYPE_EFI,
IF_TYPE_PVBLOCK, IF_TYPE_VIRTIO,
IF_TYPE_COUNT, /* Number of interface types */
diff --git a/include/configs/xenguest_arm64.h b/include/configs/xenguest_arm64.h index 467dabf1e5..2c0d3d64fb 100644 --- a/include/configs/xenguest_arm64.h +++ b/include/configs/xenguest_arm64.h @@ -42,4 +42,12 @@ #define CONFIG_CMDLINE_TAG 1 #define CONFIG_INITRD_TAG 1
+#define CONFIG_CMD_RUN
+#undef CONFIG_EXTRA_ENV_SETTINGS +#define CONFIG_EXTRA_ENV_SETTINGS \
- "loadimage=ext4load pvblock 0 0x90000000 /boot/Image;\0" \
- "pvblockboot=run loadimage;" \
"booti 0x90000000 - 0x88000000;\0"
#endif /* __XENGUEST_ARM64_H */ diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 7837d459f1..4bf7501204 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -121,6 +121,7 @@ enum uclass_id { UCLASS_W1, /* Dallas 1-Wire bus */ UCLASS_W1_EEPROM, /* one-wire EEPROMs */ UCLASS_WDT, /* Watchdog Timer driver */
UCLASS_PVBLOCK, /* Xen virtual block device */
UCLASS_COUNT, UCLASS_INVALID = -1,
diff --git a/include/pvblock.h b/include/pvblock.h new file mode 100644 index 0000000000..e3bb8ff9a7 --- /dev/null +++ b/include/pvblock.h @@ -0,0 +1,12 @@ +/*
- SPDX-License-Identifier: GPL-2.0+
See above.
scripts/checkpatch.pl is your friend.
- (C) 2020 EPAM Systems Inc.
- */
+#ifndef _PVBLOCK_H +#define _PVBLOCK_H
Document you functions as described in
https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html#function-do...
Include the documentation in the HTML documentation generated by
make htmldocs.
Best regards
Heinrich
+void pvblock_init(void);
+#endif /* _PVBLOCK_H */