1 /** @file
2   Header file for Sata Controller driver.
3 
4   Copyright (c) 2011 - 2016, 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 _SATA_CONTROLLER_H_
16 #define _SATA_CONTROLLER_H_
17 
18 #include <Uefi.h>
19 
20 #include <IndustryStandard/Pci.h>
21 
22 #include <Protocol/ComponentName.h>
23 #include <Protocol/DriverBinding.h>
24 #include <Protocol/PciIo.h>
25 #include <Protocol/IdeControllerInit.h>
26 
27 #include <Library/BaseLib.h>
28 #include <Library/BaseMemoryLib.h>
29 #include <Library/DebugLib.h>
30 #include <Library/UefiLib.h>
31 #include <Library/UefiDriverEntryPoint.h>
32 #include <Library/MemoryAllocationLib.h>
33 #include <Library/UefiBootServicesTableLib.h>
34 
35 //
36 // Global Variables definitions
37 //
38 extern EFI_DRIVER_BINDING_PROTOCOL  gSataControllerDriverBinding;
39 extern EFI_COMPONENT_NAME_PROTOCOL  gSataControllerComponentName;
40 extern EFI_COMPONENT_NAME2_PROTOCOL gSataControllerComponentName2;
41 
42 #define AHCI_BAR_INDEX 0x05
43 #define R_AHCI_CAP 0x0
44 #define   B_AHCI_CAP_NPS (BIT4 | BIT3 | BIT2 | BIT1 | BIT0) // Number of Ports
45 #define   B_AHCI_CAP_SPM BIT17                              // Supports Port Multiplier
46 
47 ///
48 /// AHCI each channel can have up to 1 device
49 ///
50 #define AHCI_MAX_DEVICES       0x01
51 
52 ///
53 /// AHCI each channel can have 15 devices in the presence of a multiplier
54 ///
55 #define AHCI_MULTI_MAX_DEVICES 0x0F
56 
57 ///
58 /// IDE supports 2 channel max
59 ///
60 #define IDE_MAX_CHANNEL 0x02
61 
62 ///
63 /// IDE supports 2 devices max
64 ///
65 #define IDE_MAX_DEVICES 0x02
66 
67 #define SATA_ENUMER_ALL FALSE
68 
69 //
70 // Sata Controller driver private data structure
71 //
72 #define SATA_CONTROLLER_SIGNATURE SIGNATURE_32('S','A','T','A')
73 
74 typedef struct _EFI_SATA_CONTROLLER_PRIVATE_DATA {
75   //
76   // Standard signature used to identify Sata Controller private data
77   //
78   UINT32                            Signature;
79 
80   //
81   // Protocol instance of IDE_CONTROLLER_INIT produced by this driver
82   //
83   EFI_IDE_CONTROLLER_INIT_PROTOCOL  IdeInit;
84 
85   //
86   // Copy of protocol pointers used by this driver
87   //
88   EFI_PCI_IO_PROTOCOL               *PciIo;
89 
90   //
91   // The number of devices that are supported by this channel
92   //
93   UINT8                             DeviceCount;
94 
95   //
96   // The highest disqulified mode for each attached device,
97   // From ATA/ATAPI spec, if a mode is not supported,
98   // the modes higher than it is also not supported
99   //
100   EFI_ATA_COLLECTIVE_MODE           *DisqualifiedModes;
101 
102   //
103   // A copy of EFI_IDENTIFY_DATA data for each attached SATA device and its flag
104   //
105   EFI_IDENTIFY_DATA                 *IdentifyData;
106   BOOLEAN                           *IdentifyValid;
107 } EFI_SATA_CONTROLLER_PRIVATE_DATA;
108 
109 #define SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS(a) CR(a, EFI_SATA_CONTROLLER_PRIVATE_DATA, IdeInit, SATA_CONTROLLER_SIGNATURE)
110 
111 //
112 // Driver binding functions declaration
113 //
114 /**
115   Supported function of Driver Binding protocol for this driver.
116   Test to see if this driver supports ControllerHandle.
117 
118   @param This                   Protocol instance pointer.
119   @param Controller             Handle of device to test.
120   @param RemainingDevicePath    A pointer to the device path. Should be ignored by
121                                 device driver.
122 
123   @retval EFI_SUCCESS           This driver supports this device.
124   @retval EFI_ALREADY_STARTED   This driver is already running on this device.
125   @retval other                 This driver does not support this device.
126 
127 **/
128 EFI_STATUS
129 EFIAPI
130 SataControllerSupported (
131   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
132   IN EFI_HANDLE                     Controller,
133   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
134   );
135 
136 /**
137   This routine is called right after the .Supported() called and
138   Start this driver on ControllerHandle.
139 
140   @param This                   Protocol instance pointer.
141   @param Controller             Handle of device to bind driver to.
142   @param RemainingDevicePath    A pointer to the device path. Should be ignored by
143                                 device driver.
144 
145   @retval EFI_SUCCESS           This driver is added to this device.
146   @retval EFI_ALREADY_STARTED   This driver is already running on this device.
147   @retval other                 Some error occurs when binding this driver to this device.
148 
149 **/
150 EFI_STATUS
151 EFIAPI
152 SataControllerStart (
153   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
154   IN EFI_HANDLE                     Controller,
155   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
156   );
157 
158 /**
159   Stop this driver on ControllerHandle.
160 
161   @param This               A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
162   @param Controller         A handle to the device being stopped.
163   @param NumberOfChildren   The number of child device handles in ChildHandleBuffer.
164   @param ChildHandleBuffer  An array of child handles to be freed.
165 
166   @retval EFI_SUCCESS       This driver is removed from this device.
167   @retval other             Some error occurs when removing this driver from this device.
168 
169 **/
170 EFI_STATUS
171 EFIAPI
172 SataControllerStop (
173   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
174   IN EFI_HANDLE                     Controller,
175   IN UINTN                          NumberOfChildren,
176   IN EFI_HANDLE                     *ChildHandleBuffer
177   );
178 
179 //
180 // IDE controller init functions declaration
181 //
182 /**
183   Returns the information about the specified IDE channel.
184 
185   This function can be used to obtain information about a particular IDE channel.
186   The driver entity uses this information during the enumeration process.
187 
188   If Enabled is set to FALSE, the driver entity will not scan the channel. Note
189   that it will not prevent an operating system driver from scanning the channel.
190 
191   For most of today's controllers, MaxDevices will either be 1 or 2. For SATA
192   controllers, this value will always be 1. SATA configurations can contain SATA
193   port multipliers. SATA port multipliers behave like SATA bridges and can support
194   up to 16 devices on the other side. If a SATA port out of the IDE controller
195   is connected to a port multiplier, MaxDevices will be set to the number of SATA
196   devices that the port multiplier supports. Because today's port multipliers
197   support up to fifteen SATA devices, this number can be as large as fifteen. The IDE
198   bus driver is required to scan for the presence of port multipliers behind an SATA
199   controller and enumerate up to MaxDevices number of devices behind the port
200   multiplier.
201 
202   In this context, the devices behind a port multiplier constitute a channel.
203 
204   @param[in]  This                The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
205   @param[in]  Channel             Zero-based channel number.
206   @param[out] Enabled             TRUE if this channel is enabled.  Disabled channels
207                                   are not scanned to see if any devices are present.
208   @param[out] MaxDevices          The maximum number of IDE devices that the bus driver
209                                   can expect on this channel.  For the ATA/ATAPI
210                                   specification, version 6, this number will either be
211                                   one or two. For Serial ATA (SATA) configurations with a
212                                   port multiplier, this number can be as large as fifteen.
213 
214 
215   @retval EFI_SUCCESS             Information was returned without any errors.
216   @retval EFI_INVALID_PARAMETER   Channel is invalid (Channel >= ChannelCount).
217 
218 **/
219 EFI_STATUS
220 EFIAPI
221 IdeInitGetChannelInfo (
222   IN EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
223   IN UINT8                              Channel,
224   OUT BOOLEAN                           *Enabled,
225   OUT UINT8                             *MaxDevices
226   );
227 
228 /**
229   The notifications from the driver entity that it is about to enter a certain
230   phase of the IDE channel enumeration process.
231 
232   This function can be used to notify the IDE controller driver to perform
233   specific actions, including any chipset-specific initialization, so that the
234   chipset is ready to enter the next phase. Seven notification points are defined
235   at this time.
236 
237   More synchronization points may be added as required in the future.
238 
239   @param[in] This                 The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL
240                                   instance.
241   @param[in] Phase                The phase during enumeration.
242   @param[in] Channel              Zero-based channel number.
243 
244   @retval EFI_SUCCESS             The notification was accepted without any errors.
245   @retval EFI_UNSUPPORTED         Phase is not supported.
246   @retval EFI_INVALID_PARAMETER   Channel is invalid (Channel >= ChannelCount).
247   @retval EFI_NOT_READY           This phase cannot be entered at this time; for
248                                   example, an attempt was made to enter a Phase
249                                   without having entered one or more previous
250                                   Phase.
251 
252 **/
253 EFI_STATUS
254 EFIAPI
255 IdeInitNotifyPhase (
256   IN EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
257   IN EFI_IDE_CONTROLLER_ENUM_PHASE      Phase,
258   IN UINT8                              Channel
259   );
260 
261 /**
262   Submits the device information to the IDE controller driver.
263 
264   This function is used by the driver entity to pass detailed information about
265   a particular device to the IDE controller driver. The driver entity obtains
266   this information by issuing an ATA or ATAPI IDENTIFY_DEVICE command. IdentifyData
267   is the pointer to the response data buffer. The IdentifyData buffer is owned
268   by the driver entity, and the IDE controller driver must make a local copy
269   of the entire buffer or parts of the buffer as needed. The original IdentifyData
270   buffer pointer may not be valid when
271 
272     - EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() or
273     - EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() is called at a later point.
274 
275   The IDE controller driver may consult various fields of EFI_IDENTIFY_DATA to
276   compute the optimum mode for the device. These fields are not limited to the
277   timing information. For example, an implementation of the IDE controller driver
278   may examine the vendor and type/mode field to match known bad drives.
279 
280   The driver entity may submit drive information in any order, as long as it
281   submits information for all the devices belonging to the enumeration group
282   before EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() is called for any device
283   in that enumeration group. If a device is absent, EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
284   should be called with IdentifyData set to NULL.  The IDE controller driver may
285   not have any other mechanism to know whether a device is present or not. Therefore,
286   setting IdentifyData to NULL does not constitute an error condition.
287   EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() can be called only once for a
288   given (Channel, Device) pair.
289 
290   @param[in] This                 A pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
291   @param[in] Channel              Zero-based channel number.
292   @param[in] Device               Zero-based device number on the Channel.
293   @param[in] IdentifyData         The device's response to the ATA IDENTIFY_DEVICE command.
294 
295   @retval EFI_SUCCESS             The information was accepted without any errors.
296   @retval EFI_INVALID_PARAMETER   Channel is invalid (Channel >= ChannelCount).
297   @retval EFI_INVALID_PARAMETER   Device is invalid.
298 
299 **/
300 EFI_STATUS
301 EFIAPI
302 IdeInitSubmitData (
303   IN EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
304   IN UINT8                              Channel,
305   IN UINT8                              Device,
306   IN EFI_IDENTIFY_DATA                  *IdentifyData
307   );
308 
309 /**
310   Disqualifies specific modes for an IDE device.
311 
312   This function allows the driver entity or other drivers (such as platform
313   drivers) to reject certain timing modes and request the IDE controller driver
314   to recalculate modes. This function allows the driver entity and the IDE
315   controller driver to negotiate the timings on a per-device basis. This function
316   is useful in the case of drives that lie about their capabilities. An example
317   is when the IDE device fails to accept the timing modes that are calculated
318   by the IDE controller driver based on the response to the Identify Drive command.
319 
320   If the driver entity does not want to limit the ATA timing modes and leave that
321   decision to the IDE controller driver, it can either not call this function for
322   the given device or call this function and set the Valid flag to FALSE for all
323   modes that are listed in EFI_ATA_COLLECTIVE_MODE.
324 
325   The driver entity may disqualify modes for a device in any order and any number
326   of times.
327 
328   This function can be called multiple times to invalidate multiple modes of the
329   same type (e.g., Programmed Input/Output [PIO] modes 3 and 4). See the ATA/ATAPI
330   specification for more information on PIO modes.
331 
332   For Serial ATA (SATA) controllers, this member function can be used to disqualify
333   a higher transfer rate mode on a given channel. For example, a platform driver
334   may inform the IDE controller driver to not use second-generation (Gen2) speeds
335   for a certain SATA drive.
336 
337   @param[in] This                 The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
338   @param[in] Channel              The zero-based channel number.
339   @param[in] Device               The zero-based device number on the Channel.
340   @param[in] BadModes             The modes that the device does not support and that
341                                   should be disqualified.
342 
343   @retval EFI_SUCCESS             The modes were accepted without any errors.
344   @retval EFI_INVALID_PARAMETER   Channel is invalid (Channel >= ChannelCount).
345   @retval EFI_INVALID_PARAMETER   Device is invalid.
346   @retval EFI_INVALID_PARAMETER   IdentifyData is NULL.
347 
348 **/
349 EFI_STATUS
350 EFIAPI
351 IdeInitDisqualifyMode (
352   IN EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
353   IN UINT8                              Channel,
354   IN UINT8                              Device,
355   IN EFI_ATA_COLLECTIVE_MODE            *BadModes
356   );
357 
358 /**
359   Returns the information about the optimum modes for the specified IDE device.
360 
361   This function is used by the driver entity to obtain the optimum ATA modes for
362   a specific device.  The IDE controller driver takes into account the following
363   while calculating the mode:
364     - The IdentifyData inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
365     - The BadModes inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode()
366 
367   The driver entity is required to call EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
368   for all the devices that belong to an enumeration group before calling
369   EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() for any device in the same group.
370 
371   The IDE controller driver will use controller- and possibly platform-specific
372   algorithms to arrive at SupportedModes.  The IDE controller may base its
373   decision on user preferences and other considerations as well. This function
374   may be called multiple times because the driver entity may renegotiate the mode
375   with the IDE controller driver using EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode().
376 
377   The driver entity may collect timing information for various devices in any
378   order. The driver entity is responsible for making sure that all the dependencies
379   are satisfied. For example, the SupportedModes information for device A that
380   was previously returned may become stale after a call to
381   EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() for device B.
382 
383   The buffer SupportedModes is allocated by the callee because the caller does
384   not necessarily know the size of the buffer. The type EFI_ATA_COLLECTIVE_MODE
385   is defined in a way that allows for future extensibility and can be of variable
386   length. This memory pool should be deallocated by the caller when it is no
387   longer necessary.
388 
389   The IDE controller driver for a Serial ATA (SATA) controller can use this
390   member function to force a lower speed (first-generation [Gen1] speeds on a
391   second-generation [Gen2]-capable hardware).  The IDE controller driver can
392   also allow the driver entity to stay with the speed that has been negotiated
393   by the physical layer.
394 
395   @param[in]  This                The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
396   @param[in]  Channel             A zero-based channel number.
397   @param[in]  Device              A zero-based device number on the Channel.
398   @param[out] SupportedModes      The optimum modes for the device.
399 
400   @retval EFI_SUCCESS             SupportedModes was returned.
401   @retval EFI_INVALID_PARAMETER   Channel is invalid (Channel >= ChannelCount).
402   @retval EFI_INVALID_PARAMETER   Device is invalid.
403   @retval EFI_INVALID_PARAMETER   SupportedModes is NULL.
404   @retval EFI_NOT_READY           Modes cannot be calculated due to a lack of
405                                   data.  This error may happen if
406                                   EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
407                                   and EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyData()
408                                   were not called for at least one drive in the
409                                   same enumeration group.
410 
411 **/
412 EFI_STATUS
413 EFIAPI
414 IdeInitCalculateMode (
415   IN EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
416   IN UINT8                              Channel,
417   IN UINT8                              Device,
418   OUT EFI_ATA_COLLECTIVE_MODE           **SupportedModes
419   );
420 
421 /**
422   Commands the IDE controller driver to program the IDE controller hardware
423   so that the specified device can operate at the specified mode.
424 
425   This function is used by the driver entity to instruct the IDE controller
426   driver to program the IDE controller hardware to the specified modes. This
427   function can be called only once for a particular device. For a Serial ATA
428   (SATA) Advanced Host Controller Interface (AHCI) controller, no controller-
429   specific programming may be required.
430 
431   @param[in] This                 Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
432   @param[in] Channel              Zero-based channel number.
433   @param[in] Device               Zero-based device number on the Channel.
434   @param[in] Modes                The modes to set.
435 
436   @retval EFI_SUCCESS             The command was accepted without any errors.
437   @retval EFI_INVALID_PARAMETER   Channel is invalid (Channel >= ChannelCount).
438   @retval EFI_INVALID_PARAMETER   Device is invalid.
439   @retval EFI_NOT_READY           Modes cannot be set at this time due to lack of data.
440   @retval EFI_DEVICE_ERROR        Modes cannot be set due to hardware failure.
441                                   The driver entity should not use this device.
442 
443 **/
444 EFI_STATUS
445 EFIAPI
446 IdeInitSetTiming (
447   IN EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
448   IN UINT8                              Channel,
449   IN UINT8                              Device,
450   IN EFI_ATA_COLLECTIVE_MODE            *Modes
451   );
452 
453 //
454 // Forward reference declaration
455 //
456 /**
457   Retrieves a Unicode string that is the user readable name of the UEFI Driver.
458 
459   @param This           A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
460   @param Language       A pointer to a three character ISO 639-2 language identifier.
461                         This is the language of the driver name that that the caller
462                         is requesting, and it must match one of the languages specified
463                         in SupportedLanguages.  The number of languages supported by a
464                         driver is up to the driver writer.
465   @param DriverName     A pointer to the Unicode string to return.  This Unicode string
466                         is the name of the driver specified by This in the language
467                         specified by Language.
468 
469   @retval EFI_SUCCESS           The Unicode string for the Driver specified by This
470                                 and the language specified by Language was returned
471                                 in DriverName.
472   @retval EFI_INVALID_PARAMETER Language is NULL.
473   @retval EFI_INVALID_PARAMETER DriverName is NULL.
474   @retval EFI_UNSUPPORTED       The driver specified by This does not support the
475                                 language specified by Language.
476 **/
477 EFI_STATUS
478 EFIAPI
479 SataControllerComponentNameGetDriverName (
480   IN EFI_COMPONENT_NAME_PROTOCOL    *This,
481   IN CHAR8                          *Language,
482   OUT CHAR16                        **DriverName
483   );
484 
485 /**
486   Retrieves a Unicode string that is the user readable name of the controller
487   that is being managed by an UEFI Driver.
488 
489   @param This                   A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
490   @param ControllerHandle       The handle of a controller that the driver specified by
491                                 This is managing.  This handle specifies the controller
492                                 whose name is to be returned.
493   @param OPTIONAL   ChildHandle The handle of the child controller to retrieve the name
494                                 of.  This is an optional parameter that may be NULL.  It
495                                 will be NULL for device drivers.  It will also be NULL
496                                 for a bus drivers that wish to retrieve the name of the
497                                 bus controller.  It will not be NULL for a bus driver
498                                 that wishes to retrieve the name of a child controller.
499   @param Language               A pointer to a three character ISO 639-2 language
500                                 identifier.  This is the language of the controller name
501                                 that that the caller is requesting, and it must match one
502                                 of the languages specified in SupportedLanguages.  The
503                                 number of languages supported by a driver is up to the
504                                 driver writer.
505   @param ControllerName         A pointer to the Unicode string to return.  This Unicode
506                                 string is the name of the controller specified by
507                                 ControllerHandle and ChildHandle in the language
508                                 specified by Language from the point of view of the
509                                 driver specified by This.
510 
511   @retval EFI_SUCCESS           The Unicode string for the user readable name in the
512                                 language specified by Language for the driver
513                                 specified by This was returned in DriverName.
514   @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
515   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
516                                 EFI_HANDLE.
517   @retval EFI_INVALID_PARAMETER Language is NULL.
518   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
519   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
520                                 managing the controller specified by
521                                 ControllerHandle and ChildHandle.
522   @retval EFI_UNSUPPORTED       The driver specified by This does not support the
523                                 language specified by Language.
524 **/
525 EFI_STATUS
526 EFIAPI
527 SataControllerComponentNameGetControllerName (
528   IN EFI_COMPONENT_NAME_PROTOCOL    *This,
529   IN EFI_HANDLE                     ControllerHandle,
530   IN EFI_HANDLE                     ChildHandle OPTIONAL,
531   IN CHAR8                          *Language,
532   OUT CHAR16                        **ControllerName
533   );
534 
535 #endif
536 
537