mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-29 16:44:10 +02:00
Enhance SCSI disk module to produce Disk Info protocol on the same Block IO handle:
SCSI Interface GUID: Physical SCSI disk IDE Interface GUID: ATAPI device run in legacy IDE mode AHCI Interface GUID: ATAPI device run in AHCI mode. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9584 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
48a0e6bfbd
commit
d716651f8c
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
SCSI disk driver that layers on every SCSI IO protocol in the system.
|
SCSI disk driver that layers on every SCSI IO protocol in the system.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2008, Intel Corporation. <BR>
|
Copyright (c) 2006 - 2009, Intel Corporation. <BR>
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -15,7 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
#include "ScsiDisk.h"
|
#include "ScsiDisk.h"
|
||||||
|
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gScsiDiskDriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gScsiDiskDriverBinding = {
|
||||||
ScsiDiskDriverBindingSupported,
|
ScsiDiskDriverBindingSupported,
|
||||||
ScsiDiskDriverBindingStart,
|
ScsiDiskDriverBindingStart,
|
||||||
@ -25,6 +24,13 @@ EFI_DRIVER_BINDING_PROTOCOL gScsiDiskDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EFI_DISK_INFO_PROTOCOL gScsiDiskInfoProtocolTemplate = {
|
||||||
|
EFI_DISK_INFO_SCSI_INTERFACE_GUID,
|
||||||
|
ScsiDiskInfoInquiry,
|
||||||
|
ScsiDiskInfoIdentify,
|
||||||
|
ScsiDiskInfoSenseData,
|
||||||
|
ScsiDiskInfoWhichIde
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module ScsiDisk.
|
The user Entry Point for module ScsiDisk.
|
||||||
@ -248,10 +254,13 @@ ScsiDiskDriverBindingStart (
|
|||||||
// Determine if Block IO should be produced on this controller handle
|
// Determine if Block IO should be produced on this controller handle
|
||||||
//
|
//
|
||||||
if (DetermineInstallBlockIo(Controller)) {
|
if (DetermineInstallBlockIo(Controller)) {
|
||||||
|
InitializeInstallDiskInfo(ScsiDiskDevice, Controller);
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Controller,
|
&Controller,
|
||||||
&gEfiBlockIoProtocolGuid,
|
&gEfiBlockIoProtocolGuid,
|
||||||
&ScsiDiskDevice->BlkIo,
|
&ScsiDiskDevice->BlkIo,
|
||||||
|
&gEfiDiskInfoProtocolGuid,
|
||||||
|
&ScsiDiskDevice->DiskInfo,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR(Status)) {
|
if (!EFI_ERROR(Status)) {
|
||||||
@ -333,10 +342,13 @@ ScsiDiskDriverBindingStop (
|
|||||||
}
|
}
|
||||||
|
|
||||||
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (BlkIo);
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (BlkIo);
|
||||||
Status = gBS->UninstallProtocolInterface (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Controller,
|
Controller,
|
||||||
&gEfiBlockIoProtocolGuid,
|
&gEfiBlockIoProtocolGuid,
|
||||||
&ScsiDiskDevice->BlkIo
|
&ScsiDiskDevice->BlkIo,
|
||||||
|
&gEfiDiskInfoProtocolGuid,
|
||||||
|
&ScsiDiskDevice->DiskInfo,
|
||||||
|
NULL
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
@ -366,7 +378,7 @@ ScsiDiskDriverBindingStop (
|
|||||||
@retval EFI_SUCCESS The device was reset.
|
@retval EFI_SUCCESS The device was reset.
|
||||||
@retval EFI_DEVICE_ERROR The device is not functioning properly and could
|
@retval EFI_DEVICE_ERROR The device is not functioning properly and could
|
||||||
not be reset.
|
not be reset.
|
||||||
@return EFI_STATUS is retured from EFI_SCSI_IO_PROTOCOL.ResetDevice().
|
@return EFI_STATUS is returned from EFI_SCSI_IO_PROTOCOL.ResetDevice().
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -649,7 +661,7 @@ ScsiDiskFlushBlocks (
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dectect Device and read out capacity ,if error occurs, parse the sense key.
|
Detect Device and read out capacity ,if error occurs, parse the sense key.
|
||||||
|
|
||||||
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@param MustReadCapacity The flag about reading device capacity
|
@param MustReadCapacity The flag about reading device capacity
|
||||||
@ -954,7 +966,7 @@ ScsiDiskInquiryDevice (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
To test deivice.
|
To test device.
|
||||||
|
|
||||||
When Test Unit Ready command succeeds, retrieve Sense Keys via Request Sense;
|
When Test Unit Ready command succeeds, retrieve Sense Keys via Request Sense;
|
||||||
When Test Unit Ready command encounters any error caused by host adapter or
|
When Test Unit Ready command encounters any error caused by host adapter or
|
||||||
@ -1380,7 +1392,7 @@ CheckTargetStatus (
|
|||||||
Retrieve all sense keys from the device.
|
Retrieve all sense keys from the device.
|
||||||
|
|
||||||
When encountering error during the process, if retrieve sense keys before
|
When encountering error during the process, if retrieve sense keys before
|
||||||
error encounterred, it returns the sense keys with return status set to EFI_SUCCESS,
|
error encountered, it returns the sense keys with return status set to EFI_SUCCESS,
|
||||||
and NeedRetry set to FALSE; otherwize, return the proper return status.
|
and NeedRetry set to FALSE; otherwize, return the proper return status.
|
||||||
|
|
||||||
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@ -1560,7 +1572,7 @@ ParseInquiryData (
|
|||||||
/**
|
/**
|
||||||
Read sector from SCSI Disk.
|
Read sector from SCSI Disk.
|
||||||
|
|
||||||
@param ScsiDiskDevice The poiniter of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@param Buffer The buffer to fill in the read out data
|
@param Buffer The buffer to fill in the read out data
|
||||||
@param Lba Logic block address
|
@param Lba Logic block address
|
||||||
@param NumberOfBlocks The number of blocks to read
|
@param NumberOfBlocks The number of blocks to read
|
||||||
@ -1664,7 +1676,7 @@ ScsiDiskReadSectors (
|
|||||||
/**
|
/**
|
||||||
Write sector to SCSI Disk.
|
Write sector to SCSI Disk.
|
||||||
|
|
||||||
@param ScsiDiskDevice The poiniter of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@param Buffer The buffer of data to be written into SCSI Disk
|
@param Buffer The buffer of data to be written into SCSI Disk
|
||||||
@param Lba Logic block address
|
@param Lba Logic block address
|
||||||
@param NumberOfBlocks The number of blocks to read
|
@param NumberOfBlocks The number of blocks to read
|
||||||
@ -1763,7 +1775,7 @@ ScsiDiskWriteSectors (
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sumbmit Read command.
|
Submit Read command.
|
||||||
|
|
||||||
@param ScsiDiskDevice The pointer of ScsiDiskDevice
|
@param ScsiDiskDevice The pointer of ScsiDiskDevice
|
||||||
@param NeedRetry The pointer of flag indicates if needs retry if error happens
|
@param NeedRetry The pointer of flag indicates if needs retry if error happens
|
||||||
@ -2036,7 +2048,7 @@ ScsiDiskIsHardwareError (
|
|||||||
@param SenseCounts The number of sense key
|
@param SenseCounts The number of sense key
|
||||||
|
|
||||||
@retval TRUE Media is changed.
|
@retval TRUE Media is changed.
|
||||||
@retval FALSE Medit is NOT changed.
|
@retval FALSE Media is NOT changed.
|
||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
ScsiDiskIsMediaChange (
|
ScsiDiskIsMediaChange (
|
||||||
@ -2256,7 +2268,7 @@ ReleaseScsiDiskDeviceResources (
|
|||||||
Determine if Block Io should be produced.
|
Determine if Block Io should be produced.
|
||||||
|
|
||||||
|
|
||||||
@param ChildHandle Child Handle to retrive Parent information.
|
@param ChildHandle Child Handle to retrieve Parent information.
|
||||||
|
|
||||||
@retval TRUE Should produce Block Io.
|
@retval TRUE Should produce Block Io.
|
||||||
@retval FALSE Should not produce Block Io.
|
@retval FALSE Should not produce Block Io.
|
||||||
@ -2353,3 +2365,276 @@ GetParentProtocol (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides inquiry information for the controller type.
|
||||||
|
|
||||||
|
This function is used by the IDE bus driver to get inquiry data. Data format
|
||||||
|
of Identify data is defined by the Interface GUID.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance.
|
||||||
|
@param[in,out] InquiryData Pointer to a buffer for the inquiry data.
|
||||||
|
@param[in,out] InquiryDataSize Pointer to the value for the inquiry data size.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The command was accepted without any errors.
|
||||||
|
@retval EFI_NOT_FOUND Device does not support this data class
|
||||||
|
@retval EFI_DEVICE_ERROR Error reading InquiryData from device
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL InquiryDataSize not big enough
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoInquiry (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
IN OUT VOID *InquiryData,
|
||||||
|
IN OUT UINT32 *InquiryDataSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
SCSI_DISK_DEV *ScsiDiskDevice;
|
||||||
|
|
||||||
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_DISKINFO (This);
|
||||||
|
|
||||||
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
|
if (*InquiryDataSize >= sizeof (ScsiDiskDevice->InquiryData)) {
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
CopyMem (InquiryData, &ScsiDiskDevice->InquiryData, sizeof (ScsiDiskDevice->InquiryData));
|
||||||
|
}
|
||||||
|
*InquiryDataSize = sizeof (ScsiDiskDevice->InquiryData);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides identify information for the controller type.
|
||||||
|
|
||||||
|
This function is used by the IDE bus driver to get identify data. Data format
|
||||||
|
of Identify data is defined by the Interface GUID.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL
|
||||||
|
instance.
|
||||||
|
@param[in,out] IdentifyData Pointer to a buffer for the identify data.
|
||||||
|
@param[in,out] IdentifyDataSize Pointer to the value for the identify data
|
||||||
|
size.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The command was accepted without any errors.
|
||||||
|
@retval EFI_NOT_FOUND Device does not support this data class
|
||||||
|
@retval EFI_DEVICE_ERROR Error reading IdentifyData from device
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL IdentifyDataSize not big enough
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoIdentify (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
IN OUT VOID *IdentifyData,
|
||||||
|
IN OUT UINT32 *IdentifyDataSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
SCSI_DISK_DEV *ScsiDiskDevice;
|
||||||
|
|
||||||
|
if (CompareGuid (&This->Interface, &gEfiDiskInfoScsiInterfaceGuid)) {
|
||||||
|
//
|
||||||
|
// Physical SCSI bus does not support this data class.
|
||||||
|
//
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_DISKINFO (This);
|
||||||
|
|
||||||
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
|
if (*IdentifyDataSize >= sizeof (ScsiDiskDevice->IdentifyData)) {
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
CopyMem (IdentifyData, &ScsiDiskDevice->IdentifyData, sizeof (ScsiDiskDevice->IdentifyData));
|
||||||
|
}
|
||||||
|
*IdentifyDataSize = sizeof (ScsiDiskDevice->IdentifyData);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides sense data information for the controller type.
|
||||||
|
|
||||||
|
This function is used by the IDE bus driver to get sense data.
|
||||||
|
Data format of Sense data is defined by the Interface GUID.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance.
|
||||||
|
@param[in,out] SenseData Pointer to the SenseData.
|
||||||
|
@param[in,out] SenseDataSize Size of SenseData in bytes.
|
||||||
|
@param[out] SenseDataNumber Pointer to the value for the sense data size.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The command was accepted without any errors.
|
||||||
|
@retval EFI_NOT_FOUND Device does not support this data class.
|
||||||
|
@retval EFI_DEVICE_ERROR Error reading SenseData from device.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL SenseDataSize not big enough.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoSenseData (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
IN OUT VOID *SenseData,
|
||||||
|
IN OUT UINT32 *SenseDataSize,
|
||||||
|
OUT UINT8 *SenseDataNumber
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function is used by the IDE bus driver to get controller information.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance.
|
||||||
|
@param[out] IdeChannel Pointer to the Ide Channel number. Primary or secondary.
|
||||||
|
@param[out] IdeDevice Pointer to the Ide Device number. Master or slave.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS IdeChannel and IdeDevice are valid.
|
||||||
|
@retval EFI_UNSUPPORTED This is not an IDE device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoWhichIde (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
OUT UINT32 *IdeChannel,
|
||||||
|
OUT UINT32 *IdeDevice
|
||||||
|
)
|
||||||
|
{
|
||||||
|
SCSI_DISK_DEV *ScsiDiskDevice;
|
||||||
|
|
||||||
|
if (CompareGuid (&This->Interface, &gEfiDiskInfoScsiInterfaceGuid)) {
|
||||||
|
//
|
||||||
|
// This is not an IDE physical device.
|
||||||
|
//
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_DISKINFO (This);
|
||||||
|
*IdeChannel = ScsiDiskDevice->Channel;
|
||||||
|
*IdeDevice = ScsiDiskDevice->Device;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Issues ATA IDENTIFY DEVICE command to identify ATAPI device.
|
||||||
|
|
||||||
|
This function tries to fill 512-byte ATAPI_IDENTIFY_DATA for ATAPI device to
|
||||||
|
implement Identify() interface for DiskInfo protocol. The ATA command is sent
|
||||||
|
via SCSI Request Packet.
|
||||||
|
|
||||||
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The ATAPI device identify data were retrieved successfully.
|
||||||
|
@retval others Some error occurred during the identification that ATAPI device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
AtapiIdentifyDevice (
|
||||||
|
IN OUT SCSI_DISK_DEV *ScsiDiskDevice
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
|
||||||
|
UINT8 Cdb[6];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize SCSI REQUEST_PACKET and 6-byte Cdb
|
||||||
|
//
|
||||||
|
ZeroMem (&CommandPacket, sizeof (CommandPacket));
|
||||||
|
ZeroMem (Cdb, sizeof (Cdb));
|
||||||
|
|
||||||
|
Cdb[0] = ATA_CMD_IDENTIFY_DEVICE;
|
||||||
|
CommandPacket.Timeout = EFI_TIMER_PERIOD_SECONDS (1);
|
||||||
|
CommandPacket.Cdb = Cdb;
|
||||||
|
CommandPacket.CdbLength = sizeof (Cdb);
|
||||||
|
CommandPacket.InDataBuffer = &ScsiDiskDevice->IdentifyData;
|
||||||
|
CommandPacket.InTransferLength = sizeof (ScsiDiskDevice->IdentifyData);
|
||||||
|
|
||||||
|
return ScsiDiskDevice->ScsiIo->ExecuteScsiCommand (ScsiDiskDevice->ScsiIo, &CommandPacket, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initialize the installation of DiskInfo protocol.
|
||||||
|
|
||||||
|
This function prepares for the installation of DiskInfo protocol on the child handle.
|
||||||
|
By default, it installs DiskInfo protocol with SCSI interface GUID. If it further
|
||||||
|
detects that the physical device is an ATAPI/AHCI device, it then updates interface GUID
|
||||||
|
to be IDE/AHCI interface GUID.
|
||||||
|
|
||||||
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV.
|
||||||
|
@param ChildHandle Child handle to install DiskInfo protocol.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
InitializeInstallDiskInfo (
|
||||||
|
IN SCSI_DISK_DEV *ScsiDiskDevice,
|
||||||
|
IN EFI_HANDLE ChildHandle
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *ChildDevicePathNode;
|
||||||
|
ATAPI_DEVICE_PATH *AtapiDevicePath;
|
||||||
|
SATA_DEVICE_PATH *SataDevicePath;
|
||||||
|
UINTN IdentifyRetry;
|
||||||
|
|
||||||
|
Status = gBS->HandleProtocol (ChildHandle, &gEfiDevicePathProtocolGuid, (VOID **) &DevicePathNode);
|
||||||
|
//
|
||||||
|
// Device Path protocol must be installed on the device handle.
|
||||||
|
//
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
//
|
||||||
|
// Copy the DiskInfo protocol template.
|
||||||
|
//
|
||||||
|
CopyMem (&ScsiDiskDevice->DiskInfo, &gScsiDiskInfoProtocolTemplate, sizeof (gScsiDiskInfoProtocolTemplate));
|
||||||
|
|
||||||
|
while (!IsDevicePathEnd (DevicePathNode)) {
|
||||||
|
ChildDevicePathNode = NextDevicePathNode (DevicePathNode);
|
||||||
|
if ((DevicePathType (DevicePathNode) == HARDWARE_DEVICE_PATH) &&
|
||||||
|
(DevicePathSubType (DevicePathNode) == HW_PCI_DP) &&
|
||||||
|
(DevicePathType (ChildDevicePathNode) == MESSAGING_DEVICE_PATH) &&
|
||||||
|
((DevicePathSubType (ChildDevicePathNode) == MSG_ATAPI_DP) ||
|
||||||
|
(DevicePathSubType (ChildDevicePathNode) == MSG_SATA_DP))) {
|
||||||
|
|
||||||
|
IdentifyRetry = 3;
|
||||||
|
do {
|
||||||
|
//
|
||||||
|
// Issue ATA Identify Device Command via SCSI command, which is required to publish DiskInfo protocol
|
||||||
|
// with IDE/AHCI interface GUID.
|
||||||
|
//
|
||||||
|
Status = AtapiIdentifyDevice (ScsiDiskDevice);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
if (DevicePathSubType(ChildDevicePathNode) == MSG_ATAPI_DP) {
|
||||||
|
//
|
||||||
|
// We find the valid ATAPI device path
|
||||||
|
//
|
||||||
|
AtapiDevicePath = (ATAPI_DEVICE_PATH *) ChildDevicePathNode;
|
||||||
|
ScsiDiskDevice->Channel = AtapiDevicePath->PrimarySecondary;
|
||||||
|
ScsiDiskDevice->Device = AtapiDevicePath->SlaveMaster;
|
||||||
|
//
|
||||||
|
// Update the DiskInfo.Interface to IDE interface GUID for the physical ATAPI device.
|
||||||
|
//
|
||||||
|
CopyGuid (&ScsiDiskDevice->DiskInfo.Interface, &gEfiDiskInfoIdeInterfaceGuid);
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// We find the valid SATA device path
|
||||||
|
//
|
||||||
|
SataDevicePath = (SATA_DEVICE_PATH *) ChildDevicePathNode;
|
||||||
|
ScsiDiskDevice->Channel = SataDevicePath->HBAPortNumber;
|
||||||
|
ScsiDiskDevice->Device = SataDevicePath->PortMultiplierPortNumber;
|
||||||
|
//
|
||||||
|
// Update the DiskInfo.Interface to AHCI interface GUID for the physical AHCI device.
|
||||||
|
//
|
||||||
|
CopyGuid (&ScsiDiskDevice->DiskInfo.Interface, &gEfiDiskInfoAhciInterfaceGuid);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} while (--IdentifyRetry > 0);
|
||||||
|
}
|
||||||
|
DevicePathNode = ChildDevicePathNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Header file for SCSI Disk Driver.
|
Header file for SCSI Disk Driver.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2008, Intel Corporation. <BR>
|
Copyright (c) 2004 - 2009, Intel Corporation. <BR>
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -25,6 +25,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
#include <Protocol/DriverBinding.h>
|
#include <Protocol/DriverBinding.h>
|
||||||
#include <Protocol/ScsiPassThruExt.h>
|
#include <Protocol/ScsiPassThruExt.h>
|
||||||
#include <Protocol/ScsiPassThru.h>
|
#include <Protocol/ScsiPassThru.h>
|
||||||
|
#include <Protocol/DiskInfo.h>
|
||||||
|
|
||||||
|
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/UefiDriverEntryPoint.h>
|
#include <Library/UefiDriverEntryPoint.h>
|
||||||
@ -33,8 +35,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/UefiScsiLib.h>
|
#include <Library/UefiScsiLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/DevicePathLib.h>
|
||||||
|
|
||||||
#include <IndustryStandard/Scsi.h>
|
#include <IndustryStandard/Scsi.h>
|
||||||
|
#include <IndustryStandard/Atapi.h>
|
||||||
|
|
||||||
#define IS_DEVICE_FIXED(a) (a)->FixedDevice ? 1 : 0
|
#define IS_DEVICE_FIXED(a) (a)->FixedDevice ? 1 : 0
|
||||||
|
|
||||||
@ -58,10 +62,20 @@ typedef struct {
|
|||||||
|
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
|
|
||||||
|
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The following fields are only valid for ATAPI/SATA device
|
||||||
|
//
|
||||||
|
UINT32 Channel;
|
||||||
|
UINT32 Device;
|
||||||
|
ATAPI_IDENTIFY_DATA IdentifyData;
|
||||||
} SCSI_DISK_DEV;
|
} SCSI_DISK_DEV;
|
||||||
|
|
||||||
#define SCSI_DISK_DEV_FROM_THIS(a) CR (a, SCSI_DISK_DEV, BlkIo, SCSI_DISK_DEV_SIGNATURE)
|
#define SCSI_DISK_DEV_FROM_THIS(a) CR (a, SCSI_DISK_DEV, BlkIo, SCSI_DISK_DEV_SIGNATURE)
|
||||||
|
|
||||||
|
#define SCSI_DISK_DEV_FROM_DISKINFO(a) CR (a, SCSI_DISK_DEV, DiskInfo, SCSI_DISK_DEV_SIGNATURE)
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global Variables
|
// Global Variables
|
||||||
//
|
//
|
||||||
@ -385,8 +399,107 @@ ScsiDiskFlushBlocks (
|
|||||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Dectect Device and read out capacity ,if error occurs, parse the sense key.
|
Provides inquiry information for the controller type.
|
||||||
|
|
||||||
|
This function is used by the IDE bus driver to get inquiry data. Data format
|
||||||
|
of Identify data is defined by the Interface GUID.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance.
|
||||||
|
@param[in,out] InquiryData Pointer to a buffer for the inquiry data.
|
||||||
|
@param[in,out] InquiryDataSize Pointer to the value for the inquiry data size.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The command was accepted without any errors.
|
||||||
|
@retval EFI_NOT_FOUND Device does not support this data class
|
||||||
|
@retval EFI_DEVICE_ERROR Error reading InquiryData from device
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL InquiryDataSize not big enough
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoInquiry (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
IN OUT VOID *InquiryData,
|
||||||
|
IN OUT UINT32 *InquiryDataSize
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides identify information for the controller type.
|
||||||
|
|
||||||
|
This function is used by the IDE bus driver to get identify data. Data format
|
||||||
|
of Identify data is defined by the Interface GUID.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL
|
||||||
|
instance.
|
||||||
|
@param[in,out] IdentifyData Pointer to a buffer for the identify data.
|
||||||
|
@param[in,out] IdentifyDataSize Pointer to the value for the identify data
|
||||||
|
size.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The command was accepted without any errors.
|
||||||
|
@retval EFI_NOT_FOUND Device does not support this data class
|
||||||
|
@retval EFI_DEVICE_ERROR Error reading IdentifyData from device
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL IdentifyDataSize not big enough
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoIdentify (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
IN OUT VOID *IdentifyData,
|
||||||
|
IN OUT UINT32 *IdentifyDataSize
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides sense data information for the controller type.
|
||||||
|
|
||||||
|
This function is used by the IDE bus driver to get sense data.
|
||||||
|
Data format of Sense data is defined by the Interface GUID.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance.
|
||||||
|
@param[in,out] SenseData Pointer to the SenseData.
|
||||||
|
@param[in,out] SenseDataSize Size of SenseData in bytes.
|
||||||
|
@param[out] SenseDataNumber Pointer to the value for the sense data size.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The command was accepted without any errors.
|
||||||
|
@retval EFI_NOT_FOUND Device does not support this data class.
|
||||||
|
@retval EFI_DEVICE_ERROR Error reading SenseData from device.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL SenseDataSize not big enough.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoSenseData (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
IN OUT VOID *SenseData,
|
||||||
|
IN OUT UINT32 *SenseDataSize,
|
||||||
|
OUT UINT8 *SenseDataNumber
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function is used by the IDE bus driver to get controller information.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance.
|
||||||
|
@param[out] IdeChannel Pointer to the Ide Channel number. Primary or secondary.
|
||||||
|
@param[out] IdeDevice Pointer to the Ide Device number. Master or slave.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS IdeChannel and IdeDevice are valid.
|
||||||
|
@retval EFI_UNSUPPORTED This is not an IDE device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ScsiDiskInfoWhichIde (
|
||||||
|
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||||
|
OUT UINT32 *IdeChannel,
|
||||||
|
OUT UINT32 *IdeDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Detect Device and read out capacity ,if error occurs, parse the sense key.
|
||||||
|
|
||||||
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@param MustReadCapacity The flag about reading device capacity
|
@param MustReadCapacity The flag about reading device capacity
|
||||||
@ -404,7 +517,7 @@ ScsiDiskDetectMedia (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
To test deivice.
|
To test device.
|
||||||
|
|
||||||
When Test Unit Ready command succeeds, retrieve Sense Keys via Request Sense;
|
When Test Unit Ready command succeeds, retrieve Sense Keys via Request Sense;
|
||||||
When Test Unit Ready command encounters any error caused by host adapter or
|
When Test Unit Ready command encounters any error caused by host adapter or
|
||||||
@ -505,7 +618,7 @@ CheckTargetStatus (
|
|||||||
Retrieve all sense keys from the device.
|
Retrieve all sense keys from the device.
|
||||||
|
|
||||||
When encountering error during the process, if retrieve sense keys before
|
When encountering error during the process, if retrieve sense keys before
|
||||||
error encounterred, it returns the sense keys with return status set to EFI_SUCCESS,
|
error encountered, it returns the sense keys with return status set to EFI_SUCCESS,
|
||||||
and NeedRetry set to FALSE; otherwize, return the proper return status.
|
and NeedRetry set to FALSE; otherwize, return the proper return status.
|
||||||
|
|
||||||
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@ -557,7 +670,7 @@ ParseInquiryData (
|
|||||||
/**
|
/**
|
||||||
Read sector from SCSI Disk.
|
Read sector from SCSI Disk.
|
||||||
|
|
||||||
@param ScsiDiskDevice The poiniter of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@param Buffer The buffer to fill in the read out data
|
@param Buffer The buffer to fill in the read out data
|
||||||
@param Lba Logic block address
|
@param Lba Logic block address
|
||||||
@param NumberOfBlocks The number of blocks to read
|
@param NumberOfBlocks The number of blocks to read
|
||||||
@ -577,7 +690,7 @@ ScsiDiskReadSectors (
|
|||||||
/**
|
/**
|
||||||
Write sector to SCSI Disk.
|
Write sector to SCSI Disk.
|
||||||
|
|
||||||
@param ScsiDiskDevice The poiniter of SCSI_DISK_DEV
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV
|
||||||
@param Buffer The buffer of data to be written into SCSI Disk
|
@param Buffer The buffer of data to be written into SCSI Disk
|
||||||
@param Lba Logic block address
|
@param Lba Logic block address
|
||||||
@param NumberOfBlocks The number of blocks to read
|
@param NumberOfBlocks The number of blocks to read
|
||||||
@ -595,7 +708,7 @@ ScsiDiskWriteSectors (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sumbmit Read command.
|
Submit Read command.
|
||||||
|
|
||||||
@param ScsiDiskDevice The pointer of ScsiDiskDevice
|
@param ScsiDiskDevice The pointer of ScsiDiskDevice
|
||||||
@param NeedRetry The pointer of flag indicates if needs retry if error happens
|
@param NeedRetry The pointer of flag indicates if needs retry if error happens
|
||||||
@ -792,7 +905,7 @@ ReleaseScsiDiskDeviceResources (
|
|||||||
Determine if Block Io should be produced.
|
Determine if Block Io should be produced.
|
||||||
|
|
||||||
|
|
||||||
@param ChildHandle Child Handle to retrive Parent information.
|
@param ChildHandle Child Handle to retrieve Parent information.
|
||||||
|
|
||||||
@retval TRUE Should produce Block Io.
|
@retval TRUE Should produce Block Io.
|
||||||
@retval FALSE Should not produce Block Io.
|
@retval FALSE Should not produce Block Io.
|
||||||
@ -803,6 +916,24 @@ DetermineInstallBlockIo (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initialize the installation of DiskInfo protocol.
|
||||||
|
|
||||||
|
This function prepares for the installation of DiskInfo protocol on the child handle.
|
||||||
|
By default, it installs DiskInfo protocol with SCSI interface GUID. If it further
|
||||||
|
detects that the physical device is an ATAPI/AHCI device, it then updates interface GUID
|
||||||
|
to be IDE/AHCI interface GUID.
|
||||||
|
|
||||||
|
@param ScsiDiskDevice The pointer of SCSI_DISK_DEV.
|
||||||
|
@param ChildHandle Child handle to install DiskInfo protocol.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
InitializeInstallDiskInfo (
|
||||||
|
IN SCSI_DISK_DEV *ScsiDiskDevice,
|
||||||
|
IN EFI_HANDLE ChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Search protocol database and check to see if the protocol
|
Search protocol database and check to see if the protocol
|
||||||
specified by ProtocolGuid is present on a ControllerHandle and opened by
|
specified by ProtocolGuid is present on a ControllerHandle and opened by
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
# Scsi Disk driver. This driver detects the Scsi disk media and installs Block I/O Protocol
|
# Scsi Disk driver. This driver detects the Scsi disk media and installs Block I/O Protocol
|
||||||
# on the device handle that holds the SCSI I/O Portocol.
|
# on the device handle that holds the SCSI I/O Portocol.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2006 - 2008, Intel Corporation. <BR>
|
# Copyright (c) 2006 - 2009, Intel Corporation. <BR>
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# 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
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -50,11 +50,16 @@
|
|||||||
UefiLib
|
UefiLib
|
||||||
UefiDriverEntryPoint
|
UefiDriverEntryPoint
|
||||||
DebugLib
|
DebugLib
|
||||||
|
DevicePathLib
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
|
gEfiDiskInfoProtocolGuid ## BY_START
|
||||||
gEfiBlockIoProtocolGuid ## BY_START
|
gEfiBlockIoProtocolGuid ## BY_START
|
||||||
gEfiScsiIoProtocolGuid ## TO_START
|
gEfiScsiIoProtocolGuid ## TO_START
|
||||||
gEfiScsiPassThruProtocolGuid ## TO_START
|
gEfiScsiPassThruProtocolGuid ## TO_START
|
||||||
gEfiExtScsiPassThruProtocolGuid ## TO_START
|
gEfiExtScsiPassThruProtocolGuid ## TO_START
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gEfiDiskInfoScsiInterfaceGuid ## SOMETIME_PRODUCES (The device is physical SCSI disk)
|
||||||
|
gEfiDiskInfoIdeInterfaceGuid ## SOMETIME_PRODUCES (The device is ATAPI device in IDE mode)
|
||||||
|
gEfiDiskInfoAhciInterfaceGuid ## SOMETIME_PRODUCES (The device is ATAPI device in AHCI mode)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user