[U-Boot] [PATCH] efi: device path for nvme
Bin Meng
bmeng.cn at gmail.com
Thu Oct 3 10:29:07 UTC 2019
On Thu, Oct 3, 2019 at 5:57 PM Patrick Wildt <patrick at 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 at 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
More information about the U-Boot
mailing list