[RFC 2/7] dm: implement uclass_get_dp_node()

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Sun Mar 26 19:27:38 CEST 2023


Provide a function to get the EFI device path node representing a
device.

If implemented, it invokes the uclass driver's get_dp_node() function.
Otherwise a vendor hardware node is created.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
---
 drivers/core/uclass.c | 26 ++++++++++++++++++++++++++
 include/dm/uclass.h   |  8 ++++++++
 include/efi_loader.h  |  7 +++++++
 3 files changed, 41 insertions(+)

diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index 1762a0796d..153c954ee3 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -10,6 +10,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <efi_loader.h>
 #include <errno.h>
 #include <log.h>
 #include <malloc.h>
@@ -802,6 +803,31 @@ int uclass_pre_remove_device(struct udevice *dev)
 }
 #endif
 
+#if CONFIG_IS_ENABLED(EFI_LOADER)
+struct efi_device_path *uclass_get_dp_node(struct udevice *dev)
+{
+	struct uclass *uc;
+	struct efi_device_path_uboot *dp;
+
+	uc = dev->uclass;
+	if (uc->uc_drv->get_dp_node)
+		return uc->uc_drv->get_dp_node(dev);
+
+	dp = efi_alloc(sizeof(struct efi_device_path_uboot));
+	if (!dp)
+		return NULL;
+
+	dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
+	dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR;
+	dp->dp.length = sizeof(struct efi_device_path_uboot);
+	dp->guid = efi_u_boot_guid;
+	dp->uclass_id = uc->uc_drv->id;
+	dp->seq_ = dev->seq_;
+
+	return &dp->dp;
+}
+#endif
+
 int uclass_probe_all(enum uclass_id id)
 {
 	struct udevice *dev;
diff --git a/include/dm/uclass.h b/include/dm/uclass.h
index e11637ce4d..f39dbac21d 100644
--- a/include/dm/uclass.h
+++ b/include/dm/uclass.h
@@ -503,3 +503,11 @@ int uclass_id_count(enum uclass_id id);
 	     uclass_next_device(&dev))
 
 #endif
+
+/**
+ * uclass_get_dp_node() - get EFI device path node for device
+ *
+ * @dev:	device
+ * Return:	device path node or NULL if out of memory
+ */
+struct efi_device_path *uclass_get_dp_node(struct udevice *dev);
diff --git a/include/efi_loader.h b/include/efi_loader.h
index cee04cbb9d..f111bc616d 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -22,6 +22,13 @@
 struct blk_desc;
 struct jmp_buf_data;
 
+struct efi_device_path_uboot {
+	struct efi_device_path dp;
+	efi_guid_t guid;
+	enum uclass_id uclass_id;
+	int seq_;
+} __packed;
+
 static inline int guidcmp(const void *g1, const void *g2)
 {
 	return memcmp(g1, g2, sizeof(efi_guid_t));
-- 
2.39.2



More information about the U-Boot mailing list