On Fri, Dec 01, 2017 at 04:10:33PM +0100, Alexander Graf wrote: > Commit 884bcf6f65 (efi_loader: use proper device-paths for partitions) tried > to introduce the el torito scheme to all partition table types: Spawn > individual disk objects for each partition on a disk. > > Unfortunately, that code ended up creating partitions with offset=0 which > meant > that anyone accessing these objects gets data from the raw block device > instead > of the partition. > > Furthermore, all the el torito logic to spawn devices for partitions was > duplicated. So let's merge the two code paths and give partition disk objects > good offsets to work from, so that payloads can actually make use of them. > > Fixes: 884bcf6f65 (efi_loader: use proper device-paths for partitions) > Reported-by: Yousaf Kaukab <[email protected]> > Signed-off-by: Alexander Graf <[email protected]>
This once again broke being able to find a DEVICE_PATH_TYPE_MEDIA_DEVICE node with the loaded image protocol on rpi_3 with mmc/usb. broken ## Starting EFI application at 01000000 ... Scanning disk [email protected]... efi_disk_register BLK efi_disk_add_dev [email protected], if_typename=mmc_blk, dev_index=0 offset=0, part=0 efi_disk_create_partitions efi_disk_add_dev [email protected]:1, if_typename=mmc_blk, dev_index=0 offset=8192, part=1 efi_disk_create_partitions efi_disk_add_dev [email protected]:4, if_typename=mmc_blk, dev_index=0 offset=16384, part=4 Scanning disk usb_mass_storage.lun0... efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, if_typename=usb_storage_blk, dev_index=0 offset=0, part=0 efi_disk_create_partitions efi_disk_add_dev name=usb_mass_storage.lun0:1, if_typename=usb_storage_blk, dev_index=0 offset=8192, part=1 efi_disk_create_partitions efi_disk_add_dev name=usb_mass_storage.lun0:4, if_typename=usb_storage_blk, dev_index=0 offset=40960, part=4 Found 6 disks efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 11 type 3 b: len 11 type: 3 efi_dp_match a: len 11 type 3 b: len 11 type: 3 efi_dp_match a: len 11 type 3 b: len 11 type: 3 efi_diskprobe efi_device_path_depth looking for type 4 i=0 type 1 efi_device_path_depth looking for type 4 i=1 type 3 efi_device_path_depth looking for type 4 i=2 type 3 efi_device_path_depth looking for type 4 i=3 type 3 efi_device_path_depth no match for type 4 depth=-1 working (this commit reverted) ## Starting EFI application at 01000000 ... Scanning disk [email protected]... efi_disk_register BLK efi_disk_add_dev [email protected], if_typename=mmc_blk, dev_index=0 offset=0, part=1 efi_disk_register BLK efi_disk_add_dev [email protected], if_typename=mmc_blk, dev_index=0 offset=0, part=4 efi_disk_register BLK efi_disk_add_dev [email protected], if_typename=mmc_blk, dev_index=0 offset=0, part=0 Scanning disk usb_mass_storage.lun0... efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, if_typename=usb_storage_blk, dev_index=0 offset=0, part=1 efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, if_typename=usb_storage_blk, dev_index=0 offset=0, part=4 efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, if_typename=usb_storage_blk, dev_index=0 offset=0, part=0 Found 2 disks efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 20 type 1 b: len 20 type: 1 efi_dp_match a: len 11 type 3 b: len 11 type: 3 efi_dp_match a: len 11 type 3 b: len 11 type: 3 efi_dp_match a: len 11 type 3 b: len 11 type: 3 efi_dp_match a: len 42 type 4 b: len 42 type: 4 efi_diskprobe efi_device_path_depth looking for type 4 i=0 type 1 efi_device_path_depth looking for type 4 i=1 type 3 efi_device_path_depth looking for type 4 i=2 type 3 efi_device_path_depth looking for type 4 i=3 type 3 efi_device_path_depth looking for type 4 i=4 type 4 depth=4 > --- > lib/efi_loader/efi_disk.c | 60 > ++++++++++------------------------------------- > 1 file changed, 13 insertions(+), 47 deletions(-) > > diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c > index 68ba2cf7b2..4e457a841b 100644 > --- a/lib/efi_loader/efi_disk.c > +++ b/lib/efi_loader/efi_disk.c > @@ -264,21 +264,17 @@ out_of_memory: > printf("ERROR: Out of memory\n"); > } > > -static int efi_disk_create_eltorito(struct blk_desc *desc, > - const char *if_typename, > - int diskid, > - const char *pdevname) > +static int efi_disk_create_partitions(struct blk_desc *desc, > + const char *if_typename, > + int diskid, > + const char *pdevname) > { > int disks = 0; > -#if CONFIG_IS_ENABLED(ISO_PARTITION) > char devname[32] = { 0 }; /* dp->str is u16[32] long */ > disk_partition_t info; > int part; > > - if (desc->part_type != PART_TYPE_ISO) > - return 0; > - > - /* and devices for each partition: */ > + /* Add devices for each partition */ > for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) { > if (part_get_info(desc, part, &info)) > continue; > @@ -289,10 +285,6 @@ static int efi_disk_create_eltorito(struct blk_desc > *desc, > disks++; > } > > - /* ... and add block device: */ > - efi_disk_add_dev(devname, if_typename, desc, diskid, 0, 0); > -#endif > - > return disks; > } > > @@ -318,31 +310,18 @@ int efi_disk_register(void) > uclass_next_device_check(&dev)) { > struct blk_desc *desc = dev_get_uclass_platdata(dev); > const char *if_typename = dev->driver->name; > - disk_partition_t info; > - int part; > > printf("Scanning disk %s...\n", dev->name); > > - /* add devices for each partition: */ > - for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) { > - if (part_get_info(desc, part, &info)) > - continue; > - efi_disk_add_dev(dev->name, if_typename, desc, > - desc->devnum, 0, part); > - } > - > - /* ... and add block device: */ > + /* Add block device for the full device */ > efi_disk_add_dev(dev->name, if_typename, desc, > desc->devnum, 0, 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, if_typename, > - desc->devnum, dev->name); > + /* Partitions show up as block devices in EFI */ > + disks += efi_disk_create_partitions(desc, if_typename, > + desc->devnum, dev->name); > } > #else > int i, if_type; > @@ -361,8 +340,6 @@ int efi_disk_register(void) > for (i = 0; i < 4; i++) { > struct blk_desc *desc; > char devname[32] = { 0 }; /* dp->str is u16[32] long */ > - disk_partition_t info; > - int part; > > desc = blk_get_devnum_by_type(if_type, i); > if (!desc) > @@ -373,24 +350,13 @@ int efi_disk_register(void) > snprintf(devname, sizeof(devname), "%s%d", > if_typename, i); > > - /* add devices for each partition: */ > - for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) { > - if (part_get_info(desc, part, &info)) > - continue; > - efi_disk_add_dev(devname, if_typename, desc, > - i, 0, part); > - } > - > - /* ... and add block device: */ > + /* Add block device for the full device */ > efi_disk_add_dev(devname, if_typename, desc, i, 0, 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, if_typename, > - i, devname); > + /* Partitions show up as block devices in EFI */ > + disks += efi_disk_create_partitions(desc, if_typename, > + i, devname); > } > } > #endif > -- > 2.12.3 > > _______________________________________________ > U-Boot mailing list > [email protected] > https://lists.denx.de/listinfo/u-boot _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

