
On Thu, Oct 03, 2019 at 08:48:59AM +0200, Heinrich Schuchardt wrote:
On 10/2/19 11:11 PM, Patrick Wildt wrote:
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.
Thanks a lot for looking into this.
The structures and constants that you define are correct. I would prefer if we could use the real value for the EUI instead of a dummy value of 0.
Both NVMe namespaces and EUIs can be discovered by issuing the 'Identify' command to the NVMe controller. See U-Boot function nvme_identify().
All NVMe revisions support 'Controller or Namespace Structure (CNS)' value 0x00. With this value you will retrieve the 'Identity Namespace' data structure. This call is already done in nvme_blk_probe().
Looking at the code I guess that you just have to add the EUI64 field to the NVMe private data (struct nvme_dev) and copy it from id->eui64 in nvme_blk_probe().
It would be great if you could also provide a patch adding the NVMe node to the device path to text protocol.
Unfortunately the patch was not addressed to me. You can use scripts/get_maintainer.pl to identify maintainers.
Best regards
Heinrich
Hi Heinrich,
that maintainer script is really useful, thank you!
I will follow up with a v2 that addresses your points in a second.
Best regards, Patrick
Signed-off-by: Patrick Wildt patrick@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",}