efi_loader: comments EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
[oweals/u-boot.git] / lib / efi_loader / efi_disk.c
index fd3df80b0b9627649cc47328cfcab91bad36a49d..670bf2b8ef0185961662d14db1a0a1fc3d51c0c7 100644 (file)
@@ -356,6 +356,7 @@ static efi_status_t efi_disk_add_dev(
                                struct efi_disk_obj **disk)
 {
        struct efi_disk_obj *diskobj;
+       struct efi_object *handle;
        efi_status_t ret;
 
        /* Don't add empty devices */
@@ -379,15 +380,25 @@ static efi_status_t efi_disk_add_dev(
                diskobj->dp = efi_dp_from_part(desc, part);
        }
        diskobj->part = part;
-       ret = efi_add_protocol(&diskobj->header, &efi_block_io_guid,
-                              &diskobj->ops);
-       if (ret != EFI_SUCCESS)
-               return ret;
-       ret = efi_add_protocol(&diskobj->header, &efi_guid_device_path,
-                              diskobj->dp);
+
+       /*
+        * Install the device path and the block IO protocol.
+        *
+        * InstallMultipleProtocolInterfaces() checks if the device path is
+        * already installed on an other handle and returns EFI_ALREADY_STARTED
+        * in this case.
+        */
+       handle = &diskobj->header;
+       ret = EFI_CALL(efi_install_multiple_protocol_interfaces(
+                       &handle, &efi_guid_device_path, diskobj->dp,
+                       &efi_block_io_guid, &diskobj->ops, NULL));
        if (ret != EFI_SUCCESS)
                return ret;
-       /* partitions or whole disk without partitions */
+
+       /*
+        * On partitions or whole disks without partitions install the
+        * simple file system protocol if a file system is available.
+        */
        if ((part || desc->part_type == PART_TYPE_UNKNOWN) &&
            efi_fs_exists(desc, part)) {
                diskobj->volume = efi_simple_file_system(desc, part,
@@ -424,7 +435,7 @@ static efi_status_t efi_disk_add_dev(
        /* Store first EFI system partition */
        if (part && !efi_system_partition.if_type) {
                int r;
-               disk_partition_t info;
+               struct disk_partition info;
 
                r = part_get_info(desc, part, &info);
                if (r)
@@ -459,7 +470,7 @@ int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
 {
        int disks = 0;
        char devname[32] = { 0 }; /* dp->str is u16[32] long */
-       disk_partition_t info;
+       struct disk_partition info;
        int part;
        struct efi_device_path *dp = NULL;
        efi_status_t ret;
@@ -588,3 +599,32 @@ efi_status_t efi_disk_register(void)
 
        return EFI_SUCCESS;
 }
+
+/**
+ * efi_disk_is_system_part() - check if handle refers to an EFI system partition
+ *
+ * @handle:    handle of partition
+ *
+ * Return:     true if handle refers to an EFI system partition
+ */
+bool efi_disk_is_system_part(efi_handle_t handle)
+{
+       struct efi_handler *handler;
+       struct efi_disk_obj *diskobj;
+       struct disk_partition info;
+       efi_status_t ret;
+       int r;
+
+       /* check if this is a block device */
+       ret = efi_search_protocol(handle, &efi_block_io_guid, &handler);
+       if (ret != EFI_SUCCESS)
+               return false;
+
+       diskobj = container_of(handle, struct efi_disk_obj, header);
+
+       r = part_get_info(diskobj->desc, diskobj->part, &info);
+       if (r)
+               return false;
+
+       return !!(info.bootable & PART_EFI_SYSTEM_PARTITION);
+}