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: u-boot@lists.denx.de, AKASHI Takahiro <takahiro.akashi@linaro.org>
Subject: [resent RFC 14/22] efi_loader: disk: a helper function to create efi_disk objects from udevice
Date: Mon,  4 Oct 2021 12:44:22 +0900	[thread overview]
Message-ID: <20211004034430.41355-15-takahiro.akashi@linaro.org> (raw)
In-Reply-To: <20211004034430.41355-1-takahiro.akashi@linaro.org>

Add efi_disk_create() function.

Any UEFI handle created by efi_disk_create() can be treated as a efi_disk
object, the udevice is either a UCLASS_BLK (a whole raw disk) or
UCLASS_PARTITION (a disk partition).

So this function is expected to be called every time such an udevice
is detected and activated through a device model's "probe" interface.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
 include/efi_loader.h      |  2 +
 lib/efi_loader/efi_disk.c | 92 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 94 insertions(+)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index c440962fe522..751fde7fb153 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -517,6 +517,8 @@ efi_status_t EFIAPI efi_convert_pointer(efi_uintn_t debug_disposition,
 void efi_carve_out_dt_rsv(void *fdt);
 /* Called by bootefi to make console interface available */
 efi_status_t efi_console_register(void);
+/* Called when a block devices has been probed */
+int efi_disk_create(struct udevice *dev);
 /* Called by bootefi to make all disk storage accessible as EFI objects */
 efi_status_t efi_disk_register(void);
 /* Called by efi_init_obj_list() to install EFI_RNG_PROTOCOL */
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index cd5528046251..3fae40e034fb 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -10,6 +10,7 @@
 #include <common.h>
 #include <blk.h>
 #include <dm.h>
+#include <dm/device-internal.h>
 #include <efi_loader.h>
 #include <fs.h>
 #include <log.h>
@@ -484,6 +485,7 @@ error:
 	return ret;
 }
 
+#ifndef CONFIG_BLK
 /**
  * efi_disk_create_partitions() - create handles and protocols for partitions
  *
@@ -531,6 +533,96 @@ int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
 
 	return disks;
 }
+#endif /* CONFIG_BLK */
+
+/*
+ * Create a handle for a whole raw disk
+ *
+ * @dev		uclass device
+ * @return	0 on success, -1 otherwise
+ */
+static int efi_disk_create_raw(struct udevice *dev)
+{
+	struct efi_disk_obj *disk;
+	struct blk_desc *desc;
+	const char *if_typename;
+	int diskid;
+	efi_status_t ret;
+
+	desc = dev_get_uclass_plat(dev);
+	if_typename = blk_get_if_type_name(desc->if_type);
+	diskid = desc->devnum;
+
+	ret = efi_disk_add_dev(NULL, NULL, if_typename, desc,
+			       diskid, NULL, 0, &disk);
+	if (ret != EFI_SUCCESS) {
+		log_err("Adding disk %s%d failed\n", if_typename, diskid);
+		return -1;
+	}
+	disk->dev = dev;
+	dev->efi_obj = &disk->header;
+
+	return 0;
+}
+
+/*
+ * Create a handle for a disk partition
+ *
+ * @dev		uclass device
+ * @return	0 on success, -1 otherwise
+ */
+static int efi_disk_create_part(struct udevice *dev)
+{
+	efi_handle_t parent;
+	struct blk_desc *desc;
+	const char *if_typename;
+	struct disk_part *part_data;
+	struct disk_partition *info;
+	unsigned int part;
+	int diskid;
+	struct efi_device_path *dp = NULL;
+	struct efi_disk_obj *disk;
+	efi_status_t ret;
+
+	parent = dev->parent->efi_obj;
+	desc = dev_get_uclass_plat(dev->parent);
+	if_typename = blk_get_if_type_name(desc->if_type);
+	diskid = desc->devnum;
+
+	part_data = dev_get_uclass_plat(dev);
+	part = part_data->partnum;
+	info = &part_data->gpt_part_info;
+
+	/* TODO: should not use desc? */
+	dp = efi_dp_from_part(desc, 0);
+
+	ret = efi_disk_add_dev(parent, dp, if_typename, desc, diskid,
+			       info, part, &disk);
+	if (ret != EFI_SUCCESS) {
+		log_err("Adding partition %s%d:%x failed\n",
+			if_typename, diskid, part);
+		return -1;
+	}
+	disk->dev = dev;
+	dev->efi_obj = &disk->header;
+
+	return 0;
+}
+
+int efi_disk_create(struct udevice *dev)
+{
+	enum uclass_id id;
+
+	id = device_get_uclass_id(dev);
+
+	if (id == UCLASS_BLK)
+		return efi_disk_create_raw(dev);
+
+	if (id == UCLASS_PARTITION)
+		return efi_disk_create_part(dev);
+
+	return -1;
+}
 
 /**
  * efi_disk_register() - register block devices
-- 
2.33.0


  parent reply	other threads:[~2021-10-04  3:47 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-04  3:44 [resent RFC 00/22] efi_loader: more tightly integrate UEFI disks to device model AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 01/22] part: call part_init() in blk_get_device_by_str() only for MMC AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 02/22] scsi: call device_probe() after scanning AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 03/22] usb: storage: " AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 04/22] mmc: " AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 05/22] nvme: " AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 06/22] sata: " AKASHI Takahiro
2021-10-04 18:45   ` Ilias Apalodimas
2021-10-05  1:06     ` AKASHI Takahiro
2021-10-08  5:44       ` Ilias Apalodimas
2021-10-04  3:44 ` [resent RFC 07/22] block: ide: " AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 08/22] dm: blk: add UCLASS_PARTITION AKASHI Takahiro
2021-10-04 18:40   ` Ilias Apalodimas
2021-10-05  1:30     ` AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 09/22] dm: blk: add a device-probe hook for scanning disk partitions AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 10/22] dm: blk: add read/write interfaces with udevice AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 11/22] efi_loader: disk: use udevice instead of blk_desc AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 12/22] dm: add a hidden link to efi object AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 13/22] efi_loader: remove !CONFIG_BLK code from efi_disk AKASHI Takahiro
2021-10-04  3:44 ` AKASHI Takahiro [this message]
2021-10-04 18:50   ` [resent RFC 14/22] efi_loader: disk: a helper function to create efi_disk objects from udevice Ilias Apalodimas
2021-10-05  1:37     ` AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 15/22] dm: blk: call efi's device-probe hook AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 16/22] efi_loader: cleanup after efi_disk-dm integration AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 17/22] efi_loader: add efi_remove_handle() AKASHI Takahiro
2021-10-12  8:16   ` Ilias Apalodimas
2021-10-13  0:55     ` AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 18/22] efi_loader: efi_disk: a helper function to delete efi_disk objects AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 19/22] dm: blk: call efi's device-removal hook AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 20/22] efi_driver: align with efi_disk-dm integration AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 21/22] efi_driver: cleanup after " AKASHI Takahiro
2021-10-04  3:44 ` [resent RFC 22/22] efi_selftest: block device: adjust dp for a test disk AKASHI Takahiro
2021-10-04 14:47 ` [resent RFC 00/22] efi_loader: more tightly integrate UEFI disks to device model Heinrich Schuchardt
2021-10-04 18:07   ` Ilias Apalodimas
2021-10-05  2:27     ` AKASHI Takahiro
2021-10-05  2:14   ` AKASHI Takahiro
2021-10-04 23:45 ` Simon Glass

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=20211004034430.41355-15-takahiro.akashi@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=agraf@csgraf.de \
    --cc=ilias.apalodimas@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.