532 lines
13 KiB
C
532 lines
13 KiB
C
/*++
|
||
|
||
Copyright (c) 1998 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
dbcacpi.h
|
||
|
||
Abstract:
|
||
|
||
|
||
|
||
Environment:
|
||
|
||
Kernel & user mode
|
||
|
||
Revision History:
|
||
|
||
5-4-98 : created
|
||
|
||
--*/
|
||
|
||
#include "dbc100.h"
|
||
|
||
// "dbc" class global registry Keys
|
||
// these are found in HKLM\CCS\Services\Class\DBC
|
||
#define DEBUG_LEVEL_KEY L"debuglevel"
|
||
#define DEBUG_WIN9X_KEY L"debugWin9x"
|
||
#define POLL_MODE_KEY L"pollacpidbc"
|
||
|
||
// SW branch keys
|
||
#define RELEASE_ON_SHUTDOWN L"releaseshutdown"
|
||
|
||
// HW branch keys
|
||
#define ACPI_HUB_KEY L"acpiHubParentPort"
|
||
|
||
#define DBCACPI_EXT_SIG 0x41434244 //"DBCA"
|
||
|
||
/* definitions from DBC core spec */
|
||
|
||
typedef union _DBCCR_REGISTER {
|
||
ULONG ul;
|
||
struct {
|
||
unsigned BayCount:4; /* 0 ..3 */
|
||
unsigned HasSecurityLock:1; /* 4 */
|
||
unsigned Reserved:27; /* 5..31 */
|
||
};
|
||
} DBCCR_REGISTER, *PDBCCR_REGISTER;
|
||
|
||
typedef union _BSTR_REGISTER {
|
||
ULONG ul;
|
||
struct {
|
||
unsigned DeviceUsbIsPresent:1; /* 0 */
|
||
unsigned Device1394IsPresent:1; /* 1 */
|
||
unsigned DeviceStateChange:1; /* 2 */
|
||
unsigned RemovalRequested:1; /* 3 */
|
||
unsigned CurrentBayState:3; /* 4..6 */
|
||
unsigned SecurityLockEngaged:1; /* 7 */
|
||
unsigned BayFormFactor:3; /* 8..10 */
|
||
unsigned Reserved:21; /* 11..31 */
|
||
};
|
||
} BSTR_REGISTER, *PBSTR_REGISTER;
|
||
|
||
typedef union _BCER_REGISTER {
|
||
ULONG ul;
|
||
struct {
|
||
unsigned EnableVid:1; /* 0 */
|
||
unsigned RemovalEventEnable:1; /* 1 */
|
||
unsigned DeviceStatusChangeEnable:1; /* 2 */
|
||
unsigned RemovalRequestEnable:1; /* 3 */
|
||
unsigned BayStateRequested:3; /* 4..6 */
|
||
unsigned LockEngage:1; /* 7 */
|
||
unsigned Reserved:24; /* 8..31 */
|
||
};
|
||
} BCER_REGISTER, *PBCER_REGISTER;
|
||
|
||
typedef struct _DBCACPI_WORKITEM {
|
||
|
||
ULONG Sig;
|
||
WORK_QUEUE_ITEM WorkQueueItem;
|
||
|
||
} DBCACPI_WORKITEM, *PDBCACPI_WORKITEM;
|
||
|
||
typedef struct _DEVICE_EXTENSION {
|
||
ULONG Sig;
|
||
// Device object we call when submitting requests
|
||
PDEVICE_OBJECT TopOfStackDeviceObject;
|
||
// Our Pdo
|
||
PDEVICE_OBJECT PhysicalDeviceObject;
|
||
|
||
DEVICE_POWER_STATE CurrentDevicePowerState;
|
||
|
||
PIRP PowerIrp;
|
||
PIRP ChangeRequestIrp;
|
||
ULONG Flags;
|
||
|
||
// cached DBC Registers (read once at init)
|
||
USHORT VendorId;
|
||
UCHAR RevisionId;
|
||
UCHAR BayCount;
|
||
|
||
DBCCR_REGISTER DbControlCapabilities; //DBCCR
|
||
|
||
PIRP WakeIrp;
|
||
KEVENT RemoveEvent;
|
||
ULONG PendingIoCount;
|
||
|
||
DBCACPI_WORKITEM WorkItem;
|
||
// array we use to tack bay status changes
|
||
// zero index not used
|
||
UCHAR BayState[MAX_BAY_NUMBER+1]; //32 bays
|
||
|
||
BOOLEAN AcceptingRequests;
|
||
UCHAR Pad2[3];
|
||
|
||
KSPIN_LOCK ChangeRequestSpin;
|
||
KSPIN_LOCK FlagsSpin;
|
||
|
||
KDPC PollDpc;
|
||
KTIMER PollTimer;
|
||
|
||
DEVICE_CAPABILITIES DeviceCapabilities;
|
||
|
||
// subsystem descriptor to use
|
||
// note that this may have some values set by the registry
|
||
DBC_SUBSYSTEM_DESCRIPTOR SubsystemDescriptor;
|
||
|
||
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
||
|
||
|
||
// define standard register offsets
|
||
|
||
#define ACPI_DBC_VENDOR_ID 0x00000000
|
||
#define ACPI_DBC_REVISION_ID 0x00000004
|
||
#define ACPI_DBC_SUBSYSTEM_VENDOR_ID 0x00000008
|
||
#define ACPI_DBC_SUBSYSTEM_ID 0x0000000A
|
||
#define ACPI_DBC_DBCCR 0x0000000C
|
||
#define ACPI_DBC_BSTR0 0x00000010
|
||
#define ACPI_DBC_BCER0 0x00000014
|
||
|
||
// define acpi methods
|
||
#define DBACPI_DBCC_METHOD (ULONG) ('CCBD')
|
||
#define DBACPI_GUID_METHOD (ULONG) ('DIUG')
|
||
#define DBACPI_BPM3_METHOD (ULONG) ('3MPB')
|
||
#define DBACPI_BPMU_METHOD (ULONG) ('UMPB')
|
||
#define DBACPI_BCTR_METHOD (ULONG) ('RTCB')
|
||
#define DBACPI_BREL_METHOD (ULONG) ('LERB')
|
||
|
||
// DBCACPI Flags
|
||
#define DBCACPI_FLAG_STOPPED 0x00000001
|
||
#define DBCACPI_FLAG_ACPIREG 0x00000002
|
||
#define DBCACPI_FLAG_ENABLED_FOR_WAKEUP 0x00000004
|
||
#define DBCACPI_FLAG_WORKITEM_PENDING 0x00000008
|
||
#define DBCACPI_FLAG_STARTED 0x00000010
|
||
|
||
#define DBC_WORKITEM_SIG 0x54496B77 //"wkIT"
|
||
|
||
#define DBCACPI_READ_REG_UCHAR(devobj, offset, reg) \
|
||
DBCACPI_ReadWriteDBCRegister((devobj),\
|
||
(offset),\
|
||
(reg),\
|
||
sizeof(UCHAR),\
|
||
TRUE)
|
||
|
||
#define DBCACPI_READ_REG_USHORT(devobj, offset, reg) \
|
||
DBCACPI_ReadWriteDBCRegister((devobj),\
|
||
(offset),\
|
||
(reg),\
|
||
sizeof(USHORT),\
|
||
TRUE)
|
||
|
||
#define DBCACPI_READ_REG_ULONG(devobj, offset, reg) \
|
||
DBCACPI_ReadWriteDBCRegister((devobj),\
|
||
(offset),\
|
||
(reg),\
|
||
sizeof(ULONG),\
|
||
TRUE)
|
||
|
||
#define DBCACPI_WRITE_REG_UCHAR(devobj, offset, reg) \
|
||
DBCACPI_ReadWriteDBCRegister((devobj),\
|
||
(offset),\
|
||
(reg),\
|
||
sizeof(UCHAR),\
|
||
FALSE)
|
||
|
||
#define DBCACPI_WRITE_REG_USHORT(devobj, offset, reg) \
|
||
DBCACPI_ReadWriteDBCRegister((devobj),\
|
||
(offset),\
|
||
(reg),\
|
||
sizeof(USHORT),\
|
||
FALSE)
|
||
|
||
#define DBCACPI_WRITE_REG_ULONG(devobj, offset, reg) \
|
||
DBCACPI_ReadWriteDBCRegister((devobj),\
|
||
(offset),\
|
||
(reg),\
|
||
sizeof(ULONG),\
|
||
FALSE)
|
||
/*
|
||
Debug Macros
|
||
*/
|
||
#if DBG
|
||
|
||
#define DEBUG_LOG
|
||
|
||
#define LOG_MISC 0x00000001 //debug log entries
|
||
|
||
VOID
|
||
DBCACPI_LogInit(
|
||
);
|
||
|
||
VOID
|
||
DBCACPI_Assert(
|
||
IN PVOID FailedAssertion,
|
||
IN PVOID FileName,
|
||
IN ULONG LineNumber,
|
||
IN PCHAR Message
|
||
);
|
||
|
||
VOID
|
||
DBCACPI_Debug_LogEntry(
|
||
IN ULONG Mask,
|
||
IN CHAR *Name,
|
||
IN ULONG Info1,
|
||
IN ULONG Info2,
|
||
IN ULONG Info3
|
||
);
|
||
|
||
#define LOGENTRY(mask, sig, info1, info2, info3)
|
||
// DBCACPI_Debug_LogEntry(mask, sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
|
||
|
||
|
||
#define DBCACPI_ASSERT(exp) \
|
||
if (!(exp)) { \
|
||
DBCACPI_Assert( #exp, __FILE__, __LINE__, NULL );\
|
||
}
|
||
|
||
#define DBCACPI_ASSERT_EXT(de) DBCACPI_ASSERT((de)->Sig == DBCACPI_EXT_SIG)
|
||
|
||
|
||
ULONG
|
||
_cdecl
|
||
DBCACPI_KdPrintX(
|
||
ULONG l,
|
||
PCH Format,
|
||
...
|
||
);
|
||
|
||
#define DBCACPI_KdPrint(_x_) DBCACPI_KdPrintX _x_
|
||
#define TEST_TRAP() { DbgPrint( "DBCACPI: Code coverage trap %s line: %d\n", __FILE__, __LINE__);\
|
||
TRAP();}
|
||
#ifdef MAX_DEBUG
|
||
#define MD_TEST_TRAP() { DbgPrint( "DBCACPI: Code test trap %s line: %d\n", __FILE__, __LINE__);\
|
||
TRAP();}
|
||
#else
|
||
#define MD_TEST_TRAP()
|
||
#endif
|
||
|
||
#ifdef NTKERN
|
||
#define TRAP() _asm {int 3}
|
||
#else
|
||
#define TRAP() DbgBreakPoint()
|
||
#endif
|
||
|
||
#else
|
||
|
||
#define LOGENTRY(mask, sig, info1, info2, info3)
|
||
#define DBCACPI_ASSERT(exp)
|
||
#define DBCACPI_KdPrint(_x_)
|
||
#define DBCACPI_ASSERT_EXT(de)
|
||
#define DBCACPI_LogInit()
|
||
|
||
#define TRAP()
|
||
#define TEST_TRAP()
|
||
#define MD_TEST_TRAP()
|
||
|
||
#endif
|
||
|
||
VOID
|
||
DBCACPI_Unload(
|
||
IN PDRIVER_OBJECT DriverObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_StartDevice(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_StopDevice(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_RemoveDevice(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_AddDevice(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PDEVICE_OBJECT PhysicalDeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_CreateDeviceObject(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PDEVICE_OBJECT *DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ProcessIOCTL(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
DBCACPI_IncrementIoCount(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
LONG
|
||
DBCACPI_DecrementIoCount(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_Power(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_Pnp(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_Power(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_WaitWakeIrpCompletion(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN UCHAR MinorFunction,
|
||
IN POWER_STATE DeviceState,
|
||
IN PVOID Context,
|
||
IN PIO_STATUS_BLOCK IoStatus
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_QueryCapabilities(
|
||
IN PDEVICE_OBJECT PdoDeviceObject,
|
||
IN PDEVICE_CAPABILITIES DeviceCapabilities
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_SystemControl(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_Ioctl(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ReadWriteDBCRegister(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
ULONG RegisterOffset,
|
||
PVOID RegisterData,
|
||
USHORT RegisterDataLength,
|
||
BOOLEAN ReadRegister
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_SyncAcpiCall(
|
||
IN PDEVICE_OBJECT Pdo,
|
||
IN ULONG Ioctl,
|
||
IN PVOID InputBuffer,
|
||
IN ULONG InputSize,
|
||
IN PVOID OutputBuffer,
|
||
IN ULONG OutputSize
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ProcessDrb(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_SetFeature(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN USHORT BayNumber,
|
||
IN USHORT FeatureSelector
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_DeferIrpCompletion(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PVOID Context
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_RegisterWithACPI(
|
||
IN PDEVICE_OBJECT FdoDeviceObject,
|
||
IN BOOLEAN Register
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_GetAcpiInterfaces(
|
||
IN PDEVICE_OBJECT Pdo
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ClearFeature(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN USHORT BayNumber,
|
||
IN USHORT FeatureSelector
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_CheckForStatusChange(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_GetBayRegistryParameters(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
USHORT BayNumber,
|
||
PULONG PortUSBMap,
|
||
PULONG Port1394Map
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_GetRegistryParameters(
|
||
PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ReadBayMapRegister(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
BOOLEAN Usb,
|
||
PVOID BayData,
|
||
USHORT BayDataLength,
|
||
ULONG BayNumber
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ReadBayReleaseRegister(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
PULONG ReleaseOnShutdown
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_GetClassGlobalDebugRegistryParameters(
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_GetClassGlobalRegistryParameters(
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_ReadGuidRegister(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
PVOID GuidData,
|
||
USHORT GuidDataLength,
|
||
ULONG Arg0
|
||
);
|
||
|
||
VOID
|
||
DBCACPI_NotifyWorker(
|
||
IN PVOID Context
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_BIOSControl(
|
||
PDEVICE_OBJECT DeviceObject,
|
||
BOOLEAN Enable
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_StartPolling(
|
||
PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_GetConfigValue(
|
||
IN PWSTR ValueName,
|
||
IN ULONG ValueType,
|
||
IN PVOID ValueData,
|
||
IN ULONG ValueLength,
|
||
IN PVOID Context,
|
||
IN PVOID EntryContext
|
||
);
|
||
|
||
NTSTATUS
|
||
DBCACPI_SetRegistryKeyValueForPdo(
|
||
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
||
IN BOOLEAN SoftwareBranch,
|
||
IN ULONG Type,
|
||
IN PWCHAR KeyNameString,
|
||
IN ULONG KeyNameStringLength,
|
||
IN PVOID Data,
|
||
IN ULONG DataLength
|
||
);
|
||
|
||
#if DBG
|
||
|
||
#define DEBUG_HEAP
|
||
|
||
extern ULONG TotalHeapSace;
|
||
#define DBCACPI_HEAP_SIG 0x12344321
|
||
#define DBCACPI_FREE_TAG 0x11111111
|
||
|
||
#define DbcExAllocatePool(p, l) DBCLASS_GetHeap((p), (l), DBCLASS_HEAP_SIG, &TotalHeapSace)
|
||
#define DbcExFreePool(l) DBCLASS_RetHeap((l), DBCLASS_HEAP_SIG, &TotalHeapSace)
|
||
|
||
#else
|
||
|
||
#define DbcExAllocatePool(p, l) ExAllocatePool((p), (l))
|
||
#define DbcExFreePool(l) ExFreePool((l))
|
||
|
||
#endif
|
||
|