diff options
Diffstat (limited to 'drivers/block/efi-block-io.c')
-rw-r--r-- | drivers/block/efi-block-io.c | 56 |
1 files changed, 12 insertions, 44 deletions
diff --git a/drivers/block/efi-block-io.c b/drivers/block/efi-block-io.c index 086afb378a..876b46c2d7 100644 --- a/drivers/block/efi-block-io.c +++ b/drivers/block/efi-block-io.c @@ -12,7 +12,6 @@ #include <fcntl.h> #include <efi.h> #include <block.h> -#include <disks.h> #include <efi/efi-payload.h> #include <efi/efi-device.h> #include <bootsource.h> @@ -20,39 +19,12 @@ #define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001 #define EFI_BLOCK_IO_PROTOCOL_REVISION3 ((2<<16) | (31)) -struct efi_block_io_media{ - u32 media_id; - bool removable_media; - bool media_present; - bool logical_partition; - bool read_only; - bool write_caching; - u32 block_size; - u32 io_align; - sector_t last_block; - u64 lowest_aligned_lba; /* added in Revision 2 */ - u32 logical_blocks_per_physical_block; /* added in Revision 2 */ - u32 optimal_transfer_length_granularity; /* added in Revision 3 */ -}; - -struct efi_block_io_protocol { - u64 revision; - struct efi_block_io_media *media; - efi_status_t(EFIAPI *reset)(struct efi_block_io_protocol *this, - bool ExtendedVerification); - efi_status_t(EFIAPI *read)(struct efi_block_io_protocol *this, u32 media_id, - u64 lba, unsigned long buffer_size, void *buf); - efi_status_t(EFIAPI *write)(struct efi_block_io_protocol *this, u32 media_id, - u64 lba, unsigned long buffer_size, void *buf); - efi_status_t(EFIAPI *flush)(struct efi_block_io_protocol *this); -}; - struct efi_bio_priv { struct efi_block_io_protocol *protocol; - struct device_d *dev; + struct device *dev; struct block_device blk; u32 media_id; - void (*efi_info)(struct device_d *); + void (*efi_info)(struct device *); }; static int efi_bio_read(struct block_device *blk, void *buffer, sector_t block, @@ -102,7 +74,7 @@ static struct block_device_ops efi_bio_ops = { .flush = efi_bio_flush, }; -static void efi_bio_print_info(struct device_d *dev) +static void efi_bio_print_info(struct device *dev) { struct efi_bio_priv *priv = dev->priv; struct efi_block_io_media *media = priv->protocol->media; @@ -121,7 +93,7 @@ static void efi_bio_print_info(struct device_d *dev) printf(" last_block: 0x%016llx\n", media->last_block); if (revision < EFI_BLOCK_IO_PROTOCOL_REVISION2) - return; + goto out; printf(" lowest_aligned_lba: 0x%08llx\n", media->lowest_aligned_lba); @@ -129,27 +101,28 @@ static void efi_bio_print_info(struct device_d *dev) media->logical_blocks_per_physical_block); if (revision < EFI_BLOCK_IO_PROTOCOL_REVISION3) - return; + goto out; printf(" optimal_transfer_length_granularity: 0x%08x\n", media->optimal_transfer_length_granularity); +out: if (priv->efi_info) priv->efi_info(dev); } static bool is_bio_usbdev(struct efi_device *efidev) { - return efi_device_has_guid(efidev, EFI_USB_IO_PROTOCOL_GUID); + return IS_ENABLED(CONFIG_EFI_BLK_SEPARATE_USBDISK) && + efi_device_has_guid(efidev, EFI_USB_IO_PROTOCOL_GUID); } static int efi_bio_probe(struct efi_device *efidev) { - int ret; int instance; struct efi_bio_priv *priv; struct efi_block_io_media *media; - struct device_d *dev = &efidev->dev; + struct device *dev = &efidev->dev; priv = xzalloc(sizeof(*priv)); @@ -179,19 +152,14 @@ static int efi_bio_probe(struct efi_device *efidev) priv->blk.num_blocks = media->last_block + 1; priv->blk.ops = &efi_bio_ops; priv->blk.dev = &efidev->dev; + priv->blk.type = BLK_TYPE_VIRTUAL; priv->media_id = media->media_id; - ret = blockdevice_register(&priv->blk); - if (ret) - return ret; - if (efi_get_bootsource() == efidev) - bootsource_set_instance(instance); + bootsource_set_raw_instance(instance); - parse_partition_table(&priv->blk); - - return 0; + return blockdevice_register(&priv->blk); } static struct efi_driver efi_bio_driver = { |