]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: correct shortening of device-paths
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sun, 26 Mar 2023 10:22:40 +0000 (12:22 +0200)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 1 Apr 2023 08:11:50 +0000 (10:11 +0200)
We use short device-paths in boot options so that a file on a block device
can be found independent of the port into which the device is plugged.

Usb() device-path nodes only contain port and interface information and
therefore cannot identify a block device.
UsbWwi() device-path nodes contain the serial number of USB devices.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
include/efi_api.h
lib/efi_loader/efi_device_path.c

index c57868abbd9c1fcb0ab04509d5f63d450e8bef49..404e9a1171af34ba9d20d93e1a7d24d09d74885f 100644 (file)
@@ -610,6 +610,7 @@ struct efi_device_path_acpi_path {
 #  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR    0x0b
 #  define DEVICE_PATH_SUB_TYPE_MSG_UART                0x0e
 #  define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS   0x0f
+#  define DEVICE_PATH_SUB_TYPE_MSG_USB_WWI     0x10
 #  define DEVICE_PATH_SUB_TYPE_MSG_SATA                0x12
 #  define DEVICE_PATH_SUB_TYPE_MSG_NVME                0x17
 #  define DEVICE_PATH_SUB_TYPE_MSG_URI         0x18
index b6dd575b13bdb6360fa01681c608b737fda6ff11..f35f673ce63d954674bb1f9a7b0f69369a513f46 100644 (file)
@@ -124,17 +124,13 @@ int efi_dp_match(const struct efi_device_path *a,
 /**
  * efi_dp_shorten() - shorten device-path
  *
- * We can have device paths that start with a USB WWID or a USB Class node,
- * and a few other cases which don't encode the full device path with bus
- * hierarchy:
+ * When creating a short boot option we want to use a device-path that is
+ * independent of the location where the block device is plugged in.
  *
- * * MESSAGING:USB_WWID
- * * MESSAGING:USB_CLASS
- * * MEDIA:FILE_PATH
- * * MEDIA:HARD_DRIVE
- * * MESSAGING:URI
+ * UsbWwi() nodes contain a serial number, hard drive paths a partition
+ * UUID. Both should be unique.
  *
- * See UEFI spec (section 3.1.2, about short-form device-paths)
+ * See UEFI spec, section 3.1.2 for "short-form device path".
  *
  * @dp:                original device-path
  * @Return:    shortened device-path or NULL
@@ -142,12 +138,7 @@ int efi_dp_match(const struct efi_device_path *a,
 struct efi_device_path *efi_dp_shorten(struct efi_device_path *dp)
 {
        while (dp) {
-               /*
-                * TODO: Add MESSAGING:USB_WWID and MESSAGING:URI..
-                * in practice fallback.efi just uses MEDIA:HARD_DRIVE
-                * so not sure when we would see these other cases.
-                */
-               if (EFI_DP_TYPE(dp, MESSAGING_DEVICE, MSG_USB) ||
+               if (EFI_DP_TYPE(dp, MESSAGING_DEVICE, MSG_USB_WWI) ||
                    EFI_DP_TYPE(dp, MEDIA_DEVICE, HARD_DRIVE_PATH) ||
                    EFI_DP_TYPE(dp, MEDIA_DEVICE, FILE_PATH))
                        return dp;