[U-Boot] [PATCH] efi: device path for nvme
Patrick Wildt
patrick at blueri.se
Wed Oct 2 21:11:31 UTC 2019
This adds a device path node for NVMe block devices. For that
nvme_get_namespace_id() is added to return the privately stored
namespace identifier.
Signed-off-by: Patrick Wildt <patrick at blueri.se>
diff --git a/drivers/nvme/nvme.c b/drivers/nvme/nvme.c
index 561f757772..0a72fe2b75 100644
--- a/drivers/nvme/nvme.c
+++ b/drivers/nvme/nvme.c
@@ -627,6 +627,13 @@ static int nvme_get_info_from_identify(struct nvme_dev *dev)
return 0;
}
+u32
+nvme_get_namespace_id(struct udevice *udev)
+{
+ struct nvme_ns *ns = dev_get_priv(udev);
+ return ns->ns_id;
+}
+
int nvme_scan_namespace(void)
{
struct uclass *uc;
diff --git a/include/efi_api.h b/include/efi_api.h
index 37e56da460..0000b4ab1a 100644
--- a/include/efi_api.h
+++ b/include/efi_api.h
@@ -422,6 +422,7 @@ struct efi_device_path_acpi_path {
# define DEVICE_PATH_SUB_TYPE_MSG_USB 0x05
# define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR 0x0b
# define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS 0x0f
+# define DEVICE_PATH_SUB_TYPE_MSG_NVME 0x17
# define DEVICE_PATH_SUB_TYPE_MSG_SD 0x1a
# define DEVICE_PATH_SUB_TYPE_MSG_MMC 0x1d
@@ -459,6 +460,12 @@ struct efi_device_path_usb_class {
u8 device_protocol;
} __packed;
+struct efi_device_path_nvme {
+ struct efi_device_path dp;
+ u32 nsid;
+ u64 eui64;
+} __packed;
+
struct efi_device_path_sd_mmc_path {
struct efi_device_path dp;
u8 slot_number;
diff --git a/include/nvme.h b/include/nvme.h
index 2c3d14d241..95193c0334 100644
--- a/include/nvme.h
+++ b/include/nvme.h
@@ -78,4 +78,14 @@ int nvme_scan_namespace(void);
*/
int nvme_print_info(struct udevice *udev);
+/**
+ * nvme_get_namespace_id - return namespace identifier
+ *
+ * This returns the namespace identifier.
+ *
+ * @udev: NVMe controller device
+ * @return: namespace identifier
+ */
+u32 nvme_get_namespace_id(struct udevice *udev);
+
#endif /* __NVME_H__ */
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
index 86297bb7c1..89ad80c7bd 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -10,6 +10,7 @@
#include <dm.h>
#include <usb.h>
#include <mmc.h>
+#include <nvme.h>
#include <efi_loader.h>
#include <part.h>
#include <sandboxblockdev.h>
@@ -451,6 +452,11 @@ static unsigned dp_size(struct udevice *dev)
return dp_size(dev->parent) +
sizeof(struct efi_device_path_sd_mmc_path);
#endif
+#if defined(CONFIG_NVME)
+ case UCLASS_NVME:
+ return dp_size(dev->parent) +
+ sizeof(struct efi_device_path_nvme);
+#endif
#ifdef CONFIG_SANDBOX
case UCLASS_ROOT:
/*
@@ -583,6 +589,19 @@ static void *dp_fill(void *buf, struct udevice *dev)
sddp->slot_number = dev->seq;
return &sddp[1];
}
+#endif
+#if defined(CONFIG_NVME)
+ case UCLASS_NVME: {
+ struct efi_device_path_nvme *dp =
+ dp_fill(buf, dev->parent);
+
+ dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+ dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_NVME;
+ dp->dp.length = sizeof(*dp);
+ dp->nsid = nvme_get_namespace_id(dev);
+ dp->eui64 = 0;
+ return &dp[1];
+ }
#endif
default:
debug("%s(%u) %s: unhandled parent class: %s (%u)\n",
More information about the U-Boot
mailing list