All of lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: xypron.glpk@gmx.de, agraf@csgraf.de, sjg@chromium.org,
	ilias.apalodimas@linaro.org
Cc: masami.hiramatsu@linaro.org, u-boot@lists.denx.de,
	AKASHI Takahiro <takahiro.akashi@linaro.org>
Subject: [RFC v2 13/20] dm: disk: add UCLASS_PARTITION
Date: Fri, 10 Dec 2021 15:49:40 +0900	[thread overview]
Message-ID: <20211210064947.73361-14-takahiro.akashi@linaro.org> (raw)
In-Reply-To: <20211210064947.73361-1-takahiro.akashi@linaro.org>

With this new function, UCLASS_PARTITION devices will be created as
child nodes of UCLASS_BLK device.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
 disk/Makefile          |   3 +
 disk/disk-uclass.c     | 153 +++++++++++++++++++++++++++++++++++++++++
 include/dm/uclass-id.h |   1 +
 include/part.h         |  11 +++
 4 files changed, 168 insertions(+)
 create mode 100644 disk/disk-uclass.c

diff --git a/disk/Makefile b/disk/Makefile
index 6ce5a687b36c..ec37b74f5f40 100644
--- a/disk/Makefile
+++ b/disk/Makefile
@@ -6,6 +6,9 @@
 #ccflags-y += -DET_DEBUG -DDEBUG
 
 obj-$(CONFIG_PARTITIONS)	+= part.o
+ifdef CONFIG_$(SPL_)BLK
+obj-$(CONFIG_PARTITIONS) 	+= disk-uclass.o
+endif
 obj-$(CONFIG_$(SPL_)MAC_PARTITION)   += part_mac.o
 obj-$(CONFIG_$(SPL_)DOS_PARTITION)   += part_dos.o
 obj-$(CONFIG_$(SPL_)ISO_PARTITION)   += part_iso.o
