summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2021-07-06 01:32:59 +0300
committerSimon Glass <sjg@chromium.org>2021-07-21 19:27:35 +0300
commit96f37b092fdbb604e43c313265995d72ff1a82fe (patch)
tree45bb72df5da51250ee48c59efe11c9369bb418e2 /drivers
parent6b165ab2b7b1dc89357afbe86c1977addf5aed3b (diff)
downloadu-boot-96f37b092fdbb604e43c313265995d72ff1a82fe.tar.xz
blk: Support iteration
It is useful to be able to iterate over block devices. Typically there are fixed and removable devices. For security reasons it is sometimes useful to ignore removable devices since they are under user control. Add iterators which support selecting the block-device type. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/blk-uclass.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
index dfc0d46970..83682dcc18 100644
--- a/drivers/block/blk-uclass.c
+++ b/drivers/block/blk-uclass.c
@@ -540,6 +540,55 @@ int blk_next_free_devnum(enum if_type if_type)
return ret + 1;
}
+static int blk_flags_check(struct udevice *dev, enum blk_flag_t req_flags)
+{
+ const struct blk_desc *desc = dev_get_uclass_plat(dev);
+ enum blk_flag_t flags;
+
+ flags = desc->removable ? BLKF_REMOVABLE : BLKF_FIXED;
+
+ return flags & req_flags ? 0 : 1;
+}
+
+int blk_first_device_err(enum blk_flag_t flags, struct udevice **devp)
+{
+ int ret;
+
+ for (ret = uclass_first_device_err(UCLASS_BLK, devp);
+ !ret;
+ ret = uclass_next_device_err(devp)) {
+ if (!blk_flags_check(*devp, flags))
+ return 0;
+ }
+
+ return -ENODEV;
+}
+
+int blk_next_device_err(enum blk_flag_t flags, struct udevice **devp)
+{
+ int ret;
+
+ for (ret = uclass_next_device_err(devp);
+ !ret;
+ ret = uclass_next_device_err(devp)) {
+ if (!blk_flags_check(*devp, flags))
+ return 0;
+ }
+
+ return -ENODEV;
+}
+
+int blk_count_devices(enum blk_flag_t flag)
+{
+ struct udevice *dev;
+ int count = 0;
+
+ blk_foreach_probe(flag, dev)
+ count++;
+
+ return count;
+}
+
static int blk_claim_devnum(enum if_type if_type, int devnum)
{
struct udevice *dev;