disk: convert CONFIG_ISO_PARTITION to Kconfig
[platform/kernel/u-boot.git] / lib / efi_loader / efi_disk.c
index c434c92..39e602a 100644 (file)
@@ -31,11 +31,14 @@ struct efi_disk_obj {
        struct efi_device_path_file_path *dp;
        /* Offset into disk for simple partitions */
        lbaint_t offset;
+       /* Internal block device */
+       const struct blk_desc *desc;
 };
 
-static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol,
-                       void **protocol_interface, void *agent_handle,
-                       void *controller_handle, uint32_t attributes)
+static efi_status_t EFIAPI efi_disk_open_block(void *handle,
+                       efi_guid_t *protocol, void **protocol_interface,
+                       void *agent_handle, void *controller_handle,
+                       uint32_t attributes)
 {
        struct efi_disk_obj *diskobj = handle;
 
@@ -44,7 +47,7 @@ static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol,
        return EFI_SUCCESS;
 }
 
-static efi_status_t efi_disk_open_dp(void *handle, efi_guid_t *protocol,
+static efi_status_t EFIAPI efi_disk_open_dp(void *handle, efi_guid_t *protocol,
                        void **protocol_interface, void *agent_handle,
                        void *controller_handle, uint32_t attributes)
 {
@@ -78,8 +81,7 @@ static efi_status_t EFIAPI efi_disk_rw_blocks(struct efi_block_io *this,
        unsigned long n;
 
        diskobj = container_of(this, struct efi_disk_obj, ops);
-       if (!(desc = blk_get_dev(diskobj->ifname, diskobj->dev_index)))
-               return EFI_EXIT(EFI_DEVICE_ERROR);
+       desc = (struct blk_desc *) diskobj->desc;
        blksz = desc->blksz;
        blocks = buffer_size / blksz;
        lba += diskobj->offset;
@@ -107,7 +109,7 @@ static efi_status_t EFIAPI efi_disk_rw_blocks(struct efi_block_io *this,
        return EFI_EXIT(EFI_SUCCESS);
 }
 
-static efi_status_t efi_disk_read_blocks(struct efi_block_io *this,
+static efi_status_t EFIAPI efi_disk_read_blocks(struct efi_block_io *this,
                        u32 media_id, u64 lba, unsigned long buffer_size,
                        void *buffer)
 {
@@ -142,7 +144,7 @@ static efi_status_t efi_disk_read_blocks(struct efi_block_io *this,
        return EFI_EXIT(r);
 }
 
-static efi_status_t efi_disk_write_blocks(struct efi_block_io *this,
+static efi_status_t EFIAPI efi_disk_write_blocks(struct efi_block_io *this,
                        u32 media_id, u64 lba, unsigned long buffer_size,
                        void *buffer)
 {
@@ -201,6 +203,10 @@ static void efi_disk_add_dev(const char *name,
        struct efi_device_path_file_path *dp;
        int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
 
+       /* Don't add empty devices */
+       if (!desc->lba)
+               return;
+
        diskobj = calloc(1, objlen);
 
        /* Fill in object data */
@@ -213,13 +219,14 @@ static void efi_disk_add_dev(const char *name,
        diskobj->ifname = if_typename;
        diskobj->dev_index = dev_index;
        diskobj->offset = offset;
+       diskobj->desc = desc;
 
        /* Fill in EFI IO Media info (for read/write callbacks) */
        diskobj->media.removable_media = desc->removable;
        diskobj->media.media_present = 1;
        diskobj->media.block_size = desc->blksz;
        diskobj->media.io_align = desc->blksz;
-       diskobj->media.last_block = desc->lba;
+       diskobj->media.last_block = desc->lba - offset;
        diskobj->ops.media = &diskobj->media;
 
        /* Fill in device path */
@@ -240,10 +247,11 @@ static void efi_disk_add_dev(const char *name,
 
 static int efi_disk_create_eltorito(struct blk_desc *desc,
                                    const char *if_typename,
-                                   int diskid)
+                                   int diskid,
+                                   const char *pdevname)
 {
        int disks = 0;
-#ifdef CONFIG_ISO_PARTITION
+#if CONFIG_IS_ENABLED(ISO_PARTITION)
        char devname[32] = { 0 }; /* dp->str is u16[32] long */
        disk_partition_t info;
        int part = 1;
@@ -252,8 +260,8 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
                return 0;
 
        while (!part_get_info(desc, part, &info)) {
-               snprintf(devname, sizeof(devname), "%s%d:%d", if_typename,
-                        diskid, part);
+               snprintf(devname, sizeof(devname), "%s:%d", pdevname,
+                        part);
                efi_disk_add_dev(devname, if_typename, desc, diskid,
                                 info.start);
                part++;
@@ -296,7 +304,7 @@ int efi_disk_register(void)
                * so let's create them here
                */
                disks += efi_disk_create_eltorito(desc, if_typename,
-                                                 desc->devnum);
+                                                 desc->devnum, dev->name);
        }
 #else
        int i, if_type;
@@ -331,7 +339,8 @@ int efi_disk_register(void)
                         * 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);
+                       disks += efi_disk_create_eltorito(desc, if_typename,
+                                                         i, devname);
                }
        }
 #endif