efi: device path for nvme

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>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Patrick Wildt 2019-10-03 16:24:17 +02:00 committed by Heinrich Schuchardt
parent c50b2883df
commit f2d247df50
3 changed files with 42 additions and 0 deletions

View file

@ -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,20 @@ 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);
u32 ns_id;
dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_NVME;
dp->dp.length = sizeof(*dp);
nvme_get_namespace_id(dev, &ns_id, dp->eui64);
memcpy(&dp->ns_id, &ns_id, sizeof(ns_id));
return &dp[1];
}
#endif
default:
debug("%s(%u) %s: unhandled parent class: %s (%u)\n",