diff --git a/disk/disk-uclass.c b/disk/disk-uclass.c
new file mode 100644
index 000000000000..4918a2f72d1e
--- /dev/null
+++ b/disk/disk-uclass.c
@@ -0,0 +1,153 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Software partition device (UCLASS_PARTITION)
+ *
+ *  Copyright (c) 2021 Linaro Limited
+ *			Author: AKASHI Takahiro
+ */
+
+#define LOG_CATEGORY UCLASS_PARTITION
+
+#include <blk.h>
+#include <dm.h>
+#include <log.h>
+#include <part.h>
+#include <vsprintf.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+
+int part_create_block_devices(struct udevice *blk_dev)
+{
+	int part, count;
+	struct blk_desc *desc = dev_get_uclass_plat(blk_dev);
+	struct disk_partition info;
+	struct disk_part *part_data;
+	char devname[32];
+	struct udevice *dev;
+	int ret;
+
+	if (!CONFIG_IS_ENABLED(PARTITIONS) ||
+	    !CONFIG_IS_ENABLED(HAVE_BLOCK_DEVICE))
+		return 0;
+
+	if (device_get_uclass_id(blk_dev) != UCLASS_BLK)
+		return 0;
+
+	/* Add devices for each partition */
+	for (count = 0, part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
+		if (part_get_info(desc, part, &info))
+			continue;
+		snprintf(devname, sizeof(devname), "%s:%d", blk_dev->name,
+			 part);
+
+		ret = device_bind_driver(blk_dev, "blk_partition",
+					 strdup(devname), &dev);
+		if (ret)
+			return ret;
+
+		part_data = dev_get_uclass_plat(dev);
+		part_data->partnum = part;
+		part_data->gpt_part_info = info;
+		count++;
+
+		ret = device_probe(dev);
+		if (ret) {
+			debug("Can't probe\n");
+			count--;
+			device_unbind(dev);
+
+			continue;
+		}
+	}
+	debug("%s: %d partitions found in %s\n", __func__, count,
+	      blk_dev->name);
+
+	return 0;
+}
+
+static ulong blk_part_read(struct udevice *dev, lbaint_t start,
+			   lbaint_t blkcnt, void *buffer)
+{
+	struct udevice *parent;
+	struct disk_part *part;
+	const struct blk_ops *ops;
+
+	parent = dev_get_parent(dev);
+	ops = blk_get_ops(parent);
+	if (!ops->read)
+		return -ENOSYS;
+
+	part = dev_get_uclass_plat(dev);
+	if (start >= part->gpt_part_info.size)
+		return 0;
+
+	if ((start + blkcnt) > part->gpt_part_info.size)
+		blkcnt = part->gpt_part_info.size - start;
+	start += part->gpt_part_info.start;
+
+	return ops->read(parent, start, blkcnt, buffer);
+}
+
+static ulong blk_part_write(struct udevice *dev, lbaint_t start,
+			    lbaint_t blkcnt, const void *buffer)
+{
+	struct udevice *parent;
+	struct disk_part *part;
+	const struct blk_ops *ops;
+
+	parent = dev_get_parent(dev);
+	ops = blk_get_ops(parent);
+	if (!ops->write)
+		return -ENOSYS;
+
+	part = dev_get_uclass_plat(dev);
+	if (start >= part->gpt_part_info.size)
+		return 0;
+
+	if ((start + blkcnt) > part->gpt_part_info.size)
+		blkcnt = part->gpt_part_info.size - start;
+	start += part->gpt_part_info.start;
+
+	return ops->write(parent, start, blkcnt, buffer);
+}
+
+static ulong blk_part_erase(struct udevice *dev, lbaint_t start,
+			    lbaint_t blkcnt)
+{
+	struct udevice *parent;
+	struct disk_part *part;
+	const struct blk_ops *ops;
+
+	parent = dev_get_parent(dev);
+	ops = blk_get_ops(parent);
+	if (!ops->erase)
+		return -ENOSYS;
+
+	part = dev_get_uclass_plat(dev);
+	if (start >= part->gpt_part_info.size)
+		return 0;
+
+	if ((start + blkcnt) > part->gpt_part_info.size)
+		blkcnt = part->gpt_part_info.size - start;
+	start += part->gpt_part_info.start;
+
+	return ops->erase(parent, start, blkcnt);
+}
+
+static const struct blk_ops blk_part_ops = {
+	.read	= blk_part_read,
+	.write	= blk_part_write,
+	.erase	= blk_part_erase,
+};
+
+U_BOOT_DRIVER(blk_partition) = {
+	.name		= "blk_partition",
+	.id		= UCLASS_PARTITION,
+	.ops		= &blk_part_ops,
+};
+
+UCLASS_DRIVER(partition) = {
+	.id		= UCLASS_PARTITION,
+	.per_device_plat_auto	= sizeof(struct disk_part),
+	.name		= "partition",
+};
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index fd139b9b2a08..e69de8568b9e 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -82,6 +82,7 @@ enum uclass_id {
 	UCLASS_P2SB,		/* (x86) Primary-to-Sideband Bus */
 	UCLASS_PANEL,		/* Display panel, such as an LCD */
 	UCLASS_PANEL_BACKLIGHT,	/* Backlight controller for panel */
+	UCLASS_PARTITION,	/* Logical disk partition device */
 	UCLASS_PCH,		/* x86 platform controller hub */
 	UCLASS_PCI,		/* PCI bus */
 	UCLASS_PCI_EP,		/* PCI endpoint device */
diff --git a/include/part.h b/include/part.h
index b66b07a1f04b..e492c2249019 100644
--- a/include/part.h
+++ b/include/part.h
@@ -253,6 +253,17 @@ void part_set_generic_name(const struct blk_desc *dev_desc,
 	int part_num, char *name);
 
 extern const struct block_drvr block_drvr[];
+
+struct udevice;
+/**
+ * part_create_block_devices - Create block devices for disk partitions
+ *
+ * Create UCLASS_PARTITION udevices for each of disk partitions in @parent
+ *
+ * @blk_dev:	Whole disk device
+ */
+int part_create_block_devices(struct udevice *blk_dev);
+
 #else
 static inline struct blk_desc *blk_get_dev(const char *ifname, int dev)
 { return NULL; }
-- 
2.33.0


  parent reply	other threads:[~2021-12-10  6:53 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-10  6:49 [RFC v2 00/20] efi_loader: more tightly integrate UEFI disks to driver model AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 01/20] part: call part_init() in blk_get_device_by_str() only for MMC AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 02/20] blk: add a helper function, blk_probe_or_unbind() AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-14  7:01     ` AKASHI Takahiro
2021-12-18 10:55       ` Heinrich Schuchardt
2021-12-20  5:19         ` AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 03/20] scsi: call device_probe() after scanning AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 04/20] usb: storage: " AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 05/20] mmc: " AKASHI Takahiro
2021-12-18  9:48   ` Heinrich Schuchardt
2021-12-18 10:03     ` Heinrich Schuchardt
2022-01-02  9:47   ` Heinrich Schuchardt
2022-01-03 10:09   ` Jaehoon Chung
2021-12-10  6:49 ` [RFC v2 06/20] nvme: " AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 07/20] sata: " AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-10  6:49 ` [RFC v2 08/20] block: ide: " AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 09/20] dm: fix an 'undefined' error in some macros AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2022-01-07 12:38     ` Ilias Apalodimas
2021-12-10  6:49 ` [RFC v2 10/20] virtio: call device_probe() in scanning AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-10  6:49 ` [RFC v2 11/20] dm: add event notification AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-14  7:07     ` AKASHI Takahiro
2021-12-19 22:17       ` Simon Glass
2022-01-02  9:41   ` Heinrich Schuchardt
2021-12-10  6:49 ` [RFC v2 12/20] dm: add tag support AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-14  7:05     ` AKASHI Takahiro
2021-12-28  8:32       ` Simon Glass
2021-12-10  6:49 ` AKASHI Takahiro [this message]
2021-12-10  6:49 ` [RFC v2 14/20] dm: blk: add a device-probe hook for scanning disk partitions AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-10  6:49 ` [RFC v2 15/20] efi_loader: disk: a helper function to create efi_disk objects from udevice AKASHI Takahiro
2022-01-02  9:18   ` Heinrich Schuchardt
2022-01-06  7:16     ` AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 16/20] efi_loader: disk: a helper function to delete efi_disk objects AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 17/20] dm: disk: add read/write interfaces with udevice AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 18/20] efi_loader: disk: use udevice instead of blk_desc AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2021-12-10  6:49 ` [RFC v2 19/20] efi_loader: disk: not create BLK device for BLK(IF_TYPE_EFI) devices AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2022-01-02  9:19   ` Heinrich Schuchardt
2022-01-06  6:59     ` AKASHI Takahiro
2021-12-10  6:49 ` [RFC v2 20/20] efi_driver: align with efi_disk-dm integration AKASHI Takahiro
2021-12-13 12:51   ` Simon Glass
2022-01-27 15:05 ` [RFC v2 00/20] efi_loader: more tightly integrate UEFI disks to driver model Simon Glass
2022-01-28  5:01   ` AKASHI Takahiro
2022-01-28 12:32     ` AKASHI Takahiro

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211210064947.73361-14-takahiro.akashi@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=agraf@csgraf.de \
    --cc=ilias.apalodimas@linaro.org \
    --cc=masami.hiramatsu@linaro.org \
    --cc=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.