/** @file\r
Partition driver that produces logical BlockIo devices from a physical \r
BlockIo device. The logical BlockIo devices are based on the format\r
- of the raw block devices media. Currently "El Torito CD-ROM", Legacy \r
+ of the raw block devices media. Currently "El Torito CD-ROM", UDF, Legacy\r
MBR, and GPT partition schemes are supported.\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
\r
#include <Uefi.h>\r
#include <Protocol/BlockIo.h>\r
+#include <Protocol/BlockIo2.h>\r
#include <Guid/Gpt.h>\r
#include <Protocol/ComponentName.h>\r
#include <Protocol/DevicePath.h>\r
#include <Protocol/DriverBinding.h>\r
#include <Protocol/DiskIo.h>\r
+#include <Protocol/DiskIo2.h>\r
+#include <Protocol/PartitionInfo.h>\r
#include <Library/DebugLib.h>\r
#include <Library/UefiDriverEntryPoint.h>\r
#include <Library/BaseLib.h>\r
\r
#include <IndustryStandard/Mbr.h>\r
#include <IndustryStandard/ElTorito.h>\r
-\r
+#include <IndustryStandard/Udf.h>\r
\r
//\r
// Partition private data\r
//\r
#define PARTITION_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'a', 'r', 't')\r
typedef struct {\r
- UINT64 Signature;\r
-\r
- EFI_HANDLE Handle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_BLOCK_IO_PROTOCOL BlockIo;\r
- EFI_BLOCK_IO_MEDIA Media;\r
-\r
- EFI_DISK_IO_PROTOCOL *DiskIo;\r
- EFI_BLOCK_IO_PROTOCOL *ParentBlockIo;\r
- UINT64 Start;\r
- UINT64 End;\r
- UINT32 BlockSize;\r
-\r
- EFI_GUID *EspGuid;\r
+ UINT64 Signature;\r
+\r
+ EFI_HANDLE Handle;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_BLOCK_IO_PROTOCOL BlockIo;\r
+ EFI_BLOCK_IO2_PROTOCOL BlockIo2;\r
+ EFI_BLOCK_IO_MEDIA Media;\r
+ EFI_BLOCK_IO_MEDIA Media2;//For BlockIO2\r
+ EFI_PARTITION_INFO_PROTOCOL PartitionInfo;\r
+\r
+ EFI_DISK_IO_PROTOCOL *DiskIo;\r
+ EFI_DISK_IO2_PROTOCOL *DiskIo2;\r
+ EFI_BLOCK_IO_PROTOCOL *ParentBlockIo;\r
+ EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2;\r
+ UINT64 Start;\r
+ UINT64 End;\r
+ UINT32 BlockSize;\r
+ BOOLEAN InStop;\r
+\r
+ EFI_GUID *EspGuid;\r
\r
} PARTITION_PRIVATE_DATA;\r
\r
+typedef struct {\r
+ EFI_DISK_IO2_TOKEN DiskIo2Token;\r
+ EFI_BLOCK_IO2_TOKEN *BlockIo2Token;\r
+} PARTITION_ACCESS_TASK;\r
+\r
#define PARTITION_DEVICE_FROM_BLOCK_IO_THIS(a) CR (a, PARTITION_PRIVATE_DATA, BlockIo, PARTITION_PRIVATE_DATA_SIGNATURE)\r
+#define PARTITION_DEVICE_FROM_BLOCK_IO2_THIS(a) CR (a, PARTITION_PRIVATE_DATA, BlockIo2, PARTITION_PRIVATE_DATA_SIGNATURE)\r
\r
//\r
// Global Variables\r
typedef struct {\r
BOOLEAN OutOfRange;\r
BOOLEAN Overlap;\r
+ BOOLEAN OsSpecific;\r
} EFI_PARTITION_ENTRY_STATUS;\r
\r
//\r
Create a child handle for a logical block device that represents the\r
bytes Start to End of the Parent Block IO device.\r
\r
- @param[in] This Protocol instance pointer\r
- @param[in] ParentHandle Parent Handle for new child\r
- @param[in] ParentDiskIo Parent DiskIo interface\r
- @param[in] ParentBlockIo Parent BlockIo interface\r
- @param[in] ParentDevicePath Parent Device Path\r
- @param[in] DevicePathNode Child Device Path node\r
- @param[in] Start Start Block\r
- @param[in] End End Block\r
- @param[in] BlockSize Child block size\r
- @param[in] InstallEspGuid Flag to install EFI System Partition GUID on handle\r
+ @param[in] This Protocol instance pointer.\r
+ @param[in] ParentHandle Parent Handle for new child.\r
+ @param[in] ParentDiskIo Parent DiskIo interface.\r
+ @param[in] ParentDiskIo2 Parent DiskIo2 interface.\r
+ @param[in] ParentBlockIo Parent BlockIo interface.\r
+ @param[in] ParentBlockIo2 Parent BlockIo2 interface.\r
+ @param[in] ParentDevicePath Parent Device Path.\r
+ @param[in] DevicePathNode Child Device Path node.\r
+ @param[in] PartitionInfo Child Partition Information interface.\r
+ @param[in] Start Start Block.\r
+ @param[in] End End Block.\r
+ @param[in] BlockSize Child block size.\r
\r
- @retval EFI_SUCCESS A child handle was added\r
- @retval other A child handle was not added\r
+ @retval EFI_SUCCESS A child handle was added.\r
+ @retval other A child handle was not added.\r
\r
**/\r
EFI_STATUS\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE ParentHandle,\r
IN EFI_DISK_IO_PROTOCOL *ParentDiskIo,\r
+ IN EFI_DISK_IO2_PROTOCOL *ParentDiskIo2,\r
IN EFI_BLOCK_IO_PROTOCOL *ParentBlockIo,\r
+ IN EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2,\r
IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
+ IN EFI_PARTITION_INFO_PROTOCOL *PartitionInfo,\r
IN EFI_LBA Start,\r
IN EFI_LBA End,\r
- IN UINT32 BlockSize,\r
- IN BOOLEAN InstallEspGuid\r
+ IN UINT32 BlockSize\r
+ );\r
+\r
+/**\r
+ Test to see if there is any child on ControllerHandle.\r
+\r
+ @param[in] ControllerHandle Handle of device to test.\r
+\r
+ @retval TRUE There are children on the ControllerHandle.\r
+ @retval FALSE No child is on the ControllerHandle.\r
+\r
+**/\r
+BOOLEAN\r
+HasChildren (\r
+ IN EFI_HANDLE ControllerHandle\r
);\r
\r
/**\r
Install child handles if the Handle supports GPT partition structure.\r
\r
- @param[in] This - Calling context.\r
- @param[in] Handle - Parent Handle\r
- @param[in] DiskIo - Parent DiskIo interface\r
- @param[in] BlockIo - Parent BlockIo interface\r
- @param[in] DevicePath - Parent Device Path\r
+ @param[in] This Calling context.\r
+ @param[in] Handle Parent Handle.\r
+ @param[in] DiskIo Parent DiskIo interface.\r
+ @param[in] DiskIo2 Parent DiskIo2 interface.\r
+ @param[in] BlockIo Parent BlockIo interface.\r
+ @param[in] BlockIo2 Parent BlockIo2 interface.\r
+ @param[in] DevicePath Parent Device Path.\r
\r
- @retval EFI_SUCCESS Valid GPT disk\r
- @retval EFI_MEDIA_CHANGED Media changed Detected\r
- @retval other Not a valid GPT disk\r
+ @retval EFI_SUCCESS Valid GPT disk.\r
+ @retval EFI_MEDIA_CHANGED Media changed Detected.\r
+ @retval EFI_INVALID_PARAMETER If both BlockIo and BlockIo2 are NULL;\r
+ @retval other Not a valid GPT disk.\r
\r
**/\r
EFI_STATUS\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE Handle,\r
IN EFI_DISK_IO_PROTOCOL *DiskIo,\r
+ IN EFI_DISK_IO2_PROTOCOL *DiskIo2,\r
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,\r
+ IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
);\r
\r
Install child handles if the Handle supports El Torito format.\r
\r
@param[in] This Calling context.\r
- @param[in] Handle Parent Handle\r
- @param[in] DiskIo Parent DiskIo interface\r
- @param[in] BlockIo Parent BlockIo interface\r
+ @param[in] Handle Parent Handle.\r
+ @param[in] DiskIo Parent DiskIo interface.\r
+ @param[in] DiskIo2 Parent DiskIo2 interface.\r
+ @param[in] BlockIo Parent BlockIo interface.\r
+ @param[in] BlockIo2 Parent BlockIo2 interface.\r
@param[in] DevicePath Parent Device Path\r
\r
\r
- @retval EFI_SUCCESS Child handle(s) was added\r
- @retval EFI_MEDIA_CHANGED Media changed Detected\r
- @retval other no child handle was added\r
+ @retval EFI_SUCCESS Child handle(s) was added.\r
+ @retval EFI_MEDIA_CHANGED Media changed Detected.\r
+ @retval other no child handle was added.\r
\r
**/\r
EFI_STATUS\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE Handle,\r
IN EFI_DISK_IO_PROTOCOL *DiskIo,\r
+ IN EFI_DISK_IO2_PROTOCOL *DiskIo2,\r
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,\r
+ IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
);\r
\r
/**\r
Install child handles if the Handle supports MBR format.\r
\r
- @param This Calling context.\r
- @param Handle Parent Handle.\r
- @param DiskIo Parent DiskIo interface.\r
- @param BlockIo Parent BlockIo interface.\r
- @param DevicePath Parent Device Path.\r
+ @param[in] This Calling context.\r
+ @param[in] Handle Parent Handle.\r
+ @param[in] DiskIo Parent DiskIo interface.\r
+ @param[in] DiskIo2 Parent DiskIo2 interface.\r
+ @param[in] BlockIo Parent BlockIo interface.\r
+ @param[in] BlockIo2 Parent BlockIo2 interface.\r
+ @param[in] DevicePath Parent Device Path.\r
\r
@retval EFI_SUCCESS A child handle was added.\r
@retval EFI_MEDIA_CHANGED Media change was detected.\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE Handle,\r
IN EFI_DISK_IO_PROTOCOL *DiskIo,\r
+ IN EFI_DISK_IO2_PROTOCOL *DiskIo2,\r
+ IN EFI_BLOCK_IO_PROTOCOL *BlockIo,\r
+ IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+/**\r
+ Install child handles if the Handle supports UDF/ECMA-167 volume format.\r
+\r
+ @param[in] This Calling context.\r
+ @param[in] Handle Parent Handle.\r
+ @param[in] DiskIo Parent DiskIo interface.\r
+ @param[in] DiskIo2 Parent DiskIo2 interface.\r
+ @param[in] BlockIo Parent BlockIo interface.\r
+ @param[in] BlockIo2 Parent BlockIo2 interface.\r
+ @param[in] DevicePath Parent Device Path\r
+\r
+\r
+ @retval EFI_SUCCESS Child handle(s) was added.\r
+ @retval EFI_MEDIA_CHANGED Media changed Detected.\r
+ @retval other no child handle was added.\r
+\r
+**/\r
+EFI_STATUS\r
+PartitionInstallUdfChildHandles (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DISK_IO_PROTOCOL *DiskIo,\r
+ IN EFI_DISK_IO2_PROTOCOL *DiskIo2,\r
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,\r
+ IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
);\r
\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE Handle,\r
IN EFI_DISK_IO_PROTOCOL *DiskIo,\r
+ IN EFI_DISK_IO2_PROTOCOL *DiskIo2,\r
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,\r
+ IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
);\r
\r