Index: /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/ComponentName.c
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/ComponentName.c	(revision 33023)
+++ /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/ComponentName.c	(revision 33023)
@@ -0,0 +1,187 @@
+/** @file
+  This portion is to register the IDE Controller Driver name:
+  "IDE Controller Init Driver"
+
+  Copyright (c) 2008 Intel Corporation. <BR>
+  All rights reserved. This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD License         
+  which accompanies this distribution.  The full text of the license may be found at        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#include "IdeController.h"
+
+//
+// EFI Component Name Protocol
+//
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gIdeControllerComponentName = {
+  IdeControllerComponentNameGetDriverName,
+  IdeControllerComponentNameGetControllerName,
+  "eng"
+};
+
+//
+// EFI Component Name 2 Protocol
+//
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIdeControllerComponentName2 = {
+  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IdeControllerComponentNameGetDriverName,
+  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IdeControllerComponentNameGetControllerName,
+  "en"
+};
+
+//
+// Driver Name Strings
+//
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIdeControllerDriverNameTable[] = {
+  {
+    "eng;en",
+    (CHAR16 *)L"IDE Controller Init Driver"
+  },
+  {
+    NULL,
+    NULL
+  }
+};
+
+//
+// Controller Name Strings
+//
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIdeControllerControllerNameTable[] = {
+  {
+    "eng;en",
+    (CHAR16 *)L"PCAT IDE Controller"
+  },
+  {
+    NULL,
+    NULL
+  }
+};
+
+EFI_STATUS
+EFIAPI
+IdeControllerComponentNameGetDriverName (
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
+  IN  CHAR8                        *Language,
+  OUT CHAR16                       **DriverName
+  )
+/*++
+
+  Routine Description:
+    Retrieves a Unicode string that is the user readable name of the EFI Driver.
+
+  Arguments:
+    This       - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
+    Language   - A pointer to a three character ISO 639-2 language identifier.
+                 This is the language of the driver name that that the caller 
+                 is requesting, and it must match one of the languages specified
+                 in SupportedLanguages.  The number of languages supported by a 
+                 driver is up to the driver writer.
+    DriverName - A pointer to the Unicode string to return.  This Unicode string
+                 is the name of the driver specified by This in the language 
+                 specified by Language.
+
+  Returns:
+    EFI_SUCCESS           - The Unicode string for the Driver specified by This
+                            and the language specified by Language was returned 
+                            in DriverName.
+    EFI_INVALID_PARAMETER - Language is NULL.
+    EFI_INVALID_PARAMETER - DriverName is NULL.
+    EFI_UNSUPPORTED       - The driver specified by This does not support the 
+                            language specified by Language.
+
+--*/
+{
+  return LookupUnicodeString2 (
+           Language,
+           This->SupportedLanguages,
+           mIdeControllerDriverNameTable,
+           DriverName,
+           (BOOLEAN)(This == &gIdeControllerComponentName)
+           );
+}
+
+EFI_STATUS
+EFIAPI
+IdeControllerComponentNameGetControllerName (
+  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
+  IN  EFI_HANDLE                                      ControllerHandle,
+  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
+  IN  CHAR8                                           *Language,
+  OUT CHAR16                                          **ControllerName
+  )
+/*++
+
+  Routine Description:
+    Retrieves a Unicode string that is the user readable name of the controller
+    that is being managed by an EFI Driver.
+
+  Arguments:
+    This             - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
+    ControllerHandle - The handle of a controller that the driver specified by 
+                       This is managing.  This handle specifies the controller 
+                       whose name is to be returned.
+    ChildHandle      - The handle of the child controller to retrieve the name 
+                       of.  This is an optional parameter that may be NULL.  It 
+                       will be NULL for device drivers.  It will also be NULL 
+                       for a bus drivers that wish to retrieve the name of the 
+                       bus controller.  It will not be NULL for a bus driver 
+                       that wishes to retrieve the name of a child controller.
+    Language         - A pointer to a three character ISO 639-2 language 
+                       identifier.  This is the language of the controller name 
+                       that that the caller is requesting, and it must match one
+                       of the languages specified in SupportedLanguages.  The 
+                       number of languages supported by a driver is up to the 
+                       driver writer.
+    ControllerName   - A pointer to the Unicode string to return.  This Unicode
+                       string is the name of the controller specified by 
+                       ControllerHandle and ChildHandle in the language 
+                       specified by Language from the point of view of the 
+                       driver specified by This. 
+
+  Returns:
+    EFI_SUCCESS           - The Unicode string for the user readable name in the 
+                            language specified by Language for the driver 
+                            specified by This was returned in DriverName.
+    EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
+    EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid 
+                            EFI_HANDLE.
+    EFI_INVALID_PARAMETER - Language is NULL.
+    EFI_INVALID_PARAMETER - ControllerName is NULL.
+    EFI_UNSUPPORTED       - The driver specified by This is not currently 
+                            managing the controller specified by 
+                            ControllerHandle and ChildHandle.
+    EFI_UNSUPPORTED       - The driver specified by This does not support the 
+                            language specified by Language.
+
+--*/
+{
+  EFI_STATUS            Status;
+
+  //
+  // Make sure this driver is currently managing ControllHandle
+  //
+  Status = EfiTestManagedDevice (
+             ControllerHandle,
+             gIdeControllerDriverBinding.DriverBindingHandle,
+             &gEfiPciIoProtocolGuid
+             );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  if (ChildHandle != NULL) {
+    return EFI_UNSUPPORTED;
+  }
+
+  return LookupUnicodeString2 (
+          Language,
+          This->SupportedLanguages,
+          mIdeControllerControllerNameTable,
+          ControllerName,
+          (BOOLEAN)(This == &gIdeControllerComponentName)
+          );
+}
Index: /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/IdeController.c
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/IdeController.c	(revision 33023)
+++ /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/IdeController.c	(revision 33023)
@@ -0,0 +1,529 @@
+/** @file
+  This driver module produces IDE_CONTROLLER_INIT protocol and will be used by 
+  IDE Bus driver to support platform dependent timing information. This driver
+  is responsible for early initialization of IDE controller.
+
+  Copyright (c) 2008 - 2009 Intel Corporation. <BR>
+  All rights reserved. This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD License         
+  which accompanies this distribution.  The full text of the license may be found at        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#include "IdeController.h"
+
+//
+//  EFI_DRIVER_BINDING_PROTOCOL instance
+//
+EFI_DRIVER_BINDING_PROTOCOL gIdeControllerDriverBinding = {
+  IdeControllerSupported,
+  IdeControllerStart,
+  IdeControllerStop,
+  0xa,
+  NULL,
+  NULL
+};
+
+//
+//  EFI_IDE_CONTROLLER_PROVATE_DATA Template
+//
+EFI_IDE_CONTROLLER_INIT_PROTOCOL  gEfiIdeControllerInit = {
+  IdeInitGetChannelInfo,
+  IdeInitNotifyPhase,
+  IdeInitSubmitData,
+  IdeInitDisqualifyMode,
+  IdeInitCalculateMode,
+  IdeInitSetTiming,
+  ICH_IDE_ENUMER_ALL,
+  ICH_IDE_MAX_CHANNEL
+};
+
+//
+//  EFI_ATA_COLLECTIVE_MODE Template
+//
+EFI_ATA_COLLECTIVE_MODE  gEfiAtaCollectiveModeTemplate = {
+  {           
+    TRUE,                   // PioMode.Valid
+    0                       // PioMode.Mode
+  },
+  {
+    TRUE,                   // SingleWordDmaMode.Valid
+    0
+  },
+  {
+    FALSE,                  // MultiWordDmaMode.Valid
+    0
+  },
+  {
+    TRUE,                   // UdmaMode.Valid
+    0                       // UdmaMode.Mode
+  }
+};
+
+EFI_STATUS
+EFIAPI
+InitializeIdeControllerDriver (
+  IN EFI_HANDLE       ImageHandle,
+  IN EFI_SYSTEM_TABLE *SystemTable
+  )
+/*++
+  Routine Description:
+  
+    Chipset Ide Driver EntryPoint function. It follows the standard EFI driver 
+    model. It's called by StartImage() of DXE Core
+    
+  Argments:
+  
+    ImageHnadle  -- While the driver image loaded be the ImageLoader(), 
+                    an image handle is assigned to this driver binary, 
+                    all activities of the driver is tied to this ImageHandle
+    *SystemTable -- A pointer to the system table, for all BS(Boo Services) and
+                    RT(Runtime Services)
+
+  Retruns:
+  
+    Always call EfiLibInstallDriverBindingProtocol( ) and retrun the result
+
+--*/
+{
+  EFI_STATUS  Status;
+
+  //
+  // Install driver model protocol(s).
+  //
+  Status = EfiLibInstallDriverBindingComponentName2 (
+             ImageHandle,
+             SystemTable,
+             &gIdeControllerDriverBinding,
+             ImageHandle,
+             &gIdeControllerComponentName,
+             &gIdeControllerComponentName2
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  return Status;
+}
+
+EFI_STATUS
+EFIAPI
+IdeControllerSupported (
+  IN EFI_DRIVER_BINDING_PROTOCOL *This,
+  IN EFI_HANDLE                  Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL    *RemainingDevicePath
+  )
+/*++
+
+  Routine Description:
+  
+  Register Driver Binding protocol for this driver.
+  
+  Arguments:
+  
+    This                 -- a pointer points to the Binding Protocol instance
+    Controller           -- The handle of controller to be tested. 
+    *RemainingDevicePath -- A pointer to the device path. Ignored by device
+                            driver but used by bus driver
+
+  Returns:
+
+    EFI_SUCCESS          -- Driver loaded.
+    other                -- Driver not loaded.
+--*/
+{
+  EFI_STATUS                Status;
+  EFI_PCI_IO_PROTOCOL       *PciIo;
+  UINT8                     PciClass;
+  UINT8                     PciSubClass;
+
+  //
+  // Attempt to Open PCI I/O Protocol
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **) &PciIo,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Now further check the PCI header: Base class (offset 0x0B) and
+  // Sub Class (offset 0x0A). This controller should be an Ide controller
+  //
+  Status = PciIo->Pci.Read (
+                        PciIo,
+                        EfiPciIoWidthUint8,
+                        PCI_CLASSCODE_OFFSET + 2,
+                        1,
+                        &PciClass
+                        );
+  if (EFI_ERROR (Status)) {
+    goto Done;
+  }
+
+  Status = PciIo->Pci.Read (
+                        PciIo,
+                        EfiPciIoWidthUint8,
+                        PCI_CLASSCODE_OFFSET + 1,
+                        1,
+                        &PciSubClass
+                        );
+  if (EFI_ERROR (Status)) {
+    goto Done;
+  }
+
+  //
+  // Examine Ide PCI Configuration table fields
+  //
+  if ((PciClass != PCI_CLASS_MASS_STORAGE) || (PciSubClass != PCI_CLASS_MASS_STORAGE_IDE)) {
+    Status = EFI_UNSUPPORTED;
+  }
+
+Done:
+  gBS->CloseProtocol (
+        Controller,
+        &gEfiPciIoProtocolGuid,
+        This->DriverBindingHandle,
+        Controller
+        );
+
+  return Status;
+}
+
+EFI_STATUS
+EFIAPI
+IdeControllerStart (
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
+  IN EFI_HANDLE                     Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
+  )
+/*++
+
+  Routine Description:
+  
+    This routine is called right after the .Supported() called and return 
+    EFI_SUCCESS. Notes: The supported protocols are checked but the Protocols
+    are closed.
+
+  Arguments:
+      
+    This                 -- a pointer points to the Binding Protocol instance
+    Controller           -- The handle of controller to be tested. Parameter
+                            passed by the caller
+    *RemainingDevicePath -- A pointer to the device path. Should be ignored by
+                            device driver
+--*/
+{
+  EFI_STATUS           Status;
+  EFI_PCI_IO_PROTOCOL  *PciIo;
+
+  //
+  // Now test and open the EfiPciIoProtocol
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiPciIoProtocolGuid,
+                  (VOID **) &PciIo,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_BY_DRIVER
+                  );
+  //
+  // Status == EFI_SUCCESS - A normal execution flow, SUCCESS and the program proceeds.
+  // Status == ALREADY_STARTED - A non-zero Status code returned. It indicates
+  //           that the protocol has been opened and should be treated as a
+  //           normal condition and the program proceeds. The Protocol will not
+  //           opened 'again' by this call.
+  // Status != ALREADY_STARTED - Error status, terminate program execution
+  //
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Install IDE_CONTROLLER_INIT protocol 
+  //
+  return gBS->InstallMultipleProtocolInterfaces (
+                &Controller,
+                &gEfiIdeControllerInitProtocolGuid, &gEfiIdeControllerInit,
+                NULL
+                );
+}
+
+EFI_STATUS
+EFIAPI
+IdeControllerStop (
+  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
+  IN  EFI_HANDLE                      Controller,
+  IN  UINTN                           NumberOfChildren,
+  IN  EFI_HANDLE                      *ChildHandleBuffer
+  )
+/*++
+  
+  Routine Description:
+    Stop this driver on Controller Handle. 
+
+  Arguments:
+    This              - Protocol instance pointer.
+    Controller        - Handle of device to stop driver on 
+    NumberOfChildren  - Not used
+    ChildHandleBuffer - Not used
+
+  Returns:
+    EFI_SUCCESS       - This driver is removed DeviceHandle
+    other             - This driver was not removed from this device
+  
+--*/
+{
+  EFI_STATUS                        Status;
+  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *IdeControllerInit;
+
+  //
+  // Open the produced protocol
+  //
+  Status = gBS->OpenProtocol (
+                  Controller,
+                  &gEfiIdeControllerInitProtocolGuid,
+                  (VOID **) &IdeControllerInit,
+                  This->DriverBindingHandle,
+                  Controller,
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                  );
+  if (EFI_ERROR (Status)) {
+     return EFI_UNSUPPORTED;
+  }
+
+  //
+  // Make sure the protocol was produced by this driver
+  //
+  if (IdeControllerInit != &gEfiIdeControllerInit) {
+    return EFI_UNSUPPORTED;
+  }
+
+  //
+  // Uninstall the IDE Controller Init Protocol
+  //
+  Status = gBS->UninstallMultipleProtocolInterfaces (
+                  Controller,
+                  &gEfiIdeControllerInitProtocolGuid, &gEfiIdeControllerInit,
+                  NULL
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Close protocols opened by Ide controller driver
+  //
+  return gBS->CloseProtocol (
+                Controller,
+                &gEfiPciIoProtocolGuid,
+                This->DriverBindingHandle,
+                Controller
+                );
+}
+
+//
+// Interface functions of IDE_CONTROLLER_INIT protocol
+//
+EFI_STATUS
+EFIAPI
+IdeInitGetChannelInfo (
+  IN   EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
+  IN   UINT8                            Channel,
+  OUT  BOOLEAN                          *Enabled,
+  OUT  UINT8                            *MaxDevices
+  )
+/*++
+Routine Description:
+
+  This function can be used to obtain information about a specified channel. 
+  It's usually used by IDE Bus driver during enumeration process.
+
+Arguments:
+
+  This       -- the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
+  Channel    -- Channel number (0 based, either 0 or 1)
+  Enabled    -- TRUE if the channel is enabled. If the channel is disabled, 
+                then it will no be enumerated.
+  MaxDevices -- The Max number of IDE devices that the bus driver can expect
+                on this channel. For ATA/ATAPI, this number is either 1 or 2.
+
+Returns:
+  EFI_STATUS 
+
+--*/
+{
+  //
+  // Channel number (0 based, either 0 or 1)
+  //
+  if (Channel < ICH_IDE_MAX_CHANNEL) {
+    *Enabled    = TRUE;
+    *MaxDevices = ICH_IDE_MAX_DEVICES;
+    return EFI_SUCCESS;
+  }
+
+  *Enabled = FALSE;
+  return EFI_INVALID_PARAMETER;
+}
+
+
+EFI_STATUS
+EFIAPI
+IdeInitNotifyPhase (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL   *This,
+  IN  EFI_IDE_CONTROLLER_ENUM_PHASE      Phase,
+  IN  UINT8                              Channel
+  )
+/*++
+
+Routine Description:
+
+  This function is called by IdeBus driver before executing certain actions. 
+  This allows IDE Controller Init to prepare for each action.
+
+Arguments:
+
+  This     -- the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
+  Phase    -- phase indicator defined by IDE_CONTROLLER_INIT protocol
+  Channel  -- Channel number (0 based, either 0 or 1)
+
+Returns:
+    
+--*/
+{
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+IdeInitSubmitData (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL    *This,
+  IN  UINT8                               Channel,
+  IN  UINT8                               Device,
+  IN  EFI_IDENTIFY_DATA                   *IdentifyData
+  )
+/*++
+
+Routine Description:
+
+  This function is called by IdeBus driver to submit EFI_IDENTIFY_DATA data structure
+  obtained from IDE deivce. This structure is used to set IDE timing
+
+Arguments:
+
+  This         -- the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
+  Channel      -- IDE channel number (0 based, either 0 or 1)
+  Device       -- IDE device number
+  IdentifyData -- A pointer to EFI_IDENTIFY_DATA data structure
+
+Returns:
+    
+--*/
+{
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+IdeInitDisqualifyMode (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL    *This,
+  IN  UINT8                               Channel,
+  IN  UINT8                               Device,
+  IN  EFI_ATA_COLLECTIVE_MODE             *BadModes
+  )
+/*++
+
+Routine Description:
+
+  This function is called by IdeBus driver to disqualify unsupported operation
+  mode on specfic IDE device
+
+Arguments:
+
+  This     -- the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
+  Channel  -- IDE channel number (0 based, either 0 or 1)
+  Device   -- IDE device number
+  BadModes -- Operation mode indicator
+
+Returns:
+    
+--*/
+{
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+IdeInitCalculateMode (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL       *This,
+  IN  UINT8                                  Channel,
+  IN  UINT8                                  Device,
+  OUT EFI_ATA_COLLECTIVE_MODE                **SupportedModes
+  )
+/*++
+
+Routine Description:
+
+  This function is called by IdeBus driver to calculate the best operation mode
+  supported by specific IDE device
+
+Arguments:
+
+  This           -- the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
+  Channel        -- IDE channel number (0 based, either 0 or 1)
+  Device         -- IDE device number
+  SupportedModes -- Modes collection supported by IDE device
+
+Returns:
+    
+--*/
+{
+  if (Channel >= ICH_IDE_MAX_CHANNEL || Device >= ICH_IDE_MAX_DEVICES) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *SupportedModes = AllocateCopyPool (sizeof (EFI_ATA_COLLECTIVE_MODE), &gEfiAtaCollectiveModeTemplate);
+  if (*SupportedModes == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+EFIAPI
+IdeInitSetTiming (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL    *This,
+  IN  UINT8                               Channel,
+  IN  UINT8                               Device,
+  IN  EFI_ATA_COLLECTIVE_MODE             *Modes
+  )
+/*++
+
+Routine Description:
+
+  This function is called by IdeBus driver to set appropriate timing on IDE
+  controller according supported operation mode
+
+Arguments:
+
+  This           -- the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
+  Channel        -- IDE channel number (0 based, either 0 or 1)
+  Device         -- IDE device number
+
+Returns:
+    
+--*/
+{
+  return EFI_SUCCESS;
+}
Index: /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/IdeController.h
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/IdeController.h	(revision 33023)
+++ /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/IdeController.h	(revision 33023)
@@ -0,0 +1,419 @@
+/** @file
+  Header file for IDE controller driver.
+
+  Copyright (c) 2008 Intel Corporation. <BR>
+  All rights reserved. This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD License         
+  which accompanies this distribution.  The full text of the license may be found at        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _IDE_CONTROLLER_H
+#define _IDE_CONTROLLER_H
+
+#include <Uefi.h>
+#include <Protocol/ComponentName.h>
+#include <Protocol/DriverBinding.h>
+#include <Protocol/PciIo.h>
+#include <Protocol/IdeControllerInit.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <IndustryStandard/Pci.h>
+
+//
+// Global Variables definitions
+//
+extern EFI_DRIVER_BINDING_PROTOCOL  gIdeControllerDriverBinding;
+extern EFI_COMPONENT_NAME_PROTOCOL  gIdeControllerComponentName;
+extern EFI_COMPONENT_NAME2_PROTOCOL gIdeControllerComponentName2;
+
+//
+// Supports 2 channel max
+//
+#define ICH_IDE_MAX_CHANNEL 0x02
+//
+// Supports 2 devices max
+//
+#define ICH_IDE_MAX_DEVICES 0x02
+#define ICH_IDE_ENUMER_ALL  FALSE
+
+//
+// Driver binding functions declaration
+//
+EFI_STATUS
+EFIAPI
+IdeControllerSupported (
+  IN EFI_DRIVER_BINDING_PROTOCOL       *This,
+  IN EFI_HANDLE                        Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL          *RemainingDevicePath
+  )
+/*++
+
+  Routine Description:
+  
+  Register Driver Binding protocol for this driver.
+  
+  Arguments:
+  
+    This                 -- a pointer points to the Binding Protocol instance
+    Controller           -- The handle of controller to be tested. 
+    *RemainingDevicePath -- A pointer to the device path. Ignored by device
+                            driver but used by bus driver
+
+  Returns:
+
+    EFI_SUCCESS          -- Driver loaded.
+    other                -- Driver not loaded.
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeControllerStart (
+  IN EFI_DRIVER_BINDING_PROTOCOL        *This,
+  IN EFI_HANDLE                         Controller,
+  IN EFI_DEVICE_PATH_PROTOCOL           *RemainingDevicePath
+  )
+/*++
+
+  Routine Description:
+  
+    This routine is called right after the .Supported() called and return 
+    EFI_SUCCESS. Notes: The supported protocols are checked but the Protocols
+    are closed.
+
+  Arguments:
+      
+    This                 -- a pointer points to the Binding Protocol instance
+    Controller           -- The handle of controller to be tested. Parameter
+                            passed by the caller
+    *RemainingDevicePath -- A pointer to the device path. Should be ignored by
+                            device driver
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeControllerStop (
+  IN  EFI_DRIVER_BINDING_PROTOCOL       *This,
+  IN  EFI_HANDLE                        Controller,
+  IN  UINTN                             NumberOfChildren,
+  IN  EFI_HANDLE                        *ChildHandleBuffer
+  )
+/*++
+  
+  Routine Description:
+    Stop this driver on Controller Handle. 
+
+  Arguments:
+    This              - Protocol instance pointer.
+    Controller        - Handle of device to stop driver on 
+    NumberOfChildren  - Not used
+    ChildHandleBuffer - Not used
+
+  Returns:
+    EFI_SUCCESS       - This driver is removed DeviceHandle
+    other             - This driver was not removed from this device
+  
+--*/
+;
+
+//
+// IDE controller init functions declaration
+//
+EFI_STATUS
+EFIAPI
+IdeInitGetChannelInfo (
+  IN   EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
+  IN   UINT8                            Channel,
+  OUT  BOOLEAN                          *Enabled,
+  OUT  UINT8                            *MaxDevices
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This        - TODO: add argument description
+  Channel     - TODO: add argument description
+  Enabled     - TODO: add argument description
+  MaxDevices  - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeInitNotifyPhase (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *This,
+  IN  EFI_IDE_CONTROLLER_ENUM_PHASE     Phase,
+  OUT UINT8                             Channel
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This    - TODO: add argument description
+  Phase   - TODO: add argument description
+  Channel - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeInitSubmitData (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *This,
+  IN  UINT8                             Channel,
+  IN  UINT8                             Device,
+  IN  EFI_IDENTIFY_DATA                 *IdentifyData
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This          - TODO: add argument description
+  Channel       - TODO: add argument description
+  Device        - TODO: add argument description
+  IdentifyData  - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeInitSubmitFailingModes (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *This,
+  IN  UINT8                             Channel,
+  IN  UINT8                             Device
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This    - TODO: add argument description
+  Channel - TODO: add argument description
+  Device  - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeInitDisqualifyMode (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *This,
+  IN  UINT8                             Channel,
+  IN  UINT8                             Device,
+  IN  EFI_ATA_COLLECTIVE_MODE           *BadModes
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This      - TODO: add argument description
+  Channel   - TODO: add argument description
+  Device    - TODO: add argument description
+  BadModes  - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeInitCalculateMode (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *This,
+  IN  UINT8                             Channel,
+  IN  UINT8                             Device,
+  IN  EFI_ATA_COLLECTIVE_MODE           **SupportedModes
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This            - TODO: add argument description
+  Channel         - TODO: add argument description
+  Device          - TODO: add argument description
+  SupportedModes  - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeInitSetTiming (
+  IN  EFI_IDE_CONTROLLER_INIT_PROTOCOL  *This,
+  IN  UINT8                             Channel,
+  IN  UINT8                             Device,
+  IN  EFI_ATA_COLLECTIVE_MODE           *Modes
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This    - TODO: add argument description
+  Channel - TODO: add argument description
+  Device  - TODO: add argument description
+  Modes   - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+;
+
+//
+// Forward reference declaration
+//
+EFI_STATUS
+EFIAPI
+IdeControllerComponentNameGetDriverName (
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
+  IN  CHAR8                        *Language,
+  OUT CHAR16                       **DriverName
+  )
+/*++
+
+  Routine Description:
+    Retrieves a Unicode string that is the user readable name of the EFI Driver.
+
+  Arguments:
+    This       - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
+    Language   - A pointer to a three character ISO 639-2 language identifier.
+                 This is the language of the driver name that that the caller 
+                 is requesting, and it must match one of the languages specified
+                 in SupportedLanguages.  The number of languages supported by a 
+                 driver is up to the driver writer.
+    DriverName - A pointer to the Unicode string to return.  This Unicode string
+                 is the name of the driver specified by This in the language 
+                 specified by Language.
+
+  Returns:
+    EFI_SUCCESS           - The Unicode string for the Driver specified by This
+                            and the language specified by Language was returned 
+                            in DriverName.
+    EFI_INVALID_PARAMETER - Language is NULL.
+    EFI_INVALID_PARAMETER - DriverName is NULL.
+    EFI_UNSUPPORTED       - The driver specified by This does not support the 
+                            language specified by Language.
+
+--*/
+;
+
+EFI_STATUS
+EFIAPI
+IdeControllerComponentNameGetControllerName (
+  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
+  IN  EFI_HANDLE                                      ControllerHandle,
+  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
+  IN  CHAR8                                           *Language,
+  OUT CHAR16                                          **ControllerName
+  )
+/*++
+
+  Routine Description:
+    Retrieves a Unicode string that is the user readable name of the controller
+    that is being managed by an EFI Driver.
+
+  Arguments:
+    This             - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
+    ControllerHandle - The handle of a controller that the driver specified by 
+                       This is managing.  This handle specifies the controller 
+                       whose name is to be returned.
+    ChildHandle      - The handle of the child controller to retrieve the name 
+                       of.  This is an optional parameter that may be NULL.  It 
+                       will be NULL for device drivers.  It will also be NULL 
+                       for a bus drivers that wish to retrieve the name of the 
+                       bus controller.  It will not be NULL for a bus driver 
+                       that wishes to retrieve the name of a child controller.
+    Language         - A pointer to a three character ISO 639-2 language 
+                       identifier.  This is the language of the controller name 
+                       that that the caller is requesting, and it must match one
+                       of the languages specified in SupportedLanguages.  The 
+                       number of languages supported by a driver is up to the 
+                       driver writer.
+    ControllerName   - A pointer to the Unicode string to return.  This Unicode
+                       string is the name of the controller specified by 
+                       ControllerHandle and ChildHandle in the language 
+                       specified by Language from the point of view of the 
+                       driver specified by This. 
+
+  Returns:
+    EFI_SUCCESS           - The Unicode string for the user readable name in the 
+                            language specified by Language for the driver 
+                            specified by This was returned in DriverName.
+    EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
+    EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid 
+                            EFI_HANDLE.
+    EFI_INVALID_PARAMETER - Language is NULL.
+    EFI_INVALID_PARAMETER - ControllerName is NULL.
+    EFI_UNSUPPORTED       - The driver specified by This is not currently 
+                            managing the controller specified by 
+                            ControllerHandle and ChildHandle.
+    EFI_UNSUPPORTED       - The driver specified by This does not support the 
+                            language specified by Language.
+
+--*/
+;
+
+#endif
Index: /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/VBoxIdeControllerDxe.inf
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/VBoxIdeControllerDxe.inf	(revision 33023)
+++ /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeControllerDxe/VBoxIdeControllerDxe.inf	(revision 33023)
@@ -0,0 +1,52 @@
+#/** @file
+#  
+#    Component description file for the IDE Controller Init module.
+#
+#  Copyright (c) 2008, Intel Corporation. <BR>
+#  All rights reserved. This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#  
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#  
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = IdeController
+  FILE_GUID                      = F3790689-FB90-4479-A2EF-B82A43AFE74D
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  EDK_RELEASE_VERSION            = 0x00020000
+  EFI_SPECIFICATION_VERSION      = 0x00020000
+  ENTRY_POINT                    = InitializeIdeControllerDriver
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+  ComponentName.c
+  IdeController.c
+  IdeController.h
+
+[Packages]
+  MdePkg/MdePkg.dec
+  IntelFrameworkPkg/IntelFrameworkPkg.dec
+
+[LibraryClasses]
+  UefiDriverEntryPoint
+  DebugLib
+  UefiLib
+  BaseLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+
+[Protocols]
+  gEfiPciIoProtocolGuid  
+  gEfiIdeControllerInitProtocolGuid
