On Tue, Feb 08, 2022 at 10:29:31AM +0100, Michael Olbrich wrote: > On Mon, Feb 07, 2022 at 10:49:53AM +0100, Sascha Hauer wrote: > > This adds a driver which matches to a "barebox,storage-by-uuid" > > compatible node. The driver looks for a storage device matching the > > given UUID and when found registers a new cdev for the device. > > > > This driver solved a very specific problem. On EFI the storage devices > > are not connected to any device tree node. barebox-state however expects > > a node to use as its backend. The obvious solution would be to create > > a partition with a specific partuuid and use that for state, in our > > special usecase though the storage device is partitioned with a MBR > > which doesn't have any space left to create a new partition. As this > > driver parses the of partition binding we can use that to create > > a partition in an unallocated are of the disk which is then used for > > state. > > > > This driver has the problem that it depends on storage devices which > > are not described in the device tree. This means it cannot work with > > deep probe. This is not a problem on EFI though. It's a special purpose > > driver, it's not recommended for general use. > > > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > > --- > > drivers/misc/Kconfig | 23 ++++ > > drivers/misc/Makefile | 1 + > > drivers/misc/storage-by-uuid.c | 199 +++++++++++++++++++++++++++++++++ > > 3 files changed, 223 insertions(+) > > create mode 100644 drivers/misc/storage-by-uuid.c > > > > diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig > > index 5ab0506cd9..78c9c193d8 100644 > > --- a/drivers/misc/Kconfig > > +++ b/drivers/misc/Kconfig > > @@ -47,4 +47,27 @@ config STARFIVE_PWRSEQ > > be accessed over /dev/mem or used from kernels which still depend > > on bootloader for initialization. > > > > +config STORAGE_BY_UUID > > + bool "storage by UUID" > > + depends on OFDEVICE > > + help > > + This adds a driver which matches to a "barebox,storage-by-uuid" > > + compatible node. The driver looks for a storage device matching the > > + given UUID and when found registers a new cdev for the device. > > + > > + This driver solved a very specific problem. On EFI the storage devices > > + are not connected to any device tree node. barebox-state however expects > > + a node to use as its backend. The obvious solution would be to create > > + a partition with a specific partuuid and use that for state, in our > > + special usecase though the storage device is partitioned with a MBR > > + which doesn't have any space left to create a new partition. As this > > + driver parses the of partition binding we can use that to create > > + a partition in an unallocated are of the disk which is then used for > > + state. > > + > > + This driver has the problem that it depends on storage devices which > > + are not described in the device tree. This means it cannot work with > > + deep probe. This is not a problem on EFI though. It's a special purpose > > + driver, it's not recommended for general use. > > + > > endmenu > > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile > > index 6326e784fc..986f7b1b38 100644 > > --- a/drivers/misc/Makefile > > +++ b/drivers/misc/Makefile > > @@ -9,3 +9,4 @@ obj-$(CONFIG_STATE_DRV) += state.o > > obj-$(CONFIG_DEV_MEM) += mem.o > > obj-$(CONFIG_UBOOTVAR) += ubootvar.o > > obj-$(CONFIG_STARFIVE_PWRSEQ) += starfive-pwrseq.o > > +obj-$(CONFIG_STORAGE_BY_UUID) += storage-by-uuid.o > > diff --git a/drivers/misc/storage-by-uuid.c b/drivers/misc/storage-by-uuid.c > > new file mode 100644 > > index 0000000000..c9dd6e9793 > > --- /dev/null > > +++ b/drivers/misc/storage-by-uuid.c > > @@ -0,0 +1,199 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +#include <common.h> > > +#include <init.h> > > +#include <io.h> > > +#include <of.h> > > +#include <malloc.h> > > +#include <partition.h> > > +#include <envfs.h> > > +#include <fs.h> > > + > > +static LIST_HEAD(sbu_list); > > + > > +struct sbu { > > + char *uuid; > > + struct device_d *dev; > > + struct cdev *rcdev; > > + struct cdev cdev; > > + struct list_head list; > > +}; > > + > > +void storage_by_uuid_check_exist(struct cdev *cdev); > > + > > +static ssize_t sbu_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_read(sbu->rcdev, buf, count, offset, flags); > > +} > > + > > +static ssize_t sbu_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_write(sbu->rcdev, buf, count, offset, flags); > > +} > > + > > +static int sbu_ioctl(struct cdev *cdev, int request, void *buf) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_ioctl(sbu->rcdev, request, buf); > > +} > > + > > +static int sbu_open(struct cdev *cdev, unsigned long flags) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_open(sbu->rcdev, flags); > > +} > > + > > +static int sbu_close(struct cdev *cdev) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + cdev_close(sbu->rcdev); > > + > > + return 0; > > +} > > + > > +static int sbu_flush(struct cdev *cdev) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_flush(sbu->rcdev); > > +} > > + > > +static int sbu_erase(struct cdev *cdev, loff_t count, loff_t offset) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_erase(sbu->rcdev, count, offset); > > +} > > + > > +static int sbu_protect(struct cdev *cdev, size_t count, loff_t offset, int prot) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_protect(sbu->rcdev, count, offset, prot); > > +} > > + > > +static int sbu_discard_range(struct cdev *cdev, loff_t count, loff_t offset) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_discard_range(sbu->rcdev, count, offset); > > +} > > + > > +static int sbu_memmap(struct cdev *cdev, void **map, int flags) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_memmap(sbu->rcdev, map, flags); > > +} > > + > > +static int sbu_truncate(struct cdev *cdev, size_t size) > > +{ > > + struct sbu *sbu = cdev->priv; > > + > > + return cdev_truncate(sbu->rcdev, size); > > +} > > + > > +static struct cdev_operations sbu_ops = { > > + .read = sbu_read, > > + .write = sbu_write, > > + .ioctl = sbu_ioctl, > > + .open = sbu_open, > > + .close = sbu_close, > > + .flush = sbu_flush, > > + .erase = sbu_erase, > > + .protect = sbu_protect, > > + .discard_range = sbu_discard_range, > > + .memmap = sbu_memmap, > > + .truncate = sbu_truncate, > > Should be indented with tabs, right? Right, fixed that. Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox