diff options
author | Tom Rini <trini@konsulko.com> | 2022-07-02 09:55:26 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-07-02 09:55:26 -0400 |
commit | 730fc474b1bcf6ae7b79fe02d9c7318778189827 (patch) | |
tree | bf267adde47936a0e853fbacd11e50bd6469a3cb | |
parent | 6cae9aeeab374fd4ab1e38cc8473ef8de6dc42ed (diff) | |
parent | 7a85f32413a34b18a2f84c865d7b448790200b13 (diff) | |
download | u-boot-WIP/02Jul2022.zip u-boot-WIP/02Jul2022.tar.gz u-boot-WIP/02Jul2022.tar.bz2 |
Merge tag 'efi-2022-07-rc6' of https://source.denx.de/u-boot/custodians/u-boot-efiWIP/02Jul2022
Pull request for efi-2022-07-rc6
UEFI:
* Fix EFI_IO_BLOCK_PROTOCOL: read correct blocks on partitions
Other:
* Honor CONFIG_SYS_64BIT_LBA in the disk uclass
-rw-r--r-- | disk/disk-uclass.c | 1 | ||||
-rw-r--r-- | lib/efi_loader/efi_disk.c | 8 | ||||
-rw-r--r-- | lib/efi_selftest/efi_selftest_block_device.c | 27 |
3 files changed, 29 insertions, 7 deletions
diff --git a/disk/disk-uclass.c b/disk/disk-uclass.c index 72ff62e..f3fb942 100644 --- a/disk/disk-uclass.c +++ b/disk/disk-uclass.c @@ -8,6 +8,7 @@ #define LOG_CATEGORY UCLASS_PARTITION +#include <common.h> #include <blk.h> #include <dm.h> #include <log.h> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index 1e82f52..1d700b2 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -35,7 +35,6 @@ const efi_guid_t efi_system_partition_guid = PARTITION_SYSTEM_GUID; * @dp: device path to the block device * @part: partition * @volume: simple file system protocol of the partition - * @offset: offset into disk for simple partition * @dev: associated DM device */ struct efi_disk_obj { @@ -47,7 +46,6 @@ struct efi_disk_obj { struct efi_device_path *dp; unsigned int part; struct efi_simple_file_system_protocol *volume; - lbaint_t offset; struct udevice *dev; /* TODO: move it to efi_object */ }; @@ -117,7 +115,6 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this, diskobj = container_of(this, struct efi_disk_obj, ops); blksz = diskobj->media.block_size; blocks = buffer_size / blksz; - lba += diskobj->offset; EFI_PRINT("blocks=%x lba=%llx blksz=%x dir=%d\n", blocks, lba, blksz, direction); @@ -440,13 +437,11 @@ static efi_status_t efi_disk_add_dev( diskobj->dp = efi_dp_append_node(dp_parent, node); efi_free_pool(node); - diskobj->offset = part_info->start; diskobj->media.last_block = part_info->size - 1; if (part_info->bootable & PART_EFI_SYSTEM_PARTITION) guid = &efi_system_partition_guid; } else { diskobj->dp = efi_dp_from_part(desc, part); - diskobj->offset = 0; diskobj->media.last_block = desc->lba - 1; } diskobj->part = part; @@ -501,12 +496,11 @@ static efi_status_t efi_disk_add_dev( *disk = diskobj; EFI_PRINT("BlockIO: part %u, present %d, logical %d, removable %d" - ", offset " LBAF ", last_block %llu\n", + ", last_block %llu\n", diskobj->part, diskobj->media.media_present, diskobj->media.logical_partition, diskobj->media.removable_media, - diskobj->offset, diskobj->media.last_block); /* Store first EFI system partition */ diff --git a/lib/efi_selftest/efi_selftest_block_device.c b/lib/efi_selftest/efi_selftest_block_device.c index 60fa655..a367e8b 100644 --- a/lib/efi_selftest/efi_selftest_block_device.c +++ b/lib/efi_selftest/efi_selftest_block_device.c @@ -11,6 +11,8 @@ * ConnectController is used to setup partitions and to install the simple * file protocol. * A known file is read from the file system and verified. + * The same block is read via the EFI_BLOCK_IO_PROTOCOL and compared to the file + * contents. */ #include <efi_selftest.h> @@ -312,6 +314,7 @@ static int execute(void) char buf[16] __aligned(ARCH_DMA_MINALIGN); u32 part1_size; u64 pos; + char block_io_aligned[1 << LB_BLOCK_SIZE] __aligned(1 << LB_BLOCK_SIZE); /* Connect controller to virtual disk */ ret = boottime->connect_controller(disk_handle, NULL, NULL, 1); @@ -449,6 +452,30 @@ static int execute(void) return EFI_ST_FAILURE; } + /* + * Test that read_blocks() can read same file data. + * + * In the test data, the partition starts at block 1 and the file + * hello.txt with the content 'Hello world!' is located at 0x5000 + * of the disk. Here we read block 0x27 (offset 0x4e00 of the + * partition) and expect the string 'Hello world!' to be at the + * start of block. + */ + ret = block_io_protocol->read_blocks(block_io_protocol, + block_io_protocol->media->media_id, + (0x5000 >> LB_BLOCK_SIZE) - 1, + block_io_protocol->media->block_size, + block_io_aligned); + if (ret != EFI_SUCCESS) { + efi_st_error("ReadBlocks failed\n"); + return EFI_ST_FAILURE; + } + + if (memcmp(block_io_aligned + 1, buf, 11)) { + efi_st_error("Unexpected block content\n"); + return EFI_ST_FAILURE; + } + #ifdef CONFIG_FAT_WRITE /* Write file */ ret = root->open(root, &file, u"u-boot.txt", EFI_FILE_MODE_READ | |