• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Master header file for DiskIo driver. It includes the module private defininitions.
3 
4 Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _DISK_IO_H_
16 #define _DISK_IO_H_
17 
18 #include <Uefi.h>
19 #include <Protocol/BlockIo.h>
20 #include <Protocol/BlockIo2.h>
21 #include <Protocol/DiskIo2.h>
22 #include <Protocol/ComponentName.h>
23 #include <Protocol/DriverBinding.h>
24 #include <Protocol/DiskIo.h>
25 #include <Library/DebugLib.h>
26 #include <Library/UefiDriverEntryPoint.h>
27 #include <Library/UefiLib.h>
28 #include <Library/BaseLib.h>
29 #include <Library/BaseMemoryLib.h>
30 #include <Library/MemoryAllocationLib.h>
31 #include <Library/UefiBootServicesTableLib.h>
32 
33 #define DISK_IO_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('d', 's', 'k', 'I')
34 typedef struct {
35   UINT32                          Signature;
36 
37   EFI_DISK_IO_PROTOCOL            DiskIo;
38   EFI_DISK_IO2_PROTOCOL           DiskIo2;
39   EFI_BLOCK_IO_PROTOCOL           *BlockIo;
40   EFI_BLOCK_IO2_PROTOCOL          *BlockIo2;
41 
42   UINT8                           *SharedWorkingBuffer;
43 
44   EFI_LOCK                        TaskQueueLock;
45   LIST_ENTRY                      TaskQueue;
46 } DISK_IO_PRIVATE_DATA;
47 #define DISK_IO_PRIVATE_DATA_FROM_DISK_IO(a)  CR (a, DISK_IO_PRIVATE_DATA, DiskIo,  DISK_IO_PRIVATE_DATA_SIGNATURE)
48 #define DISK_IO_PRIVATE_DATA_FROM_DISK_IO2(a) CR (a, DISK_IO_PRIVATE_DATA, DiskIo2, DISK_IO_PRIVATE_DATA_SIGNATURE)
49 
50 #define DISK_IO2_TASK_SIGNATURE   SIGNATURE_32 ('d', 'i', 'a', 't')
51 typedef struct {
52   UINT32                          Signature;
53   LIST_ENTRY                      Link;     /// < link to other task
54   EFI_LOCK                        SubtasksLock;
55   LIST_ENTRY                      Subtasks; /// < header of subtasks
56   EFI_DISK_IO2_TOKEN              *Token;
57   DISK_IO_PRIVATE_DATA            *Instance;
58 } DISK_IO2_TASK;
59 
60 #define DISK_IO2_FLUSH_TASK_SIGNATURE SIGNATURE_32 ('d', 'i', 'f', 't')
61 typedef struct {
62   UINT32                          Signature;
63   EFI_BLOCK_IO2_TOKEN             BlockIo2Token;
64   EFI_DISK_IO2_TOKEN              *Token;
65 } DISK_IO2_FLUSH_TASK;
66 
67 #define DISK_IO_SUBTASK_SIGNATURE SIGNATURE_32 ('d', 'i', 's', 't')
68 typedef struct {
69   //
70   // UnderRun:  Offset != 0, Length < BlockSize
71   // OverRun:   Offset == 0, Length < BlockSize
72   // Middle:    Offset is block aligned, Length is multiple of block size
73   //
74   UINT32                          Signature;
75   LIST_ENTRY                      Link;
76   BOOLEAN                         Write;
77   UINT64                          Lba;
78   UINT32                          Offset;
79   UINTN                           Length;
80   UINT8                           *WorkingBuffer; /// < NULL indicates using "Buffer" directly
81   UINT8                           *Buffer;
82   BOOLEAN                         Blocking;
83 
84   //
85   // Following fields are for DiskIo2
86   //
87   DISK_IO2_TASK                   *Task;
88   EFI_BLOCK_IO2_TOKEN             BlockIo2Token;
89 } DISK_IO_SUBTASK;
90 
91 //
92 // Global Variables
93 //
94 extern EFI_DRIVER_BINDING_PROTOCOL   gDiskIoDriverBinding;
95 extern EFI_COMPONENT_NAME_PROTOCOL   gDiskIoComponentName;
96 extern EFI_COMPONENT_NAME2_PROTOCOL  gDiskIoComponentName2;
97 
98 //
99 // Prototypes
100 // Driver model protocol interface
101 //
102 /**
103   Test to see if this driver supports ControllerHandle.
104 
105   @param  This                Protocol instance pointer.
106   @param  ControllerHandle    Handle of device to test
107   @param  RemainingDevicePath Optional parameter use to pick a specific child
108                               device to start.
109 
110   @retval EFI_SUCCESS         This driver supports this device
111   @retval EFI_ALREADY_STARTED This driver is already running on this device
112   @retval other               This driver does not support this device
113 
114 **/
115 EFI_STATUS
116 EFIAPI
117 DiskIoDriverBindingSupported (
118   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
119   IN EFI_HANDLE                   ControllerHandle,
120   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
121   );
122 
123 /**
124   Start this driver on ControllerHandle by opening a Block IO protocol and
125   installing a Disk IO protocol on ControllerHandle.
126 
127   @param  This                 Protocol instance pointer.
128   @param  ControllerHandle     Handle of device to bind driver to
129   @param  RemainingDevicePath  Optional parameter use to pick a specific child
130                                device to start.
131 
132   @retval EFI_SUCCESS          This driver is added to ControllerHandle
133   @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle
134   @retval other                This driver does not support this device
135 
136 **/
137 EFI_STATUS
138 EFIAPI
139 DiskIoDriverBindingStart (
140   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
141   IN EFI_HANDLE                   ControllerHandle,
142   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
143   );
144 
145 /**
146   Stop this driver on ControllerHandle by removing Disk IO protocol and closing
147   the Block IO protocol on ControllerHandle.
148 
149   @param  This              Protocol instance pointer.
150   @param  ControllerHandle  Handle of device to stop driver on
151   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
152                             children is zero stop the entire bus driver.
153   @param  ChildHandleBuffer List of Child Handles to Stop.
154 
155   @retval EFI_SUCCESS       This driver is removed ControllerHandle
156   @retval other             This driver was not removed from this device
157 
158 **/
159 EFI_STATUS
160 EFIAPI
161 DiskIoDriverBindingStop (
162   IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
163   IN  EFI_HANDLE                     ControllerHandle,
164   IN  UINTN                          NumberOfChildren,
165   IN  EFI_HANDLE                     *ChildHandleBuffer
166   );
167 
168 //
169 // Disk I/O Protocol Interface
170 //
171 /**
172   Read BufferSize bytes from Offset into Buffer.
173   Reads may support reads that are not aligned on
174   sector boundaries. There are three cases:
175     UnderRun - The first byte is not on a sector boundary or the read request is
176                less than a sector in length.
177     Aligned  - A read of N contiguous sectors.
178     OverRun  - The last byte is not on a sector boundary.
179 
180   @param  This                  Protocol instance pointer.
181   @param  MediaId               Id of the media, changes every time the media is replaced.
182   @param  Offset                The starting byte offset to read from
183   @param  BufferSize            Size of Buffer
184   @param  Buffer                Buffer containing read data
185 
186   @retval EFI_SUCCESS           The data was read correctly from the device.
187   @retval EFI_DEVICE_ERROR      The device reported an error while performing the read.
188   @retval EFI_NO_MEDIA          There is no media in the device.
189   @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.
190   @retval EFI_INVALID_PARAMETER The read request contains device addresses that are not
191                                 valid for the device.
192 
193 **/
194 EFI_STATUS
195 EFIAPI
196 DiskIoReadDisk (
197   IN EFI_DISK_IO_PROTOCOL  *This,
198   IN UINT32                MediaId,
199   IN UINT64                Offset,
200   IN UINTN                 BufferSize,
201   OUT VOID                 *Buffer
202   );
203 
204 /**
205   Writes BufferSize bytes from Buffer into Offset.
206   Writes may require a read modify write to support writes that are not
207   aligned on sector boundaries. There are three cases:
208     UnderRun - The first byte is not on a sector boundary or the write request
209                is less than a sector in length. Read modify write is required.
210     Aligned  - A write of N contiguous sectors.
211     OverRun  - The last byte is not on a sector boundary. Read modified write
212                required.
213 
214   @param  This       Protocol instance pointer.
215   @param  MediaId    Id of the media, changes every time the media is replaced.
216   @param  Offset     The starting byte offset to read from
217   @param  BufferSize Size of Buffer
218   @param  Buffer     Buffer containing read data
219 
220   @retval EFI_SUCCESS           The data was written correctly to the device.
221   @retval EFI_WRITE_PROTECTED   The device can not be written to.
222   @retval EFI_DEVICE_ERROR      The device reported an error while performing the write.
223   @retval EFI_NO_MEDIA          There is no media in the device.
224   @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.
225   @retval EFI_INVALID_PARAMETER The write request contains device addresses that are not
226                                  valid for the device.
227 
228 **/
229 EFI_STATUS
230 EFIAPI
231 DiskIoWriteDisk (
232   IN EFI_DISK_IO_PROTOCOL  *This,
233   IN UINT32                MediaId,
234   IN UINT64                Offset,
235   IN UINTN                 BufferSize,
236   IN VOID                  *Buffer
237   );
238 
239 
240 /**
241   Terminate outstanding asynchronous requests to a device.
242 
243   @param This                   Indicates a pointer to the calling context.
244 
245   @retval EFI_SUCCESS           All outstanding requests were successfully terminated.
246   @retval EFI_DEVICE_ERROR      The device reported an error while performing the cancel
247                                 operation.
248 **/
249 EFI_STATUS
250 EFIAPI
251 DiskIo2Cancel (
252   IN EFI_DISK_IO2_PROTOCOL *This
253   );
254 
255 /**
256   Reads a specified number of bytes from a device.
257 
258   @param This                   Indicates a pointer to the calling context.
259   @param MediaId                ID of the medium to be read.
260   @param Offset                 The starting byte offset on the logical block I/O device to read from.
261   @param Token                  A pointer to the token associated with the transaction.
262                                 If this field is NULL, synchronous/blocking IO is performed.
263   @param  BufferSize            The size in bytes of Buffer. The number of bytes to read from the device.
264   @param  Buffer                A pointer to the destination buffer for the data.
265                                 The caller is responsible either having implicit or explicit ownership of the buffer.
266 
267   @retval EFI_SUCCESS           If Event is NULL (blocking I/O): The data was read correctly from the device.
268                                 If Event is not NULL (asynchronous I/O): The request was successfully queued for processing.
269                                                                          Event will be signaled upon completion.
270   @retval EFI_DEVICE_ERROR      The device reported an error while performing the write.
271   @retval EFI_NO_MEDIA          There is no medium in the device.
272   @retval EFI_MEDIA_CHNAGED     The MediaId is not for the current medium.
273   @retval EFI_INVALID_PARAMETER The read request contains device addresses that are not valid for the device.
274   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
275 
276 **/
277 EFI_STATUS
278 EFIAPI
279 DiskIo2ReadDiskEx (
280   IN EFI_DISK_IO2_PROTOCOL        *This,
281   IN UINT32                       MediaId,
282   IN UINT64                       Offset,
283   IN OUT EFI_DISK_IO2_TOKEN       *Token,
284   IN UINTN                        BufferSize,
285   OUT VOID                        *Buffer
286   );
287 
288 /**
289   Writes a specified number of bytes to a device.
290 
291   @param This        Indicates a pointer to the calling context.
292   @param MediaId     ID of the medium to be written.
293   @param Offset      The starting byte offset on the logical block I/O device to write to.
294   @param Token       A pointer to the token associated with the transaction.
295                      If this field is NULL, synchronous/blocking IO is performed.
296   @param BufferSize  The size in bytes of Buffer. The number of bytes to write to the device.
297   @param Buffer      A pointer to the buffer containing the data to be written.
298 
299   @retval EFI_SUCCESS           If Event is NULL (blocking I/O): The data was written correctly to the device.
300                                 If Event is not NULL (asynchronous I/O): The request was successfully queued for processing.
301                                                                          Event will be signaled upon completion.
302   @retval EFI_WRITE_PROTECTED   The device cannot be written to.
303   @retval EFI_DEVICE_ERROR      The device reported an error while performing the write operation.
304   @retval EFI_NO_MEDIA          There is no medium in the device.
305   @retval EFI_MEDIA_CHNAGED     The MediaId is not for the current medium.
306   @retval EFI_INVALID_PARAMETER The write request contains device addresses that are not valid for the device.
307   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
308 
309 **/
310 EFI_STATUS
311 EFIAPI
312 DiskIo2WriteDiskEx (
313   IN EFI_DISK_IO2_PROTOCOL        *This,
314   IN UINT32                       MediaId,
315   IN UINT64                       Offset,
316   IN EFI_DISK_IO2_TOKEN           *Token,
317   IN UINTN                        BufferSize,
318   IN VOID                         *Buffer
319   );
320 
321 /**
322   Flushes all modified data to the physical device.
323 
324   @param This        Indicates a pointer to the calling context.
325   @param Token       A pointer to the token associated with the transaction.
326                      If this field is NULL, synchronous/blocking IO is performed.
327 
328   @retval EFI_SUCCESS           If Event is NULL (blocking I/O): The data was flushed successfully to the device.
329                                 If Event is not NULL (asynchronous I/O): The request was successfully queued for processing.
330                                                                          Event will be signaled upon completion.
331   @retval EFI_WRITE_PROTECTED   The device cannot be written to.
332   @retval EFI_DEVICE_ERROR      The device reported an error while performing the write operation.
333   @retval EFI_NO_MEDIA          There is no medium in the device.
334   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
335 **/
336 EFI_STATUS
337 EFIAPI
338 DiskIo2FlushDiskEx (
339   IN EFI_DISK_IO2_PROTOCOL        *This,
340   IN OUT EFI_DISK_IO2_TOKEN       *Token
341   );
342 
343 //
344 // EFI Component Name Functions
345 //
346 /**
347   Retrieves a Unicode string that is the user readable name of the driver.
348 
349   This function retrieves the user readable name of a driver in the form of a
350   Unicode string. If the driver specified by This has a user readable name in
351   the language specified by Language, then a pointer to the driver name is
352   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
353   by This does not support the language specified by Language,
354   then EFI_UNSUPPORTED is returned.
355 
356   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
357                                 EFI_COMPONENT_NAME_PROTOCOL instance.
358 
359   @param  Language[in]          A pointer to a Null-terminated ASCII string
360                                 array indicating the language. This is the
361                                 language of the driver name that the caller is
362                                 requesting, and it must match one of the
363                                 languages specified in SupportedLanguages. The
364                                 number of languages supported by a driver is up
365                                 to the driver writer. Language is specified
366                                 in RFC 4646 or ISO 639-2 language code format.
367 
368   @param  DriverName[out]       A pointer to the Unicode string to return.
369                                 This Unicode string is the name of the
370                                 driver specified by This in the language
371                                 specified by Language.
372 
373   @retval EFI_SUCCESS           The Unicode string for the Driver specified by
374                                 This and the language specified by Language was
375                                 returned in DriverName.
376 
377   @retval EFI_INVALID_PARAMETER Language is NULL.
378 
379   @retval EFI_INVALID_PARAMETER DriverName is NULL.
380 
381   @retval EFI_UNSUPPORTED       The driver specified by This does not support
382                                 the language specified by Language.
383 
384 **/
385 EFI_STATUS
386 EFIAPI
387 DiskIoComponentNameGetDriverName (
388   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
389   IN  CHAR8                        *Language,
390   OUT CHAR16                       **DriverName
391   );
392 
393 
394 /**
395   Retrieves a Unicode string that is the user readable name of the controller
396   that is being managed by a driver.
397 
398   This function retrieves the user readable name of the controller specified by
399   ControllerHandle and ChildHandle in the form of a Unicode string. If the
400   driver specified by This has a user readable name in the language specified by
401   Language, then a pointer to the controller name is returned in ControllerName,
402   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
403   managing the controller specified by ControllerHandle and ChildHandle,
404   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
405   support the language specified by Language, then EFI_UNSUPPORTED is returned.
406 
407   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
408                                 EFI_COMPONENT_NAME_PROTOCOL instance.
409 
410   @param  ControllerHandle[in]  The handle of a controller that the driver
411                                 specified by This is managing.  This handle
412                                 specifies the controller whose name is to be
413                                 returned.
414 
415   @param  ChildHandle[in]       The handle of the child controller to retrieve
416                                 the name of.  This is an optional parameter that
417                                 may be NULL.  It will be NULL for device
418                                 drivers.  It will also be NULL for a bus drivers
419                                 that wish to retrieve the name of the bus
420                                 controller.  It will not be NULL for a bus
421                                 driver that wishes to retrieve the name of a
422                                 child controller.
423 
424   @param  Language[in]          A pointer to a Null-terminated ASCII string
425                                 array indicating the language.  This is the
426                                 language of the driver name that the caller is
427                                 requesting, and it must match one of the
428                                 languages specified in SupportedLanguages. The
429                                 number of languages supported by a driver is up
430                                 to the driver writer. Language is specified in
431                                 RFC 4646 or ISO 639-2 language code format.
432 
433   @param  ControllerName[out]   A pointer to the Unicode string to return.
434                                 This Unicode string is the name of the
435                                 controller specified by ControllerHandle and
436                                 ChildHandle in the language specified by
437                                 Language from the point of view of the driver
438                                 specified by This.
439 
440   @retval EFI_SUCCESS           The Unicode string for the user readable name in
441                                 the language specified by Language for the
442                                 driver specified by This was returned in
443                                 DriverName.
444 
445   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
446 
447   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
448                                 EFI_HANDLE.
449 
450   @retval EFI_INVALID_PARAMETER Language is NULL.
451 
452   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
453 
454   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
455                                 managing the controller specified by
456                                 ControllerHandle and ChildHandle.
457 
458   @retval EFI_UNSUPPORTED       The driver specified by This does not support
459                                 the language specified by Language.
460 
461 **/
462 EFI_STATUS
463 EFIAPI
464 DiskIoComponentNameGetControllerName (
465   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
466   IN  EFI_HANDLE                                      ControllerHandle,
467   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
468   IN  CHAR8                                           *Language,
469   OUT CHAR16                                          **ControllerName
470   );
471 
472 
473 #endif
474