36 ULONG CommandListSize, CommandTableLength, CommandTablesPerPage;
45 CommandSlots = ChanData->Controller->QueueDepth;
78 BufferVa += CommandListSize;
79 BufferPa += CommandListSize;
139 ASSERT(ChanData->MaximumPhysicalPages != 0 &&
159 TableCount =
min(
i, CommandTablesPerPage);
179 for (
j = 0;
j < TableCount; ++
j)
202 BufferVa += CommandTableLength;
203 BufferPa += CommandTableLength;
273 Slot.
u.
bits.DeviceNumber = 4;
274 Slot.
u.
bits.FunctionNumber = 0;
283 (PciData->VendorID == 0x80EE) &&
284 (PciData->DeviceID == 0xCAFE);
302 INFO(
"HBA ownership change\n");
307 for (
i = 0;
i < 200000; ++
i)
317 WARN(
"Unable to acquire the OS semaphore %08lx\n",
Control);
355 ASSERT(Controller->MaxChannels != 0);
358 sizeof(*ChanData) * Controller->MaxChannels,
363 Controller->ChanDataBlock = ChanData;
369 if (!(Controller->ChannelBitmap & (1 <<
i)))
372 Controller->Channels[
i] = ChanData;
374 ChanData->Channel =
i;
375 ChanData->Controller = Controller;
384 ChanData->TransferModeSupported =
SATA_ALL;
388 ChanData->EnableInterrupts(ChanData,
FALSE);
394 CmdStatus &= ~AHCI_PXCMD_ST;
412 INFO(
"CH %lu: FBS supported\n", ChanData->Channel);
418 INFO(
"CH %lu: Port is external\n", ChanData->Channel);
453 if ((Controller->Pci.VendorID == AbarLocations[
i].VendorID) &&
454 (Controller->Pci.DeviceID == AbarLocations[
i].DeviceID))
456 Index = AbarLocations[
i].Index;
527 if (!Controller->InterruptObject)
534 GlobalControl &= ~AHCI_GHC_IE;
551 if (Controller->InterruptObject)
554 Controller->InterruptObject =
NULL;
569 if ((Controller->Pci.DeviceID == 0x2652) || (Controller->Pci.DeviceID == 0x2653))
574 if ((Controller->Pci.VendorID ==
PCI_VEN_VIA) && (Controller->Pci.DeviceID == 0x3349))
639 ERR(
"No interrupt resource\n");
644 if (!Controller->IoBase)
660 Controller->MaxChannels =
CountSetBits(Controller->ChannelBitmap);
661 if (Controller->MaxChannels == 0)
663 ASSERT(Controller->MaxChannels == 0);
682 for (
i = 100000;
i > 0;
i--)
692 ERR(
"HBA reset failed %08lx\n", GlobalControl);
704 GlobalControl &= ~AHCI_GHC_IE;
718 Controller->QueueDepth = ((Controller->AhciCapabilities &
AHCI_CAP_NCS) >> 8) + 1;
720 INFO(
"%04X:%04X.%02X: Ver %08lX, PI %08lX, CAP %08lX, CAP2 %08lX\n",
721 Controller->Pci.VendorID,
722 Controller->Pci.DeviceID,
723 Controller->Pci.RevisionID,
724 Controller->AhciVersion,
725 Controller->ChannelBitmap,
726 Controller->AhciCapabilities,
727 Controller->AhciCapabilitiesEx);
746 ERR(
"Could not connect to interrupt %lu, status 0x%lx\n",
#define ALIGN_UP_BY(size, align)
#define AHCI_RECEIVED_FIS_FBS_ALIGNMENT
#define AHCI_COMMAND_LIST_ALIGNMENT
struct _AHCI_COMMAND_TABLE * PAHCI_COMMAND_TABLE
#define AHCI_MAX_PRDT_ENTRIES
#define AHCI_BOHC_OS_SEMAPHORE
#define AHCI_COMMAND_TABLE_ALIGNMENT
FORCEINLINE VOID AHCI_PORT_WRITE(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register, _In_ ULONG Value)
struct _AHCI_RECEIVED_FIS AHCI_RECEIVED_FIS
FORCEINLINE ULONG AHCI_PORT_READ(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register)
#define AHCI_RECEIVED_FIS_ALIGNMENT
#define AHCI_PORT_BASE(HbaIoBase, PortNumber)
FORCEINLINE ULONG AHCI_HBA_READ(_In_ PVOID HbaIoBase, _In_ AHCI_HOST_BUS_ADAPTER_REGISTER Register)
#define AHCI_BOHC_BIOS_SEMAPHORE
#define AHCI_MAX_COMMAND_SLOTS
#define AHCI_BOHC_BIOS_BUSY
FORCEINLINE VOID AHCI_HBA_WRITE(_In_ PVOID HbaIoBase, _In_ AHCI_HOST_BUS_ADAPTER_REGISTER Register, _In_ ULONG Value)
static NTSTATUS AtaAhciAllocateMemory(_In_ PVOID ChannelContext)
static PVOID AtaAhciGetAbar(_Inout_ PATA_CONTROLLER Controller)
static NTSTATUS AtaAhciAttachChannel(_In_ PVOID ChannelContext, _In_ BOOLEAN Attach)
static VOID AtaAhciHbaStop(_In_ PATA_CONTROLLER Controller)
static BOOLEAN AtaAhciIsPortRemovable(_In_ ULONG AhciCapabilities, _In_ ULONG CmdStatus)
static BOOLEAN AhciMatchController(_In_ PATA_CONTROLLER Controller)
static PCIIDEX_PAGED_DATA const struct @1171 AhciControllerList[]
static BOOLEAN AhciControllerIsSubClassCheckNeeded(_In_ PATA_CONTROLLER Controller)
static VOID AtaAhciHbaFreeResouces(_In_ PATA_CONTROLLER Controller)
static NTSTATUS AtaAhciCreateChannelData(_In_ PATA_CONTROLLER Controller)
static VOID AtaAhciFreeMemory(_In_ PVOID ChannelContext)
static VOID AtaAhciHbaRequestOsOwnership(_In_ PVOID IoBase)
NTSTATUS AhciGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
static VOID AtaAhciHbaStart(_In_ PATA_CONTROLLER Controller)
VOID AtaAhciStopDma(_In_ PCHANNEL_DATA_AHCI ChanData)
#define NT_SUCCESS(StatCode)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define KeStallExecutionProcessor(MicroSeconds)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
#define STATUS_DEVICE_HARDWARE_ERROR
CHANNEL_PREPARE_IO AtaAhciPrepareIo
#define PCIIDEX_PAGED_DATA
#define CHANNEL_FLAG_64_BIT_DMA
CHANNEL_ENABLE_INTERRUPTS AtaAhciEnableInterrupts
#define CTRL_FLAG_SATA_HBA_ACPI
CHANNEL_SET_MODE_EX SataSetTransferMode
#define CHANNEL_FLAG_IS_EXTERNAL
#define CHANNEL_FLAG_PIO_VIA_DMA
#define CTRL_FLAG_IS_AHCI
FORCEINLINE ULONG CountSetBits(_In_ ULONG x)
CHANNEL_PREPARE_PRD_TABLE AtaAhciPreparePrdTable
KSERVICE_ROUTINE AtaAhciHbaIsr
#define CHANNEL_FLAG_HAS_NCQ
CHANNEL_START_IO AtaAhciStartIo
#define CHANNEL_FLAG_HAS_FBS
#define CM_RESOURCE_INTERRUPT_LATCHED
#define CmResourceTypeInterrupt
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaChanEnableInterruptsSync(_In_ PVOID ChannelContext, _In_ BOOLEAN Enable)
PVOID AtaCtrlPciMapBar(_In_ PATA_CONTROLLER Controller, _In_range_(0, PCI_TYPE0_ADDRESSES) ULONG Index, _In_ ULONG MinimumIoLength)
ULONG CommandTableBaseLow
ULONG CommandTableBaseHigh
AHCI_COMMAND_HEADER CommandHeader[ANYSIZE_ARRAY]
PAHCI_COMMAND_TABLE CommandTable[AHCI_MAX_COMMAND_SLOTS]
PAHCI_COMMAND_LIST CommandList
PAHCI_RECEIVED_FIS ReceivedFis
PVOID CommandListOriginal
PHYSICAL_ADDRESS CommandListPhysOriginal
ULONG CommandTableSize[AHCI_MAX_COMMAND_SLOTS]
PVOID ReceivedFisOriginal
PHYSICAL_ADDRESS ReceivedFisPhysOriginal
PHYSICAL_ADDRESS CommandTablePhysOriginal[AHCI_MAX_COMMAND_SLOTS]
PVOID CommandTableOriginal[AHCI_MAX_COMMAND_SLOTS]
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@384::@387 Interrupt
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@384 u
PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
PFREE_COMMON_BUFFER FreeCommonBuffer
struct _PCI_SLOT_NUMBER::@4410::@4411 bits
union _PCI_SLOT_NUMBER::@4410 u
#define FIELD_OFFSET(t, f)
#define RtlZeroMemory(Destination, Length)
#define STATUS_IO_TIMEOUT
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceID
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
_In_ WDF_WMI_PROVIDER_CONTROL Control
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
#define PCI_CLASS_MASS_STORAGE_CTLR
#define PCI_SUBCLASS_MSC_AHCI_CTLR
struct _PCI_COMMON_HEADER * PPCI_COMMON_HEADER
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql