]> git.sur5r.net Git - u-boot/blobdiff - lib/efi_loader/efi_disk.c
efi_loader: Add el torito support
[u-boot] / lib / efi_loader / efi_disk.c
index e30e72817efb3860aab824f09cb3282c8e027397..b3d56a88f086a26e66bb7f6a18cbea115fe4d532 100644 (file)
@@ -27,6 +27,8 @@ struct efi_disk_obj {
        struct efi_block_io_media media;
        /* EFI device path to this block device */
        struct efi_device_path_file_path *dp;
+       /* Offset into disk for simple partitions */
+       lbaint_t offset;
 };
 
 static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol,
@@ -81,6 +83,7 @@ static efi_status_t EFIAPI efi_disk_rw_blocks(struct efi_block_io *this,
                return EFI_EXIT(EFI_DEVICE_ERROR);
        blksz = desc->blksz;
        blocks = buffer_size / blksz;
+       lba += diskobj->offset;
 
 #ifdef DEBUG_EFI
        printf("EFI: %s:%d blocks=%x lba=%"PRIx64" blksz=%x dir=%d\n", __func__,
@@ -159,6 +162,7 @@ static void efi_disk_add_dev(char *name,
        diskobj->ops = block_io_disk_template;
        diskobj->ifname = cur_drvr->name;
        diskobj->dev_index = dev_index;
+       diskobj->offset = offset;
 
        /* Fill in EFI IO Media info (for read/write callbacks) */
        diskobj->media.removable_media = desc->removable;
@@ -184,6 +188,31 @@ static void efi_disk_add_dev(char *name,
        list_add_tail(&diskobj->parent.link, &efi_obj_list);
 }
 
+static int efi_disk_create_eltorito(struct blk_desc *desc,
+                                   const struct block_drvr *cur_drvr,
+                                   int diskid)
+{
+       int disks = 0;
+#ifdef CONFIG_ISO_PARTITION
+       char devname[16] = { 0 }; /* dp->str is u16[16] long */
+       disk_partition_t info;
+       int part = 1;
+
+       if (desc->part_type != PART_TYPE_ISO)
+               return 0;
+
+       while (!part_get_info(desc, part, &info)) {
+               snprintf(devname, sizeof(devname), "%s%d:%d", cur_drvr->name,
+                        diskid, part);
+               efi_disk_add_dev(devname, cur_drvr, desc, diskid, info.start);
+               part++;
+               disks++;
+       }
+#endif
+
+       return disks;
+}
+
 /*
  * U-Boot doesn't have a list of all online disk devices. So when running our
  * EFI payload, we scan through all of the potentially available ones and
@@ -214,6 +243,12 @@ int efi_disk_register(void)
                                 cur_drvr->name, i);
                        efi_disk_add_dev(devname, cur_drvr, desc, i, 0);
                        disks++;
+
+                       /*
+                        * El Torito images show up as block devices
+                        * in an EFI world, so let's create them here
+                        */
+                       disks += efi_disk_create_eltorito(desc, cur_drvr, i);
                }
        }
        printf("Found %d disks\n", disks);