|
@@ -297,6 +297,23 @@ static unsigned dp_size(struct udevice *dev)
|
|
case UCLASS_SIMPLE_BUS:
|
|
case UCLASS_SIMPLE_BUS:
|
|
/* stop traversing parents at this point: */
|
|
/* stop traversing parents at this point: */
|
|
return sizeof(ROOT);
|
|
return sizeof(ROOT);
|
|
|
|
+#ifdef CONFIG_BLK
|
|
|
|
+ case UCLASS_BLK:
|
|
|
|
+ switch (dev->parent->uclass->uc_drv->id) {
|
|
|
|
+#ifdef CONFIG_IDE
|
|
|
|
+ case UCLASS_IDE:
|
|
|
|
+ return dp_size(dev->parent) +
|
|
|
|
+ sizeof(struct efi_device_path_atapi);
|
|
|
|
+#endif
|
|
|
|
+#if defined(CONFIG_SCSI) && defined(CONFIG_DM_SCSI)
|
|
|
|
+ case UCLASS_SCSI:
|
|
|
|
+ return dp_size(dev->parent) +
|
|
|
|
+ sizeof(struct efi_device_path_scsi);
|
|
|
|
+#endif
|
|
|
|
+ default:
|
|
|
|
+ return dp_size(dev->parent);
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
case UCLASS_MMC:
|
|
case UCLASS_MMC:
|
|
return dp_size(dev->parent) +
|
|
return dp_size(dev->parent) +
|
|
sizeof(struct efi_device_path_sd_mmc_path);
|
|
sizeof(struct efi_device_path_sd_mmc_path);
|
|
@@ -310,6 +327,13 @@ static unsigned dp_size(struct udevice *dev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Recursively build a device path.
|
|
|
|
+ *
|
|
|
|
+ * @buf pointer to the end of the device path
|
|
|
|
+ * @dev device
|
|
|
|
+ * @return pointer to the end of the device path
|
|
|
|
+ */
|
|
static void *dp_fill(void *buf, struct udevice *dev)
|
|
static void *dp_fill(void *buf, struct udevice *dev)
|
|
{
|
|
{
|
|
if (!dev || !dev->driver)
|
|
if (!dev || !dev->driver)
|
|
@@ -323,6 +347,46 @@ static void *dp_fill(void *buf, struct udevice *dev)
|
|
*vdp = ROOT;
|
|
*vdp = ROOT;
|
|
return &vdp[1];
|
|
return &vdp[1];
|
|
}
|
|
}
|
|
|
|
+#ifdef CONFIG_BLK
|
|
|
|
+ case UCLASS_BLK:
|
|
|
|
+ switch (dev->parent->uclass->uc_drv->id) {
|
|
|
|
+#ifdef CONFIG_IDE
|
|
|
|
+ case UCLASS_IDE: {
|
|
|
|
+ struct efi_device_path_atapi *dp =
|
|
|
|
+ dp_fill(buf, dev->parent);
|
|
|
|
+ struct blk_desc *desc = dev_get_uclass_platdata(dev);
|
|
|
|
+
|
|
|
|
+ dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
|
|
|
|
+ dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_ATAPI;
|
|
|
|
+ dp->dp.length = sizeof(*dp);
|
|
|
|
+ dp->logical_unit_number = desc->devnum;
|
|
|
|
+ dp->primary_secondary = IDE_BUS(desc->devnum);
|
|
|
|
+ dp->slave_master = desc->devnum %
|
|
|
|
+ (CONFIG_SYS_IDE_MAXDEVICE /
|
|
|
|
+ CONFIG_SYS_IDE_MAXBUS);
|
|
|
|
+ return &dp[1];
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+#if defined(CONFIG_SCSI) && defined(CONFIG_DM_SCSI)
|
|
|
|
+ case UCLASS_SCSI: {
|
|
|
|
+ struct efi_device_path_scsi *dp =
|
|
|
|
+ dp_fill(buf, dev->parent);
|
|
|
|
+ struct blk_desc *desc = dev_get_uclass_platdata(dev);
|
|
|
|
+
|
|
|
|
+ dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
|
|
|
|
+ dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SCSI;
|
|
|
|
+ dp->dp.length = sizeof(*dp);
|
|
|
|
+ dp->logical_unit_number = desc->lun;
|
|
|
|
+ dp->target_id = desc->target;
|
|
|
|
+ return &dp[1];
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+ default:
|
|
|
|
+ printf("unhandled parent class: %s (%u)\n",
|
|
|
|
+ dev->name, dev->driver->id);
|
|
|
|
+ return dp_fill(buf, dev->parent);
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
#if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
|
|
#if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
|
|
case UCLASS_MMC: {
|
|
case UCLASS_MMC: {
|
|
struct efi_device_path_sd_mmc_path *sddp =
|
|
struct efi_device_path_sd_mmc_path *sddp =
|