Code Review #2

svn path=/branches/GSoC_2016/AHCI/; revision=71607
This commit is contained in:
Aman Priyadarshi 2016-06-10 08:27:20 +00:00
parent dc4ae1e279
commit c9f49ee82b
2 changed files with 104 additions and 91 deletions

View file

@ -13,49 +13,49 @@
* *
* Initialize port by setting up PxCLB & PxFB Registers * Initialize port by setting up PxCLB & PxFB Registers
* *
* @param portExtension * @param PortExtension
* *
* @return * @return
* Return true if intialization was successful * Return true if intialization was successful
*/ */
BOOLEAN BOOLEAN
AhciPortInitialize ( AhciPortInitialize (
__in PAHCI_PORT_EXTENSION portExtension __in PAHCI_PORT_EXTENSION PortExtension
) )
{ {
ULONG mappedLength; ULONG mappedLength, portNumber;
PAHCI_MEMORY_REGISTERS abar; PAHCI_MEMORY_REGISTERS abar;
PAHCI_ADAPTER_EXTENSION adapterExtension; PAHCI_ADAPTER_EXTENSION adapterExtension;
STOR_PHYSICAL_ADDRESS commandListPhysical, receivedFISPhysical; STOR_PHYSICAL_ADDRESS commandListPhysical, receivedFISPhysical;
DebugPrint("AhciPortInitialize()\n"); DebugPrint("AhciPortInitialize()\n");
NT_ASSERT(portExtension != NULL); adapterExtension = PortExtension->AdapterExtension;
adapterExtension = portExtension->AdapterExtension;
abar = adapterExtension->ABAR_Address; abar = adapterExtension->ABAR_Address;
portNumber = PortExtension->PortNumber;
NT_ASSERT(abar != NULL); NT_ASSERT(abar != NULL);
NT_ASSERT(portNumber < MAXIMUM_AHCI_PORT_COUNT);
portExtension->Port = &abar->PortList[portExtension->PortNumber]; PortExtension->Port = &abar->PortList[portNumber];
commandListPhysical = StorPortGetPhysicalAddress( adapterExtension, commandListPhysical = StorPortGetPhysicalAddress(adapterExtension,
NULL, NULL,
portExtension->CommandList, PortExtension->CommandList,
&mappedLength); &mappedLength);
if ((mappedLength) == 0 || ((commandListPhysical.LowPart % 1024) != 0)) if ((mappedLength == 0) || ((commandListPhysical.LowPart % 1024) != 0))
{ {
DebugPrint("\tcommandListPhysical mappedLength:%d\n", mappedLength); DebugPrint("\tcommandListPhysical mappedLength:%d\n", mappedLength);
return FALSE; return FALSE;
} }
receivedFISPhysical = StorPortGetPhysicalAddress( adapterExtension, receivedFISPhysical = StorPortGetPhysicalAddress(adapterExtension,
NULL, NULL,
portExtension->ReceivedFIS, PortExtension->ReceivedFIS,
&mappedLength); &mappedLength);
if ((mappedLength) == 0 || ((receivedFISPhysical.LowPart % 1024) != 0)) if ((mappedLength == 0) || ((receivedFISPhysical.LowPart % 256) != 0))
{ {
DebugPrint("\treceivedFISPhysical mappedLength:%d\n", mappedLength); DebugPrint("\treceivedFISPhysical mappedLength:%d\n", mappedLength);
return FALSE; return FALSE;
@ -71,16 +71,16 @@ AhciPortInitialize (
//  PxCLB and PxCLBU (if CAP.S64A is set to 1) //  PxCLB and PxCLBU (if CAP.S64A is set to 1)
//  PxFB and PxFBU (if CAP.S64A is set to 1) //  PxFB and PxFBU (if CAP.S64A is set to 1)
// Note: Assuming 32bit support only // Note: Assuming 32bit support only
StorPortWriteRegisterUlong(adapterExtension, &portExtension->Port->CLB, commandListPhysical.LowPart); StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->CLB, commandListPhysical.LowPart);
StorPortWriteRegisterUlong(adapterExtension, &portExtension->Port->FB, receivedFISPhysical.LowPart); StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->FB, receivedFISPhysical.LowPart);
// set device power state flag to D0 // set device power state flag to D0
portExtension->DevicePowerState = StorPowerDeviceD0; PortExtension->DevicePowerState = StorPowerDeviceD0;
// clear pending interrupts // clear pending interrupts
StorPortWriteRegisterUlong(adapterExtension, &portExtension->Port->SERR, (ULONG)-1); StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->SERR, (ULONG)-1);
StorPortWriteRegisterUlong(adapterExtension, &portExtension->Port->IS, (ULONG)-1); StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->IS, (ULONG)-1);
StorPortWriteRegisterUlong(adapterExtension, portExtension->AdapterExtension->IS, (1 << portExtension->PortNumber)); StorPortWriteRegisterUlong(adapterExtension, PortExtension->AdapterExtension->IS, (1 << PortExtension->PortNumber));
return TRUE; return TRUE;
}// -- AhciPortInitialize(); }// -- AhciPortInitialize();
@ -91,7 +91,7 @@ AhciPortInitialize (
* *
* Allocate memory from poll for required pointers * Allocate memory from poll for required pointers
* *
* @param adapterExtension * @param AdapterExtension
* @param ConfigInfo * @param ConfigInfo
* *
* @return * @return
@ -99,8 +99,8 @@ AhciPortInitialize (
*/ */
BOOLEAN BOOLEAN
AhciAllocateResourceForAdapter ( AhciAllocateResourceForAdapter (
__in PAHCI_ADAPTER_EXTENSION adapterExtension, __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in PPORT_CONFIGURATION_INFORMATION ConfigInfo __in PPORT_CONFIGURATION_INFORMATION ConfigInfo
) )
{ {
PVOID portsExtension = NULL; PVOID portsExtension = NULL;
@ -110,19 +110,23 @@ AhciAllocateResourceForAdapter (
DebugPrint("AhciAllocateResourceForAdapter()\n"); DebugPrint("AhciAllocateResourceForAdapter()\n");
NCS = AHCI_Global_Port_CAP_NCS(adapterExtension->CAP); NCS = AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP);
AlignedNCS = ROUND_UP(NCS, 8); AlignedNCS = ROUND_UP(NCS, 8);
// get port count -- Number of set bits in `adapterExtension->PortImplemented` // get port count -- Number of set bits in `AdapterExtension->PortImplemented`
portCount = 0; portCount = 0;
portImplemented = adapterExtension->PortImplemented; portImplemented = AdapterExtension->PortImplemented;
// make sure we don't allocate too much memory for the ports we have not implemented
// LOGIC: AND with all MAXIMUM_AHCI_PORT_COUNT (low significant) bits set
portImplemented = portImplemented & ((1 << MAXIMUM_AHCI_PORT_COUNT) - 1);
while (portImplemented > 0) while (portImplemented > 0)
{ {
portCount++; portCount++;
portImplemented &= (portImplemented - 1); portImplemented &= (portImplemented - 1);
} }
NT_ASSERT(portCount != 0); NT_ASSERT(portCount <= MAXIMUM_AHCI_PORT_COUNT);
DebugPrint("\tPort Count: %d\n", portCount); DebugPrint("\tPort Count: %d\n", portCount);
nonCachedExtensionSize = sizeof(AHCI_COMMAND_HEADER) * AlignedNCS + //should be 1K aligned nonCachedExtensionSize = sizeof(AHCI_COMMAND_HEADER) * AlignedNCS + //should be 1K aligned
@ -131,29 +135,29 @@ AhciAllocateResourceForAdapter (
// align nonCachedExtensionSize to 1024 // align nonCachedExtensionSize to 1024
nonCachedExtensionSize = ROUND_UP(nonCachedExtensionSize, 1024); nonCachedExtensionSize = ROUND_UP(nonCachedExtensionSize, 1024);
adapterExtension->NonCachedExtension = StorPortGetUncachedExtension( adapterExtension, AdapterExtension->NonCachedExtension = StorPortGetUncachedExtension(AdapterExtension,
ConfigInfo, ConfigInfo,
nonCachedExtensionSize * portCount); nonCachedExtensionSize * portCount);
if (adapterExtension->NonCachedExtension == NULL) if (AdapterExtension->NonCachedExtension == NULL)
{ {
DebugPrint("\tadapterExtension->NonCachedExtension == NULL\n"); DebugPrint("\tadapterExtension->NonCachedExtension == NULL\n");
return FALSE; return FALSE;
} }
nonCachedExtension = adapterExtension->NonCachedExtension; nonCachedExtension = AdapterExtension->NonCachedExtension;
AhciZeroMemory(nonCachedExtension, nonCachedExtensionSize * portCount); AhciZeroMemory(nonCachedExtension, nonCachedExtensionSize * portCount);
for (index = 0; index < MAXIMUM_AHCI_PORT_COUNT; index++) for (index = 0; index < MAXIMUM_AHCI_PORT_COUNT; index++)
{ {
adapterExtension->PortExtension[index].IsActive = FALSE; AdapterExtension->PortExtension[index].IsActive = FALSE;
if ((adapterExtension->PortImplemented & (1 << index)) != 0) if ((AdapterExtension->PortImplemented & (1 << index)) != 0)
{ {
adapterExtension->PortExtension[index].PortNumber = index; AdapterExtension->PortExtension[index].PortNumber = index;
adapterExtension->PortExtension[index].IsActive = TRUE; AdapterExtension->PortExtension[index].IsActive = TRUE;
adapterExtension->PortExtension[index].AdapterExtension = adapterExtension; AdapterExtension->PortExtension[index].AdapterExtension = AdapterExtension;
adapterExtension->PortExtension[index].CommandList = nonCachedExtension; AdapterExtension->PortExtension[index].CommandList = nonCachedExtension;
adapterExtension->PortExtension[index].ReceivedFIS = (PAHCI_RECEIVED_FIS)(nonCachedExtension + sizeof(AHCI_COMMAND_HEADER) * AlignedNCS); AdapterExtension->PortExtension[index].ReceivedFIS = (PAHCI_RECEIVED_FIS)(nonCachedExtension + sizeof(AHCI_COMMAND_HEADER) * AlignedNCS);
nonCachedExtension += nonCachedExtensionSize; nonCachedExtension += nonCachedExtensionSize;
} }
} }
@ -174,7 +178,7 @@ AhciAllocateResourceForAdapter (
*/ */
BOOLEAN BOOLEAN
AhciHwInitialize ( AhciHwInitialize (
__in PVOID AdapterExtension __in PVOID AdapterExtension
) )
{ {
ULONG ghc, messageCount, status; ULONG ghc, messageCount, status;
@ -205,18 +209,18 @@ AhciHwInitialize (
* @name AhciInterruptHandler * @name AhciInterruptHandler
* @implemented * @implemented
* *
* Interrupt Handler for portExtension * Interrupt Handler for PortExtension
* *
* @param portExtension * @param PortExtension
* *
*/ */
VOID VOID
AhciInterruptHandler ( AhciInterruptHandler (
__in PAHCI_PORT_EXTENSION portExtension __in PAHCI_PORT_EXTENSION PortExtension
) )
{ {
DebugPrint("AhciInterruptHandler()\n"); DebugPrint("AhciInterruptHandler()\n");
DebugPrint("\tPort Number: %d\n", portExtension->PortNumber); DebugPrint("\tPort Number: %d\n", PortExtension->PortNumber);
}// -- AhciInterruptHandler(); }// -- AhciInterruptHandler();
@ -234,7 +238,7 @@ AhciInterruptHandler (
*/ */
BOOLEAN BOOLEAN
AhciHwInterrupt( AhciHwInterrupt(
__in PVOID AdapterExtension __in PVOID AdapterExtension
) )
{ {
ULONG portPending, nextPort, i; ULONG portPending, nextPort, i;
@ -265,8 +269,8 @@ AhciHwInterrupt(
if ((portPending & (0x1 << nextPort)) == 0) if ((portPending & (0x1 << nextPort)) == 0)
continue; continue;
if ((nextPort == adapterExtension->LastInterruptPort) if ((nextPort == adapterExtension->LastInterruptPort) ||
|| (adapterExtension->PortExtension[nextPort].IsActive == FALSE)) (adapterExtension->PortExtension[nextPort].IsActive == FALSE))
{ {
return FALSE; return FALSE;
} }
@ -296,8 +300,8 @@ AhciHwInterrupt(
*/ */
BOOLEAN BOOLEAN
AhciHwStartIo ( AhciHwStartIo (
__in PVOID AdapterExtension, __in PVOID AdapterExtension,
__in PSCSI_REQUEST_BLOCK Srb __in PSCSI_REQUEST_BLOCK Srb
) )
{ {
UCHAR function, pathId; UCHAR function, pathId;
@ -404,8 +408,8 @@ AhciHwStartIo (
*/ */
BOOLEAN BOOLEAN
AhciHwResetBus ( AhciHwResetBus (
__in PVOID AdapterExtension, __in PVOID AdapterExtension,
__in ULONG PathId __in ULONG PathId
) )
{ {
PAHCI_ADAPTER_EXTENSION adapterExtension; PAHCI_ADAPTER_EXTENSION adapterExtension;
@ -451,12 +455,12 @@ AhciHwResetBus (
*/ */
ULONG ULONG
AhciHwFindAdapter ( AhciHwFindAdapter (
__in PVOID AdapterExtension, __in PVOID AdapterExtension,
__in PVOID HwContext, __in PVOID HwContext,
__in PVOID BusInformation, __in PVOID BusInformation,
__in PVOID ArgumentString, __in PVOID ArgumentString,
__inout PPORT_CONFIGURATION_INFORMATION ConfigInfo, __inout PPORT_CONFIGURATION_INFORMATION ConfigInfo,
__in PBOOLEAN Reserved3 __in PBOOLEAN Reserved3
) )
{ {
ULONG ghc; ULONG ghc;
@ -498,7 +502,9 @@ AhciHwFindAdapter (
// The last PCI base address register (BAR[5], header offset 0x24) points to the AHCI base memory, its called ABAR (AHCI Base Memory Register). // The last PCI base address register (BAR[5], header offset 0x24) points to the AHCI base memory, its called ABAR (AHCI Base Memory Register).
adapterExtension->AhciBaseAddress = pciConfigData->u.type0.BaseAddresses[5] & (0xFFFFFFF0); adapterExtension->AhciBaseAddress = pciConfigData->u.type0.BaseAddresses[5] & (0xFFFFFFF0);
DebugPrint("\tVendorID:%d DeviceID:%d RevisionID:%d\n", adapterExtension->VendorID, adapterExtension->DeviceID, adapterExtension->RevisionID); DebugPrint("\tVendorID:%d DeviceID:%d RevisionID:%d\n", adapterExtension->VendorID,
adapterExtension->DeviceID,
adapterExtension->RevisionID);
// 2.1.11 // 2.1.11
abar = NULL; abar = NULL;
@ -542,7 +548,8 @@ AhciHwFindAdapter (
{ {
// reset controller to have it in known state // reset controller to have it in known state
DebugPrint("\tAE Already set, Reset()\n"); DebugPrint("\tAE Already set, Reset()\n");
if (!AhciAdapterReset(adapterExtension)){ if (!AhciAdapterReset(adapterExtension))
{
DebugPrint("\tReset Failed!\n"); DebugPrint("\tReset Failed!\n");
return SP_RETURN_ERROR;// reset failed return SP_RETURN_ERROR;// reset failed
} }
@ -603,8 +610,8 @@ AhciHwFindAdapter (
*/ */
ULONG ULONG
DriverEntry ( DriverEntry (
__in PVOID DriverObject, __in PVOID DriverObject,
__in PVOID RegistryPath __in PVOID RegistryPath
) )
{ {
HW_INITIALIZATION_DATA hwInitializationData; HW_INITIALIZATION_DATA hwInitializationData;
@ -664,22 +671,22 @@ DriverEntry (
* If the HBA has not cleared GHC.HR to 0 within 1 second of software setting GHC.HR to 1, the HBA is in * If the HBA has not cleared GHC.HR to 0 within 1 second of software setting GHC.HR to 1, the HBA is in
* a hung or locked state. * a hung or locked state.
* *
* @param adapterExtension * @param AdapterExtension
* *
* @return * @return
* TRUE in case AHCI Controller RESTARTED successfully. i.e GHC.HR == 0 * TRUE in case AHCI Controller RESTARTED successfully. i.e GHC.HR == 0
*/ */
BOOLEAN BOOLEAN
AhciAdapterReset ( AhciAdapterReset (
__in PAHCI_ADAPTER_EXTENSION adapterExtension __in PAHCI_ADAPTER_EXTENSION AdapterExtension
) )
{ {
ULONG ghc, ticks; ULONG ghc, ticks, ghcStatus;
PAHCI_MEMORY_REGISTERS abar = NULL; PAHCI_MEMORY_REGISTERS abar = NULL;
DebugPrint("AhciAdapterReset()\n"); DebugPrint("AhciAdapterReset()\n");
abar = adapterExtension->ABAR_Address; abar = AdapterExtension->ABAR_Address;
if (abar == NULL) // basic sanity if (abar == NULL) // basic sanity
{ {
return FALSE; return FALSE;
@ -687,11 +694,12 @@ AhciAdapterReset (
// HR -- Very first bit (lowest significant) // HR -- Very first bit (lowest significant)
ghc = AHCI_Global_HBA_CONTROL_HR; ghc = AHCI_Global_HBA_CONTROL_HR;
StorPortWriteRegisterUlong(adapterExtension, &abar->GHC, ghc); StorPortWriteRegisterUlong(AdapterExtension, &abar->GHC, ghc);
for (ticks = 0; ticks < 50; ++ticks) for (ticks = 0; ticks < 50; ++ticks)
{ {
if ((StorPortReadRegisterUlong(adapterExtension, &abar->GHC) & AHCI_Global_HBA_CONTROL_HR) == 0) ghcStatus = StorPortReadRegisterUlong(AdapterExtension, &abar->GHC);
if ((ghcStatus & AHCI_Global_HBA_CONTROL_HR) == 0)
{ {
break; break;
} }
@ -713,18 +721,21 @@ AhciAdapterReset (
* *
* Clear buffer by filling zeros * Clear buffer by filling zeros
* *
* @param buffer * @param Buffer
* @param BufferSize
*/ */
__inline __inline
VOID VOID
AhciZeroMemory ( AhciZeroMemory (
__out PCHAR buffer, __out PCHAR Buffer,
__in ULONG bufferSize __in ULONG BufferSize
) )
{ {
ULONG i; ULONG i;
for (i = 0; i < bufferSize; i++) for (i = 0; i < BufferSize; i++)
buffer[i] = 0; {
Buffer[i] = 0;
}
}// -- AhciZeroMemory(); }// -- AhciZeroMemory();
/** /**
@ -733,7 +744,7 @@ AhciZeroMemory (
* *
* Tells wheather given port is implemented or not * Tells wheather given port is implemented or not
* *
* @param adapterExtension * @param AdapterExtension
* @param PathId * @param PathId
* *
* @return * @return
@ -742,8 +753,8 @@ AhciZeroMemory (
__inline __inline
BOOLEAN BOOLEAN
IsPortValid ( IsPortValid (
__in PAHCI_ADAPTER_EXTENSION adapterExtension, __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in UCHAR pathId __in UCHAR pathId
) )
{ {
NT_ASSERT(pathId >= 0); NT_ASSERT(pathId >= 0);
@ -753,7 +764,7 @@ IsPortValid (
return FALSE; return FALSE;
} }
return adapterExtension->PortExtension[pathId].IsActive; return AdapterExtension->PortExtension[pathId].IsActive;
}// -- IsPortValid() }// -- IsPortValid()
/** /**
@ -762,7 +773,7 @@ IsPortValid (
* *
* Tells wheather given port is implemented or not * Tells wheather given port is implemented or not
* *
* @param adapterExtension * @param AdapterExtension
* @param Srb * @param Srb
* @param Cdb * @param Cdb
* *
@ -774,9 +785,9 @@ IsPortValid (
*/ */
ULONG ULONG
DeviceInquiryRequest ( DeviceInquiryRequest (
__in PAHCI_ADAPTER_EXTENSION adapterExtension, __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in PSCSI_REQUEST_BLOCK Srb, __in PSCSI_REQUEST_BLOCK Srb,
__in PCDB Cdb __in PCDB Cdb
) )
{ {
PVOID DataBuffer; PVOID DataBuffer;
@ -798,7 +809,9 @@ DeviceInquiryRequest (
DataBufferLength = Srb->DataTransferLength; DataBufferLength = Srb->DataTransferLength;
if (DataBuffer == NULL) if (DataBuffer == NULL)
{
return SRB_STATUS_INVALID_REQUEST; return SRB_STATUS_INVALID_REQUEST;
}
AhciZeroMemory(DataBuffer, DataBufferLength); AhciZeroMemory(DataBuffer, DataBufferLength);
} }

View file

@ -250,26 +250,26 @@ typedef struct _AHCI_SRB_EXTENSION
BOOLEAN BOOLEAN
AhciAdapterReset ( AhciAdapterReset (
__in PAHCI_ADAPTER_EXTENSION adapterExtension __in PAHCI_ADAPTER_EXTENSION AdapterExtension
); );
__inline __inline
VOID VOID
AhciZeroMemory ( AhciZeroMemory (
__out PCHAR buffer, __out PCHAR Buffer,
__in ULONG bufferSize __in ULONG BufferSize
); );
__inline __inline
BOOLEAN BOOLEAN
IsPortValid ( IsPortValid (
__in PAHCI_ADAPTER_EXTENSION adapterExtension, __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in UCHAR pathId __in UCHAR pathId
); );
ULONG ULONG
DeviceInquiryRequest ( DeviceInquiryRequest (
__in PAHCI_ADAPTER_EXTENSION adapterExtension, __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in PSCSI_REQUEST_BLOCK Srb, __in PSCSI_REQUEST_BLOCK Srb,
__in PCDB Cdb __in PCDB Cdb
); );