1 /** @file 2 3 Copyright (c) 1999 - 2011, Intel Corporation. All rights reserved.<BR> 4 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions 7 of the BSD License which accompanies this distribution. The 8 full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 #ifndef _BIOS_BLOCK_IO_H_ 17 #define _BIOS_BLOCK_IO_H_ 18 19 #include <Uefi.h> 20 21 #include <Protocol/BlockIo.h> 22 #include <Protocol/PciIo.h> 23 #include <Protocol/LegacyBios.h> 24 #include <Protocol/DevicePath.h> 25 #include <Guid/LegacyBios.h> 26 #include <Guid/BlockIoVendor.h> 27 28 #include <Library/UefiDriverEntryPoint.h> 29 #include <Library/DebugLib.h> 30 #include <Library/BaseMemoryLib.h> 31 #include <Library/UefiBootServicesTableLib.h> 32 #include <Library/UefiLib.h> 33 #include <Library/DevicePathLib.h> 34 #include <Library/MemoryAllocationLib.h> 35 36 #include <IndustryStandard/Pci.h> 37 38 #include "Edd.h" 39 40 // 41 // Global Variables 42 // 43 extern EFI_COMPONENT_NAME_PROTOCOL gBiosBlockIoComponentName; 44 extern EFI_COMPONENT_NAME2_PROTOCOL gBiosBlockIoComponentName2; 45 46 47 // 48 // Define the I2O class code 49 // 50 #define PCI_BASE_CLASS_INTELLIGENT 0x0e 51 #define PCI_SUB_CLASS_INTELLIGENT 0x00 52 53 // 54 // Number of pages needed for our buffer under 1MB 55 // 56 #define BLOCK_IO_BUFFER_PAGE_SIZE (((sizeof (EDD_DEVICE_ADDRESS_PACKET) + sizeof (BIOS_LEGACY_DRIVE) + MAX_EDD11_XFER) / EFI_PAGE_SIZE) + 1 \ 57 ) 58 59 // 60 // Driver Binding Protocol functions 61 // 62 63 /** 64 Check whether the driver supports this device. 65 66 @param This The Udriver binding protocol. 67 @param Controller The controller handle to check. 68 @param RemainingDevicePath The remaining device path. 69 70 @retval EFI_SUCCESS The driver supports this controller. 71 @retval other This device isn't supported. 72 73 **/ 74 EFI_STATUS 75 EFIAPI 76 BiosBlockIoDriverBindingSupported ( 77 IN EFI_DRIVER_BINDING_PROTOCOL *This, 78 IN EFI_HANDLE Controller, 79 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 80 ); 81 82 83 /** 84 Starts the device with this driver. 85 86 @param This The driver binding instance. 87 @param Controller Handle of device to bind driver to. 88 @param RemainingDevicePath Optional parameter use to pick a specific child 89 device to start. 90 91 @retval EFI_SUCCESS The controller is controlled by the driver. 92 @retval Other This controller cannot be started. 93 94 **/ 95 EFI_STATUS 96 EFIAPI 97 BiosBlockIoDriverBindingStart ( 98 IN EFI_DRIVER_BINDING_PROTOCOL *This, 99 IN EFI_HANDLE Controller, 100 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 101 ); 102 103 /** 104 Stop the device handled by this driver. 105 106 @param This The driver binding protocol. 107 @param Controller The controller to release. 108 @param NumberOfChildren The number of handles in ChildHandleBuffer. 109 @param ChildHandleBuffer The array of child handle. 110 111 @retval EFI_SUCCESS The device was stopped. 112 @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. 113 @retval Others Fail to uninstall protocols attached on the device. 114 115 **/ 116 EFI_STATUS 117 EFIAPI 118 BiosBlockIoDriverBindingStop ( 119 IN EFI_DRIVER_BINDING_PROTOCOL *This, 120 IN EFI_HANDLE Controller, 121 IN UINTN NumberOfChildren, 122 IN EFI_HANDLE *ChildHandleBuffer 123 ); 124 125 // 126 // Other internal functions 127 // 128 129 /** 130 Build device path for EDD 3.0. 131 132 @param BaseDevicePath Base device path. 133 @param Drive Legacy drive. 134 @param DevicePath Device path for output. 135 136 @retval EFI_SUCCESS The device path is built successfully. 137 @retval EFI_UNSUPPORTED It is failed to built device path. 138 139 **/ 140 EFI_STATUS 141 BuildEdd30DevicePath ( 142 IN EFI_DEVICE_PATH_PROTOCOL *BaseDevicePath, 143 IN BIOS_LEGACY_DRIVE *Drive, 144 IN EFI_DEVICE_PATH_PROTOCOL **DevicePath 145 ); 146 147 /** 148 Initialize block I/O device instance 149 150 @param Dev Instance of block I/O device instance 151 152 @retval TRUE Initialization succeeds. 153 @retval FALSE Initialization fails. 154 155 **/ 156 BOOLEAN 157 BiosInitBlockIo ( 158 IN BIOS_BLOCK_IO_DEV *Dev 159 ); 160 161 /** 162 Read BufferSize bytes from Lba into Buffer. 163 164 @param This Indicates a pointer to the calling context. 165 @param MediaId Id of the media, changes every time the media is replaced. 166 @param Lba The starting Logical Block Address to read from 167 @param BufferSize Size of Buffer, must be a multiple of device block size. 168 @param Buffer A pointer to the destination buffer for the data. The caller is 169 responsible for either having implicit or explicit ownership of the buffer. 170 171 @retval EFI_SUCCESS The data was read correctly from the device. 172 @retval EFI_DEVICE_ERROR The device reported an error while performing the read. 173 @retval EFI_NO_MEDIA There is no media in the device. 174 @retval EFI_MEDIA_CHANGED The MediaId does not matched the current device. 175 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 176 @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, 177 or the buffer is not on proper alignment. 178 179 **/ 180 EFI_STATUS 181 EFIAPI 182 Edd30BiosReadBlocks ( 183 IN EFI_BLOCK_IO_PROTOCOL *This, 184 IN UINT32 MediaId, 185 IN EFI_LBA Lba, 186 IN UINTN BufferSize, 187 OUT VOID *Buffer 188 ); 189 190 /** 191 Write BufferSize bytes from Lba into Buffer. 192 193 @param This Indicates a pointer to the calling context. 194 @param MediaId The media ID that the write request is for. 195 @param Lba The starting logical block address to be written. The caller is 196 responsible for writing to only legitimate locations. 197 @param BufferSize Size of Buffer, must be a multiple of device block size. 198 @param Buffer A pointer to the source buffer for the data. 199 200 @retval EFI_SUCCESS The data was written correctly to the device. 201 @retval EFI_WRITE_PROTECTED The device can not be written to. 202 @retval EFI_DEVICE_ERROR The device reported an error while performing the write. 203 @retval EFI_NO_MEDIA There is no media in the device. 204 @retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device. 205 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 206 @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, 207 or the buffer is not on proper alignment. 208 209 **/ 210 EFI_STATUS 211 EFIAPI 212 Edd30BiosWriteBlocks ( 213 IN EFI_BLOCK_IO_PROTOCOL *This, 214 IN UINT32 MediaId, 215 IN EFI_LBA Lba, 216 IN UINTN BufferSize, 217 OUT VOID *Buffer 218 ); 219 220 /** 221 Flush the Block Device. 222 223 @param This Indicates a pointer to the calling context. 224 225 @retval EFI_SUCCESS All outstanding data was written to the device 226 @retval EFI_DEVICE_ERROR The device reported an error while writting back the data 227 @retval EFI_NO_MEDIA There is no media in the device. 228 229 **/ 230 EFI_STATUS 231 EFIAPI 232 BiosBlockIoFlushBlocks ( 233 IN EFI_BLOCK_IO_PROTOCOL *This 234 ); 235 236 /** 237 Reset the Block Device. 238 239 @param This Indicates a pointer to the calling context. 240 @param ExtendedVerification Driver may perform diagnostics on reset. 241 242 @retval EFI_SUCCESS The device was reset. 243 @retval EFI_DEVICE_ERROR The device is not functioning properly and could 244 not be reset. 245 246 **/ 247 EFI_STATUS 248 EFIAPI 249 BiosBlockIoReset ( 250 IN EFI_BLOCK_IO_PROTOCOL *This, 251 IN BOOLEAN ExtendedVerification 252 ); 253 254 /** 255 Read BufferSize bytes from Lba into Buffer. 256 257 @param This Indicates a pointer to the calling context. 258 @param MediaId Id of the media, changes every time the media is replaced. 259 @param Lba The starting Logical Block Address to read from 260 @param BufferSize Size of Buffer, must be a multiple of device block size. 261 @param Buffer A pointer to the destination buffer for the data. The caller is 262 responsible for either having implicit or explicit ownership of the buffer. 263 264 @retval EFI_SUCCESS The data was read correctly from the device. 265 @retval EFI_DEVICE_ERROR The device reported an error while performing the read. 266 @retval EFI_NO_MEDIA There is no media in the device. 267 @retval EFI_MEDIA_CHANGED The MediaId does not matched the current device. 268 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 269 @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, 270 or the buffer is not on proper alignment. 271 272 **/ 273 EFI_STATUS 274 EFIAPI 275 Edd11BiosReadBlocks ( 276 IN EFI_BLOCK_IO_PROTOCOL *This, 277 IN UINT32 MediaId, 278 IN EFI_LBA Lba, 279 IN UINTN BufferSize, 280 OUT VOID *Buffer 281 ); 282 283 /** 284 Write BufferSize bytes from Lba into Buffer. 285 286 @param This Indicates a pointer to the calling context. 287 @param MediaId The media ID that the write request is for. 288 @param Lba The starting logical block address to be written. The caller is 289 responsible for writing to only legitimate locations. 290 @param BufferSize Size of Buffer, must be a multiple of device block size. 291 @param Buffer A pointer to the source buffer for the data. 292 293 @retval EFI_SUCCESS The data was written correctly to the device. 294 @retval EFI_WRITE_PROTECTED The device can not be written to. 295 @retval EFI_DEVICE_ERROR The device reported an error while performing the write. 296 @retval EFI_NO_MEDIA There is no media in the device. 297 @retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device. 298 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 299 @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, 300 or the buffer is not on proper alignment. 301 302 **/ 303 EFI_STATUS 304 EFIAPI 305 Edd11BiosWriteBlocks ( 306 IN EFI_BLOCK_IO_PROTOCOL *This, 307 IN UINT32 MediaId, 308 IN EFI_LBA Lba, 309 IN UINTN BufferSize, 310 OUT VOID *Buffer 311 ); 312 313 /** 314 Read BufferSize bytes from Lba into Buffer. 315 316 @param This Indicates a pointer to the calling context. 317 @param MediaId Id of the media, changes every time the media is replaced. 318 @param Lba The starting Logical Block Address to read from 319 @param BufferSize Size of Buffer, must be a multiple of device block size. 320 @param Buffer A pointer to the destination buffer for the data. The caller is 321 responsible for either having implicit or explicit ownership of the buffer. 322 323 @retval EFI_SUCCESS The data was read correctly from the device. 324 @retval EFI_DEVICE_ERROR The device reported an error while performing the read. 325 @retval EFI_NO_MEDIA There is no media in the device. 326 @retval EFI_MEDIA_CHANGED The MediaId does not matched the current device. 327 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 328 @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, 329 or the buffer is not on proper alignment. 330 331 **/ 332 EFI_STATUS 333 EFIAPI 334 BiosReadLegacyDrive ( 335 IN EFI_BLOCK_IO_PROTOCOL *This, 336 IN UINT32 MediaId, 337 IN EFI_LBA Lba, 338 IN UINTN BufferSize, 339 OUT VOID *Buffer 340 ); 341 342 /** 343 Write BufferSize bytes from Lba into Buffer. 344 345 @param This Indicates a pointer to the calling context. 346 @param MediaId The media ID that the write request is for. 347 @param Lba The starting logical block address to be written. The caller is 348 responsible for writing to only legitimate locations. 349 @param BufferSize Size of Buffer, must be a multiple of device block size. 350 @param Buffer A pointer to the source buffer for the data. 351 352 @retval EFI_SUCCESS The data was written correctly to the device. 353 @retval EFI_WRITE_PROTECTED The device can not be written to. 354 @retval EFI_DEVICE_ERROR The device reported an error while performing the write. 355 @retval EFI_NO_MEDIA There is no media in the device. 356 @retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device. 357 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 358 @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, 359 or the buffer is not on proper alignment. 360 361 **/ 362 EFI_STATUS 363 EFIAPI 364 BiosWriteLegacyDrive ( 365 IN EFI_BLOCK_IO_PROTOCOL *This, 366 IN UINT32 MediaId, 367 IN EFI_LBA Lba, 368 IN UINTN BufferSize, 369 OUT VOID *Buffer 370 ); 371 372 /** 373 Gets parameters of block I/O device. 374 375 @param BiosBlockIoDev Instance of block I/O device. 376 @param Drive Legacy drive. 377 378 @return Result of device parameter retrieval. 379 380 **/ 381 UINTN 382 Int13GetDeviceParameters ( 383 IN BIOS_BLOCK_IO_DEV *BiosBlockIoDev, 384 IN BIOS_LEGACY_DRIVE *Drive 385 ); 386 387 /** 388 Extension of INT13 call. 389 390 @param BiosBlockIoDev Instance of block I/O device. 391 @param Drive Legacy drive. 392 393 @return Result of this extension. 394 395 **/ 396 UINTN 397 Int13Extensions ( 398 IN BIOS_BLOCK_IO_DEV *BiosBlockIoDev, 399 IN BIOS_LEGACY_DRIVE *Drive 400 ); 401 402 /** 403 Gets parameters of legacy drive. 404 405 @param BiosBlockIoDev Instance of block I/O device. 406 @param Drive Legacy drive. 407 408 @return Result of drive parameter retrieval. 409 410 **/ 411 UINTN 412 GetDriveParameters ( 413 IN BIOS_BLOCK_IO_DEV *BiosBlockIoDev, 414 IN BIOS_LEGACY_DRIVE *Drive 415 ); 416 417 /** 418 Build device path for device. 419 420 @param BaseDevicePath Base device path. 421 @param Drive Legacy drive. 422 @param DevicePath Device path for output. 423 424 **/ 425 VOID 426 SetBiosInitBlockIoDevicePath ( 427 IN EFI_DEVICE_PATH_PROTOCOL *BaseDevicePath, 428 IN BIOS_LEGACY_DRIVE *Drive, 429 OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath 430 ); 431 432 #endif 433