Author: apriyadarshi
Date: Thu Jun 2 14:13:06 2016
New Revision: 71499
URL:
http://svn.reactos.org/svn/reactos?rev=71499&view=rev
Log:
== Storahci driver
- Added DriverEntry
- Added AhciFindAdapter : Need to add code for port initialization.
- Compile : OK
- Test : NOT TESTED
Added:
branches/GSoC_2016/AHCI/drivers/storage/storahci/
branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile (with props)
branches/GSoC_2016/AHCI/drivers/storage/storahci/sources (with props)
branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c (with props)
branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h (with props)
Added: branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile (added)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile [iso-8859-1] Thu Jun 2
14:13:06 2016
@@ -0,0 +1,3 @@
+
+MINIMUM_NT_TARGET_VERSION=0x502
+!INCLUDE $(NTMAKEENV)\makefile.def
Propchange: branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/GSoC_2016/AHCI/drivers/storage/storahci/sources
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/sources (added)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/sources [iso-8859-1] Thu Jun 2
14:13:06 2016
@@ -0,0 +1,8 @@
+TARGETNAME = storahci
+TARGETTYPE = MINIPORT
+
+TARGETLIBS=$(DDK_LIB_PATH)\storport.lib
+
+INCLUDES = %BUILD%\inc
+LIBS = %BUILD%\lib
+SOURCES = storahci.c
Propchange: branches/GSoC_2016/AHCI/drivers/storage/storahci/sources
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c (added)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c [iso-8859-1] Thu Jun 2
14:13:06 2016
@@ -0,0 +1,231 @@
+#include "storahci.h"
+
+BOOLEAN AhciAdapterReset(
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension
+);
+
+ULONG AhciFindAdapter(
+ IN PVOID DeviceExtension,
+ __in PVOID HwContext,
+ __in PVOID BusInformation,
+ __in IN PVOID ArgumentString,
+ __inout PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ __in PBOOLEAN Reserved3
+)
+{
+ /* Description :
+ * The HwStorFindAdapter routine uses the supplied configuration to determine whether a
specific
+ * HBA is supported and, if it is, to return configuration information about that
adapter.
+ *
+ * Refernce:
+ * 10.1 Platform Communication
+
*
http://www.intel.in/content/dam/www/public/us/en/documents/technical-specif…
+ *
+ * Return Value:
+ * SP_RETURN_FOUND
+ * Indicates that a supported HBA was found and that the HBA-relevant configuration
information was successfully determined and set in the PORT_CONFIGURATION_INFORMATION
structure.
+ *
+ * SP_RETURN_ERROR
+ * Indicates that an HBA was found but there was an error obtaining the configuration
information. If possible, such an error should be logged with StorPortLogError.
+ *
+ * SP_RETURN_BAD_CONFIG
+ * Indicates that the supplied configuration information was invalid for the adapter.
+ *
+ * SP_RETURN_NOT_FOUND
+ * Indicates that no supported HBA was found for the supplied configuration
information.
+ */
+
+ ULONG ghc;
+ ULONG portCount, portImplemented;
+ ULONG pci_cfg_len;
+ UCHAR pci_cfg_buf[0x30];
+
+ PAHCI_MEMORY_REGISTERS abar;
+ PPCI_COMMON_CONFIG pciConfigData;
+ PAHCI_ADAPTER_EXTENSION adapterExtension;
+
+ adapterExtension = (PAHCI_ADAPTER_EXTENSION)DeviceExtension;
+ adapterExtension->SlotNumber = ConfigInfo->SlotNumber;
+ adapterExtension->SystemIoBusNumber = ConfigInfo->SystemIoBusNumber;
+
+ // get PCI configuration header
+ pci_cfg_len = StorPortGetBusData(
+ adapterExtension,
+ PCIConfiguration,
+ adapterExtension->SystemIoBusNumber,
+ adapterExtension->SlotNumber,
+ (PVOID)pci_cfg_buf,
+ (ULONG)0x30);
+
+ if (pci_cfg_len != 0x30)
+ return SP_RETURN_ERROR;//Not a valid device at the given bus number
+
+ pciConfigData = (PPCI_COMMON_CONFIG)pci_cfg_buf;
+ adapterExtension->VendorID = pciConfigData->VendorID;
+ adapterExtension->DeviceID = pciConfigData->DeviceID;
+ adapterExtension->RevisionID = pciConfigData->RevisionID;
+ // The last PCI base address register (BAR[5], header offset 0x24) points to the AHCI
base memory, itâs called ABAR (AHCI Base Memory Register).
+ adapterExtension->AhciBaseAddress = pciConfigData->u.type0.BaseAddresses[5] &
(0xFFFFFFF0);
+
+ // 2.1.11
+ abar = NULL;
+ if (ConfigInfo->NumberOfAccessRanges > 0)
+ {
+ ULONG accessIndex;
+ for (accessIndex = 0; accessIndex < ConfigInfo->NumberOfAccessRanges;
accessIndex++)
+ {
+ if ((*(ConfigInfo->AccessRanges))[accessIndex].RangeStart.QuadPart ==
adapterExtension->AhciBaseAddress)
+ {
+ abar = (PAHCI_MEMORY_REGISTERS)StorPortGetDeviceBase(
+ adapterExtension,
+ ConfigInfo->AdapterInterfaceType,
+ ConfigInfo->SystemIoBusNumber,
+ (*(ConfigInfo->AccessRanges))[accessIndex].RangeStart,
+ (*(ConfigInfo->AccessRanges))[accessIndex].RangeLength,
+ (BOOLEAN)!(*(ConfigInfo->AccessRanges))[accessIndex].RangeInMemory);
+ break;
+ }
+ }
+ }
+
+ if (abar == NULL)
+ return SP_RETURN_ERROR; // corrupted information supplied
+
+ adapterExtension->ABAR_Address = abar;
+ adapterExtension->CAP = StorPortReadRegisterUlong(adapterExtension,
&abar->CAP);
+ adapterExtension->CAP2 = StorPortReadRegisterUlong(adapterExtension,
&abar->CAP2);
+ adapterExtension->Version = StorPortReadRegisterUlong(adapterExtension,
&abar->VS);
+
+ // 10.1.2
+ // 1. Indicate that system software is AHCI aware by setting GHC.AE to â1â.
+ ghc = StorPortReadRegisterUlong(adapterExtension, &abar->GHC);
+ // AE := Highest Significant bit of GHC
+ if ((ghc & (0x1<<31)) == 1)//Hmm, controller was already in power state
+ {
+ // reset controller to have it in know state
+ DebugPrint("AhciFindAdapter -> AE Already set, Reset()\n");
+ if (!AhciAdapterReset(adapterExtension))
+ return SP_RETURN_ERROR;// reset failed
+ }
+
+ ghc = 0x1<<31;// only AE=1
+ StorPortWriteRegisterUlong(adapterExtension, &abar->GHC, ghc);
+
+ adapterExtension->IS = abar->IS;
+ adapterExtension->PortImplemented = StorPortReadRegisterUlong(adapterExtension,
&abar->PI);
+
+ if (adapterExtension->PortImplemented == 0)
+ return SP_RETURN_ERROR;
+
+ // get port count -- Number of set bits in `adapterExtension->PortImplemented`
+ portCount = 0;
+ portImplemented = adapterExtension->PortImplemented;
+ while(portImplemented > 0)
+ {
+ portCount++;
+ portImplemented &= (portImplemented - 1);// i love playing with bits :D
+ }
+
+ ConfigInfo->MaximumTransferLength = 128 * 1024;//128 KB
+ ConfigInfo->NumberOfPhysicalBreaks = 0x21;
+ ConfigInfo->MaximumNumberOfTargets = 1;
+ ConfigInfo->MaximumNumberOfLogicalUnits = 1;
+ ConfigInfo->ResetTargetSupported = TRUE;
+ ConfigInfo->NumberOfBuses = 32;
+ ConfigInfo->SynchronizationModel = StorSynchronizeFullDuplex;
+ ConfigInfo->ScatterGather = TRUE;
+
+ // Turn IE -- Interrupt Enabled
+ ghc |= 0x2;
+ StorPortWriteRegisterUlong(adapterExtension, &abar->GHC, ghc);
+
+
+
+ return SP_RETURN_FOUND;
+}// -- AhciFindAdapter();
+
+ULONG DriverEntry(
+ IN PVOID DriverObject,
+ IN PVOID RegistryPath
+)
+{
+ /*
+ * Description :
+ * Initial Entrypoint for storahci miniport driver
+ */
+
+ HW_INITIALIZATION_DATA hwInitializationData;
+ ULONG i, status;
+
+ DebugPrint("Storahci -> DriverEntry()\n");
+
+ // initialize the hardware data structure
+ for (i = 0; i < sizeof(HW_INITIALIZATION_DATA); i++)
+ ((PUCHAR)&hwInitializationData)[i] = 0;
+
+ // set size of hardware initialization structure
+ hwInitializationData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA);
+
+ // identity required miniport entry point routines
+ hwInitializationData.HwFindAdapter = AhciFindAdapter;
+
+ // adapter specific information
+ hwInitializationData.NeedPhysicalAddresses = TRUE;
+ hwInitializationData.TaggedQueuing = TRUE;
+ hwInitializationData.AutoRequestSense = TRUE;
+ hwInitializationData.MultipleRequestPerLu = TRUE;
+
+ hwInitializationData.NumberOfAccessRanges = 6;
+ hwInitializationData.AdapterInterfaceType = PCIBus;
+ hwInitializationData.MapBuffers = STOR_MAP_NON_READ_WRITE_BUFFERS;
+
+ // set required extension sizes
+ hwInitializationData.SrbExtensionSize = sizeof(AHCI_SRB_EXTENSION);
+ hwInitializationData.DeviceExtensionSize = sizeof(AHCI_ADAPTER_EXTENSION);
+
+ // register our hw init data
+ status = StorPortInitialize(
+ DriverObject,
+ RegistryPath,
+ &hwInitializationData,
+ NULL);
+
+ return status;
+}// -- DriverEntry();
+
+BOOLEAN AhciAdapterReset(
+ PAHCI_ADAPTER_EXTENSION adapterExtension
+)
+{
+ /*
+ * 10.4.3 HBA Reset
+ * If the HBA becomes unusable for multiple ports, and a software reset or port reset
does not correct the
+ * problem, software may reset the entire HBA by setting GHC.HR to â1â. When
software sets the GHC.HR
+ * bit to â1â, the HBA shall perform an internal reset action. The bit shall be
cleared to â0â by the HBA when
+ * the reset is complete. A software write of â0â to GHC.HR shall have no effect. To
perform the HBA reset,
+ * software sets GHC.HR to â1â and may poll until this bit is read to be â0â, at
which point software knows that
+ * the HBA reset has completed.
+ * 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.
+ */
+ ULONG ghc, ticks;
+ PAHCI_MEMORY_REGISTERS abar = NULL;
+
+ abar = adapterExtension->ABAR_Address;
+
+ if (abar == NULL) // basic sanity
+ return FALSE;
+
+ // HR -- Very first bit (lowest significant)
+ ghc = 1;
+ StorPortWriteRegisterUlong(adapterExtension, &abar->GHC, ghc);
+
+ for (ticks = 0; (ticks < 50) &&
+ (StorPortReadRegisterUlong(adapterExtension, &abar->GHC) == 1);
+ StorPortStallExecution(20000), ticks++);
+
+ if (ticks == 50)//1 second
+ return FALSE;
+
+ return TRUE;
+}// -- AhciAdapterReset();
Propchange: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h (added)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h [iso-8859-1] Thu Jun 2
14:13:06 2016
@@ -0,0 +1,74 @@
+#include "miniport.h"
+#include "storport.h"
+
+typedef struct _AHCI_PORT
+{
+ ULONG CLB; // 0x00, command list base address, 1K-byte aligned
+ ULONG CLBU; // 0x04, command list base address upper 32 bits
+ ULONG FB; // 0x08, FIS base address, 256-byte aligned
+ ULONG FBU; // 0x0C, FIS base address upper 32 bits
+ ULONG IS; // 0x10, interrupt status
+ ULONG IE; // 0x14, interrupt enable
+ ULONG CMD; // 0x18, command and status
+ ULONG RSV0; // 0x1C, Reserved
+ ULONG TFD; // 0x20, task file data
+ ULONG SIG; // 0x24, signature
+ ULONG SSTS; // 0x28, SATA status (SCR0:SStatus)
+ ULONG SCTL; // 0x2C, SATA control (SCR2:SControl)
+ ULONG SERR; // 0x30, SATA error (SCR1:SError)
+ ULONG SACT; // 0x34, SATA active (SCR3:SActive)
+ ULONG CI; // 0x38, command issue
+ ULONG SNTF; // 0x3C, SATA notification (SCR4:SNotification)
+ ULONG FBS; // 0x40, FIS-based switch control
+ ULONG RSV1[11]; // 0x44 ~ 0x6F, Reserved
+ ULONG Vendor[4]; // 0x70 ~ 0x7F, vendor specific
+} AHCI_PORT;
+
+typedef struct _AHCI_MEMORY_REGISTERS
+{
+ // 0x00 - 0x2B, Generic Host Control
+ ULONG CAP; // 0x00, Host capability
+ ULONG GHC; // 0x04, Global host control
+ ULONG IS; // 0x08, Interrupt status
+ ULONG PI; // 0x0C, Port implemented
+ ULONG VS; // 0x10, Version
+ ULONG CCC_CTL; // 0x14, Command completion coalescing control
+ ULONG CCC_PTS; // 0x18, Command completion coalescing ports
+ ULONG EM_LOC; // 0x1C, Enclosure management location
+ ULONG EM_CTL; // 0x20, Enclosure management control
+ ULONG CAP2; // 0x24, Host capabilities extended
+ ULONG BOHC; // 0x28, BIOS/OS handoff control and status
+
+ // 0x2C - 0x9F, Reserved
+ ULONG Reserved[0xA0-0x2C];
+
+ // 0xA0 - 0xFF, Vendor specific registers
+ ULONG VendorSpecific[0x100-0xA0];
+
+ AHCI_PORT PortList[32];//1~32
+
+} AHCI_MEMORY_REGISTERS, *PAHCI_MEMORY_REGISTERS;
+
+typedef struct _AHCI_ADAPTER_EXTENSION
+{
+ ULONG AdapterNumber;
+ ULONG SystemIoBusNumber;
+ ULONG SlotNumber;
+ ULONG AhciBaseAddress;
+ ULONG IS; // Interrupt status
+ ULONG PortImplemented;
+
+ USHORT VendorID;
+ USHORT DeviceID;
+ USHORT RevisionID;
+
+ ULONG Version;
+ ULONG CAP;
+ ULONG CAP2;
+ PAHCI_MEMORY_REGISTERS ABAR_Address;
+} AHCI_ADAPTER_EXTENSION, *PAHCI_ADAPTER_EXTENSION;
+
+typedef struct _AHCI_SRB_EXTENSION
+{
+ ULONG AdapterNumber;
+} AHCI_SRB_EXTENSION;
Propchange: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h
------------------------------------------------------------------------------
svn:eol-style = native