+++ /dev/null
-/** @file\r
- Copyright (c) 2006, Intel Corporation \r
- All rights reserved. This program and the accompanying materials \r
- are licensed and made available under the terms and conditions of the BSD License \r
- which accompanies this distribution. The full text of the license may be found at \r
- http://opensource.org/licenses/bsd-license.php \r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-**/\r
-\r
-#include "idebus.h"\r
-\r
-#define IDE_BUS_DIAGNOSTIC_ERROR L"PCI IDE/ATAPI Driver Diagnostics Failed"\r
-\r
-//\r
-// EFI Driver Diagnostics Protocol\r
-//\r
-EFI_DRIVER_DIAGNOSTICS_PROTOCOL gIDEBusDriverDiagnostics = {\r
- IDEBusDriverDiagnosticsRunDiagnostics,\r
- "eng"\r
-};\r
-\r
-/**\r
- Runs diagnostics on a controller.\r
-\r
- @param This A pointer to the EFI_DRIVER_DIAGNOSTICS_PROTOCOL\r
- instance.\r
- @param ControllerHandle The handle of the controller to run diagnostics on.\r
- @param ChildHandle The handle of the child controller to run diagnostics on\r
- This is an optional parameter that may be NULL. It will\r
- be NULL for device drivers. It will also be NULL for a\r
- bus drivers that wish to run diagnostics on the bus\r
- controller. It will not be NULL for a bus driver that\r
- wishes to run diagnostics on one of its child\r
- controllers.\r
- @param DiagnosticType Indicates type of diagnostics to perform on the\r
- controller specified by ControllerHandle and ChildHandle.\r
- See "Related Definitions" for the list of supported\r
- types.\r
- @param Language A pointer to a three character ISO 639-2 language\r
- identifier. This is the language in which the optional\r
- error message should be returned in Buffer, and it must\r
- match one of the languages specified in\r
- SupportedLanguages. The number of languages supported by\r
- a driver is up to the driver writer.\r
- @param ErrorType A GUID that defines the format of the data returned in\r
- Buffer.\r
- @param BufferSize The size, in bytes, of the data returned in Buffer.\r
- @param Buffer A buffer that contains a Null-terminated Unicode string\r
- plus some additional data whose format is defined by\r
- ErrorType. Buffer is allocated by this function with\r
- AllocatePool(), and it is the caller's responsibility\r
- to free it with a call to FreePool().\r
-\r
- @retval EFI_SUCCESS The controller specified by ControllerHandle and\r
- ChildHandle passed the diagnostic.\r
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
- EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER Language is NULL.\r
- @retval EFI_INVALID_PARAMETER ErrorType is NULL.\r
- @retval EFI_INVALID_PARAMETER BufferType is NULL.\r
- @retval EFI_INVALID_PARAMETER Buffer is NULL.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support\r
- running diagnostics for the controller specified\r
- by ControllerHandle and ChildHandle.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support the\r
- type of diagnostic specified by DiagnosticType.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support the\r
- language specified by Language.\r
- @retval EFI_OUT_OF_RESOURCES There are not enough resources available to complete\r
- the diagnostics.\r
- @retval EFI_OUT_OF_RESOURCES There are not enough resources available to return\r
- the status information in ErrorType, BufferSize,\r
- and Buffer.\r
- @retval EFI_DEVICE_ERROR The controller specified by ControllerHandle and\r
- ChildHandle did not pass the diagnostic.\r
-\r
-**/\r
-EFI_STATUS\r
-IDEBusDriverDiagnosticsRunDiagnostics (\r
- IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,\r
- IN CHAR8 *Language,\r
- OUT EFI_GUID **ErrorType,\r
- OUT UINTN *BufferSize,\r
- OUT CHAR16 **Buffer\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- IDE_BLK_IO_DEV *IdeBlkIoDevice;\r
- UINT32 VendorDeviceId;\r
- VOID *BlockBuffer;\r
-\r
- *ErrorType = NULL;\r
- *BufferSize = 0;\r
-\r
- if (ChildHandle == NULL) {\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiCallerIdGuid,\r
- NULL,\r
- gIDEBusDriverBinding.DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiPciIoProtocolGuid,\r
- (VOID **) &PciIo,\r
- gIDEBusDriverBinding.DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- //\r
- // Use services of PCI I/O Protocol to test the PCI IDE/ATAPI Controller\r
- // The following test simply reads the Device ID and Vendor ID.\r
- // It should never fail. A real test would perform more advanced\r
- // diagnostics.\r
- //\r
-\r
- Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, 1, &VendorDeviceId);\r
- if (EFI_ERROR (Status) || VendorDeviceId == 0xffffffff) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- ChildHandle,\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo,\r
- gIDEBusDriverBinding.DriverBindingHandle,\r
- ChildHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (BlkIo);\r
-\r
- //\r
- // Use services available from IdeBlkIoDevice to test the IDE/ATAPI device\r
- //\r
- Status = gBS->AllocatePool (\r
- EfiBootServicesData,\r
- IdeBlkIoDevice->BlkMedia.BlockSize,\r
- (VOID **) &BlockBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = IdeBlkIoDevice->BlkIo.ReadBlocks (\r
- &IdeBlkIoDevice->BlkIo,\r
- IdeBlkIoDevice->BlkMedia.MediaId,\r
- 0,\r
- IdeBlkIoDevice->BlkMedia.BlockSize,\r
- BlockBuffer\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- *ErrorType = &gEfiCallerIdGuid;\r
- *BufferSize = sizeof (IDE_BUS_DIAGNOSTIC_ERROR);\r
-\r
- Status = gBS->AllocatePool (\r
- EfiBootServicesData,\r
- (UINTN) (*BufferSize),\r
- (VOID **) Buffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- CopyMem (*Buffer, IDE_BUS_DIAGNOSTIC_ERROR, *BufferSize);\r
-\r
- Status = EFI_DEVICE_ERROR;\r
- }\r
-\r
- gBS->FreePool (BlockBuffer);\r
-\r
- return Status;\r
-}\r