
On Thu, Oct 3, 2019 at 5:57 PM Patrick Wildt patrick@blueri.se wrote:
This allows our EFI API to create a device path node for NVMe devices. It adds the necessary device path struct, uses the nvme namespace accessor to retrieve the id and eui64, and also provides support for the device path text protocol.
Signed-off-by: Patrick Wildt patrick@blueri.se
diff --git a/include/efi_api.h b/include/efi_api.h index 37e56da460..d2c2330f84 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;
nits: ns_id? for consistency with what we have in the nvme driver
u8 eui64[8];
+} __packed;
nits: this struct should be put after struct efi_device_path_sd_mmc_path
struct efi_device_path_sd_mmc_path { struct efi_device_path dp; u8 slot_number; diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c index 86297bb7c1..6cb5b9c0d4 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", diff --git a/lib/efi_loader/efi_device_path_to_text.c b/lib/efi_loader/efi_device_path_to_text.c index 0f3796b373..9cfb7faa25 100644 --- a/lib/efi_loader/efi_device_path_to_text.c +++ b/lib/efi_loader/efi_device_path_to_text.c @@ -148,6 +148,20 @@ static char *dp_msging(char *s, struct efi_device_path *dp)
break; }
case DEVICE_PATH_SUB_TYPE_MSG_NVME: {
struct efi_device_path_nvme *ndp =
(struct efi_device_path_nvme *)dp;
int i;
s += sprintf(s, "NVME(0x%x,",
ndp->nsid);
for (i = 0; i < sizeof(ndp->eui64); ++i)
s += sprintf(s, "%s%02x", i ? "-" : "",
ndp->eui64[i]);
s += sprintf(s, ")");
break;
} case DEVICE_PATH_SUB_TYPE_MSG_SD: case DEVICE_PATH_SUB_TYPE_MSG_MMC: { const char *typename =
Regards, Bin