-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Signed-off-by: Anastasiia Lukianenko <[email protected]> Signed-off-by: Oleksandr Andrushchenko <[email protected]>
- Loading branch information
Showing
15 changed files
with
223 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* (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'"); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* (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, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
/* SPDX-License-Identifier: GPL-2.0+ | ||
* | ||
* (C) 2020 EPAM Systems Inc. | ||
*/ | ||
|
||
#ifndef _PVBLOCK_H | ||
#define _PVBLOCK_H | ||
|
||
/** | ||
* pvblock_init() - Initialize para-virtual block device class driver | ||
* | ||
* Bind PV block to UCLASS_ROOT device and probe all UCLASS_PVBLOCK | ||
* virtual block devices. | ||
*/ | ||
void pvblock_init(void); | ||
|
||
#endif /* _PVBLOCK_H */ |