]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Bus / Scsi / ScsiBusDxe / ScsiBus.h
1 /** @file
2 Header file for SCSI Bus Driver.
3
4 Copyright (c) 2006 - 2018, 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 _SCSI_BUS_H_
16 #define _SCSI_BUS_H_
17
18
19 #include <Uefi.h>
20
21 #include <Protocol/ScsiPassThru.h>
22 #include <Protocol/ScsiPassThruExt.h>
23 #include <Protocol/ScsiIo.h>
24 #include <Protocol/ComponentName.h>
25 #include <Protocol/DriverBinding.h>
26 #include <Protocol/DevicePath.h>
27
28 #include <Library/DebugLib.h>
29 #include <Library/UefiDriverEntryPoint.h>
30 #include <Library/UefiLib.h>
31 #include <Library/BaseMemoryLib.h>
32 #include <Library/MemoryAllocationLib.h>
33 #include <Library/UefiScsiLib.h>
34 #include <Library/UefiBootServicesTableLib.h>
35 #include <Library/DevicePathLib.h>
36 #include <Library/ReportStatusCodeLib.h>
37
38 #include <IndustryStandard/Scsi.h>
39
40 #define SCSI_IO_DEV_SIGNATURE SIGNATURE_32 ('s', 'c', 'i', 'o')
41
42 typedef union {
43 UINT32 Scsi;
44 UINT8 ExtScsi[4];
45 } SCSI_ID;
46
47 typedef struct _SCSI_TARGET_ID {
48 SCSI_ID ScsiId;
49 UINT8 ExtScsiId[12];
50 }SCSI_TARGET_ID;
51
52
53 typedef struct {
54 VOID *Data1;
55 VOID *Data2;
56 } SCSI_EVENT_DATA;
57
58 //
59 // SCSI Bus Controller device strcuture
60 //
61 #define SCSI_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('s', 'c', 's', 'i')
62
63 //
64 // SCSI Bus Timeout Experience Value
65 //
66 #define SCSI_BUS_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3)
67
68 //
69 // The ScsiBusProtocol is just used to locate ScsiBusDev
70 // structure in the SCSIBusDriverBindingStop(). Then we can
71 // Close all opened protocols and release this structure.
72 // ScsiBusProtocol is the private protocol.
73 // gEfiCallerIdGuid will be used as its protocol guid.
74 //
75 typedef struct _EFI_SCSI_BUS_PROTOCOL {
76 UINT64 Reserved;
77 } EFI_SCSI_BUS_PROTOCOL;
78
79 typedef struct _SCSI_BUS_DEVICE {
80 UINTN Signature;
81 EFI_SCSI_BUS_PROTOCOL BusIdentify;
82 BOOLEAN ExtScsiSupport;
83 EFI_SCSI_PASS_THRU_PROTOCOL *ScsiInterface;
84 EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiInterface;
85 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
86 } SCSI_BUS_DEVICE;
87
88 #define SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS(a) CR (a, SCSI_BUS_DEVICE, BusIdentify, SCSI_BUS_DEVICE_SIGNATURE)
89
90 typedef struct {
91 UINT32 Signature;
92 EFI_HANDLE Handle;
93 EFI_SCSI_IO_PROTOCOL ScsiIo;
94 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
95 BOOLEAN ExtScsiSupport;
96 EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;
97 EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;
98 SCSI_BUS_DEVICE *ScsiBusDeviceData;
99 SCSI_TARGET_ID Pun;
100 UINT64 Lun;
101 UINT8 ScsiDeviceType;
102 UINT8 ScsiVersion;
103 BOOLEAN RemovableDevice;
104 } SCSI_IO_DEV;
105
106 #define SCSI_IO_DEV_FROM_THIS(a) CR (a, SCSI_IO_DEV, ScsiIo, SCSI_IO_DEV_SIGNATURE)
107
108 //
109 // Global Variables
110 //
111 extern EFI_DRIVER_BINDING_PROTOCOL gScsiBusDriverBinding;
112 extern EFI_COMPONENT_NAME_PROTOCOL gScsiBusComponentName;
113 extern EFI_COMPONENT_NAME2_PROTOCOL gScsiBusComponentName2;
114
115 /**
116 Test to see if this driver supports ControllerHandle.
117
118 This service is called by the EFI boot service ConnectController(). In order
119 to make drivers as small as possible, there are a few calling restrictions for
120 this service. ConnectController() must follow these calling restrictions. If
121 any other agent wishes to call Supported() it must also follow these calling
122 restrictions.
123
124 @param This Protocol instance pointer.
125 @param ControllerHandle Handle of device to test
126 @param RemainingDevicePath Optional parameter use to pick a specific child
127 device to start.
128
129 @retval EFI_SUCCESS This driver supports this device
130 @retval EFI_ALREADY_STARTED This driver is already running on this device
131 @retval other This driver does not support this device
132
133 **/
134 EFI_STATUS
135 EFIAPI
136 SCSIBusDriverBindingSupported (
137 IN EFI_DRIVER_BINDING_PROTOCOL *This,
138 IN EFI_HANDLE Controller,
139 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
140 );
141
142 /**
143 Start this driver on ControllerHandle.
144
145 This service is called by the EFI boot service ConnectController(). In order
146 to make drivers as small as possible, there are a few calling restrictions for
147 this service. ConnectController() must follow these calling restrictions. If
148 any other agent wishes to call Start() it must also follow these calling
149 restrictions.
150
151 @param This Protocol instance pointer.
152 @param ControllerHandle Handle of device to bind driver to
153 @param RemainingDevicePath Optional parameter use to pick a specific child
154 device to start.
155
156 @retval EFI_SUCCESS This driver is added to ControllerHandle
157 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
158 @retval other This driver does not support this device
159
160 **/
161 EFI_STATUS
162 EFIAPI
163 SCSIBusDriverBindingStart (
164 IN EFI_DRIVER_BINDING_PROTOCOL *This,
165 IN EFI_HANDLE Controller,
166 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
167 );
168
169 /**
170 Stop this driver on ControllerHandle.
171
172 This service is called by the EFI boot service DisconnectController().
173 In order to make drivers as small as possible, there are a few calling
174 restrictions for this service. DisconnectController() must follow these
175 calling restrictions. If any other agent wishes to call Stop() it must also
176 follow these calling restrictions.
177
178 @param This Protocol instance pointer.
179 @param ControllerHandle Handle of device to stop driver on
180 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
181 children is zero stop the entire bus driver.
182 @param ChildHandleBuffer List of Child Handles to Stop.
183
184 @retval EFI_SUCCESS This driver is removed ControllerHandle
185 @retval other This driver was not removed from this device
186
187 **/
188 EFI_STATUS
189 EFIAPI
190 SCSIBusDriverBindingStop (
191 IN EFI_DRIVER_BINDING_PROTOCOL *This,
192 IN EFI_HANDLE Controller,
193 IN UINTN NumberOfChildren,
194 IN EFI_HANDLE *ChildHandleBuffer
195 );
196
197 //
198 // EFI Component Name Functions
199 //
200 /**
201 Retrieves a Unicode string that is the user readable name of the driver.
202
203 This function retrieves the user readable name of a driver in the form of a
204 Unicode string. If the driver specified by This has a user readable name in
205 the language specified by Language, then a pointer to the driver name is
206 returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
207 by This does not support the language specified by Language,
208 then EFI_UNSUPPORTED is returned.
209
210 @param This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
211 EFI_COMPONENT_NAME_PROTOCOL instance.
212
213 @param Language A pointer to a Null-terminated ASCII string
214 array indicating the language. This is the
215 language of the driver name that the caller is
216 requesting, and it must match one of the
217 languages specified in SupportedLanguages. The
218 number of languages supported by a driver is up
219 to the driver writer. Language is specified
220 in RFC 4646 or ISO 639-2 language code format.
221
222 @param DriverName A pointer to the Unicode string to return.
223 This Unicode string is the name of the
224 driver specified by This in the language
225 specified by Language.
226
227 @retval EFI_SUCCESS The Unicode string for the Driver specified by
228 This and the language specified by Language was
229 returned in DriverName.
230
231 @retval EFI_INVALID_PARAMETER Language is NULL.
232
233 @retval EFI_INVALID_PARAMETER DriverName is NULL.
234
235 @retval EFI_UNSUPPORTED The driver specified by This does not support
236 the language specified by Language.
237
238 **/
239 EFI_STATUS
240 EFIAPI
241 ScsiBusComponentNameGetDriverName (
242 IN EFI_COMPONENT_NAME_PROTOCOL *This,
243 IN CHAR8 *Language,
244 OUT CHAR16 **DriverName
245 );
246
247 /**
248 Retrieves a Unicode string that is the user readable name of the controller
249 that is being managed by a driver.
250
251 This function retrieves the user readable name of the controller specified by
252 ControllerHandle and ChildHandle in the form of a Unicode string. If the
253 driver specified by This has a user readable name in the language specified by
254 Language, then a pointer to the controller name is returned in ControllerName,
255 and EFI_SUCCESS is returned. If the driver specified by This is not currently
256 managing the controller specified by ControllerHandle and ChildHandle,
257 then EFI_UNSUPPORTED is returned. If the driver specified by This does not
258 support the language specified by Language, then EFI_UNSUPPORTED is returned.
259
260 @param This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
261 EFI_COMPONENT_NAME_PROTOCOL instance.
262
263 @param ControllerHandle The handle of a controller that the driver
264 specified by This is managing. This handle
265 specifies the controller whose name is to be
266 returned.
267
268 @param ChildHandle The handle of the child controller to retrieve
269 the name of. This is an optional parameter that
270 may be NULL. It will be NULL for device
271 drivers. It will also be NULL for a bus drivers
272 that wish to retrieve the name of the bus
273 controller. It will not be NULL for a bus
274 driver that wishes to retrieve the name of a
275 child controller.
276
277 @param Language A pointer to a Null-terminated ASCII string
278 array indicating the language. This is the
279 language of the driver name that the caller is
280 requesting, and it must match one of the
281 languages specified in SupportedLanguages. The
282 number of languages supported by a driver is up
283 to the driver writer. Language is specified in
284 RFC 4646 or ISO 639-2 language code format.
285
286 @param ControllerName A pointer to the Unicode string to return.
287 This Unicode string is the name of the
288 controller specified by ControllerHandle and
289 ChildHandle in the language specified by
290 Language from the point of view of the driver
291 specified by This.
292
293 @retval EFI_SUCCESS The Unicode string for the user readable name in
294 the language specified by Language for the
295 driver specified by This was returned in
296 DriverName.
297
298 @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
299
300 @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
301 EFI_HANDLE.
302
303 @retval EFI_INVALID_PARAMETER Language is NULL.
304
305 @retval EFI_INVALID_PARAMETER ControllerName is NULL.
306
307 @retval EFI_UNSUPPORTED The driver specified by This is not currently
308 managing the controller specified by
309 ControllerHandle and ChildHandle.
310
311 @retval EFI_UNSUPPORTED The driver specified by This does not support
312 the language specified by Language.
313
314 **/
315 EFI_STATUS
316 EFIAPI
317 ScsiBusComponentNameGetControllerName (
318 IN EFI_COMPONENT_NAME_PROTOCOL *This,
319 IN EFI_HANDLE ControllerHandle,
320 IN EFI_HANDLE ChildHandle OPTIONAL,
321 IN CHAR8 *Language,
322 OUT CHAR16 **ControllerName
323 );
324
325 /**
326 Retrieves the device type information of the SCSI Controller.
327
328 @param This Protocol instance pointer.
329 @param DeviceType A pointer to the device type information retrieved from
330 the SCSI Controller.
331
332 @retval EFI_SUCCESS Retrieves the device type information successfully.
333 @retval EFI_INVALID_PARAMETER The DeviceType is NULL.
334
335 **/
336 EFI_STATUS
337 EFIAPI
338 ScsiGetDeviceType (
339 IN EFI_SCSI_IO_PROTOCOL *This,
340 OUT UINT8 *DeviceType
341 );
342
343 /**
344 Retrieves the device location in the SCSI channel.
345
346 @param This Protocol instance pointer.
347 @param Target A pointer to the Target ID of a SCSI device
348 on the SCSI channel.
349 @param Lun A pointer to the LUN of the SCSI device on
350 the SCSI channel.
351
352 @retval EFI_SUCCESS Retrieves the device location successfully.
353 @retval EFI_INVALID_PARAMETER The Target or Lun is NULL.
354
355 **/
356 EFI_STATUS
357 EFIAPI
358 ScsiGetDeviceLocation (
359 IN EFI_SCSI_IO_PROTOCOL *This,
360 IN OUT UINT8 **Target,
361 OUT UINT64 *Lun
362 );
363
364 /**
365 Resets the SCSI Bus that the SCSI Controller is attached to.
366
367 @param This Protocol instance pointer.
368
369 @retval EFI_SUCCESS The SCSI bus is reset successfully.
370 @retval EFI_DEVICE_ERROR Errors encountered when resetting the SCSI bus.
371 @retval EFI_UNSUPPORTED The bus reset operation is not supported by the
372 SCSI Host Controller.
373 @retval EFI_TIMEOUT A timeout occurred while attempting to reset
374 the SCSI bus.
375 **/
376 EFI_STATUS
377 EFIAPI
378 ScsiResetBus (
379 IN EFI_SCSI_IO_PROTOCOL *This
380 );
381
382 /**
383 Resets the SCSI Controller that the device handle specifies.
384
385 @param This Protocol instance pointer.
386
387 @retval EFI_SUCCESS Reset the SCSI controller successfully.
388 @retval EFI_DEVICE_ERROR Errors are encountered when resetting the SCSI Controller.
389 @retval EFI_UNSUPPORTED The SCSI bus does not support a device reset operation.
390 @retval EFI_TIMEOUT A timeout occurred while attempting to reset the
391 SCSI Controller.
392 **/
393 EFI_STATUS
394 EFIAPI
395 ScsiResetDevice (
396 IN EFI_SCSI_IO_PROTOCOL *This
397 );
398
399 /**
400 Sends a SCSI Request Packet to the SCSI Controller for execution.
401
402 @param This Protocol instance pointer.
403 @param CommandPacket The SCSI request packet to send to the SCSI
404 Controller specified by the device handle.
405 @param Event If the SCSI bus where the SCSI device is attached
406 does not support non-blocking I/O, then Event is
407 ignored, and blocking I/O is performed.
408 If Event is NULL, then blocking I/O is performed.
409 If Event is not NULL and non-blocking I/O is
410 supported, then non-blocking I/O is performed,
411 and Event will be signaled when the SCSI Request
412 Packet completes.
413
414 @retval EFI_SUCCESS The SCSI Request Packet was sent by the host
415 successfully, and TransferLength bytes were
416 transferred to/from DataBuffer.See
417 HostAdapterStatus, TargetStatus,
418 SenseDataLength, and SenseData in that order
419 for additional status information.
420 @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was executed,
421 but the entire DataBuffer could not be transferred.
422 The actual number of bytes transferred is returned
423 in TransferLength. See HostAdapterStatus,
424 TargetStatus, SenseDataLength, and SenseData in
425 that order for additional status information.
426 @retval EFI_NOT_READY The SCSI Request Packet could not be sent because
427 there are too many SCSI Command Packets already
428 queued.The caller may retry again later.
429 @retval EFI_DEVICE_ERROR A device error occurred while attempting to send
430 the SCSI Request Packet. See HostAdapterStatus,
431 TargetStatus, SenseDataLength, and SenseData in
432 that order for additional status information.
433 @retval EFI_INVALID_PARAMETER The contents of CommandPacket are invalid.
434 The SCSI Request Packet was not sent, so no
435 additional status information is available.
436 @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet
437 is not supported by the SCSI initiator(i.e., SCSI
438 Host Controller). The SCSI Request Packet was not
439 sent, so no additional status information is
440 available.
441 @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI
442 Request Packet to execute. See HostAdapterStatus,
443 TargetStatus, SenseDataLength, and SenseData in
444 that order for additional status information.
445 **/
446 EFI_STATUS
447 EFIAPI
448 ScsiExecuteSCSICommand (
449 IN EFI_SCSI_IO_PROTOCOL *This,
450 IN OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *CommandPacket,
451 IN EFI_EVENT Event OPTIONAL
452 );
453
454 /**
455 Scan SCSI Bus to discover the device, and attach ScsiIoProtocol to it.
456
457 @param This Protocol instance pointer
458 @param Controller Controller handle
459 @param TargetId Tartget to be scanned
460 @param Lun The Lun of the SCSI device on the SCSI channel.
461 @param ScsiBusDev The pointer of SCSI_BUS_DEVICE
462
463 @retval EFI_SUCCESS Successfully to discover the device and attach
464 ScsiIoProtocol to it.
465 @retval EFI_OUT_OF_RESOURCES Fail to discover the device.
466
467 **/
468 EFI_STATUS
469 EFIAPI
470 ScsiScanCreateDevice (
471 IN EFI_DRIVER_BINDING_PROTOCOL *This,
472 IN EFI_HANDLE Controller,
473 IN SCSI_TARGET_ID *TargetId,
474 IN UINT64 Lun,
475 IN OUT SCSI_BUS_DEVICE *ScsiBusDev
476 );
477
478 /**
479 Discovery SCSI Device
480
481 @param ScsiIoDevice The pointer of SCSI_IO_DEV
482
483 @retval TRUE Find SCSI Device and verify it.
484 @retval FALSE Unable to find SCSI Device.
485
486 **/
487 BOOLEAN
488 DiscoverScsiDevice (
489 IN OUT SCSI_IO_DEV *ScsiIoDevice
490 );
491
492 #endif